|
@ -52,7 +52,7 @@ GCodeQueue queue; |
|
|
* sending commands to Marlin, and lines will be checked for sequentiality. |
|
|
* sending commands to Marlin, and lines will be checked for sequentiality. |
|
|
* M110 N<int> sets the current line number. |
|
|
* M110 N<int> sets the current line number. |
|
|
*/ |
|
|
*/ |
|
|
long gcode_N, GCodeQueue::last_N; |
|
|
long GCodeQueue::last_N[NUM_SERIAL]; |
|
|
|
|
|
|
|
|
/**
|
|
|
/**
|
|
|
* GCode Command Queue |
|
|
* GCode Command Queue |
|
@ -277,7 +277,7 @@ void GCodeQueue::enqueue_now_P(PGM_P const pgcode) { |
|
|
*/ |
|
|
*/ |
|
|
void GCodeQueue::ok_to_send() { |
|
|
void GCodeQueue::ok_to_send() { |
|
|
#if NUM_SERIAL > 1 |
|
|
#if NUM_SERIAL > 1 |
|
|
const int16_t pn = port[index_r]; |
|
|
const int16_t pn = command_port(); |
|
|
if (pn < 0) return; |
|
|
if (pn < 0) return; |
|
|
PORT_REDIRECT(pn); // Reply to the serial port that sent the command
|
|
|
PORT_REDIRECT(pn); // Reply to the serial port that sent the command
|
|
|
#endif |
|
|
#endif |
|
@ -302,14 +302,15 @@ void GCodeQueue::ok_to_send() { |
|
|
* indicate that a command needs to be re-sent. |
|
|
* indicate that a command needs to be re-sent. |
|
|
*/ |
|
|
*/ |
|
|
void GCodeQueue::flush_and_request_resend() { |
|
|
void GCodeQueue::flush_and_request_resend() { |
|
|
|
|
|
const int16_t pn = command_port(); |
|
|
#if NUM_SERIAL > 1 |
|
|
#if NUM_SERIAL > 1 |
|
|
const int16_t pn = port[index_r]; |
|
|
|
|
|
if (pn < 0) return; |
|
|
if (pn < 0) return; |
|
|
PORT_REDIRECT(pn); // Reply to the serial port that sent the command
|
|
|
PORT_REDIRECT(pn); // Reply to the serial port that sent the command
|
|
|
#endif |
|
|
#endif |
|
|
SERIAL_FLUSH(); |
|
|
SERIAL_FLUSH(); |
|
|
SERIAL_ECHOPGM(STR_RESEND); |
|
|
SERIAL_ECHOPGM(STR_RESEND); |
|
|
SERIAL_ECHOLN(last_N + 1); |
|
|
|
|
|
|
|
|
SERIAL_ECHOLN(last_N[pn] + 1); |
|
|
ok_to_send(); |
|
|
ok_to_send(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@ -336,7 +337,7 @@ void GCodeQueue::gcode_line_error(PGM_P const err, const int8_t pn) { |
|
|
PORT_REDIRECT(pn); // Reply to the serial port that sent the command
|
|
|
PORT_REDIRECT(pn); // Reply to the serial port that sent the command
|
|
|
SERIAL_ERROR_START(); |
|
|
SERIAL_ERROR_START(); |
|
|
serialprintPGM(err); |
|
|
serialprintPGM(err); |
|
|
SERIAL_ECHOLN(last_N); |
|
|
SERIAL_ECHOLN(last_N[pn]); |
|
|
while (read_serial(pn) != -1); // Clear out the RX buffer
|
|
|
while (read_serial(pn) != -1); // Clear out the RX buffer
|
|
|
flush_and_request_resend(); |
|
|
flush_and_request_resend(); |
|
|
serial_count[pn] = 0; |
|
|
serial_count[pn] = 0; |
|
@ -475,9 +476,9 @@ void GCodeQueue::get_serial_commands() { |
|
|
if (n2pos) npos = n2pos; |
|
|
if (n2pos) npos = n2pos; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
gcode_N = strtol(npos + 1, nullptr, 10); |
|
|
const long gcode_N = strtol(npos + 1, nullptr, 10); |
|
|
|
|
|
|
|
|
if (gcode_N != last_N + 1 && !M110) |
|
|
if (gcode_N != last_N[i] + 1 && !M110) |
|
|
return gcode_line_error(PSTR(STR_ERR_LINE_NO), i); |
|
|
return gcode_line_error(PSTR(STR_ERR_LINE_NO), i); |
|
|
|
|
|
|
|
|
char *apos = strrchr(command, '*'); |
|
|
char *apos = strrchr(command, '*'); |
|
@ -490,7 +491,7 @@ void GCodeQueue::get_serial_commands() { |
|
|
else |
|
|
else |
|
|
return gcode_line_error(PSTR(STR_ERR_NO_CHECKSUM), i); |
|
|
return gcode_line_error(PSTR(STR_ERR_NO_CHECKSUM), i); |
|
|
|
|
|
|
|
|
last_N = gcode_N; |
|
|
last_N[i] = gcode_N; |
|
|
} |
|
|
} |
|
|
#if ENABLED(SDSUPPORT) |
|
|
#if ENABLED(SDSUPPORT) |
|
|
// Pronterface "M29" and "M29 " has no line number
|
|
|
// Pronterface "M29" and "M29 " has no line number
|
|
|