mirror of
https://github.com/lindbergh-loader/lindbergh-loader.git
synced 2026-10-01 03:08:02 +03:00
Merge pull request #27 from hpvb/analogue_deadzone
Add per analogue input deadzones
This commit is contained in:
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user