mirror of
https://github.com/synthetos/g2.git
synced 2026-09-22 11:29:24 +08:00
Fixed Gcode parser to preserve large line numbers
This commit is contained in:
@@ -352,10 +352,11 @@ void cm_set_model_linenum(uint32_t linenum)
|
||||
{
|
||||
if (linenum < 0) {
|
||||
linenum = 0;
|
||||
rpt_exception(STAT_INPUT_LESS_THAN_MIN_VALUE, "line number is negative; set of zero");
|
||||
rpt_exception(STAT_INPUT_LESS_THAN_MIN_VALUE, "line number is negative; set to zero");
|
||||
} else
|
||||
if (linenum > MAX_FP_INTEGER) { // see util.h
|
||||
rpt_exception(STAT_INPUT_EXCEEDS_MAX_VALUE, "line number > 8,388,608; may be inexact");
|
||||
if (linenum >= MAX_LONG) { // see util.h
|
||||
linenum = 0;
|
||||
rpt_exception(STAT_INPUT_EXCEEDS_MAX_VALUE, "line number > 2.1 billion; set to zero");
|
||||
}
|
||||
cm->gm.linenum = linenum; // you must first set the model line number,
|
||||
nv_add_object((const char *)"n"); // then add the line number to the nv list
|
||||
|
||||
@@ -34,7 +34,7 @@ typedef struct GCodeInputValue { // Gcode inputs - meaning depends on context
|
||||
uint8_t next_action; // handles G modal group 1 moves & non-modals
|
||||
cmMotionMode motion_mode; // Group1: G0, G1, G2, G3, G38.2, G80, G81, G82, G83, G84, G85, G86, G87, G88, G89
|
||||
uint8_t program_flow; // used only by the gcode_parser
|
||||
uint32_t linenum; // N word
|
||||
int32_t linenum; // N word
|
||||
|
||||
float target[AXES]; // XYZABC where the move should go
|
||||
float arc_offset[3]; // IJK - used by arc commands
|
||||
@@ -119,7 +119,7 @@ GCodeFlag_t gf; // gcode input flags
|
||||
|
||||
// local helper functions and macros
|
||||
static void _normalize_gcode_block(char *str, char **active_comment, uint8_t *block_delete_flag);
|
||||
static stat_t _get_next_gcode_word(char **pstr, char *letter, float *value);
|
||||
static stat_t _get_next_gcode_word(char **pstr, char *letter, float *value, int32_t *value_int);
|
||||
static stat_t _point(float value);
|
||||
static stat_t _validate_gcode_block(char *active_comment);
|
||||
static stat_t _parse_gcode_block(char *line, char *active_comment); // Parse the block into the GN/GF structs
|
||||
@@ -435,7 +435,7 @@ static void _normalize_gcode_block(char *str, char **active_comment, uint8_t *bl
|
||||
* G0X... is not interpreted as hexadecimal. This is trapped.
|
||||
*/
|
||||
|
||||
static stat_t _get_next_gcode_word(char **pstr, char *letter, float *value)
|
||||
static stat_t _get_next_gcode_word(char **pstr, char *letter, float *value, int32_t *value_int)
|
||||
{
|
||||
if (**pstr == NUL) { return (STAT_COMPLETE); } // no more words
|
||||
|
||||
@@ -450,17 +450,18 @@ static stat_t _get_next_gcode_word(char **pstr, char *letter, float *value)
|
||||
if ((**pstr == '0') && (*(*pstr+1) == 'X')) {
|
||||
*value = 0;
|
||||
(*pstr)++;
|
||||
return (STAT_OK); // pointer points to X
|
||||
return (STAT_OK); // pointer points to X
|
||||
}
|
||||
|
||||
// get-value general case
|
||||
char *end;
|
||||
*value_int = atol(*pstr); // needed to get an accurate line number for N > 8,388,608
|
||||
*value = strtof(*pstr, &end);
|
||||
if(end == *pstr) {
|
||||
return(STAT_BAD_NUMBER_FORMAT);
|
||||
} // more robust test then checking for value=0;
|
||||
*pstr = end;
|
||||
return (STAT_OK); // pointer points to next character after the word
|
||||
return (STAT_OK); // pointer points to next character after the word
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -510,6 +511,7 @@ static stat_t _parse_gcode_block(char *buf, char *active_comment)
|
||||
char *pstr = (char *)buf; // persistent pointer into gcode block for parsing words
|
||||
char letter; // parsed letter, eg.g. G or X or Y
|
||||
float value = 0; // value parsed from letter (e.g. 2 for G2)
|
||||
int32_t value_int = 0; // integer value parsed from letter - needed for line numbers
|
||||
stat_t status = STAT_OK;
|
||||
|
||||
// set initial state for new move
|
||||
@@ -526,7 +528,7 @@ static stat_t _parse_gcode_block(char *buf, char *active_comment)
|
||||
}
|
||||
|
||||
// extract commands and parameters
|
||||
while((status = _get_next_gcode_word(&pstr, &letter, &value)) == STAT_OK) {
|
||||
while((status = _get_next_gcode_word(&pstr, &letter, &value, &value_int)) == STAT_OK) {
|
||||
switch(letter) {
|
||||
case 'G':
|
||||
switch((uint8_t)value) {
|
||||
@@ -678,7 +680,7 @@ static stat_t _parse_gcode_block(char *buf, char *active_comment)
|
||||
case 'K': SET_NON_MODAL (arc_offset[2], value);
|
||||
case 'L': SET_NON_MODAL (L_word, value);
|
||||
case 'R': SET_NON_MODAL (arc_radius, value);
|
||||
case 'N': SET_NON_MODAL (linenum,(uint32_t)value); // line number
|
||||
case 'N': SET_NON_MODAL (linenum, value_int); // line number handled as special case to preserve integer value
|
||||
default: status = STAT_GCODE_COMMAND_UNSUPPORTED;
|
||||
}
|
||||
if(status != STAT_OK) break;
|
||||
|
||||
@@ -106,9 +106,8 @@ void json_parse_for_exec(char *str, bool execute)
|
||||
nvObj_t *nv = nv_reset_exec_nv_list(); // get a fresh nvObj list
|
||||
stat_t status = _json_parser_kernal(nv, str);
|
||||
if ((status == STAT_OK) && (execute)) {
|
||||
// execute the command
|
||||
nv = nv_exec;
|
||||
status = _json_parser_execute(nv);
|
||||
status = _json_parser_execute(nv); // execute the command
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user