forked from eden-emu/eden
		
	input_common: reset sdl motion if data is invalid
This commit is contained in:
		
							parent
							
								
									0e8f98a441
								
							
						
					
					
						commit
						db6cb9cc0a
					
				
					 1 changed files with 35 additions and 19 deletions
				
			
		|  | @ -40,8 +40,14 @@ public: | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     void EnableMotion() { |     void EnableMotion() { | ||||||
|         if (sdl_controller) { |         if (!sdl_controller) { | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|         SDL_GameController* controller = sdl_controller.get(); |         SDL_GameController* controller = sdl_controller.get(); | ||||||
|  |         if (HasMotion()) { | ||||||
|  |             SDL_GameControllerSetSensorEnabled(controller, SDL_SENSOR_ACCEL, SDL_FALSE); | ||||||
|  |             SDL_GameControllerSetSensorEnabled(controller, SDL_SENSOR_GYRO, SDL_FALSE); | ||||||
|  |         } | ||||||
|         has_accel = SDL_GameControllerHasSensor(controller, SDL_SENSOR_ACCEL) == SDL_TRUE; |         has_accel = SDL_GameControllerHasSensor(controller, SDL_SENSOR_ACCEL) == SDL_TRUE; | ||||||
|         has_gyro = SDL_GameControllerHasSensor(controller, SDL_SENSOR_GYRO) == SDL_TRUE; |         has_gyro = SDL_GameControllerHasSensor(controller, SDL_SENSOR_GYRO) == SDL_TRUE; | ||||||
|         if (has_accel) { |         if (has_accel) { | ||||||
|  | @ -51,14 +57,9 @@ public: | ||||||
|             SDL_GameControllerSetSensorEnabled(controller, SDL_SENSOR_GYRO, SDL_TRUE); |             SDL_GameControllerSetSensorEnabled(controller, SDL_SENSOR_GYRO, SDL_TRUE); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     } |  | ||||||
| 
 | 
 | ||||||
|     bool HasGyro() const { |     bool HasMotion() const { | ||||||
|         return has_gyro; |         return has_gyro || has_accel; | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     bool HasAccel() const { |  | ||||||
|         return has_accel; |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     bool UpdateMotion(SDL_ControllerSensorEvent event) { |     bool UpdateMotion(SDL_ControllerSensorEvent event) { | ||||||
|  | @ -85,6 +86,20 @@ public: | ||||||
|         if (time_difference == 0) { |         if (time_difference == 0) { | ||||||
|             return false; |             return false; | ||||||
|         } |         } | ||||||
|  | 
 | ||||||
|  |         // Motion data is invalid
 | ||||||
|  |         if (motion.accel_x == 0 && motion.gyro_x == 0 && motion.accel_y == 0 && | ||||||
|  |             motion.gyro_y == 0 && motion.accel_z == 0 && motion.gyro_z == 0) { | ||||||
|  |             if (motion_error_count++ < 200) { | ||||||
|  |                 return false; | ||||||
|  |             } | ||||||
|  |             // Try restarting the sensor
 | ||||||
|  |             motion_error_count = 0; | ||||||
|  |             EnableMotion(); | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         motion_error_count = 0; | ||||||
|         motion.delta_timestamp = time_difference * 1000; |         motion.delta_timestamp = time_difference * 1000; | ||||||
|         return true; |         return true; | ||||||
|     } |     } | ||||||
|  | @ -250,6 +265,7 @@ private: | ||||||
|     mutable std::mutex mutex; |     mutable std::mutex mutex; | ||||||
| 
 | 
 | ||||||
|     u64 last_motion_update{}; |     u64 last_motion_update{}; | ||||||
|  |     std::size_t motion_error_count{}; | ||||||
|     bool has_gyro{false}; |     bool has_gyro{false}; | ||||||
|     bool has_accel{false}; |     bool has_accel{false}; | ||||||
|     bool has_vibration{false}; |     bool has_vibration{false}; | ||||||
|  | @ -942,18 +958,18 @@ MotionMapping SDLDriver::GetMotionMappingForDevice(const Common::ParamPackage& p | ||||||
|     MotionMapping mapping = {}; |     MotionMapping mapping = {}; | ||||||
|     joystick->EnableMotion(); |     joystick->EnableMotion(); | ||||||
| 
 | 
 | ||||||
|     if (joystick->HasGyro() || joystick->HasAccel()) { |     if (joystick->HasMotion()) { | ||||||
|         mapping.insert_or_assign(Settings::NativeMotion::MotionRight, |         mapping.insert_or_assign(Settings::NativeMotion::MotionRight, | ||||||
|                                  BuildMotionParam(joystick->GetPort(), joystick->GetGUID())); |                                  BuildMotionParam(joystick->GetPort(), joystick->GetGUID())); | ||||||
|     } |     } | ||||||
|     if (params.Has("guid2")) { |     if (params.Has("guid2")) { | ||||||
|         joystick2->EnableMotion(); |         joystick2->EnableMotion(); | ||||||
|         if (joystick2->HasGyro() || joystick2->HasAccel()) { |         if (joystick2->HasMotion()) { | ||||||
|             mapping.insert_or_assign(Settings::NativeMotion::MotionLeft, |             mapping.insert_or_assign(Settings::NativeMotion::MotionLeft, | ||||||
|                                      BuildMotionParam(joystick2->GetPort(), joystick2->GetGUID())); |                                      BuildMotionParam(joystick2->GetPort(), joystick2->GetGUID())); | ||||||
|         } |         } | ||||||
|     } else { |     } else { | ||||||
|         if (joystick->HasGyro() || joystick->HasAccel()) { |         if (joystick->HasMotion()) { | ||||||
|             mapping.insert_or_assign(Settings::NativeMotion::MotionLeft, |             mapping.insert_or_assign(Settings::NativeMotion::MotionLeft, | ||||||
|                                      BuildMotionParam(joystick->GetPort(), joystick->GetGUID())); |                                      BuildMotionParam(joystick->GetPort(), joystick->GetGUID())); | ||||||
|         } |         } | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 german77
						german77