Handle float moves and check the number of arguments

DeltaStage sends moves commands as floats which led to occasional hard crashes,
this avoids it.

Incorrect number of arguments to move commands is now handled gracefully
and this will later be extended to more commands.
This commit is contained in:
JojoDevel 2023-10-06 03:17:14 +00:00 committed by Filip Ayazi
parent 767f86b683
commit 59b5ae50a4
4 changed files with 71 additions and 14 deletions

View file

@ -8,7 +8,7 @@
//general settings //general settings
#define MAX_COMMANDS 50 #define MAX_COMMANDS 50
#define MAX_MODULES 10 #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 VERSION_STRING "Sangaboard Firmware v1.0.0-dev"
#define DEBUG_ON #define DEBUG_ON
#define EMULATED_EEPROM_SIZE 512 #define EMULATED_EEPROM_SIZE 512

View file

@ -113,6 +113,28 @@ uint8_t parse_arguments(char **arguments, String command, uint8_t max_args)
return parsed; 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) void get_version(String)
{ {
comPort->println(F(VERSION_STRING)); comPort->println(F(VERSION_STRING));

View file

@ -40,6 +40,11 @@ inline bool read_eeprom_bool(uint16_t address, bool default_value)
const Command end_command = END_COMMAND; const Command end_command = END_COMMAND;
uint8_t parse_arguments(char ** arguments, String, uint8_t); 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)); extern void register_module(const Command commands[], void (*loop_fn)(void));
void get_version(String); void get_version(String);

View file

@ -206,12 +206,27 @@ void stage_loop()
void stage_move_single_axis(uint8_t axis, String command) void stage_move_single_axis(uint8_t axis, String command)
{ {
char *args[1]; char *args[1];
parse_arguments(args, command, 1); uint8_t parsed = parse_arguments(args, command, 1);
int move = atoi(args[0]);
EACH_MOTOR displacement[i] = 0; // make sure that the exact number of arguments are parsed
displacement[axis] = move; if(assert_exact_args(parsed, 1))
start_move(displacement); {
free(args[0]); 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) void stage_mrx(String command)
@ -232,14 +247,29 @@ void stage_mrz(String command)
void stage_mr(String command) void stage_mr(String command)
{ {
char *args[STAGE_MAX_MOTORS]; char *args[STAGE_MAX_MOTORS];
parse_arguments(args, command, n_motors); uint8_t parsed = parse_arguments(args, command, n_motors);
EACH_MOTOR
{
displacement[i] = atol(args[i]);
free(args[i]);
}
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) void stage_release(String command)