diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index eb703187a4..0ca4fe70aa 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -5853,16 +5853,26 @@ SERIAL_PROTOCOLPGM("\n\n"); } /*! - ### M79 - TODO - Restart the printer-host enable keepalive timer. While the timer has not expired, the printer will enable host specific features. + ### M79 - Start host timer M79: Start host timer + Start the printer-host enable keep-alive timer. While the timer has not expired, the printer will enable host specific features. #### Usage - M79 + M79 [ S ] #### Parameters - None + - `S` - Quoted string containing two characters e.g. "PL" */ case 79: M79_timer_restart(); + + if (code_seen('S')) + { + unquoted_string str = unquoted_string(strchr_pointer); + if (str.WasFound()) + { + ResetHostStatusScreenName(); + SetHostStatusScreenName(str.GetUnquotedString()); + } + } break; /*! diff --git a/Firmware/host.cpp b/Firmware/host.cpp index bd3c7c1e37..0f26c70685 100644 --- a/Firmware/host.cpp +++ b/Firmware/host.cpp @@ -1,8 +1,23 @@ +#include #include "Configuration_adv.h" #include "host.h" #include "Timer.h" static LongTimer M79_timer; +static char host_status_screen_name[3]; + +void SetHostStatusScreenName(const char * name) { + strncpy(host_status_screen_name, name, 2); + host_status_screen_name[2] = '\0'; +} + +char * GetHostStatusScreenName() { + return host_status_screen_name; +} + +void ResetHostStatusScreenName() { + memset(host_status_screen_name, 0, sizeof(host_status_screen_name)); +} void M79_timer_restart() { M79_timer.start(); diff --git a/Firmware/host.h b/Firmware/host.h index 373d6a28fd..d759d7d221 100644 --- a/Firmware/host.h +++ b/Firmware/host.h @@ -1,5 +1,15 @@ #pragma once +/// Assigns host name with up to two characters which will be shown on +/// the UI when printing. The function forces the third byte to be null delimiter. +void SetHostStatusScreenName(const char * name); + +/// Returns a pointer to the host name +char * GetHostStatusScreenName(); + +/// Reset the memory to NULL when the host name should not be used +void ResetHostStatusScreenName(); + /// Restart the M79 timer void M79_timer_restart(); diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 33f289785e..c15b1ef906 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -19,7 +19,7 @@ #include "menu.h" #include "backlight.h" - +#include "host.h" #include "util.h" #include "mesh_bed_leveling.h" #include "mesh_bed_calibration.h" @@ -359,8 +359,7 @@ void lcdui_print_feedrate(void) // Print percent done in form "USB---%", " SD---%", " ---%" (7 chars total) void lcdui_print_percent_done(void) { - const char* src = usb_timer.running()?_N("USB"):(IS_SD_PRINTING?_N(" SD"):_N(" ")); - char per[4]; + const char* src = usb_timer.running()?_N(" HO"):(IS_SD_PRINTING?_N(" SD"):_N(" ")); bool num = IS_SD_PRINTING || (printer_active() && (print_percent_done_normal != PRINT_PERCENT_DONE_INIT)); if (!num || heating_status != HeatingStatus::NO_HEATING) // either not printing or heating { @@ -375,8 +374,18 @@ void lcdui_print_percent_done(void) return; //do not also print the percentage } } - sprintf_P(per, num?_N("%3d"):_N("---"), calc_percent_done()); - lcd_printf_P(_N("%3S%3s%%"), src, per); + + if (!IS_SD_PRINTING && M79_timer_get_status() && GetHostStatusScreenName()) + { + // Overwrite the name + char * hostName = GetHostStatusScreenName(); + lcd_space(1); // Blank space + lcd_print(hostName); // Two characters + } else { + lcd_printf_P(PSTR("%3S"), src); + } + + lcd_printf_P(num ? _N("%3d%%"):_N("---%%"), calc_percent_done()); } // Print extruder status (5 chars total) diff --git a/Firmware/util.cpp b/Firmware/util.cpp index 6d955bd5e2..0e0bdbb7bb 100644 --- a/Firmware/util.cpp +++ b/Firmware/util.cpp @@ -385,36 +385,16 @@ void gcode_level_check(uint16_t nGcodeLevel) { ); } -#define GCODE_DELIMITER '"' - -char *code_string(const char *pStr, size_t *nLength) { -char* pStrBegin; -char* pStrEnd; - -pStrBegin=strchr(pStr,GCODE_DELIMITER); -if(!pStrBegin) - return(NULL); -pStrBegin++; -pStrEnd=strchr(pStrBegin,GCODE_DELIMITER); -if(!pStrEnd) - return(NULL); -*nLength=pStrEnd-pStrBegin; -return pStrBegin; -} void printer_smodel_check(const char *pStrPos, const char *actualPrinterSModel) { - char* pResult; - size_t nLength; - size_t aLength; - - pResult=code_string(pStrPos,&nLength); - if(pResult != NULL) { - aLength=strlen_P(actualPrinterSModel); - if(aLength > nLength) nLength = aLength; - - // Only compare first 6 chars on MK3|MK3S if string longer than 4 characters - if (nLength > 4 && strncmp_P(pResult, PSTR("MK3"), 3) == 0) nLength = 6; - if (strncmp_P(pResult, actualPrinterSModel, nLength) == 0) return; + unquoted_string smodel = unquoted_string(pStrPos); + + if(smodel.WasFound()) { + const uint8_t compareLength = strlen_P(actualPrinterSModel); + + if(compareLength == smodel.GetLength()) { + if (strncmp_P(smodel.GetUnquotedString(), actualPrinterSModel, compareLength) == 0) return; + } } render_M862_warnings( diff --git a/Firmware/util.h b/Firmware/util.h index d06d466dbf..f7c2596eda 100644 --- a/Firmware/util.h +++ b/Firmware/util.h @@ -1,5 +1,6 @@ #pragma once #include +#include extern const uint16_t FW_VERSION_NR[4]; const char* FW_VERSION_STR_P(); @@ -84,6 +85,46 @@ enum class ClCompareValue:uint_least8_t _Greater=2 }; +struct unquoted_string { +public: + /// @brief Given a pointer to a quoted string, filter out the quotes + /// @param pStr A constant pointer to a constant string to be searched/filtered. Modifying the pointer is strictly forbidden. + /// NOTE: Forcing inline saves ~36 bytes of flash + inline __attribute__((always_inline)) unquoted_string(const char * const pStr) + : len(0) + , found(false) + { + char * pStrEnd = NULL; + + // Start of the string + this->ptr = strchr(pStr, '"'); + if (!this->ptr) { + // First quote not found + return; + } + + // Skip the leading quote + this->ptr++; + + // End of the string + pStrEnd = strchr(this->ptr, '"'); + if(!pStrEnd) { + // Second quote not found + return; + } + this->len = pStrEnd - this->ptr; + this->found = true; + } + + bool WasFound() { return found; } + uint8_t GetLength() { return len; } + const char * GetUnquotedString() { return ptr; } +private: + const char * ptr = NULL; + uint8_t len; + bool found; +}; + extern ClNozzleDiameter oNozzleDiameter; extern ClCheckMode oCheckMode; extern ClCheckModel oCheckModel;