@@ -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+
465503static void draw_background (void )
466504{
467505 if (frame_buf )
@@ -510,12 +548,22 @@ static void draw_background(void)
510548
511549static 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
566624unsigned 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 )
0 commit comments