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
Restart the printer-host enable keepalive timer. While the timer has not expired, the printer will enable host specific features.
### M79 - Start host timer <a href="https://reprap.org/wiki/G-code#M79:_Start_host_timer">M79: Start host timer</a>
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;
/*!

View File

@ -1,8 +1,23 @@
#include <string.h>
#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();

View File

@ -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();

View File

@ -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)

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) {
char* pResult;
size_t nLength;
size_t aLength;
unquoted_string smodel = unquoted_string(pStrPos);
pResult=code_string(pStrPos,&nLength);
if(pResult != NULL) {
aLength=strlen_P(actualPrinterSModel);
if(aLength > nLength) nLength = aLength;
if(smodel.WasFound()) {
const uint8_t compareLength = strlen_P(actualPrinterSModel);
// 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;
if(compareLength == smodel.GetLength()) {
if (strncmp_P(smodel.GetUnquotedString(), actualPrinterSModel, compareLength) == 0) return;
}
}
render_M862_warnings(

View File

@ -1,5 +1,6 @@
#pragma once
#include <stdint.h>
#include <string.h>
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;