Synchronize on M204, M205 (#12302)

* Add parser.seen for multiple parameters
* Fix M666, use !seen for report
* Synchronize on M204, M205
This commit is contained in:
Scott Lahteine 2018-11-03 01:16:37 -05:00 committed by GitHub
parent 5ba6607181
commit e4cf175163
Signed by: GitHub
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 89 additions and 70 deletions

View file

@ -22,7 +22,7 @@
#include "../../inc/MarlinConfig.h" #include "../../inc/MarlinConfig.h"
#if ENABLED(DELTA) || ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || ENABLED(Z_DUAL_ENDSTOPS) #if ENABLED(DELTA) || ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || Z_MULTI_ENDSTOPS
#include "../gcode.h" #include "../gcode.h"
@ -73,34 +73,23 @@
* Set Both: M666 Z<offset> * Set Both: M666 Z<offset>
*/ */
void GcodeSuite::M666() { void GcodeSuite::M666() {
bool report = true;
#if ENABLED(X_DUAL_ENDSTOPS) #if ENABLED(X_DUAL_ENDSTOPS)
if (parser.seen('X')) { if (parser.seenval('X')) endstops.x2_endstop_adj = parser.value_linear_units();
endstops.x2_endstop_adj = parser.value_linear_units();
report = false;
}
#endif #endif
#if ENABLED(Y_DUAL_ENDSTOPS) #if ENABLED(Y_DUAL_ENDSTOPS)
if (parser.seen('Y')) { if (parser.seenval('Y')) endstops.y2_endstop_adj = parser.value_linear_units();
endstops.y2_endstop_adj = parser.value_linear_units();
report = false;
}
#endif #endif
#if ENABLED(Z_TRIPLE_ENDSTOPS) #if ENABLED(Z_TRIPLE_ENDSTOPS)
if (parser.seen('Z')) { if (parser.seenval('Z')) {
const int ind = parser.intval('S');
const float z_adj = parser.value_linear_units(); const float z_adj = parser.value_linear_units();
const int ind = parser.intval('S');
if (!ind || ind == 2) endstops.z2_endstop_adj = z_adj; if (!ind || ind == 2) endstops.z2_endstop_adj = z_adj;
if (!ind || ind == 3) endstops.z3_endstop_adj = z_adj; if (!ind || ind == 3) endstops.z3_endstop_adj = z_adj;
report = false;
} }
#elif Z_MULTI_ENDSTOPS #elif Z_MULTI_ENDSTOPS
if (parser.seen('Z')) { if (parser.seen('Z')) endstops.z2_endstop_adj = parser.value_linear_units();
endstops.z2_endstop_adj = parser.value_linear_units();
report = false;
}
#endif #endif
if (report) { if (!parser.seen("XYZ")) {
SERIAL_ECHOPGM("Dual Endstop Adjustment (mm): "); SERIAL_ECHOPGM("Dual Endstop Adjustment (mm): ");
#if ENABLED(X_DUAL_ENDSTOPS) #if ENABLED(X_DUAL_ENDSTOPS)
SERIAL_ECHOPAIR(" X2:", endstops.x2_endstop_adj); SERIAL_ECHOPAIR(" X2:", endstops.x2_endstop_adj);

View file

@ -91,28 +91,19 @@ void GcodeSuite::M203() {
* T = Travel (non printing) moves * T = Travel (non printing) moves
*/ */
void GcodeSuite::M204() { void GcodeSuite::M204() {
bool report = true; if (!parser.seen("PRST")) {
if (parser.seenval('S')) { // Kept for legacy compatibility. Should NOT BE USED for new developments.
planner.settings.travel_acceleration = planner.settings.acceleration = parser.value_linear_units();
report = false;
}
if (parser.seenval('P')) {
planner.settings.acceleration = parser.value_linear_units();
report = false;
}
if (parser.seenval('R')) {
planner.settings.retract_acceleration = parser.value_linear_units();
report = false;
}
if (parser.seenval('T')) {
planner.settings.travel_acceleration = parser.value_linear_units();
report = false;
}
if (report) {
SERIAL_ECHOPAIR("Acceleration: P", planner.settings.acceleration); SERIAL_ECHOPAIR("Acceleration: P", planner.settings.acceleration);
SERIAL_ECHOPAIR(" R", planner.settings.retract_acceleration); SERIAL_ECHOPAIR(" R", planner.settings.retract_acceleration);
SERIAL_ECHOLNPAIR(" T", planner.settings.travel_acceleration); SERIAL_ECHOLNPAIR(" T", planner.settings.travel_acceleration);
} }
else {
planner.synchronize();
// 'S' for legacy compatibility. Should NOT BE USED for new development
if (parser.seenval('S')) planner.settings.travel_acceleration = planner.settings.acceleration = parser.value_linear_units();
if (parser.seenval('P')) planner.settings.acceleration = parser.value_linear_units();
if (parser.seenval('R')) planner.settings.retract_acceleration = parser.value_linear_units();
if (parser.seenval('T')) planner.settings.travel_acceleration = parser.value_linear_units();
}
} }
/** /**
@ -128,6 +119,19 @@ void GcodeSuite::M204() {
* J = Junction Deviation (mm) (Requires JUNCTION_DEVIATION) * J = Junction Deviation (mm) (Requires JUNCTION_DEVIATION)
*/ */
void GcodeSuite::M205() { void GcodeSuite::M205() {
#if ENABLED(JUNCTION_DEVIATION)
#define J_PARAM "J"
#else
#define J_PARAM
#endif
#if HAS_CLASSIC_JERK
#define XYZE_PARAM "XYZE"
#else
#define XYZE_PARAM
#endif
if (!parser.seen("BST" J_PARAM XYZE_PARAM)) return;
planner.synchronize();
if (parser.seen('B')) planner.settings.min_segment_time_us = parser.value_ulong(); if (parser.seen('B')) planner.settings.min_segment_time_us = parser.value_ulong();
if (parser.seen('S')) planner.settings.min_feedrate_mm_s = parser.value_linear_units(); if (parser.seen('S')) planner.settings.min_feedrate_mm_s = parser.value_linear_units();
if (parser.seen('T')) planner.settings.min_travel_feedrate_mm_s = parser.value_linear_units(); if (parser.seen('T')) planner.settings.min_travel_feedrate_mm_s = parser.value_linear_units();

View file

@ -66,24 +66,30 @@ void M217_report(const bool eeprom=false) {
*/ */
void GcodeSuite::M217() { void GcodeSuite::M217() {
bool report = true; #define SPR_PARAM
#define XY_PARAM
#if ENABLED(SINGLENOZZLE) #if ENABLED(SINGLENOZZLE)
if (parser.seenval('S')) { report = false; const float v = parser.value_linear_units(); toolchange_settings.swap_length = constrain(v, 0, 500); } #undef SPR_PARAM
if (parser.seenval('P')) { report = false; const int16_t v = parser.value_linear_units(); toolchange_settings.prime_speed = constrain(v, 10, 5400); } #define SPR_PARAM "SPR"
if (parser.seenval('R')) { report = false; const int16_t v = parser.value_linear_units(); toolchange_settings.retract_speed = constrain(v, 10, 5400); }
if (parser.seenval('S')) { const float v = parser.value_linear_units(); toolchange_settings.swap_length = constrain(v, 0, 500); }
if (parser.seenval('P')) { const int16_t v = parser.value_linear_units(); toolchange_settings.prime_speed = constrain(v, 10, 5400); }
if (parser.seenval('R')) { const int16_t v = parser.value_linear_units(); toolchange_settings.retract_speed = constrain(v, 10, 5400); }
#if ENABLED(SINGLENOZZLE_SWAP_PARK) #if ENABLED(SINGLENOZZLE_SWAP_PARK)
if (parser.seenval('X')) { report = false; toolchange_settings.change_point.x = parser.value_linear_units(); } #undef XY_PARAM
if (parser.seenval('Y')) { report = false; toolchange_settings.change_point.y = parser.value_linear_units(); } #define XY_PARAM "XY"
if (parser.seenval('X')) { toolchange_settings.change_point.x = parser.value_linear_units(); }
if (parser.seenval('Y')) { toolchange_settings.change_point.y = parser.value_linear_units(); }
#endif #endif
#endif #endif
if (parser.seenval('Z')) { report = false; toolchange_settings.z_raise = parser.value_linear_units(); } if (parser.seenval('Z')) { toolchange_settings.z_raise = parser.value_linear_units(); }
if (report) M217_report(); if (!parser.seen(SPR_PARAM XY_PARAM "Z")) M217_report();
} }

View file

@ -42,21 +42,11 @@
void GcodeSuite::M218() { void GcodeSuite::M218() {
if (get_target_extruder_from_command() || target_extruder == 0) return; if (get_target_extruder_from_command() || target_extruder == 0) return;
bool report = true; if (parser.seenval('X')) hotend_offset[X_AXIS][target_extruder] = parser.value_linear_units();
if (parser.seenval('X')) { if (parser.seenval('Y')) hotend_offset[Y_AXIS][target_extruder] = parser.value_linear_units();
hotend_offset[X_AXIS][target_extruder] = parser.value_linear_units(); if (parser.seenval('Z')) hotend_offset[Z_AXIS][target_extruder] = parser.value_linear_units();
report = false;
}
if (parser.seenval('Y')) {
hotend_offset[Y_AXIS][target_extruder] = parser.value_linear_units();
report = false;
}
if (parser.seenval('Z')) {
hotend_offset[Z_AXIS][target_extruder] = parser.value_linear_units();
report = false;
}
if (report) { if (!parser.seen("XYZ")) {
SERIAL_ECHO_START(); SERIAL_ECHO_START();
SERIAL_ECHOPGM(MSG_HOTEND_OFFSET); SERIAL_ECHOPGM(MSG_HOTEND_OFFSET);
HOTEND_LOOP() { HOTEND_LOOP() {

View file

@ -749,7 +749,7 @@ private:
static void M665(); static void M665();
#endif #endif
#if ENABLED(DELTA) || ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || ENABLED(Z_DUAL_ENDSTOPS) #if ENABLED(DELTA) || ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || Z_MULTI_ENDSTOPS
static void M666(); static void M666();
#endif #endif

View file

@ -19,6 +19,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
* *
*/ */
#pragma once
/** /**
* parser.h - Parser for a GCode line, providing a parameter interface. * parser.h - Parser for a GCode line, providing a parameter interface.
@ -26,9 +27,6 @@
* so settings for these codes are located in this class. * so settings for these codes are located in this class.
*/ */
#ifndef _PARSER_H_
#define _PARSER_H_
#include "../inc/MarlinConfig.h" #include "../inc/MarlinConfig.h"
//#define DEBUG_GCODE_PARSER //#define DEBUG_GCODE_PARSER
@ -115,7 +113,7 @@ public:
} }
// Set the flag and pointer for a parameter // Set the flag and pointer for a parameter
static void set(const char c, char * const ptr) { static inline void set(const char c, char * const ptr) {
const uint8_t ind = LETTER_BIT(c); const uint8_t ind = LETTER_BIT(c);
if (ind >= COUNT(param)) return; // Only A-Z if (ind >= COUNT(param)) return; // Only A-Z
SBI32(codebits, ind); // parameter exists SBI32(codebits, ind); // parameter exists
@ -132,7 +130,7 @@ public:
// Code seen bit was set. If not found, value_ptr is unchanged. // Code seen bit was set. If not found, value_ptr is unchanged.
// This allows "if (seen('A')||seen('B'))" to use the last-found value. // This allows "if (seen('A')||seen('B'))" to use the last-found value.
static bool seen(const char c) { static inline bool seen(const char c) {
const uint8_t ind = LETTER_BIT(c); const uint8_t ind = LETTER_BIT(c);
if (ind >= COUNT(param)) return false; // Only A-Z if (ind >= COUNT(param)) return false; // Only A-Z
const bool b = TEST32(codebits, ind); const bool b = TEST32(codebits, ind);
@ -143,7 +141,34 @@ public:
return b; return b;
} }
static bool seen_any() { return !!codebits; } FORCE_INLINE static constexpr uint32_t letter_bits(const char * const str) {
return (str[0] ? _BV32(LETTER_BIT(str[0])) |
(str[1] ? _BV32(LETTER_BIT(str[1])) |
(str[2] ? _BV32(LETTER_BIT(str[2])) |
(str[3] ? _BV32(LETTER_BIT(str[3])) |
(str[4] ? _BV32(LETTER_BIT(str[4])) |
(str[5] ? _BV32(LETTER_BIT(str[5])) |
(str[6] ? _BV32(LETTER_BIT(str[6])) |
(str[7] ? _BV32(LETTER_BIT(str[7])) |
(str[8] ? _BV32(LETTER_BIT(str[8])) |
(str[9] ? _BV32(LETTER_BIT(str[9]))
: 0) : 0) : 0) : 0) : 0) : 0) : 0) : 0) : 0) : 0);
}
// At least one of a list of code letters was seen
#ifdef CPU_32_BIT
FORCE_INLINE static bool seen(const char * const str) { return !!(codebits & letter_bits(str)); }
#else
// At least one of a list of code letters was seen
FORCE_INLINE static bool seen(const char * const str) {
const uint32_t letrbits = letter_bits(str);
const uint8_t * const cb = (uint8_t*)&codebits;
const uint8_t * const lb = (uint8_t*)&letrbits;
return (cb[0] & lb[0]) || (cb[1] & lb[1]) || (cb[2] & lb[2]) || (cb[3] & lb[3]);
}
#endif
static inline bool seen_any() { return !!codebits; }
#define SEEN_TEST(L) TEST32(codebits, LETTER_BIT(L)) #define SEEN_TEST(L) TEST32(codebits, LETTER_BIT(L))
@ -151,21 +176,28 @@ public:
// Code is found in the string. If not found, value_ptr is unchanged. // Code is found in the string. If not found, value_ptr is unchanged.
// This allows "if (seen('A')||seen('B'))" to use the last-found value. // This allows "if (seen('A')||seen('B'))" to use the last-found value.
static bool seen(const char c) { static inline bool seen(const char c) {
char *p = strchr(command_args, c); char *p = strchr(command_args, c);
const bool b = !!p; const bool b = !!p;
if (b) value_ptr = valid_float(&p[1]) ? &p[1] : (char*)NULL; if (b) value_ptr = valid_float(&p[1]) ? &p[1] : (char*)NULL;
return b; return b;
} }
static bool seen_any() { return *command_args == '\0'; } static inline bool seen_any() { return *command_args == '\0'; }
#define SEEN_TEST(L) !!strchr(command_args, L) #define SEEN_TEST(L) !!strchr(command_args, L)
// At least one of a list of code letters was seen
static inline bool seen(const char * const str) {
for (uint8_t i = 0; const char c = str[i]; i++)
if (SEEN_TEST(c)) return true;
return false;
}
#endif // !FASTER_GCODE_PARSER #endif // !FASTER_GCODE_PARSER
// Seen any axis parameter // Seen any axis parameter
static bool seen_axis() { static inline bool seen_axis() {
return SEEN_TEST('X') || SEEN_TEST('Y') || SEEN_TEST('Z') || SEEN_TEST('E'); return SEEN_TEST('X') || SEEN_TEST('Y') || SEEN_TEST('Z') || SEEN_TEST('E');
} }
@ -348,5 +380,3 @@ public:
}; };
extern GCodeParser parser; extern GCodeParser parser;
#endif // _PARSER_H_