| 312 | // ============================================================================ |
| 313 | |
| 314 | fl::json AutoResearchRemoteControl::runSingleTestImpl(const fl::json& args) { |
| 315 | fl::json response = fl::json::object(); |
| 316 | |
| 317 | // RPC system unwraps single-element arrays, so args is the config object directly |
| 318 | if (!args.is_object()) { |
| 319 | response.set("success", false); |
| 320 | response.set("error", "InvalidArgs"); |
| 321 | response.set("message", "Expected {driver, laneSizes, pattern?, iterations?, pinTx?, pinRx?, timing?}"); |
| 322 | return response; |
| 323 | } |
| 324 | |
| 325 | fl::json config = args; |
| 326 | |
| 327 | // ========== REQUIRED PARAMETERS ========== |
| 328 | |
| 329 | // 1. Extract driver (required) |
| 330 | if (!config.contains("driver") || !config["driver"].is_string()) { |
| 331 | response.set("success", false); |
| 332 | response.set("error", "MissingDriver"); |
| 333 | response.set("message", "Required field 'driver' (string) missing"); |
| 334 | return response; |
| 335 | } |
| 336 | fl::string driver_name = config["driver"].as_string().value(); |
| 337 | |
| 338 | // Validate driver exists |
| 339 | bool driver_found = false; |
| 340 | for (fl::size i = 0; i < mState->drivers_available.size(); i++) { |
| 341 | if (mState->drivers_available[i].name == driver_name) { |
| 342 | driver_found = true; |
| 343 | break; |
| 344 | } |
| 345 | } |
| 346 | if (!driver_found) { |
| 347 | response.set("success", false); |
| 348 | response.set("error", "UnknownDriver"); |
| 349 | fl::sstream msg; |
| 350 | msg << "Driver '" << driver_name.c_str() << "' not available"; |
| 351 | response.set("message", msg.str().c_str()); |
| 352 | return response; |
| 353 | } |
| 354 | |
| 355 | // 2. Extract laneSizes (required) |
| 356 | if (!config.contains("laneSizes") || !config["laneSizes"].is_array()) { |
| 357 | response.set("success", false); |
| 358 | response.set("error", "MissingLaneSizes"); |
| 359 | response.set("message", "Required field 'laneSizes' (array) missing"); |
| 360 | return response; |
| 361 | } |
| 362 | |
| 363 | fl::json lane_sizes_json = config["laneSizes"]; |
| 364 | if (lane_sizes_json.size() == 0 || lane_sizes_json.size() > 16) { |
| 365 | response.set("success", false); |
| 366 | response.set("error", "InvalidLaneCount"); |
| 367 | response.set("message", "laneSizes must have 1-16 elements"); |
| 368 | return response; |
| 369 | } |
| 370 | |
| 371 | fl::vector<int> lane_sizes; |
no test coverage detected