diff options
Diffstat (limited to 'src/hid_core/hidbus/ringcon.cpp')
| -rw-r--r-- | src/hid_core/hidbus/ringcon.cpp | 77 |
1 files changed, 38 insertions, 39 deletions
diff --git a/src/hid_core/hidbus/ringcon.cpp b/src/hid_core/hidbus/ringcon.cpp index cedf25c16..4f5eaa505 100644 --- a/src/hid_core/hidbus/ringcon.cpp +++ b/src/hid_core/hidbus/ringcon.cpp | |||
| @@ -90,32 +90,32 @@ u8 RingController::GetDeviceId() const { | |||
| 90 | return device_id; | 90 | return device_id; |
| 91 | } | 91 | } |
| 92 | 92 | ||
| 93 | std::vector<u8> RingController::GetReply() const { | 93 | u64 RingController::GetReply(std::span<u8> out_data) const { |
| 94 | const RingConCommands current_command = command; | 94 | const RingConCommands current_command = command; |
| 95 | 95 | ||
| 96 | switch (current_command) { | 96 | switch (current_command) { |
| 97 | case RingConCommands::GetFirmwareVersion: | 97 | case RingConCommands::GetFirmwareVersion: |
| 98 | return GetFirmwareVersionReply(); | 98 | return GetFirmwareVersionReply(out_data); |
| 99 | case RingConCommands::ReadId: | 99 | case RingConCommands::ReadId: |
| 100 | return GetReadIdReply(); | 100 | return GetReadIdReply(out_data); |
| 101 | case RingConCommands::c20105: | 101 | case RingConCommands::c20105: |
| 102 | return GetC020105Reply(); | 102 | return GetC020105Reply(out_data); |
| 103 | case RingConCommands::ReadUnkCal: | 103 | case RingConCommands::ReadUnkCal: |
| 104 | return GetReadUnkCalReply(); | 104 | return GetReadUnkCalReply(out_data); |
| 105 | case RingConCommands::ReadFactoryCal: | 105 | case RingConCommands::ReadFactoryCal: |
| 106 | return GetReadFactoryCalReply(); | 106 | return GetReadFactoryCalReply(out_data); |
| 107 | case RingConCommands::ReadUserCal: | 107 | case RingConCommands::ReadUserCal: |
| 108 | return GetReadUserCalReply(); | 108 | return GetReadUserCalReply(out_data); |
| 109 | case RingConCommands::ReadRepCount: | 109 | case RingConCommands::ReadRepCount: |
| 110 | return GetReadRepCountReply(); | 110 | return GetReadRepCountReply(out_data); |
| 111 | case RingConCommands::ReadTotalPushCount: | 111 | case RingConCommands::ReadTotalPushCount: |
| 112 | return GetReadTotalPushCountReply(); | 112 | return GetReadTotalPushCountReply(out_data); |
| 113 | case RingConCommands::ResetRepCount: | 113 | case RingConCommands::ResetRepCount: |
| 114 | return GetResetRepCountReply(); | 114 | return GetResetRepCountReply(out_data); |
| 115 | case RingConCommands::SaveCalData: | 115 | case RingConCommands::SaveCalData: |
| 116 | return GetSaveDataReply(); | 116 | return GetSaveDataReply(out_data); |
| 117 | default: | 117 | default: |
| 118 | return GetErrorReply(); | 118 | return GetErrorReply(out_data); |
| 119 | } | 119 | } |
| 120 | } | 120 | } |
| 121 | 121 | ||
| @@ -163,16 +163,16 @@ bool RingController::SetCommand(std::span<const u8> data) { | |||
| 163 | } | 163 | } |
| 164 | } | 164 | } |
| 165 | 165 | ||
| 166 | std::vector<u8> RingController::GetFirmwareVersionReply() const { | 166 | u64 RingController::GetFirmwareVersionReply(std::span<u8> out_data) const { |
| 167 | const FirmwareVersionReply reply{ | 167 | const FirmwareVersionReply reply{ |
| 168 | .status = DataValid::Valid, | 168 | .status = DataValid::Valid, |
| 169 | .firmware = version, | 169 | .firmware = version, |
| 170 | }; | 170 | }; |
| 171 | 171 | ||
| 172 | return GetDataVector(reply); | 172 | return GetData(reply, out_data); |
| 173 | } | 173 | } |
| 174 | 174 | ||
| 175 | std::vector<u8> RingController::GetReadIdReply() const { | 175 | u64 RingController::GetReadIdReply(std::span<u8> out_data) const { |
| 176 | // The values are hardcoded from a real joycon | 176 | // The values are hardcoded from a real joycon |
| 177 | const ReadIdReply reply{ | 177 | const ReadIdReply reply{ |
| 178 | .status = DataValid::Valid, | 178 | .status = DataValid::Valid, |
| @@ -184,83 +184,83 @@ std::vector<u8> RingController::GetReadIdReply() const { | |||
| 184 | .id_h_x4 = 8245, | 184 | .id_h_x4 = 8245, |
| 185 | }; | 185 | }; |
| 186 | 186 | ||
| 187 | return GetDataVector(reply); | 187 | return GetData(reply, out_data); |
| 188 | } | 188 | } |
| 189 | 189 | ||
| 190 | std::vector<u8> RingController::GetC020105Reply() const { | 190 | u64 RingController::GetC020105Reply(std::span<u8> out_data) const { |
| 191 | const Cmd020105Reply reply{ | 191 | const Cmd020105Reply reply{ |
| 192 | .status = DataValid::Valid, | 192 | .status = DataValid::Valid, |
| 193 | .data = 1, | 193 | .data = 1, |
| 194 | }; | 194 | }; |
| 195 | 195 | ||
| 196 | return GetDataVector(reply); | 196 | return GetData(reply, out_data); |
| 197 | } | 197 | } |
| 198 | 198 | ||
| 199 | std::vector<u8> RingController::GetReadUnkCalReply() const { | 199 | u64 RingController::GetReadUnkCalReply(std::span<u8> out_data) const { |
| 200 | const ReadUnkCalReply reply{ | 200 | const ReadUnkCalReply reply{ |
| 201 | .status = DataValid::Valid, | 201 | .status = DataValid::Valid, |
| 202 | .data = 0, | 202 | .data = 0, |
| 203 | }; | 203 | }; |
| 204 | 204 | ||
| 205 | return GetDataVector(reply); | 205 | return GetData(reply, out_data); |
| 206 | } | 206 | } |
| 207 | 207 | ||
| 208 | std::vector<u8> RingController::GetReadFactoryCalReply() const { | 208 | u64 RingController::GetReadFactoryCalReply(std::span<u8> out_data) const { |
| 209 | const ReadFactoryCalReply reply{ | 209 | const ReadFactoryCalReply reply{ |
| 210 | .status = DataValid::Valid, | 210 | .status = DataValid::Valid, |
| 211 | .calibration = factory_calibration, | 211 | .calibration = factory_calibration, |
| 212 | }; | 212 | }; |
| 213 | 213 | ||
| 214 | return GetDataVector(reply); | 214 | return GetData(reply, out_data); |
| 215 | } | 215 | } |
| 216 | 216 | ||
| 217 | std::vector<u8> RingController::GetReadUserCalReply() const { | 217 | u64 RingController::GetReadUserCalReply(std::span<u8> out_data) const { |
| 218 | const ReadUserCalReply reply{ | 218 | const ReadUserCalReply reply{ |
| 219 | .status = DataValid::Valid, | 219 | .status = DataValid::Valid, |
| 220 | .calibration = user_calibration, | 220 | .calibration = user_calibration, |
| 221 | }; | 221 | }; |
| 222 | 222 | ||
| 223 | return GetDataVector(reply); | 223 | return GetData(reply, out_data); |
| 224 | } | 224 | } |
| 225 | 225 | ||
| 226 | std::vector<u8> RingController::GetReadRepCountReply() const { | 226 | u64 RingController::GetReadRepCountReply(std::span<u8> out_data) const { |
| 227 | const GetThreeByteReply reply{ | 227 | const GetThreeByteReply reply{ |
| 228 | .status = DataValid::Valid, | 228 | .status = DataValid::Valid, |
| 229 | .data = {total_rep_count, 0, 0}, | 229 | .data = {total_rep_count, 0, 0}, |
| 230 | .crc = GetCrcValue({total_rep_count, 0, 0, 0}), | 230 | .crc = GetCrcValue({total_rep_count, 0, 0, 0}), |
| 231 | }; | 231 | }; |
| 232 | 232 | ||
| 233 | return GetDataVector(reply); | 233 | return GetData(reply, out_data); |
| 234 | } | 234 | } |
| 235 | 235 | ||
| 236 | std::vector<u8> RingController::GetReadTotalPushCountReply() const { | 236 | u64 RingController::GetReadTotalPushCountReply(std::span<u8> out_data) const { |
| 237 | const GetThreeByteReply reply{ | 237 | const GetThreeByteReply reply{ |
| 238 | .status = DataValid::Valid, | 238 | .status = DataValid::Valid, |
| 239 | .data = {total_push_count, 0, 0}, | 239 | .data = {total_push_count, 0, 0}, |
| 240 | .crc = GetCrcValue({total_push_count, 0, 0, 0}), | 240 | .crc = GetCrcValue({total_push_count, 0, 0, 0}), |
| 241 | }; | 241 | }; |
| 242 | 242 | ||
| 243 | return GetDataVector(reply); | 243 | return GetData(reply, out_data); |
| 244 | } | 244 | } |
| 245 | 245 | ||
| 246 | std::vector<u8> RingController::GetResetRepCountReply() const { | 246 | u64 RingController::GetResetRepCountReply(std::span<u8> out_data) const { |
| 247 | return GetReadRepCountReply(); | 247 | return GetReadRepCountReply(out_data); |
| 248 | } | 248 | } |
| 249 | 249 | ||
| 250 | std::vector<u8> RingController::GetSaveDataReply() const { | 250 | u64 RingController::GetSaveDataReply(std::span<u8> out_data) const { |
| 251 | const StatusReply reply{ | 251 | const StatusReply reply{ |
| 252 | .status = DataValid::Valid, | 252 | .status = DataValid::Valid, |
| 253 | }; | 253 | }; |
| 254 | 254 | ||
| 255 | return GetDataVector(reply); | 255 | return GetData(reply, out_data); |
| 256 | } | 256 | } |
| 257 | 257 | ||
| 258 | std::vector<u8> RingController::GetErrorReply() const { | 258 | u64 RingController::GetErrorReply(std::span<u8> out_data) const { |
| 259 | const ErrorReply reply{ | 259 | const ErrorReply reply{ |
| 260 | .status = DataValid::BadCRC, | 260 | .status = DataValid::BadCRC, |
| 261 | }; | 261 | }; |
| 262 | 262 | ||
| 263 | return GetDataVector(reply); | 263 | return GetData(reply, out_data); |
| 264 | } | 264 | } |
| 265 | 265 | ||
| 266 | u8 RingController::GetCrcValue(const std::vector<u8>& data) const { | 266 | u8 RingController::GetCrcValue(const std::vector<u8>& data) const { |
| @@ -281,12 +281,11 @@ u8 RingController::GetCrcValue(const std::vector<u8>& data) const { | |||
| 281 | } | 281 | } |
| 282 | 282 | ||
| 283 | template <typename T> | 283 | template <typename T> |
| 284 | std::vector<u8> RingController::GetDataVector(const T& reply) const { | 284 | u64 RingController::GetData(const T& reply, std::span<u8> out_data) const { |
| 285 | static_assert(std::is_trivially_copyable_v<T>); | 285 | static_assert(std::is_trivially_copyable_v<T>); |
| 286 | std::vector<u8> data; | 286 | const auto data_size = static_cast<u64>(std::min(sizeof(reply), out_data.size())); |
| 287 | data.resize(sizeof(reply)); | 287 | std::memcpy(out_data.data(), &reply, data_size); |
| 288 | std::memcpy(data.data(), &reply, sizeof(reply)); | 288 | return data_size; |
| 289 | return data; | ||
| 290 | } | 289 | } |
| 291 | 290 | ||
| 292 | } // namespace Service::HID | 291 | } // namespace Service::HID |