Add half-axis support for dpad

This commit is contained in:
Cameron Gutman 2021-07-25 17:04:43 -05:00
parent 35af4c4ede
commit e8fbb2ec9c
3 changed files with 53 additions and 0 deletions

View File

@ -76,6 +76,7 @@ struct input_device {
short rightStickX, rightStickY;
bool gamepadModified;
struct input_abs_parms xParms, yParms, rxParms, ryParms, zParms, rzParms;
struct input_abs_parms leftParms, rightParms, upParms, downParms;
};
#define HAT_UP 1
@ -458,6 +459,39 @@ static bool evdev_handle_event(struct input_event *ev, struct input_device *dev)
dev->rightTrigger = evdev_convert_value_byte(ev, dev, &dev->rzParms, dev->map->halfaxis_righttrigger);
gamepadModified = true;
}
if (index == dev->map->abs_dpright) {
if (evdev_convert_value_byte(ev, dev, &dev->rightParms, dev->map->halfaxis_dpright) > 127)
dev->buttonFlags |= RIGHT_FLAG;
else
dev->buttonFlags &= ~RIGHT_FLAG;
gamepadModified = true;
}
if (index == dev->map->abs_dpleft) {
if (evdev_convert_value_byte(ev, dev, &dev->leftParms, dev->map->halfaxis_dpleft) > 127)
dev->buttonFlags |= LEFT_FLAG;
else
dev->buttonFlags &= ~LEFT_FLAG;
gamepadModified = true;
}
if (index == dev->map->abs_dpup) {
if (evdev_convert_value_byte(ev, dev, &dev->upParms, dev->map->halfaxis_dpup) > 127)
dev->buttonFlags |= UP_FLAG;
else
dev->buttonFlags &= ~UP_FLAG;
gamepadModified = true;
}
if (index == dev->map->abs_dpdown) {
if (evdev_convert_value_byte(ev, dev, &dev->downParms, dev->map->halfaxis_dpdown) > 127)
dev->buttonFlags |= DOWN_FLAG;
else
dev->buttonFlags &= ~DOWN_FLAG;
gamepadModified = true;
}
}
}
@ -656,6 +690,10 @@ void evdev_create(const char* device, struct mapping* mappings, bool verbose, in
valid &= evdev_init_parms(&devices[dev], &(devices[dev].rxParms), devices[dev].map->abs_rightx);
valid &= evdev_init_parms(&devices[dev], &(devices[dev].ryParms), devices[dev].map->abs_righty);
valid &= evdev_init_parms(&devices[dev], &(devices[dev].rzParms), devices[dev].map->abs_righttrigger);
valid &= evdev_init_parms(&devices[dev], &(devices[dev].leftParms), devices[dev].map->abs_dpleft);
valid &= evdev_init_parms(&devices[dev], &(devices[dev].rightParms), devices[dev].map->abs_dpright);
valid &= evdev_init_parms(&devices[dev], &(devices[dev].upParms), devices[dev].map->abs_dpup);
valid &= evdev_init_parms(&devices[dev], &(devices[dev].downParms), devices[dev].map->abs_dpdown);
if (!valid)
fprintf(stderr, "Mapping for %s (%s) on %s is incorrect\n", name, str_guid, device);
}

View File

@ -110,6 +110,18 @@ struct mapping* mapping_parse(char* mapping) {
} else if (strcmp("righttrigger", key) == 0) {
map->abs_righttrigger = int_value;
map->halfaxis_righttrigger = half_axis;
} else if (strcmp("dpright", key) == 0) {
map->abs_dpright = int_value;
map->halfaxis_dpright = half_axis;
} else if (strcmp("dpleft", key) == 0) {
map->abs_dpleft = int_value;
map->halfaxis_dpleft = half_axis;
} else if (strcmp("dpup", key) == 0) {
map->abs_dpup = int_value;
map->halfaxis_dpup = half_axis;
} else if (strcmp("dpdown", key) == 0) {
map->abs_dpdown = int_value;
map->halfaxis_dpdown = half_axis;
}
} else if (sscanf(value, "h%d.%d", &int_value, &direction_value) == 2) {
if (strcmp("dpright", key) == 0) {

View File

@ -29,6 +29,8 @@ struct mapping {
bool reverse_leftx, reverse_lefty;
bool reverse_rightx, reverse_righty;
bool halfaxis_lefttrigger, halfaxis_righttrigger;
bool halfaxis_dpright, halfaxis_dpleft;
bool halfaxis_dpup, halfaxis_dpdown;
short abs_leftx, abs_lefty;
short abs_rightx, abs_righty;
@ -36,6 +38,7 @@ struct mapping {
short hat_dpright, hat_dpleft, hat_dpup, hat_dpdown;
short hat_dir_dpright, hat_dir_dpleft, hat_dir_dpup, hat_dir_dpdown;
short btn_dpup, btn_dpdown, btn_dpleft, btn_dpright;
short abs_dpright, abs_dpleft, abs_dpup, abs_dpdown;
short btn_a, btn_x, btn_y, btn_b;
short btn_back, btn_start, btn_guide;