Compare commits

...
2 Commits
Author SHA1 Message Date
Bobby Dilley a3e3f51003 Attempt to fix LGJ with JVS 2025-03-25 18:50:16 +00:00
dkeruza-neo a96b1fcf30 Reverted reverse axis and shake in evdev. 2025-03-13 20:07:29 -04:00
4 changed files with 27 additions and 150 deletions
+16 -131
View File
@@ -922,11 +922,6 @@ static ControllerStatus listControllers(Controllers *controllers)
strcat(controllerInput->inputName, "_"); strcat(controllerInput->inputName, "_");
strcat(controllerInput->inputName, codename(EV_KEY, code)); strcat(controllerInput->inputName, codename(EV_KEY, code));
normaliseName(controllerInput->inputName); normaliseName(controllerInput->inputName);
if (snprintf(controllerInput->inputTechName, SIZE, "%s:KEY:%i", controllers->controller[i].path, code) >= 1024)
{
// hum ok, truncated value
}
strcpy(controllerInput->inputTechNegName, "-"); // unassignable value (not "" while some conf are empty)
} }
} }
} }
@@ -948,14 +943,6 @@ static ControllerStatus listControllers(Controllers *controllers)
strcat(controllerInput->inputName, "_"); strcat(controllerInput->inputName, "_");
strcat(controllerInput->inputName, codename(EV_ABS, code)); strcat(controllerInput->inputName, codename(EV_ABS, code));
normaliseName(controllerInput->inputName); normaliseName(controllerInput->inputName);
if (snprintf(controllerInput->inputTechName, SIZE, "%s:ABS:%i", controllers->controller[i].path, code) >= 1024)
{
// hum ok, truncated value
}
if (snprintf(controllerInput->inputTechNegName, SIZE, "%s:ABS_NEG:%i", controllers->controller[i].path, code) >= 1024)
{
// hum ok, truncated value
}
ControllerInput *minControllerInput = ControllerInput *minControllerInput =
&controllers->controller[i].inputs[controllers->controller[i].inputCount++]; &controllers->controller[i].inputs[controllers->controller[i].inputCount++];
@@ -964,15 +951,6 @@ static ControllerStatus listControllers(Controllers *controllers)
minControllerInput->specialFunction = ANALOGUE_TO_DIGITAL_MIN; minControllerInput->specialFunction = ANALOGUE_TO_DIGITAL_MIN;
strcpy(minControllerInput->inputName, controllerInput->inputName); strcpy(minControllerInput->inputName, controllerInput->inputName);
strcat(minControllerInput->inputName, "_MIN"); strcat(minControllerInput->inputName, "_MIN");
if (snprintf(minControllerInput->inputTechName, SIZE, "%s:ABS:%i:MIN", controllers->controller[i].path, code) >= 1024)
{
// hum ok, truncated value
}
if (snprintf(minControllerInput->inputTechNegName, SIZE, "%s:ABS_NEG:%i:MIN", controllers->controller[i].path, code) >=
1024)
{
// hum ok, truncated value
}
ControllerInput *maxControllerInput = ControllerInput *maxControllerInput =
&controllers->controller[i].inputs[controllers->controller[i].inputCount++]; &controllers->controller[i].inputs[controllers->controller[i].inputCount++];
@@ -981,27 +959,6 @@ static ControllerStatus listControllers(Controllers *controllers)
maxControllerInput->specialFunction = ANALOGUE_TO_DIGITAL_MAX; maxControllerInput->specialFunction = ANALOGUE_TO_DIGITAL_MAX;
strcpy(maxControllerInput->inputName, controllerInput->inputName); strcpy(maxControllerInput->inputName, controllerInput->inputName);
strcat(maxControllerInput->inputName, "_MAX"); strcat(maxControllerInput->inputName, "_MAX");
if (snprintf(maxControllerInput->inputTechName, SIZE, "%s:ABS:%i:MAX", controllers->controller[i].path, code) >= 1024)
{
// hum ok, truncated value
}
if (snprintf(maxControllerInput->inputTechNegName, SIZE, "%s:ABS_NEG:%i:MAX", controllers->controller[i].path, code) >=
1024)
{
// 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; struct input_absinfo absoluteFeatures;
ioctl(controller, EVIOCGABS(code), &absoluteFeatures); ioctl(controller, EVIOCGABS(code), &absoluteFeatures);
@@ -1109,67 +1066,31 @@ void *controllerThread(void *_args)
((double)event.value - (double)args->controller->absMin[event.code]) / ((double)event.value - (double)args->controller->absMin[event.code]) /
((double)args->controller->absMax[event.code] - (double)args->controller->absMin[event.code]); ((double)args->controller->absMax[event.code] - (double)args->controller->absMin[event.code]);
if(args->controller->absTriggers[event.code].isNeg == 1) {
scaled = 1.0 - scaled;
}
if (args->controller->absTriggers[event.code].enabled) if (args->controller->absTriggers[event.code].enabled)
{ {
int channel = args->controller->absTriggers[event.code].channel; int channel = args->controller->absTriggers[event.code].channel;
// Deadzone handling
if (args->controller->absTriggers[event.code].isAnalogue) { if (scaled < analogue_deadzones[channel].start_max)
// Deadzone handling
if (scaled < analogue_deadzones[channel].start_max)
scaled = 0.0; scaled = 0.0;
if (scaled > analogue_deadzones[channel].middle_min && scaled < analogue_deadzones[channel].middle_max) if (scaled > analogue_deadzones[channel].middle_min && scaled < analogue_deadzones[channel].middle_max)
scaled = 0.5; scaled = 0.5;
if (scaled > analogue_deadzones[channel].end_min) if (scaled > analogue_deadzones[channel].end_min)
scaled = 1.0; scaled = 1.0;
setAnalogue(channel, scaled * (pow(2, jvsBits) - 1));
} else { setAnalogue(channel, scaled * (pow(2, jvsBits) - 1));
setSwitch(args->controller->absTriggers[event.code].player,
args->controller->absTriggers[event.code].channel, scaled < 0.8 ? 0 : 1);
}
} }
if(event.value <= ((args->controller->absMin[event.code] + args->controller->absMax[event.code]) / 2)) { if (args->controller->absTriggers[event.code].minEnabled)
if (args->controller->absTriggers[event.code].minEnabled) {
{ setSwitch(args->controller->absTriggers[event.code].minPlayer,
int channel = args->controller->absTriggers[event.code].minChannel; args->controller->absTriggers[event.code].minChannel, scaled < 0.2);
if (args->controller->absTriggers[event.code].isAnalogue) {
setAnalogue(channel, scaled < 0.2 ? 0.0 : pow(2, jvsBits) * 1.0);
} else {
setSwitch(args->controller->absTriggers[event.code].minPlayer,
args->controller->absTriggers[event.code].minChannel, scaled < 0.2 ? 1 : 0);
}
}
} }
if(event.value >= ((args->controller->absMin[event.code] + args->controller->absMax[event.code]) / 2)) { if (args->controller->absTriggers[event.code].maxEnabled)
if (args->controller->absTriggers[event.code].maxEnabled) {
{ setSwitch(args->controller->absTriggers[event.code].maxPlayer,
int channel = args->controller->absTriggers[event.code].maxChannel; args->controller->absTriggers[event.code].maxChannel, scaled > 0.8);
if (args->controller->absTriggers[event.code].isAnalogue) {
setAnalogue(channel, scaled > 0.8 ? pow(2, jvsBits) : 0.0);
} else {
setSwitch(args->controller->absTriggers[event.code].maxPlayer,
args->controller->absTriggers[event.code].maxChannel, scaled > 0.8 ? 1 : 0);
}
}
} }
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; break;
@@ -1322,9 +1243,6 @@ ControllerStatus startControllerThreads(Controllers *controllers)
controllers->controller[i].absTriggers[j].enabled = 0; controllers->controller[i].absTriggers[j].enabled = 0;
controllers->controller[i].absTriggers[j].minEnabled = 0; controllers->controller[i].absTriggers[j].minEnabled = 0;
controllers->controller[i].absTriggers[j].maxEnabled = 0; controllers->controller[i].absTriggers[j].maxEnabled = 0;
controllers->controller[i].absTriggers[j].shakeEnabled = 0;
controllers->controller[i].absTriggers[j].isNeg = 0;
controllers->controller[i].absTriggers[j].isAnalogue = 1;
} }
for (int j = 0; j < KEY_MAX; j++) for (int j = 0; j < KEY_MAX; j++)
@@ -1337,20 +1255,8 @@ ControllerStatus startControllerThreads(Controllers *controllers)
for (int j = 0; j < controllers->controller[i].inputCount; j++) for (int j = 0; j < controllers->controller[i].inputCount; j++)
{ {
char *mapping = getMapping(controllers->controller[i].inputs[j].inputName); char *mapping = getMapping(controllers->controller[i].inputs[j].inputName);
int negabs = 0; if (mapping == NULL)
continue;
if (mapping == NULL) {
// give a 2nd chance with a techninal mapping
mapping = getMapping(controllers->controller[i].inputs[j].inputTechName);
if (mapping == NULL) {
// give a 3rd change with negativ technical mapping
mapping = getMapping(controllers->controller[i].inputs[j].inputTechNegName);
negabs = 1;
if (mapping == NULL) {
continue;
}
}
}
ArcadeInput input = {0}; ArcadeInput input = {0};
ControllerStatus status = getArcadeInputByName(mapping, &input); ControllerStatus status = getArcadeInputByName(mapping, &input);
@@ -1375,9 +1281,6 @@ ControllerStatus startControllerThreads(Controllers *controllers)
input.name); input.name);
controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].player = controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].player =
input.player; input.player;
controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].isNeg = negabs;
if (strstr(input.name, "ANALOGUE") == NULL)
controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].isAnalogue = 0;
} }
break; break;
@@ -1390,9 +1293,6 @@ ControllerStatus startControllerThreads(Controllers *controllers)
input.name); input.name);
controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].maxPlayer = controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].maxPlayer =
input.player; input.player;
controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].isNeg = negabs;
if (strstr(input.name, "ANALOGUE") == NULL)
controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].isAnalogue = 0;
} }
break; break;
@@ -1405,21 +1305,6 @@ ControllerStatus startControllerThreads(Controllers *controllers)
input.name); input.name);
controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].minPlayer = controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].minPlayer =
input.player; input.player;
controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].isNeg = negabs;
if (strstr(input.name, "ANALOGUE") == NULL)
controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].isAnalogue = 0;
}
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; break;
+5 -16
View File
@@ -2,7 +2,7 @@
#include <linux/input-event-codes.h> #include <linux/input-event-codes.h>
#define SIZE 128 #define SIZE 1024
#define CONTROLLER_THREAD_MAX 256 #define CONTROLLER_THREAD_MAX 256
@@ -31,14 +31,6 @@ typedef struct
int maxEnabled; int maxEnabled;
int isAnalogue; int isAnalogue;
int isNeg; // reversed axis
char shakeName[SIZE];
int shakeChannel;
int shakeEnabled;
int shakePlayer;
double shakePreviousScaled;
int isCoin; int isCoin;
} ArcadeInput; } ArcadeInput;
@@ -52,15 +44,12 @@ typedef enum {
NO_SPECIAL_FUNCTION = 0, NO_SPECIAL_FUNCTION = 0,
ANALOGUE_TO_DIGITAL_MAX, ANALOGUE_TO_DIGITAL_MAX,
ANALOGUE_TO_DIGITAL_MIN, ANALOGUE_TO_DIGITAL_MIN,
DIGITAL_TO_ANALOGUE, DIGITAL_TO_ANALOGUE
ANALOGUE_SHAKE
} SpecialFunction; } SpecialFunction;
typedef struct typedef struct
{ {
char inputName[SIZE]; char inputName[SIZE];
char inputTechName[SIZE];
char inputTechNegName[SIZE];
int evType; int evType;
int evCode; int evCode;
SpecialFunction specialFunction; SpecialFunction specialFunction;
@@ -69,12 +58,12 @@ typedef struct
typedef struct typedef struct
{ {
char name[SIZE]; char name[SIZE];
char path[320]; char path[SIZE];
char physicalLocation[128]; char physicalLocation[SIZE];
int absMax[ABS_MAX]; int absMax[ABS_MAX];
int absMin[ABS_MAX]; int absMin[ABS_MAX];
ControllerInput inputs[320]; ControllerInput inputs[SIZE];
int inputCount; int inputCount;
ArcadeInput keyTriggers[KEY_MAX]; ArcadeInput keyTriggers[KEY_MAX];
+1 -1
View File
@@ -444,7 +444,7 @@ int main(int argc, char *argv[])
continue; continue;
} }
if (strcmp(argv[i], "-z") == 0 || strcmp(argv[i], "--ziink") == 0) if (strcmp(argv[i], "-z") == 0 || strcmp(argv[i], "--zink") == 0)
{ {
zink = 1; zink = 1;
continue; continue;
+5 -2
View File
@@ -160,6 +160,10 @@ void *readJVSFrameThread(void * arg)
waitForEnd = 0; waitForEnd = 0;
do { do {
while(jvsFrameBuffer.ready == 1) {
usleep(10);
}
// printf("SERIAL thread debug: trying to read byte.\n"); // printf("SERIAL thread debug: trying to read byte.\n");
// Try to read a byte from serial, this call will be blocking if VMIN > 0 and VTIME = 0 // Try to read a byte from serial, this call will be blocking if VMIN > 0 and VTIME = 0
bytesRead = read(fd, &localBuffer[byteCount], 1); bytesRead = read(fd, &localBuffer[byteCount], 1);
@@ -237,14 +241,13 @@ int startJVSFrameThread(int * fd) {
* @return * @return
*/ */
JVSFrame readJVSFrameFromThread() { JVSFrame readJVSFrameFromThread() {
JVSFrame frame; JVSFrame frame;
// Lock while reading/writing to shared frame // Lock while reading/writing to shared frame
pthread_mutex_lock(&jvsBuffer_lock); pthread_mutex_lock(&jvsBuffer_lock);
// Check if we have a valid frame // Check if we have a valid frame
if (jvsFrameBuffer.ready == 1) { if (jvsFrameBuffer.ready == 1) {
frame = jvsFrameBuffer; memcpy(&frame, &jvsFrameBuffer, sizeof(JVSFrame));
// It has been red, we disable this frame // It has been red, we disable this frame
jvsFrameBuffer.ready = 0; jvsFrameBuffer.ready = 0;
} else { } else {