From bdfe4ca4d154c61740eb4a1d2d33bc9f21dce404 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 26 Mar 2022 18:54:02 -0500 Subject: [PATCH] Simplify menu items, use enum, adjust settings --- Marlin/src/feature/pause.cpp | 4 +- Marlin/src/feature/runout.cpp | 2 +- Marlin/src/feature/runout.h | 19 ++++-- Marlin/src/gcode/feature/runout/M591.cpp | 24 ++++---- Marlin/src/lcd/menu/menu_advanced.cpp | 22 +++---- Marlin/src/module/endstops.cpp | 14 ++--- Marlin/src/module/settings.cpp | 77 +++++++++++------------- 7 files changed, 79 insertions(+), 83 deletions(-) diff --git a/Marlin/src/feature/pause.cpp b/Marlin/src/feature/pause.cpp index 34ebcbc7f0..8aa1ff4f03 100644 --- a/Marlin/src/feature/pause.cpp +++ b/Marlin/src/feature/pause.cpp @@ -217,8 +217,8 @@ bool load_filament(const_float_t slow_load_length/*=0*/, const_float_t fast_load REPEAT_1(NUM_RUNOUT_SENSORS, _CASE_RUNOUT) #undef _CASE_RUNOUT } - const uint8_t rm = runout.mode[i - 1]; - if (rm != 0 && rm != 7 && extDigitalRead(pin) != runout.out_state(i - 1)) + const RunoutMode rm = runout.mode[i - 1]; + if (rm != RM_NONE && rm != RM_MOTION_SENSOR && extDigitalRead(pin) != runout.out_state(i - 1)) wait_for_user = false; } #else diff --git a/Marlin/src/feature/runout.cpp b/Marlin/src/feature/runout.cpp index 96238c0f80..aae92d423f 100644 --- a/Marlin/src/feature/runout.cpp +++ b/Marlin/src/feature/runout.cpp @@ -34,7 +34,7 @@ FilamentMonitor runout; bool FilamentMonitorBase::enabled[NUM_RUNOUT_SENSORS], // Initialized by settings.load FilamentMonitorBase::filament_ran_out; // = false -uint8_t FilamentMonitorBase::mode[NUM_RUNOUT_SENSORS]; // Initialized by settings.load +RunoutMode FilamentMonitorBase::mode[NUM_RUNOUT_SENSORS]; // Initialized by settings.load #if ENABLED(HOST_ACTION_COMMANDS) bool FilamentMonitorBase::host_handling; // = false #endif diff --git a/Marlin/src/feature/runout.h b/Marlin/src/feature/runout.h index 72faaef449..57a7a0950d 100644 --- a/Marlin/src/feature/runout.h +++ b/Marlin/src/feature/runout.h @@ -61,12 +61,19 @@ extern FilamentMonitor runout; /*******************************************************************************************/ +enum RunoutMode : uint8_t { + RM_NONE, + RM_OUT_ON_LOW, + RM_OUT_ON_HIGH, + RM_MOTION_SENSOR +}; + class FilamentMonitorBase { public: static bool enabled[NUM_RUNOUT_SENSORS], filament_ran_out; - static uint8_t mode[NUM_RUNOUT_SENSORS]; // 0:NONE 1:Switch NC 2:Switch NO 7:Motion Sensor + static RunoutMode mode[NUM_RUNOUT_SENSORS]; - static uint8_t out_state(const uint8_t e=0) { return mode[e] == 2 ? HIGH : LOW; } + static uint8_t out_state(const uint8_t e=0) { return mode[e] == RM_OUT_ON_HIGH ? HIGH : LOW; } #if ENABLED(HOST_ACTION_COMMANDS) static bool host_handling; @@ -111,7 +118,7 @@ class TFilamentMonitor : public FilamentMonitorBase { // Give the response a chance to update its counter. static void run() { - if (enabled[active_extruder] && mode[active_extruder]!=0 && !filament_ran_out && (printingIsActive() || did_pause_print)) { + if (enabled[active_extruder] && mode[active_extruder] != RM_NONE && !filament_ran_out && (printingIsActive() || did_pause_print)) { cli(); // Prevent RunoutResponseDelayed::block_completed from accumulating here response.run(); sensor.run(); @@ -251,7 +258,7 @@ class FilamentSensorCore : public FilamentSensorBase { public: static void block_completed(const block_t * const b) { - if (runout.mode[active_extruder] != 7) return; + if (runout.mode[active_extruder] != RM_MOTION_SENSOR) return; // If the sensor wheel has moved since the last call to // this method reset the runout counter for the extruder. @@ -263,10 +270,10 @@ class FilamentSensorCore : public FilamentSensorBase { } static void run() { - if (runout.mode[active_extruder] == 7) { + if (runout.mode[active_extruder] == RM_MOTION_SENSOR) { poll_motion_sensor(); } - else if (runout.mode[active_extruder] != 0) { + else if (runout.mode[active_extruder] != RM_NONE) { LOOP_L_N(s, NUM_RUNOUT_SENSORS) { const bool out = poll_runout_state(s); if (!out) filament_present(s); diff --git a/Marlin/src/gcode/feature/runout/M591.cpp b/Marlin/src/gcode/feature/runout/M591.cpp index 0751de879a..271e56ad53 100644 --- a/Marlin/src/gcode/feature/runout/M591.cpp +++ b/Marlin/src/gcode/feature/runout/M591.cpp @@ -39,7 +39,7 @@ * P : Mode 0 = NONE * 1 = Switch NO (HIGH = filament present) * 2 = Switch NC (LOW = filament present) - * 7 = Encoder / Motion Sensor + * 3 = Encoder / Motion Sensor */ void GcodeSuite::M591() { if (parser.seen("RSDP" TERN_(HOST_ACTION_COMMANDS, "H"))) { @@ -48,19 +48,17 @@ void GcodeSuite::M591() { #endif const bool seenR = parser.seen_test('R'), seenS = parser.seen('S'); if (seenR || seenS) runout.reset(); - #if NUM_RUNOUT_SENSORS > 1 - const uint8_t tool = parser.ushortval('E', active_extruder); - #else - constexpr uint8_t tool = 0; - #endif + const uint8_t tool = TERN0(MULTI_FILAMENT_SENSOR, parser.ushortval('E', active_extruder)); if (seenS) runout.enabled[tool] = parser.value_bool(); - if (parser.seen('D')) runout.set_runout_distance(parser.value_linear_units(), tool); - if (parser.seen('L')) runout.set_runout_distance(parser.value_linear_units(), tool); + if (parser.seen('D') || parser.seen('L')) runout.set_runout_distance(parser.value_linear_units(), tool); if (parser.seen('P')) { - const uint8_t tmp_mode = parser.value_int(); - if (tmp_mode < 3 || tmp_mode == 7) { - runout.mode[tool] = tmp_mode; - runout.reset(); + const RunoutMode tmp_mode = (RunoutMode)parser.value_int(); + switch (tmp_mode) { + case RM_NONE ... RM_OUT_ON_HIGH: + case RM_MOTION_SENSOR: + runout.mode[tool] = tmp_mode; + runout.reset(); + default: break; } } } @@ -83,7 +81,7 @@ void GcodeSuite::M591_report(const bool forReplay/*=true*/) { LOOP_S_L_N(e, 1, NUM_RUNOUT_SENSORS) SERIAL_ECHOLNPGM( " M591" - #if NUM_RUNOUT_SENSORS > 1 + #if MULTI_FILAMENT_SENSOR " E", e, #endif " S", runout.enabled[e] diff --git a/Marlin/src/lcd/menu/menu_advanced.cpp b/Marlin/src/lcd/menu/menu_advanced.cpp index ac2da4d8a6..0b6d855974 100644 --- a/Marlin/src/lcd/menu/menu_advanced.cpp +++ b/Marlin/src/lcd/menu/menu_advanced.cpp @@ -99,23 +99,23 @@ void menu_backlash(); #if HAS_FILAMENT_SENSOR + void set_runout_mode_none(const uint8_t e) { runout.mode[e] = RM_NONE; } + void set_runout_mode_high(const uint8_t e) { runout.mode[e] = RM_OUT_ON_HIGH; } + void set_runout_mode_low(const uint8_t e) { runout.mode[e] = RM_OUT_ON_LOW; } + void set_runout_mode_motion(const uint8_t e) { runout.mode[e] = RM_MOTION_SENSOR; } + #define RUNOUT_EDIT_ITEMS(F) do{ \ - EDIT_ITEM_N(bool, F, MSG_RUNOUT_SENSOR, &runout.enabled[F]); \ - ACTION_ITEM_N(F, MSG_RUNOUT_MODE_NONE, []{ set_runout_mode_none(F);}); \ - ACTION_ITEM_N(F, MSG_RUNOUT_MODE_HIGH, []{ set_runout_mode_high(F);}); \ - ACTION_ITEM_N(F, MSG_RUNOUT_MODE_LOW, []{ set_runout_mode_low(F);}); \ - ACTION_ITEM_N(F, MSG_RUNOUT_MODE_MOTION, []{ set_runout_mode_motion(F);}); \ + EDIT_ITEM(bool, MSG_RUNOUT_SENSOR, &runout.enabled[F]); \ + ACTION_ITEM(MSG_RUNOUT_MODE_NONE, []{ set_runout_mode_none(F); }); \ + ACTION_ITEM(MSG_RUNOUT_MODE_HIGH, []{ set_runout_mode_high(F); }); \ + ACTION_ITEM(MSG_RUNOUT_MODE_LOW, []{ set_runout_mode_low(F); }); \ + ACTION_ITEM(MSG_RUNOUT_MODE_MOTION, []{ set_runout_mode_motion(F); }); \ editable.decimal = runout.runout_distance(F); \ - EDIT_ITEM_FAST_N(float3, F, MSG_RUNOUT_DISTANCE_MM, &editable.decimal, 1, 999, \ + EDIT_ITEM_FAST(float3, MSG_RUNOUT_DISTANCE_MM, &editable.decimal, 1, 999, \ []{ runout.set_runout_distance(editable.decimal, F); }, true \ ); \ }while(0) - void set_runout_mode_none(uint8_t e) { runout.mode[e] = 0; } - void set_runout_mode_high(uint8_t e) { runout.mode[e] = 1; } - void set_runout_mode_low(uint8_t e) { runout.mode[e] = 2; } - void set_runout_mode_motion(uint8_t e) { runout.mode[e] = 7; } - void menu_runout_config() { START_MENU(); BACK_ITEM(MSG_CONFIGURATION); diff --git a/Marlin/src/module/endstops.cpp b/Marlin/src/module/endstops.cpp index f41a6c9f87..0b942784ca 100644 --- a/Marlin/src/module/endstops.cpp +++ b/Marlin/src/module/endstops.cpp @@ -583,20 +583,20 @@ void _O2 Endstops::report_states() { REPEAT_1(NUM_RUNOUT_SENSORS, _CASE_RUNOUT) #undef _CASE_RUNOUT } - const uint8_t rm = runout.mode[i - 1], - state = runout.out_state(i - 1); + const RunoutMode rm = runout.mode[i - 1]; + const uint8_t outval = runout.out_state(i - 1); SERIAL_ECHOPGM(STR_FILAMENT); if (i > 1) SERIAL_CHAR(' ', '0' + i); SERIAL_ECHOPGM(": "); - if (rm == 0) - SERIAL_ECHOLNPGM("DISABLED"); - else if (rm == 7) { + if (rm == RM_NONE) + SERIAL_ECHOLNPGM(STR_OFF); + else if (rm == RM_MOTION_SENSOR) { SERIAL_ECHOPGM("MOTION : "); - print_es_state(extDigitalRead(pin) == state); + print_es_state(extDigitalRead(pin) == outval); } else - SERIAL_ECHOLNPGM_P(extDigitalRead(pin) == state ? PSTR("MISSING") : PSTR("PRESENT")); + SERIAL_ECHOLNPGM_P(extDigitalRead(pin) == outval ? PSTR("OUT") : PSTR("PRESENT")); } #endif diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index 7c10698ccc..ffb96cddf5 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -112,9 +112,6 @@ #if HAS_FILAMENT_SENSOR #include "../feature/runout.h" - #define NRS NUM_RUNOUT_SENSORS -#else - #define NRS 1 #endif #if ENABLED(EXTRA_LIN_ADVANCE_K) @@ -235,9 +232,11 @@ typedef struct SettingsDataStruct { // // FILAMENT_RUNOUT_SENSOR // - bool runout_enabled[NRS]; // M591 S - float runout_distance_mm[NRS]; // M591 D - uint8_t runout_mode[NRS]; // M591 P + #if HAS_FILAMENT_SENSOR + bool runout_enabled[NUM_RUNOUT_SENSORS]; // M591 S + float runout_distance_mm[NUM_RUNOUT_SENSORS]; // M591 D + uint8_t runout_mode[NUM_RUNOUT_SENSORS]; // M591 P + #endif // // ENABLE_LEVELING_FADE_HEIGHT @@ -781,29 +780,23 @@ void MarlinSettings::postprocess() { // // Hotend Offsets, if any // - { - #if HAS_HOTEND_OFFSET - // Skip hotend 0 which must be 0 - LOOP_S_L_N(e, 1, HOTENDS) - EEPROM_WRITE(hotend_offset[e]); - #endif - } + #if HAS_HOTEND_OFFSET + // Skip hotend 0 which must be 0 + LOOP_S_L_N(e, 1, HOTENDS) + EEPROM_WRITE(hotend_offset[e]); + #endif // // Filament Runout Sensor // + #if HAS_FILAMENT_SENSOR { _FIELD_TEST(runout_enabled); - #if HAS_FILAMENT_SENSOR - LOOP_L_N(e, NRS) EEPROM_WRITE(runout.enabled[e]); - LOOP_L_N(e, NRS) EEPROM_WRITE(runout.runout_distance(e)); - LOOP_L_N(e, NRS) EEPROM_WRITE(runout.mode[e]); - #else - EEPROM_WRITE((int8_t)-1); - EEPROM_WRITE((float)-0.0f); - EEPROM_WRITE((uint8_t)0); - #endif + LOOP_L_N(e, NUM_RUNOUT_SENSORS) EEPROM_WRITE(runout.enabled[e]); + LOOP_L_N(e, NUM_RUNOUT_SENSORS) EEPROM_WRITE(runout.runout_distance(e)); + LOOP_L_N(e, NUM_RUNOUT_SENSORS) EEPROM_WRITE(runout.mode[e]); } + #endif // // Global Leveling @@ -1707,30 +1700,28 @@ void MarlinSettings::postprocess() { // // Filament Runout Sensor // + #if HAS_FILAMENT_SENSOR { _FIELD_TEST(runout_enabled); - int8_t runout_enabled[NRS]; - float runout_distance_mm[NRS]; - uint8_t runout_mode[NRS]; + bool runout_enabled[NUM_RUNOUT_SENSORS]; + float runout_distance_mm[NUM_RUNOUT_SENSORS]; + RunoutMode runout_mode[NUM_RUNOUT_SENSORS]; - LOOP_S_L_N(e, 0, NRS) EEPROM_READ(runout_enabled[e]); - LOOP_S_L_N(e, 0, NRS) EEPROM_READ(runout_distance_mm[e]); - LOOP_S_L_N(e, 0, NRS) EEPROM_READ(runout_mode[e]); + EEPROM_READ(runout_enabled); + EEPROM_READ(runout_distance_mm); + EEPROM_READ(runout_mode); - #if HAS_FILAMENT_SENSOR - if (!validating) { - LOOP_S_L_N(e, 0, NRS) { - if (runout_enabled[e] >= 0) { - runout.enabled[e] = (runout_enabled[e] > 0); - runout.set_runout_distance(runout_distance_mm[e], e); - runout.mode[e] = runout_mode[e]; - } - } - runout.reset(); + if (!validating) { + LOOP_S_L_N(e, 0, NUM_RUNOUT_SENSORS) { + runout.enabled[e] = runout_enabled[e]; + runout.set_runout_distance(runout_distance_mm[e], e); + runout.mode[e] = runout_mode[e]; } - #endif + runout.reset(); + } } + #endif // // Global Leveling @@ -2797,12 +2788,12 @@ void MarlinSettings::reset() { constexpr bool fred[] = FIL_RUNOUT_ENABLED; constexpr uint8_t frm[] = FIL_RUNOUT_MODE; constexpr float frd[] = FIL_RUNOUT_DISTANCE_MM; - static_assert(COUNT(fred) == NRS, "FIL_RUNOUT_ENABLED must have NUM_RUNOUT_SENSORS values."); - static_assert(COUNT(frm) == NRS, "FIL_RUNOUT_MODE must have NUM_RUNOUT_SENSORS values."); - static_assert(COUNT(frd) == NRS, "FIL_RUNOUT_DISTANCE_MM must have NUM_RUNOUT_SENSORS values."); + static_assert(COUNT(fred) == NUM_RUNOUT_SENSORS, "FIL_RUNOUT_ENABLED must have NUM_RUNOUT_SENSORS values."); + static_assert(COUNT(frm) == NUM_RUNOUT_SENSORS, "FIL_RUNOUT_MODE must have NUM_RUNOUT_SENSORS values."); + static_assert(COUNT(frd) == NUM_RUNOUT_SENSORS, "FIL_RUNOUT_DISTANCE_MM must have NUM_RUNOUT_SENSORS values."); COPY(runout.enabled, fred); COPY(runout.mode, frm); - LOOP_L_N(e, NRS) runout.set_runout_distance(frd[e], e); + LOOP_L_N(e, NUM_RUNOUT_SENSORS) runout.set_runout_distance(frd[e], e); runout.reset(); #endif