Ring-Con: Difference between revisions
No edit summary |
No edit summary |
||
(4 intermediate revisions by one other user not shown) | |||
Line 1: | Line 1: | ||
This page documents how the Ring Fit Adventure game uses [[HID_services#hidbus|hidbus]] for using the Ring-Con ExternalDevice, which attaches to Joy-Cons. | This page documents how the Ring Fit Adventure game uses [[HID_services#hidbus|hidbus]] for using the Ring-Con [[HID_services#ExternalDevices|ExternalDevice]], which attaches to Joy-Cons. | ||
After EnableExternalDevice is used successfully during initialization, EnableJoyPollingReceiveMode(flag=true) is used with command [[#0x00020101]]. For cleanup, DisableJoyPollingReceiveMode is used then on success EnableExternalDevice(flag=false) is used. | |||
Commands (input data for EnableJoyPollingReceiveMode / SendAndReceive) start with the u32 cmd. Data in the replies are at least 0x4-bytes, with fields being 4-byte aligned. Reply+0 is the u8 status. When the output size doesn't match the expected size, or status is non-zero, error 0xEDA is returned. When status is non-zero, a func is called with the status value which updates global state. | Commands (input data for EnableJoyPollingReceiveMode / SendAndReceive) start with the u32 cmd. Data in the replies are at least 0x4-bytes, with fields being 4-byte aligned. Reply+0 is the u8 status. When the output size doesn't match the expected size, or status is non-zero, error 0xEDA is returned. When status is non-zero, a func is called with the status value which updates global state. | ||
Line 17: | Line 15: | ||
= Commands = | = Commands = | ||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- | ||
Line 73: | Line 70: | ||
== 0x00020100 == | == 0x00020100 == | ||
This gets the ID. The first 0x6-bytes from the below output is "id_l", the remaining 0x6-bytes are "id_h". During PlayReport saving the cached ID is copied to u64s, which are then used with the PlayReport. | |||
Reply: | Reply: | ||
Line 79: | Line 78: | ||
! Offset || Size || Description | ! Offset || Size || Description | ||
|- | |- | ||
| 0x4 | | | 0x4 || 0xC || This is copied to an output buffer. | ||
| 0xC || | |||
|} | |} | ||
Line 93: | Line 90: | ||
== 0x00020105 == | == 0x00020105 == | ||
Reply+0x4 is the output u8. | Reply+0x4 is the output u8, which copied to an output u32. | ||
== 0x00020204 == | == 0x00020204 == | ||
Line 144: | Line 141: | ||
| 0x4 || 0x2 || Data, copied to an output struct as an 16bit value. | | 0x4 || 0x2 || Data, copied to an output struct as an 16bit value. | ||
|- | |- | ||
| 0x6 || 0x1 || [[#CRC]] over the previous | | 0x6 || 0x1 || [[#CRC]] over the previous 0x2-bytes. | ||
|} | |} | ||
Line 158: | Line 155: | ||
Then, if any of the 16bit output fields in output_struct are set to 0xCAFE, a flag is set to 0x2 (same field used for invalid-CRC, which uses value 0x1 for that). Then this returns 0. This field is "user_state". | Then, if any of the 16bit output fields in output_struct are set to 0xCAFE, a flag is set to 0x2 (same field used for invalid-CRC, which uses value 0x1 for that). Then this returns 0. This field is "user_state". | ||
This reads the user calibration. | This reads the user calibration. This is normally (?) not calibrated (fields are set to 0xCAFE). | ||
Reply: | Reply: | ||
Line 187: | Line 184: | ||
== 0x00023104 == | == 0x00023104 == | ||
The code which calls the func implementing this clamps the output value to range 0-500, then copies it elsewhere. | The code which calls the func implementing this clamps the output value to range 0-500, then copies it elsewhere. | ||
This gets the rep-count for Multitask-Mode. | |||
Reply: | Reply: | ||
Line 196: | Line 195: | ||
| 0x4 || 0x3 || Data, copied to an output struct as a s32. | | 0x4 || 0x3 || Data, copied to an output struct as a s32. | ||
|- | |- | ||
| 0x7 || 0x1 || [[#CRC]] over the previous 0x3-bytes. | | 0x7 || 0x1 || [[#CRC]] over the previous 0x3-bytes, followed a value-0 byte. | ||
|} | |} | ||
== 0x00023204 == | == 0x00023204 == | ||
The func implementing this in the app is identical to [[#0x00023104]] except for the cmd u32. The output field is "total_push_count". | The func implementing this in the app is identical to [[#0x00023104]] except for the cmd u32. The output field is "total_push_count". This is only updated in Multitask Mode. | ||
The code calling this func copies the output into a global field, when it's valid. | The code calling this func copies the output into a global field, when it's valid. | ||
Line 208: | Line 207: | ||
Unlike the other cmds, this checks for output_size==0x4, instead of {output buffer size} (it's unknown whether this is intended). | Unlike the other cmds, this checks for output_size==0x4, instead of {output buffer size} (it's unknown whether this is intended). | ||
This resets the value returned by [[#0x00023104]] to 0. | |||
== 0x04011104 == | == 0x04011104 == | ||
Line 234: | Line 235: | ||
Cmd: | Cmd: | ||
{| class="wikitable" border="1" | {| class="wikitable" border="1" | ||
|- | |- |