Merge pull request #4479 from gudnimg/PFW-1523-2

PFW-1523 Add the `S` parameter to `M79`
This commit is contained in:
Guðni Már Gilbert 2023-11-12 16:19:31 +00:00 committed by GitHub
commit 1e6460c344
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 100 additions and 35 deletions

View File

@ -5854,16 +5854,26 @@ Sigma_Exit:
} }
/*! /*!
### M79 - TODO ### M79 - Start host timer <a href="https://reprap.org/wiki/G-code#M79:_Start_host_timer">M79: Start host timer</a>
Restart the printer-host enable keepalive timer. While the timer has not expired, the printer will enable host specific features. Start the printer-host enable keep-alive timer. While the timer has not expired, the printer will enable host specific features.
#### Usage #### Usage
M79 M79 [ S ]
#### Parameters #### Parameters
None - `S` - Quoted string containing two characters e.g. "PL"
*/ */
case 79: case 79:
M79_timer_restart(); M79_timer_restart();
if (code_seen('S'))
{
unquoted_string str = unquoted_string(strchr_pointer);
if (str.WasFound())
{
ResetHostStatusScreenName();
SetHostStatusScreenName(str.GetUnquotedString());
}
}
break; break;
/*! /*!

View File

@ -1,8 +1,23 @@
#include <string.h>
#include "Configuration_adv.h" #include "Configuration_adv.h"
#include "host.h" #include "host.h"
#include "Timer.h" #include "Timer.h"
static LongTimer M79_timer; 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() { void M79_timer_restart() {
M79_timer.start(); M79_timer.start();

View File

@ -1,5 +1,15 @@
#pragma once #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 /// Restart the M79 timer
void M79_timer_restart(); void M79_timer_restart();

View File

@ -19,7 +19,7 @@
#include "menu.h" #include "menu.h"
#include "backlight.h" #include "backlight.h"
#include "host.h"
#include "util.h" #include "util.h"
#include "mesh_bed_leveling.h" #include "mesh_bed_leveling.h"
#include "mesh_bed_calibration.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) // Print percent done in form "USB---%", " SD---%", " ---%" (7 chars total)
void lcdui_print_percent_done(void) void lcdui_print_percent_done(void)
{ {
const char* src = usb_timer.running()?_N("USB"):(IS_SD_PRINTING?_N(" SD"):_N(" ")); const char* src = usb_timer.running()?_N(" HO"):(IS_SD_PRINTING?_N(" SD"):_N(" "));
char per[4];
bool num = IS_SD_PRINTING || (printer_active() && (print_percent_done_normal != PRINT_PERCENT_DONE_INIT)); 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 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 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) // Print extruder status (5 chars total)

View File

@ -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) { void printer_smodel_check(const char *pStrPos, const char *actualPrinterSModel) {
char* pResult; unquoted_string smodel = unquoted_string(pStrPos);
size_t nLength;
size_t aLength;
pResult=code_string(pStrPos,&nLength); if(smodel.WasFound()) {
if(pResult != NULL) { const uint8_t compareLength = strlen_P(actualPrinterSModel);
aLength=strlen_P(actualPrinterSModel);
if(aLength > nLength) nLength = aLength;
// Only compare first 6 chars on MK3|MK3S if string longer than 4 characters if(compareLength == smodel.GetLength()) {
if (nLength > 4 && strncmp_P(pResult, PSTR("MK3"), 3) == 0) nLength = 6; if (strncmp_P(smodel.GetUnquotedString(), actualPrinterSModel, compareLength) == 0) return;
if (strncmp_P(pResult, actualPrinterSModel, nLength) == 0) return; }
} }
render_M862_warnings( render_M862_warnings(

View File

@ -1,5 +1,6 @@
#pragma once #pragma once
#include <stdint.h> #include <stdint.h>
#include <string.h>
extern const uint16_t FW_VERSION_NR[4]; extern const uint16_t FW_VERSION_NR[4];
const char* FW_VERSION_STR_P(); const char* FW_VERSION_STR_P();
@ -84,6 +85,46 @@ enum class ClCompareValue:uint_least8_t
_Greater=2 _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 ClNozzleDiameter oNozzleDiameter;
extern ClCheckMode oCheckMode; extern ClCheckMode oCheckMode;
extern ClCheckModel oCheckModel; extern ClCheckModel oCheckModel;