diff --git a/src/input/evdev.c b/src/input/evdev.c index 93aa3ad..f5adc5f 100644 --- a/src/input/evdev.c +++ b/src/input/evdev.c @@ -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); } diff --git a/src/input/mapping.c b/src/input/mapping.c index 166ba3d..86d0425 100644 --- a/src/input/mapping.c +++ b/src/input/mapping.c @@ -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) { diff --git a/src/input/mapping.h b/src/input/mapping.h index 7604845..19c6798 100644 --- a/src/input/mapping.h +++ b/src/input/mapping.h @@ -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;