Merge pull request #27 from hpvb/analogue_deadzone

Add per analogue input deadzones
This commit is contained in:
Bobby Dilley
2024-12-29 22:12:47 +00:00
committed by GitHub
5 changed files with 96 additions and 1 deletions
+38
View File
@@ -957,6 +957,41 @@ int readConfig(FILE *configFile, EmulatorConfig *config)
else if (strcmp(command, "ANALOGUE_8") == 0)
strncpy(config->arcadeInputs.analogue_8, getNextToken(NULL, " ", &saveptr), INPUT_STRING_LENGTH - 1);
// Analogue deadzone
else if (strcmp(command, "ANALOGUE_DEADZONE_1") == 0) {
config->arcadeInputs.analogue_deadzone_start[0] = atoi(getNextToken(NULL, " ", &saveptr));
config->arcadeInputs.analogue_deadzone_middle[0] = atoi(getNextToken(NULL, " ", &saveptr));
config->arcadeInputs.analogue_deadzone_end[0] = atoi(getNextToken(NULL, " ", &saveptr));
} else if (strcmp(command, "ANALOGUE_DEADZONE_2") == 0) {
config->arcadeInputs.analogue_deadzone_start[1] = atoi(getNextToken(NULL, " ", &saveptr));
config->arcadeInputs.analogue_deadzone_middle[1] = atoi(getNextToken(NULL, " ", &saveptr));
config->arcadeInputs.analogue_deadzone_end[1] = atoi(getNextToken(NULL, " ", &saveptr));
} else if (strcmp(command, "ANALOGUE_DEADZONE_3") == 0) {
config->arcadeInputs.analogue_deadzone_start[2] = atoi(getNextToken(NULL, " ", &saveptr));
config->arcadeInputs.analogue_deadzone_middle[2] = atoi(getNextToken(NULL, " ", &saveptr));
config->arcadeInputs.analogue_deadzone_end[2] = atoi(getNextToken(NULL, " ", &saveptr));
} else if (strcmp(command, "ANALOGUE_DEADZONE_4") == 0) {
config->arcadeInputs.analogue_deadzone_start[3] = atoi(getNextToken(NULL, " ", &saveptr));
config->arcadeInputs.analogue_deadzone_middle[3] = atoi(getNextToken(NULL, " ", &saveptr));
config->arcadeInputs.analogue_deadzone_end[3] = atoi(getNextToken(NULL, " ", &saveptr));
} else if (strcmp(command, "ANALOGUE_DEADZONE_5") == 0) {
config->arcadeInputs.analogue_deadzone_start[4] = atoi(getNextToken(NULL, " ", &saveptr));
config->arcadeInputs.analogue_deadzone_middle[4] = atoi(getNextToken(NULL, " ", &saveptr));
config->arcadeInputs.analogue_deadzone_end[4] = atoi(getNextToken(NULL, " ", &saveptr));
} else if (strcmp(command, "ANALOGUE_DEADZONE_6") == 0) {
config->arcadeInputs.analogue_deadzone_start[5] = atoi(getNextToken(NULL, " ", &saveptr));
config->arcadeInputs.analogue_deadzone_middle[5] = atoi(getNextToken(NULL, " ", &saveptr));
config->arcadeInputs.analogue_deadzone_end[5] = atoi(getNextToken(NULL, " ", &saveptr));
} else if (strcmp(command, "ANALOGUE_DEADZONE_7") == 0) {
config->arcadeInputs.analogue_deadzone_start[6] = atoi(getNextToken(NULL, " ", &saveptr));
config->arcadeInputs.analogue_deadzone_middle[6] = atoi(getNextToken(NULL, " ", &saveptr));
config->arcadeInputs.analogue_deadzone_end[6] = atoi(getNextToken(NULL, " ", &saveptr));
} else if (strcmp(command, "ANALOGUE_DEADZONE_8") == 0) {
config->arcadeInputs.analogue_deadzone_start[7] = atoi(getNextToken(NULL, " ", &saveptr));
config->arcadeInputs.analogue_deadzone_middle[7] = atoi(getNextToken(NULL, " ", &saveptr));
config->arcadeInputs.analogue_deadzone_end[7] = atoi(getNextToken(NULL, " ", &saveptr));
}
else if (strcmp(command, "INPUT_MODE") == 0)
config->inputMode = atoi(getNextToken(NULL, " ", &saveptr));
@@ -1034,6 +1069,9 @@ int initConfig()
config.lgjRenderWithMesa = 1;
config.noSDL = 0;
config.phMode = 1;
memset(&config.arcadeInputs.analogue_deadzone_start, 0, sizeof(config.arcadeInputs.analogue_deadzone_start));
memset(&config.arcadeInputs.analogue_deadzone_middle, 0, sizeof(config.arcadeInputs.analogue_deadzone_middle));
memset(&config.arcadeInputs.analogue_deadzone_end, 0, sizeof(config.arcadeInputs.analogue_deadzone_end));
config.crc32 = elf_crc;
if (detectGame(config.crc32) != 0)
{
+4
View File
@@ -204,6 +204,10 @@ typedef struct {
char analogue_6[INPUT_STRING_LENGTH];
char analogue_7[INPUT_STRING_LENGTH];
char analogue_8[INPUT_STRING_LENGTH];
int analogue_deadzone_start[8];
int analogue_deadzone_middle[8];
int analogue_deadzone_end[8];
} ArcadeInputs;
+33 -1
View File
@@ -777,8 +777,19 @@ typedef struct
{
Controller *controller;
Controllers *controllers;
int analogue_deadzone_start[8];
int analogue_deadzone_middle[8];
int analogue_deadzone_end[8];
} ThreadArguments;
typedef struct
{
double start_max;
double middle_min;
double middle_max;
double end_min;
} AnalogueDeadzones;
static inline const char *typename(unsigned int type)
{
return (type <= EV_MAX && events[type]) ? events[type] : "?";
@@ -991,6 +1002,7 @@ void *controllerThread(void *_args)
}
struct input_event event;
AnalogueDeadzones analogue_deadzones[8];
int flags = fcntl(fd, F_GETFL, 0);
fcntl(fd, F_SETFL, flags | O_NONBLOCK);
@@ -1000,6 +1012,13 @@ void *controllerThread(void *_args)
args->controllers->threadsRunning = 1;
for (int i = 0; i < 8; ++i) {
analogue_deadzones[i].start_max = args->analogue_deadzone_start[i] / 100.0;
analogue_deadzones[i].middle_min = 0.5 - (args->analogue_deadzone_middle[i] / 100.0);
analogue_deadzones[i].middle_max = 0.5 + (args->analogue_deadzone_middle[i] / 100.0);
analogue_deadzones[i].end_min = 1.0 - (args->analogue_deadzone_end[i] / 100.0);
}
while (args->controllers->threadsRunning)
{
FD_ZERO(&file_descriptor);
@@ -1041,7 +1060,16 @@ void *controllerThread(void *_args)
if (args->controller->absTriggers[event.code].enabled)
{
setAnalogue(args->controller->absTriggers[event.code].channel, scaled * (pow(2, jvsBits) - 1));
int channel = args->controller->absTriggers[event.code].channel;
// Deadzone handling
if (scaled < analogue_deadzones[channel].start_max)
scaled = 0.0;
if (scaled > analogue_deadzones[channel].middle_min && scaled < analogue_deadzones[channel].middle_max)
scaled = 0.5;
if (scaled > analogue_deadzones[channel].end_min)
scaled = 1.0;
setAnalogue(channel, scaled * (pow(2, jvsBits) - 1));
}
if (args->controller->absTriggers[event.code].minEnabled)
@@ -1309,9 +1337,13 @@ ControllerStatus startControllerThreads(Controllers *controllers)
if (!controllerHasInputsEnabled)
continue;
EmulatorConfig *config = getConfig();
ThreadArguments *args = malloc(sizeof(ThreadArguments));
args->controller = &controllers->controller[i];
args->controllers = controllers;
memcpy(args->analogue_deadzone_start, config->arcadeInputs.analogue_deadzone_start, sizeof(config->arcadeInputs.analogue_deadzone_start));
memcpy(args->analogue_deadzone_middle, config->arcadeInputs.analogue_deadzone_middle, sizeof(config->arcadeInputs.analogue_deadzone_middle));
memcpy(args->analogue_deadzone_end, config->arcadeInputs.analogue_deadzone_end, sizeof(config->arcadeInputs.analogue_deadzone_end));
pthread_create(&controllers->thread[controllers->threadIndex++], NULL, controllerThread, args);
controllers->controller[i].inUse = 1;
}