diff --git a/src/config.h b/src/config.h index 69be789..8d08c92 100644 --- a/src/config.h +++ b/src/config.h @@ -8,7 +8,7 @@ //general settings #define MAX_COMMANDS 50 #define MAX_MODULES 10 - #define MAX_ARGUMENT_LENGTH 20 //used in argument parsing, takes up ram + #define MAX_ARGUMENT_LENGTH 25 //used in argument parsing, takes up ram #define VERSION_STRING "Sangaboard Firmware v1.0.0-dev" #define DEBUG_ON #define EMULATED_EEPROM_SIZE 512 diff --git a/src/main.cpp b/src/main.cpp index ca0a283..9510382 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -113,6 +113,28 @@ uint8_t parse_arguments(char **arguments, String command, uint8_t max_args) return parsed; } +void print_arg_difference(uint8_t parsed, uint8_t expected) +{ + comPort->print(F("Got ")); + comPort->print(parsed); + comPort->print(F(" but expected ")); + comPort->print(expected); +} + +void free_parsed_arguments(char **arguments, uint8_t parsed) +{ + // free parsed arguments + for (uint8_t i = 0; i < parsed; i++) + { + free(arguments[i]); + } +} + +bool assert_exact_args(uint8_t parsed, uint8_t num_args) +{ + return parsed == num_args; +} + void get_version(String) { comPort->println(F(VERSION_STRING)); diff --git a/src/main.h b/src/main.h index b4d380b..5230602 100644 --- a/src/main.h +++ b/src/main.h @@ -40,6 +40,11 @@ inline bool read_eeprom_bool(uint16_t address, bool default_value) const Command end_command = END_COMMAND; uint8_t parse_arguments(char ** arguments, String, uint8_t); +bool assert_exact_args(uint8_t parsed, uint8_t num_args); + +void print_arg_difference(uint8_t parsed, uint8_t expected); +void free_parsed_arguments(char** arguments, uint8_t parsed); + extern void register_module(const Command commands[], void (*loop_fn)(void)); void get_version(String); diff --git a/src/modules/stage/stage.cpp b/src/modules/stage/stage.cpp index 1d5c86c..6bf53c4 100644 --- a/src/modules/stage/stage.cpp +++ b/src/modules/stage/stage.cpp @@ -206,12 +206,27 @@ void stage_loop() void stage_move_single_axis(uint8_t axis, String command) { char *args[1]; - parse_arguments(args, command, 1); - int move = atoi(args[0]); - EACH_MOTOR displacement[i] = 0; - displacement[axis] = move; - start_move(displacement); - free(args[0]); + uint8_t parsed = parse_arguments(args, command, 1); + + // make sure that the exact number of arguments are parsed + if(assert_exact_args(parsed, 1)) + { + long move = (long) atof(args[0]); + EACH_MOTOR displacement[i] = 0; + displacement[axis] = move; + start_move(displacement); + free(args[0]); + } + else + { + // report the error (in a single line) + comPort->print(F("Error: stage single axis movement did not receive correct number of arguments. ")); + print_arg_difference(parsed, n_motors); + comPort->println(F(". Skippping command!")); + + // free memory for parsed arguments + free_parsed_arguments(args, parsed); + } } void stage_mrx(String command) @@ -232,14 +247,29 @@ void stage_mrz(String command) void stage_mr(String command) { char *args[STAGE_MAX_MOTORS]; - parse_arguments(args, command, n_motors); - EACH_MOTOR - { - displacement[i] = atol(args[i]); - free(args[i]); - } + uint8_t parsed = parse_arguments(args, command, n_motors); - start_move(displacement); + if (assert_exact_args(parsed, n_motors)) + { + // start executing the movement + EACH_MOTOR + { + displacement[i] = (long) atof(args[i]); + free(args[i]); + } + + start_move(displacement); + } + else + { + // report the error (in a single line) + comPort->print(F("Error: stage multi axis movement did not receive correct amount of commands. ")); + print_arg_difference(parsed, n_motors); + comPort->println(F(". Skippping command!")); + + // free memory for parsed arguments + free_parsed_arguments(args, parsed); + } } void stage_release(String command)