From c814b85d598b0a1b65707bac4bd30c3f13fb8981 Mon Sep 17 00:00:00 2001 From: Anna Wiggins Date: Sun, 8 Nov 2015 23:32:48 -0500 Subject: [PATCH] Implement logic for pulsed button presses. This commit has not been tested. --- Joystick.cpp | 18 +++++++++++++++--- Joystick.h | 11 ++++++++--- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/Joystick.cpp b/Joystick.cpp index 9f0c813..3f5a1d9 100644 --- a/Joystick.cpp +++ b/Joystick.cpp @@ -39,9 +39,7 @@ void Joystick::AddButton(uint8_t pin, ButtonType type, bool pullup) { _buttons[_num_buttons].last_state = digitalRead(pin); _num_buttons++; - if (type == BUTTON_PULSED || type == BUTTON_PULSED_DOUBLE_ACTION) { - _have_pulsed_button = true; - } + if (type & _BUTTON_PULSED_TYPES) _have_pulsed_button = true; if (_debug) { Serial.print("Debug: added button of type "); @@ -78,6 +76,11 @@ void Joystick::Update() { if (_joyReport != oldReport) { Write(); } + + if (_have_pulsed_button) { + _ReleasePulsedButtons(); + Write(); + } } void Joystick::SetAxis(uint8_t axis, int16_t value) { @@ -109,6 +112,15 @@ void Joystick::ReleaseAllButtons() { if (_debug) Serial.println("DEBUG: All-button release recorded."); } +void Joystick::_ReleasePulsedButtons() { + for (uint8_t i = 0; i < _num_buttons; i++) { + if (_buttons[i].type & _BUTTON_PULSED_TYPES) + ReleaseButton(i); + } + + if (_debug) Serial.println("DEBUG: Pulse button release recorded."); +} + void Joystick::Write() { Serial.write((uint8_t *)&_joyReport, sizeof(JoyReport)); delay(250); diff --git a/Joystick.h b/Joystick.h index 5504a7b..745f9c4 100644 --- a/Joystick.h +++ b/Joystick.h @@ -15,9 +15,9 @@ #define JOYSTICK_NUM_BYTES (JOYSTICK_NUM_BUTTONS+7)/8 enum ButtonType { - BUTTON_MAINTAINED, - BUTTON_PULSED, - BUTTON_PULSED_DOUBLE_ACTION + BUTTON_MAINTAINED = 0x1, + BUTTON_PULSED = 0x2, + BUTTON_PULSED_DOUBLE_ACTION = 0x4 }; typedef struct JoyReport { @@ -46,6 +46,8 @@ class Joystick { void Write(); private: + void _ReleasePulsedButtons(); + struct { uint8_t pin; ButtonType type; @@ -61,4 +63,7 @@ class Joystick { bool _debug; }; +// Internal use only. +#define _BUTTON_PULSED_TYPES (BUTTON_PULSED | BUTTON_PULSED_DOUBLE_ACTION) + #endif