From 8347b6146856e702ebbeeaeeb1d84d9f7849e9be Mon Sep 17 00:00:00 2001 From: Nicolas Adenis-Lamarre Date: Mon, 27 Jan 2025 21:25:17 +0100 Subject: [PATCH] evdev: add shake special event Signed-off-by: Nicolas Adenis-Lamarre --- src/lindbergh/evdevinput.c | 35 +++++++++++++++++++++++++++++++++++ src/lindbergh/evdevinput.h | 9 ++++++++- 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/src/lindbergh/evdevinput.c b/src/lindbergh/evdevinput.c index 3af59d4..0c39248 100644 --- a/src/lindbergh/evdevinput.c +++ b/src/lindbergh/evdevinput.c @@ -981,6 +981,17 @@ static ControllerStatus listControllers(Controllers *controllers) // hum ok, truncated value } + ControllerInput *shakeControllerInput = + &controllers->controller[i].inputs[controllers->controller[i].inputCount++]; + shakeControllerInput->evType = EV_ABS; + shakeControllerInput->evCode = code; + shakeControllerInput->specialFunction = ANALOGUE_SHAKE; + strcpy(shakeControllerInput->inputName, controllerInput->inputName); + strcat(shakeControllerInput->inputName, "_SHAKE"); + if(snprintf(shakeControllerInput->inputTechName, SIZE, "%s:ABS:%i:SHAKE", controllers->controller[i].path, code) >= 1024) { + // hum ok, truncated value + } + struct input_absinfo absoluteFeatures; ioctl(controller, EVIOCGABS(code), &absoluteFeatures); controllers->controller[i].absMin[code] = absoluteFeatures.minimum; @@ -1119,6 +1130,17 @@ void *controllerThread(void *_args) setAnalogue(channel, scaled > 0.8 ? pow(2, jvsBits) * 0.8 : pow(2, jvsBits) * 0.5); } } + if (args->controller->absTriggers[event.code].shakeEnabled) + { + int channel = args->controller->absTriggers[event.code].shakeChannel; + if( (scaled > args->controller->absTriggers[event.code].shakePreviousScaled && scaled - args->controller->absTriggers[event.code].shakePreviousScaled > 0.1) || + (scaled < args->controller->absTriggers[event.code].shakePreviousScaled && -scaled + args->controller->absTriggers[event.code].shakePreviousScaled > 0.1)) { + setAnalogue(channel, 0); + } else { + setAnalogue(channel, pow(2, jvsBits) / 2); + } + args->controller->absTriggers[event.code].shakePreviousScaled = scaled; + } } break; @@ -1269,6 +1291,7 @@ ControllerStatus startControllerThreads(Controllers *controllers) controllers->controller[i].absTriggers[j].enabled = 0; controllers->controller[i].absTriggers[j].minEnabled = 0; controllers->controller[i].absTriggers[j].maxEnabled = 0; + controllers->controller[i].absTriggers[j].shakeEnabled = 0; controllers->controller[i].absTriggers[j].isNeg = 0; } @@ -1350,6 +1373,18 @@ ControllerStatus startControllerThreads(Controllers *controllers) } break; + case ANALOGUE_SHAKE: + { + controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].shakeEnabled = 1; + controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].shakeChannel = + input.channel; + strcpy(controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].shakeName, + input.name); + controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].shakePlayer = + input.player; + } + break; + default: break; } diff --git a/src/lindbergh/evdevinput.h b/src/lindbergh/evdevinput.h index 3eac25c..373b131 100644 --- a/src/lindbergh/evdevinput.h +++ b/src/lindbergh/evdevinput.h @@ -33,6 +33,12 @@ typedef struct int isAnalogue; int isNeg; // reversed axis + char shakeName[SIZE]; + int shakeChannel; + int shakeEnabled; + int shakePlayer; + double shakePreviousScaled; + int isCoin; } ArcadeInput; @@ -46,7 +52,8 @@ typedef enum { NO_SPECIAL_FUNCTION = 0, ANALOGUE_TO_DIGITAL_MAX, ANALOGUE_TO_DIGITAL_MIN, - DIGITAL_TO_ANALOGUE + DIGITAL_TO_ANALOGUE, + ANALOGUE_SHAKE } SpecialFunction; typedef struct