diff --git a/Marlin/src/HAL/HAL_AVR/pinsDebug.h b/Marlin/src/HAL/HAL_AVR/pinsDebug.h index 8e083494d9..13c8a42b07 100644 --- a/Marlin/src/HAL/HAL_AVR/pinsDebug.h +++ b/Marlin/src/HAL/HAL_AVR/pinsDebug.h @@ -234,8 +234,7 @@ static void print_is_also_tied() { SERIAL_ECHOPGM(" is also tied to this pin"); void com_print(uint8_t N, uint8_t Z) { const uint8_t *TCCRA = (uint8_t*)TCCR_A(N); SERIAL_ECHOPGM(" COM"); - SERIAL_CHAR('0' + N); - SERIAL_CHAR('A' + Z); + SERIAL_CHAR('0' + N, 'A' + Z); SERIAL_ECHOPAIR(": ", int((*TCCRA >> (6 - Z * 2)) & 0x03)); } @@ -247,8 +246,7 @@ void timer_prefix(uint8_t T, char L, uint8_t N) { // T - timer L - pwm N - if (N == 4) WGM |= ((*TCCRB & _BV(WGM_3)) >> 1); SERIAL_ECHOPGM(" TIMER"); - SERIAL_CHAR(T + '0'); - SERIAL_CHAR(L); + SERIAL_CHAR(T + '0', L); SERIAL_ECHO_SP(3); if (N == 3) { diff --git a/Marlin/src/HAL/shared/backtrace/backtrace.cpp b/Marlin/src/HAL/shared/backtrace/backtrace.cpp index 7a8377f789..dab3968255 100644 --- a/Marlin/src/HAL/shared/backtrace/backtrace.cpp +++ b/Marlin/src/HAL/shared/backtrace/backtrace.cpp @@ -35,7 +35,7 @@ static bool UnwReportOut(void* ctx, const UnwReport* bte) { (*p)++; - SERIAL_CHAR('#'); SERIAL_PRINT(*p,DEC); SERIAL_ECHOPGM(" : "); + SERIAL_CHAR('#'); SERIAL_PRINT(*p, DEC); SERIAL_ECHOPGM(" : "); SERIAL_ECHOPGM(bte->name ? bte->name : "unknown"); SERIAL_ECHOPGM("@0x"); SERIAL_PRINT(bte->function, HEX); SERIAL_CHAR('+'); SERIAL_PRINT(bte->address - bte->function,DEC); SERIAL_ECHOPGM(" PC:"); SERIAL_PRINT(bte->address,HEX); SERIAL_CHAR('\n'); diff --git a/Marlin/src/core/serial.h b/Marlin/src/core/serial.h index bdf3ba4686..1e1eb8c623 100644 --- a/Marlin/src/core/serial.h +++ b/Marlin/src/core/serial.h @@ -66,7 +66,6 @@ extern uint8_t marlin_debug_flags; #define PORT_REDIRECT(p) _PORT_REDIRECT(1,p) #define PORT_RESTORE() _PORT_RESTORE(1) -#define SERIAL_CHAR(x) SERIAL_OUT(write, x) #define SERIAL_ECHO(x) SERIAL_OUT(print, x) #define SERIAL_ECHO_F(V...) SERIAL_OUT(print, V) #define SERIAL_ECHOLN(x) SERIAL_OUT(println, x) @@ -83,6 +82,22 @@ extern uint8_t marlin_debug_flags; #define SERIAL_FLUSHTX() #endif +// Print up to 10 chars from a list +#define __CHAR_N(N,V...) _CHAR_##N(V) +#define _CHAR_N(N,V...) __CHAR_N(N,V) +#define _CHAR_1(c) SERIAL_OUT(write, c) +#define _CHAR_2(a,b) do{ _CHAR_1(a); _CHAR_1(b); }while(0) +#define _CHAR_3(a,V...) do{ _CHAR_1(a); _CHAR_2(V); }while(0) +#define _CHAR_4(a,V...) do{ _CHAR_1(a); _CHAR_3(V); }while(0) +#define _CHAR_5(a,V...) do{ _CHAR_1(a); _CHAR_4(V); }while(0) +#define _CHAR_6(a,V...) do{ _CHAR_1(a); _CHAR_5(V); }while(0) +#define _CHAR_7(a,V...) do{ _CHAR_1(a); _CHAR_6(V); }while(0) +#define _CHAR_8(a,V...) do{ _CHAR_1(a); _CHAR_7(V); }while(0) +#define _CHAR_9(a,V...) do{ _CHAR_1(a); _CHAR_8(V); }while(0) +#define _CHAR_10(a,V...) do{ _CHAR_1(a); _CHAR_9(V); }while(0) + +#define SERIAL_CHAR(V...) _CHAR_N(NUM_ARGS(V),V) + // Print up to 12 pairs of values. Odd elements auto-wrapped in PSTR(). #define __SEP_N(N,V...) _SEP_##N(V) #define _SEP_N(N,V...) __SEP_N(N,V) diff --git a/Marlin/src/core/utility.cpp b/Marlin/src/core/utility.cpp index c2f7024320..16d0ea17c1 100644 --- a/Marlin/src/core/utility.cpp +++ b/Marlin/src/core/utility.cpp @@ -148,8 +148,7 @@ void safe_delay(millis_t ms) { SERIAL_ECHOPGM("ABL Adjustment X"); LOOP_XYZ(a) { float v = planner.get_axis_position_mm(AxisEnum(a)) - current_position[a]; - SERIAL_CHAR(' '); - SERIAL_CHAR('X' + char(a)); + SERIAL_CHAR(' ', 'X' + char(a)); if (v > 0) SERIAL_CHAR('+'); SERIAL_ECHO(v); } diff --git a/Marlin/src/feature/bedlevel/bedlevel.cpp b/Marlin/src/feature/bedlevel/bedlevel.cpp index ef8cfd3455..0ec5c6bfb3 100644 --- a/Marlin/src/feature/bedlevel/bedlevel.cpp +++ b/Marlin/src/feature/bedlevel/bedlevel.cpp @@ -207,8 +207,7 @@ void reset_bed_level() { #endif } #ifdef SCAD_MESH_OUTPUT - SERIAL_CHAR(' '); - SERIAL_CHAR(']'); // close sub-array + SERIAL_CHAR(' ', ']'); // close sub-array if (y < sy - 1) SERIAL_CHAR(','); #endif SERIAL_EOL(); diff --git a/Marlin/src/feature/runout.h b/Marlin/src/feature/runout.h index 4fed18e359..d49fb77fe3 100644 --- a/Marlin/src/feature/runout.h +++ b/Marlin/src/feature/runout.h @@ -213,7 +213,7 @@ class FilamentSensorBase { if (change) { SERIAL_ECHOPGM("Motion detected:"); for (uint8_t e = 0; e < NUM_RUNOUT_SENSORS; e++) - if (TEST(change, e)) { SERIAL_CHAR(' '); SERIAL_CHAR('0' + e); } + if (TEST(change, e)) SERIAL_CHAR(' ', '0' + e); SERIAL_EOL(); } #endif diff --git a/Marlin/src/gcode/calibrate/M100.cpp b/Marlin/src/gcode/calibrate/M100.cpp index 0318af0a68..a77583c6e1 100644 --- a/Marlin/src/gcode/calibrate/M100.cpp +++ b/Marlin/src/gcode/calibrate/M100.cpp @@ -238,12 +238,12 @@ inline int check_for_free_memory_corruption(PGM_P const title) { SERIAL_ECHOLNPGM("\nMemory Corruption detected in free memory area."); if (block_cnt == 0) // Make sure the special case of no free blocks shows up as an - block_cnt = -1; // error to the calling code! + block_cnt = -1; // error to the calling code! SERIAL_ECHOPGM(" return="); if (block_cnt == 1) { - SERIAL_CHAR('0'); // if the block_cnt is 1, nothing has broken up the free memory - SERIAL_EOL(); // area and it is appropriate to say 'no corruption'. + SERIAL_CHAR('0'); // If the block_cnt is 1, nothing has broken up the free memory + SERIAL_EOL(); // area and it is appropriate to say 'no corruption'. return 0; } SERIAL_ECHOLNPGM("true"); diff --git a/Marlin/src/gcode/calibrate/M425.cpp b/Marlin/src/gcode/calibrate/M425.cpp index a15287a5e6..a83ccd65c1 100644 --- a/Marlin/src/gcode/calibrate/M425.cpp +++ b/Marlin/src/gcode/calibrate/M425.cpp @@ -75,8 +75,7 @@ void GcodeSuite::M425() { SERIAL_ECHOLNPAIR(" Correction Amount/Fade-out: F", backlash.get_correction(), " (F1.0 = full, F0.0 = none)"); SERIAL_ECHOPGM(" Backlash Distance (mm): "); LOOP_XYZ(a) { - SERIAL_CHAR(' '); - SERIAL_CHAR(axis_codes[a]); + SERIAL_CHAR(' ', axis_codes[a]); SERIAL_ECHO(backlash.distance_mm[a]); SERIAL_EOL(); } @@ -89,8 +88,7 @@ void GcodeSuite::M425() { SERIAL_ECHOPGM(" Average measured backlash (mm):"); if (backlash.has_any_measurement()) { LOOP_XYZ(a) if (backlash.has_measurement(AxisEnum(a))) { - SERIAL_CHAR(' '); - SERIAL_CHAR(axis_codes[a]); + SERIAL_CHAR(' ', axis_codes[a]); SERIAL_ECHO(backlash.get_measurement(AxisEnum(a))); } } diff --git a/Marlin/src/gcode/config/M221.cpp b/Marlin/src/gcode/config/M221.cpp index 116ce776b2..a7a48c3730 100644 --- a/Marlin/src/gcode/config/M221.cpp +++ b/Marlin/src/gcode/config/M221.cpp @@ -39,8 +39,7 @@ void GcodeSuite::M221() { } else { SERIAL_ECHO_START(); - SERIAL_CHAR('E'); - SERIAL_CHAR('0' + target_extruder); + SERIAL_CHAR('E', '0' + target_extruder); SERIAL_ECHOPAIR(" Flow: ", planner.flow_percentage[target_extruder]); SERIAL_CHAR('%'); SERIAL_EOL(); diff --git a/Marlin/src/gcode/host/M114.cpp b/Marlin/src/gcode/host/M114.cpp index 68cbd2b8a4..17356933fe 100644 --- a/Marlin/src/gcode/host/M114.cpp +++ b/Marlin/src/gcode/host/M114.cpp @@ -39,9 +39,7 @@ void report_xyze(const xyze_pos_t &pos, const uint8_t n=4, const uint8_t precision=3) { char str[12]; for (uint8_t a = 0; a < n; a++) { - SERIAL_CHAR(' '); - SERIAL_CHAR(axis_codes[a]); - SERIAL_CHAR(':'); + SERIAL_CHAR(' ', axis_codes[a], ':'); SERIAL_ECHO(dtostrf(pos[a], 1, precision, str)); } SERIAL_EOL(); @@ -50,9 +48,7 @@ void report_xyz(const xyz_pos_t &pos, const uint8_t precision=3) { char str[12]; for (uint8_t a = X_AXIS; a <= Z_AXIS; a++) { - SERIAL_CHAR(' '); - SERIAL_CHAR(axis_codes[a]); - SERIAL_CHAR(':'); + SERIAL_CHAR(' ', axis_codes[a], ':'); SERIAL_ECHO(dtostrf(pos[a], 1, precision, str)); } SERIAL_EOL(); @@ -150,9 +146,7 @@ SERIAL_ECHOPGM("Stepper:"); LOOP_XYZE(i) { - SERIAL_CHAR(' '); - SERIAL_CHAR(axis_codes[i]); - SERIAL_CHAR(':'); + SERIAL_CHAR(' ', axis_codes[i], ':'); SERIAL_ECHO(stepper.position((AxisEnum)i)); } SERIAL_EOL(); diff --git a/Marlin/src/gcode/parser.cpp b/Marlin/src/gcode/parser.cpp index e2cfd9f70a..e5ce7beb1b 100644 --- a/Marlin/src/gcode/parser.cpp +++ b/Marlin/src/gcode/parser.cpp @@ -346,7 +346,7 @@ void GCodeParser::unknown_command_error() { SERIAL_ECHOLNPGM(")"); #if ENABLED(FASTER_GCODE_PARSER) SERIAL_ECHOPGM(" args: { "); - for (char c = 'A'; c <= 'Z'; ++c) if (seen(c)) { SERIAL_CHAR(c); SERIAL_CHAR(' '); } + for (char c = 'A'; c <= 'Z'; ++c) if (seen(c)) SERIAL_CHAR(c, ' '); SERIAL_CHAR('}'); #else SERIAL_ECHOPAIR(" args: { ", command_args, " }"); diff --git a/Marlin/src/libs/L6470/L6470_Marlin.cpp b/Marlin/src/libs/L6470/L6470_Marlin.cpp index 549ba3c364..90dd38a614 100644 --- a/Marlin/src/libs/L6470/L6470_Marlin.cpp +++ b/Marlin/src/libs/L6470/L6470_Marlin.cpp @@ -539,10 +539,7 @@ bool L6470_Marlin::get_user_input(uint8_t &driver_count, uint8_t axis_index[3], void L6470_Marlin::say_axis(const uint8_t axis, const bool label/*=true*/) { if (label) SERIAL_ECHOPGM("AXIS:"); - SERIAL_CHAR(' '); - SERIAL_CHAR(index_to_axis[axis][0]); - SERIAL_CHAR(index_to_axis[axis][1]); - SERIAL_CHAR(' '); + SERIAL_CHAR(' ', index_to_axis[axis][0], index_to_axis[axis][1], ' '); } void L6470_Marlin::error_status_decode(const uint16_t status, const uint8_t axis) { // assumes status bits have been inverted diff --git a/Marlin/src/module/endstops.cpp b/Marlin/src/module/endstops.cpp index f35493e86d..a9b5cca227 100644 --- a/Marlin/src/module/endstops.cpp +++ b/Marlin/src/module/endstops.cpp @@ -471,7 +471,7 @@ void _O2 Endstops::report_states() { #endif } SERIAL_ECHOPGM(MSG_FILAMENT_RUNOUT_SENSOR); - if (i > 1) { SERIAL_CHAR(' '); SERIAL_CHAR('0' + i); } + if (i > 1) SERIAL_CHAR(' ', '0' + i); print_es_state(extDigitalRead(pin) != FIL_RUNOUT_INVERTING); } #endif diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp index f1aa52b1ca..2bf091ab52 100644 --- a/Marlin/src/module/stepper.cpp +++ b/Marlin/src/module/stepper.cpp @@ -2932,77 +2932,78 @@ void Stepper::report_positions() { } void Stepper::microstep_readings() { - SERIAL_ECHOPGM("MS1,MS2,MS3 Pins\nX: "); + SERIAL_ECHOLNPGM("MS1|MS2|MS3 Pins"); #if HAS_X_MICROSTEPS - SERIAL_CHAR('0' + READ(X_MS1_PIN)); - SERIAL_CHAR('0' + READ(X_MS2_PIN)); - #if PIN_EXISTS(X_MS3) - SERIAL_ECHOLN((int)READ(X_MS3_PIN)); - #endif + SERIAL_ECHOPGM("X: "); + SERIAL_CHAR('0' + READ(X_MS1_PIN), '0' + READ(X_MS2_PIN) + #if PIN_EXISTS(X_MS3) + , '0' + READ(X_MS3_PIN) + #endif + ); #endif #if HAS_Y_MICROSTEPS SERIAL_ECHOPGM("Y: "); - SERIAL_CHAR('0' + READ(Y_MS1_PIN)); - SERIAL_CHAR('0' + READ(Y_MS2_PIN)); - #if PIN_EXISTS(Y_MS3) - SERIAL_ECHOLN((int)READ(Y_MS3_PIN)); - #endif + SERIAL_CHAR('0' + READ(Y_MS1_PIN), '0' + READ(Y_MS2_PIN) + #if PIN_EXISTS(Y_MS3) + , '0' + READ(Y_MS3_PIN) + #endif + ); #endif #if HAS_Z_MICROSTEPS SERIAL_ECHOPGM("Z: "); - SERIAL_CHAR('0' + READ(Z_MS1_PIN)); - SERIAL_CHAR('0' + READ(Z_MS2_PIN)); - #if PIN_EXISTS(Z_MS3) - SERIAL_ECHOLN((int)READ(Z_MS3_PIN)); - #endif + SERIAL_CHAR('0' + READ(Z_MS1_PIN), '0' + READ(Z_MS2_PIN) + #if PIN_EXISTS(Z_MS3) + , '0' + READ(Z_MS3_PIN) + #endif + ); #endif #if HAS_E0_MICROSTEPS SERIAL_ECHOPGM("E0: "); - SERIAL_CHAR('0' + READ(E0_MS1_PIN)); - SERIAL_CHAR('0' + READ(E0_MS2_PIN)); - #if PIN_EXISTS(E0_MS3) - SERIAL_ECHOLN((int)READ(E0_MS3_PIN)); - #endif + SERIAL_CHAR('0' + READ(E0_MS1_PIN), '0' + READ(E0_MS2_PIN) + #if PIN_EXISTS(E0_MS3) + , '0' + READ(E0_MS3_PIN) + #endif + ); #endif #if HAS_E1_MICROSTEPS SERIAL_ECHOPGM("E1: "); - SERIAL_CHAR('0' + READ(E1_MS1_PIN)); - SERIAL_CHAR('0' + READ(E1_MS2_PIN)); - #if PIN_EXISTS(E1_MS3) - SERIAL_ECHOLN((int)READ(E1_MS3_PIN)); - #endif + SERIAL_CHAR('0' + READ(E1_MS1_PIN), '0' + READ(E1_MS2_PIN) + #if PIN_EXISTS(E1_MS3) + , '0' + READ(E1_MS3_PIN) + #endif + ); #endif #if HAS_E2_MICROSTEPS SERIAL_ECHOPGM("E2: "); - SERIAL_CHAR('0' + READ(E2_MS1_PIN)); - SERIAL_CHAR('0' + READ(E2_MS2_PIN)); - #if PIN_EXISTS(E2_MS3) - SERIAL_ECHOLN((int)READ(E2_MS3_PIN)); - #endif + SERIAL_CHAR('0' + READ(E2_MS1_PIN), '0' + READ(E2_MS2_PIN) + #if PIN_EXISTS(E2_MS3) + , '0' + READ(E2_MS3_PIN) + #endif + ); #endif #if HAS_E3_MICROSTEPS SERIAL_ECHOPGM("E3: "); - SERIAL_CHAR('0' + READ(E3_MS1_PIN)); - SERIAL_CHAR('0' + READ(E3_MS2_PIN)); - #if PIN_EXISTS(E3_MS3) - SERIAL_ECHOLN((int)READ(E3_MS3_PIN)); - #endif + SERIAL_CHAR('0' + READ(E3_MS1_PIN), '0' + READ(E3_MS2_PIN) + #if PIN_EXISTS(E3_MS3) + , '0' + READ(E3_MS3_PIN) + #endif + ); #endif #if HAS_E4_MICROSTEPS SERIAL_ECHOPGM("E4: "); - SERIAL_CHAR('0' + READ(E4_MS1_PIN)); - SERIAL_CHAR('0' + READ(E4_MS2_PIN)); - #if PIN_EXISTS(E4_MS3) - SERIAL_ECHOLN((int)READ(E4_MS3_PIN)); - #endif + SERIAL_CHAR('0' + READ(E4_MS1_PIN), '0' + READ(E4_MS2_PIN) + #if PIN_EXISTS(E4_MS3) + , '0' + READ(E4_MS3_PIN) + #endif + ); #endif #if HAS_E5_MICROSTEPS SERIAL_ECHOPGM("E5: "); - SERIAL_CHAR('0' + READ(E5_MS1_PIN)); - SERIAL_ECHOLN((int)READ(E5_MS2_PIN)); - #if PIN_EXISTS(E5_MS3) - SERIAL_ECHOLN((int)READ(E5_MS3_PIN)); - #endif + SERIAL_CHAR('0' + READ(E5_MS1_PIN), '0' + READ(E5_MS2_PIN) + #if PIN_EXISTS(E5_MS3) + , '0' + READ(E5_MS3_PIN) + #endif + ); #endif }