From 5428652ef870944b5d9ecded0fea1dceb02e354d Mon Sep 17 00:00:00 2001 From: oshaboy Date: Wed, 31 Jan 2024 04:16:09 +0200 Subject: [PATCH 01/50] Added udev sensor support --- input/drivers/udev_input.c | 414 ++++++++++++++++++++++++++++--------- 1 file changed, 319 insertions(+), 95 deletions(-) diff --git a/input/drivers/udev_input.c b/input/drivers/udev_input.c index e80c7fb95966..1c9004ac7e37 100644 --- a/input/drivers/udev_input.c +++ b/input/drivers/udev_input.c @@ -204,7 +204,9 @@ enum udev_input_dev_type UDEV_INPUT_KEYBOARD = 0, UDEV_INPUT_MOUSE, UDEV_INPUT_TOUCHPAD, - UDEV_INPUT_TOUCHSCREEN + UDEV_INPUT_TOUCHSCREEN, + UDEV_INPUT_SENSOR + //UDEV_INPUT_DUALSHOCK4 = 0x80 }; /* NOTE: must be in sync with enum udev_input_dev_type */ @@ -213,7 +215,8 @@ static const char *g_dev_type_str[] = "ID_INPUT_KEY", "ID_INPUT_MOUSE", "ID_INPUT_TOUCHPAD", - "ID_INPUT_TOUCHSCREEN" + "ID_INPUT_TOUCHSCREEN", + "ID_INPUT_ACCELEROMETER" }; typedef struct @@ -310,7 +313,6 @@ typedef struct /* Is this feature enabled? */ bool enabled; } udev_input_touch_limits_t; - /** * Helper structure for representing the time of a touch event. */ @@ -527,6 +529,35 @@ typedef struct #endif /* UDEV_TOUCH_SUPPORT */ + +typedef udev_input_touch_limits_t udev_input_sensor_limits_t; +typedef struct { + + union { + struct{ + udev_input_sensor_limits_t accelerometer_x_limit; + udev_input_sensor_limits_t accelerometer_y_limit; + udev_input_sensor_limits_t accelerometer_z_limit; + udev_input_sensor_limits_t gyro_x_limit; + udev_input_sensor_limits_t gyro_y_limit; + udev_input_sensor_limits_t gyro_z_limit; + } s; + udev_input_sensor_limits_t a[6]; + } limits; + union { + struct { + int32_t accelerometer_x; + int32_t accelerometer_y; + int32_t accelerometer_z; + int32_t gyro_x; + int32_t gyro_y; + int32_t gyro_z; + } s; + int32_t a[6]; + } sensor_data; + +} udev_input_sensor_t; + typedef struct udev_input_device { void (*handle_cb)(void *data, @@ -534,15 +565,25 @@ typedef struct udev_input_device struct udev_input_device *dev); int fd; /* Device file descriptor */ dev_t dev; /* Device handle */ - udev_input_mouse_t mouse; /* State tracking for mouse-type devices */ -#ifdef UDEV_TOUCH_SUPPORT - udev_input_touch_t touch; /* State tracking for touch-type devices */ -#endif + union { + struct { + udev_input_mouse_t _mouse; /* State tracking for mouse-type devices */ + #ifdef UDEV_TOUCH_SUPPORT + udev_input_touch_t _touch; /* State tracking for touch-type devices */ + #endif + } _mouse; + udev_input_sensor_t _sensor; + } _u; + struct udev_input_device *aggregate_with; enum udev_input_dev_type type; /* Type of this device */ char devnode[NAME_MAX_LENGTH]; /* Device node path */ char ident[255]; /* Identifier of the device */ } udev_input_device_t; +#define MOUSE _u._mouse._mouse +#define TOUCH _u._mouse._touch +#define SENSOR _u._sensor + typedef void (*device_handle_cb)(void *data, const struct input_event *event, udev_input_device_t *dev); @@ -690,7 +731,7 @@ static udev_input_mouse_t *udev_get_mouse( if (dev_index < 0) return NULL; else - return &udev->devices[dev_index]->mouse; + return &udev->devices[dev_index]->MOUSE; } static void udev_mouse_set_x(udev_input_mouse_t *mouse, int32_t x, bool abs) @@ -874,7 +915,7 @@ static int16_t udev_mouse_get_pointer_y(const udev_input_mouse_t *mouse, bool sc static void udev_handle_mouse(void *data, const struct input_event *event, udev_input_device_t *dev) { - udev_input_mouse_t *mouse = &dev->mouse; + udev_input_mouse_t *mouse = &dev->MOUSE; switch (event->type) { @@ -1359,8 +1400,8 @@ static void udev_touch_set_limits_from(struct input_absinfo *info, */ static void udev_dump_touch_dev(udev_input_device_t *dev) { - udev_input_mouse_t *mouse = &dev->mouse; - udev_input_touch_t *touch = &dev->touch; + udev_input_mouse_t *mouse = &dev->MOUSE; + udev_input_touch_t *touch = &dev->TOUCH; RARCH_DBG("[udev] === UDEV_INPUT_DEVICE INFO DUMP ===\n"); @@ -1411,7 +1452,7 @@ static void udev_dump_touch_dev(udev_input_device_t *dev) */ static void udev_destroy_touch_dev(udev_input_device_t *dev) { - udev_input_touch_t *touch = &dev->touch; + udev_input_touch_t *touch = &dev->TOUCH; RARCH_DBG("[udev] Destroying touch device \"%s\"\n", dev->ident); @@ -1460,35 +1501,35 @@ static void udev_update_touch_dev_options(udev_input_device_t *dev, bool force) if (force || pointer_en_new != pointer_en) { pointer_en = pointer_en_new; - dev->touch.pointer_enabled = pointer_en_new; + dev->TOUCH.pointer_enabled = pointer_en_new; } mouse_en_new = UDEV_INPUT_TOUCH_MOUSE_EN; if (force || mouse_en_new != mouse_en) { mouse_en = mouse_en_new; - dev->touch.mouse_enabled = mouse_en_new; + dev->TOUCH.mouse_enabled = mouse_en_new; } touchpad_en_new = UDEV_INPUT_TOUCH_TOUCHPAD_EN; if (force || touchpad_en_new != touchpad_en) { touchpad_en = touchpad_en_new; - dev->touch.touchpad_enabled = touchpad_en_new; + dev->TOUCH.touchpad_enabled = touchpad_en_new; } trackball_en_new = UDEV_INPUT_TOUCH_TRACKBALL_EN; if (force || trackball_en_new != trackball_en) { trackball_en = trackball_en_new; - dev->touch.trackball_enabled = trackball_en_new; + dev->TOUCH.trackball_enabled = trackball_en_new; } gest_en_new = UDEV_INPUT_TOUCH_GEST_EN; if (force || gest_en_new != gest_en) { gest_en = gest_en_new; - dev->touch.gest_enabled = gest_en_new; + dev->TOUCH.gest_enabled = gest_en_new; } } @@ -1502,7 +1543,7 @@ static void udev_init_touch_dev(udev_input_device_t *dev) int iii, ret; struct input_absinfo abs_info; unsigned long xreq, yreq; - udev_input_touch_t *touch = &dev->touch; + udev_input_touch_t *touch = &dev->TOUCH; settings_t *settings = config_get_ptr(); RARCH_DBG("[udev] Initializing touch device \"%s\"\n", dev->ident); @@ -1726,6 +1767,34 @@ static void udev_init_touch_dev(udev_input_device_t *dev) udev_dump_touch_dev(dev); } + +/** + * Initialize given sensor device. + * + * @param dev Input sensor device to initialize. + */ +static void udev_init_sensor_dev(udev_input_device_t *dev) +{ + udev_input_sensor_t *sensor = &dev->SENSOR; + int ret,i; + struct input_absinfo abs_info; + + RARCH_DBG("[udev] Initializing sensor device \"%s\"\n", dev->ident); + for (i=ABS_X ; i<=ABS_RZ; i++){ + ret = ioctl(dev->fd, EVIOCGABS(i), &abs_info); + if (ret < 0) + { + RARCH_WARN("[udev sensor] Failed to get sensor limits\n"); + + sensor->limits.a[i].enabled = false; + } + else{ + RARCH_DBG("[udev sensor]: Initializing sensor %d\n",i); + udev_touch_set_limits_from(&abs_info, &sensor->limits.a[i]); + } + } + +} /** * Fully synchronize the statue of given touch device. * This is inefficient compared to the event-driven @@ -1743,8 +1812,8 @@ static void udev_sync_touch(udev_input_device_t *dev) size_t mt_request_data_size; size_t slot_count; udev_touch_ts_t now; - udev_input_touch_t *touch = &dev->touch; - udev_slot_state_t *staging = dev->touch.staging; + udev_input_touch_t *touch = &dev->TOUCH; + udev_slot_state_t *staging = dev->TOUCH.staging; RARCH_DDBG("[udev] Synchronizing touch data...\n"); @@ -2307,7 +2376,7 @@ static void udev_input_touch_mgest_select(udev_input_touch_t *touch, static void udev_report_touch(udev_input_t *udev, udev_input_device_t *dev) { /* Touch state being modified. */ - udev_input_touch_t *touch = &dev->touch; + udev_input_touch_t *touch = &dev->TOUCH; /* Helper variables. */ int iii; @@ -2663,7 +2732,7 @@ static void udev_report_touch(udev_input_t *udev, udev_input_device_t *dev) /** * Function handling incoming udev events pertaining to a touch device. - * +udev_handle_touch * * @param data Data passed by the callback -> udev_input_t* * @param event Incoming event. * @param dev The source device. @@ -2672,8 +2741,8 @@ static void udev_handle_touch(void *data, const struct input_event *event, udev_input_device_t *dev) { udev_input_t *udev = (udev_input_t*)data; - udev_input_mouse_t *mouse = &dev->mouse; - udev_input_touch_t *touch = &dev->touch; + udev_input_mouse_t *mouse = &dev->MOUSE; + udev_input_touch_t *touch = &dev->TOUCH; /* struct input_event */ /* { */ @@ -3030,7 +3099,7 @@ static int16_t udev_input_touch_state( { int16_t ret = 0; bool screen = false; - udev_input_touch_t *touch = &dev->touch; + udev_input_touch_t *touch = &dev->TOUCH; udev_touch_ts_t now; /* Get current time for measurements */ @@ -3178,6 +3247,21 @@ static int16_t udev_input_touch_state( #endif /* UDEV_TOUCH_SUPPORT */ +/** + * Function handling incoming udev events pertaining to a touch device. +udev_handle_touch * + * @param data Data passed by the callback -> udev_input_t* + * @param event Incoming event. + * @param dev The source device. + */ +static void udev_handle_sensor(void *data, + const struct input_event *event, udev_input_device_t *dev) +{ + if (event->type == EV_ABS) + dev->SENSOR.sensor_data.a[event->code]=event->value; + +} + #define test_bit(array, bit) (array[bit/8] & (1<<(bit%8))) @@ -3192,6 +3276,7 @@ static int udev_input_add_device(udev_input_t *udev, struct input_absinfo absinfo; int fd = -1; int ret = 0; + int clobber = 1; struct stat st; #if defined(HAVE_EPOLL) struct epoll_event event; @@ -3216,12 +3301,16 @@ static int udev_input_add_device(udev_input_t *udev, device->dev = st.st_dev; device->handle_cb = cb; device->type = type; + device->aggregate_with = NULL; strlcpy(device->devnode, devnode, sizeof(device->devnode)); if (ioctl(fd, EVIOCGNAME(sizeof(device->ident)), device->ident) < 0) device->ident[0] = '\0'; + + + /* UDEV_INPUT_MOUSE may report in absolute coords too */ if (type == UDEV_INPUT_MOUSE || type == UDEV_INPUT_TOUCHPAD || type == UDEV_INPUT_TOUCHSCREEN ) { @@ -3255,23 +3344,23 @@ static int udev_input_add_device(udev_input_t *udev, if (test_bit(keycaps, BTN_TOUCH)) { touch = 1; - device->mouse.abs = 1; + device->MOUSE.abs = 1; } /* check for light gun or any other device that might not have a touch button */ else - device->mouse.abs = 2; + device->MOUSE.abs = 2; if ( !test_bit(keycaps, BTN_TOUCH) && !test_bit(keycaps, BTN_MOUSE) ) RARCH_DBG("[udev]: Warning ABS pointer device (%s) has no touch or mouse button\n",device->ident); } } - device->mouse.x_min = 0; - device->mouse.y_min = 0; - device->mouse.x_max = 0; - device->mouse.y_max = 0; + device->MOUSE.x_min = 0; + device->MOUSE.y_min = 0; + device->MOUSE.x_max = 0; + device->MOUSE.y_max = 0; - if (device->mouse.abs) + if (device->MOUSE.abs) { if (ioctl(fd, EVIOCGABS(ABS_X), &absinfo) == -1) { @@ -3279,16 +3368,16 @@ static int udev_input_add_device(udev_input_t *udev, goto end; } - device->mouse.x_min = absinfo.minimum; - device->mouse.x_max = absinfo.maximum; + device->MOUSE.x_min = absinfo.minimum; + device->MOUSE.x_max = absinfo.maximum; if (ioctl(fd, EVIOCGABS(ABS_Y), &absinfo) == -1) { RARCH_DBG("[udev]: ABS pointer device (%s) Failed to get ABS_Y parameters \n",device->ident); goto end; } - device->mouse.y_min = absinfo.minimum; - device->mouse.y_max = absinfo.maximum; + device->MOUSE.y_min = absinfo.minimum; + device->MOUSE.y_max = absinfo.maximum; } if (touch) @@ -3299,18 +3388,54 @@ static int udev_input_add_device(udev_input_t *udev, #endif } + + if (!mouse) goto end; + } else if (type == UDEV_INPUT_SENSOR){ + udev_init_sensor_dev(device); } + RARCH_DBG("%s %s\n",device->ident,strstr(device->ident,"Sony Interactive Entertain")); + /* Care needs to be taken to unify the touchpad and sensors of playstation controllers */ + if (strstr(device->ident,"Sony Interactive Entertain") != NULL){ + char equivalent_device_name[256]; + char * change_position; + int i; + + RARCH_DBG("[udev]: Found Dualshock Device\n"); + strlcpy(equivalent_device_name, device->ident, 256); + + if ((change_position=strstr(equivalent_device_name, "Motion Sensors")) != NULL){ + memcpy(change_position, "Touchpad",sizeof("Touchpad")); + } + else if((change_position=strstr(equivalent_device_name, "Touchpad")) != NULL){ + memcpy(change_position, "Motion Sensors",sizeof("Motion Sensors")); + } + RARCH_DBG("[udev]: Equivalent device should be %s\n", equivalent_device_name); + for (i=0; i<(int)udev->num_devices; i++){ + if (!strncmp(udev->devices[i]->ident,equivalent_device_name,255)){ + RARCH_DBG("[udev]: Found equivalent device at index %d\n", i); + if (type == UDEV_INPUT_SENSOR){ + udev->devices[i]->aggregate_with=device; + } else /* type == UDEV_INPUT_TOUCHPAD */{ + udev->devices[i]->aggregate_with=device; + } + clobber=0; + break; + } + } - tmp = (udev_input_device_t**)realloc(udev->devices, - (udev->num_devices + 1) * sizeof(*udev->devices)); + } + if (clobber) { + tmp = (udev_input_device_t**)realloc(udev->devices, + (udev->num_devices + 1) * sizeof(*udev->devices)); - if (!tmp) - goto end; + if (!tmp) + goto end; - tmp[udev->num_devices++] = device; - udev->devices = tmp; + tmp[udev->num_devices++] = device; + udev->devices = tmp; + } #if defined(HAVE_EPOLL) event.events = EPOLLIN; @@ -3345,7 +3470,13 @@ static int udev_input_add_device(udev_input_t *udev, return ret; } - +static void close_child_devices(udev_input_device_t * curdevice){ + if (curdevice->aggregate_with) { + close_child_devices(curdevice->aggregate_with); + close(curdevice->aggregate_with->fd); + free(curdevice->aggregate_with); + } +} static void udev_input_remove_device(udev_input_t *udev, const char *devnode) { unsigned i; @@ -3354,7 +3485,7 @@ static void udev_input_remove_device(udev_input_t *udev, const char *devnode) { if (!string_is_equal(devnode, udev->devices[i]->devnode)) continue; - + close_child_devices(udev->devices[i]); close(udev->devices[i]->fd); free(udev->devices[i]); memmove(udev->devices + i, udev->devices + i + 1, @@ -3440,10 +3571,12 @@ static void udev_input_handle_hotplug(udev_input_t *udev) /* Add what devices we have now */ for (i = 0; i < (int)udev->num_devices; i++) { - if (udev->devices[i]->type != UDEV_INPUT_KEYBOARD) + udev_input_device_t * cur_device=udev->devices[i]; + do { + if (cur_device->type != UDEV_INPUT_KEYBOARD) { /* Pointers */ - input_config_set_mouse_display_name(mouse, udev->devices[i]->ident); + input_config_set_mouse_display_name(mouse, cur_device->ident); udev->pointers[mouse] = i; mouse++; } @@ -3453,6 +3586,7 @@ static void udev_input_handle_hotplug(udev_input_t *udev) udev->keyboards[keyboard] = i; keyboard++; } + } while((cur_device=cur_device->aggregate_with)!=NULL); } end: @@ -3539,26 +3673,31 @@ static void udev_input_poll(void *data) for (i = 0; i < (int)udev->num_devices; i++) { - if (udev->devices[i]->type == UDEV_INPUT_KEYBOARD) - continue; - - mouse = &udev->devices[i]->mouse; -#ifdef HAVE_X11 - udev_input_adopt_rel_pointer_position_from_mouse( - &udev->pointer_x, &udev->pointer_y, mouse); -#else - mouse->x_rel = 0; - mouse->y_rel = 0; -#endif - mouse->wu = false; - mouse->wd = false; - mouse->whu = false; - mouse->whd = false; - -#ifdef UDEV_TOUCH_SUPPORT - /* Schedule touch state update. */ - udev->devices[i]->touch.run_state_update = true; -#endif + udev_input_device_t * cur_device=udev->devices[i]; + do { + if (cur_device->type == UDEV_INPUT_KEYBOARD || + cur_device->type == UDEV_INPUT_SENSOR) + continue; + + mouse = &cur_device->MOUSE; + #ifdef HAVE_X11 + udev_input_adopt_rel_pointer_position_from_mouse( + &udev->pointer_x, &udev->pointer_y, mouse); + #else + mouse->x_rel = 0; + mouse->y_rel = 0; + #endif + mouse->wu = false; + mouse->wd = false; + mouse->whu = false; + mouse->whd = false; + + #ifdef UDEV_TOUCH_SUPPORT + /* Schedule touch state update. */ + cur_device->TOUCH.run_state_update = true; + #endif + } while ((cur_device=cur_device->aggregate_with)!=NULL); + } while (udev->monitor && udev_input_poll_hotplug_available(udev->monitor)) @@ -3899,7 +4038,7 @@ static int16_t udev_input_state( case RETRO_DEVICE_MOUSE: case RARCH_DEVICE_MOUSE_SCREEN: #ifdef UDEV_TOUCH_SUPPORT - if (pointer_dev && pointer_dev->touch.is_touch_device) + if (pointer_dev && pointer_dev->TOUCH.is_touch_device) return udev_input_touch_state(udev, pointer_dev, binds, keyboard_mapping_blocked, port, device, idx, id); #endif @@ -3909,7 +4048,7 @@ static int16_t udev_input_state( case RETRO_DEVICE_POINTER: case RARCH_DEVICE_POINTER_SCREEN: #ifdef UDEV_TOUCH_SUPPORT - if (pointer_dev && pointer_dev->touch.is_touch_device) + if (pointer_dev && pointer_dev->TOUCH.is_touch_device) return udev_input_touch_state(udev, pointer_dev, binds, keyboard_mapping_blocked, port, device, idx, id); #endif @@ -3920,7 +4059,7 @@ static int16_t udev_input_state( case RETRO_DEVICE_LIGHTGUN: #ifdef UDEV_TOUCH_SUPPORT - if (pointer_dev && pointer_dev->touch.is_touch_device) + if (pointer_dev && pointer_dev->TOUCH.is_touch_device) return udev_input_touch_state(udev, pointer_dev, binds, keyboard_mapping_blocked, port, device, idx, id); #endif @@ -4014,6 +4153,7 @@ static void udev_input_free(void *data) for (i = 0; i < udev->num_devices; i++) { + close_child_devices(udev->devices[i]); close(udev->devices[i]->fd); free(udev->devices[i]); } @@ -4090,7 +4230,6 @@ static void *udev_input_init(const char *joypad_driver) gfx_ctx_ident_t ctx_ident; #endif udev_input_t *udev = (udev_input_t*)calloc(1, sizeof(*udev)); - if (!udev) return NULL; @@ -4142,7 +4281,8 @@ static void *udev_input_init(const char *joypad_driver) if (!open_devices(udev, UDEV_INPUT_TOUCHSCREEN, udev_handle_touch)) goto error; #endif - + if (!open_devices(udev, UDEV_INPUT_SENSOR, udev_handle_sensor)) + goto error; /* If using KMS and we forgot this, * we could lock ourselves out completely. */ if (!udev->num_devices) @@ -4165,30 +4305,41 @@ static void *udev_input_init(const char *joypad_driver) udev->pointers[i] = -1; udev->keyboards[i] = -1; } - for (i = 0; i < (int)udev->num_devices; ++i) { - if (udev->devices[i]->type != UDEV_INPUT_KEYBOARD) - { - RARCH_LOG("[udev]: Mouse/Touch #%u: \"%s\" (%s) %s.\n", - mouse, - udev->devices[i]->ident, - udev->devices[i]->mouse.abs ? "ABS" : "REL", - udev->devices[i]->devnode); - - input_config_set_mouse_display_name(mouse, udev->devices[i]->ident); - udev->pointers[mouse] = i; - mouse++; - } - else - { - RARCH_LOG("[udev]: Keyboard #%u: \"%s\" (%s).\n", - keyboard, - udev->devices[i]->ident, - udev->devices[i]->devnode); - udev->keyboards[keyboard] = i; - keyboard++; - } + udev_input_device_t * curdevice=udev->devices[i]; + do { + if (curdevice->type == UDEV_INPUT_SENSOR) + { + RARCH_LOG("[udev]: Sensor: \"%s\" %s.\n", + curdevice->ident, + curdevice->devnode); + } + else if (curdevice->type != UDEV_INPUT_KEYBOARD) + { + RARCH_LOG("[udev]: Mouse/Touch #%u: \"%s\" (%s) %s.\n", + mouse, + curdevice->ident, + curdevice->MOUSE.abs ? "ABS" : "REL", + curdevice->devnode); + + input_config_set_mouse_display_name(mouse, curdevice->ident); + udev->pointers[mouse] = i; + mouse++; + } + else + { + RARCH_LOG("[udev]: Keyboard #%u: \"%s\" (%s).\n", + keyboard, + udev->devices[i]->ident, + udev->devices[i]->devnode); + udev->keyboards[keyboard] = i; + keyboard++; + } + if ((curdevice=curdevice->aggregate_with)!=NULL) + RARCH_LOG("[udev]: Aggregate Device Child:\n"); + + } while(curdevice); } return udev; @@ -4235,13 +4386,86 @@ static void udev_input_grab_mouse(void *data, bool state) #endif } + +static bool udev_input_set_sensor_state (void *data, unsigned port, enum retro_sensor_action action, unsigned rate) { + //TODO + return true; +} +static float udev_input_get_sensor_input(void *data, unsigned port, unsigned id) { + const udev_input_t *udev = (const udev_input_t *)data; + const udev_input_device_t * device = udev->devices[port]; + const udev_input_sensor_t * sensor; + float sensor_value; + udev_input_sensor_limits_t limits; + + while(device->type != UDEV_INPUT_SENSOR){ + if (device->aggregate_with == NULL){ + RARCH_ERR("[udev]: udev_input_get_sensor_input recieved a " + "device where none of it's children are sensors\n"); + break; + } else { + device=device->aggregate_with; + } + } + sensor=&device->SENSOR; + + switch (id) + { + case RETRO_SENSOR_ACCELEROMETER_X: + sensor_value=(float)sensor->sensor_data.s.accelerometer_x; + limits=sensor->limits.s.accelerometer_x_limit; + break; + + case RETRO_SENSOR_ACCELEROMETER_Y: + sensor_value=(float)sensor->sensor_data.s.accelerometer_y; + limits=sensor->limits.s.accelerometer_y_limit; + break; + + case RETRO_SENSOR_ACCELEROMETER_Z: + sensor_value=(float)sensor->sensor_data.s.accelerometer_z; + limits=sensor->limits.s.accelerometer_z_limit; + break; + + case RETRO_SENSOR_GYROSCOPE_X: + sensor_value=(float)sensor->sensor_data.s.gyro_x; + limits=sensor->limits.s.gyro_x_limit; + break; + case RETRO_SENSOR_GYROSCOPE_Y: + sensor_value=(float)sensor->sensor_data.s.gyro_y; + limits=sensor->limits.s.gyro_x_limit; + break; + case RETRO_SENSOR_GYROSCOPE_Z: + sensor_value=(float)sensor->sensor_data.s.gyro_z; + limits=sensor->limits.s.gyro_x_limit; + break; + default: + return 0.0f; + + } + RARCH_DBG( + "sensor:\n" + "\t%f\n" + "\t%d\n" + "\t%d\n" + "\t%f\n", + sensor_value, + limits.min, + limits.max, + (((sensor_value-limits.min)/(limits.max-limits.min))-0.5f)*16.f + ); + return (((sensor_value-limits.min)/(limits.max-limits.min))-0.5f)*16.f; + + +} + + input_driver_t input_udev = { udev_input_init, udev_input_poll, udev_input_state, udev_input_free, - NULL, - NULL, + udev_input_set_sensor_state, + udev_input_get_sensor_input, udev_input_get_capabilities, "udev", udev_input_grab_mouse, From 606742b485ee128f840446be5794d41c2323631e Mon Sep 17 00:00:00 2001 From: oshaboy Date: Wed, 31 Jan 2024 05:12:36 +0200 Subject: [PATCH 02/50] Fixed segfault and added hotplug support. --- input/drivers/udev_input.c | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/input/drivers/udev_input.c b/input/drivers/udev_input.c index 1c9004ac7e37..be64b6bcb0bc 100644 --- a/input/drivers/udev_input.c +++ b/input/drivers/udev_input.c @@ -206,7 +206,6 @@ enum udev_input_dev_type UDEV_INPUT_TOUCHPAD, UDEV_INPUT_TOUCHSCREEN, UDEV_INPUT_SENSOR - //UDEV_INPUT_DUALSHOCK4 = 0x80 }; /* NOTE: must be in sync with enum udev_input_dev_type */ @@ -3276,7 +3275,7 @@ static int udev_input_add_device(udev_input_t *udev, struct input_absinfo absinfo; int fd = -1; int ret = 0; - int clobber = 1; + int new_device = 1; struct stat st; #if defined(HAVE_EPOLL) struct epoll_event event; @@ -3395,7 +3394,6 @@ static int udev_input_add_device(udev_input_t *udev, } else if (type == UDEV_INPUT_SENSOR){ udev_init_sensor_dev(device); } - RARCH_DBG("%s %s\n",device->ident,strstr(device->ident,"Sony Interactive Entertain")); /* Care needs to be taken to unify the touchpad and sensors of playstation controllers */ if (strstr(device->ident,"Sony Interactive Entertain") != NULL){ char equivalent_device_name[256]; @@ -3415,18 +3413,18 @@ static int udev_input_add_device(udev_input_t *udev, for (i=0; i<(int)udev->num_devices; i++){ if (!strncmp(udev->devices[i]->ident,equivalent_device_name,255)){ RARCH_DBG("[udev]: Found equivalent device at index %d\n", i); - if (type == UDEV_INPUT_SENSOR){ + if (type == UDEV_INPUT_SENSOR) udev->devices[i]->aggregate_with=device; - } else /* type == UDEV_INPUT_TOUCHPAD */{ + else /* type == UDEV_INPUT_TOUCHPAD */ udev->devices[i]->aggregate_with=device; - } - clobber=0; + + new_device=0; break; } } } - if (clobber) { + if (new_device) { tmp = (udev_input_device_t**)realloc(udev->devices, (udev->num_devices + 1) * sizeof(*udev->devices)); @@ -3471,6 +3469,7 @@ static int udev_input_add_device(udev_input_t *udev, return ret; } static void close_child_devices(udev_input_device_t * curdevice){ + RARCH_DBG("[udev] close child %p\n", curdevice->aggregate_with); if (curdevice->aggregate_with) { close_child_devices(curdevice->aggregate_with); close(curdevice->aggregate_with->fd); @@ -3502,6 +3501,7 @@ static void udev_input_handle_hotplug(udev_input_t *udev) const char *val_mouse = NULL; const char *val_touchpad = NULL; const char *val_touchscreen = NULL; + const char *val_sensor = NULL; const char *action = NULL; const char *devnode = NULL; int mouse = 0; @@ -3518,6 +3518,7 @@ static void udev_input_handle_hotplug(udev_input_t *udev) val_mouse = udev_device_get_property_value(dev, "ID_INPUT_MOUSE"); val_touchpad = udev_device_get_property_value(dev, "ID_INPUT_TOUCHPAD"); val_touchscreen = udev_device_get_property_value(dev, "ID_INPUT_TOUCHSCREEN"); + val_sensor = udev_device_get_property_value(dev, "ID_INPUT_ACCELEROMETER"); action = udev_device_get_action(dev); devnode = udev_device_get_devnode(dev); @@ -3547,6 +3548,11 @@ static void udev_input_handle_hotplug(udev_input_t *udev) cb = udev_handle_mouse; #endif } + else if (val_sensor && string_is_equal(val_sensor, "1") && devnode) + { + dev_type = UDEV_INPUT_SENSOR; + cb = udev_handle_sensor; + } else goto end; @@ -3573,7 +3579,8 @@ static void udev_input_handle_hotplug(udev_input_t *udev) { udev_input_device_t * cur_device=udev->devices[i]; do { - if (cur_device->type != UDEV_INPUT_KEYBOARD) + if (cur_device->type == UDEV_INPUT_SENSOR); + else if (cur_device->type != UDEV_INPUT_KEYBOARD) { /* Pointers */ input_config_set_mouse_display_name(mouse, cur_device->ident); @@ -4389,15 +4396,18 @@ static void udev_input_grab_mouse(void *data, bool state) static bool udev_input_set_sensor_state (void *data, unsigned port, enum retro_sensor_action action, unsigned rate) { //TODO + RARCH_DBG("udev_input_set_sensor_state: %d %d %d\n", port, action,rate); return true; } static float udev_input_get_sensor_input(void *data, unsigned port, unsigned id) { const udev_input_t *udev = (const udev_input_t *)data; - const udev_input_device_t * device = udev->devices[port]; + const udev_input_device_t * device; const udev_input_sensor_t * sensor; float sensor_value; udev_input_sensor_limits_t limits; - + if (udev->devices == NULL) return 0.0f; + + device = udev->devices[port]; while(device->type != UDEV_INPUT_SENSOR){ if (device->aggregate_with == NULL){ RARCH_ERR("[udev]: udev_input_get_sensor_input recieved a " @@ -4443,7 +4453,7 @@ static float udev_input_get_sensor_input(void *data, unsigned port, unsigned id) } RARCH_DBG( - "sensor:\n" + "[udev] sensor:\n" "\t%f\n" "\t%d\n" "\t%d\n" From 7775239c41f499f99b94528feffc5ee213ce86f2 Mon Sep 17 00:00:00 2001 From: oshaboy Date: Thu, 1 Feb 2024 18:24:43 +0200 Subject: [PATCH 03/50] Preliminary SDL Gyro Support --- input/drivers/sdl_input.c | 181 ++++++++++++++++++++++++++++++++++++- input/drivers/udev_input.c | 17 ++-- 2 files changed, 190 insertions(+), 8 deletions(-) diff --git a/input/drivers/sdl_input.c b/input/drivers/sdl_input.c index 3774c8242123..8700494bfbf6 100644 --- a/input/drivers/sdl_input.c +++ b/input/drivers/sdl_input.c @@ -28,6 +28,7 @@ #include "../../configuration.h" #include "../../retroarch.h" +#include "../../verbosity.h" #include "../../tasks/tasks_internal.h" #ifdef HAVE_SDL2 @@ -39,8 +40,30 @@ #include #endif + /* TODO/FIXME - * fix game focus toggle */ +enum SDL_AUXILIARY_DEVICE_TYPE{ + SDL_AUXILIARY_DEVICE_TYPE_NONE, + SDL_AUXILIARY_DEVICE_TYPE_SENSOR, + SDL_AUXILIARY_DEVICE_TYPE_TOUCHID, + SDL_AUXILIARY_DEVICE_TYPE_GAMECONTROLLER +}; +struct game_controller_data{ + SDL_GameController * ptr; + unsigned has_accelerometer : 1; + unsigned has_gyro : 1; + unsigned num_touchpads:14; +}; + +typedef struct { + union { + SDL_Sensor * sensor; + SDL_TouchID touch_id; + struct game_controller_data game_controller; + } dev; + enum SDL_AUXILIARY_DEVICE_TYPE type; +} sdl_auxiliary_device; typedef struct sdl_input { @@ -57,6 +80,8 @@ typedef struct sdl_input int mouse_wd; int mouse_wl; int mouse_wr; + unsigned auxiliary_device_number; + sdl_auxiliary_device * auxiliary_devices; } sdl_input_t; #ifdef WEBOS @@ -76,7 +101,79 @@ static void *sdl_input_init(const char *joypad_driver) return NULL; input_keymaps_init_keyboard_lut(rarch_key_map_sdl); - + { + int numJoysticks,numTouchDevices,numSensors; + int i; + + SDL_InitSubSystem(SDL_INIT_GAMECONTROLLER); + RARCH_DBG( + "[sdl]: SDL_GetNumTouchDevices: %d\n", + numTouchDevices=SDL_GetNumTouchDevices() + ); + RARCH_DBG( + "[sdl]: SDL_NumSensors: %d\n", + numSensors=SDL_NumSensors() + ); + RARCH_DBG( + "[sdl]: SDL_NumJoysticks: %d\n", + numJoysticks=SDL_NumJoysticks() + ); + sdl->auxiliary_device_number=0; + sdl->auxiliary_devices=malloc(sizeof(sdl_auxiliary_device)*(numJoysticks+numTouchDevices+numSensors)); + for (i=0; iauxiliary_devices[sdl->auxiliary_device_number]. + dev.touch_id=SDL_GetTouchDevice(i); + sdl->auxiliary_devices[sdl->auxiliary_device_number]. + type=SDL_AUXILIARY_DEVICE_TYPE_TOUCHID; + sdl->auxiliary_device_number++; + } + for(i=0; iauxiliary_devices[sdl->auxiliary_device_number]. + dev.sensor=SDL_SensorOpen(i); + sdl->auxiliary_devices[sdl->auxiliary_device_number]. + type=SDL_AUXILIARY_DEVICE_TYPE_SENSOR; + sdl->auxiliary_device_number++; + } + for (i=0; iauxiliary_devices[sdl->auxiliary_device_number]. + dev.game_controller=(struct game_controller_data){ + /*.ptr=*/ SDL_GameControllerOpen(i), + /*.has_accelerometer=*/SDL_GameControllerIsSensorEnabled(gamepad,SDL_SENSOR_ACCEL), + /*.has_gyro=*/SDL_GameControllerIsSensorEnabled(gamepad,SDL_SENSOR_GYRO), + /*.num_touchpads*/SDL_GameControllerGetNumTouchpads(gamepad) + }; + sdl->auxiliary_devices[sdl->auxiliary_device_number]. + type=SDL_AUXILIARY_DEVICE_TYPE_GAMECONTROLLER; + sdl->auxiliary_device_number++; + } + } + } return sdl; } @@ -325,7 +422,7 @@ static void sdl_input_free(void *data) #else while (SDL_PollEvent(&event)); #endif - + free(sdl->auxiliary_devices); free(data); } @@ -457,14 +554,94 @@ static uint64_t sdl_get_capabilities(void *data) | (1 << RETRO_DEVICE_POINTER) | (1 << RETRO_DEVICE_ANALOG); } +static bool sdl_input_set_sensor_state (void *data, unsigned port, enum retro_sensor_action action, unsigned rate) { + return true; +} +static float sdl_input_get_sensor_input (void *data, unsigned port, unsigned id) { + sdl_input_t * sdl = (sdl_input_t *)data; + SDL_GameController * gamepad=NULL; + int i; + float sensor_data[3],sensor_value; + + for (i=0; i<(int)sdl->auxiliary_device_number;i++){ + RARCH_DBG("[sdl]: %d %d\n", i,sdl->auxiliary_devices[i].type); + if ( + sdl->auxiliary_devices[i].type == SDL_AUXILIARY_DEVICE_TYPE_GAMECONTROLLER && + (sdl->auxiliary_devices[i].dev.game_controller.has_accelerometer || + sdl->auxiliary_devices[i].dev.game_controller.has_gyro) + ){ + if (port==0){ + gamepad=sdl->auxiliary_devices[i].dev.game_controller.ptr; + break; + } else port--; + } else if(sdl->auxiliary_devices[i].type == SDL_AUXILIARY_DEVICE_TYPE_SENSOR){ + //TODO + } + } + if (!gamepad){ + RARCH_ERR("[sdl]: sdl_input_get_sensor_input recieved a " + "device where none of it's children are sensors\n"); + return 0.0f; + } + if ((id == RETRO_SENSOR_ACCELEROMETER_X) | + (id == RETRO_SENSOR_ACCELEROMETER_Y) | + (id == RETRO_SENSOR_ACCELEROMETER_Z) + ) + SDL_GameControllerGetSensorData(gamepad, SDL_SENSOR_ACCEL, sensor_data,3); + + else if ((id == RETRO_SENSOR_GYROSCOPE_X) | + (id == RETRO_SENSOR_GYROSCOPE_Y) | + (id == RETRO_SENSOR_GYROSCOPE_Z) + ) + SDL_GameControllerGetSensorData(gamepad, SDL_SENSOR_GYRO, sensor_data,3); + switch (id){ + case RETRO_SENSOR_ACCELEROMETER_X: + case RETRO_SENSOR_GYROSCOPE_X: + sensor_value=sensor_data[0]; + break; + + case RETRO_SENSOR_ACCELEROMETER_Y: + case RETRO_SENSOR_GYROSCOPE_Y: + sensor_value=sensor_data[1]; + + break; + case RETRO_SENSOR_ACCELEROMETER_Z: + case RETRO_SENSOR_GYROSCOPE_Z: + sensor_value=sensor_data[2]; + break; + } + RARCH_DBG( + "[udev] sensor:\n" + "\t%f\n" + /* + "\t%d\n" + "\t%d\n" + */ + "\t%f\n", + sensor_value, + /*limits.min, + limits.max,*/ + sensor_value + ); + return sensor_value; + + +} + + input_driver_t input_sdl = { sdl_input_init, sdl_input_poll, sdl_input_state, sdl_input_free, +#ifdef HAVE_SDL2 + sdl_input_set_sensor_state, + sdl_input_get_sensor_input, +#else NULL, NULL, +#endif sdl_get_capabilities, #ifdef HAVE_SDL2 "sdl2", diff --git a/input/drivers/udev_input.c b/input/drivers/udev_input.c index be64b6bcb0bc..116d42eb675b 100644 --- a/input/drivers/udev_input.c +++ b/input/drivers/udev_input.c @@ -232,7 +232,13 @@ typedef struct bool wu, wd, whu, whd; bool pp; } udev_input_mouse_t; +enum udev_sensor_type +{ + UDEV_SENSOR_ACCELEROMETER, + UDEV_SENSOR_GYROSCOPE, + UDEV_SENSOR_SIXAXIS +}; #ifdef UDEV_TOUCH_SUPPORT /** @@ -554,7 +560,7 @@ typedef struct { } s; int32_t a[6]; } sensor_data; - + enum udev_sensor_type type; } udev_input_sensor_t; typedef struct udev_input_device @@ -4412,13 +4418,12 @@ static float udev_input_get_sensor_input(void *data, unsigned port, unsigned id) if (device->aggregate_with == NULL){ RARCH_ERR("[udev]: udev_input_get_sensor_input recieved a " "device where none of it's children are sensors\n"); - break; + return 0.0f; } else { device=device->aggregate_with; } } sensor=&device->SENSOR; - switch (id) { case RETRO_SENSOR_ACCELEROMETER_X: @@ -4449,9 +4454,9 @@ static float udev_input_get_sensor_input(void *data, unsigned port, unsigned id) limits=sensor->limits.s.gyro_x_limit; break; default: - return 0.0f; - - } + return 0.0f; + } + RARCH_DBG( "[udev] sensor:\n" "\t%f\n" From ebe99abf8d159d1f8855e822082ec2593321051e Mon Sep 17 00:00:00 2001 From: oshaboy Date: Fri, 2 Feb 2024 02:27:55 +0200 Subject: [PATCH 04/50] buncha stuff optimizations SDL touchpad support bugfixes --- input/drivers/sdl_input.c | 134 ++++++++++++++++++++++++------------- input/drivers/udev_input.c | 47 +++---------- 2 files changed, 99 insertions(+), 82 deletions(-) diff --git a/input/drivers/sdl_input.c b/input/drivers/sdl_input.c index 8700494bfbf6..dd63db05af77 100644 --- a/input/drivers/sdl_input.c +++ b/input/drivers/sdl_input.c @@ -51,8 +51,8 @@ enum SDL_AUXILIARY_DEVICE_TYPE{ }; struct game_controller_data{ SDL_GameController * ptr; - unsigned has_accelerometer : 1; - unsigned has_gyro : 1; + bool has_accelerometer : 1; + bool has_gyro : 1; unsigned num_touchpads:14; }; @@ -136,7 +136,7 @@ static void *sdl_input_init(const char *joypad_driver) } for (i=0; iauxiliary_devices[sdl->auxiliary_device_number]. - dev.game_controller=(struct game_controller_data){ - /*.ptr=*/ SDL_GameControllerOpen(i), - /*.has_accelerometer=*/SDL_GameControllerIsSensorEnabled(gamepad,SDL_SENSOR_ACCEL), - /*.has_gyro=*/SDL_GameControllerIsSensorEnabled(gamepad,SDL_SENSOR_GYRO), - /*.num_touchpads*/SDL_GameControllerGetNumTouchpads(gamepad) - }; + dev.game_controller.ptr=SDL_GameControllerOpen(i); + sdl->auxiliary_devices[sdl->auxiliary_device_number]. + dev.game_controller.has_accelerometer=SDL_GameControllerIsSensorEnabled(gamepad,SDL_SENSOR_ACCEL); + sdl->auxiliary_devices[sdl->auxiliary_device_number]. + dev.game_controller.has_gyro=SDL_GameControllerIsSensorEnabled(gamepad,SDL_SENSOR_GYRO); + sdl->auxiliary_devices[sdl->auxiliary_device_number]. + dev.game_controller.num_touchpads=SDL_GameControllerGetNumTouchpads(gamepad); + sdl->auxiliary_devices[sdl->auxiliary_device_number]. type=SDL_AUXILIARY_DEVICE_TYPE_GAMECONTROLLER; sdl->auxiliary_device_number++; @@ -228,7 +230,6 @@ static int16_t sdl_input_state( { int16_t ret = 0; sdl_input_t *sdl = (sdl_input_t*)data; - switch (device) { case RETRO_DEVICE_JOYPAD: @@ -332,7 +333,49 @@ static int16_t sdl_input_state( break; case RETRO_DEVICE_POINTER: case RARCH_DEVICE_POINTER_SCREEN: - if (idx == 0) + if (sdl->auxiliary_devices[port].type == SDL_AUXILIARY_DEVICE_TYPE_TOUCHID ){ + SDL_Finger * finger=SDL_GetTouchFinger( + sdl->auxiliary_devices[port].dev.touch_id, + idx + ); + switch (id) + { + case RETRO_DEVICE_ID_POINTER_X: + return (int16_t)((finger->x-0.5f)*65535); + case RETRO_DEVICE_ID_POINTER_Y: + return (int16_t)((finger->y-0.5f)*65535); + case RETRO_DEVICE_ID_POINTER_PRESSED: + return finger->pressure>0.0f; + + } + } else if ( + sdl->auxiliary_devices[port].type == SDL_AUXILIARY_DEVICE_TYPE_GAMECONTROLLER && + sdl->auxiliary_devices[port].dev.game_controller.num_touchpads + ){ + float x,y,pressure; + + SDL_GameControllerGetTouchpadFinger( + sdl->auxiliary_devices[port].dev.game_controller.ptr, + 0,/*Todo don't hard code*/ + idx, + NULL, + &x,&y, + &pressure + ); + RARCH_DBG("[sdl] finger dump:\n\t%f\n\t%f\n\t%f\n\t%d\n", x,y,pressure,id); + switch (id) + { + case RETRO_DEVICE_ID_POINTER_X: + return (int16_t)((x-0.5f)*65535); + case RETRO_DEVICE_ID_POINTER_Y: + return (int16_t)((y-0.5f)*65535); + case RETRO_DEVICE_ID_POINTER_PRESSED: + return pressure>0.0f; + + } + //TODO + } + else if (idx == 0) { struct video_viewport vp; bool screen = device == @@ -444,7 +487,6 @@ static void sdl2_grab_mouse(void *data, bool state) static void sdl_poll_mouse(sdl_input_t *sdl) { Uint8 btn = SDL_GetRelativeMouseState(&sdl->mouse_x, &sdl->mouse_y); - SDL_GetMouseState(&sdl->mouse_abs_x, &sdl->mouse_abs_y); sdl->mouse_l = (SDL_BUTTON(SDL_BUTTON_LEFT) & btn) ? 1 : 0; @@ -464,7 +506,6 @@ static void sdl_input_poll(void *data) sdl_input_t *sdl = (sdl_input_t*)data; SDL_PumpEvents(); - sdl_poll_mouse(sdl); #ifdef HAVE_SDL2 @@ -560,11 +601,20 @@ static bool sdl_input_set_sensor_state (void *data, unsigned port, enum retro_se static float sdl_input_get_sensor_input (void *data, unsigned port, unsigned id) { sdl_input_t * sdl = (sdl_input_t *)data; SDL_GameController * gamepad=NULL; + SDL_Sensor * sensor=NULL; + SDL_SensorType sensor_type; int i; float sensor_data[3],sensor_value; - + if ((id == RETRO_SENSOR_ACCELEROMETER_X) | + (id == RETRO_SENSOR_ACCELEROMETER_Y) | + (id == RETRO_SENSOR_ACCELEROMETER_Z) + ) sensor_type=SDL_SENSOR_ACCEL; + + else if ((id == RETRO_SENSOR_GYROSCOPE_X) | + (id == RETRO_SENSOR_GYROSCOPE_Y) | + (id == RETRO_SENSOR_GYROSCOPE_Z) + ) sensor_type=SDL_SENSOR_GYRO; for (i=0; i<(int)sdl->auxiliary_device_number;i++){ - RARCH_DBG("[sdl]: %d %d\n", i,sdl->auxiliary_devices[i].type); if ( sdl->auxiliary_devices[i].type == SDL_AUXILIARY_DEVICE_TYPE_GAMECONTROLLER && (sdl->auxiliary_devices[i].dev.game_controller.has_accelerometer || @@ -574,41 +624,33 @@ static float sdl_input_get_sensor_input (void *data, unsigned port, unsigned id) gamepad=sdl->auxiliary_devices[i].dev.game_controller.ptr; break; } else port--; - } else if(sdl->auxiliary_devices[i].type == SDL_AUXILIARY_DEVICE_TYPE_SENSOR){ - //TODO + } else if( + sdl->auxiliary_devices[i].type == SDL_AUXILIARY_DEVICE_TYPE_SENSOR && + SDL_SensorGetType(sdl->auxiliary_devices[i].dev.sensor) == sensor_type + ){ + if (port==0){ + sensor=sdl->auxiliary_devices[i].dev.sensor; + break; + } else port--; } } - if (!gamepad){ + if (!gamepad && !sensor){ RARCH_ERR("[sdl]: sdl_input_get_sensor_input recieved a " "device where none of it's children are sensors\n"); return 0.0f; } - if ((id == RETRO_SENSOR_ACCELEROMETER_X) | - (id == RETRO_SENSOR_ACCELEROMETER_Y) | - (id == RETRO_SENSOR_ACCELEROMETER_Z) - ) - SDL_GameControllerGetSensorData(gamepad, SDL_SENSOR_ACCEL, sensor_data,3); - - else if ((id == RETRO_SENSOR_GYROSCOPE_X) | - (id == RETRO_SENSOR_GYROSCOPE_Y) | - (id == RETRO_SENSOR_GYROSCOPE_Z) - ) - SDL_GameControllerGetSensorData(gamepad, SDL_SENSOR_GYRO, sensor_data,3); - switch (id){ - case RETRO_SENSOR_ACCELEROMETER_X: - case RETRO_SENSOR_GYROSCOPE_X: - sensor_value=sensor_data[0]; - break; - - case RETRO_SENSOR_ACCELEROMETER_Y: - case RETRO_SENSOR_GYROSCOPE_Y: - sensor_value=sensor_data[1]; - - break; - case RETRO_SENSOR_ACCELEROMETER_Z: - case RETRO_SENSOR_GYROSCOPE_Z: - sensor_value=sensor_data[2]; - break; + + if (gamepad) + SDL_GameControllerGetSensorData(gamepad, sensor_type, sensor_data,3); + else /*if (sensor)*/ + SDL_SensorGetData(sensor,sensor_data, 3); + + if (id>=RETRO_SENSOR_ACCELEROMETER_X && id <= RETRO_SENSOR_ACCELEROMETER_Z){ + sensor_value=sensor_data[id-RETRO_SENSOR_ACCELEROMETER_X]; + } else if (id>=RETRO_SENSOR_GYROSCOPE_X && id <= RETRO_SENSOR_GYROSCOPE_Z){ + sensor_value=sensor_data[id-RETRO_SENSOR_GYROSCOPE_X]; + } else { + return 0.0f; //UNIMPLEMENTED } RARCH_DBG( "[udev] sensor:\n" diff --git a/input/drivers/udev_input.c b/input/drivers/udev_input.c index 116d42eb675b..83755a83ef35 100644 --- a/input/drivers/udev_input.c +++ b/input/drivers/udev_input.c @@ -228,9 +228,9 @@ typedef struct int32_t x_max, y_max; int32_t x_rel, y_rel; int32_t abs; - bool l, r, m, b4, b5; - bool wu, wd, whu, whd; - bool pp; + bool l : 1, r : 1, m : 1, b4 : 1, b5 : 1; + bool wu : 1, wd : 1, whu: 1, whd: 1; + bool pp : 1; } udev_input_mouse_t; enum udev_sensor_type { @@ -920,6 +920,7 @@ static int16_t udev_mouse_get_pointer_y(const udev_input_mouse_t *mouse, bool sc static void udev_handle_mouse(void *data, const struct input_event *event, udev_input_device_t *dev) { + udev_input_mouse_t *mouse = &dev->MOUSE; switch (event->type) @@ -3194,7 +3195,6 @@ static int16_t udev_input_touch_state( case RETRO_DEVICE_POINTER: case RARCH_DEVICE_POINTER_SCREEN: screen = (device == RARCH_DEVICE_MOUSE_SCREEN); - break; switch (id) { case RETRO_DEVICE_ID_POINTER_X: @@ -4424,39 +4424,14 @@ static float udev_input_get_sensor_input(void *data, unsigned port, unsigned id) } } sensor=&device->SENSOR; - switch (id) - { - case RETRO_SENSOR_ACCELEROMETER_X: - sensor_value=(float)sensor->sensor_data.s.accelerometer_x; - limits=sensor->limits.s.accelerometer_x_limit; - break; - - case RETRO_SENSOR_ACCELEROMETER_Y: - sensor_value=(float)sensor->sensor_data.s.accelerometer_y; - limits=sensor->limits.s.accelerometer_y_limit; - break; - - case RETRO_SENSOR_ACCELEROMETER_Z: - sensor_value=(float)sensor->sensor_data.s.accelerometer_z; - limits=sensor->limits.s.accelerometer_z_limit; - break; - - case RETRO_SENSOR_GYROSCOPE_X: - sensor_value=(float)sensor->sensor_data.s.gyro_x; - limits=sensor->limits.s.gyro_x_limit; - break; - case RETRO_SENSOR_GYROSCOPE_Y: - sensor_value=(float)sensor->sensor_data.s.gyro_y; - limits=sensor->limits.s.gyro_x_limit; - break; - case RETRO_SENSOR_GYROSCOPE_Z: - sensor_value=(float)sensor->sensor_data.s.gyro_z; - limits=sensor->limits.s.gyro_x_limit; - break; - default: - return 0.0f; + if (id >= RETRO_SENSOR_ACCELEROMETER_X && id <= RETRO_SENSOR_GYROSCOPE_Z){ + sensor_value=(float)sensor->sensor_data.a[id-RETRO_SENSOR_ACCELEROMETER_X]; + limits=sensor->limits.a[id-RETRO_SENSOR_ACCELEROMETER_X]; } - + else + return 0.0f; + + RARCH_DBG( "[udev] sensor:\n" "\t%f\n" From 75b9de3c982c127fbbad0768585fccec7c1659ab Mon Sep 17 00:00:00 2001 From: oshaboy Date: Fri, 2 Feb 2024 19:30:19 +0200 Subject: [PATCH 05/50] Comments and UDEV_TOUCH_SUPPORT flag. --- Makefile.common | 1 + input/drivers/udev_input.c | 15 +++++++++++---- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/Makefile.common b/Makefile.common index 4a872356bd00..4212c5c6a427 100644 --- a/Makefile.common +++ b/Makefile.common @@ -1329,6 +1329,7 @@ ifeq ($(HAVE_DBUS), 1) endif ifeq ($(HAVE_UDEV), 1) + DEFINES += -DUDEV_TOUCH_SUPPORT DEF_FLAGS += $(UDEV_CFLAGS) LIBS += $(UDEV_LIBS) OBJ += input/drivers/udev_input.o \ diff --git a/input/drivers/udev_input.c b/input/drivers/udev_input.c index 83755a83ef35..b480f30f40c6 100644 --- a/input/drivers/udev_input.c +++ b/input/drivers/udev_input.c @@ -4409,9 +4409,10 @@ static float udev_input_get_sensor_input(void *data, unsigned port, unsigned id) const udev_input_t *udev = (const udev_input_t *)data; const udev_input_device_t * device; const udev_input_sensor_t * sensor; + const float sensitivity=8.f; //Hardcode for now float sensor_value; udev_input_sensor_limits_t limits; - if (udev->devices == NULL) return 0.0f; + if (udev->devices == NULL) return 0.f; device = udev->devices[port]; while(device->type != UDEV_INPUT_SENSOR){ @@ -4429,7 +4430,7 @@ static float udev_input_get_sensor_input(void *data, unsigned port, unsigned id) limits=sensor->limits.a[id-RETRO_SENSOR_ACCELEROMETER_X]; } else - return 0.0f; + return 0.f; RARCH_DBG( @@ -4441,9 +4442,15 @@ static float udev_input_get_sensor_input(void *data, unsigned port, unsigned id) sensor_value, limits.min, limits.max, - (((sensor_value-limits.min)/(limits.max-limits.min))-0.5f)*16.f + (((sensor_value-limits.min)/(limits.max-limits.min))-0.5f)*2.f*sensitivity ); - return (((sensor_value-limits.min)/(limits.max-limits.min))-0.5f)*16.f; + return ( + /*clamp it to the 0 to 1 range*/ + ((sensor_value-limits.min)/(limits.max-limits.min)) + /*convert to the -1 to 1 range*/ + -0.5f)*2.f + /*multiply by sensitivity adjustment*/ + *sensitivity; } From 5fcea9b7a90cf28828bb5ee4fc6a01d60dae5226 Mon Sep 17 00:00:00 2001 From: oshaboy Date: Fri, 2 Feb 2024 19:35:41 +0200 Subject: [PATCH 06/50] Remove C++ style comments --- input/drivers/sdl_input.c | 3 +-- input/drivers/udev_input.c | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/input/drivers/sdl_input.c b/input/drivers/sdl_input.c index dd63db05af77..b2641254a77a 100644 --- a/input/drivers/sdl_input.c +++ b/input/drivers/sdl_input.c @@ -373,7 +373,6 @@ static int16_t sdl_input_state( return pressure>0.0f; } - //TODO } else if (idx == 0) { @@ -650,7 +649,7 @@ static float sdl_input_get_sensor_input (void *data, unsigned port, unsigned id) } else if (id>=RETRO_SENSOR_GYROSCOPE_X && id <= RETRO_SENSOR_GYROSCOPE_Z){ sensor_value=sensor_data[id-RETRO_SENSOR_GYROSCOPE_X]; } else { - return 0.0f; //UNIMPLEMENTED + return 0.0f; /*UNIMPLEMENTED*/ } RARCH_DBG( "[udev] sensor:\n" diff --git a/input/drivers/udev_input.c b/input/drivers/udev_input.c index b480f30f40c6..e29234d53ffb 100644 --- a/input/drivers/udev_input.c +++ b/input/drivers/udev_input.c @@ -4401,7 +4401,7 @@ static void udev_input_grab_mouse(void *data, bool state) static bool udev_input_set_sensor_state (void *data, unsigned port, enum retro_sensor_action action, unsigned rate) { - //TODO + /*TODO*/ RARCH_DBG("udev_input_set_sensor_state: %d %d %d\n", port, action,rate); return true; } @@ -4409,7 +4409,7 @@ static float udev_input_get_sensor_input(void *data, unsigned port, unsigned id) const udev_input_t *udev = (const udev_input_t *)data; const udev_input_device_t * device; const udev_input_sensor_t * sensor; - const float sensitivity=8.f; //Hardcode for now + const float sensitivity=8.f; /*Hardcode for now*/ float sensor_value; udev_input_sensor_limits_t limits; if (udev->devices == NULL) return 0.f; From 0277283144843919782c986a006782d2c922c257 Mon Sep 17 00:00:00 2001 From: oshaboy Date: Fri, 2 Feb 2024 20:10:30 +0200 Subject: [PATCH 07/50] Update sdl_input.c --- input/drivers/sdl_input.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/input/drivers/sdl_input.c b/input/drivers/sdl_input.c index b2641254a77a..8cfb4a46f49f 100644 --- a/input/drivers/sdl_input.c +++ b/input/drivers/sdl_input.c @@ -49,13 +49,13 @@ enum SDL_AUXILIARY_DEVICE_TYPE{ SDL_AUXILIARY_DEVICE_TYPE_TOUCHID, SDL_AUXILIARY_DEVICE_TYPE_GAMECONTROLLER }; +#ifdef HAVE_SDL2 struct game_controller_data{ SDL_GameController * ptr; bool has_accelerometer : 1; bool has_gyro : 1; unsigned num_touchpads:14; }; - typedef struct { union { SDL_Sensor * sensor; @@ -64,7 +64,7 @@ typedef struct { } dev; enum SDL_AUXILIARY_DEVICE_TYPE type; } sdl_auxiliary_device; - +#endif typedef struct sdl_input { int mouse_x; @@ -80,8 +80,10 @@ typedef struct sdl_input int mouse_wd; int mouse_wl; int mouse_wr; +#ifdef HAVE_SDL2 unsigned auxiliary_device_number; sdl_auxiliary_device * auxiliary_devices; +#endif } sdl_input_t; #ifdef WEBOS @@ -101,6 +103,8 @@ static void *sdl_input_init(const char *joypad_driver) return NULL; input_keymaps_init_keyboard_lut(rarch_key_map_sdl); + +#ifdef HAVE_SDL2 { int numJoysticks,numTouchDevices,numSensors; int i; @@ -176,6 +180,7 @@ static void *sdl_input_init(const char *joypad_driver) } } } +#endif return sdl; } @@ -333,6 +338,8 @@ static int16_t sdl_input_state( break; case RETRO_DEVICE_POINTER: case RARCH_DEVICE_POINTER_SCREEN: + +#ifdef HAVE_SDL2 if (sdl->auxiliary_devices[port].type == SDL_AUXILIARY_DEVICE_TYPE_TOUCHID ){ SDL_Finger * finger=SDL_GetTouchFinger( sdl->auxiliary_devices[port].dev.touch_id, @@ -374,7 +381,9 @@ static int16_t sdl_input_state( } } - else if (idx == 0) + else +#endif + if (idx == 0) { struct video_viewport vp; bool screen = device == @@ -461,10 +470,10 @@ static void sdl_input_free(void *data) /* Flush out all pending events. */ #ifdef HAVE_SDL2 SDL_FlushEvents(SDL_FIRSTEVENT, SDL_LASTEVENT); + free(sdl->auxiliary_devices); #else while (SDL_PollEvent(&event)); #endif - free(sdl->auxiliary_devices); free(data); } @@ -594,6 +603,7 @@ static uint64_t sdl_get_capabilities(void *data) | (1 << RETRO_DEVICE_POINTER) | (1 << RETRO_DEVICE_ANALOG); } +#ifdef HAVE_SDL2 static bool sdl_input_set_sensor_state (void *data, unsigned port, enum retro_sensor_action action, unsigned rate) { return true; } @@ -668,7 +678,7 @@ static float sdl_input_get_sensor_input (void *data, unsigned port, unsigned id) } - +#endif input_driver_t input_sdl = { From 5113a521d2ed14a2052173396836bae5cd02c201 Mon Sep 17 00:00:00 2001 From: oshaboy Date: Fri, 2 Feb 2024 20:29:23 +0200 Subject: [PATCH 08/50] Removed silly printf hack and used proper facilities. --- input/drivers/udev_input.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/input/drivers/udev_input.c b/input/drivers/udev_input.c index e29234d53ffb..ac255f7d6760 100644 --- a/input/drivers/udev_input.c +++ b/input/drivers/udev_input.c @@ -100,7 +100,8 @@ /*#define UDEV_TOUCH_DEEP_DEBUG*/ /* TODO - Temporary debugging using direct printf */ -#ifdef UDEV_TOUCH_PRINTF_DEBUG +#include +#if 0 #define RARCH_ERR(...) do{ \ printf("[ERR]" __VA_ARGS__); \ } while (0) @@ -116,7 +117,6 @@ #define RARCH_DBG(...) do{ \ printf("[DBG]" __VA_ARGS__); \ } while (0) -#endif /* UDEV_TOUCH_PRINTF_DEBUG */ #ifdef UDEV_TOUCH_DEEP_DEBUG @@ -126,6 +126,9 @@ #else #define RARCH_DDBG(msg, ...) #endif + +#endif +#define RARCH_DDBG RARCH_DBG /* UDEV_TOUCH_DEEP_DEBUG */ /* Helper macro for declaring things as unused - use sparingly. */ From 7dc3bdbb1aa5577ceff45c72a5a7e70b12971ed7 Mon Sep 17 00:00:00 2001 From: oshaboy Date: Sat, 3 Feb 2024 17:09:00 +0200 Subject: [PATCH 09/50] Menu Stuff --- config.def.h | 9 ++++ configuration.c | 17 ++++++++ configuration.h | 3 ++ intl/msg_hash_lbl.h | 12 +++++ intl/msg_hash_us.h | 20 +++++++++ menu/cbs/menu_cbs_sublabel.c | 8 ++++ menu/menu_displaylist.c | 2 + menu/menu_setting.c | 85 ++++++++++++++++++++++++++++++++++++ msg_hash.h | 5 +++ 9 files changed, 161 insertions(+) diff --git a/config.def.h b/config.def.h index 449a5b603ab4..cb0ec8aa1466 100644 --- a/config.def.h +++ b/config.def.h @@ -1515,6 +1515,15 @@ #define DEFAULT_AXIS_THRESHOLD 0.5f #define DEFAULT_ANALOG_DEADZONE 0.0f #define DEFAULT_ANALOG_SENSITIVITY 1.0f +#define DEFAULT_SENSOR_ACCELEROMETER_SENSITIVITY 1.0f +#define DEFAULT_SENSOR_GYROSCOPE_SENSITIVITY 1.0f +#define DEFAULT_SENSOR_AXIS_ACCELEROMETER_X 0 +#define DEFAULT_SENSOR_AXIS_ACCELEROMETER_Y 1 +#define DEFAULT_SENSOR_AXIS_ACCELEROMETER_Z 2 +#define DEFAULT_SENSOR_AXIS_GYROSCOPE_X 3 +#define DEFAULT_SENSOR_AXIS_GYROSCOPE_Y 4 +#define DEFAULT_SENSOR_AXIS_GYROSCOPE_Z 5 + /* Describes speed of which turbo-enabled buttons toggle. */ #define DEFAULT_TURBO_PERIOD 6 diff --git a/configuration.c b/configuration.c index 15c163bdc128..ba6fc814a62f 100644 --- a/configuration.c +++ b/configuration.c @@ -2232,6 +2232,8 @@ static struct config_float_setting *populate_settings_float( SETTING_FLOAT("input_axis_threshold", &settings->floats.input_axis_threshold, true, DEFAULT_AXIS_THRESHOLD, false); SETTING_FLOAT("input_analog_deadzone", &settings->floats.input_analog_deadzone, true, DEFAULT_ANALOG_DEADZONE, false); SETTING_FLOAT("input_analog_sensitivity", &settings->floats.input_analog_sensitivity, true, DEFAULT_ANALOG_SENSITIVITY, false); + SETTING_FLOAT("input_sensor_accelerometer_sensitivity", &settings->floats.input_sensor_accelerometer_sensitivity, true, DEFAULT_SENSOR_ACCELEROMETER_SENSITIVITY, false); + SETTING_FLOAT("input_sensor_gyroscope_sensitivity", &settings->floats.input_sensor_gyroscope_sensitivity, true, DEFAULT_SENSOR_GYROSCOPE_SENSITIVITY, false); #ifdef HAVE_OVERLAY SETTING_FLOAT("input_overlay_opacity", &settings->floats.input_overlay_opacity, true, DEFAULT_INPUT_OVERLAY_OPACITY, false); SETTING_FLOAT("input_osk_overlay_opacity", &settings->floats.input_osk_overlay_opacity, true, DEFAULT_INPUT_OVERLAY_OPACITY, false); @@ -2884,6 +2886,7 @@ void config_set_defaults(void *data) #endif input_config_set_device((unsigned)i, RETRO_DEVICE_JOYPAD); settings->uints.input_mouse_index[i] = (unsigned)i; + settings->uints.input_sensor_index[i] = (unsigned)i; } custom_vp->width = 0; @@ -3688,6 +3691,9 @@ static bool config_load_file(global_t *global, _len2 = strlcpy(buf, prefix, sizeof(buf)); + strlcpy(buf + _len2, "_sensor_index", sizeof(buf) - _len2); + CONFIG_GET_INT_BASE(conf, settings, uints.input_sensor_index[i], buf); + strlcpy(buf + _len2, "_mouse_index", sizeof(buf) - _len2); CONFIG_GET_INT_BASE(conf, settings, uints.input_mouse_index[i], buf); @@ -5182,6 +5188,9 @@ bool config_save_file(const char *path) _len = strlcpy(cfg, "input_player", sizeof(cfg)); _len += strlcpy(cfg + _len, formatted_number, sizeof(cfg) - _len); + + strlcpy(cfg + _len, "_sensor_index", sizeof(cfg) - _len); + config_set_int(conf, cfg, settings->uints.input_sensor_index[i]); strlcpy(cfg + _len, "_mouse_index", sizeof(cfg) - _len); config_set_int(conf, cfg, settings->uints.input_mouse_index[i]); @@ -5501,6 +5510,14 @@ int8_t config_save_overrides(enum override_type type, _len = strlcpy(cfg, "input_player", sizeof(cfg)); _len += strlcpy(cfg + _len, formatted_number, sizeof(cfg) - _len); + if (settings->uints.input_sensor_index[i] + != overrides->uints.input_sensor_index[i]) + { + strlcpy(cfg + _len, "_sensor_index", sizeof(cfg) - _len); + config_set_int(conf, cfg, overrides->uints.input_sensor_index[i]); + RARCH_DBG("[Overrides]: %s = \"%u\"\n", cfg, overrides->uints.input_sensor_index[i]); + } + if (settings->uints.input_mouse_index[i] != overrides->uints.input_mouse_index[i]) { diff --git a/configuration.h b/configuration.h index 2ecc2556f026..02aecfd27aa3 100644 --- a/configuration.h +++ b/configuration.h @@ -145,6 +145,7 @@ typedef struct settings unsigned input_joypad_index[MAX_USERS]; unsigned input_device[MAX_USERS]; unsigned input_mouse_index[MAX_USERS]; + unsigned input_sensor_index[MAX_USERS]; unsigned input_libretro_device[MAX_USERS]; unsigned input_analog_dpad_mode[MAX_USERS]; @@ -422,6 +423,8 @@ typedef struct settings float input_analog_deadzone; float input_axis_threshold; float input_analog_sensitivity; + float input_sensor_accelerometer_sensitivity; + float input_sensor_gyroscope_sensitivity; #ifdef _3DS float bottom_font_scale; #endif diff --git a/intl/msg_hash_lbl.h b/intl/msg_hash_lbl.h index 364eda6228bc..fbb1d6391ce1 100644 --- a/intl/msg_hash_lbl.h +++ b/intl/msg_hash_lbl.h @@ -1867,6 +1867,14 @@ MSG_HASH( MENU_ENUM_LABEL_INPUT_ANALOG_SENSITIVITY, "input_analog_sensitivity" ) +MSG_HASH( + MENU_ENUM_LABEL_INPUT_SENSOR_ACCELEROMETER_SENSITIVITY, + "input_sensor_accelerometer_sensitivity" + ) +MSG_HASH( + MENU_ENUM_LABEL_INPUT_SENSOR_GYROSCOPE_SENSITIVITY, + "input_sensor_gyroscope_sensitivity" + ) #ifdef GEKKO MSG_HASH( MENU_ENUM_LABEL_INPUT_MOUSE_SCALE, @@ -1971,6 +1979,10 @@ MSG_HASH( MENU_ENUM_LABEL_INPUT_MOUSE_INDEX, "input_player%u_mouse_index" ) +MSG_HASH( + MENU_ENUM_LABEL_INPUT_SENSOR_INDEX, + "input_player%u_sensor_index" + ) MSG_HASH( MENU_ENUM_LABEL_INPUT_REMAP_PORT, "input_remap_port_p%u" diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index e7237165cac7..01ed7f413ace 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -3275,10 +3275,26 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_SENSITIVITY, "Analog Sensitivity" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_ACCELEROMETER_SENSITIVITY, + "Accelerometer Sensitivity" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_GYROSCOPE_SENSITIVITY, + "Gyroscope Sensitivity" + ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_ANALOG_SENSITIVITY, "Adjust the sensitivity of analog sticks." ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_SENSOR_ACCELEROMETER_SENSITIVITY, + "Adjust the sensitivity of the Accelerometer." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_SENSOR_GYROSCOPE_SENSITIVITY, + "Adjust the sensitivity of the Gyroscope." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_BIND_TIMEOUT, "Bind Timeout" @@ -4049,6 +4065,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_INDEX, "Mouse Index" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_INDEX, + "Sensor Index" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_B, "B Button (Down)" diff --git a/menu/cbs/menu_cbs_sublabel.c b/menu/cbs/menu_cbs_sublabel.c index dd5d6805458d..dad0a0a50412 100644 --- a/menu/cbs/menu_cbs_sublabel.c +++ b/menu/cbs/menu_cbs_sublabel.c @@ -551,6 +551,8 @@ DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_input_touch_vmouse_gesture, MENU_ DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_button_axis_threshold, MENU_ENUM_SUBLABEL_INPUT_BUTTON_AXIS_THRESHOLD) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_analog_deadzone, MENU_ENUM_SUBLABEL_INPUT_ANALOG_DEADZONE) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_analog_sensitivity, MENU_ENUM_SUBLABEL_INPUT_ANALOG_SENSITIVITY) +DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_sensor_accelerometer_sensitivity, MENU_ENUM_SUBLABEL_INPUT_SENSOR_ACCELEROMETER_SENSITIVITY) +DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_sensor_gyroscope_sensitivity, MENU_ENUM_SUBLABEL_INPUT_SENSOR_GYROSCOPE_SENSITIVITY) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_input_turbo_period, MENU_ENUM_SUBLABEL_INPUT_TURBO_PERIOD) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_input_duty_cycle, MENU_ENUM_SUBLABEL_INPUT_DUTY_CYCLE) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_input_turbo_mode, MENU_ENUM_SUBLABEL_INPUT_TURBO_MODE) @@ -4484,6 +4486,12 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_INPUT_ANALOG_SENSITIVITY: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_analog_sensitivity); break; + case MENU_ENUM_LABEL_INPUT_SENSOR_ACCELEROMETER_SENSITIVITY: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_sensor_accelerometer_sensitivity); + break; + case MENU_ENUM_LABEL_INPUT_SENSOR_GYROSCOPE_SENSITIVITY: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_sensor_gyroscope_sensitivity); + break; #if defined(GEKKO) case MENU_ENUM_LABEL_INPUT_MOUSE_SCALE: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_input_mouse_scale); diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index 9f4500e570b0..06668c9100c8 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -7687,6 +7687,8 @@ unsigned menu_displaylist_build_list( {MENU_ENUM_LABEL_INPUT_BUTTON_AXIS_THRESHOLD, PARSE_ONLY_FLOAT, true }, {MENU_ENUM_LABEL_INPUT_ANALOG_DEADZONE, PARSE_ONLY_FLOAT, true }, {MENU_ENUM_LABEL_INPUT_ANALOG_SENSITIVITY, PARSE_ONLY_FLOAT, true }, + {MENU_ENUM_LABEL_INPUT_SENSOR_ACCELEROMETER_SENSITIVITY, PARSE_ONLY_FLOAT, true }, + {MENU_ENUM_LABEL_INPUT_SENSOR_GYROSCOPE_SENSITIVITY, PARSE_ONLY_FLOAT, true }, #if defined(GEKKO) {MENU_ENUM_LABEL_INPUT_MOUSE_SCALE, PARSE_ONLY_UINT, true }, #endif diff --git a/menu/menu_setting.c b/menu/menu_setting.c index 407ffccbbfb2..0f96ca47c1fb 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -7680,6 +7680,7 @@ static int setting_action_start_input_mouse_index(rarch_setting_t *setting) return 0; } + /** ******* ACTION TOGGLE CALLBACK FUNCTIONS ******* **/ @@ -7929,7 +7930,37 @@ static void get_string_representation_input_mouse_index( if (string_is_empty(s)) strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_DISABLED), len); } +static void get_string_representation_input_sensor_index( + rarch_setting_t *setting, char *s, size_t len) +{ + settings_t *settings = config_get_ptr(); + unsigned map = 0; + + if (!setting || !settings) + return; + map = settings->uints.input_sensor_index[setting->index_offset]; + + if (map < MAX_INPUT_DEVICES) + { + const char *device_name = input_config_get_sensor_display_name(map); + + if (!string_is_empty(device_name)) + strlcpy(s, device_name, len); + else if (map > 0) + { + size_t _len = strlcpy(s, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NOT_AVAILABLE), + len); + snprintf(s + _len, len - _len, " (#%u)", map + 1); + } + else + strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_DONT_CARE), len); + } + + if (string_is_empty(s)) + strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_DISABLED), len); +} static void read_handler_audio_rate_control_delta(rarch_setting_t *setting) { settings_t *settings = config_get_ptr(); @@ -9189,6 +9220,7 @@ static bool setting_append_list_input_player_options( static char device_index[MAX_USERS][64]; static char mouse_index[MAX_USERS][64]; + static char sensor_index[MAX_USERS][64]; static char analog_to_digital[MAX_USERS][64]; static char bind_all[MAX_USERS][64]; static char bind_all_save_autoconfig[MAX_USERS][64]; @@ -9196,6 +9228,7 @@ static bool setting_append_list_input_player_options( static char label_device_index[MAX_USERS][64]; static char label_mouse_index[MAX_USERS][64]; + static char label_sensor_index[MAX_USERS][64]; static char label_analog_to_digital[MAX_USERS][64]; static char label_bind_all[MAX_USERS][64]; static char label_bind_all_save_autoconfig[MAX_USERS][64]; @@ -9214,6 +9247,8 @@ static bool setting_append_list_input_player_options( sizeof(device_index[user])); fill_pathname_join_delim(mouse_index[user], tmp_string, "mouse_index", '_', sizeof(mouse_index[user])); + fill_pathname_join_delim(sensor_index[user], tmp_string, "sensor_index", '_', + sizeof(sensor_index[user])); fill_pathname_join_delim(bind_all[user], tmp_string, "bind_all", '_', sizeof(bind_all[user])); fill_pathname_join_delim(bind_all_save_autoconfig[user], @@ -9232,6 +9267,9 @@ static bool setting_append_list_input_player_options( strlcpy(label_mouse_index[user], msg_hash_to_str(MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_INDEX), sizeof(label_mouse_index[user])); + strlcpy(label_sensor_index[user], + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_INDEX), + sizeof(label_sensor_index[user])); strlcpy(label_bind_all[user], msg_hash_to_str(MENU_ENUM_LABEL_VALUE_INPUT_BIND_ALL), sizeof(label_bind_all[user])); @@ -9345,6 +9383,23 @@ static bool setting_append_list_input_player_options( menu_settings_list_current_add_range(list, list_info, 0, MAX_INPUT_DEVICES - 1, 1.0, true, true); MENU_SETTINGS_LIST_CURRENT_ADD_ENUM_IDX_PTR(list, list_info, (enum msg_hash_enums)(MENU_ENUM_LABEL_INPUT_MOUSE_INDEX + user)); + CONFIG_UINT_ALT( + list, list_info, + &settings->uints.input_sensor_index[user], + sensor_index[user], + label_sensor_index[user], + user, + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler); + (*list)[list_info->index - 1].get_string_representation = + &get_string_representation_input_sensor_index; + menu_settings_list_current_add_range(list, list_info, 0, MAX_INPUT_DEVICES - 1, 1.0, true, true); + + MENU_SETTINGS_LIST_CURRENT_ADD_ENUM_IDX_PTR(list, list_info, + (enum msg_hash_enums)(MENU_ENUM_LABEL_INPUT_SENSOR_INDEX + user)); CONFIG_ACTION_ALT( list, list_info, @@ -15240,6 +15295,36 @@ static bool setting_append_list( (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint; menu_settings_list_current_add_range(list, list_info, -5.0, 5.0, 0.1, true, true); + CONFIG_FLOAT( + list, list_info, + &settings->floats.input_sensor_accelerometer_sensitivity, + MENU_ENUM_LABEL_INPUT_SENSOR_ACCELEROMETER_SENSITIVITY, + MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_ACCELEROMETER_SENSITIVITY, + DEFAULT_SENSOR_ACCELEROMETER_SENSITIVITY, + "%.1f", + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler); + (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint; + menu_settings_list_current_add_range(list, list_info, -5.0, 5.0, 0.1, true, true); + + CONFIG_FLOAT( + list, list_info, + &settings->floats.input_sensor_gyroscope_sensitivity, + MENU_ENUM_LABEL_INPUT_SENSOR_GYROSCOPE_SENSITIVITY, + MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_GYROSCOPE_SENSITIVITY, + DEFAULT_SENSOR_GYROSCOPE_SENSITIVITY, + "%.1f", + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler); + (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint; + menu_settings_list_current_add_range(list, list_info, -5.0, 5.0, 0.1, true, true); + CONFIG_UINT( list, list_info, &settings->uints.input_bind_timeout, diff --git a/msg_hash.h b/msg_hash.h index b56852f32221..d025d8a71735 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -868,6 +868,8 @@ enum msg_hash_enums MENU_ENUM_LABEL_INPUT_DEVICE_INDEX_LAST = MENU_ENUM_LABEL_INPUT_DEVICE_INDEX + MAX_USERS, MENU_ENUM_LABEL_INPUT_MOUSE_INDEX, MENU_ENUM_LABEL_INPUT_MOUSE_INDEX_LAST = MENU_ENUM_LABEL_INPUT_MOUSE_INDEX + MAX_USERS, + MENU_ENUM_LABEL_INPUT_SENSOR_INDEX, + MENU_ENUM_LABEL_INPUT_SENSOR_INDEX_LAST = MENU_ENUM_LABEL_INPUT_SENSOR_INDEX + MAX_USERS, MENU_ENUM_LABEL_INPUT_REMAP_PORT, MENU_ENUM_LABEL_INPUT_REMAP_PORT_LAST = MENU_ENUM_LABEL_INPUT_REMAP_PORT + MAX_USERS, @@ -1148,6 +1150,7 @@ enum msg_hash_enums MENU_ENUM_LABEL_VALUE_INPUT_BIND_DEFAULT_ALL, MENU_ENUM_LABEL_VALUE_INPUT_SAVE_AUTOCONFIG, MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_INDEX, + MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_INDEX, MENU_ENUM_LABEL_VALUE_INPUT_REMAP_PORT, MENU_ENUM_SUBLABEL_INPUT_DEVICE_TYPE, @@ -1257,6 +1260,8 @@ enum msg_hash_enums MENU_LABEL(INPUT_TOUCH_SCALE), MENU_LABEL(INPUT_ANALOG_DEADZONE), MENU_LABEL(INPUT_ANALOG_SENSITIVITY), + MENU_LABEL(INPUT_SENSOR_ACCELEROMETER_SENSITIVITY), + MENU_LABEL(INPUT_SENSOR_GYROSCOPE_SENSITIVITY), MENU_LABEL(INPUT_BIND_TIMEOUT), MENU_LABEL(INPUT_BIND_HOLD), MENU_LABEL(INPUT_REMAP_BINDS_ENABLE), From 91613a47b378422483b3a824a9c225132ed58438 Mon Sep 17 00:00:00 2001 From: oshaboy Date: Sat, 3 Feb 2024 17:36:44 +0200 Subject: [PATCH 10/50] I forgot a few files. --- input/drivers/udev_input.c | 6 +++++- input/input_driver.c | 22 +++++++++++++++++++++- input/input_driver.h | 5 ++++- 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/input/drivers/udev_input.c b/input/drivers/udev_input.c index ac255f7d6760..b898d28b8c22 100644 --- a/input/drivers/udev_input.c +++ b/input/drivers/udev_input.c @@ -3579,6 +3579,7 @@ static void udev_input_handle_hotplug(udev_input_t *udev) for (i = 0; i < MAX_USERS; i++) { input_config_set_mouse_display_name(i, "N/A"); + input_config_set_sensor_display_name(i, "N/A"); udev->pointers[i] = -1; udev->keyboards[i] = -1; } @@ -3588,7 +3589,9 @@ static void udev_input_handle_hotplug(udev_input_t *udev) { udev_input_device_t * cur_device=udev->devices[i]; do { - if (cur_device->type == UDEV_INPUT_SENSOR); + if (cur_device->type == UDEV_INPUT_SENSOR){ + input_config_set_sensor_display_name(mouse, cur_device->ident); + } else if (cur_device->type != UDEV_INPUT_KEYBOARD) { /* Pointers */ @@ -4330,6 +4333,7 @@ static void *udev_input_init(const char *joypad_driver) RARCH_LOG("[udev]: Sensor: \"%s\" %s.\n", curdevice->ident, curdevice->devnode); + input_config_set_sensor_display_name(mouse, curdevice->ident); } else if (curdevice->type != UDEV_INPUT_KEYBOARD) { diff --git a/input/input_driver.c b/input/input_driver.c index 74d9e74bb82b..ae518984a25a 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -4239,7 +4239,13 @@ const char *input_config_get_mouse_display_name(unsigned port) return NULL; return input_st->input_mouse_info[port].display_name; } - +const char *input_config_get_sensor_display_name(unsigned port) +{ + input_driver_state_t *input_st = &input_driver_st; + if (string_is_empty(input_st->input_sensor_info[port].display_name)) + return NULL; + return input_st->input_sensor_info[port].display_name; +} void input_config_set_mouse_display_name(unsigned port, const char *name) { char name_ascii[NAME_MAX_LENGTH]; @@ -4255,7 +4261,21 @@ void input_config_set_mouse_display_name(unsigned port, const char *name) strlcpy(input_st->input_mouse_info[port].display_name, name_ascii, sizeof(input_st->input_mouse_info[port].display_name)); } +void input_config_set_sensor_display_name(unsigned port, const char *name) +{ + char name_ascii[NAME_MAX_LENGTH]; + input_driver_state_t *input_st = &input_driver_st; + name_ascii[0] = '\0'; + + /* Strip non-ASCII characters */ + if (!string_is_empty(name)) + string_copy_only_ascii(name_ascii, name); + + if (!string_is_empty(name_ascii)) + strlcpy(input_st->input_sensor_info[port].display_name, name_ascii, + sizeof(input_st->input_sensor_info[port].display_name)); +} void input_keyboard_mapping_bits(unsigned mode, unsigned key) { input_driver_state_t *input_st = &input_driver_st; diff --git a/input/input_driver.h b/input/input_driver.h index 6fa75a3b353f..34efae58fcca 100644 --- a/input/input_driver.h +++ b/input/input_driver.h @@ -282,7 +282,7 @@ typedef struct { char display_name[256]; } input_mouse_info_t; - +typedef input_mouse_info_t input_sensor_info_t; typedef struct input_remote input_remote_t; typedef struct input_remote_state @@ -540,6 +540,7 @@ typedef struct input_mapper_t mapper; /* uint32_t alignment */ input_device_info_t input_device_info[MAX_INPUT_DEVICES]; /* unsigned alignment */ input_mouse_info_t input_mouse_info[MAX_INPUT_DEVICES]; + input_sensor_info_t input_sensor_info[MAX_INPUT_DEVICES]; unsigned old_analog_dpad_mode[MAX_USERS]; unsigned old_libretro_device[MAX_USERS]; unsigned osk_last_codepoint; @@ -743,6 +744,7 @@ void input_config_set_device_name(unsigned port, const char *name); */ void input_config_set_device_display_name(unsigned port, const char *name); void input_config_set_mouse_display_name(unsigned port, const char *name); +void input_config_set_sensor_display_name(unsigned port, const char *name); /** * Set the configuration name for the device in the specified port @@ -830,6 +832,7 @@ unsigned input_config_get_device(unsigned port); const char *input_config_get_device_name(unsigned port); const char *input_config_get_device_display_name(unsigned port); const char *input_config_get_mouse_display_name(unsigned port); +const char *input_config_get_sensor_display_name(unsigned port); const char *input_config_get_device_config_name(unsigned port); const char *input_config_get_device_joypad_driver(unsigned port); From ac21e7d2fc90a92acea9dc55b15ca2133f1ee936 Mon Sep 17 00:00:00 2001 From: oshaboy Date: Sat, 3 Feb 2024 19:01:01 +0200 Subject: [PATCH 11/50] Moved sensitivity adjustment to some other function --- input/drivers/udev_input.c | 7 ++---- input/input_driver.c | 44 ++++++++++++++++++++++---------------- 2 files changed, 28 insertions(+), 23 deletions(-) diff --git a/input/drivers/udev_input.c b/input/drivers/udev_input.c index b898d28b8c22..1258c9b6f02d 100644 --- a/input/drivers/udev_input.c +++ b/input/drivers/udev_input.c @@ -4416,7 +4416,6 @@ static float udev_input_get_sensor_input(void *data, unsigned port, unsigned id) const udev_input_t *udev = (const udev_input_t *)data; const udev_input_device_t * device; const udev_input_sensor_t * sensor; - const float sensitivity=8.f; /*Hardcode for now*/ float sensor_value; udev_input_sensor_limits_t limits; if (udev->devices == NULL) return 0.f; @@ -4449,15 +4448,13 @@ static float udev_input_get_sensor_input(void *data, unsigned port, unsigned id) sensor_value, limits.min, limits.max, - (((sensor_value-limits.min)/(limits.max-limits.min))-0.5f)*2.f*sensitivity + (((sensor_value-limits.min)/(limits.max-limits.min))-0.5f)*2.f ); return ( /*clamp it to the 0 to 1 range*/ ((sensor_value-limits.min)/(limits.max-limits.min)) /*convert to the -1 to 1 range*/ - -0.5f)*2.f - /*multiply by sensitivity adjustment*/ - *sensitivity; + -0.5f)*2.f; } diff --git a/input/input_driver.c b/input/input_driver.c index ae518984a25a..91c0d81fedf4 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -3772,8 +3772,15 @@ float input_get_sensor_state(unsigned port, unsigned id) { settings_t *settings = config_get_ptr(); bool input_sensors_enable = settings->bools.input_sensors_enable; - - return input_driver_get_sensor(port, input_sensors_enable, id); + float sensitivity; + + if (id >= RETRO_SENSOR_ACCELEROMETER_X && id <= RETRO_SENSOR_ACCELEROMETER_Z) + sensitivity=settings->floats.input_sensor_accelerometer_sensitivity; + else if (id >= RETRO_SENSOR_GYROSCOPE_X && id <= RETRO_SENSOR_GYROSCOPE_Z) + sensitivity=settings->floats.input_sensor_gyroscope_sensitivity; + else + sensitivity=1.f; + return input_driver_get_sensor(port, input_sensors_enable, id)*sensitivity; } /** @@ -4246,35 +4253,36 @@ const char *input_config_get_sensor_display_name(unsigned port) return NULL; return input_st->input_sensor_info[port].display_name; } -void input_config_set_mouse_display_name(unsigned port, const char *name) +enum aux_device_type{ + MOUSE_AUX_DEVICE, + SENSOR_AUX_DEVICE +}; +static void input_config_set_auxiliary_device_display_name(unsigned port, const char *name, enum aux_device_type aux_device_type) { char name_ascii[NAME_MAX_LENGTH]; input_driver_state_t *input_st = &input_driver_st; + input_mouse_info_t * aux_device_info; name_ascii[0] = '\0'; /* Strip non-ASCII characters */ if (!string_is_empty(name)) string_copy_only_ascii(name_ascii, name); - + if (aux_device_type == SENSOR_AUX_DEVICE) + aux_device_info=&input_st->input_sensor_info[port]; + else /*(aux_device_type == MOUSE_AUX_DEVICE)*/ + aux_device_info=&input_st->input_mouse_info[port]; if (!string_is_empty(name_ascii)) - strlcpy(input_st->input_mouse_info[port].display_name, name_ascii, - sizeof(input_st->input_mouse_info[port].display_name)); + strlcpy(aux_device_info->display_name, name_ascii, + sizeof(aux_device_info->display_name)); } void input_config_set_sensor_display_name(unsigned port, const char *name) { - char name_ascii[NAME_MAX_LENGTH]; - input_driver_state_t *input_st = &input_driver_st; - - name_ascii[0] = '\0'; - - /* Strip non-ASCII characters */ - if (!string_is_empty(name)) - string_copy_only_ascii(name_ascii, name); - - if (!string_is_empty(name_ascii)) - strlcpy(input_st->input_sensor_info[port].display_name, name_ascii, - sizeof(input_st->input_sensor_info[port].display_name)); + input_config_set_auxiliary_device_display_name(port, name, SENSOR_AUX_DEVICE); +} +void input_config_set_mouse_display_name(unsigned port, const char *name) +{ + input_config_set_auxiliary_device_display_name(port, name, MOUSE_AUX_DEVICE); } void input_keyboard_mapping_bits(unsigned mode, unsigned key) { From 17a87f15c4a54f4b5e36e54cfb641e7eff3025e9 Mon Sep 17 00:00:00 2001 From: oshaboy Date: Sun, 4 Feb 2024 00:05:02 +0200 Subject: [PATCH 12/50] Various Cleanup Sensitivity settings and Sensor Retropad selection implemented including menu options --- Makefile.common | 1 - input/drivers/udev_input.c | 357 +++++++++++++++++-------------------- input/input_driver.c | 2 +- menu/menu_setting.c | 4 +- 4 files changed, 165 insertions(+), 199 deletions(-) diff --git a/Makefile.common b/Makefile.common index 4212c5c6a427..4a872356bd00 100644 --- a/Makefile.common +++ b/Makefile.common @@ -1329,7 +1329,6 @@ ifeq ($(HAVE_DBUS), 1) endif ifeq ($(HAVE_UDEV), 1) - DEFINES += -DUDEV_TOUCH_SUPPORT DEF_FLAGS += $(UDEV_CFLAGS) LIBS += $(UDEV_LIBS) OBJ += input/drivers/udev_input.o \ diff --git a/input/drivers/udev_input.c b/input/drivers/udev_input.c index 1258c9b6f02d..45a6af7dbd90 100644 --- a/input/drivers/udev_input.c +++ b/input/drivers/udev_input.c @@ -210,7 +210,12 @@ enum udev_input_dev_type UDEV_INPUT_TOUCHSCREEN, UDEV_INPUT_SENSOR }; - +static bool udev_is_mouse(enum udev_input_dev_type type){ + return ( + (type == UDEV_INPUT_MOUSE) || + (type == UDEV_INPUT_TOUCHPAD) || + (type == UDEV_INPUT_TOUCHSCREEN)); +} /* NOTE: must be in sync with enum udev_input_dev_type */ static const char *g_dev_type_str[] = { @@ -237,11 +242,33 @@ typedef struct } udev_input_mouse_t; enum udev_sensor_type { - UDEV_SENSOR_ACCELEROMETER, UDEV_SENSOR_GYROSCOPE, UDEV_SENSOR_SIXAXIS }; + +/** + * Definition of feature limits. + */ +typedef struct +{ + /* Range of values supported by this feature: */ + int32_t min; + int32_t max; + int32_t range; + + /* Optional, but could be useful later: */ + /* Fuzz value used to filter noise from event stream. */ + int32_t fuzz; + /* Values within this value will be discarded and reported as 0 */ + int32_t flat; + /* Resolution for the reported values. */ + int32_t resolution; + /* Is this feature enabled? */ + bool enabled; +} udev_input_limits_t; +typedef udev_input_limits_t udev_input_sensor_limits_t; +typedef udev_input_limits_t udev_input_touch_limits_t; #ifdef UDEV_TOUCH_SUPPORT /** @@ -301,26 +328,7 @@ typedef enum UDEV_TOUCH_MGEST_LAST } udev_input_touch_mgest_type; -/** - * Definition of feature limits. - */ -typedef struct -{ - /* Range of values supported by this feature: */ - int32_t min; - int32_t max; - int32_t range; - /* Optional, but could be useful later: */ - /* Fuzz value used to filter noise from event stream. */ - int32_t fuzz; - /* Values within this value will be discarded and reported as 0 */ - int32_t flat; - /* Resolution for the reported values. */ - int32_t resolution; - /* Is this feature enabled? */ - bool enabled; -} udev_input_touch_limits_t; /** * Helper structure for representing the time of a touch event. */ @@ -538,7 +546,7 @@ typedef struct /* UDEV_TOUCH_SUPPORT */ -typedef udev_input_touch_limits_t udev_input_sensor_limits_t; + typedef struct { union { @@ -582,7 +590,6 @@ typedef struct udev_input_device } _mouse; udev_input_sensor_t _sensor; } _u; - struct udev_input_device *aggregate_with; enum udev_input_dev_type type; /* Type of this device */ char devnode[NAME_MAX_LENGTH]; /* Device node path */ char ident[255]; /* Identifier of the device */ @@ -605,6 +612,8 @@ typedef struct udev_input int32_t keyboards[MAX_INPUT_DEVICES]; /* Indices of pointers in the devices array. Negative values are invalid. */ int32_t pointers[MAX_INPUT_DEVICES]; + /* Indices of sensors in the devices array. Negative values are invalid. */ + int32_t sensors[MAX_INPUT_DEVICES]; int fd; /* OS pointer coords (zeros if we don't have X11) */ @@ -721,27 +730,61 @@ static void udev_input_kb_free(struct udev_input *udev) #endif } -static udev_input_mouse_t *udev_get_mouse( +static udev_input_device_t *udev_get_pointer_device( struct udev_input *udev, unsigned port) { - unsigned i; unsigned mouse_index = 0; int dev_index = -1; settings_t *settings = config_get_ptr(); - udev_input_mouse_t *mouse = NULL; + if (port >= MAX_USERS || !video_driver_has_focus()) return NULL; - mouse_index = settings->uints.input_mouse_index[port]; if (mouse_index < MAX_INPUT_DEVICES) - dev_index = udev->pointers[mouse_index]; + dev_index = udev->pointers[mouse_index]; if (dev_index < 0) - return NULL; - else - return &udev->devices[dev_index]->MOUSE; + return NULL; + + + else if (udev_is_mouse(udev->devices[dev_index]->type)) + return udev->devices[dev_index]; + else return NULL; } +static udev_input_device_t *udev_get_sensor_device( + const struct udev_input *udev, unsigned port) +{ + unsigned sensor_index = 0; + int dev_index = -1; + settings_t *settings = config_get_ptr(); + + if (port >= MAX_USERS || !video_driver_has_focus()) + return NULL; + + sensor_index = settings->uints.input_sensor_index[port]; + if (sensor_index < MAX_INPUT_DEVICES) + dev_index = udev->sensors[sensor_index]; + if (dev_index < 0) + return NULL; + else if(udev->devices[dev_index]->type == UDEV_INPUT_SENSOR) + return udev->devices[dev_index]; + else return NULL; +} +static udev_input_sensor_t *udev_get_sensor( + const struct udev_input *udev, unsigned port) +{ + udev_input_device_t *input_device=udev_get_sensor_device(udev,port); + if (input_device) return &input_device->SENSOR; + else return NULL; +} +static udev_input_mouse_t *udev_get_pointer( + const struct udev_input *udev, unsigned port) +{ + udev_input_device_t *input_device=udev_get_pointer_device(udev,port); + if (input_device) return &input_device->MOUSE; + else return NULL; +} static void udev_mouse_set_x(udev_input_mouse_t *mouse, int32_t x, bool abs) { video_viewport_t vp; @@ -995,7 +1038,17 @@ static void udev_handle_mouse(void *data, break; } } - +static void udev_set_limits_from(struct input_absinfo *info, + udev_input_touch_limits_t *limits) +{ + limits->enabled = true; + limits->min = info->minimum; + limits->max = info->maximum; + limits->range = limits->max - limits->min + 1; + limits->fuzz = info->fuzz; + limits->flat = info->flat; + limits->resolution = info->resolution; +} #ifdef UDEV_TOUCH_SUPPORT /** @@ -1187,32 +1240,6 @@ static void udev_touch_ts_print(const udev_touch_ts_t *ts) RARCH_DBG("%u,%u", ts->s, ts->us); } -/** - * Get pointer device for given port. - * - * @param udev UDev system to search. - * @param port Target port. - */ -static udev_input_device_t *udev_get_pointer_port_dev( - struct udev_input *udev, unsigned port) -{ - uint16_t i; - uint16_t pointer_index = 0; - int16_t dev_index = -1; - settings_t *settings = config_get_ptr(); - udev_input_mouse_t *mouse = NULL; - - if (port >= MAX_USERS || !video_driver_has_focus()) - return NULL; - - pointer_index = settings->uints.input_mouse_index[port]; - if (pointer_index < MAX_INPUT_DEVICES) - dev_index = udev->pointers[pointer_index]; - if (dev_index < 0) - return NULL; - return udev->devices[dev_index]; -} - /** * Dump information about the given absinfo structure. * @@ -1383,23 +1410,7 @@ static void udev_dump_touch_device_slots(const char *indent, const udev_input_to RARCH_DBG("[udev] %s}\n", indent); } -/** - * Set touch limits from given absinfo structure. - * - * @param info Input info structure. - * @param limits Target limits structure. - */ -static void udev_touch_set_limits_from(struct input_absinfo *info, - udev_input_touch_limits_t *limits) -{ - limits->enabled = true; - limits->min = info->minimum; - limits->max = info->maximum; - limits->range = limits->max - limits->min + 1; - limits->fuzz = info->fuzz; - limits->flat = info->flat; - limits->resolution = info->resolution; -} + /** * Dump information about the provided device. Works even @@ -1577,7 +1588,7 @@ static void udev_init_touch_dev(udev_input_device_t *dev) touch->info_slots.enabled = false; } else - udev_touch_set_limits_from(&abs_info, &touch->info_slots); + udev_set_limits_from(&abs_info, &touch->info_slots); /* Single-touch devices use ABS_X/Y, Multi-touch use ABS_MT_POSITION_X/Y */ if (abs_info.maximum == 0) @@ -1603,7 +1614,7 @@ static void udev_init_touch_dev(udev_input_device_t *dev) touch->info_x_limits.enabled = false; } else - udev_touch_set_limits_from(&abs_info, &touch->info_x_limits); + udev_set_limits_from(&abs_info, &touch->info_x_limits); /* Get y-axis limits */ ret = ioctl(dev->fd, yreq, &abs_info); @@ -1614,7 +1625,7 @@ static void udev_init_touch_dev(udev_input_device_t *dev) touch->info_y_limits.enabled = false; } else - udev_touch_set_limits_from(&abs_info, &touch->info_y_limits); + udev_set_limits_from(&abs_info, &touch->info_y_limits); /* Get major axis limits - i.e. primary radius of the touch */ ret = ioctl(dev->fd, EVIOCGABS(ABS_MT_TOUCH_MAJOR), &abs_info); @@ -1625,7 +1636,7 @@ static void udev_init_touch_dev(udev_input_device_t *dev) touch->info_major.enabled = false; } else - udev_touch_set_limits_from(&abs_info, &touch->info_major); + udev_set_limits_from(&abs_info, &touch->info_major); /* Get minor axis limits - i.e. secondary radius of the touch */ ret = ioctl(dev->fd, EVIOCGABS(ABS_MT_TOUCH_MINOR), &abs_info); @@ -1636,7 +1647,7 @@ static void udev_init_touch_dev(udev_input_device_t *dev) touch->info_minor.enabled = false; } else - udev_touch_set_limits_from(&abs_info, &touch->info_minor); + udev_set_limits_from(&abs_info, &touch->info_minor); /* Get pressure limits */ ret = ioctl(dev->fd, EVIOCGABS(ABS_MT_PRESSURE), &abs_info); @@ -1647,7 +1658,7 @@ static void udev_init_touch_dev(udev_input_device_t *dev) touch->info_pressure.enabled = false; } else - udev_touch_set_limits_from(&abs_info, &touch->info_pressure); + udev_set_limits_from(&abs_info, &touch->info_pressure); /* Allocate the data blocks required for state tracking */ /* __u32 + __s32[num_slots] */ @@ -1777,33 +1788,7 @@ static void udev_init_touch_dev(udev_input_device_t *dev) } -/** - * Initialize given sensor device. - * - * @param dev Input sensor device to initialize. - */ -static void udev_init_sensor_dev(udev_input_device_t *dev) -{ - udev_input_sensor_t *sensor = &dev->SENSOR; - int ret,i; - struct input_absinfo abs_info; - - RARCH_DBG("[udev] Initializing sensor device \"%s\"\n", dev->ident); - for (i=ABS_X ; i<=ABS_RZ; i++){ - ret = ioctl(dev->fd, EVIOCGABS(i), &abs_info); - if (ret < 0) - { - RARCH_WARN("[udev sensor] Failed to get sensor limits\n"); - - sensor->limits.a[i].enabled = false; - } - else{ - RARCH_DBG("[udev sensor]: Initializing sensor %d\n",i); - udev_touch_set_limits_from(&abs_info, &sensor->limits.a[i]); - } - } -} /** * Fully synchronize the statue of given touch device. * This is inefficient compared to the event-driven @@ -2752,7 +2737,6 @@ static void udev_handle_touch(void *data, udev_input_t *udev = (udev_input_t*)data; udev_input_mouse_t *mouse = &dev->MOUSE; udev_input_touch_t *touch = &dev->TOUCH; - /* struct input_event */ /* { */ /* (pseudo) input_event_sec; */ @@ -2769,7 +2753,6 @@ static void udev_handle_touch(void *data, /* EV_KEY: BTN_TOUCH -> Signal for any touch - 1 down and 0 up */ /* EV_ABS: ABS_X/Y -> Absolute position of the touch */ /* SYN_REPORT -> End of packet */ - switch (event->type) { case EV_ABS: @@ -3110,7 +3093,7 @@ static int16_t udev_input_touch_state( bool screen = false; udev_input_touch_t *touch = &dev->TOUCH; udev_touch_ts_t now; - + /* Get current time for measurements */ udev_touch_ts_now(&now); @@ -3249,7 +3232,6 @@ static int16_t udev_input_touch_state( } break; } - return ret; } @@ -3270,6 +3252,33 @@ static void udev_handle_sensor(void *data, } +/** + * Initialize given sensor device. + * + * @param dev Input sensor device to initialize. + */ +static void udev_init_sensor_dev(udev_input_device_t *dev) +{ + udev_input_sensor_t *sensor = &dev->SENSOR; + int ret,i; + struct input_absinfo abs_info; + + RARCH_DBG("[udev] Initializing sensor device \"%s\"\n", dev->ident); + for (i=ABS_X ; i<=ABS_RZ; i++){ + ret = ioctl(dev->fd, EVIOCGABS(i), &abs_info); + if (ret < 0) + { + RARCH_WARN("[udev sensor] Failed to get sensor limits\n"); + + sensor->limits.a[i].enabled = false; + } + else{ + RARCH_DBG("[udev sensor]: Initializing sensor %d\n",i); + udev_set_limits_from(&abs_info, &sensor->limits.a[i]); + } + } + +} #define test_bit(array, bit) (array[bit/8] & (1<<(bit%8))) @@ -3284,7 +3293,7 @@ static int udev_input_add_device(udev_input_t *udev, struct input_absinfo absinfo; int fd = -1; int ret = 0; - int new_device = 1; + /*int new_device = 1;*/ struct stat st; #if defined(HAVE_EPOLL) struct epoll_event event; @@ -3309,7 +3318,6 @@ static int udev_input_add_device(udev_input_t *udev, device->dev = st.st_dev; device->handle_cb = cb; device->type = type; - device->aggregate_with = NULL; strlcpy(device->devnode, devnode, sizeof(device->devnode)); @@ -3320,7 +3328,7 @@ static int udev_input_add_device(udev_input_t *udev, /* UDEV_INPUT_MOUSE may report in absolute coords too */ - if (type == UDEV_INPUT_MOUSE || type == UDEV_INPUT_TOUCHPAD || type == UDEV_INPUT_TOUCHSCREEN ) + if (udev_is_mouse(type)) { bool mouse = 0; bool touch = 0; @@ -3400,49 +3408,18 @@ static int udev_input_add_device(udev_input_t *udev, if (!mouse) goto end; - } else if (type == UDEV_INPUT_SENSOR){ + } else if (type == UDEV_INPUT_SENSOR) udev_init_sensor_dev(device); - } - /* Care needs to be taken to unify the touchpad and sensors of playstation controllers */ - if (strstr(device->ident,"Sony Interactive Entertain") != NULL){ - char equivalent_device_name[256]; - char * change_position; - int i; - - RARCH_DBG("[udev]: Found Dualshock Device\n"); - strlcpy(equivalent_device_name, device->ident, 256); - - if ((change_position=strstr(equivalent_device_name, "Motion Sensors")) != NULL){ - memcpy(change_position, "Touchpad",sizeof("Touchpad")); - } - else if((change_position=strstr(equivalent_device_name, "Touchpad")) != NULL){ - memcpy(change_position, "Motion Sensors",sizeof("Motion Sensors")); - } - RARCH_DBG("[udev]: Equivalent device should be %s\n", equivalent_device_name); - for (i=0; i<(int)udev->num_devices; i++){ - if (!strncmp(udev->devices[i]->ident,equivalent_device_name,255)){ - RARCH_DBG("[udev]: Found equivalent device at index %d\n", i); - if (type == UDEV_INPUT_SENSOR) - udev->devices[i]->aggregate_with=device; - else /* type == UDEV_INPUT_TOUCHPAD */ - udev->devices[i]->aggregate_with=device; - - new_device=0; - break; - } - } + - } - if (new_device) { - tmp = (udev_input_device_t**)realloc(udev->devices, - (udev->num_devices + 1) * sizeof(*udev->devices)); + tmp = (udev_input_device_t**)realloc(udev->devices, + (udev->num_devices + 1) * sizeof(*udev->devices)); - if (!tmp) - goto end; + if (!tmp) + goto end; - tmp[udev->num_devices++] = device; - udev->devices = tmp; - } + tmp[udev->num_devices++] = device; + udev->devices = tmp; #if defined(HAVE_EPOLL) event.events = EPOLLIN; @@ -3477,14 +3454,7 @@ static int udev_input_add_device(udev_input_t *udev, return ret; } -static void close_child_devices(udev_input_device_t * curdevice){ - RARCH_DBG("[udev] close child %p\n", curdevice->aggregate_with); - if (curdevice->aggregate_with) { - close_child_devices(curdevice->aggregate_with); - close(curdevice->aggregate_with->fd); - free(curdevice->aggregate_with); - } -} + static void udev_input_remove_device(udev_input_t *udev, const char *devnode) { unsigned i; @@ -3493,7 +3463,6 @@ static void udev_input_remove_device(udev_input_t *udev, const char *devnode) { if (!string_is_equal(devnode, udev->devices[i]->devnode)) continue; - close_child_devices(udev->devices[i]); close(udev->devices[i]->fd); free(udev->devices[i]); memmove(udev->devices + i, udev->devices + i + 1, @@ -3514,6 +3483,7 @@ static void udev_input_handle_hotplug(udev_input_t *udev) const char *action = NULL; const char *devnode = NULL; int mouse = 0; + int sensor = 0; int keyboard = 0; int check = 0; int i = 0; @@ -3582,15 +3552,16 @@ static void udev_input_handle_hotplug(udev_input_t *udev) input_config_set_sensor_display_name(i, "N/A"); udev->pointers[i] = -1; udev->keyboards[i] = -1; + udev->sensors[i] = -1; } /* Add what devices we have now */ - for (i = 0; i < (int)udev->num_devices; i++) - { + for (i=0;i<(int)udev->num_devices;i++){ udev_input_device_t * cur_device=udev->devices[i]; - do { if (cur_device->type == UDEV_INPUT_SENSOR){ - input_config_set_sensor_display_name(mouse, cur_device->ident); + input_config_set_sensor_display_name(sensor, cur_device->ident); + udev->sensors[sensor] = i; + sensor++; } else if (cur_device->type != UDEV_INPUT_KEYBOARD) { @@ -3605,7 +3576,6 @@ static void udev_input_handle_hotplug(udev_input_t *udev) udev->keyboards[keyboard] = i; keyboard++; } - } while((cur_device=cur_device->aggregate_with)!=NULL); } end: @@ -3693,7 +3663,6 @@ static void udev_input_poll(void *data) for (i = 0; i < (int)udev->num_devices; i++) { udev_input_device_t * cur_device=udev->devices[i]; - do { if (cur_device->type == UDEV_INPUT_KEYBOARD || cur_device->type == UDEV_INPUT_SENSOR) continue; @@ -3715,7 +3684,6 @@ static void udev_input_poll(void *data) /* Schedule touch state update. */ cur_device->TOUCH.run_state_update = true; #endif - } while ((cur_device=cur_device->aggregate_with)!=NULL); } @@ -3777,7 +3745,7 @@ static int16_t udev_lightgun_aiming_state( { const int edge_detect = 32700; - udev_input_mouse_t *mouse = udev_get_mouse(udev, port); + udev_input_mouse_t *mouse = udev_get_pointer(udev, port); if (mouse) { @@ -3808,7 +3776,7 @@ static int16_t udev_lightgun_aiming_state( static int16_t udev_mouse_state(udev_input_t *udev, unsigned port, unsigned id, bool screen) { - udev_input_mouse_t *mouse = udev_get_mouse(udev, port); + udev_input_mouse_t *mouse = udev_get_pointer(udev, port); if (mouse) { @@ -3856,7 +3824,7 @@ static bool udev_keyboard_pressed(udev_input_t *udev, unsigned key) static bool udev_mouse_button_pressed( udev_input_t *udev, unsigned port, unsigned key) { - udev_input_mouse_t *mouse = udev_get_mouse(udev, port); + udev_input_mouse_t *mouse = udev_get_pointer(udev, port); if (mouse) { @@ -3890,7 +3858,7 @@ static bool udev_mouse_button_pressed( static int16_t udev_pointer_state(udev_input_t *udev, unsigned port, unsigned id, bool screen) { - udev_input_mouse_t *mouse = udev_get_mouse(udev, port); + udev_input_mouse_t *mouse = udev_get_pointer(udev, port); if (mouse) { @@ -3944,6 +3912,12 @@ static unsigned udev_retro_id_to_rarch(unsigned id) return 0; } +/** + * Set touch limits from given absinfo structure. + * + * @param info Input info structure. + * @param limits Target limits structure. + */ static int16_t udev_input_state( void *data, @@ -3959,7 +3933,7 @@ static int16_t udev_input_state( { udev_input_t *udev = (udev_input_t*)data; #ifdef UDEV_TOUCH_SUPPORT - udev_input_device_t *pointer_dev = udev_get_pointer_port_dev(udev, port); + udev_input_device_t *pointer_dev = udev_get_pointer_device(udev, port); #endif switch (device) @@ -4138,14 +4112,14 @@ static int16_t udev_input_state( /*deprecated*/ case RETRO_DEVICE_ID_LIGHTGUN_X: { - udev_input_mouse_t *mouse = udev_get_mouse(udev, port); + udev_input_mouse_t *mouse = udev_get_pointer(udev, port); if (mouse) return udev_mouse_get_x(mouse); } break; case RETRO_DEVICE_ID_LIGHTGUN_Y: { - udev_input_mouse_t *mouse = udev_get_mouse(udev, port); + udev_input_mouse_t *mouse = udev_get_pointer(udev, port); if (mouse) return udev_mouse_get_y(mouse); } @@ -4172,7 +4146,6 @@ static void udev_input_free(void *data) for (i = 0; i < udev->num_devices; i++) { - close_child_devices(udev->devices[i]); close(udev->devices[i]->fd); free(udev->devices[i]); } @@ -4243,6 +4216,7 @@ static void *udev_input_init(const char *joypad_driver) { int mouse = 0; int keyboard=0; + int sensor=0; int fd; int i; #ifdef UDEV_XKB_HANDLING @@ -4322,18 +4296,21 @@ static void *udev_input_init(const char *joypad_driver) for (i = 0; i < MAX_USERS; i++) { udev->pointers[i] = -1; + udev->sensors[i] = -1; udev->keyboards[i] = -1; } for (i = 0; i < (int)udev->num_devices; ++i) { udev_input_device_t * curdevice=udev->devices[i]; - do { if (curdevice->type == UDEV_INPUT_SENSOR) { RARCH_LOG("[udev]: Sensor: \"%s\" %s.\n", curdevice->ident, curdevice->devnode); - input_config_set_sensor_display_name(mouse, curdevice->ident); + input_config_set_sensor_display_name(sensor, curdevice->ident); + udev->sensors[sensor] = i; + RARCH_DBG("[udev]: sensors[%d]=%d\n",sensor,i); + sensor++; } else if (curdevice->type != UDEV_INPUT_KEYBOARD) { @@ -4356,10 +4333,6 @@ static void *udev_input_init(const char *joypad_driver) udev->keyboards[keyboard] = i; keyboard++; } - if ((curdevice=curdevice->aggregate_with)!=NULL) - RARCH_LOG("[udev]: Aggregate Device Child:\n"); - - } while(curdevice); } return udev; @@ -4414,23 +4387,13 @@ static bool udev_input_set_sensor_state (void *data, unsigned port, enum retro_s } static float udev_input_get_sensor_input(void *data, unsigned port, unsigned id) { const udev_input_t *udev = (const udev_input_t *)data; - const udev_input_device_t * device; const udev_input_sensor_t * sensor; float sensor_value; udev_input_sensor_limits_t limits; + if (udev->devices == NULL) return 0.f; - - device = udev->devices[port]; - while(device->type != UDEV_INPUT_SENSOR){ - if (device->aggregate_with == NULL){ - RARCH_ERR("[udev]: udev_input_get_sensor_input recieved a " - "device where none of it's children are sensors\n"); - return 0.0f; - } else { - device=device->aggregate_with; - } - } - sensor=&device->SENSOR; + + sensor=udev_get_sensor(udev,port); if (id >= RETRO_SENSOR_ACCELEROMETER_X && id <= RETRO_SENSOR_GYROSCOPE_Z){ sensor_value=(float)sensor->sensor_data.a[id-RETRO_SENSOR_ACCELEROMETER_X]; limits=sensor->limits.a[id-RETRO_SENSOR_ACCELEROMETER_X]; @@ -4441,10 +4404,12 @@ static float udev_input_get_sensor_input(void *data, unsigned port, unsigned id) RARCH_DBG( "[udev] sensor:\n" + "\t%d\n" "\t%f\n" "\t%d\n" "\t%d\n" "\t%f\n", + id, sensor_value, limits.min, limits.max, diff --git a/input/input_driver.c b/input/input_driver.c index 91c0d81fedf4..0f2b7b8b1941 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -3780,7 +3780,7 @@ float input_get_sensor_state(unsigned port, unsigned id) sensitivity=settings->floats.input_sensor_gyroscope_sensitivity; else sensitivity=1.f; - return input_driver_get_sensor(port, input_sensors_enable, id)*sensitivity; + return input_driver_get_sensor(port, input_sensors_enable, id)*((float)pow(2,sensitivity)); } /** diff --git a/menu/menu_setting.c b/menu/menu_setting.c index 0f96ca47c1fb..874419f6351a 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -9394,10 +9394,12 @@ static bool setting_append_list_input_player_options( parent_group, general_write_handler, general_read_handler); + (*list)[list_info->index - 1].index = user + 1; + (*list)[list_info->index - 1].index_offset = user; (*list)[list_info->index - 1].get_string_representation = &get_string_representation_input_sensor_index; + (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint; menu_settings_list_current_add_range(list, list_info, 0, MAX_INPUT_DEVICES - 1, 1.0, true, true); - MENU_SETTINGS_LIST_CURRENT_ADD_ENUM_IDX_PTR(list, list_info, (enum msg_hash_enums)(MENU_ENUM_LABEL_INPUT_SENSOR_INDEX + user)); From 809d53f92f7b2ec6415c989ff12c2419699ca1d4 Mon Sep 17 00:00:00 2001 From: oshaboy Date: Sun, 4 Feb 2024 00:43:53 +0200 Subject: [PATCH 13/50] Segfault fix and macro renaming --- input/drivers/udev_input.c | 90 ++++++++++++++++++++------------------ 1 file changed, 48 insertions(+), 42 deletions(-) diff --git a/input/drivers/udev_input.c b/input/drivers/udev_input.c index 45a6af7dbd90..08ebff726c80 100644 --- a/input/drivers/udev_input.c +++ b/input/drivers/udev_input.c @@ -588,16 +588,20 @@ typedef struct udev_input_device udev_input_touch_t _touch; /* State tracking for touch-type devices */ #endif } _mouse; - udev_input_sensor_t _sensor; + struct { + udev_input_sensor_t _sensor; + struct udev_input_device * _wii_motion_plus; + } _sensor; } _u; enum udev_input_dev_type type; /* Type of this device */ char devnode[NAME_MAX_LENGTH]; /* Device node path */ char ident[255]; /* Identifier of the device */ } udev_input_device_t; -#define MOUSE _u._mouse._mouse -#define TOUCH _u._mouse._touch -#define SENSOR _u._sensor +#define mouse_state _u._mouse._mouse +#define touch_state _u._mouse._touch +#define sensor_state _u._sensor._sensor +#define wii_motion_plus_state _u._sensor._wii_motion_plus typedef void (*device_handle_cb)(void *data, const struct input_event *event, udev_input_device_t *dev); @@ -775,14 +779,14 @@ static udev_input_sensor_t *udev_get_sensor( const struct udev_input *udev, unsigned port) { udev_input_device_t *input_device=udev_get_sensor_device(udev,port); - if (input_device) return &input_device->SENSOR; + if (input_device) return &input_device->sensor_state; else return NULL; } static udev_input_mouse_t *udev_get_pointer( const struct udev_input *udev, unsigned port) { udev_input_device_t *input_device=udev_get_pointer_device(udev,port); - if (input_device) return &input_device->MOUSE; + if (input_device) return &input_device->mouse_state; else return NULL; } static void udev_mouse_set_x(udev_input_mouse_t *mouse, int32_t x, bool abs) @@ -967,7 +971,7 @@ static void udev_handle_mouse(void *data, const struct input_event *event, udev_input_device_t *dev) { - udev_input_mouse_t *mouse = &dev->MOUSE; + udev_input_mouse_t *mouse = &dev->mouse_state; switch (event->type) { @@ -1420,8 +1424,8 @@ static void udev_dump_touch_device_slots(const char *indent, const udev_input_to */ static void udev_dump_touch_dev(udev_input_device_t *dev) { - udev_input_mouse_t *mouse = &dev->MOUSE; - udev_input_touch_t *touch = &dev->TOUCH; + udev_input_mouse_t *mouse = &dev->mouse_state; + udev_input_touch_t *touch = &dev->touch_state; RARCH_DBG("[udev] === UDEV_INPUT_DEVICE INFO DUMP ===\n"); @@ -1472,7 +1476,7 @@ static void udev_dump_touch_dev(udev_input_device_t *dev) */ static void udev_destroy_touch_dev(udev_input_device_t *dev) { - udev_input_touch_t *touch = &dev->TOUCH; + udev_input_touch_t *touch = &dev->touch_state; RARCH_DBG("[udev] Destroying touch device \"%s\"\n", dev->ident); @@ -1521,35 +1525,35 @@ static void udev_update_touch_dev_options(udev_input_device_t *dev, bool force) if (force || pointer_en_new != pointer_en) { pointer_en = pointer_en_new; - dev->TOUCH.pointer_enabled = pointer_en_new; + dev->touch_state.pointer_enabled = pointer_en_new; } mouse_en_new = UDEV_INPUT_TOUCH_MOUSE_EN; if (force || mouse_en_new != mouse_en) { mouse_en = mouse_en_new; - dev->TOUCH.mouse_enabled = mouse_en_new; + dev->touch_state.mouse_enabled = mouse_en_new; } touchpad_en_new = UDEV_INPUT_TOUCH_TOUCHPAD_EN; if (force || touchpad_en_new != touchpad_en) { touchpad_en = touchpad_en_new; - dev->TOUCH.touchpad_enabled = touchpad_en_new; + dev->touch_state.touchpad_enabled = touchpad_en_new; } trackball_en_new = UDEV_INPUT_TOUCH_TRACKBALL_EN; if (force || trackball_en_new != trackball_en) { trackball_en = trackball_en_new; - dev->TOUCH.trackball_enabled = trackball_en_new; + dev->touch_state.trackball_enabled = trackball_en_new; } gest_en_new = UDEV_INPUT_TOUCH_GEST_EN; if (force || gest_en_new != gest_en) { gest_en = gest_en_new; - dev->TOUCH.gest_enabled = gest_en_new; + dev->touch_state.gest_enabled = gest_en_new; } } @@ -1563,7 +1567,7 @@ static void udev_init_touch_dev(udev_input_device_t *dev) int iii, ret; struct input_absinfo abs_info; unsigned long xreq, yreq; - udev_input_touch_t *touch = &dev->TOUCH; + udev_input_touch_t *touch = &dev->touch_state; settings_t *settings = config_get_ptr(); RARCH_DBG("[udev] Initializing touch device \"%s\"\n", dev->ident); @@ -1806,8 +1810,8 @@ static void udev_sync_touch(udev_input_device_t *dev) size_t mt_request_data_size; size_t slot_count; udev_touch_ts_t now; - udev_input_touch_t *touch = &dev->TOUCH; - udev_slot_state_t *staging = dev->TOUCH.staging; + udev_input_touch_t *touch = &dev->touch_state; + udev_slot_state_t *staging = dev->touch_state.staging; RARCH_DDBG("[udev] Synchronizing touch data...\n"); @@ -2370,7 +2374,7 @@ static void udev_input_touch_mgest_select(udev_input_touch_t *touch, static void udev_report_touch(udev_input_t *udev, udev_input_device_t *dev) { /* Touch state being modified. */ - udev_input_touch_t *touch = &dev->TOUCH; + udev_input_touch_t *touch = &dev->touch_state; /* Helper variables. */ int iii; @@ -2735,8 +2739,8 @@ static void udev_handle_touch(void *data, const struct input_event *event, udev_input_device_t *dev) { udev_input_t *udev = (udev_input_t*)data; - udev_input_mouse_t *mouse = &dev->MOUSE; - udev_input_touch_t *touch = &dev->TOUCH; + udev_input_mouse_t *mouse = &dev->mouse_state; + udev_input_touch_t *touch = &dev->touch_state; /* struct input_event */ /* { */ /* (pseudo) input_event_sec; */ @@ -2858,7 +2862,7 @@ static void udev_handle_touch(void *data, case EV_KEY: if (event->code == BTN_TOUCH) { - RARCH_DDBG("[udev] handle_touch: [%d] TOUCH %d\n", touch->current_slot, event->value); + RARCH_DDBG("[udev] handle_touch: [%d] touch_state %d\n", touch->current_slot, event->value); if (event->value > 0) touch->staging[touch->current_slot].change = UDEV_TOUCH_CHANGE_DOWN; else @@ -3091,7 +3095,7 @@ static int16_t udev_input_touch_state( { int16_t ret = 0; bool screen = false; - udev_input_touch_t *touch = &dev->TOUCH; + udev_input_touch_t *touch = &dev->touch_state; udev_touch_ts_t now; /* Get current time for measurements */ @@ -3248,7 +3252,7 @@ static void udev_handle_sensor(void *data, const struct input_event *event, udev_input_device_t *dev) { if (event->type == EV_ABS) - dev->SENSOR.sensor_data.a[event->code]=event->value; + dev->sensor_state.sensor_data.a[event->code]=event->value; } @@ -3259,10 +3263,11 @@ static void udev_handle_sensor(void *data, */ static void udev_init_sensor_dev(udev_input_device_t *dev) { - udev_input_sensor_t *sensor = &dev->SENSOR; + udev_input_sensor_t *sensor = &dev->sensor_state; int ret,i; struct input_absinfo abs_info; + dev->wii_motion_plus_state=NULL; RARCH_DBG("[udev] Initializing sensor device \"%s\"\n", dev->ident); for (i=ABS_X ; i<=ABS_RZ; i++){ ret = ioctl(dev->fd, EVIOCGABS(i), &abs_info); @@ -3360,23 +3365,23 @@ static int udev_input_add_device(udev_input_t *udev, if (test_bit(keycaps, BTN_TOUCH)) { touch = 1; - device->MOUSE.abs = 1; + device->mouse_state.abs = 1; } /* check for light gun or any other device that might not have a touch button */ else - device->MOUSE.abs = 2; + device->mouse_state.abs = 2; if ( !test_bit(keycaps, BTN_TOUCH) && !test_bit(keycaps, BTN_MOUSE) ) RARCH_DBG("[udev]: Warning ABS pointer device (%s) has no touch or mouse button\n",device->ident); } } - device->MOUSE.x_min = 0; - device->MOUSE.y_min = 0; - device->MOUSE.x_max = 0; - device->MOUSE.y_max = 0; + device->mouse_state.x_min = 0; + device->mouse_state.y_min = 0; + device->mouse_state.x_max = 0; + device->mouse_state.y_max = 0; - if (device->MOUSE.abs) + if (device->mouse_state.abs) { if (ioctl(fd, EVIOCGABS(ABS_X), &absinfo) == -1) { @@ -3384,16 +3389,16 @@ static int udev_input_add_device(udev_input_t *udev, goto end; } - device->MOUSE.x_min = absinfo.minimum; - device->MOUSE.x_max = absinfo.maximum; + device->mouse_state.x_min = absinfo.minimum; + device->mouse_state.x_max = absinfo.maximum; if (ioctl(fd, EVIOCGABS(ABS_Y), &absinfo) == -1) { RARCH_DBG("[udev]: ABS pointer device (%s) Failed to get ABS_Y parameters \n",device->ident); goto end; } - device->MOUSE.y_min = absinfo.minimum; - device->MOUSE.y_max = absinfo.maximum; + device->mouse_state.y_min = absinfo.minimum; + device->mouse_state.y_max = absinfo.maximum; } if (touch) @@ -3667,7 +3672,7 @@ static void udev_input_poll(void *data) cur_device->type == UDEV_INPUT_SENSOR) continue; - mouse = &cur_device->MOUSE; + mouse = &cur_device->mouse_state; #ifdef HAVE_X11 udev_input_adopt_rel_pointer_position_from_mouse( &udev->pointer_x, &udev->pointer_y, mouse); @@ -3682,7 +3687,7 @@ static void udev_input_poll(void *data) #ifdef UDEV_TOUCH_SUPPORT /* Schedule touch state update. */ - cur_device->TOUCH.run_state_update = true; + cur_device->touch_state.run_state_update = true; #endif } @@ -4031,7 +4036,7 @@ static int16_t udev_input_state( case RETRO_DEVICE_MOUSE: case RARCH_DEVICE_MOUSE_SCREEN: #ifdef UDEV_TOUCH_SUPPORT - if (pointer_dev && pointer_dev->TOUCH.is_touch_device) + if (pointer_dev && pointer_dev->touch_state.is_touch_device) return udev_input_touch_state(udev, pointer_dev, binds, keyboard_mapping_blocked, port, device, idx, id); #endif @@ -4041,7 +4046,7 @@ static int16_t udev_input_state( case RETRO_DEVICE_POINTER: case RARCH_DEVICE_POINTER_SCREEN: #ifdef UDEV_TOUCH_SUPPORT - if (pointer_dev && pointer_dev->TOUCH.is_touch_device) + if (pointer_dev && pointer_dev->touch_state.is_touch_device) return udev_input_touch_state(udev, pointer_dev, binds, keyboard_mapping_blocked, port, device, idx, id); #endif @@ -4052,7 +4057,7 @@ static int16_t udev_input_state( case RETRO_DEVICE_LIGHTGUN: #ifdef UDEV_TOUCH_SUPPORT - if (pointer_dev && pointer_dev->TOUCH.is_touch_device) + if (pointer_dev && pointer_dev->touch_state.is_touch_device) return udev_input_touch_state(udev, pointer_dev, binds, keyboard_mapping_blocked, port, device, idx, id); #endif @@ -4317,7 +4322,7 @@ static void *udev_input_init(const char *joypad_driver) RARCH_LOG("[udev]: Mouse/Touch #%u: \"%s\" (%s) %s.\n", mouse, curdevice->ident, - curdevice->MOUSE.abs ? "ABS" : "REL", + curdevice->mouse_state.abs ? "ABS" : "REL", curdevice->devnode); input_config_set_mouse_display_name(mouse, curdevice->ident); @@ -4394,6 +4399,7 @@ static float udev_input_get_sensor_input(void *data, unsigned port, unsigned id) if (udev->devices == NULL) return 0.f; sensor=udev_get_sensor(udev,port); + if (!sensor) return 0.f; if (id >= RETRO_SENSOR_ACCELEROMETER_X && id <= RETRO_SENSOR_GYROSCOPE_Z){ sensor_value=(float)sensor->sensor_data.a[id-RETRO_SENSOR_ACCELEROMETER_X]; limits=sensor->limits.a[id-RETRO_SENSOR_ACCELEROMETER_X]; From 1a30370efeef74c9acd4d6d85967203fed1a3eb5 Mon Sep 17 00:00:00 2001 From: oshaboy Date: Mon, 5 Feb 2024 04:35:22 +0200 Subject: [PATCH 14/50] Now SDL Sensor gives names. --- config.def.h | 6 ------ input/drivers/sdl_input.c | 17 ++++++++++++----- input/drivers/udev_input.c | 1 + 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/config.def.h b/config.def.h index cb0ec8aa1466..0a85bb985fc2 100644 --- a/config.def.h +++ b/config.def.h @@ -1517,12 +1517,6 @@ #define DEFAULT_ANALOG_SENSITIVITY 1.0f #define DEFAULT_SENSOR_ACCELEROMETER_SENSITIVITY 1.0f #define DEFAULT_SENSOR_GYROSCOPE_SENSITIVITY 1.0f -#define DEFAULT_SENSOR_AXIS_ACCELEROMETER_X 0 -#define DEFAULT_SENSOR_AXIS_ACCELEROMETER_Y 1 -#define DEFAULT_SENSOR_AXIS_ACCELEROMETER_Z 2 -#define DEFAULT_SENSOR_AXIS_GYROSCOPE_X 3 -#define DEFAULT_SENSOR_AXIS_GYROSCOPE_Y 4 -#define DEFAULT_SENSOR_AXIS_GYROSCOPE_Z 5 /* Describes speed of which turbo-enabled buttons toggle. */ diff --git a/input/drivers/sdl_input.c b/input/drivers/sdl_input.c index 8cfb4a46f49f..a7c62b08cec1 100644 --- a/input/drivers/sdl_input.c +++ b/input/drivers/sdl_input.c @@ -107,7 +107,7 @@ static void *sdl_input_init(const char *joypad_driver) #ifdef HAVE_SDL2 { int numJoysticks,numTouchDevices,numSensors; - int i; + int i; int sensor_count=0; SDL_InitSubSystem(SDL_INIT_GAMECONTROLLER); RARCH_DBG( @@ -136,7 +136,12 @@ static void *sdl_input_init(const char *joypad_driver) dev.sensor=SDL_SensorOpen(i); sdl->auxiliary_devices[sdl->auxiliary_device_number]. type=SDL_AUXILIARY_DEVICE_TYPE_SENSOR; + input_config_set_sensor_display_name( + sensor_count++, + SDL_SensorGetName(sdl->auxiliary_devices[sdl->auxiliary_device_number].dev.sensor) + ); sdl->auxiliary_device_number++; + } for (i=0; iauxiliary_devices[sdl->auxiliary_device_number]. type=SDL_AUXILIARY_DEVICE_TYPE_GAMECONTROLLER; sdl->auxiliary_device_number++; + input_config_set_sensor_display_name(sensor_count++,SDL_GameControllerName(gamepad)); } } } @@ -352,7 +358,7 @@ static int16_t sdl_input_state( case RETRO_DEVICE_ID_POINTER_Y: return (int16_t)((finger->y-0.5f)*65535); case RETRO_DEVICE_ID_POINTER_PRESSED: - return finger->pressure>0.0f; + return finger->pressure>0.f; } } else if ( @@ -377,7 +383,7 @@ static int16_t sdl_input_state( case RETRO_DEVICE_ID_POINTER_Y: return (int16_t)((y-0.5f)*65535); case RETRO_DEVICE_ID_POINTER_PRESSED: - return pressure>0.0f; + return pressure>0.f; } } @@ -623,6 +629,7 @@ static float sdl_input_get_sensor_input (void *data, unsigned port, unsigned id) (id == RETRO_SENSOR_GYROSCOPE_Y) | (id == RETRO_SENSOR_GYROSCOPE_Z) ) sensor_type=SDL_SENSOR_GYRO; + else return 0.f; /*Unimplemented*/ for (i=0; i<(int)sdl->auxiliary_device_number;i++){ if ( sdl->auxiliary_devices[i].type == SDL_AUXILIARY_DEVICE_TYPE_GAMECONTROLLER && @@ -646,7 +653,7 @@ static float sdl_input_get_sensor_input (void *data, unsigned port, unsigned id) if (!gamepad && !sensor){ RARCH_ERR("[sdl]: sdl_input_get_sensor_input recieved a " "device where none of it's children are sensors\n"); - return 0.0f; + return 0.f; } if (gamepad) @@ -659,7 +666,7 @@ static float sdl_input_get_sensor_input (void *data, unsigned port, unsigned id) } else if (id>=RETRO_SENSOR_GYROSCOPE_X && id <= RETRO_SENSOR_GYROSCOPE_Z){ sensor_value=sensor_data[id-RETRO_SENSOR_GYROSCOPE_X]; } else { - return 0.0f; /*UNIMPLEMENTED*/ + return 0.f; /*UNIMPLEMENTED*/ } RARCH_DBG( "[udev] sensor:\n" diff --git a/input/drivers/udev_input.c b/input/drivers/udev_input.c index 08ebff726c80..6e4dff996892 100644 --- a/input/drivers/udev_input.c +++ b/input/drivers/udev_input.c @@ -3564,6 +3564,7 @@ static void udev_input_handle_hotplug(udev_input_t *udev) for (i=0;i<(int)udev->num_devices;i++){ udev_input_device_t * cur_device=udev->devices[i]; if (cur_device->type == UDEV_INPUT_SENSOR){ + /* Sensors */ input_config_set_sensor_display_name(sensor, cur_device->ident); udev->sensors[sensor] = i; sensor++; From 6c7f783f9876557c69bd6de1558ade21e91f26b3 Mon Sep 17 00:00:00 2001 From: oshaboy Date: Mon, 5 Feb 2024 05:01:05 +0200 Subject: [PATCH 15/50] Update sdl_input.c --- input/drivers/sdl_input.c | 39 +++++++++++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/input/drivers/sdl_input.c b/input/drivers/sdl_input.c index a7c62b08cec1..645e2803b3f1 100644 --- a/input/drivers/sdl_input.c +++ b/input/drivers/sdl_input.c @@ -32,7 +32,12 @@ #include "../../tasks/tasks_internal.h" #ifdef HAVE_SDL2 +#define SDL_SUPPORT_SENSORS SDL_VERSION_ATLEAST(2,0,9) +#define SDL_SUPPORT_FANCY_GAMEPAD SDL_VERSION_ATLEAST(2,0,14) #include "../../gfx/common/sdl2_common.h" +#else +#define SDL_SUPPORT_SENSORS 0 +#define SDL_SUPPORT_FANCY_GAMEPAD 0 #endif #ifdef WEBOS @@ -50,17 +55,23 @@ enum SDL_AUXILIARY_DEVICE_TYPE{ SDL_AUXILIARY_DEVICE_TYPE_GAMECONTROLLER }; #ifdef HAVE_SDL2 +#if SDL_SUPPORT_FANCY_GAMEPAD struct game_controller_data{ SDL_GameController * ptr; bool has_accelerometer : 1; bool has_gyro : 1; unsigned num_touchpads:14; }; +#endif typedef struct { union { +#if SDL_SUPPORT_SENSORS SDL_Sensor * sensor; +#endif SDL_TouchID touch_id; +#if SDL_SUPPORT_FANCY_GAMEPAD struct game_controller_data game_controller; +#endif } dev; enum SDL_AUXILIARY_DEVICE_TYPE type; } sdl_auxiliary_device; @@ -106,7 +117,7 @@ static void *sdl_input_init(const char *joypad_driver) #ifdef HAVE_SDL2 { - int numJoysticks,numTouchDevices,numSensors; + int numJoysticks=0,numTouchDevices=0,numSensors=0; int i; int sensor_count=0; SDL_InitSubSystem(SDL_INIT_GAMECONTROLLER); @@ -114,14 +125,18 @@ static void *sdl_input_init(const char *joypad_driver) "[sdl]: SDL_GetNumTouchDevices: %d\n", numTouchDevices=SDL_GetNumTouchDevices() ); +#if SDL_SUPPORT_SENSORS RARCH_DBG( "[sdl]: SDL_NumSensors: %d\n", numSensors=SDL_NumSensors() ); +#endif +#if SDL_SUPPORT_FANCY_GAMEPAD RARCH_DBG( "[sdl]: SDL_NumJoysticks: %d\n", numJoysticks=SDL_NumJoysticks() ); +#endif sdl->auxiliary_device_number=0; sdl->auxiliary_devices=malloc(sizeof(sdl_auxiliary_device)*(numJoysticks+numTouchDevices+numSensors)); for (i=0; iauxiliary_device_number++; } +#if SDL_SUPPORT_SENSORS for(i=0; iauxiliary_devices[sdl->auxiliary_device_number]. dev.sensor=SDL_SensorOpen(i); @@ -143,6 +159,8 @@ static void *sdl_input_init(const char *joypad_driver) sdl->auxiliary_device_number++; } +#endif +#if SDL_SUPPORT_FANCY_GAMEPAD for (i=0; ipressure>0.f; } - } else if ( + } +#if SDL_SUPPORT_FANCY_GAMEPAD + else if ( sdl->auxiliary_devices[port].type == SDL_AUXILIARY_DEVICE_TYPE_GAMECONTROLLER && sdl->auxiliary_devices[port].dev.game_controller.num_touchpads ){ @@ -387,6 +408,7 @@ static int16_t sdl_input_state( } } +#endif else #endif if (idx == 0) @@ -609,12 +631,13 @@ static uint64_t sdl_get_capabilities(void *data) | (1 << RETRO_DEVICE_POINTER) | (1 << RETRO_DEVICE_ANALOG); } -#ifdef HAVE_SDL2 +#if SDL_SUPPORT_SENSORS static bool sdl_input_set_sensor_state (void *data, unsigned port, enum retro_sensor_action action, unsigned rate) { return true; } static float sdl_input_get_sensor_input (void *data, unsigned port, unsigned id) { sdl_input_t * sdl = (sdl_input_t *)data; + SDL_GameController * gamepad=NULL; SDL_Sensor * sensor=NULL; SDL_SensorType sensor_type; @@ -631,6 +654,7 @@ static float sdl_input_get_sensor_input (void *data, unsigned port, unsigned id) ) sensor_type=SDL_SENSOR_GYRO; else return 0.f; /*Unimplemented*/ for (i=0; i<(int)sdl->auxiliary_device_number;i++){ +#if SDL_SUPPORT_FANCY_GAMEPAD if ( sdl->auxiliary_devices[i].type == SDL_AUXILIARY_DEVICE_TYPE_GAMECONTROLLER && (sdl->auxiliary_devices[i].dev.game_controller.has_accelerometer || @@ -640,7 +664,9 @@ static float sdl_input_get_sensor_input (void *data, unsigned port, unsigned id) gamepad=sdl->auxiliary_devices[i].dev.game_controller.ptr; break; } else port--; - } else if( + } else +#endif + if( sdl->auxiliary_devices[i].type == SDL_AUXILIARY_DEVICE_TYPE_SENSOR && SDL_SensorGetType(sdl->auxiliary_devices[i].dev.sensor) == sensor_type ){ @@ -655,10 +681,11 @@ static float sdl_input_get_sensor_input (void *data, unsigned port, unsigned id) "device where none of it's children are sensors\n"); return 0.f; } - +#if SDL_SUPPORT_FANCY_GAMEPAD if (gamepad) SDL_GameControllerGetSensorData(gamepad, sensor_type, sensor_data,3); else /*if (sensor)*/ +#endif SDL_SensorGetData(sensor,sensor_data, 3); if (id>=RETRO_SENSOR_ACCELEROMETER_X && id <= RETRO_SENSOR_ACCELEROMETER_Z){ @@ -693,7 +720,7 @@ input_driver_t input_sdl = { sdl_input_poll, sdl_input_state, sdl_input_free, -#ifdef HAVE_SDL2 +#ifdef SDL_SUPPORT_SENSORS sdl_input_set_sensor_state, sdl_input_get_sensor_input, #else From adcb02d6a0c56841158d868a004812dc3782a66e Mon Sep 17 00:00:00 2001 From: oshaboy Date: Mon, 5 Feb 2024 05:02:04 +0200 Subject: [PATCH 16/50] Update sdl_input.c --- input/drivers/sdl_input.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/input/drivers/sdl_input.c b/input/drivers/sdl_input.c index 645e2803b3f1..d40777d3cced 100644 --- a/input/drivers/sdl_input.c +++ b/input/drivers/sdl_input.c @@ -720,7 +720,7 @@ input_driver_t input_sdl = { sdl_input_poll, sdl_input_state, sdl_input_free, -#ifdef SDL_SUPPORT_SENSORS +#if SDL_SUPPORT_SENSORS sdl_input_set_sensor_state, sdl_input_get_sensor_input, #else From cafaeff71da3fafe253fdf26095c17bb5336e68b Mon Sep 17 00:00:00 2001 From: oshaboy Date: Mon, 5 Feb 2024 05:16:10 +0200 Subject: [PATCH 17/50] Update sdl_input.c --- input/drivers/sdl_input.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/input/drivers/sdl_input.c b/input/drivers/sdl_input.c index d40777d3cced..2d6b0e48d4df 100644 --- a/input/drivers/sdl_input.c +++ b/input/drivers/sdl_input.c @@ -203,8 +203,8 @@ static void *sdl_input_init(const char *joypad_driver) input_config_set_sensor_display_name(sensor_count++,SDL_GameControllerName(gamepad)); } } - } #endif + } #endif return sdl; } From 2ab1ef5b288766a9762b74acbc912d064721a199 Mon Sep 17 00:00:00 2001 From: oshaboy Date: Thu, 22 Feb 2024 01:58:08 +0200 Subject: [PATCH 18/50] Mostly menu stuff for sensors --- configuration.c | 74 +++++++++++++++++++- configuration.h | 2 + input/drivers/udev_input.c | 2 +- input/input_defines.h | 12 +++- intl/msg_hash_lbl.h | 60 +++++++++++++++++ intl/msg_hash_us.h | 60 +++++++++++++++++ libretro-common/include/libretro.h | 8 --- menu/menu_setting.c | 104 ++++++++++++----------------- msg_hash.h | 15 +++++ 9 files changed, 264 insertions(+), 73 deletions(-) diff --git a/configuration.c b/configuration.c index ba6fc814a62f..5f20729d9a52 100644 --- a/configuration.c +++ b/configuration.c @@ -5712,7 +5712,7 @@ bool input_remapping_load_file(void *data, const char *path) config_file_t *conf = (config_file_t*)data; settings_t *settings = config_st; runloop_state_t *runloop_st = runloop_state_get_ptr(); - char key_strings[RARCH_FIRST_CUSTOM_BIND + 8][8] = { + static const char * key_strings[RARCH_FIRST_CUSTOM_BIND + 8] = { "b", "y", "select", "start", "up", "down", "left", "right", "a", "x", "l", "r", "l2", "r2", @@ -5817,7 +5817,40 @@ bool input_remapping_load_file(void *data, const char *path) _len = strlcpy(s1, "input_remap_port_p", sizeof(s1)); strlcpy(s1 + _len, formatted_number, sizeof(s1) - _len); CONFIG_GET_INT_BASE(conf, settings, uints.input_remap_ports[i], s1); - } + { + static const char * sensor_strings[RETRO_SENSOR_MAX] = + { + "accel_x","accel_y", "accel_z", + "gyro_x","gyro_y","gyro_z", + "light" + }; + static const char * sensor_strings_flip[RETRO_SENSOR_MAX] = + { + "accel_x_flip","accel_y_flip", "accel_z_flip", + "gyro_x_flip","gyro_y_flip","gyro_z_flip", + "light_flip" + }; + for (j = 0; j < RETRO_SENSOR_MAX; j++){ + + int sensor_remap = -1; + bool sensor_flip_remap = false; + char sensor_ident[128]; + char sensor_flip_ident[128]; + fill_pathname_join_delim(sensor_ident, s1, + sensor_strings[j], '_', sizeof(sensor_ident)); + fill_pathname_join_delim(sensor_flip_ident, s1, + sensor_strings_flip[j], '_', sizeof(sensor_flip_ident)); + if(!config_get_int(conf, sensor_ident, &sensor_remap)) + sensor_remap=RETROK_UNKNOWN; + configuration_set_uint(settings, + settings->uints.input_sensor_ids[i][j], sensor_remap); + config_get_bool(conf, sensor_flip_ident, &sensor_flip_remap); + configuration_set_bool(settings, + settings->bools.input_sensor_flip_axis[i][j], sensor_flip_remap); + + } + } + } input_remapping_update_port_map(); @@ -5843,7 +5876,7 @@ bool input_remapping_save_file(const char *path) bool ret; unsigned i, j; char remap_file_dir[PATH_MAX_LENGTH]; - char key_strings[RARCH_FIRST_CUSTOM_BIND + 8][8] = + static const char * key_strings[RARCH_FIRST_CUSTOM_BIND + 8] = { "b", "y", "select", "start", "up", "down", "left", "right", @@ -5852,6 +5885,18 @@ bool input_remapping_save_file(const char *path) "l_x+", "l_x-", "l_y+", "l_y-", "r_x+", "r_x-", "r_y+", "r_y-" }; + static const char * sensor_strings[RETRO_SENSOR_MAX] = + { + "accel_x","accel_y", "accel_z", + "gyro_x","gyro_y","gyro_z", + "light" + }; + static const char * sensor_strings_flip[RETRO_SENSOR_MAX] = + { + "accel_x_flip","accel_y_flip", "accel_z_flip", + "gyro_x_flip","gyro_y_flip","gyro_z_flip", + "light_flip" + }; config_file_t *conf = NULL; runloop_state_t *runloop_st = runloop_state_get_ptr(); settings_t *settings = config_st; @@ -5993,6 +6038,29 @@ bool input_remapping_save_file(const char *path) _len = strlcpy(s1, "input_remap_port_p", sizeof(s1)); strlcpy(s1 + _len, formatted_number, sizeof(s1) - _len); config_set_int(conf, s1, settings->uints.input_remap_ports[i]); + for (j = 0; j < RETRO_SENSOR_MAX; j++){ + int sensor_remap = -1; + bool sensor_flip_remap=false; + char sensor_ident[128]; + char sensor_ident_flip[128]; + fill_pathname_join_delim(sensor_ident, s1, + sensor_strings[j], '_', sizeof(sensor_ident)); + fill_pathname_join_delim(sensor_ident_flip, s1, + sensor_flip_strings[j], '_', sizeof(sensor_ident_flip)); + #if 0 + /* Only save modified button values */ + if (remap_id == j) + config_unset(conf, sensor_ident); + else + { + if (remap_id == RARCH_UNMAPPED) + config_set_int(conf, sensor_ident, -1); + else + config_set_int(conf, sensor_ident, + settings->uints.input_sensor_ids[i][j]); + } + #endif + } } ret = config_file_write(conf, path, true); diff --git a/configuration.h b/configuration.h index 02aecfd27aa3..0a8f8f34d7e5 100644 --- a/configuration.h +++ b/configuration.h @@ -153,6 +153,7 @@ typedef struct settings unsigned input_remap_ports[MAX_USERS]; unsigned input_remap_ids[MAX_USERS][RARCH_CUSTOM_BIND_LIST_END]; unsigned input_keymapper_ids[MAX_USERS][RARCH_CUSTOM_BIND_LIST_END]; + unsigned input_sensor_ids[MAX_USERS][RETRO_SENSOR_MAX]; unsigned input_remap_port_map[MAX_USERS][MAX_USERS + 1]; unsigned led_map[MAX_LEDS]; @@ -688,6 +689,7 @@ typedef struct settings bool input_touch_vmouse_trackball; bool input_touch_vmouse_gesture; #endif + bool input_sensor_flip_axis[MAX_USERS][RETRO_SENSOR_MAX]; /* Frame time counter */ bool frame_time_counter_reset_after_fastforwarding; diff --git a/input/drivers/udev_input.c b/input/drivers/udev_input.c index 6e4dff996892..8d0af5b84af1 100644 --- a/input/drivers/udev_input.c +++ b/input/drivers/udev_input.c @@ -3331,7 +3331,7 @@ static int udev_input_add_device(udev_input_t *udev, - + RARCH_DBG("device->ident %s\n", device->ident); /* UDEV_INPUT_MOUSE may report in absolute coords too */ if (udev_is_mouse(type)) { diff --git a/input/input_defines.h b/input/input_defines.h index bdd36fc37a1e..060bb583ccca 100644 --- a/input/input_defines.h +++ b/input/input_defines.h @@ -243,7 +243,17 @@ enum input_turbo_default_button INPUT_TURBO_DEFAULT_BUTTON_R3, INPUT_TURBO_DEFAULT_BUTTON_LAST }; - +enum RETRO_SENSOR +{ + RETRO_SENSOR_ACCELEROMETER_X, + RETRO_SENSOR_ACCELEROMETER_Y, + RETRO_SENSOR_ACCELEROMETER_Z, + RETRO_SENSOR_GYROSCOPE_X, + RETRO_SENSOR_GYROSCOPE_Y, + RETRO_SENSOR_GYROSCOPE_Z, + RETRO_SENSOR_ILLUMINANCE, + RETRO_SENSOR_MAX +}; RETRO_END_DECLS #endif diff --git a/intl/msg_hash_lbl.h b/intl/msg_hash_lbl.h index fbb1d6391ce1..c7dc8b7bce55 100644 --- a/intl/msg_hash_lbl.h +++ b/intl/msg_hash_lbl.h @@ -1983,6 +1983,66 @@ MSG_HASH( MENU_ENUM_LABEL_INPUT_SENSOR_INDEX, "input_player%u_sensor_index" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_MAPPINGS, + "input_player%u_sensor_mappings" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_ACCELEROMETER_X, + "input_player%u_accelerometer_x_binding" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_ACCELEROMETER_X_FLIP, + "input_player%u_accelerometer_x_flip" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_ACCELEROMETER_Y, + "input_player%u_accelerometer_y_binding" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_ACCELEROMETER_Y_FLIP, + "input_player%u_accelerometer_y_flip" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_ACCELEROMETER_Z, + "input_player%u_accelerometer_z_binding" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_ACCELEROMETER_Z_FLIP, + "input_player%u_accelerometer_z_flip" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_GYROSCOPE_X, + "input_player%u_gyroscope_x" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_GYROSCOPE_X_FLIP, + "input_player%u_gyroscope_x_flip" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_GYROSCOPE_Y, + "input_player%u_gyroscope_y" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_GYROSCOPE_Y_FLIP, + "input_player%u_gyroscope_y_flip" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_GYROSCOPE_Z, + "input_player%u_gyroscope_z" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_GYROSCOPE_Z_FLIP, + "input_player%u_gyroscope_z_flip" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_LIGHT, + "input_player%u_light" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_LIGHT_FLIP, + "input_player%u_light_flip" + ) MSG_HASH( MENU_ENUM_LABEL_INPUT_REMAP_PORT, "input_remap_port_p%u" diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index 01ed7f413ace..210597d4ef91 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -4069,6 +4069,66 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_INDEX, "Sensor Index" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_MAPPINGS, + "Sensor Mappings" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_ACCELEROMETER_X, + "Accelerometer X Binding" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_ACCELEROMETER_X_FLIP, + "Accelerometer X Flip" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_ACCELEROMETER_Y, + "Accelerometer Y Binding" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_ACCELEROMETER_Y_FLIP, + "Accelerometer Y Flip" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_ACCELEROMETER_Z, + "Accelerometer Z Binding" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_ACCELEROMETER_Z_FLIP, + "Accelerometer Z Flip" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_GYROSCOPE_X, + "Gyroscope X Binding" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_GYROSCOPE_X_FLIP, + "Gyroscope X Flip" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_GYROSCOPE_Y, + "Gyroscope Y Binding" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_GYROSCOPE_Y_FLIP, + "Gyroscope Y Flip" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_GYROSCOPE_Z, + "Gyroscope Z Binding" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_GYROSCOPE_Z_FLIP, + "Gyroscope Z Flip" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_LIGHT, + "Light Binding" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_LIGHT_FLIP, + "Light Flip" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_B, "B Button (Down)" diff --git a/libretro-common/include/libretro.h b/libretro-common/include/libretro.h index d34cbdb62221..82026e479aca 100644 --- a/libretro-common/include/libretro.h +++ b/libretro-common/include/libretro.h @@ -2548,14 +2548,6 @@ enum retro_sensor_action RETRO_SENSOR_DUMMY = INT_MAX }; -/* Id values for SENSOR types. */ -#define RETRO_SENSOR_ACCELEROMETER_X 0 -#define RETRO_SENSOR_ACCELEROMETER_Y 1 -#define RETRO_SENSOR_ACCELEROMETER_Z 2 -#define RETRO_SENSOR_GYROSCOPE_X 3 -#define RETRO_SENSOR_GYROSCOPE_Y 4 -#define RETRO_SENSOR_GYROSCOPE_Z 5 -#define RETRO_SENSOR_ILLUMINANCE 6 typedef bool (RETRO_CALLCONV *retro_set_sensor_state_t)(unsigned port, enum retro_sensor_action action, unsigned rate); diff --git a/menu/menu_setting.c b/menu/menu_setting.c index 874419f6351a..23e785ede780 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -9186,7 +9186,6 @@ static bool setting_append_list_input_player_options( */ static char buffer[MAX_USERS][13+2+1]; static char group_label[MAX_USERS][255]; - unsigned i, j; rarch_setting_group_info_t group_info; rarch_setting_group_info_t subgroup_info; settings_t *settings = config_get_ptr(); @@ -9443,71 +9442,56 @@ static bool setting_append_list_input_player_options( } { - const char *value_na = - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NOT_AVAILABLE); - for (j = 0; j < RARCH_BIND_LIST_END; j++) + unsigned i; + for (i = 0; i < RARCH_BIND_LIST_END; i++) { - char label[NAME_MAX_LENGTH]; - char name[NAME_MAX_LENGTH]; - size_t _len = 0; - i = (j < RARCH_ANALOG_BIND_LIST_END) - ? input_config_bind_order[j] - : j; - - if (input_config_bind_map_get_meta(i)) + const char *input_desc_btn; + bool value_available=true; + unsigned cur_binding = (i < RARCH_ANALOG_BIND_LIST_END) + ? input_config_bind_order[i] + : i; + if (input_config_bind_map_get_meta(cur_binding)) continue; - name[0] = '\0'; - - if (!string_is_empty(buffer[user])) - { - _len = strlcpy(label, buffer[user], sizeof(label)); - label[ _len] = ' '; - label[++_len] = '\0'; - } - else - label[0] = '\0'; - - if ( - settings->bools.input_descriptor_label_show - && (i < RARCH_FIRST_META_KEY) + /*default value*/ + input_desc_btn=input_config_bind_map_get_desc(cur_binding); + if (settings->bools.input_descriptor_label_show + && (cur_binding < RARCH_FIRST_META_KEY) && core_has_set_input_descriptor() - && (i != RARCH_TURBO_ENABLE) - ) + && (cur_binding != RARCH_TURBO_ENABLE)) { - if (sys_info->input_desc_btn[user][i]) - strlcpy(label + _len, - sys_info->input_desc_btn[user][i], - sizeof(label) - _len); - else - { - snprintf(label, sizeof(label), "%s (%s)", - input_config_bind_map_get_desc(i), - value_na); - - if (settings->bools.input_descriptor_hide_unbound) - continue; - } + if (sys_info->input_desc_btn[user][cur_binding]) + input_desc_btn=sys_info->input_desc_btn[user][cur_binding]; + else value_available=false; + } + if (value_available || !settings->bools.input_descriptor_hide_unbound){ + char label[NAME_MAX_LENGTH]; + char name[NAME_MAX_LENGTH]; + int len; + + snprintf(name, sizeof(name), "p%u_%s", user + 1, + input_config_bind_map_get_base(cur_binding)); + len=snprintf(label, sizeof(label), "%s%s%s", + buffer[user], + string_is_empty(buffer[user])?"":" ", + input_desc_btn); + if (!value_available) + snprintf(label+len,sizeof(label)-len, " (%s)", + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NOT_AVAILABLE)); + + CONFIG_BIND_ALT( + list, list_info, + &input_config_binds[user][cur_binding], + user + 1, + user, + strdup(name), + strdup(label), + &defaults[cur_binding], + &group_info, + &subgroup_info, + parent_group); + (*list)[list_info->index - 1].bind_type = cur_binding + MENU_SETTINGS_BIND_BEGIN; } - else - strlcpy(label + _len, - input_config_bind_map_get_desc(i), - sizeof(label) - _len); - - snprintf(name, sizeof(name), "p%u_%s", user + 1, input_config_bind_map_get_base(i)); - - CONFIG_BIND_ALT( - list, list_info, - &input_config_binds[user][i], - user + 1, - user, - strdup(name), - strdup(label), - &defaults[i], - &group_info, - &subgroup_info, - parent_group); - (*list)[list_info->index - 1].bind_type = i + MENU_SETTINGS_BIND_BEGIN; } } diff --git a/msg_hash.h b/msg_hash.h index d025d8a71735..b3aeee23f011 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -1151,6 +1151,21 @@ enum msg_hash_enums MENU_ENUM_LABEL_VALUE_INPUT_SAVE_AUTOCONFIG, MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_INDEX, MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_INDEX, + MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_MAPPINGS, + MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_ACCELEROMETER_X, + MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_ACCELEROMETER_X_FLIP, + MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_ACCELEROMETER_Y, + MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_ACCELEROMETER_Y_FLIP, + MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_ACCELEROMETER_Z, + MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_ACCELEROMETER_Z_FLIP, + MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_GYROSCOPE_X, + MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_GYROSCOPE_X_FLIP, + MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_GYROSCOPE_Y, + MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_GYROSCOPE_Y_FLIP, + MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_GYROSCOPE_Z, + MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_GYROSCOPE_Z_FLIP, + MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_LIGHT, + MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_LIGHT_FLIP, MENU_ENUM_LABEL_VALUE_INPUT_REMAP_PORT, MENU_ENUM_SUBLABEL_INPUT_DEVICE_TYPE, From 9d9e388884767a8460f898f005ba7c03379bd11c Mon Sep 17 00:00:00 2001 From: oshaboy Date: Thu, 22 Feb 2024 02:11:43 +0200 Subject: [PATCH 19/50] Messed up the merge --- intl/msg_hash_lbl.h | 1 + intl/msg_hash_us.h | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/intl/msg_hash_lbl.h b/intl/msg_hash_lbl.h index e71d364e3702..6b8b73b73ea6 100644 --- a/intl/msg_hash_lbl.h +++ b/intl/msg_hash_lbl.h @@ -2046,6 +2046,7 @@ MSG_HASH( MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_LIGHT_FLIP, "input_player%u_light_flip" +) MSG_HASH( MENU_ENUM_LABEL_INPUT_JOYPAD_INDEX, "input_player%u_joypad_index" diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index 5a98972dd547..ac27fb01168b 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -4228,7 +4228,7 @@ MSG_HASH( MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_LIGHT_FLIP, "Light Flip" - +) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_MOUSE_INDEX, "The physical mouse as recognized by RetroArch." From cbb2b6467b4bf396f95e9da68305837506bc4219 Mon Sep 17 00:00:00 2001 From: oshaboy Date: Thu, 22 Feb 2024 02:13:01 +0200 Subject: [PATCH 20/50] typo --- configuration.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configuration.c b/configuration.c index f9ec3b0ddd2c..fe227579d793 100644 --- a/configuration.c +++ b/configuration.c @@ -6105,7 +6105,7 @@ bool input_remapping_save_file(const char *path) fill_pathname_join_delim(sensor_ident, s1, sensor_strings[j], '_', sizeof(sensor_ident)); fill_pathname_join_delim(sensor_ident_flip, s1, - sensor_flip_strings[j], '_', sizeof(sensor_ident_flip)); + sensor_strings_flip[j], '_', sizeof(sensor_ident_flip)); #if 0 /* Only save modified button values */ if (remap_id == j) From 6a91a2c24fc4053de164f847f09c02ce7c93fbc1 Mon Sep 17 00:00:00 2001 From: oshaboy Date: Mon, 15 Apr 2024 17:09:16 +0300 Subject: [PATCH 21/50] Update configuration.c --- configuration.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/configuration.c b/configuration.c index fe227579d793..45c2ac44da3b 100644 --- a/configuration.c +++ b/configuration.c @@ -6098,27 +6098,31 @@ bool input_remapping_save_file(const char *path) strlcpy(s1 + _len, formatted_number, sizeof(s1) - _len); config_set_int(conf, s1, settings->uints.input_remap_ports[i]); for (j = 0; j < RETRO_SENSOR_MAX; j++){ - int sensor_remap = -1; - bool sensor_flip_remap=false; char sensor_ident[128]; char sensor_ident_flip[128]; + unsigned sensor_remap = settings->uints.input_sensor_ids[i][j]; + fill_pathname_join_delim(sensor_ident, s1, sensor_strings[j], '_', sizeof(sensor_ident)); fill_pathname_join_delim(sensor_ident_flip, s1, sensor_strings_flip[j], '_', sizeof(sensor_ident_flip)); - #if 0 - /* Only save modified button values */ - if (remap_id == j) + + if (sensor_remap == j) config_unset(conf, sensor_ident); else { - if (remap_id == RARCH_UNMAPPED) + if (sensor_remap == RARCH_UNMAPPED) config_set_int(conf, sensor_ident, -1); else config_set_int(conf, sensor_ident, settings->uints.input_sensor_ids[i][j]); } - #endif + /* + configuration_set_bool(conf, + settings->bools.input_sensor_flip_axis[i][j], + settings->bools.input_sensor_flip_axis[i][j] + ); + */ } } From aef300916d17ae872671c4c9dfbe167a2bae2dfd Mon Sep 17 00:00:00 2001 From: oshaboy Date: Tue, 23 Apr 2024 00:38:45 +0300 Subject: [PATCH 22/50] Gave up on menu settings --- menu/menu_setting.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/menu/menu_setting.c b/menu/menu_setting.c index 03fac53a9ea2..0c3f3c5ebfb3 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -9460,6 +9460,10 @@ static bool setting_append_list_input_player_options( (*list)[list_info->index - 1].get_string_representation = &get_string_representation_input_mouse_index; menu_settings_list_current_add_range(list, list_info, 0, MAX_INPUT_DEVICES - 1, 1.0, true, true); + + /* Preliminary code for the menu. + * I never got it working so I will let someone else do it */ + /* MENU_SETTINGS_LIST_CURRENT_ADD_ENUM_IDX_PTR(list, list_info, (enum msg_hash_enums)(MENU_ENUM_LABEL_INPUT_MOUSE_INDEX + user)); CONFIG_UINT_ALT( @@ -9481,7 +9485,7 @@ static bool setting_append_list_input_player_options( menu_settings_list_current_add_range(list, list_info, 0, MAX_INPUT_DEVICES - 1, 1.0, true, true); MENU_SETTINGS_LIST_CURRENT_ADD_ENUM_IDX_PTR(list, list_info, (enum msg_hash_enums)(MENU_ENUM_LABEL_INPUT_SENSOR_INDEX + user)); - + */ CONFIG_ACTION_ALT( list, list_info, bind_all[user], From a4c6880334a0a46c86a98b7ae679316ecdc52c15 Mon Sep 17 00:00:00 2001 From: oshaboy Date: Tue, 23 Apr 2024 01:08:37 +0300 Subject: [PATCH 23/50] I commented out the wrong thing --- menu/menu_setting.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/menu/menu_setting.c b/menu/menu_setting.c index 0c3f3c5ebfb3..54c8df7a6d25 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -9461,9 +9461,7 @@ static bool setting_append_list_input_player_options( &get_string_representation_input_mouse_index; menu_settings_list_current_add_range(list, list_info, 0, MAX_INPUT_DEVICES - 1, 1.0, true, true); - /* Preliminary code for the menu. - * I never got it working so I will let someone else do it */ - /* + MENU_SETTINGS_LIST_CURRENT_ADD_ENUM_IDX_PTR(list, list_info, (enum msg_hash_enums)(MENU_ENUM_LABEL_INPUT_MOUSE_INDEX + user)); CONFIG_UINT_ALT( @@ -9485,7 +9483,7 @@ static bool setting_append_list_input_player_options( menu_settings_list_current_add_range(list, list_info, 0, MAX_INPUT_DEVICES - 1, 1.0, true, true); MENU_SETTINGS_LIST_CURRENT_ADD_ENUM_IDX_PTR(list, list_info, (enum msg_hash_enums)(MENU_ENUM_LABEL_INPUT_SENSOR_INDEX + user)); - */ + CONFIG_ACTION_ALT( list, list_info, bind_all[user], From db24c1edd4cfc1560051734e9d43cb5bd50ab036 Mon Sep 17 00:00:00 2001 From: oshaboy Date: Thu, 30 May 2024 22:34:43 +0300 Subject: [PATCH 24/50] Made sensor remapping work for all drivers. --- input/drivers/sdl_input.c | 13 +++++-------- input/drivers/udev_input.c | 6 ++---- input/input_driver.c | 3 ++- 3 files changed, 9 insertions(+), 13 deletions(-) diff --git a/input/drivers/sdl_input.c b/input/drivers/sdl_input.c index 0bbcc87b510c..7652ff0ce708 100644 --- a/input/drivers/sdl_input.c +++ b/input/drivers/sdl_input.c @@ -653,12 +653,12 @@ static bool sdl_input_set_sensor_state (void *data, unsigned port, enum retro_se } static float sdl_input_get_sensor_input (void *data, unsigned port, unsigned id) { sdl_input_t * sdl = (sdl_input_t *)data; - SDL_GameController * gamepad=NULL; SDL_Sensor * sensor=NULL; SDL_SensorType sensor_type; int i; float sensor_data[3],sensor_value; + if ((id == RETRO_SENSOR_ACCELEROMETER_X) | (id == RETRO_SENSOR_ACCELEROMETER_Y) | (id == RETRO_SENSOR_ACCELEROMETER_Z) @@ -714,15 +714,12 @@ static float sdl_input_get_sensor_input (void *data, unsigned port, unsigned id) RARCH_DBG( "[udev] sensor:\n" "\t%f\n" - /* "\t%d\n" - "\t%d\n" - */ - "\t%f\n", + "\t%d\n", sensor_value, - /*limits.min, - limits.max,*/ - sensor_value + port, + id + ); return sensor_value; diff --git a/input/drivers/udev_input.c b/input/drivers/udev_input.c index ef24f47b5aa6..d306f31332c7 100644 --- a/input/drivers/udev_input.c +++ b/input/drivers/udev_input.c @@ -758,7 +758,6 @@ static udev_input_device_t *udev_get_pointer_device( static udev_input_device_t *udev_get_sensor_device( const struct udev_input *udev, unsigned port) { - unsigned sensor_index = 0; int dev_index = -1; settings_t *settings = config_get_ptr(); @@ -766,9 +765,8 @@ static udev_input_device_t *udev_get_sensor_device( if (port >= MAX_USERS || !video_driver_has_focus()) return NULL; - sensor_index = settings->uints.input_sensor_index[port]; - if (sensor_index < MAX_INPUT_DEVICES) - dev_index = udev->sensors[sensor_index]; + if (port < MAX_INPUT_DEVICES) + dev_index = udev->sensors[port]; if (dev_index < 0) return NULL; else if(udev->devices[dev_index]->type == UDEV_INPUT_SENSOR) diff --git a/input/input_driver.c b/input/input_driver.c index 81d3adbb7bcc..27d1767ceaef 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -4309,7 +4309,8 @@ float input_get_sensor_state(unsigned port, unsigned id) sensitivity=settings->floats.input_sensor_gyroscope_sensitivity; else sensitivity=1.f; - return input_driver_get_sensor(port, input_sensors_enable, id)*((float)pow(2,sensitivity)); + int remapped_port=settings->uints.input_sensor_index[port]; + return input_driver_get_sensor(remapped_port, input_sensors_enable, id)*((float)pow(2,sensitivity)); } /** From 0da83e8eb42f6c6a3d9b4b596cb56f91d0e6fa2f Mon Sep 17 00:00:00 2001 From: oshaboy Date: Thu, 30 May 2024 23:01:51 +0300 Subject: [PATCH 25/50] C89 is bleh. --- input/input_driver.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/input/input_driver.c b/input/input_driver.c index 27d1767ceaef..980115602b7f 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -4302,6 +4302,7 @@ float input_get_sensor_state(unsigned port, unsigned id) settings_t *settings = config_get_ptr(); bool input_sensors_enable = settings->bools.input_sensors_enable; float sensitivity; + int remapped_port=settings->uints.input_sensor_index[port]; if (id >= RETRO_SENSOR_ACCELEROMETER_X && id <= RETRO_SENSOR_ACCELEROMETER_Z) sensitivity=settings->floats.input_sensor_accelerometer_sensitivity; @@ -4309,7 +4310,6 @@ float input_get_sensor_state(unsigned port, unsigned id) sensitivity=settings->floats.input_sensor_gyroscope_sensitivity; else sensitivity=1.f; - int remapped_port=settings->uints.input_sensor_index[port]; return input_driver_get_sensor(remapped_port, input_sensors_enable, id)*((float)pow(2,sensitivity)); } From 9e959cb97d18b1494cfd65f278c8d5c2c82c4dfc Mon Sep 17 00:00:00 2001 From: oshaboy <35503208+oshaboy@users.noreply.github.com> Date: Sun, 25 Aug 2024 18:35:18 +0300 Subject: [PATCH 26/50] Typo --- input/drivers/sdl_input.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/input/drivers/sdl_input.c b/input/drivers/sdl_input.c index 7652ff0ce708..4c2dc26e5443 100644 --- a/input/drivers/sdl_input.c +++ b/input/drivers/sdl_input.c @@ -693,7 +693,7 @@ static float sdl_input_get_sensor_input (void *data, unsigned port, unsigned id) } } if (!gamepad && !sensor){ - RARCH_ERR("[sdl]: sdl_input_get_sensor_input recieved a " + RARCH_ERR("[sdl]: sdl_input_get_sensor_input received a " "device where none of it's children are sensors\n"); return 0.f; } From 0a926bf1dd0f1eb0ac2ec8eae01246fd496db1d2 Mon Sep 17 00:00:00 2001 From: oshaboy <35503208+oshaboy@users.noreply.github.com> Date: Mon, 26 Aug 2024 21:55:39 +0300 Subject: [PATCH 27/50] Messed Up the merge conflict --- menu/menu_setting.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/menu/menu_setting.c b/menu/menu_setting.c index 7bda1b1f033f..5282e6505b09 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -9573,9 +9573,9 @@ static bool setting_append_list_input_player_options( snprintf(device_reserved_device[user], sizeof(device_reserved_device[user]), msg_hash_to_str(MENU_ENUM_LABEL_INPUT_DEVICE_RESERVED_DEVICE_NAME), user + 1); snprintf(mouse_index[user], sizeof(mouse_index[user]), + msg_hash_to_str(MENU_ENUM_LABEL_INPUT_MOUSE_INDEX), user + 1); snprintf(sensor_index[user], sizeof(sensor_index[user]), msg_hash_to_str(MENU_ENUM_LABEL_INPUT_SENSOR_INDEX), user + 1); - msg_hash_to_str(MENU_ENUM_LABEL_INPUT_MOUSE_INDEX), user + 1); snprintf(bind_all[user], sizeof(bind_all[user]), msg_hash_to_str(MENU_ENUM_LABEL_INPUT_BIND_ALL_INDEX), user + 1); snprintf(bind_all_save_autoconfig[user], sizeof(bind_all_save_autoconfig[user]), From 034a8aab755a0bd15e17788d782d2f4a14063bd5 Mon Sep 17 00:00:00 2001 From: oshaboy <35503208+oshaboy@users.noreply.github.com> Date: Mon, 26 Aug 2024 22:11:57 +0300 Subject: [PATCH 28/50] Update net_retropad_core.c --- cores/libretro-net-retropad/net_retropad_core.c | 1 + 1 file changed, 1 insertion(+) diff --git a/cores/libretro-net-retropad/net_retropad_core.c b/cores/libretro-net-retropad/net_retropad_core.c index 2f7108adc988..018f3ccd354c 100644 --- a/cores/libretro-net-retropad/net_retropad_core.c +++ b/cores/libretro-net-retropad/net_retropad_core.c @@ -42,6 +42,7 @@ #endif #include "remotepad.h" +#include "../../input/input_defines.h" #define DESC_NUM_PORTS(desc) ((desc)->port_max - (desc)->port_min + 1) #define DESC_NUM_INDICES(desc) ((desc)->index_max - (desc)->index_min + 1) From a34c408304f855a0dc0b191eb6e05393fe77199f Mon Sep 17 00:00:00 2001 From: oshaboy <35503208+oshaboy@users.noreply.github.com> Date: Wed, 11 Sep 2024 20:44:18 +0300 Subject: [PATCH 29/50] I accidentally the semicolon --- menu/menu_setting.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/menu/menu_setting.c b/menu/menu_setting.c index 304860355006..0d09eb30b052 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -9549,7 +9549,7 @@ static bool setting_append_list_input_player_options( */ static char buffer[MAX_USERS][13+2+1]; - static char group_label[MAX_USERS][NAME_MAX_LENGTH] + static char group_label[MAX_USERS][NAME_MAX_LENGTH]; rarch_setting_group_info_t group_info; rarch_setting_group_info_t subgroup_info; settings_t *settings = config_get_ptr(); From 585522dc7a02284c7eec96a053e3474abcab4c8f Mon Sep 17 00:00:00 2001 From: oshaboy Date: Sat, 11 Jan 2025 18:50:43 +0200 Subject: [PATCH 30/50] More Merge Conflicts --- input/drivers/sdl_input.c | 21 +++++++++++---------- input/drivers/udev_input.c | 8 +++++--- menu/menu_setting.c | 34 ++++++++++++++++++---------------- 3 files changed, 34 insertions(+), 29 deletions(-) diff --git a/input/drivers/sdl_input.c b/input/drivers/sdl_input.c index 41a980abefbb..1151b769b40b 100644 --- a/input/drivers/sdl_input.c +++ b/input/drivers/sdl_input.c @@ -728,11 +728,12 @@ static uint64_t sdl_get_capabilities(void *data) | (1 << RETRO_DEVICE_POINTER) | (1 << RETRO_DEVICE_ANALOG); } -#if SDL_SUPPORT_SENSORS + static bool sdl_input_set_sensor_state (void *data, unsigned port, enum retro_sensor_action action, unsigned rate) { return true; } static float sdl_input_get_sensor_input (void *data, unsigned port, unsigned id) { +#if SDL_SUPPORT_SENSORS sdl_input_t * sdl = (sdl_input_t *)data; SDL_GameController * gamepad=NULL; SDL_Sensor * sensor=NULL; @@ -740,7 +741,13 @@ static float sdl_input_get_sensor_input (void *data, unsigned port, unsigned id) int i; float sensor_data[3],sensor_value; - if ((id == RETRO_SENSOR_ACCELEROMETER_X) | +#endif + #ifdef __linux__ + if (id == RETRO_SENSOR_ILLUMINANCE && sdl->illuminance_sensor) + return linux_get_illuminance_reading(sdl->illuminance_sensor); + #endif +#if SDL_SUPPORT_SENSORS + else if ((id == RETRO_SENSOR_ACCELEROMETER_X) | (id == RETRO_SENSOR_ACCELEROMETER_Y) | (id == RETRO_SENSOR_ACCELEROMETER_Z) ) sensor_type=SDL_SENSOR_ACCEL; @@ -803,10 +810,9 @@ static float sdl_input_get_sensor_input (void *data, unsigned port, unsigned id) ); return sensor_value; - - -} #endif + return 0.f; +} input_driver_t input_sdl = { @@ -814,13 +820,8 @@ input_driver_t input_sdl = { sdl_input_poll, sdl_input_state, sdl_input_free, -#if SDL_SUPPORT_SENSORS sdl_input_set_sensor_state, sdl_input_get_sensor_input, -#else - sdl_set_sensor_state, - sdl_get_sensor_input, -#endif sdl_get_capabilities, #ifdef HAVE_SDL2 "sdl2", diff --git a/input/drivers/udev_input.c b/input/drivers/udev_input.c index 8010d6e20804..ce3aa6a6b9e8 100644 --- a/input/drivers/udev_input.c +++ b/input/drivers/udev_input.c @@ -4370,7 +4370,7 @@ static float udev_input_get_sensor_input(void *data, unsigned port, unsigned id) float sensor_value; udev_input_sensor_limits_t limits; - if (udev->devices == NULL) return 0.f; + if (!udev || udev->devices == NULL) return 0.f; sensor=udev_get_sensor(udev,port); if (!sensor) return 0.f; @@ -4381,7 +4381,9 @@ static float udev_input_get_sensor_input(void *data, unsigned port, unsigned id) else return 0.f; - + if (id == RETRO_SENSOR_ILLUMINANCE && udev->illuminance_sensor) + return linux_get_illuminance_reading(udev->illuminance_sensor); + RARCH_DBG( "[udev] sensor:\n" "\t%d\n" @@ -4410,7 +4412,7 @@ input_driver_t input_udev = { udev_input_poll, udev_input_state, udev_input_free, - udev_input_set_sensor_state, + udev_set_sensor_state, udev_input_get_sensor_input, udev_input_get_capabilities, "udev", diff --git a/menu/menu_setting.c b/menu/menu_setting.c index 4c1bc400dff3..26f3e2d9ca9d 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -9968,12 +9968,21 @@ static bool setting_append_list_input_player_options( { unsigned i; for (i = 0; i < RARCH_BIND_LIST_END; i++) - { + { + char label[NAME_MAX_LENGTH]; + char name[NAME_MAX_LENGTH]; + int len; const char *input_desc_btn; bool value_available=true; unsigned cur_binding = (i < RARCH_ANALOG_BIND_LIST_END) ? input_config_bind_order[i] : i; + snprintf(name, sizeof(name), "p%u_%s", user + 1, + input_config_bind_map_get_base(cur_binding)); + len=snprintf(label, sizeof(label), "%s%s%s", + buffer[user], + string_is_empty(buffer[user])?"":" ", + input_desc_btn); if (input_config_bind_map_get_meta(cur_binding)) continue; @@ -9989,16 +9998,9 @@ static bool setting_append_list_input_player_options( else value_available=false; } if (value_available || !settings->bools.input_descriptor_hide_unbound){ - char label[NAME_MAX_LENGTH]; - char name[NAME_MAX_LENGTH]; - int len; - - snprintf(name, sizeof(name), "p%u_%s", user + 1, - input_config_bind_map_get_base(cur_binding)); - len=snprintf(label, sizeof(label), "%s%s%s", - buffer[user], - string_is_empty(buffer[user])?"":" ", - input_desc_btn); + + + if (!value_available) snprintf(label+len,sizeof(label)-len, " (%s)", msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NOT_AVAILABLE)); @@ -10017,14 +10019,14 @@ static bool setting_append_list_input_player_options( (*list)[list_info->index - 1].bind_type = cur_binding + MENU_SETTINGS_BIND_BEGIN; } else - strlcpy(label + _len, + strlcpy(label + len, input_config_bind_map_get_desc(i), - sizeof(label) - _len); + sizeof(label) - len); - _len = snprintf(name, sizeof(name), "p%u_", user + 1); - strlcpy(name + _len, + len = snprintf(name, sizeof(name), "p%u_", user + 1); + strlcpy(name + len, input_config_bind_map_get_base(i), - sizeof(name) - _len); + sizeof(name) - len); CONFIG_BIND_ALT( list, list_info, From 191f9a18b9158b8c65c02fcce4ece2b54757b03d Mon Sep 17 00:00:00 2001 From: oshaboy Date: Sat, 11 Jan 2025 18:58:07 +0200 Subject: [PATCH 31/50] Update sdl_input.c --- input/drivers/sdl_input.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/input/drivers/sdl_input.c b/input/drivers/sdl_input.c index 1151b769b40b..b091a8a5de2a 100644 --- a/input/drivers/sdl_input.c +++ b/input/drivers/sdl_input.c @@ -733,8 +733,8 @@ static bool sdl_input_set_sensor_state (void *data, unsigned port, enum retro_se return true; } static float sdl_input_get_sensor_input (void *data, unsigned port, unsigned id) { -#if SDL_SUPPORT_SENSORS sdl_input_t * sdl = (sdl_input_t *)data; +#if SDL_SUPPORT_SENSORS SDL_GameController * gamepad=NULL; SDL_Sensor * sensor=NULL; SDL_SensorType sensor_type; From 09a6afa0a99c95eed96b46cc26a9baf981916fd6 Mon Sep 17 00:00:00 2001 From: oshaboy Date: Sat, 11 Jan 2025 19:43:10 +0200 Subject: [PATCH 32/50] I think it's working now but there's a bug in the light sensor code that prevents it from working. --- input/drivers/sdl_input.c | 9 +++++---- input/drivers/udev_input.c | 2 ++ 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/input/drivers/sdl_input.c b/input/drivers/sdl_input.c index b091a8a5de2a..778c62ef81a2 100644 --- a/input/drivers/sdl_input.c +++ b/input/drivers/sdl_input.c @@ -747,7 +747,7 @@ static float sdl_input_get_sensor_input (void *data, unsigned port, unsigned id) return linux_get_illuminance_reading(sdl->illuminance_sensor); #endif #if SDL_SUPPORT_SENSORS - else if ((id == RETRO_SENSOR_ACCELEROMETER_X) | + if ((id == RETRO_SENSOR_ACCELEROMETER_X) | (id == RETRO_SENSOR_ACCELEROMETER_Y) | (id == RETRO_SENSOR_ACCELEROMETER_Z) ) sensor_type=SDL_SENSOR_ACCEL; @@ -800,7 +800,7 @@ static float sdl_input_get_sensor_input (void *data, unsigned port, unsigned id) return 0.f; /*UNIMPLEMENTED*/ } RARCH_DBG( - "[udev] sensor:\n" + "[sdl] sensor:\n" "\t%f\n" "\t%d\n" "\t%d\n", @@ -810,8 +810,9 @@ static float sdl_input_get_sensor_input (void *data, unsigned port, unsigned id) ); return sensor_value; -#endif +#else return 0.f; +#endif } @@ -820,7 +821,7 @@ input_driver_t input_sdl = { sdl_input_poll, sdl_input_state, sdl_input_free, - sdl_input_set_sensor_state, + sdl_set_sensor_state, sdl_input_get_sensor_input, sdl_get_capabilities, #ifdef HAVE_SDL2 diff --git a/input/drivers/udev_input.c b/input/drivers/udev_input.c index ce3aa6a6b9e8..2ebcf8383675 100644 --- a/input/drivers/udev_input.c +++ b/input/drivers/udev_input.c @@ -4101,6 +4101,8 @@ static bool udev_set_sensor_state(void *data, unsigned port, enum retro_sensor_a /* If already disabled, then do nothing */ linux_close_illuminance_sensor(udev->illuminance_sensor); /* noop if NULL */ udev->illuminance_sensor = NULL; + case RETRO_SENSOR_GYROSCOPE_ENABLE: + case RETRO_SENSOR_ACCELEROMETER_ENABLE: case RETRO_SENSOR_GYROSCOPE_DISABLE: case RETRO_SENSOR_ACCELEROMETER_DISABLE: /** Unimplemented sensor actions that probably shouldn't fail */ From 835974ed2d0519445f5cd9abd1c165d20ca84d2c Mon Sep 17 00:00:00 2001 From: oshaboy Date: Sat, 11 Jan 2025 19:50:51 +0200 Subject: [PATCH 33/50] Whoops made a mistake. --- menu/menu_setting.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/menu/menu_setting.c b/menu/menu_setting.c index 26f3e2d9ca9d..e91aa96955c5 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -9974,9 +9974,11 @@ static bool setting_append_list_input_player_options( int len; const char *input_desc_btn; bool value_available=true; + /*default value*/ unsigned cur_binding = (i < RARCH_ANALOG_BIND_LIST_END) ? input_config_bind_order[i] : i; + input_desc_btn=input_config_bind_map_get_desc(cur_binding); snprintf(name, sizeof(name), "p%u_%s", user + 1, input_config_bind_map_get_base(cur_binding)); len=snprintf(label, sizeof(label), "%s%s%s", @@ -9986,8 +9988,6 @@ static bool setting_append_list_input_player_options( if (input_config_bind_map_get_meta(cur_binding)) continue; - /*default value*/ - input_desc_btn=input_config_bind_map_get_desc(cur_binding); if (settings->bools.input_descriptor_label_show && (cur_binding < RARCH_FIRST_META_KEY) && core_has_set_input_descriptor() From ed0e7f4a97b292ef5233e42f1ac17a29f194da6d Mon Sep 17 00:00:00 2001 From: oshaboy Date: Wed, 15 Jan 2025 23:42:32 +0200 Subject: [PATCH 34/50] Code Review --- configuration.c | 9 ++++--- configuration.h | 4 +-- input/drivers/sdl_input.c | 40 ++++++------------------------ input/drivers/udev_input.c | 7 +----- input/input_defines.h | 12 +-------- libretro-common/include/libretro.h | 13 +++++++++- 6 files changed, 30 insertions(+), 55 deletions(-) diff --git a/configuration.c b/configuration.c index f0d001e93e51..243b7e684c3f 100644 --- a/configuration.c +++ b/configuration.c @@ -3789,7 +3789,6 @@ static bool config_load_file(global_t *global, _len = old_len; _len += snprintf(prefix + _len, sizeof(prefix) - _len, "%u", i + 1); - strlcpy(prefix + _len, "_sensor_index", sizeof(prefix) - _len); CONFIG_GET_INT_BASE(conf, settings, uints.input_sensor_index[i], prefix); @@ -6030,11 +6029,13 @@ bool input_remapping_load_file(void *data, const char *path) sensor_strings_flip[j], '_', sizeof(sensor_flip_ident)); if(!config_get_int(conf, sensor_ident, &sensor_remap)) sensor_remap=RETROK_UNKNOWN; + /* configuration_set_uint(settings, settings->uints.input_sensor_ids[i][j], sensor_remap); + */ config_get_bool(conf, sensor_flip_ident, &sensor_flip_remap); - configuration_set_bool(settings, - settings->bools.input_sensor_flip_axis[i][j], sensor_flip_remap); + // configuration_set_bool(settings, + // settings->bools.input_sensor_flip_axis[i][j], sensor_flip_remap); } } @@ -6225,6 +6226,7 @@ bool input_remapping_save_file(const char *path) _len = strlcpy(s1, "input_remap_port_p", sizeof(s1)); strlcpy(s1 + _len, formatted_number, sizeof(s1) - _len); config_set_int(conf, s1, settings->uints.input_remap_ports[i]); + #if 0 for (j = 0; j < RETRO_SENSOR_MAX; j++){ char sensor_ident[128]; char sensor_ident_flip[128]; @@ -6252,6 +6254,7 @@ bool input_remapping_save_file(const char *path) ); */ } + #endif } ret = config_file_write(conf, path, true); diff --git a/configuration.h b/configuration.h index d627ddb3594d..0c448731f1ce 100644 --- a/configuration.h +++ b/configuration.h @@ -163,7 +163,7 @@ typedef struct settings unsigned input_remap_ports[MAX_USERS]; unsigned input_remap_ids[MAX_USERS][RARCH_CUSTOM_BIND_LIST_END]; unsigned input_keymapper_ids[MAX_USERS][RARCH_CUSTOM_BIND_LIST_END]; - unsigned input_sensor_ids[MAX_USERS][RETRO_SENSOR_MAX]; + //unsigned input_sensor_ids[MAX_USERS][RETRO_SENSOR_MAX]; unsigned input_remap_port_map[MAX_USERS][MAX_USERS + 1]; unsigned led_map[MAX_LEDS]; @@ -725,7 +725,7 @@ typedef struct settings bool input_touch_vmouse_trackball; bool input_touch_vmouse_gesture; #endif - bool input_sensor_flip_axis[MAX_USERS][RETRO_SENSOR_MAX]; + //bool input_sensor_flip_axis[MAX_USERS][RETRO_SENSOR_MAX]; /* Frame time counter */ bool frame_time_counter_reset_after_fastforwarding; diff --git a/input/drivers/sdl_input.c b/input/drivers/sdl_input.c index 778c62ef81a2..ade81fbfb155 100644 --- a/input/drivers/sdl_input.c +++ b/input/drivers/sdl_input.c @@ -53,7 +53,7 @@ /* TODO/FIXME - * fix game focus toggle */ -enum SDL_AUXILIARY_DEVICE_TYPE{ +enum sdl_input_auxiliary_device_type{ SDL_AUXILIARY_DEVICE_TYPE_NONE, SDL_AUXILIARY_DEVICE_TYPE_SENSOR, SDL_AUXILIARY_DEVICE_TYPE_TOUCHID, @@ -61,7 +61,7 @@ enum SDL_AUXILIARY_DEVICE_TYPE{ }; #ifdef HAVE_SDL2 #if SDL_SUPPORT_FANCY_GAMEPAD -struct game_controller_data{ +struct sdl_input_game_controller_data{ SDL_GameController * ptr; bool has_accelerometer : 1; bool has_gyro : 1; @@ -75,11 +75,11 @@ typedef struct { #endif SDL_TouchID touch_id; #if SDL_SUPPORT_FANCY_GAMEPAD - struct game_controller_data game_controller; + struct sdl_input_game_controller_data game_controller; #endif } dev; - enum SDL_AUXILIARY_DEVICE_TYPE type; -} sdl_auxiliary_device; + enum sdl_input_auxiliary_device_type type; +} sdl_input_auxiliary_device; #endif typedef struct sdl_input @@ -99,7 +99,7 @@ typedef struct sdl_input int mouse_wr; #ifdef HAVE_SDL2 unsigned auxiliary_device_number; - sdl_auxiliary_device * auxiliary_devices; + sdl_input_auxiliary_device * auxiliary_devices; #endif #ifdef __linux__ /* Light sensors aren't exposed through SDL, and they're not usually part of controllers */ @@ -148,7 +148,7 @@ static void *sdl_input_init(const char *joypad_driver) ); #endif sdl->auxiliary_device_number=0; - sdl->auxiliary_devices=malloc(sizeof(sdl_auxiliary_device)*(numJoysticks+numTouchDevices+numSensors)); + sdl->auxiliary_devices=malloc(sizeof(sdl_input_auxiliary_device)*(numJoysticks+numTouchDevices+numSensors)); for (i=0; iauxiliary_devices[sdl->auxiliary_device_number]. dev.touch_id=SDL_GetTouchDevice(i); @@ -575,28 +575,6 @@ static bool sdl_set_sensor_state(void *data, unsigned port, enum retro_sensor_ac return false; } -static float sdl_get_sensor_input(void *data, unsigned port, unsigned id) -{ - sdl_input_t *sdl = (sdl_input_t*)data; - - if (!sdl) - return 0.0f; - - switch (id) - { - case RETRO_SENSOR_ILLUMINANCE: -#ifdef __linux__ - if (sdl->illuminance_sensor) - return linux_get_illuminance_reading(sdl->illuminance_sensor); -#endif - /* Unsupported on non-Linux platforms */ - default: - break; - } - - return 0.0f; -} - #ifdef HAVE_SDL2 static void sdl2_grab_mouse(void *data, bool state) { @@ -729,9 +707,7 @@ static uint64_t sdl_get_capabilities(void *data) | (1 << RETRO_DEVICE_ANALOG); } -static bool sdl_input_set_sensor_state (void *data, unsigned port, enum retro_sensor_action action, unsigned rate) { - return true; -} + static float sdl_input_get_sensor_input (void *data, unsigned port, unsigned id) { sdl_input_t * sdl = (sdl_input_t *)data; #if SDL_SUPPORT_SENSORS diff --git a/input/drivers/udev_input.c b/input/drivers/udev_input.c index 2ebcf8383675..b1f770ec4bc3 100644 --- a/input/drivers/udev_input.c +++ b/input/drivers/udev_input.c @@ -2690,7 +2690,7 @@ static void udev_report_touch(udev_input_t *udev, udev_input_device_t *dev) /** * Function handling incoming udev events pertaining to a touch device. -udev_handle_touch * + * * @param data Data passed by the callback -> udev_input_t* * @param event Incoming event. * @param dev The source device. @@ -4361,11 +4361,6 @@ static void udev_input_grab_mouse(void *data, bool state) } -static bool udev_input_set_sensor_state (void *data, unsigned port, enum retro_sensor_action action, unsigned rate) { - /*TODO*/ - RARCH_DBG("udev_input_set_sensor_state: %d %d %d\n", port, action,rate); - return true; -} static float udev_input_get_sensor_input(void *data, unsigned port, unsigned id) { const udev_input_t *udev = (const udev_input_t *)data; const udev_input_sensor_t * sensor; diff --git a/input/input_defines.h b/input/input_defines.h index 6bf77b5e60fc..396bc9160472 100644 --- a/input/input_defines.h +++ b/input/input_defines.h @@ -244,17 +244,7 @@ enum input_turbo_default_button INPUT_TURBO_DEFAULT_BUTTON_R3, INPUT_TURBO_DEFAULT_BUTTON_LAST }; -enum RETRO_SENSOR -{ - RETRO_SENSOR_ACCELEROMETER_X, - RETRO_SENSOR_ACCELEROMETER_Y, - RETRO_SENSOR_ACCELEROMETER_Z, - RETRO_SENSOR_GYROSCOPE_X, - RETRO_SENSOR_GYROSCOPE_Y, - RETRO_SENSOR_GYROSCOPE_Z, - RETRO_SENSOR_ILLUMINANCE, - RETRO_SENSOR_MAX -}; + enum input_device_reservation_type { diff --git a/libretro-common/include/libretro.h b/libretro-common/include/libretro.h index 0b08aae88370..6fe799fbd9c8 100644 --- a/libretro-common/include/libretro.h +++ b/libretro-common/include/libretro.h @@ -7311,7 +7311,18 @@ struct retro_device_power */ int8_t percent; }; - +enum retro_sensor_selector +{ + RETRO_SENSOR_ACCELEROMETER_X, + RETRO_SENSOR_ACCELEROMETER_Y, + RETRO_SENSOR_ACCELEROMETER_Z, + RETRO_SENSOR_GYROSCOPE_X, + RETRO_SENSOR_GYROSCOPE_Y, + RETRO_SENSOR_GYROSCOPE_Z, + RETRO_SENSOR_ILLUMINANCE, + RETRO_SENSOR_MAX, + RETRO_SENSOR_SELECTOR_DUMMY=INT_MAX +}; /** @} */ /** From fc6ad33975d37a3defe27db54c09ac9fe8204749 Mon Sep 17 00:00:00 2001 From: oshaboy Date: Wed, 15 Jan 2025 23:49:23 +0200 Subject: [PATCH 35/50] I should probably add these comments back despite the fact that they're wrong --- libretro-common/include/libretro.h | 61 ++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/libretro-common/include/libretro.h b/libretro-common/include/libretro.h index 6fe799fbd9c8..cf179502b22a 100644 --- a/libretro-common/include/libretro.h +++ b/libretro-common/include/libretro.h @@ -7313,14 +7313,75 @@ struct retro_device_power }; enum retro_sensor_selector { + + /** + * Returns the device's acceleration along its local X axis minus the effect of gravity, in m/s^2. + * + * Positive values mean that the device is accelerating to the right. + * assuming the user is looking at it head-on. + */ RETRO_SENSOR_ACCELEROMETER_X, + + /** + * Returns the device's acceleration along its local Y axis minus the effect of gravity, in m/s^2. + * + * Positive values mean that the device is accelerating upwards, + * assuming the user is looking at it head-on. + */ RETRO_SENSOR_ACCELEROMETER_Y, + + /** + * Returns the the device's acceleration along its local Z axis minus the effect of gravity, in m/s^2. + * + * Positive values indicate forward acceleration towards the user, + * assuming the user is looking at the device head-on. + */ RETRO_SENSOR_ACCELEROMETER_Z, + + /** + * Returns the angular velocity of the device around its local X axis, in radians per second. + * + * Positive values indicate counter-clockwise rotation. + * + * @note A radian is about 57 degrees, and a full 360-degree rotation is 2*pi radians. + * @see https://developer.android.com/reference/android/hardware/SensorEvent#sensor.type_gyroscope + * for guidance on using this value to derive a device's orientation. + */ RETRO_SENSOR_GYROSCOPE_X, + + /** + * Returns the angular velocity of the device around its local Z axis, in radians per second. + * + * Positive values indicate counter-clockwise rotation. + * + * @note A radian is about 57 degrees, and a full 360-degree rotation is 2*pi radians. + * @see https://developer.android.com/reference/android/hardware/SensorEvent#sensor.type_gyroscope + * for guidance on using this value to derive a device's orientation. + */ RETRO_SENSOR_GYROSCOPE_Y, + + /** + * Returns the angular velocity of the device around its local Z axis, in radians per second. + * + * Positive values indicate counter-clockwise rotation. + * + * @note A radian is about 57 degrees, and a full 360-degree rotation is 2*pi radians. + * @see https://developer.android.com/reference/android/hardware/SensorEvent#sensor.type_gyroscope + * for guidance on using this value to derive a device's orientation. + */ RETRO_SENSOR_GYROSCOPE_Z, + + /** + * Returns the ambient illuminance (light intensity) of the device's environment, in lux. + * + * @see https://en.wikipedia.org/wiki/Lux for a table of common lux values. + */ RETRO_SENSOR_ILLUMINANCE, + + RETRO_SENSOR_MAX, + + /** Dummy value to ensure sizeof(enum retro_hw_context_type) == sizeof(int). Do not use. */ RETRO_SENSOR_SELECTOR_DUMMY=INT_MAX }; /** @} */ From c553cd11a8e45189a3048a0a4ef52ba2b683ccac Mon Sep 17 00:00:00 2001 From: oshaboy Date: Wed, 15 Jan 2025 23:52:00 +0200 Subject: [PATCH 36/50] C89 Comments --- configuration.c | 6 ++++-- configuration.h | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/configuration.c b/configuration.c index 243b7e684c3f..6e26a45948ed 100644 --- a/configuration.c +++ b/configuration.c @@ -6034,8 +6034,10 @@ bool input_remapping_load_file(void *data, const char *path) settings->uints.input_sensor_ids[i][j], sensor_remap); */ config_get_bool(conf, sensor_flip_ident, &sensor_flip_remap); - // configuration_set_bool(settings, - // settings->bools.input_sensor_flip_axis[i][j], sensor_flip_remap); + /* + configuration_set_bool(settings, + settings->bools.input_sensor_flip_axis[i][j], sensor_flip_remap); + */ } } diff --git a/configuration.h b/configuration.h index 0c448731f1ce..eedc78284c2a 100644 --- a/configuration.h +++ b/configuration.h @@ -163,7 +163,7 @@ typedef struct settings unsigned input_remap_ports[MAX_USERS]; unsigned input_remap_ids[MAX_USERS][RARCH_CUSTOM_BIND_LIST_END]; unsigned input_keymapper_ids[MAX_USERS][RARCH_CUSTOM_BIND_LIST_END]; - //unsigned input_sensor_ids[MAX_USERS][RETRO_SENSOR_MAX]; + /*unsigned input_sensor_ids[MAX_USERS][RETRO_SENSOR_MAX];*/ unsigned input_remap_port_map[MAX_USERS][MAX_USERS + 1]; unsigned led_map[MAX_LEDS]; @@ -725,7 +725,7 @@ typedef struct settings bool input_touch_vmouse_trackball; bool input_touch_vmouse_gesture; #endif - //bool input_sensor_flip_axis[MAX_USERS][RETRO_SENSOR_MAX]; + /*bool input_sensor_flip_axis[MAX_USERS][RETRO_SENSOR_MAX];*/ /* Frame time counter */ bool frame_time_counter_reset_after_fastforwarding; From ec6dc65227bfe5379feab69d9dbce528245a2272 Mon Sep 17 00:00:00 2001 From: oshaboy Date: Wed, 15 Jan 2025 23:55:14 +0200 Subject: [PATCH 37/50] Moved the enums to where the define originally was --- libretro-common/include/libretro.h | 143 ++++++++++++++--------------- 1 file changed, 71 insertions(+), 72 deletions(-) diff --git a/libretro-common/include/libretro.h b/libretro-common/include/libretro.h index cf179502b22a..a2bbc1350892 100644 --- a/libretro-common/include/libretro.h +++ b/libretro-common/include/libretro.h @@ -4457,8 +4457,79 @@ enum retro_sensor_action RETRO_SENSOR_DUMMY = INT_MAX }; +enum retro_sensor_selector +{ + /** + * Returns the device's acceleration along its local X axis minus the effect of gravity, in m/s^2. + * + * Positive values mean that the device is accelerating to the right. + * assuming the user is looking at it head-on. + */ + RETRO_SENSOR_ACCELEROMETER_X, + + /** + * Returns the device's acceleration along its local Y axis minus the effect of gravity, in m/s^2. + * + * Positive values mean that the device is accelerating upwards, + * assuming the user is looking at it head-on. + */ + RETRO_SENSOR_ACCELEROMETER_Y, + + /** + * Returns the the device's acceleration along its local Z axis minus the effect of gravity, in m/s^2. + * + * Positive values indicate forward acceleration towards the user, + * assuming the user is looking at the device head-on. + */ + RETRO_SENSOR_ACCELEROMETER_Z, + + /** + * Returns the angular velocity of the device around its local X axis, in radians per second. + * + * Positive values indicate counter-clockwise rotation. + * + * @note A radian is about 57 degrees, and a full 360-degree rotation is 2*pi radians. + * @see https://developer.android.com/reference/android/hardware/SensorEvent#sensor.type_gyroscope + * for guidance on using this value to derive a device's orientation. + */ + RETRO_SENSOR_GYROSCOPE_X, + + /** + * Returns the angular velocity of the device around its local Z axis, in radians per second. + * + * Positive values indicate counter-clockwise rotation. + * + * @note A radian is about 57 degrees, and a full 360-degree rotation is 2*pi radians. + * @see https://developer.android.com/reference/android/hardware/SensorEvent#sensor.type_gyroscope + * for guidance on using this value to derive a device's orientation. + */ + RETRO_SENSOR_GYROSCOPE_Y, + + /** + * Returns the angular velocity of the device around its local Z axis, in radians per second. + * + * Positive values indicate counter-clockwise rotation. + * + * @note A radian is about 57 degrees, and a full 360-degree rotation is 2*pi radians. + * @see https://developer.android.com/reference/android/hardware/SensorEvent#sensor.type_gyroscope + * for guidance on using this value to derive a device's orientation. + */ + RETRO_SENSOR_GYROSCOPE_Z, + + /** + * Returns the ambient illuminance (light intensity) of the device's environment, in lux. + * + * @see https://en.wikipedia.org/wiki/Lux for a table of common lux values. + */ + RETRO_SENSOR_ILLUMINANCE, + RETRO_SENSOR_MAX, + + /** Dummy value to ensure sizeof(enum retro_hw_context_type) == sizeof(int). Do not use. */ + RETRO_SENSOR_SELECTOR_DUMMY=INT_MAX +}; + /** * Adjusts the state of a sensor. * @@ -7311,79 +7382,7 @@ struct retro_device_power */ int8_t percent; }; -enum retro_sensor_selector -{ - - /** - * Returns the device's acceleration along its local X axis minus the effect of gravity, in m/s^2. - * - * Positive values mean that the device is accelerating to the right. - * assuming the user is looking at it head-on. - */ - RETRO_SENSOR_ACCELEROMETER_X, - - /** - * Returns the device's acceleration along its local Y axis minus the effect of gravity, in m/s^2. - * - * Positive values mean that the device is accelerating upwards, - * assuming the user is looking at it head-on. - */ - RETRO_SENSOR_ACCELEROMETER_Y, - - /** - * Returns the the device's acceleration along its local Z axis minus the effect of gravity, in m/s^2. - * - * Positive values indicate forward acceleration towards the user, - * assuming the user is looking at the device head-on. - */ - RETRO_SENSOR_ACCELEROMETER_Z, - - /** - * Returns the angular velocity of the device around its local X axis, in radians per second. - * - * Positive values indicate counter-clockwise rotation. - * - * @note A radian is about 57 degrees, and a full 360-degree rotation is 2*pi radians. - * @see https://developer.android.com/reference/android/hardware/SensorEvent#sensor.type_gyroscope - * for guidance on using this value to derive a device's orientation. - */ - RETRO_SENSOR_GYROSCOPE_X, - /** - * Returns the angular velocity of the device around its local Z axis, in radians per second. - * - * Positive values indicate counter-clockwise rotation. - * - * @note A radian is about 57 degrees, and a full 360-degree rotation is 2*pi radians. - * @see https://developer.android.com/reference/android/hardware/SensorEvent#sensor.type_gyroscope - * for guidance on using this value to derive a device's orientation. - */ - RETRO_SENSOR_GYROSCOPE_Y, - - /** - * Returns the angular velocity of the device around its local Z axis, in radians per second. - * - * Positive values indicate counter-clockwise rotation. - * - * @note A radian is about 57 degrees, and a full 360-degree rotation is 2*pi radians. - * @see https://developer.android.com/reference/android/hardware/SensorEvent#sensor.type_gyroscope - * for guidance on using this value to derive a device's orientation. - */ - RETRO_SENSOR_GYROSCOPE_Z, - - /** - * Returns the ambient illuminance (light intensity) of the device's environment, in lux. - * - * @see https://en.wikipedia.org/wiki/Lux for a table of common lux values. - */ - RETRO_SENSOR_ILLUMINANCE, - - - RETRO_SENSOR_MAX, - - /** Dummy value to ensure sizeof(enum retro_hw_context_type) == sizeof(int). Do not use. */ - RETRO_SENSOR_SELECTOR_DUMMY=INT_MAX -}; /** @} */ /** From ed36cb5a45b2de19629cf77bb59a2ea02ffff665 Mon Sep 17 00:00:00 2001 From: oshaboy Date: Thu, 16 Jan 2025 05:37:10 +0200 Subject: [PATCH 38/50] Uncommented Sensor Menu Code --- configuration.c | 42 ++++++++++++++---------------- configuration.h | 4 +-- input/input_defines.h | 10 +++++++ libretro-common/include/libretro.h | 3 --- 4 files changed, 32 insertions(+), 27 deletions(-) diff --git a/configuration.c b/configuration.c index 6e26a45948ed..f017c8ed758c 100644 --- a/configuration.c +++ b/configuration.c @@ -6005,19 +6005,19 @@ bool input_remapping_load_file(void *data, const char *path) strlcpy(s1 + _len, formatted_number, sizeof(s1) - _len); CONFIG_GET_INT_BASE(conf, settings, uints.input_remap_ports[i], s1); { - static const char * sensor_strings[RETRO_SENSOR_MAX] = + static const char * sensor_strings[RETROPAD_RETRO_SENSOR_LAST] = { "accel_x","accel_y", "accel_z", - "gyro_x","gyro_y","gyro_z", - "light" + "gyro_x","gyro_y","gyro_z" + /*,"light"*/ }; - static const char * sensor_strings_flip[RETRO_SENSOR_MAX] = + static const char * sensor_strings_flip[RETROPAD_RETRO_SENSOR_LAST] = { "accel_x_flip","accel_y_flip", "accel_z_flip", - "gyro_x_flip","gyro_y_flip","gyro_z_flip", - "light_flip" + "gyro_x_flip","gyro_y_flip","gyro_z_flip" + /*,"light_flip"*/ }; - for (j = 0; j < RETRO_SENSOR_MAX; j++){ + for (j = 0; j < RETROPAD_RETRO_SENSOR_LAST; j++){ int sensor_remap = -1; bool sensor_flip_remap = false; @@ -6029,15 +6029,15 @@ bool input_remapping_load_file(void *data, const char *path) sensor_strings_flip[j], '_', sizeof(sensor_flip_ident)); if(!config_get_int(conf, sensor_ident, &sensor_remap)) sensor_remap=RETROK_UNKNOWN; - /* + configuration_set_uint(settings, settings->uints.input_sensor_ids[i][j], sensor_remap); - */ + config_get_bool(conf, sensor_flip_ident, &sensor_flip_remap); - /* - configuration_set_bool(settings, - settings->bools.input_sensor_flip_axis[i][j], sensor_flip_remap); - */ + + configuration_set_bool(settings, + settings->bools.input_sensor_flip_axis[i][j], sensor_flip_remap); + } } @@ -6075,17 +6075,17 @@ bool input_remapping_save_file(const char *path) "l_x+", "l_x-", "l_y+", "l_y-", "r_x+", "r_x-", "r_y+", "r_y-" }; - static const char * sensor_strings[RETRO_SENSOR_MAX] = + static const char * sensor_strings[RETROPAD_RETRO_SENSOR_LAST] = { "accel_x","accel_y", "accel_z", - "gyro_x","gyro_y","gyro_z", - "light" + "gyro_x","gyro_y","gyro_z" + /*,"light" */ }; - static const char * sensor_strings_flip[RETRO_SENSOR_MAX] = + static const char * sensor_strings_flip[RETROPAD_RETRO_SENSOR_LAST] = { "accel_x_flip","accel_y_flip", "accel_z_flip", - "gyro_x_flip","gyro_y_flip","gyro_z_flip", - "light_flip" + "gyro_x_flip","gyro_y_flip","gyro_z_flip" + /*,"light_flip"*/ }; config_file_t *conf = NULL; runloop_state_t *runloop_st = runloop_state_get_ptr(); @@ -6228,8 +6228,7 @@ bool input_remapping_save_file(const char *path) _len = strlcpy(s1, "input_remap_port_p", sizeof(s1)); strlcpy(s1 + _len, formatted_number, sizeof(s1) - _len); config_set_int(conf, s1, settings->uints.input_remap_ports[i]); - #if 0 - for (j = 0; j < RETRO_SENSOR_MAX; j++){ + for (j = 0; j < RETROPAD_RETRO_SENSOR_LAST; j++){ char sensor_ident[128]; char sensor_ident_flip[128]; unsigned sensor_remap = settings->uints.input_sensor_ids[i][j]; @@ -6256,7 +6255,6 @@ bool input_remapping_save_file(const char *path) ); */ } - #endif } ret = config_file_write(conf, path, true); diff --git a/configuration.h b/configuration.h index eedc78284c2a..33cf37a6b6ad 100644 --- a/configuration.h +++ b/configuration.h @@ -163,7 +163,7 @@ typedef struct settings unsigned input_remap_ports[MAX_USERS]; unsigned input_remap_ids[MAX_USERS][RARCH_CUSTOM_BIND_LIST_END]; unsigned input_keymapper_ids[MAX_USERS][RARCH_CUSTOM_BIND_LIST_END]; - /*unsigned input_sensor_ids[MAX_USERS][RETRO_SENSOR_MAX];*/ + unsigned input_sensor_ids[MAX_USERS][RETROPAD_RETRO_SENSOR_LAST]; unsigned input_remap_port_map[MAX_USERS][MAX_USERS + 1]; unsigned led_map[MAX_LEDS]; @@ -725,7 +725,7 @@ typedef struct settings bool input_touch_vmouse_trackball; bool input_touch_vmouse_gesture; #endif - /*bool input_sensor_flip_axis[MAX_USERS][RETRO_SENSOR_MAX];*/ + bool input_sensor_flip_axis[MAX_USERS][RETROPAD_RETRO_SENSOR_LAST]; /* Frame time counter */ bool frame_time_counter_reset_after_fastforwarding; diff --git a/input/input_defines.h b/input/input_defines.h index 396bc9160472..fa0eec213f8f 100644 --- a/input/input_defines.h +++ b/input/input_defines.h @@ -254,6 +254,16 @@ enum input_device_reservation_type INPUT_DEVICE_RESERVATION_LAST }; +enum retro_sensor_retropad{ + RETROPAD_RETRO_SENSOR_ACCELEROMETER_X, + RETROPAD_RETRO_SENSOR_ACCELEROMETER_Y, + RETROPAD_RETRO_SENSOR_ACCELEROMETER_Z, + RETROPAD_RETRO_SENSOR_GYROSCOPE_X, + RETROPAD_RETRO_SENSOR_GYROSCOPE_Y, + RETROPAD_RETRO_SENSOR_GYROSCOPE_Z, + RETROPAD_RETRO_SENSOR_LAST + +}; RETRO_END_DECLS #endif diff --git a/libretro-common/include/libretro.h b/libretro-common/include/libretro.h index a2bbc1350892..6546ce23a8ff 100644 --- a/libretro-common/include/libretro.h +++ b/libretro-common/include/libretro.h @@ -4523,9 +4523,6 @@ enum retro_sensor_selector */ RETRO_SENSOR_ILLUMINANCE, - - RETRO_SENSOR_MAX, - /** Dummy value to ensure sizeof(enum retro_hw_context_type) == sizeof(int). Do not use. */ RETRO_SENSOR_SELECTOR_DUMMY=INT_MAX }; From 8b5705198b7a923dbe0264d26fb99ece57102a87 Mon Sep 17 00:00:00 2001 From: oshaboy Date: Thu, 16 Jan 2025 06:04:55 +0200 Subject: [PATCH 39/50] I don't know why past me messed with code that wasn't related. Causing every retropad binding to double --- menu/menu_setting.c | 97 +++++++++++++++++++++------------------------ 1 file changed, 46 insertions(+), 51 deletions(-) diff --git a/menu/menu_setting.c b/menu/menu_setting.c index 5f925c613b35..8ecacd7a808c 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -9906,6 +9906,7 @@ static bool setting_append_list_input_player_options( MENU_SETTINGS_LIST_CURRENT_ADD_ENUM_IDX_PTR(list, list_info, (enum msg_hash_enums)(MENU_ENUM_LABEL_INPUT_MOUSE_INDEX + user)); + /* CONFIG_UINT_ALT( list, list_info, &settings->uints.input_sensor_index[user], @@ -9925,7 +9926,7 @@ static bool setting_append_list_input_player_options( menu_settings_list_current_add_range(list, list_info, 0, MAX_INPUT_DEVICES - 1, 1.0, true, true); MENU_SETTINGS_LIST_CURRENT_ADD_ENUM_IDX_PTR(list, list_info, (enum msg_hash_enums)(MENU_ENUM_LABEL_INPUT_SENSOR_INDEX + user)); - + */ CONFIG_ACTION_ALT( list, list_info, bind_all[user], @@ -9964,69 +9965,63 @@ static bool setting_append_list_input_player_options( (*list)[list_info->index - 1].action_cancel = NULL; #endif } - - { - unsigned i; - for (i = 0; i < RARCH_BIND_LIST_END; i++) - { + { + unsigned i,j; + const char *value_na = + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NOT_AVAILABLE); + for (j = 0; j < RARCH_BIND_LIST_END; j++) + { char label[NAME_MAX_LENGTH]; char name[NAME_MAX_LENGTH]; - int len; - const char *input_desc_btn; - bool value_available=true; - /*default value*/ - unsigned cur_binding = (i < RARCH_ANALOG_BIND_LIST_END) - ? input_config_bind_order[i] - : i; - input_desc_btn=input_config_bind_map_get_desc(cur_binding); - snprintf(name, sizeof(name), "p%u_%s", user + 1, - input_config_bind_map_get_base(cur_binding)); - len=snprintf(label, sizeof(label), "%s%s%s", - buffer[user], - string_is_empty(buffer[user])?"":" ", - input_desc_btn); - if (input_config_bind_map_get_meta(cur_binding)) + size_t _len = 0; + i = (j < RARCH_ANALOG_BIND_LIST_END) + ? input_config_bind_order[j] + : j; + + if (input_config_bind_map_get_meta(i)) continue; - if (settings->bools.input_descriptor_label_show - && (cur_binding < RARCH_FIRST_META_KEY) - && core_has_set_input_descriptor() - && (cur_binding != RARCH_TURBO_ENABLE)) + name[0] = '\0'; + + if (!string_is_empty(buffer[user])) { - if (sys_info->input_desc_btn[user][cur_binding]) - input_desc_btn=sys_info->input_desc_btn[user][cur_binding]; - else value_available=false; + _len = strlcpy(label, buffer[user], sizeof(label)); + label[ _len] = ' '; + label[++_len] = '\0'; } - if (value_available || !settings->bools.input_descriptor_hide_unbound){ - - + else + label[0] = '\0'; - if (!value_available) - snprintf(label+len,sizeof(label)-len, " (%s)", - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NOT_AVAILABLE)); + if ( + settings->bools.input_descriptor_label_show + && (i < RARCH_FIRST_META_KEY) + && core_has_set_input_descriptor() + && (i != RARCH_TURBO_ENABLE) + ) + { + if (sys_info->input_desc_btn[user][i]) + strlcpy(label + _len, + sys_info->input_desc_btn[user][i], + sizeof(label) - _len); + else + { + snprintf(label, sizeof(label), "%s (%s)", + input_config_bind_map_get_desc(i), + value_na); - CONFIG_BIND_ALT( - list, list_info, - &input_config_binds[user][cur_binding], - user + 1, - user, - strdup(name), - strdup(label), - &defaults[cur_binding], - &group_info, - &subgroup_info, - parent_group); - (*list)[list_info->index - 1].bind_type = cur_binding + MENU_SETTINGS_BIND_BEGIN; + if (settings->bools.input_descriptor_hide_unbound) + continue; + } } else - strlcpy(label + len, + strlcpy(label + _len, input_config_bind_map_get_desc(i), - sizeof(label) - len); + sizeof(label) - _len); - len = snprintf(name, sizeof(name), "p%u_", user + 1); - strlcpy(name + len, + _len = snprintf(name, sizeof(name), "p%u_", user + 1); + strlcpy(name + _len, input_config_bind_map_get_base(i), - sizeof(name) - len); + sizeof(name) - _len); CONFIG_BIND_ALT( list, list_info, From e33b667d7e7c8fc636a396f062fad9f024840391 Mon Sep 17 00:00:00 2001 From: oshaboy Date: Thu, 16 Jan 2025 06:23:33 +0200 Subject: [PATCH 40/50] test labels --- menu/menu_setting.c | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/menu/menu_setting.c b/menu/menu_setting.c index 8ecacd7a808c..7a3278066ce0 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -9906,7 +9906,6 @@ static bool setting_append_list_input_player_options( MENU_SETTINGS_LIST_CURRENT_ADD_ENUM_IDX_PTR(list, list_info, (enum msg_hash_enums)(MENU_ENUM_LABEL_INPUT_MOUSE_INDEX + user)); - /* CONFIG_UINT_ALT( list, list_info, &settings->uints.input_sensor_index[user], @@ -9926,7 +9925,6 @@ static bool setting_append_list_input_player_options( menu_settings_list_current_add_range(list, list_info, 0, MAX_INPUT_DEVICES - 1, 1.0, true, true); MENU_SETTINGS_LIST_CURRENT_ADD_ENUM_IDX_PTR(list, list_info, (enum msg_hash_enums)(MENU_ENUM_LABEL_INPUT_SENSOR_INDEX + user)); - */ CONFIG_ACTION_ALT( list, list_info, bind_all[user], @@ -10036,6 +10034,26 @@ static bool setting_append_list_input_player_options( parent_group); (*list)[list_info->index - 1].bind_type = i + MENU_SETTINGS_BIND_BEGIN; } + for (j = 0; j < RETROPAD_RETRO_SENSOR_LAST; j++){ + //TODO Retro Sensor + + char label[NAME_MAX_LENGTH]; + char name[NAME_MAX_LENGTH]; + snprintf(label,NAME_MAX_LENGTH, "test label %d", j); + snprintf(name,NAME_MAX_LENGTH, "test name %d", j); + + CONFIG_BIND_ALT( + list, list_info, + &input_config_binds[user][i], + user + 1, + user, + strdup(name), + strdup(label), + &defaults[i], + &group_info, + &subgroup_info, + parent_group); + } } END_SUB_GROUP(list, list_info, parent_group); From 5563b32cc4b7e4cdf1181426a86e1c646e4930bb Mon Sep 17 00:00:00 2001 From: oshaboy Date: Fri, 17 Jan 2025 03:07:06 +0200 Subject: [PATCH 41/50] More menu stuff --- configuration.c | 11 +-- configuration.h | 1 - intl/msg_hash_lbl.h | 48 ++--------- intl/msg_hash_us.h | 37 ++------- menu/menu_setting.c | 123 ++++++++++++++++++++++++---- msg_hash.h | 24 +++--- pkg/android/phoenix-legacy/.project | 11 +++ setting_list.h | 2 + 8 files changed, 144 insertions(+), 113 deletions(-) diff --git a/configuration.c b/configuration.c index f017c8ed758c..e87e176ef3d4 100644 --- a/configuration.c +++ b/configuration.c @@ -6009,13 +6009,11 @@ bool input_remapping_load_file(void *data, const char *path) { "accel_x","accel_y", "accel_z", "gyro_x","gyro_y","gyro_z" - /*,"light"*/ }; static const char * sensor_strings_flip[RETROPAD_RETRO_SENSOR_LAST] = { "accel_x_flip","accel_y_flip", "accel_z_flip", "gyro_x_flip","gyro_y_flip","gyro_z_flip" - /*,"light_flip"*/ }; for (j = 0; j < RETROPAD_RETRO_SENSOR_LAST; j++){ @@ -6032,12 +6030,6 @@ bool input_remapping_load_file(void *data, const char *path) configuration_set_uint(settings, settings->uints.input_sensor_ids[i][j], sensor_remap); - - config_get_bool(conf, sensor_flip_ident, &sensor_flip_remap); - - configuration_set_bool(settings, - settings->bools.input_sensor_flip_axis[i][j], sensor_flip_remap); - } } @@ -6079,13 +6071,11 @@ bool input_remapping_save_file(const char *path) { "accel_x","accel_y", "accel_z", "gyro_x","gyro_y","gyro_z" - /*,"light" */ }; static const char * sensor_strings_flip[RETROPAD_RETRO_SENSOR_LAST] = { "accel_x_flip","accel_y_flip", "accel_z_flip", "gyro_x_flip","gyro_y_flip","gyro_z_flip" - /*,"light_flip"*/ }; config_file_t *conf = NULL; runloop_state_t *runloop_st = runloop_state_get_ptr(); @@ -6418,6 +6408,7 @@ uint8_t input_config_bind_map_get_retro_key(unsigned bind_index) return keybind->retro_key; } + void input_config_reset_autoconfig_binds(unsigned port) { unsigned i; diff --git a/configuration.h b/configuration.h index 33cf37a6b6ad..a2cdaf642599 100644 --- a/configuration.h +++ b/configuration.h @@ -725,7 +725,6 @@ typedef struct settings bool input_touch_vmouse_trackball; bool input_touch_vmouse_gesture; #endif - bool input_sensor_flip_axis[MAX_USERS][RETROPAD_RETRO_SENSOR_LAST]; /* Frame time counter */ bool frame_time_counter_reset_after_fastforwarding; diff --git a/intl/msg_hash_lbl.h b/intl/msg_hash_lbl.h index 2f77660ffe83..6df26945ecd5 100644 --- a/intl/msg_hash_lbl.h +++ b/intl/msg_hash_lbl.h @@ -2009,65 +2009,29 @@ MSG_HASH( "input_player%u_sensor_index" ) MSG_HASH( - MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_MAPPINGS, - "input_player%u_sensor_mappings" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_ACCELEROMETER_X, + MENU_ENUM_LABEL_INPUT_SENSOR_ACCELEROMETER_X, "input_player%u_accelerometer_x_binding" ) MSG_HASH( - MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_ACCELEROMETER_X_FLIP, - "input_player%u_accelerometer_x_flip" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_ACCELEROMETER_Y, + MENU_ENUM_LABEL_INPUT_SENSOR_ACCELEROMETER_Y, "input_player%u_accelerometer_y_binding" ) MSG_HASH( - MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_ACCELEROMETER_Y_FLIP, - "input_player%u_accelerometer_y_flip" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_ACCELEROMETER_Z, + MENU_ENUM_LABEL_INPUT_SENSOR_ACCELEROMETER_Z, "input_player%u_accelerometer_z_binding" ) MSG_HASH( - MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_ACCELEROMETER_Z_FLIP, - "input_player%u_accelerometer_z_flip" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_GYROSCOPE_X, + MENU_ENUM_LABEL_INPUT_SENSOR_GYROSCOPE_X, "input_player%u_gyroscope_x" ) MSG_HASH( - MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_GYROSCOPE_X_FLIP, - "input_player%u_gyroscope_x_flip" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_GYROSCOPE_Y, + MENU_ENUM_LABEL_INPUT_SENSOR_GYROSCOPE_Y, "input_player%u_gyroscope_y" ) MSG_HASH( - MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_GYROSCOPE_Y_FLIP, - "input_player%u_gyroscope_y_flip" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_GYROSCOPE_Z, + MENU_ENUM_LABEL_INPUT_SENSOR_GYROSCOPE_Z, "input_player%u_gyroscope_z" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_GYROSCOPE_Z_FLIP, - "input_player%u_gyroscope_z_flip" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_LIGHT, - "input_player%u_light" - ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_LIGHT_FLIP, - "input_player%u_light_flip" -) MSG_HASH( MENU_ENUM_LABEL_INPUT_JOYPAD_INDEX, "input_player%u_joypad_index" diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index c3b9b0fe7020..fc68fbb9964e 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -4371,66 +4371,39 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_INDEX, "Sensor Index" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_MAPPINGS, - "Sensor Mappings" - ) + MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_ACCELEROMETER_X, "Accelerometer X Binding" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_ACCELEROMETER_X_FLIP, - "Accelerometer X Flip" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_ACCELEROMETER_Y, "Accelerometer Y Binding" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_ACCELEROMETER_Y_FLIP, - "Accelerometer Y Flip" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_ACCELEROMETER_Z, "Accelerometer Z Binding" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_ACCELEROMETER_Z_FLIP, - "Accelerometer Z Flip" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_GYROSCOPE_X, "Gyroscope X Binding" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_GYROSCOPE_X_FLIP, - "Gyroscope X Flip" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_GYROSCOPE_Y, "Gyroscope Y Binding" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_GYROSCOPE_Y_FLIP, - "Gyroscope Y Flip" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_GYROSCOPE_Z, "Gyroscope Z Binding" ) MSG_HASH( - MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_GYROSCOPE_Z_FLIP, - "Gyroscope Z Flip" + MENU_ENUM_LABEL_INPUT_ABS_SOURCE_VALUE, + "ABS Source %u Value" ) MSG_HASH( - MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_LIGHT, - "Light Binding" + MENU_ENUM_LABEL_INPUT_ABS_SOURCE, + "ABS Source %u" ) -MSG_HASH( - MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_LIGHT_FLIP, - "Light Flip" -) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_MOUSE_INDEX, "The physical mouse as recognized by RetroArch." diff --git a/menu/menu_setting.c b/menu/menu_setting.c index 7a3278066ce0..3919f9f530d6 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -192,6 +192,10 @@ if (SETTINGS_LIST_APPEND(a, b)) \ config_float(a, b, c, d, e, f, g, h, i, j, k, l) +#define CONFIG_FLOAT_ALT(a, b, c, d, e, f, g, h, i, j, k, l) \ + if (SETTINGS_LIST_APPEND(a, b)) \ + config_float_alt(a, b, c, d, e, f, g, h, i, j, k, l) + #define CONFIG_DIR(a, b, c, d, e, f, g, h, i, j, k, l, m) \ if (SETTINGS_LIST_APPEND(a, b)) \ config_dir(a, b, c, d, e, f, g, h, i, j, k, l, m) @@ -2323,6 +2327,29 @@ static void config_float( MENU_SETTINGS_LIST_CURRENT_ADD_ENUM_VALUE_IDX(list, list_info, SHORT_enum_idx); } +static void config_float_alt( + rarch_setting_t **list, + rarch_setting_info_t *list_info, + float *target, + const char *name, const char *SHORT, + float default_value, const char *rounding, + rarch_setting_group_info_t *group_info, + rarch_setting_group_info_t *subgroup_info, + const char *parent_group, + change_handler_t change_handler, change_handler_t read_handler) +{ + (*list)[list_info->index++] = setting_float_setting( + name, + SHORT, target, default_value, rounding, + group_info->name, subgroup_info->name, parent_group, + change_handler, read_handler, false); + (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_FLOAT_SPINBOX; + /* + MENU_SETTINGS_LIST_CURRENT_ADD_ENUM_IDX_PTR(list, list_info, name_enum_idx); + MENU_SETTINGS_LIST_CURRENT_ADD_ENUM_VALUE_IDX(list, list_info, SHORT_enum_idx); + */ +} + static void config_path( rarch_setting_t **list, rarch_setting_info_t *list_info, @@ -8242,6 +8269,19 @@ setting_get_string_representation_st_float_video_refresh_rate_auto( else strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NOT_AVAILABLE), len); } +static void +setting_get_string_representation_st_float_sensor_auto( + rarch_setting_t *setting, char *s, size_t len){ + + settings_t * settings = config_get_ptr(); + int remapped_port = settings->uints.input_sensor_index[setting->index_offset]; + int sensor_poll=input_driver_get_sensor( + remapped_port,settings->bools.input_sensors_enable,setting->retropad_sensor_index); + if (settings->bools.input_sensors_enable) + snprintf(s,len,"%.0f", 100.f*sensor_poll); + else + strlcpy(s, "Disabled", len); +} #ifdef HAVE_LIBNX static void get_string_representation_split_joycon(rarch_setting_t *setting, char *s, @@ -8396,6 +8436,11 @@ static void get_string_representation_input_sensor_index( if (string_is_empty(s)) strlcpy(s, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_DISABLED), len); } +static void get_string_representation_of_abs_device( + rarch_setting_t *setting, char *s, size_t len) +{ + snprintf(s, len, msg_hash_to_str(MENU_ENUM_LABEL_INPUT_ABS_SOURCE),setting->retropad_sensor_index); +} static void read_handler_audio_rate_control_delta(rarch_setting_t *setting) { settings_t *settings = config_get_ptr(); @@ -8416,6 +8461,7 @@ static void read_handler_audio_rate_control_delta(rarch_setting_t *setting) } } + static void general_read_handler(rarch_setting_t *setting) { settings_t *settings = config_get_ptr(); @@ -10034,25 +10080,68 @@ static bool setting_append_list_input_player_options( parent_group); (*list)[list_info->index - 1].bind_type = i + MENU_SETTINGS_BIND_BEGIN; } - for (j = 0; j < RETROPAD_RETRO_SENSOR_LAST; j++){ - //TODO Retro Sensor + if (settings->bools.input_sensors_enable){ + for (j = 0; j < RETROPAD_RETRO_SENSOR_LAST; j++){ + /* TODO Retro Sensor */ - char label[NAME_MAX_LENGTH]; - char name[NAME_MAX_LENGTH]; - snprintf(label,NAME_MAX_LENGTH, "test label %d", j); - snprintf(name,NAME_MAX_LENGTH, "test name %d", j); + char label[NAME_MAX_LENGTH]; + char name[NAME_MAX_LENGTH]; + strlcpy(label, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_FIRST+j),NAME_MAX_LENGTH); + //snprintf(label,NAME_MAX_LENGTH, input_config_sensor_map_get_desc(j),user+1); + snprintf(name,NAME_MAX_LENGTH, "tmp name sensor bind %d", j); + CONFIG_UINT_ALT( + list, list_info, + &settings->uints.input_sensor_ids[user][j], + strdup(name), + strdup(label), + user, + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler); + (*list)[list_info->index - 1].index = user + 1; + (*list)[list_info->index - 1].index_offset = user; + (*list)[list_info->index - 1].retropad_sensor_index = j; + (*list)[list_info->index - 1].get_string_representation = + &get_string_representation_of_abs_device; + //(*list)[list_info->index - 1].action_ok = &setting_action_ok_uint; + //menu_settings_list_current_add_range(list, list_info, 0, RETROPAD_RETRO_SENSOR_LAST - 1, 1, true, true); + } - CONFIG_BIND_ALT( - list, list_info, - &input_config_binds[user][i], - user + 1, - user, - strdup(name), - strdup(label), - &defaults[i], - &group_info, - &subgroup_info, - parent_group); + //static float dummy[RETROPAD_RETRO_SENSOR_LAST]; + for (j = 0; j < RETROPAD_RETRO_SENSOR_LAST; j++){ + /* TODO Retro Sensor */ + char name[NAME_MAX_LENGTH]; + char label[NAME_MAX_LENGTH]; + + static float dummy[6]; + snprintf( + label, + NAME_MAX_LENGTH, + msg_hash_to_str(MENU_ENUM_LABEL_INPUT_ABS_SOURCE_VALUE), + j + ); + RARCH_DBG("label: %s\n",label); + snprintf(name,NAME_MAX_LENGTH, "tmp name sensor poll %d", j); + CONFIG_FLOAT_ALT( + list, list_info, + &dummy[j], + strdup(name), + strdup(label), + 0.f, + "%.3f", + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler); + (*list)[list_info->index - 1].index = user + 1; + (*list)[list_info->index - 1].index_offset = user; + (*list)[list_info->index - 1].retropad_sensor_index = j; + (*list)[list_info->index - 1].get_string_representation = + &setting_get_string_representation_st_float_sensor_auto; + } } } diff --git a/msg_hash.h b/msg_hash.h index faad5812a682..7b6fe35a748a 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -1169,24 +1169,26 @@ enum msg_hash_enums MENU_ENUM_LABEL_VALUE_INPUT_BIND_DEFAULT_ALL, MENU_ENUM_LABEL_VALUE_INPUT_SAVE_AUTOCONFIG, MENU_ENUM_LABEL_VALUE_INPUT_MOUSE_INDEX, - MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_INDEX, MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_MAPPINGS, - MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_ACCELEROMETER_X, - MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_ACCELEROMETER_X_FLIP, + MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_FIRST, + MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_ACCELEROMETER_X= + MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_FIRST, MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_ACCELEROMETER_Y, - MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_ACCELEROMETER_Y_FLIP, MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_ACCELEROMETER_Z, - MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_ACCELEROMETER_Z_FLIP, MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_GYROSCOPE_X, - MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_GYROSCOPE_X_FLIP, MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_GYROSCOPE_Y, - MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_GYROSCOPE_Y_FLIP, MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_GYROSCOPE_Z, - MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_GYROSCOPE_Z_FLIP, - MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_LIGHT, - MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_LIGHT_FLIP, - + MENU_ENUM_LABEL_INPUT_SENSOR_FIRST, + MENU_ENUM_LABEL_INPUT_SENSOR_ACCELEROMETER_X= + MENU_ENUM_LABEL_INPUT_SENSOR_FIRST, + MENU_ENUM_LABEL_INPUT_ABS_SOURCE, + MENU_ENUM_LABEL_INPUT_ABS_SOURCE_VALUE, + MENU_ENUM_LABEL_INPUT_SENSOR_ACCELEROMETER_Y, + MENU_ENUM_LABEL_INPUT_SENSOR_ACCELEROMETER_Z, + MENU_ENUM_LABEL_INPUT_SENSOR_GYROSCOPE_X, + MENU_ENUM_LABEL_INPUT_SENSOR_GYROSCOPE_Y, + MENU_ENUM_LABEL_INPUT_SENSOR_GYROSCOPE_Z, MENU_ENUM_LABEL_INPUT_JOYPAD_INDEX, MENU_ENUM_LABEL_VALUE_INPUT_DEVICE_RESERVED_DEVICE_NAME, MENU_ENUM_LABEL_VALUE_INPUT_DEVICE_RESERVATION_TYPE, diff --git a/pkg/android/phoenix-legacy/.project b/pkg/android/phoenix-legacy/.project index 4af1961cac4a..75f405b8b119 100644 --- a/pkg/android/phoenix-legacy/.project +++ b/pkg/android/phoenix-legacy/.project @@ -30,4 +30,15 @@ com.android.ide.eclipse.adt.AndroidNature org.eclipse.jdt.core.javanature + + + 1737004363294 + + 30 + + org.eclipse.core.resources.regexFilterMatcher + node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__ + + + diff --git a/setting_list.h b/setting_list.h index 40f467ca237c..f33b87d8454f 100644 --- a/setting_list.h +++ b/setting_list.h @@ -200,6 +200,8 @@ struct rarch_setting int16_t offset_by; uint8_t free_flags; uint8_t index; + uint8_t retropad_sensor_index; + }; RETRO_END_DECLS From 1c9951d369dd0336a0a0271f597b1a729ab9aee1 Mon Sep 17 00:00:00 2001 From: oshaboy Date: Sat, 18 Jan 2025 00:13:53 +0200 Subject: [PATCH 42/50] I got the menu kinda sorta working --- menu/menu_setting.c | 124 +++++++++++++++++++++++--------------------- msg_hash.h | 4 ++ 2 files changed, 68 insertions(+), 60 deletions(-) diff --git a/menu/menu_setting.c b/menu/menu_setting.c index 3919f9f530d6..71943b73f333 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -2342,7 +2342,7 @@ static void config_float_alt( name, SHORT, target, default_value, rounding, group_info->name, subgroup_info->name, parent_group, - change_handler, read_handler, false); + change_handler, read_handler, true); (*list)[list_info->index - 1].ui_type = ST_UI_TYPE_FLOAT_SPINBOX; /* MENU_SETTINGS_LIST_CURRENT_ADD_ENUM_IDX_PTR(list, list_info, name_enum_idx); @@ -8275,10 +8275,11 @@ setting_get_string_representation_st_float_sensor_auto( settings_t * settings = config_get_ptr(); int remapped_port = settings->uints.input_sensor_index[setting->index_offset]; - int sensor_poll=input_driver_get_sensor( + if (settings->bools.input_sensors_enable) { + float sensor_poll = input_driver_get_sensor( remapped_port,settings->bools.input_sensors_enable,setting->retropad_sensor_index); - if (settings->bools.input_sensors_enable) snprintf(s,len,"%.0f", 100.f*sensor_poll); + } else strlcpy(s, "Disabled", len); } @@ -8439,7 +8440,9 @@ static void get_string_representation_input_sensor_index( static void get_string_representation_of_abs_device( rarch_setting_t *setting, char *s, size_t len) { - snprintf(s, len, msg_hash_to_str(MENU_ENUM_LABEL_INPUT_ABS_SOURCE),setting->retropad_sensor_index); + settings_t *settings = config_get_ptr(); + unsigned index=settings->uints.input_sensor_ids[setting->index_offset][setting->retropad_sensor_index]; + snprintf(s, len, msg_hash_to_str(MENU_ENUM_LABEL_INPUT_ABS_SOURCE),index); } static void read_handler_audio_rate_control_delta(rarch_setting_t *setting) { @@ -9963,11 +9966,11 @@ static bool setting_append_list_input_player_options( parent_group, general_write_handler, general_read_handler); - (*list)[list_info->index - 1].index = user + 1; - (*list)[list_info->index - 1].index_offset = user; + (*list)[list_info->index - 1].index = user + 1; + (*list)[list_info->index - 1].index_offset = user; (*list)[list_info->index - 1].get_string_representation = &get_string_representation_input_sensor_index; - (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint; + (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint; menu_settings_list_current_add_range(list, list_info, 0, MAX_INPUT_DEVICES - 1, 1.0, true, true); MENU_SETTINGS_LIST_CURRENT_ADD_ENUM_IDX_PTR(list, list_info, (enum msg_hash_enums)(MENU_ENUM_LABEL_INPUT_SENSOR_INDEX + user)); @@ -10080,69 +10083,70 @@ static bool setting_append_list_input_player_options( parent_group); (*list)[list_info->index - 1].bind_type = i + MENU_SETTINGS_BIND_BEGIN; } - if (settings->bools.input_sensors_enable){ - for (j = 0; j < RETROPAD_RETRO_SENSOR_LAST; j++){ - /* TODO Retro Sensor */ - - char label[NAME_MAX_LENGTH]; - char name[NAME_MAX_LENGTH]; - strlcpy(label, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_FIRST+j),NAME_MAX_LENGTH); - //snprintf(label,NAME_MAX_LENGTH, input_config_sensor_map_get_desc(j),user+1); - snprintf(name,NAME_MAX_LENGTH, "tmp name sensor bind %d", j); - CONFIG_UINT_ALT( - list, list_info, - &settings->uints.input_sensor_ids[user][j], - strdup(name), - strdup(label), - user, - &group_info, - &subgroup_info, - parent_group, - general_write_handler, - general_read_handler); - (*list)[list_info->index - 1].index = user + 1; - (*list)[list_info->index - 1].index_offset = user; - (*list)[list_info->index - 1].retropad_sensor_index = j; - (*list)[list_info->index - 1].get_string_representation = - &get_string_representation_of_abs_device; - //(*list)[list_info->index - 1].action_ok = &setting_action_ok_uint; - //menu_settings_list_current_add_range(list, list_info, 0, RETROPAD_RETRO_SENSOR_LAST - 1, 1, true, true); - } + for (j = 0; j < RETROPAD_RETRO_SENSOR_LAST; j++){ - //static float dummy[RETROPAD_RETRO_SENSOR_LAST]; - for (j = 0; j < RETROPAD_RETRO_SENSOR_LAST; j++){ - /* TODO Retro Sensor */ - char name[NAME_MAX_LENGTH]; - char label[NAME_MAX_LENGTH]; - - static float dummy[6]; - snprintf( - label, - NAME_MAX_LENGTH, - msg_hash_to_str(MENU_ENUM_LABEL_INPUT_ABS_SOURCE_VALUE), - j - ); - RARCH_DBG("label: %s\n",label); - snprintf(name,NAME_MAX_LENGTH, "tmp name sensor poll %d", j); - CONFIG_FLOAT_ALT( + char label[NAME_MAX_LENGTH]; + char name[NAME_MAX_LENGTH]; + strlcpy(label, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_FIRST+j),NAME_MAX_LENGTH); + snprintf(name,NAME_MAX_LENGTH, "tmp name sensor bind %d", j); + CONFIG_UINT_ALT( list, list_info, - &dummy[j], + &settings->uints.input_sensor_ids[user][j], strdup(name), strdup(label), - 0.f, - "%.3f", + user, &group_info, &subgroup_info, parent_group, general_write_handler, general_read_handler); - (*list)[list_info->index - 1].index = user + 1; - (*list)[list_info->index - 1].index_offset = user; - (*list)[list_info->index - 1].retropad_sensor_index = j; - (*list)[list_info->index - 1].get_string_representation = - &setting_get_string_representation_st_float_sensor_auto; - } + (*list)[list_info->index - 1].index = user + 1; + (*list)[list_info->index - 1].index_offset = user; + (*list)[list_info->index - 1].retropad_sensor_index = j; + (*list)[list_info->index - 1].action_start = &setting_action_start_input_mouse_index; + (*list)[list_info->index - 1].action_left = &setting_action_left_input_mouse_index; + (*list)[list_info->index - 1].action_right = &setting_action_right_input_mouse_index; + (*list)[list_info->index - 1].action_select = &setting_action_right_input_mouse_index; + (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint; + (*list)[list_info->index - 1].get_string_representation = &get_string_representation_of_abs_device; + menu_settings_list_current_add_range(list, list_info, 0, RETROPAD_RETRO_SENSOR_LAST - 1, 1, true, true); + MENU_SETTINGS_LIST_CURRENT_ADD_ENUM_IDX_PTR(list, list_info, + (enum msg_hash_enums)(MENU_ENUM_LABEL_INPUT_SENSOR_MAPPING + j)); + } + + for (j = 0; j < RETROPAD_RETRO_SENSOR_LAST; j++){ + char name[NAME_MAX_LENGTH]; + char label[NAME_MAX_LENGTH]; + static float dummy; + snprintf( + label, + NAME_MAX_LENGTH, + msg_hash_to_str(MENU_ENUM_LABEL_INPUT_ABS_SOURCE_VALUE), + j + ); + snprintf(name,NAME_MAX_LENGTH, "tmp name sensor poll %d", j); + CONFIG_FLOAT_ALT( + list, list_info, + &dummy, + strdup(name), + strdup(label), + 0.f, + "%.3f", + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler); + (*list)[list_info->index - 1].index = user + 1; + (*list)[list_info->index - 1].index_offset = user; + (*list)[list_info->index - 1].retropad_sensor_index = j; + (*list)[list_info->index - 1].get_string_representation = + &setting_get_string_representation_st_float_sensor_auto; + MENU_SETTINGS_LIST_CURRENT_ADD_ENUM_IDX_PTR(list, list_info, + (enum msg_hash_enums)(MENU_ENUM_LABEL_INPUT_SENSOR_AUTO_DISPLAY + j)); + } + } END_SUB_GROUP(list, list_info, parent_group); diff --git a/msg_hash.h b/msg_hash.h index 7b6fe35a748a..90a9c976070f 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -887,6 +887,10 @@ enum msg_hash_enums MENU_ENUM_LABEL_INPUT_MOUSE_INDEX_LAST = MENU_ENUM_LABEL_INPUT_MOUSE_INDEX + MAX_USERS, MENU_ENUM_LABEL_INPUT_SENSOR_INDEX, MENU_ENUM_LABEL_INPUT_SENSOR_INDEX_LAST = MENU_ENUM_LABEL_INPUT_SENSOR_INDEX + MAX_USERS, + MENU_ENUM_LABEL_INPUT_SENSOR_MAPPING, + MENU_ENUM_LABEL_INPUT_SENSOR_MAPPING_LAST = MENU_ENUM_LABEL_INPUT_SENSOR_MAPPING + RETROPAD_RETRO_SENSOR_LAST, + MENU_ENUM_LABEL_INPUT_SENSOR_AUTO_DISPLAY, + MENU_ENUM_LABEL_INPUT_SENSOR_AUTO_DISPLAY_LAST = MENU_ENUM_LABEL_INPUT_SENSOR_MAPPING + RETROPAD_RETRO_SENSOR_LAST, MENU_ENUM_LABEL_INPUT_REMAP_PORT, MENU_ENUM_LABEL_INPUT_REMAP_PORT_LAST = MENU_ENUM_LABEL_INPUT_REMAP_PORT + MAX_USERS, From 9730936a9a3627241e0cf0851d5c2874bb702b46 Mon Sep 17 00:00:00 2001 From: oshaboy Date: Sat, 18 Jan 2025 01:32:13 +0200 Subject: [PATCH 43/50] Finally got the menu remap working. --- configuration.c | 26 ++------------------------ input/drivers/udev_input.c | 3 ++- input/input_driver.c | 8 +++++++- intl/msg_hash_us.h | 6 +++++- menu/menu_setting.c | 21 +++++++++++++++++---- msg_hash.h | 3 ++- 6 files changed, 35 insertions(+), 32 deletions(-) diff --git a/configuration.c b/configuration.c index e87e176ef3d4..d313a0c3776f 100644 --- a/configuration.c +++ b/configuration.c @@ -6010,21 +6010,13 @@ bool input_remapping_load_file(void *data, const char *path) "accel_x","accel_y", "accel_z", "gyro_x","gyro_y","gyro_z" }; - static const char * sensor_strings_flip[RETROPAD_RETRO_SENSOR_LAST] = - { - "accel_x_flip","accel_y_flip", "accel_z_flip", - "gyro_x_flip","gyro_y_flip","gyro_z_flip" - }; for (j = 0; j < RETROPAD_RETRO_SENSOR_LAST; j++){ int sensor_remap = -1; - bool sensor_flip_remap = false; char sensor_ident[128]; - char sensor_flip_ident[128]; fill_pathname_join_delim(sensor_ident, s1, sensor_strings[j], '_', sizeof(sensor_ident)); - fill_pathname_join_delim(sensor_flip_ident, s1, - sensor_strings_flip[j], '_', sizeof(sensor_flip_ident)); + RARCH_DBG("Sensor Ident: %s %d\n", sensor_ident,sensor_remap); if(!config_get_int(conf, sensor_ident, &sensor_remap)) sensor_remap=RETROK_UNKNOWN; @@ -6072,11 +6064,6 @@ bool input_remapping_save_file(const char *path) "accel_x","accel_y", "accel_z", "gyro_x","gyro_y","gyro_z" }; - static const char * sensor_strings_flip[RETROPAD_RETRO_SENSOR_LAST] = - { - "accel_x_flip","accel_y_flip", "accel_z_flip", - "gyro_x_flip","gyro_y_flip","gyro_z_flip" - }; config_file_t *conf = NULL; runloop_state_t *runloop_st = runloop_state_get_ptr(); settings_t *settings = config_st; @@ -6220,14 +6207,11 @@ bool input_remapping_save_file(const char *path) config_set_int(conf, s1, settings->uints.input_remap_ports[i]); for (j = 0; j < RETROPAD_RETRO_SENSOR_LAST; j++){ char sensor_ident[128]; - char sensor_ident_flip[128]; unsigned sensor_remap = settings->uints.input_sensor_ids[i][j]; fill_pathname_join_delim(sensor_ident, s1, sensor_strings[j], '_', sizeof(sensor_ident)); - fill_pathname_join_delim(sensor_ident_flip, s1, - sensor_strings_flip[j], '_', sizeof(sensor_ident_flip)); - + RARCH_DBG("sensor ident2: %s %d\n",sensor_ident,sensor_remap); if (sensor_remap == j) config_unset(conf, sensor_ident); else @@ -6238,12 +6222,6 @@ bool input_remapping_save_file(const char *path) config_set_int(conf, sensor_ident, settings->uints.input_sensor_ids[i][j]); } - /* - configuration_set_bool(conf, - settings->bools.input_sensor_flip_axis[i][j], - settings->bools.input_sensor_flip_axis[i][j] - ); - */ } } diff --git a/input/drivers/udev_input.c b/input/drivers/udev_input.c index b1f770ec4bc3..837b74c9a959 100644 --- a/input/drivers/udev_input.c +++ b/input/drivers/udev_input.c @@ -4380,7 +4380,7 @@ static float udev_input_get_sensor_input(void *data, unsigned port, unsigned id) if (id == RETRO_SENSOR_ILLUMINANCE && udev->illuminance_sensor) return linux_get_illuminance_reading(udev->illuminance_sensor); - + /* RARCH_DBG( "[udev] sensor:\n" "\t%d\n" @@ -4394,6 +4394,7 @@ static float udev_input_get_sensor_input(void *data, unsigned port, unsigned id) limits.max, (((sensor_value-limits.min)/(limits.max-limits.min))-0.5f)*2.f ); + */ return ( /*clamp it to the 0 to 1 range*/ ((sensor_value-limits.min)/(limits.max-limits.min)) diff --git a/input/input_driver.c b/input/input_driver.c index 020be1ac364f..550c4c84e139 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -4407,6 +4407,8 @@ float input_get_sensor_state(unsigned port, unsigned id) bool input_sensors_enable = settings->bools.input_sensors_enable; float sensitivity; int remapped_port=settings->uints.input_sensor_index[port]; + int invert = (settings->uints.input_sensor_ids[port][id]%2)?-1:1; + unsigned remapped_input_sensor_id = settings->uints.input_sensor_ids[port][id]/2; if (id >= RETRO_SENSOR_ACCELEROMETER_X && id <= RETRO_SENSOR_ACCELEROMETER_Z) sensitivity=settings->floats.input_sensor_accelerometer_sensitivity; @@ -4414,7 +4416,11 @@ float input_get_sensor_state(unsigned port, unsigned id) sensitivity=settings->floats.input_sensor_gyroscope_sensitivity; else sensitivity=1.f; - return input_driver_get_sensor(remapped_port, input_sensors_enable, id)*((float)pow(2,sensitivity)); + return input_driver_get_sensor( + remapped_port, + input_sensors_enable, + remapped_input_sensor_id) + *invert*((float)pow(2,sensitivity)); } /** diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index fc68fbb9964e..619a31c9519e 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -4397,13 +4397,17 @@ MSG_HASH( "Gyroscope Z Binding" ) MSG_HASH( - MENU_ENUM_LABEL_INPUT_ABS_SOURCE_VALUE, + MENU_ENUM_LABEL_INPUT_ABS_SOURCE_AUTO, "ABS Source %u Value" ) MSG_HASH( MENU_ENUM_LABEL_INPUT_ABS_SOURCE, "ABS Source %u" ) +MSG_HASH( + MENU_ENUM_LABEL_INPUT_ABS_SOURCE_INVERTED, + "ABS Source %u Inverted" + ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_MOUSE_INDEX, "The physical mouse as recognized by RetroArch." diff --git a/menu/menu_setting.c b/menu/menu_setting.c index 71943b73f333..9807c4791200 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -8441,8 +8441,21 @@ static void get_string_representation_of_abs_device( rarch_setting_t *setting, char *s, size_t len) { settings_t *settings = config_get_ptr(); - unsigned index=settings->uints.input_sensor_ids[setting->index_offset][setting->retropad_sensor_index]; - snprintf(s, len, msg_hash_to_str(MENU_ENUM_LABEL_INPUT_ABS_SOURCE),index); + unsigned index=settings->uints.input_sensor_ids + [setting->index_offset] + [setting->retropad_sensor_index]; + + + snprintf( + s,len, + msg_hash_to_str( + (index%2)?MENU_ENUM_LABEL_INPUT_ABS_SOURCE_INVERTED:MENU_ENUM_LABEL_INPUT_ABS_SOURCE + ), + index/2 + ); + + + } static void read_handler_audio_rate_control_delta(rarch_setting_t *setting) { @@ -10109,7 +10122,7 @@ static bool setting_append_list_input_player_options( (*list)[list_info->index - 1].action_select = &setting_action_right_input_mouse_index; (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint; (*list)[list_info->index - 1].get_string_representation = &get_string_representation_of_abs_device; - menu_settings_list_current_add_range(list, list_info, 0, RETROPAD_RETRO_SENSOR_LAST - 1, 1, true, true); + menu_settings_list_current_add_range(list, list_info, 0, (RETROPAD_RETRO_SENSOR_LAST*2) - 1, 1, true, true); MENU_SETTINGS_LIST_CURRENT_ADD_ENUM_IDX_PTR(list, list_info, (enum msg_hash_enums)(MENU_ENUM_LABEL_INPUT_SENSOR_MAPPING + j)); } @@ -10121,7 +10134,7 @@ static bool setting_append_list_input_player_options( snprintf( label, NAME_MAX_LENGTH, - msg_hash_to_str(MENU_ENUM_LABEL_INPUT_ABS_SOURCE_VALUE), + msg_hash_to_str(MENU_ENUM_LABEL_INPUT_ABS_SOURCE_AUTO), j ); snprintf(name,NAME_MAX_LENGTH, "tmp name sensor poll %d", j); diff --git a/msg_hash.h b/msg_hash.h index 90a9c976070f..6635371f1c0a 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -1187,7 +1187,8 @@ enum msg_hash_enums MENU_ENUM_LABEL_INPUT_SENSOR_ACCELEROMETER_X= MENU_ENUM_LABEL_INPUT_SENSOR_FIRST, MENU_ENUM_LABEL_INPUT_ABS_SOURCE, - MENU_ENUM_LABEL_INPUT_ABS_SOURCE_VALUE, + MENU_ENUM_LABEL_INPUT_ABS_SOURCE_INVERTED, + MENU_ENUM_LABEL_INPUT_ABS_SOURCE_AUTO, MENU_ENUM_LABEL_INPUT_SENSOR_ACCELEROMETER_Y, MENU_ENUM_LABEL_INPUT_SENSOR_ACCELEROMETER_Z, MENU_ENUM_LABEL_INPUT_SENSOR_GYROSCOPE_X, From 6f726206391d59193be1c4637f7e22db24fb96d3 Mon Sep 17 00:00:00 2001 From: oshaboy Date: Mon, 20 Jan 2025 01:32:21 +0200 Subject: [PATCH 44/50] autoconfig --- configuration.c | 82 ++++++++++++++++++++++++++++++++------ configuration.h | 5 ++- input/drivers/udev_input.c | 12 ++---- input/input_types.h | 2 +- menu/menu_setting.c | 23 ++++++----- 5 files changed, 91 insertions(+), 33 deletions(-) diff --git a/configuration.c b/configuration.c index d313a0c3776f..2cfbe75f6bfa 100644 --- a/configuration.c +++ b/configuration.c @@ -2299,7 +2299,7 @@ static struct config_float_setting *populate_settings_float( SETTING_FLOAT("input_axis_threshold", &settings->floats.input_axis_threshold, true, DEFAULT_AXIS_THRESHOLD, false); SETTING_FLOAT("input_analog_deadzone", &settings->floats.input_analog_deadzone, true, DEFAULT_ANALOG_DEADZONE, false); SETTING_FLOAT("input_analog_sensitivity", &settings->floats.input_analog_sensitivity, true, DEFAULT_ANALOG_SENSITIVITY, false); - SETTING_FLOAT("input_sensor_accelerometer_sensitivity", &settings->floats.input_sensor_accelerometer_sensitivity, true, DEFAULT_SENSOR_ACCELEROMETER_SENSITIVITY, false); + SETTING_FLOAT("input_sensor_accelerometer_sensitivity",&settings->floats.input_sensor_accelerometer_sensitivity, true, DEFAULT_SENSOR_ACCELEROMETER_SENSITIVITY, false); SETTING_FLOAT("input_sensor_gyroscope_sensitivity", &settings->floats.input_sensor_gyroscope_sensitivity, true, DEFAULT_SENSOR_GYROSCOPE_SENSITIVITY, false); #ifdef HAVE_OVERLAY SETTING_FLOAT("input_overlay_opacity", &settings->floats.input_overlay_opacity, true, DEFAULT_INPUT_OVERLAY_OPACITY, false); @@ -4873,7 +4873,6 @@ static void save_keybind_axis(config_file_t *conf, config_set_string(conf, key, config); } } - static void save_keybind_mbutton(config_file_t *conf, const char *prefix, const char *base, @@ -4949,7 +4948,18 @@ const char *input_config_get_prefix(unsigned user, bool meta) } return bind_user_prefix[user]; } - +static bool get_config_name_for_sensor(char * buf,size_t buf_len, unsigned sensor){ + const char * sensor_str; + char direction; + + if (sensor >= 6) return false; + sensor_str=sensor>=3?"gyroscope":"accelerometer"; + direction="xyzxyz"[sensor]; + snprintf(buf, buf_len,"input_sensor_%s_%c", + sensor_str, direction + ); + return true; +} /** * input_config_save_keybinds_user: * @conf : pointer to config file object @@ -4984,7 +4994,6 @@ static void input_config_save_keybinds_user(config_file_t *conf, unsigned user) config_set_string(conf, key, btn); save_keybind_joykey (conf, prefix, base, bind, true); - save_keybind_axis (conf, prefix, base, bind, true); save_keybind_mbutton(conf, prefix, base, bind, true); } } @@ -5034,7 +5043,6 @@ static void input_config_save_keybinds_user_override(config_file_t *conf, save_keybind_axis (conf, prefix, base, override_bind, true); if (bind->mbutton != override_bind->mbutton) save_keybind_mbutton(conf, prefix, base, override_bind, true); - RARCH_DBG("[Overrides]: %s = \"%s\"\n", key, btn); } } @@ -5184,7 +5192,23 @@ bool config_save_autoconf_profile(const char *device_name, unsigned user) bind, false); } } - + for (i = 0; iuints.input_sensor_ids[user][i]; + snprintf(new_bind_str,16, + "%u%s", + new_bind/2, + (new_bind%2)?"inv":"" + ); + get_config_name_for_sensor(sensor_str, sizeof(sensor_str),i); + config_set_string(conf, + sensor_str, + new_bind_str + ); + } RARCH_LOG("[Autoconf]: Writing autoconf file for device \"%s\" to \"%s\".\n", device_name, autoconf_file); ret = config_file_write(conf, autoconf_file, false); @@ -5903,7 +5927,7 @@ bool input_remapping_load_file(void *data, const char *path) "up", "down", "left", "right", "a", "x", "l", "r", "l2", "r2", "l3", "r3", "l_x+", "l_x-", "l_y+", "l_y-", "r_x+", "r_x-", "r_y+", "r_y-" }; - + if ( !conf || string_is_empty(path)) return false; @@ -6069,9 +6093,9 @@ bool input_remapping_save_file(const char *path) settings_t *settings = config_st; unsigned max_users = settings->uints.input_max_users; + if (string_is_empty(path)) return false; - /* Create output directory, if required */ fill_pathname_parent_dir(remap_file_dir, path, sizeof(remap_file_dir)); @@ -6211,7 +6235,6 @@ bool input_remapping_save_file(const char *path) fill_pathname_join_delim(sensor_ident, s1, sensor_strings[j], '_', sizeof(sensor_ident)); - RARCH_DBG("sensor ident2: %s %d\n",sensor_ident,sensor_remap); if (sensor_remap == j) config_unset(conf, sensor_ident); else @@ -6220,7 +6243,7 @@ bool input_remapping_save_file(const char *path) config_set_int(conf, sensor_ident, -1); else config_set_int(conf, sensor_ident, - settings->uints.input_sensor_ids[i][j]); + settings->uints.input_sensor_ids[i][j]); } } } @@ -6418,13 +6441,11 @@ void input_config_set_autoconfig_binds(unsigned port, void *data) unsigned i; config_file_t *config = (config_file_t*)data; struct retro_keybind *binds = NULL; - if ( (port >= MAX_USERS) || !config) return; binds = input_autoconf_binds[port]; - for (i = 0; i < RARCH_BIND_LIST_END; i++) { const struct input_bind_map *keybind = @@ -6439,6 +6460,16 @@ void input_config_set_autoconfig_binds(unsigned port, void *data) input_config_parse_joy_axis (str, config, "input", base, &binds[i]); } } + for (i = 0; i < RETROPAD_RETRO_SENSOR_LAST; i++){ + /* I am the implementor I get to choose the implementation details */ + char str[256]; + unsigned bind; + + get_config_name_for_sensor(str, sizeof(str), i); + bind=input_config_parse_sensor (i,str, config); + RARCH_DBG("binding %d->%d\n",i,bind); + config_get_ptr()->uints.input_sensor_ids[port][i]=bind; + } } void input_config_parse_mouse_button( @@ -6657,7 +6688,34 @@ void input_config_parse_joy_button( bind->joykey_label = strdup(tmp_a->value); } } +unsigned input_config_parse_sensor( + unsigned id, + char *s, + void *conf_data) +{ + char tmp[64]; + char sensor_label[64]; + config_file_t *conf = (config_file_t*)conf_data; + struct config_entry_list *tmp_a = NULL; + + tmp[0] = '\0'; + fill_pathname_join_delim(sensor_label, s, + "label", '_', sizeof(sensor_label)); + RARCH_DBG("%s %s\n",s,conf->path); + if (config_get_array(conf, s, tmp, sizeof(tmp))) + { + if (strcmp(tmp, "nul") != 0){ + RARCH_DBG("tail=%s\n", tmp+1); + if (strcmp(tmp+1,"inv") == 0) + return (((*tmp)-0x30)*2)+1; + else if (tmp[1] == '\0') + return ((*tmp)-0x30)*2; + + } + } + return id*2; +} void retroarch_config_deinit(void) { if (config_st) diff --git a/configuration.h b/configuration.h index a2cdaf642599..6c6c49c7f905 100644 --- a/configuration.h +++ b/configuration.h @@ -1345,7 +1345,10 @@ void input_config_parse_mouse_button( char *s, void *conf_data, const char *prefix, const char *btn, void *bind_data); - +unsigned input_config_parse_sensor( + unsigned id, + char *s, + void *conf_data); const char *input_config_get_prefix(unsigned user, bool meta); RETRO_END_DECLS diff --git a/input/drivers/udev_input.c b/input/drivers/udev_input.c index 837b74c9a959..d534bb1d61cc 100644 --- a/input/drivers/udev_input.c +++ b/input/drivers/udev_input.c @@ -4380,21 +4380,17 @@ static float udev_input_get_sensor_input(void *data, unsigned port, unsigned id) if (id == RETRO_SENSOR_ILLUMINANCE && udev->illuminance_sensor) return linux_get_illuminance_reading(udev->illuminance_sensor); - /* + RARCH_DBG( "[udev] sensor:\n" "\t%d\n" - "\t%f\n" - "\t%d\n" "\t%d\n" "\t%f\n", id, - sensor_value, - limits.min, - limits.max, - (((sensor_value-limits.min)/(limits.max-limits.min))-0.5f)*2.f + port, + sensor_value ); - */ + return ( /*clamp it to the 0 to 1 range*/ ((sensor_value-limits.min)/(limits.max-limits.min)) diff --git a/input/input_types.h b/input/input_types.h index 301d6d684258..c247396d342b 100644 --- a/input/input_types.h +++ b/input/input_types.h @@ -92,7 +92,7 @@ struct retro_keybind /* Determines whether or not the binding is valid. */ bool valid; }; - +typedef uint8_t retro_sensor_bind; typedef struct retro_keybind retro_keybind_set[RARCH_BIND_LIST_END]; typedef struct diff --git a/menu/menu_setting.c b/menu/menu_setting.c index 9807c4791200..083804e16b03 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -10101,18 +10101,19 @@ static bool setting_append_list_input_player_options( char label[NAME_MAX_LENGTH]; char name[NAME_MAX_LENGTH]; strlcpy(label, msg_hash_to_str(MENU_ENUM_LABEL_VALUE_INPUT_SENSOR_FIRST+j),NAME_MAX_LENGTH); - snprintf(name,NAME_MAX_LENGTH, "tmp name sensor bind %d", j); + snprintf(name,NAME_MAX_LENGTH, + "tmp name sensor bind %d", j); CONFIG_UINT_ALT( - list, list_info, - &settings->uints.input_sensor_ids[user][j], - strdup(name), - strdup(label), - user, - &group_info, - &subgroup_info, - parent_group, - general_write_handler, - general_read_handler); + list, list_info, + &settings->uints.input_sensor_ids[user][j], + strdup(name), + strdup(label), + user, + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler); (*list)[list_info->index - 1].index = user + 1; (*list)[list_info->index - 1].index_offset = user; (*list)[list_info->index - 1].retropad_sensor_index = j; From 23d7b75b0efe4370a3eccb654bf4d54bb046b8e5 Mon Sep 17 00:00:00 2001 From: oshaboy Date: Mon, 20 Jan 2025 01:43:26 +0200 Subject: [PATCH 45/50] removed debug stuff --- configuration.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/configuration.c b/configuration.c index 2cfbe75f6bfa..29ed6b2a4cb7 100644 --- a/configuration.c +++ b/configuration.c @@ -6702,16 +6702,13 @@ unsigned input_config_parse_sensor( fill_pathname_join_delim(sensor_label, s, "label", '_', sizeof(sensor_label)); - RARCH_DBG("%s %s\n",s,conf->path); if (config_get_array(conf, s, tmp, sizeof(tmp))) { if (strcmp(tmp, "nul") != 0){ - RARCH_DBG("tail=%s\n", tmp+1); if (strcmp(tmp+1,"inv") == 0) return (((*tmp)-0x30)*2)+1; else if (tmp[1] == '\0') return ((*tmp)-0x30)*2; - } } return id*2; From a65e2fc661dfe73cd540f618e9af7314a6a0dd9f Mon Sep 17 00:00:00 2001 From: oshaboy Date: Mon, 20 Jan 2025 01:55:39 +0200 Subject: [PATCH 46/50] I'm giving up on the wiimote That seems like it should be a linux userspace driver issue not a libretro thing. --- configuration.c | 1 - input/drivers/udev_input.c | 9 ++------- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/configuration.c b/configuration.c index 29ed6b2a4cb7..0e9207eb3896 100644 --- a/configuration.c +++ b/configuration.c @@ -6467,7 +6467,6 @@ void input_config_set_autoconfig_binds(unsigned port, void *data) get_config_name_for_sensor(str, sizeof(str), i); bind=input_config_parse_sensor (i,str, config); - RARCH_DBG("binding %d->%d\n",i,bind); config_get_ptr()->uints.input_sensor_ids[port][i]=bind; } } diff --git a/input/drivers/udev_input.c b/input/drivers/udev_input.c index d534bb1d61cc..3aa23888a7a2 100644 --- a/input/drivers/udev_input.c +++ b/input/drivers/udev_input.c @@ -588,10 +588,7 @@ typedef struct udev_input_device udev_input_touch_t _touch; /* State tracking for touch-type devices */ #endif } _mouse; - struct { - udev_input_sensor_t _sensor; - struct udev_input_device * _wii_motion_plus; - } _sensor; + udev_input_sensor_t _sensor; } _u; enum udev_input_dev_type type; /* Type of this device */ char devnode[NAME_MAX_LENGTH]; /* Device node path */ @@ -600,8 +597,7 @@ typedef struct udev_input_device #define mouse_state _u._mouse._mouse #define touch_state _u._mouse._touch -#define sensor_state _u._sensor._sensor -#define wii_motion_plus_state _u._sensor._wii_motion_plus +#define sensor_state _u._sensor typedef void (*device_handle_cb)(void *data, const struct input_event *event, udev_input_device_t *dev); @@ -3227,7 +3223,6 @@ static void udev_init_sensor_dev(udev_input_device_t *dev) int ret,i; struct input_absinfo abs_info; - dev->wii_motion_plus_state=NULL; RARCH_DBG("[udev] Initializing sensor device \"%s\"\n", dev->ident); for (i=ABS_X ; i<=ABS_RZ; i++){ ret = ioctl(dev->fd, EVIOCGABS(i), &abs_info); From 7382561abebcaa907a364742680b4e8d66da93b4 Mon Sep 17 00:00:00 2001 From: oshaboy Date: Mon, 20 Jan 2025 02:00:28 +0200 Subject: [PATCH 47/50] I did not mean to remove that line --- configuration.c | 1 + 1 file changed, 1 insertion(+) diff --git a/configuration.c b/configuration.c index 0e9207eb3896..6908dbc3f5ce 100644 --- a/configuration.c +++ b/configuration.c @@ -4994,6 +4994,7 @@ static void input_config_save_keybinds_user(config_file_t *conf, unsigned user) config_set_string(conf, key, btn); save_keybind_joykey (conf, prefix, base, bind, true); + save_keybind_axis (conf, prefix, base, bind, true); save_keybind_mbutton(conf, prefix, base, bind, true); } } From 20e3839871c0864998d5fb07e265b9316aa039c4 Mon Sep 17 00:00:00 2001 From: oshaboy Date: Mon, 20 Jan 2025 02:05:08 +0200 Subject: [PATCH 48/50] Forgot to add this check to the config file. --- configuration.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/configuration.c b/configuration.c index 6908dbc3f5ce..4bbb7edbfb59 100644 --- a/configuration.c +++ b/configuration.c @@ -6705,10 +6705,12 @@ unsigned input_config_parse_sensor( if (config_get_array(conf, s, tmp, sizeof(tmp))) { if (strcmp(tmp, "nul") != 0){ - if (strcmp(tmp+1,"inv") == 0) - return (((*tmp)-0x30)*2)+1; - else if (tmp[1] == '\0') - return ((*tmp)-0x30)*2; + if (*tmp>='0' && *tmp<='5'){ + if (strcmp(tmp+1,"inv") == 0) + return (((*tmp)-'0')*2)+1; + else if (tmp[1] == '\0') + return ((*tmp)-'0')*2; + } } } return id*2; From 08e8341cd474473e2e31286800ca71689c1361ed Mon Sep 17 00:00:00 2001 From: oshaboy Date: Mon, 20 Jan 2025 02:05:50 +0200 Subject: [PATCH 49/50] Update configuration.c --- configuration.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configuration.c b/configuration.c index 4bbb7edbfb59..b38da11e2592 100644 --- a/configuration.c +++ b/configuration.c @@ -6705,7 +6705,7 @@ unsigned input_config_parse_sensor( if (config_get_array(conf, s, tmp, sizeof(tmp))) { if (strcmp(tmp, "nul") != 0){ - if (*tmp>='0' && *tmp<='5'){ + if ((*tmp>='0') && (*tmp<='5')){ if (strcmp(tmp+1,"inv") == 0) return (((*tmp)-'0')*2)+1; else if (tmp[1] == '\0') From 0cac7a425f5fcee40e915ee81b2302f8659185a9 Mon Sep 17 00:00:00 2001 From: oshaboy Date: Mon, 20 Jan 2025 03:18:38 +0200 Subject: [PATCH 50/50] Minor changes --- configuration.c | 6 +++--- input/drivers/udev_input.c | 19 ------------------- 2 files changed, 3 insertions(+), 22 deletions(-) diff --git a/configuration.c b/configuration.c index b38da11e2592..f591d5e18687 100644 --- a/configuration.c +++ b/configuration.c @@ -6464,11 +6464,10 @@ void input_config_set_autoconfig_binds(unsigned port, void *data) for (i = 0; i < RETROPAD_RETRO_SENSOR_LAST; i++){ /* I am the implementor I get to choose the implementation details */ char str[256]; - unsigned bind; get_config_name_for_sensor(str, sizeof(str), i); - bind=input_config_parse_sensor (i,str, config); - config_get_ptr()->uints.input_sensor_ids[port][i]=bind; + config_get_ptr()->uints.input_sensor_ids[port][i]= + input_config_parse_sensor (i,str, config); } } @@ -6705,6 +6704,7 @@ unsigned input_config_parse_sensor( if (config_get_array(conf, s, tmp, sizeof(tmp))) { if (strcmp(tmp, "nul") != 0){ + RARCH_DBG("tmp: %s\n", tmp); if ((*tmp>='0') && (*tmp<='5')){ if (strcmp(tmp+1,"inv") == 0) return (((*tmp)-'0')*2)+1; diff --git a/input/drivers/udev_input.c b/input/drivers/udev_input.c index 3aa23888a7a2..3cdfa8f865e1 100644 --- a/input/drivers/udev_input.c +++ b/input/drivers/udev_input.c @@ -4118,25 +4118,6 @@ static bool udev_set_sensor_state(void *data, unsigned port, enum retro_sensor_a return false; } -static float udev_get_sensor_input(void *data, unsigned port, unsigned id) -{ - udev_input_t *udev = (udev_input_t*)data; - - if (!udev) - return 0.0f; - - switch (id) - { - case RETRO_SENSOR_ILLUMINANCE: - if (udev->illuminance_sensor) - return linux_get_illuminance_reading(udev->illuminance_sensor); - default: - break; - } - - return 0.0f; -} - static bool open_devices(udev_input_t *udev, enum udev_input_dev_type type, device_handle_cb cb) {