summaryrefslogtreecommitdiff
path: root/src/hid_core/hidbus/ringcon.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/hid_core/hidbus/ringcon.cpp')
-rw-r--r--src/hid_core/hidbus/ringcon.cpp77
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
93std::vector<u8> RingController::GetReply() const { 93u64 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
166std::vector<u8> RingController::GetFirmwareVersionReply() const { 166u64 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
175std::vector<u8> RingController::GetReadIdReply() const { 175u64 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
190std::vector<u8> RingController::GetC020105Reply() const { 190u64 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
199std::vector<u8> RingController::GetReadUnkCalReply() const { 199u64 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
208std::vector<u8> RingController::GetReadFactoryCalReply() const { 208u64 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
217std::vector<u8> RingController::GetReadUserCalReply() const { 217u64 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
226std::vector<u8> RingController::GetReadRepCountReply() const { 226u64 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
236std::vector<u8> RingController::GetReadTotalPushCountReply() const { 236u64 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
246std::vector<u8> RingController::GetResetRepCountReply() const { 246u64 RingController::GetResetRepCountReply(std::span<u8> out_data) const {
247 return GetReadRepCountReply(); 247 return GetReadRepCountReply(out_data);
248} 248}
249 249
250std::vector<u8> RingController::GetSaveDataReply() const { 250u64 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
258std::vector<u8> RingController::GetErrorReply() const { 258u64 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
266u8 RingController::GetCrcValue(const std::vector<u8>& data) const { 266u8 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
283template <typename T> 283template <typename T>
284std::vector<u8> RingController::GetDataVector(const T& reply) const { 284u64 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