diff --git a/Firmware/mmu2_reporting.cpp b/Firmware/mmu2_reporting.cpp index fd6a66b63..0efe3341f 100644 --- a/Firmware/mmu2_reporting.cpp +++ b/Firmware/mmu2_reporting.cpp @@ -301,17 +301,20 @@ TryLoadUnloadReporter::TryLoadUnloadReporter(float delta_mm) , lcd_cursor_col(0) , pixel_per_mm(0.5F * float(LCD_WIDTH) / (delta_mm)) { - // Clear the status line - lcd_set_cursor(0, 3); - lcd_space(LCD_WIDTH); - static_assert(LCD_WIDTH < 32); // for progress bits + lcd_clearstatus(); +} + +TryLoadUnloadReporter::~TryLoadUnloadReporter() { + // Delay the next status message just so + // the user can see the results clearly + lcd_reset_status_message_timeout(); } void TryLoadUnloadReporter::Render(uint8_t col, bool sensorState) { // Set the cursor position each time in case some other // part of the firmware changes the cursor position - lcd_putc_at(col, 3, sensorState ? '-' : LCD_STR_SOLID_BLOCK[0]); - lcd_reset_status_message_timeout(); + lcd_insert_char_into_status(col, sensorState ? LCD_STR_SOLID_BLOCK[0] : '-'); + if (!lcd_update_enabled) lcdui_print_status_line(); } void TryLoadUnloadReporter::Progress(bool sensorState){ @@ -321,22 +324,16 @@ void TryLoadUnloadReporter::Progress(bool sensorState){ dpixel0 = dpixel1; if (lcd_cursor_col > (LCD_WIDTH - 1)) lcd_cursor_col = LCD_WIDTH - 1; Render(lcd_cursor_col++, sensorState); - progress.dw <<= 1; - if(sensorState){ - progress.bytes[0] |= 1; - } } } void TryLoadUnloadReporter::DumpToSerial(){ char buf[LCD_WIDTH + 1]; - PU tmpProgress { progress.dw }; // avoid storing the shifted progress back into the memory - saves 4 instructions ;) - - // fill the buffer from the back - the last recorded fs state shall be printed as the last character - // i < 0xff means we go from LCD_WIDTH-1 down to zero included (LCD_WIDTH-1 is less than 0xff) - for (uint8_t i = LCD_WIDTH - 1; i < 0xff; --i) { - buf[i] = (tmpProgress.bytes[0] & 1) + '0'; - tmpProgress.dw >>= 1; + lcd_getstatus(buf); + for (uint8_t i = 0; i < sizeof(buf); i++) { + // 0xFF is -1 when converting from unsigned to signed char + // If the number is negative, that means filament is present + buf[i] = (buf[i] < 0) ? '1' : '0'; } buf[LCD_WIDTH] = 0; MMU2_ECHO_MSGLN(buf); diff --git a/Firmware/mmu2_reporting.h b/Firmware/mmu2_reporting.h index a5c3b6583..2a01afa0c 100644 --- a/Firmware/mmu2_reporting.h +++ b/Firmware/mmu2_reporting.h @@ -49,6 +49,7 @@ void ReportProgressHook(CommandInProgress cip, ProgressCode ec); struct TryLoadUnloadReporter { TryLoadUnloadReporter(float delta_mm); + ~TryLoadUnloadReporter(); void Progress(bool sensorState); void DumpToSerial(); @@ -58,24 +59,13 @@ private: /// @param sensorState if true, filament is not present, else filament is present. This controls which character to render void Render(uint8_t col, bool sensorState); - uint8_t dpixel1; uint8_t dpixel0; + uint8_t dpixel1; + uint8_t lcd_cursor_col; // The total length is twice delta_mm. Divide that length by number of pixels // available to get length per pixel. // Note: Below is the reciprocal of (2 * delta_mm) / LCD_WIDTH [mm/pixel] float pixel_per_mm; - uint8_t lcd_cursor_col; - - // Beware: needs to be a union to optimize for the 8bit better - union __attribute__((packed)) PU { - uint32_t dw; - uint8_t bytes[4]; - constexpr PU() - : dw(0) {} - constexpr PU(uint32_t dw) - : dw(dw) {} - } progress; - static_assert(sizeof(PU) == 4); }; /// Remders the sensor status line. Also used by the "resume temperature" screen.