From f3438a1de4e66f40dafa7526f40392da0da8d811 Mon Sep 17 00:00:00 2001 From: Guillaume Besson Date: Sun, 4 Dec 2022 22:09:04 +0100 Subject: [PATCH] Add machine readable serial formating --- src/common/base_classes/FOCMotor.cpp | 28 ++++++++++++++ src/communication/Commander.cpp | 57 +++++++++++++++++++++++++--- src/communication/Commander.h | 16 +++++++- 3 files changed, 94 insertions(+), 7 deletions(-) diff --git a/src/common/base_classes/FOCMotor.cpp b/src/common/base_classes/FOCMotor.cpp index dc0fc97e..02ac0440 100644 --- a/src/common/base_classes/FOCMotor.cpp +++ b/src/common/base_classes/FOCMotor.cpp @@ -94,16 +94,28 @@ void FOCMotor::monitor() { bool printed = 0; if(monitor_variables & _MON_TARGET){ + if (monitor_prepend_id && !printed) { + monitor_port->print(monitor_prepend_id); + monitor_port->print("M"); + } monitor_port->print(target,4); monitor_port->print("\t"); printed= true; } if(monitor_variables & _MON_VOLT_Q) { + if (monitor_prepend_id && !printed) { + monitor_port->print(monitor_prepend_id); + monitor_port->print("M"); + } monitor_port->print(voltage.q,4); monitor_port->print("\t"); printed= true; } if(monitor_variables & _MON_VOLT_D) { + if (monitor_prepend_id && !printed) { + monitor_port->print(monitor_prepend_id); + monitor_port->print("M"); + } monitor_port->print(voltage.d,4); monitor_port->print("\t"); printed= true; @@ -117,11 +129,19 @@ void FOCMotor::monitor() { c.d = LPF_current_d(c.d); } if(monitor_variables & _MON_CURR_Q) { + if (monitor_prepend_id && !printed) { + monitor_port->print(monitor_prepend_id); + monitor_port->print("M"); + } monitor_port->print(c.q*1000, 2); // mAmps monitor_port->print("\t"); printed= true; } if(monitor_variables & _MON_CURR_D) { + if (monitor_prepend_id && !printed) { + monitor_port->print(monitor_prepend_id); + monitor_port->print("M"); + } monitor_port->print(c.d*1000, 2); // mAmps monitor_port->print("\t"); printed= true; @@ -129,11 +149,19 @@ void FOCMotor::monitor() { } if(monitor_variables & _MON_VEL) { + if (monitor_prepend_id && !printed) { + monitor_port->print(monitor_prepend_id); + monitor_port->print("M"); + } monitor_port->print(shaft_velocity,4); monitor_port->print("\t"); printed= true; } if(monitor_variables & _MON_ANGLE) { + if (monitor_prepend_id && !printed) { + monitor_port->print(monitor_prepend_id); + monitor_port->print("M"); + } monitor_port->print(shaft_angle,4); printed= true; } diff --git a/src/communication/Commander.cpp b/src/communication/Commander.cpp index 84bee9ba..17249379 100644 --- a/src/communication/Commander.cpp +++ b/src/communication/Commander.cpp @@ -62,6 +62,7 @@ void Commander::run(char* user_input){ switch(id){ case CMD_SCAN: for(int i=0; i < call_count; i++){ + printMachineReadable(F("?")); print(call_ids[i]); print(":"); if(call_label[i]) println(call_label[i]); @@ -79,16 +80,21 @@ void Commander::run(char* user_input){ case VerboseMode::user_friendly: println(F("on!")); break; + case VerboseMode::machine_readable: + printlnMachineReadable(F("@3")); + break; } break; case CMD_DECIMAL: if(!isSentinel(user_input[1])) decimal_places = atoi(&user_input[1]); printVerbose(F("Decimal:")); + printMachineReadable(F("#")); println(decimal_places); break; default: for(int i=0; i < call_count; i++){ if(id == call_ids[i]){ + printMachineReadable(user_input[0]); call_list[i](&user_input[1]); break; } @@ -100,7 +106,7 @@ void Commander::run(char* user_input){ void Commander::motor(FOCMotor* motor, char* user_command) { // if target setting - if(isDigit(user_command[0]) || user_command[0] == '-' || user_command[0] == '+'){ + if(isDigit(user_command[0]) || user_command[0] == '-' || user_command[0] == '+' || isSentinel(user_command[0])){ target(motor, user_command); return; } @@ -114,7 +120,10 @@ void Commander::motor(FOCMotor* motor, char* user_command) { bool GET = isSentinel(user_command[value_index]); // parse command values float value = atof(&user_command[value_index]); - + printMachineReadable(cmd); + if (sub_cmd >= 'A' && sub_cmd <= 'Z') { + printMachineReadable(sub_cmd); + } // a bit of optimisation of variable memory for Arduino UNO (atmega328) switch(cmd){ @@ -313,9 +322,9 @@ void Commander::motor(FOCMotor* motor, char* user_command) { break; case SCMD_SET: if(!GET) motor->monitor_variables = (uint8_t) 0; - for(int i = 0; i < 7; i++){ + for(int i = 0; i < 8; i++){ if(isSentinel(user_command[value_index+i])) break; - if(!GET) motor->monitor_variables |= (user_command[value_index+i] - '0') << (6-i); + if(!GET) motor->monitor_variables |= (user_command[value_index+i] - '0') << (7-i); print( (user_command[value_index+i] - '0') ); } println(""); @@ -468,8 +477,11 @@ void Commander::scalar(float* value, char* user_cmd){ void Commander::target(FOCMotor* motor, char* user_cmd, char* separator){ // if no values sent - if(isSentinel(user_cmd[0])) return; - + if(isSentinel(user_cmd[0])) { + printlnMachineReadable(motor->target); + return; + }; + float pos, vel, torque; char* next_value; switch(motor->controller){ @@ -614,6 +626,39 @@ void Commander::printVerbose(const char* message){ void Commander::printVerbose(const __FlashStringHelper *message){ if(verbose == VerboseMode::user_friendly) print(message); } + +void Commander::printMachineReadable(const int number){ + if(verbose == VerboseMode::machine_readable) print(number); +} +void Commander::printMachineReadable(const float number){ + if(verbose == VerboseMode::machine_readable) print(number); +} +void Commander::printMachineReadable(const char* message){ + if(verbose == VerboseMode::machine_readable) print(message); +} +void Commander::printMachineReadable(const __FlashStringHelper *message){ + if(verbose == VerboseMode::machine_readable) print(message); +} +void Commander::printMachineReadable(const char message){ + if(verbose == VerboseMode::machine_readable) print(message); +} + +void Commander::printlnMachineReadable(const int number){ + if(verbose == VerboseMode::machine_readable) println(number); +} +void Commander::printlnMachineReadable(const float number){ + if(verbose == VerboseMode::machine_readable) println(number); +} +void Commander::printlnMachineReadable(const char* message){ + if(verbose == VerboseMode::machine_readable) println(message); +} +void Commander::printlnMachineReadable(const __FlashStringHelper *message){ + if(verbose == VerboseMode::machine_readable) println(message); +} +void Commander::printlnMachineReadable(const char message){ + if(verbose == VerboseMode::machine_readable) println(message); +} + void Commander::printError(){ println(F("err")); } diff --git a/src/communication/Commander.h b/src/communication/Commander.h index 51647f71..3633a510 100644 --- a/src/communication/Commander.h +++ b/src/communication/Commander.h @@ -15,7 +15,8 @@ enum VerboseMode : uint8_t { nothing = 0x00, // display nothing - good for monitoring on_request = 0x01, // display only on user request - user_friendly = 0x02 // display textual messages to the user + user_friendly = 0x02, // display textual messages to the user + machine_readable = 0x03 // display machine readable commands, matching commands to set each settings }; @@ -279,6 +280,19 @@ class Commander void println(const __FlashStringHelper *message); void println(const char message); + void printMachineReadable(const float number); + void printMachineReadable(const int number); + void printMachineReadable(const char* message); + void printMachineReadable(const __FlashStringHelper *message); + void printMachineReadable(const char message); + + void printlnMachineReadable(const float number); + void printlnMachineReadable(const int number); + void printlnMachineReadable(const char* message); + void printlnMachineReadable(const __FlashStringHelper *message); + void printlnMachineReadable(const char message); + + void printError(); bool isSentinel(char ch); };