diff options
Diffstat (limited to 'src/joystick.cpp')
-rw-r--r-- | src/joystick.cpp | 179 |
1 files changed, 142 insertions, 37 deletions
diff --git a/src/joystick.cpp b/src/joystick.cpp index f45729351..29e16dff4 100644 --- a/src/joystick.cpp +++ b/src/joystick.cpp @@ -20,62 +20,121 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#include "configuration.h" #include "joystick.h" + +#include "client.h" +#include "configuration.h" #include "logger.h" #include "debug.h" int Joystick::joystickCount = 0; +bool Joystick::mEnabled = false; void Joystick::init() { SDL_InitSubSystem(SDL_INIT_JOYSTICK); - - // Have SDL call SDL_JoystickUpdate() automatically SDL_JoystickEventState(SDL_ENABLE); - joystickCount = SDL_NumJoysticks(); logger->log("%i joysticks/gamepads found", joystickCount); for (int i = 0; i < joystickCount; i++) logger->log("- %s", SDL_JoystickName(i)); + + mEnabled = config.getBoolValue("joystickEnabled"); + + if (Joystick::getNumberOfJoysticks() > 0) + { + joystick = new Joystick(config.getIntValue("selectedJoystick")); + if (mEnabled) + joystick->open(); + } } Joystick::Joystick(int no): mDirection(0), + mJoystick(nullptr), + mUpTolerance(0), + mDownTolerance(0), + mLeftTolerance(0), + mRightTolerance(0), mCalibrating(false), - mEnabled(false) + mCalibrated(false), + mButtonsNumber(MAX_BUTTONS), + mUseInactive(false), + mHaveHats(false) { if (no >= joystickCount) no = joystickCount; - mJoystick = SDL_JoystickOpen(no); + mNumber = no; + + for (int i = 0; i < MAX_BUTTONS; i++) + mButtons[i] = false; +} + +Joystick::~Joystick() +{ + close(); +} + +bool Joystick::open() +{ + logger->log("open joystick %d", mNumber); + + mJoystick = SDL_JoystickOpen(mNumber); // TODO Bail out! if (!mJoystick) { logger->log("Couldn't open joystick: %s", SDL_GetError()); - return; + return false; } + mButtonsNumber = SDL_JoystickNumButtons(mJoystick); + logger->log("Joystick: %i ", mNumber); logger->log("Axes: %i ", SDL_JoystickNumAxes(mJoystick)); logger->log("Balls: %i", SDL_JoystickNumBalls(mJoystick)); logger->log("Hats: %i", SDL_JoystickNumHats(mJoystick)); - logger->log("Buttons: %i", SDL_JoystickNumButtons(mJoystick)); + logger->log("Buttons: %i", mButtonsNumber); - mEnabled = config.getBoolValue("joystickEnabled"); - mUpTolerance = config.getIntValue("upTolerance"); - mDownTolerance = config.getIntValue("downTolerance"); - mLeftTolerance = config.getIntValue("leftTolerance"); - mRightTolerance = config.getIntValue("rightTolerance"); + mHaveHats = (SDL_JoystickNumHats(mJoystick) > 0); - for (int i = 0; i < MAX_BUTTONS; i++) - mButtons[i] = false; + if (mButtonsNumber > MAX_BUTTONS) + mButtonsNumber = MAX_BUTTONS; + + mCalibrated = config.getValueBool("joystick" + + toString(mNumber) + "calibrated", false); + mUpTolerance = config.getIntValue("upTolerance" + toString(mNumber)); + mDownTolerance = config.getIntValue("downTolerance" + toString(mNumber)); + mLeftTolerance = config.getIntValue("leftTolerance" + toString(mNumber)); + mRightTolerance = config.getIntValue("rightTolerance" + toString(mNumber)); + mUseInactive = config.getBoolValue("useInactiveJoystick"); + + return true; } -Joystick::~Joystick() +void Joystick::close() { - SDL_JoystickClose(mJoystick); + logger->log("close joystick %d", mNumber); + if (mJoystick) + { + SDL_JoystickClose(mJoystick); + mJoystick = nullptr; + } +} + +void Joystick::setNumber(int n) +{ + if (mJoystick) + { + SDL_JoystickClose(mJoystick); + mNumber = n; + open(); + } + else + { + mNumber = n; + } } void Joystick::update() @@ -89,26 +148,63 @@ void Joystick::update() return; }; - if (!mEnabled) + if (!mEnabled || !mCalibrated) return; - // X-Axis - int position = SDL_JoystickGetAxis(mJoystick, 0); - if (position >= mRightTolerance) - mDirection |= RIGHT; - else if (position <= mLeftTolerance) - mDirection |= LEFT; + if (mUseInactive || Client::getInputFocused()) + { + // X-Axis + int position = SDL_JoystickGetAxis(mJoystick, 0); + if (position >= mRightTolerance) + mDirection |= RIGHT; + else if (position <= mLeftTolerance) + mDirection |= LEFT; - // Y-Axis - position = SDL_JoystickGetAxis(mJoystick, 1); - if (position <= mUpTolerance) - mDirection |= UP; - else if (position >= mDownTolerance) - mDirection |= DOWN; + // Y-Axis + position = SDL_JoystickGetAxis(mJoystick, 1); + if (position <= mUpTolerance) + mDirection |= UP; + else if (position >= mDownTolerance) + mDirection |= DOWN; - // Buttons - for (int i = 0; i < MAX_BUTTONS; i++) - mButtons[i] = (SDL_JoystickGetButton(mJoystick, i) == 1); +#ifdef DEBUG_JOYSTICK + if (SDL_JoystickGetAxis(mJoystick, 2)) + logger->log("axis 2 pos: %d", SDL_JoystickGetAxis(mJoystick, 2)); + if (SDL_JoystickGetAxis(mJoystick, 3)) + logger->log("axis 3 pos: %d", SDL_JoystickGetAxis(mJoystick, 3)); + if (SDL_JoystickGetAxis(mJoystick, 4)) + logger->log("axis 4 pos: %d", SDL_JoystickGetAxis(mJoystick, 4)); +#endif + + if (!mDirection && mHaveHats) + { + // reading only hat 0 + Uint8 hat = SDL_JoystickGetHat(mJoystick, 0); + if (hat & SDL_HAT_RIGHT) + mDirection |= RIGHT; + else if (hat & SDL_HAT_LEFT) + mDirection |= LEFT; + if (hat & SDL_HAT_UP) + mDirection |= UP; + else if (hat & SDL_HAT_DOWN) + mDirection |= DOWN; + } + + // Buttons + for (int i = 0; i < mButtonsNumber; i++) + { + mButtons[i] = (SDL_JoystickGetButton(mJoystick, i) == 1); +#ifdef DEBUG_JOYSTICK + if (mButtons[i]) + logger->log("button: %d", i); +#endif + } + } + else + { + for (int i = 0; i < mButtonsNumber; i++) + mButtons[i] = false; + } } void Joystick::startCalibration() @@ -139,14 +235,23 @@ void Joystick::doCalibration() void Joystick::finishCalibration() { - config.setValue("leftTolerance", mLeftTolerance); - config.setValue("rightTolerance", mRightTolerance); - config.setValue("upTolerance", mUpTolerance); - config.setValue("downTolerance", mDownTolerance); + mCalibrated = true; mCalibrating = false; + config.setValue("joystick" + toString(mNumber) + "calibrated", true); + config.setValue("leftTolerance" + toString(mNumber), mLeftTolerance); + config.setValue("rightTolerance" + toString(mNumber), mRightTolerance); + config.setValue("upTolerance" + toString(mNumber), mUpTolerance); + config.setValue("downTolerance" + toString(mNumber), mDownTolerance); } bool Joystick::buttonPressed(unsigned char no) const { return (mEnabled && no < MAX_BUTTONS) ? mButtons[no] : false; } + +void Joystick::getNames(std::vector <std::string> &names) +{ + names.clear(); + for (int i = 0; i < joystickCount; i++) + names.push_back(SDL_JoystickName(i)); +} |