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.
−
The [[HID_services#BusType|BusType]] used with GetBusHandle is value 0 or 1.
+
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.
−
−
The ExternalDeviceId is 0x20. 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 || 0x8 || u64 copied to an output struct.
+
| 0x4 || 0xC || This is copied to an output buffer.
−
|-
−
| 0xC || 0x4 || u32 copied to an output struct.
|}
|}
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 0x3-bytes.
+
| 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"
|-
|-