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:
parent
767f86b683
commit
59b5ae50a4
4 changed files with 71 additions and 14 deletions
|
|
@ -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
|
||||
|
|
|
|||
22
src/main.cpp
22
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));
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue