mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-30 21:30:04 +00:00 
			
		
		
		
	HID: Added functions to emulate the touchpad.
This commit is contained in:
		
							parent
							
								
									3229b048d9
								
							
						
					
					
						commit
						1a904ded40
					
				
					 2 changed files with 61 additions and 0 deletions
				
			
		|  | @ -29,6 +29,10 @@ static u32 next_pad_index = 0; | ||||||
| static s16 next_pad_circle_x = 0; | static s16 next_pad_circle_x = 0; | ||||||
| static s16 next_pad_circle_y = 0; | static s16 next_pad_circle_y = 0; | ||||||
| 
 | 
 | ||||||
|  | static u32 next_touch_index = 0; | ||||||
|  | static u16 next_touch_x = 0; | ||||||
|  | static u16 next_touch_y = 0; | ||||||
|  | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Gets a pointer to the PadData structure inside HID shared memory |  * Gets a pointer to the PadData structure inside HID shared memory | ||||||
|  */ |  */ | ||||||
|  | @ -125,6 +129,50 @@ void PadUpdateComplete() { | ||||||
|     g_event_pad_or_touch_2->Signal(); |     g_event_pad_or_touch_2->Signal(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void TouchPress(u16 x, u16 y) { | ||||||
|  |     next_touch_x = x; | ||||||
|  |     next_touch_y = y; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void TouchRelease() { | ||||||
|  |     next_touch_x = 0; | ||||||
|  |     next_touch_y = 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void TouchUpdateComplete() { | ||||||
|  |     SharedMem* shared_mem = GetSharedMem(); | ||||||
|  | 
 | ||||||
|  |     if (shared_mem == nullptr) | ||||||
|  |         return; | ||||||
|  | 
 | ||||||
|  |     shared_mem->touch.index = next_touch_index; | ||||||
|  |     next_touch_index = (next_touch_index + 1) % shared_mem->touch.entries.size(); | ||||||
|  | 
 | ||||||
|  |     // Get the current touch entry
 | ||||||
|  |     TouchDataEntry* current_touch_entry = &shared_mem->touch.entries[shared_mem->touch.index]; | ||||||
|  | 
 | ||||||
|  |     // Set touchpad position
 | ||||||
|  |     current_touch_entry->x = next_touch_x; | ||||||
|  |     current_touch_entry->y = next_touch_y; | ||||||
|  | 
 | ||||||
|  |     // TODO(bunnei): Verify this behavior on real hardware
 | ||||||
|  |     current_touch_entry->data_valid = (next_touch_x || next_touch_y) ? 1 : 0; | ||||||
|  | 
 | ||||||
|  |     // TODO(bunnei): We're not doing anything with offset 0xA8 + 0x18 of HID SharedMemory, which
 | ||||||
|  |     // supposedly is "Touch-screen entry, which contains the raw coordinate data prior to being
 | ||||||
|  |     // converted to pixel coordinates." (http://3dbrew.org/wiki/HID_Shared_Memory#Offset_0xA8).
 | ||||||
|  | 
 | ||||||
|  |     // If we just updated index 0, provide a new timestamp
 | ||||||
|  |     if (shared_mem->touch.index == 0) { | ||||||
|  |         shared_mem->touch.index_reset_ticks_previous = shared_mem->touch.index_reset_ticks; | ||||||
|  |         shared_mem->touch.index_reset_ticks = (s64)Core::g_app_core->GetTicks(); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     // Signal both handles when there's an update to Pad or touch
 | ||||||
|  |     g_event_pad_or_touch_1->Signal(); | ||||||
|  |     g_event_pad_or_touch_2->Signal(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void GetIPCHandles(Service::Interface* self) { | void GetIPCHandles(Service::Interface* self) { | ||||||
|     u32* cmd_buff = Kernel::GetCommandBuffer(); |     u32* cmd_buff = Kernel::GetCommandBuffer(); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -180,6 +180,19 @@ void PadButtonRelease(const PadState& pad_state); | ||||||
|  */ |  */ | ||||||
| void PadUpdateComplete(); | void PadUpdateComplete(); | ||||||
| 
 | 
 | ||||||
|  | /**
 | ||||||
|  |  * Signal that the touchpad has been pressed | ||||||
|  |  * @param x Touchpad x-coordinate in bottom screen pixels (between 0 and 320) | ||||||
|  |  * @param y Touchpad y-coordinate in bottom screen pixels (between 0 and 240) | ||||||
|  |  */ | ||||||
|  | void TouchPress(u16 x, u16 y); | ||||||
|  | 
 | ||||||
|  | /// Signal that touchpad has been released
 | ||||||
|  | void TouchRelease(); | ||||||
|  | 
 | ||||||
|  | /// Signal that touchpad updates have been completed
 | ||||||
|  | void TouchUpdateComplete(); | ||||||
|  | 
 | ||||||
| void HIDInit(); | void HIDInit(); | ||||||
| void HIDShutdown(); | void HIDShutdown(); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue