Skip to content

Add machine readable serial formatting #233

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 28 additions & 0 deletions src/common/base_classes/FOCMotor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -117,23 +129,39 @@ 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;
}
}

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;
}
Expand Down
57 changes: 51 additions & 6 deletions src/communication/Commander.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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]);
Expand All @@ -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;
}
Expand All @@ -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;
}
Expand All @@ -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){
Expand Down Expand Up @@ -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("");
Expand Down Expand Up @@ -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){
Expand Down Expand Up @@ -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"));
}
16 changes: 15 additions & 1 deletion src/communication/Commander.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
};


Expand Down Expand Up @@ -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);
};
Expand Down