Merge branch 'movement-command-crash' into 'master'

Fix command parsing

See merge request filipayazi/sangaboard-firmware!5
This commit is contained in:
Filip Ayazi 2023-10-06 03:17:14 +00:00
commit 0f36232e45
4 changed files with 71 additions and 14 deletions

View file

@ -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

View file

@ -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));

View file

@ -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);

View file

@ -206,13 +206,28 @@ 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]);
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,15 +247,30 @@ void stage_mrz(String command)
void stage_mr(String command)
{
char *args[STAGE_MAX_MOTORS];
parse_arguments(args, command, n_motors);
uint8_t parsed = parse_arguments(args, command, n_motors);
if (assert_exact_args(parsed, n_motors))
{
// start executing the movement
EACH_MOTOR
{
displacement[i] = atol(args[i]);
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)
{