From 6df76d4e777469d6c0a8113d2696284dbccb60f4 Mon Sep 17 00:00:00 2001 From: Bryant Date: Mon, 10 Jun 2013 17:53:05 -0700 Subject: [PATCH] The JoystickInput class now emits signals for both button press and button release events. --- src/input/JoystickInput.cc | 35 +++++++++++++++-------------------- src/input/JoystickInput.h | 11 +++++++++-- 2 files changed, 24 insertions(+), 22 deletions(-) diff --git a/src/input/JoystickInput.cc b/src/input/JoystickInput.cc index 6c54c70a0..d261cccc5 100644 --- a/src/input/JoystickInput.cc +++ b/src/input/JoystickInput.cc @@ -299,35 +299,29 @@ void JoystickInput::run() // Send new values to rest of groundstation emit hatDirectionChanged(xHat, yHat); - // Display all buttons - int buttons = 0; - for(int i = 0; i < SDL_JoystickNumButtons(joystick); i++) + // Emit signals for each button individually + for (int i = 0; i < SDL_JoystickNumButtons(joystick); i++) { - //qDebug() << "BUTTON" << i << "is: " << SDL_JoystickGetAxis(joystick, i); - if(SDL_JoystickGetButton(joystick, i)) + // If the button was down, but now it's up, trigger a buttonPressed event + quint16 lastButtonState = buttonState & (1 << i); + if (SDL_JoystickGetButton(joystick, i) && !lastButtonState) { emit buttonPressed(i); - buttons |= 1 << i; - // Check if button is a UAS select button - - if (uasButtonList.contains(i)) - { - UASInterface* uas = UASManager::instance()->getUASForId(i); - if (uas) - { - UASManager::instance()->setActiveUAS(uas); - } - } + buttonState |= 1 << i; + } + else if (!SDL_JoystickGetButton(joystick, i) && lastButtonState) + { + emit buttonReleased(i); + buttonState &= ~(1 << i); } - } - emit joystickChanged(y, x, yaw, thrust, xHat, yHat, buttons); + + // Now signal an update for all UI together. + emit joystickChanged(y, x, yaw, thrust, xHat, yHat, buttonState); // Sleep, update rate of joystick is approx. 50 Hz (1000 ms / 50 = 20 ms) QGC::SLEEP::msleep(20); - } - } void JoystickInput::setActiveJoystick(int id) @@ -340,6 +334,7 @@ void JoystickInput::setActiveJoystick(int id) joystickButtons = SDL_JoystickNumButtons(joystick); qDebug() << QString("Switching to joystick '%1' with %2 buttons").arg(joystickName, QString::number(joystickButtons)); } + buttonState = 0; } const QString& JoystickInput::getName() diff --git a/src/input/JoystickInput.h b/src/input/JoystickInput.h index ea5e59de2..fb2aea951 100644 --- a/src/input/JoystickInput.h +++ b/src/input/JoystickInput.h @@ -150,6 +150,7 @@ protected: int joystickButtons; int joystickID; int joysticksFound; + quint16 buttonState; ///< Track the state of the buttons so we can trigger on Up and Down events void init(); @@ -196,12 +197,18 @@ signals: void yawChanged(int yaw); /** - * @brief Joystick button has been pressed - * + * @brief Joystick button has changed state from unpressed to pressed. * @param key index of the pressed key */ void buttonPressed(int key); + /** + * @brief Joystick button has changed state from pressed to unpressed. + * + * @param key index of the released key + */ + void buttonReleased(int key); + /** * @brief Hat (8-way switch on the top) has changed position * -- 2.22.0