@@ -277,11 +277,12 @@ void XInputController::setJoystick(XInputControl joy, int32_t x, int32_t y) {
277277 setJoystickDirect (joy, x, y);
278278}
279279
280- void XInputController::setJoystickX (XInputControl joy, int32_t x) {
280+ void XInputController::setJoystickX (XInputControl joy, int32_t x, boolean invert ) {
281281 const XInputMap_Joystick * joyData = getJoyFromEnum (joy);
282282 if (joyData == nullptr ) return ; // Not a joystick
283283
284284 x = rescaleInput (x, *getRangeFromEnum (joy), XInputMap_Joystick::range);
285+ if (invert) x = invertInput (x, XInputMap_Joystick::range);
285286
286287 if (getJoystickX (joy) == x) return ; // Axis hasn't changed
287288
@@ -292,11 +293,12 @@ void XInputController::setJoystickX(XInputControl joy, int32_t x) {
292293 autosend ();
293294}
294295
295- void XInputController::setJoystickY (XInputControl joy, int32_t y) {
296+ void XInputController::setJoystickY (XInputControl joy, int32_t y, boolean invert ) {
296297 const XInputMap_Joystick * joyData = getJoyFromEnum (joy);
297298 if (joyData == nullptr ) return ; // Not a joystick
298299
299300 y = rescaleInput (y, *getRangeFromEnum (joy), XInputMap_Joystick::range);
301+ if (invert) y = invertInput (y, XInputMap_Joystick::range);
300302
301303 if (getJoystickY (joy) == y) return ; // Axis hasn't changed
302304
@@ -341,15 +343,18 @@ void XInputController::setJoystickDirect(XInputControl joy, int16_t x, int16_t y
341343 const XInputMap_Joystick * joyData = getJoyFromEnum (joy);
342344 if (joyData == nullptr ) return ; // Not a joystick
343345
344- if (getJoystickX (joy) == x && getJoystickY (joy) == y) return ; // Joy hasn't changed
345-
346- tx[joyData->x_low ] = lowByte (x);
347- tx[joyData->x_high ] = highByte (x);
346+ if (getJoystickX (joy) != x) {
347+ tx[joyData->x_low ] = lowByte (x);
348+ tx[joyData->x_high ] = highByte (x);
349+ newData = true ;
350+ }
348351
349- tx[joyData->y_low ] = lowByte (y);
350- tx[joyData->y_high ] = highByte (y);
352+ if (getJoystickY (joy) != y) {
353+ tx[joyData->y_low ] = lowByte (y);
354+ tx[joyData->y_high ] = highByte (y);
355+ newData = true ;
356+ }
351357
352- newData = true ;
353358 autosend ();
354359}
355360
@@ -365,9 +370,15 @@ void XInputController::setAutoSend(boolean a) {
365370}
366371
367372boolean XInputController::getButton (uint8_t button) const {
368- const XInputMap_Button * buttonData = getButtonFromEnum ((XInputControl) button);
369- if (buttonData == nullptr ) return 0 ; // Not a button
370- return tx[buttonData->index ] & buttonData->mask ;
373+ const XInputMap_Button* buttonData = getButtonFromEnum ((XInputControl) button);
374+ if (buttonData != nullptr ) {
375+ return tx[buttonData->index ] & buttonData->mask ;
376+ }
377+ const XInputMap_Trigger* triggerData = getTriggerFromEnum ((XInputControl) button);
378+ if (triggerData != nullptr ) {
379+ return getTrigger ((XInputControl) button) != 0 ? 1 : 0 ;
380+ }
381+ return 0 ; // Not a button or a trigger
371382}
372383
373384boolean XInputController::getDpad (XInputControl dpad) const {
@@ -427,8 +438,8 @@ boolean XInputController::connected() {
427438// Send an update packet to the PC
428439int XInputController::send () {
429440 if (!newData) return 0 ; // TX data hasn't changed
430- #ifdef USB_XINPUT
431441 newData = false ;
442+ #ifdef USB_XINPUT
432443 return XInputUSB::send (tx, sizeof (tx));
433444#else
434445 printDebug ();
@@ -511,13 +522,17 @@ XInputController::Range * XInputController::getRangeFromEnum(XInputControl ctrl)
511522 }
512523}
513524
514- int32_t XInputController::rescaleInput (int32_t val, Range in, Range out) {
525+ int32_t XInputController::rescaleInput (int32_t val, const Range& in, const Range& out) {
515526 if (val <= in.min ) return out.min ; // Out of range -
516527 if (val >= in.max ) return out.max ; // Out of range +
517528 if (in.min == out.min && in.max == out.max ) return val; // Ranges identical
518529 return map (val, in.min , in.max , out.min , out.max );
519530}
520531
532+ int16_t XInputController::invertInput (int16_t val, const Range& range) {
533+ return range.max - val + range.min ;
534+ }
535+
521536void XInputController::setTriggerRange (int32_t rangeMin, int32_t rangeMax) {
522537 setRange (TRIGGER_LEFT, rangeMin, rangeMax);
523538 setRange (TRIGGER_RIGHT, rangeMin, rangeMax);
0 commit comments