Skip to content

Commit c72bc6c

Browse files
committed
sensor consistency
- accel should include gravity, be in g, not m/s^2 - remote retropad should enable sensors on screen change - ios should change gravity on screen rotation - update doc. when the legend becomes fact, print the legend
1 parent 6e4a1ee commit c72bc6c

5 files changed

Lines changed: 155 additions & 44 deletions

File tree

cores/libretro-net-retropad/net_retropad_core.c

Lines changed: 88 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -435,33 +435,71 @@ static void sensors_init(void)
435435
struct retro_sensor_interface sensor_interface = {0};
436436
if (NETRETROPAD_CORE_PREFIX(environ_cb)(RETRO_ENVIRONMENT_GET_SENSOR_INTERFACE, &sensor_interface))
437437
{
438-
NETRETROPAD_CORE_PREFIX(log_cb)(RETRO_LOG_DEBUG,"[Remote RetroPad] Sensor interface supported, enabling.\n");
438+
NETRETROPAD_CORE_PREFIX(log_cb)(RETRO_LOG_DEBUG,"[Remote RetroPad] Sensor interface supported.\n");
439439
NETRETROPAD_CORE_PREFIX(sensor_get_input_cb) = sensor_interface.get_sensor_input;
440440
NETRETROPAD_CORE_PREFIX(sensor_set_state_cb) = sensor_interface.set_sensor_state;
441+
}
442+
}
441443

442-
if (NETRETROPAD_CORE_PREFIX(sensor_set_state_cb) && NETRETROPAD_CORE_PREFIX(sensor_get_input_cb))
443-
{
444-
if (NETRETROPAD_CORE_PREFIX(sensor_set_state_cb)(0, RETRO_SENSOR_ACCELEROMETER_ENABLE, EVENT_RATE))
445-
{
446-
tilt_sensor_enabled = true;
447-
NETRETROPAD_CORE_PREFIX(log_cb)(RETRO_LOG_DEBUG,"[Remote RetroPad] Tilt sensor enabled.\n");
448-
}
444+
static void sensors_enable(void)
445+
{
446+
if (!NETRETROPAD_CORE_PREFIX(sensor_set_state_cb)
447+
|| !NETRETROPAD_CORE_PREFIX(sensor_get_input_cb))
448+
sensors_init();
449+
if (!NETRETROPAD_CORE_PREFIX(sensor_set_state_cb)
450+
|| !NETRETROPAD_CORE_PREFIX(sensor_get_input_cb))
451+
return;
449452

450-
if (NETRETROPAD_CORE_PREFIX(sensor_set_state_cb)(0, RETRO_SENSOR_GYROSCOPE_ENABLE, EVENT_RATE))
451-
{
452-
gyro_sensor_enabled = true;
453-
NETRETROPAD_CORE_PREFIX(log_cb)(RETRO_LOG_DEBUG,"[Remote RetroPad] Gyro sensor enabled.\n");
454-
}
453+
if (!tilt_sensor_enabled
454+
&& NETRETROPAD_CORE_PREFIX(sensor_set_state_cb)(0, RETRO_SENSOR_ACCELEROMETER_ENABLE, EVENT_RATE))
455+
{
456+
tilt_sensor_enabled = true;
457+
NETRETROPAD_CORE_PREFIX(log_cb)(RETRO_LOG_DEBUG,"[Remote RetroPad] Tilt sensor enabled.\n");
458+
}
455459

456-
if (NETRETROPAD_CORE_PREFIX(sensor_set_state_cb)(0, RETRO_SENSOR_ILLUMINANCE_ENABLE, EVENT_RATE))
457-
{
458-
lux_sensor_enabled = true;
459-
NETRETROPAD_CORE_PREFIX(log_cb)(RETRO_LOG_DEBUG,"[Remote RetroPad] Lux sensor enabled.\n");
460-
}
461-
}
460+
if (!gyro_sensor_enabled
461+
&& NETRETROPAD_CORE_PREFIX(sensor_set_state_cb)(0, RETRO_SENSOR_GYROSCOPE_ENABLE, EVENT_RATE))
462+
{
463+
gyro_sensor_enabled = true;
464+
NETRETROPAD_CORE_PREFIX(log_cb)(RETRO_LOG_DEBUG,"[Remote RetroPad] Gyro sensor enabled.\n");
465+
}
466+
467+
if (!lux_sensor_enabled
468+
&& NETRETROPAD_CORE_PREFIX(sensor_set_state_cb)(0, RETRO_SENSOR_ILLUMINANCE_ENABLE, EVENT_RATE))
469+
{
470+
lux_sensor_enabled = true;
471+
NETRETROPAD_CORE_PREFIX(log_cb)(RETRO_LOG_DEBUG,"[Remote RetroPad] Lux sensor enabled.\n");
462472
}
463473
}
464474

475+
static void sensors_disable(void)
476+
{
477+
if (!NETRETROPAD_CORE_PREFIX(sensor_set_state_cb))
478+
return;
479+
480+
if (tilt_sensor_enabled)
481+
{
482+
NETRETROPAD_CORE_PREFIX(sensor_set_state_cb)(0, RETRO_SENSOR_ACCELEROMETER_DISABLE, EVENT_RATE);
483+
tilt_sensor_enabled = false;
484+
}
485+
486+
if (gyro_sensor_enabled)
487+
{
488+
NETRETROPAD_CORE_PREFIX(sensor_set_state_cb)(0, RETRO_SENSOR_GYROSCOPE_DISABLE, EVENT_RATE);
489+
gyro_sensor_enabled = false;
490+
}
491+
492+
if (lux_sensor_enabled)
493+
{
494+
NETRETROPAD_CORE_PREFIX(sensor_set_state_cb)(0, RETRO_SENSOR_ILLUMINANCE_DISABLE, EVENT_RATE);
495+
lux_sensor_enabled = false;
496+
}
497+
498+
memset(tilt_sensor_values, 0, sizeof(tilt_sensor_values));
499+
memset(gyro_sensor_values, 0, sizeof(gyro_sensor_values));
500+
lux_sensor_value = 0.0f;
501+
}
502+
465503
static void draw_background(void)
466504
{
467505
if (frame_buf)
@@ -510,12 +548,22 @@ static void draw_background(void)
510548

511549
static void flip_screen(void)
512550
{
551+
unsigned prev_screen = current_screen;
513552
if (current_screen == NETRETROPAD_SCREEN_PAD)
514553
current_screen = NETRETROPAD_SCREEN_KEYBOARD;
515554
else if (current_screen == NETRETROPAD_SCREEN_KEYBOARD)
516555
current_screen = NETRETROPAD_SCREEN_SENSORS;
517556
else if (current_screen == NETRETROPAD_SCREEN_SENSORS)
518557
current_screen = NETRETROPAD_SCREEN_PAD;
558+
559+
if (prev_screen != current_screen)
560+
{
561+
if (current_screen == NETRETROPAD_SCREEN_SENSORS)
562+
sensors_enable();
563+
else if (prev_screen == NETRETROPAD_SCREEN_SENSORS)
564+
sensors_disable();
565+
}
566+
519567
draw_background();
520568
}
521569

@@ -555,12 +603,22 @@ void NETRETROPAD_CORE_PREFIX(retro_deinit)(void)
555603
descriptors[i]->value = NULL;
556604
}
557605

558-
if (NETRETROPAD_CORE_PREFIX(sensor_set_state_cb) && NETRETROPAD_CORE_PREFIX(sensor_get_input_cb))
559-
{
560-
NETRETROPAD_CORE_PREFIX(sensor_set_state_cb)(0, RETRO_SENSOR_ACCELEROMETER_DISABLE, EVENT_RATE);
561-
NETRETROPAD_CORE_PREFIX(sensor_set_state_cb)(0, RETRO_SENSOR_GYROSCOPE_DISABLE, EVENT_RATE);
562-
NETRETROPAD_CORE_PREFIX(sensor_set_state_cb)(0, RETRO_SENSOR_ILLUMINANCE_DISABLE, EVENT_RATE);
563-
}
606+
sensors_disable();
607+
NETRETROPAD_CORE_PREFIX(sensor_get_input_cb) = NULL;
608+
NETRETROPAD_CORE_PREFIX(sensor_set_state_cb) = NULL;
609+
memset(sensor_item_colors, 0, sizeof(sensor_item_colors));
610+
611+
current_frame = 0;
612+
current_screen = NETRETROPAD_SCREEN_PAD;
613+
next_teststep_frame = 0;
614+
current_test_step = 0;
615+
last_test_step = MAX_TEST_STEPS + 1;
616+
input_state_validated = 0;
617+
combo_state_validated = 0;
618+
memset(keyboard_state_validated, 0, sizeof(keyboard_state_validated));
619+
dump_state_blocked = false;
620+
hide_analog_mismatch = true;
621+
mouse_type = 0;
564622
}
565623

566624
unsigned NETRETROPAD_CORE_PREFIX(retro_api_version)(void)
@@ -901,9 +959,6 @@ void NETRETROPAD_CORE_PREFIX(retro_run)(void)
901959
if (NETRETROPAD_CORE_PREFIX(environ_cb)(RETRO_ENVIRONMENT_GET_VARIABLE_UPDATE, &updated) && updated)
902960
netretropad_check_variables();
903961

904-
if (!current_frame && current_screen == NETRETROPAD_SCREEN_SENSORS)
905-
sensors_init();
906-
907962
current_frame++;
908963
/* Update input states and send them if needed */
909964
retropad_update_input();
@@ -971,6 +1026,10 @@ void NETRETROPAD_CORE_PREFIX(retro_run)(void)
9711026
}
9721027

9731028
/* Accelerometer and gyroscope. */
1029+
if (current_screen == NETRETROPAD_SCREEN_SENSORS
1030+
&& !tilt_sensor_enabled && !gyro_sensor_enabled && !lux_sensor_enabled)
1031+
sensors_enable();
1032+
9741033
if (tilt_sensor_enabled)
9751034
{
9761035
tilt_sensor_values[0] = NETRETROPAD_CORE_PREFIX(sensor_get_input_cb)(0, RETRO_SENSOR_ACCELEROMETER_X);
@@ -1008,7 +1067,7 @@ void NETRETROPAD_CORE_PREFIX(retro_run)(void)
10081067
/* Accelerometer display range: from 0 to 1g, covering tilt from a horizontal to a vertical position. */
10091068
if (i < 3)
10101069
{
1011-
value = tilt_sensor_values[i]/9.81;
1070+
value = tilt_sensor_values[i];
10121071
median_index += (i+1)*10;
10131072
}
10141073
else if (i < 6)

input/drivers/android_input.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2056,11 +2056,11 @@ static float android_input_get_sensor_input(void *data,
20562056
switch (id)
20572057
{
20582058
case RETRO_SENSOR_ACCELEROMETER_X:
2059-
return android->accelerometer_state.x;
2059+
return android->accelerometer_state.x / 9.80665f;
20602060
case RETRO_SENSOR_ACCELEROMETER_Y:
2061-
return android->accelerometer_state.y;
2061+
return android->accelerometer_state.y / 9.80665f;
20622062
case RETRO_SENSOR_ACCELEROMETER_Z:
2063-
return android->accelerometer_state.z;
2063+
return android->accelerometer_state.z / 9.80665f;
20642064
case RETRO_SENSOR_GYROSCOPE_X:
20652065
return android->gyroscope_state.x;
20662066
case RETRO_SENSOR_GYROSCOPE_Y:

input/drivers/cocoa_input.m

Lines changed: 50 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -839,6 +839,36 @@ static bool cocoa_input_set_sensor_state(void *data, unsigned port,
839839
#endif
840840
}
841841

842+
#if TARGET_OS_IOS && defined(HAVE_COREMOTION)
843+
/* Rotate a 2D sensor vector from the device's hardware coordinate frame
844+
* to the current screen coordinate frame. Accelerometer and gyroscope
845+
* X/Y axes are fixed to the hardware (portrait) orientation, so they need
846+
* remapping when the interface is in landscape or upside-down. */
847+
static void cocoa_sensor_rotate_xy(float *x, float *y)
848+
{
849+
float rawX = *x, rawY = *y;
850+
UIInterfaceOrientation orient =
851+
[[UIApplication sharedApplication] statusBarOrientation];
852+
switch (orient)
853+
{
854+
case UIInterfaceOrientationLandscapeLeft:
855+
*x = rawY;
856+
*y = -rawX;
857+
break;
858+
case UIInterfaceOrientationLandscapeRight:
859+
*x = -rawY;
860+
*y = rawX;
861+
break;
862+
case UIInterfaceOrientationPortraitUpsideDown:
863+
*x = -rawX;
864+
*y = -rawY;
865+
break;
866+
default:
867+
break;
868+
}
869+
}
870+
#endif
871+
842872
static float cocoa_input_get_sensor_input(void *data, unsigned port, unsigned id)
843873
{
844874
#ifdef HAVE_MFI
@@ -875,15 +905,30 @@ static float cocoa_input_get_sensor_input(void *data, unsigned port, unsigned id
875905
switch (id)
876906
{
877907
case RETRO_SENSOR_ACCELEROMETER_X:
878-
return motionManager.deviceMotion.gravity.x + motionManager.deviceMotion.userAcceleration.x;
879908
case RETRO_SENSOR_ACCELEROMETER_Y:
880-
return motionManager.deviceMotion.gravity.y + motionManager.deviceMotion.userAcceleration.y;
909+
{
910+
float x = motionManager.deviceMotion.gravity.x
911+
+ motionManager.deviceMotion.userAcceleration.x;
912+
float y = motionManager.deviceMotion.gravity.y
913+
+ motionManager.deviceMotion.userAcceleration.y;
914+
#if TARGET_OS_IOS
915+
cocoa_sensor_rotate_xy(&x, &y);
916+
#endif
917+
return (id == RETRO_SENSOR_ACCELEROMETER_X) ? x : y;
918+
}
881919
case RETRO_SENSOR_ACCELEROMETER_Z:
882-
return motionManager.deviceMotion.gravity.z + motionManager.deviceMotion.userAcceleration.z;
920+
return motionManager.deviceMotion.gravity.z
921+
+ motionManager.deviceMotion.userAcceleration.z;
883922
case RETRO_SENSOR_GYROSCOPE_X:
884-
return motionManager.deviceMotion.rotationRate.x;
885923
case RETRO_SENSOR_GYROSCOPE_Y:
886-
return motionManager.deviceMotion.rotationRate.y;
924+
{
925+
float x = motionManager.deviceMotion.rotationRate.x;
926+
float y = motionManager.deviceMotion.rotationRate.y;
927+
#if TARGET_OS_IOS
928+
cocoa_sensor_rotate_xy(&x, &y);
929+
#endif
930+
return (id == RETRO_SENSOR_GYROSCOPE_X) ? x : y;
931+
}
887932
case RETRO_SENSOR_GYROSCOPE_Z:
888933
return motionManager.deviceMotion.rotationRate.z;
889934
}

input/input_driver.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4699,9 +4699,11 @@ void input_mapper_reset(void *data)
46994699
bool input_set_sensor_state(unsigned port,
47004700
enum retro_sensor_action action, unsigned rate)
47014701
{
4702-
bool input_sensors_enable = config_get_ptr()->bools.input_sensors_enable;
4702+
settings_t *settings = config_get_ptr();
4703+
bool input_sensors_enable = settings->bools.input_sensors_enable;
4704+
unsigned joy_idx = settings->uints.input_joypad_index[port];
47034705
return input_driver_set_sensor(
4704-
port, input_sensors_enable, action, rate);
4706+
joy_idx, input_sensors_enable, action, rate);
47054707
}
47064708

47074709
const char *joypad_driver_name(unsigned i)
@@ -4746,12 +4748,13 @@ float input_get_sensor_state(unsigned port, unsigned id)
47464748
{
47474749
settings_t *settings = config_get_ptr();
47484750
bool input_sensors_enable = settings->bools.input_sensors_enable;
4751+
unsigned joy_idx = settings->uints.input_joypad_index[port];
47494752
float sensitivity = 1.0f;
47504753
if (id >= RETRO_SENSOR_ACCELEROMETER_X && id <= RETRO_SENSOR_ACCELEROMETER_Z)
47514754
sensitivity = settings->floats.input_sensor_accelerometer_sensitivity;
47524755
else if (id >= RETRO_SENSOR_GYROSCOPE_X && id <= RETRO_SENSOR_GYROSCOPE_Z)
47534756
sensitivity = settings->floats.input_sensor_gyroscope_sensitivity;
4754-
return input_driver_get_sensor(port, input_sensors_enable, id) * sensitivity;
4757+
return input_driver_get_sensor(joy_idx, input_sensors_enable, id) * sensitivity;
47554758
}
47564759

47574760
/**

libretro-common/include/libretro.h

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4479,23 +4479,27 @@ enum retro_sensor_action
44794479
/* Id values for SENSOR types. */
44804480

44814481
/**
4482-
* Returns the device's acceleration along its local X axis minus the effect of gravity, in m/s^2.
4482+
* Returns the device's acceleration along its local X axis, in g (standard gravity, 9.80665 m/s^2).
4483+
* Includes the effect of gravity;
4484+
* a device at rest on a table will have values close to 0, 0, 1.
44834485
*
4484-
* Positive values mean that the device is accelerating to the right.
4486+
* Positive values mean that the device is accelerating to the right,
44854487
* assuming the user is looking at it head-on.
44864488
*/
44874489
#define RETRO_SENSOR_ACCELEROMETER_X 0
44884490

44894491
/**
4490-
* Returns the device's acceleration along its local Y axis minus the effect of gravity, in m/s^2.
4492+
* Returns the device's acceleration along its local Y axis, in g (standard gravity, 9.80665 m/s^2).
4493+
* Includes the effect of gravity.
44914494
*
44924495
* Positive values mean that the device is accelerating upwards,
44934496
* assuming the user is looking at it head-on.
44944497
*/
44954498
#define RETRO_SENSOR_ACCELEROMETER_Y 1
44964499

44974500
/**
4498-
* Returns the the device's acceleration along its local Z axis minus the effect of gravity, in m/s^2.
4501+
* Returns the device's acceleration along its local Z axis, in g (standard gravity, 9.80665 m/s^2).
4502+
* Includes the effect of gravity.
44994503
*
45004504
* Positive values indicate forward acceleration towards the user,
45014505
* assuming the user is looking at the device head-on.

0 commit comments

Comments
 (0)