Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

PFW-1523 Add the S parameter to M79 #4479

Merged
merged 6 commits into from
Nov 12, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 14 additions & 4 deletions Firmware/Marlin_main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 <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;

/*!
Expand Down
15 changes: 15 additions & 0 deletions Firmware/host.cpp
Original file line number Diff line number Diff line change
@@ -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();
Expand Down
10 changes: 10 additions & 0 deletions Firmware/host.h
Original file line number Diff line number Diff line change
@@ -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();

Expand Down
19 changes: 14 additions & 5 deletions Firmware/ultralcd.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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
{
Expand All @@ -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)
Expand Down
36 changes: 8 additions & 28 deletions Firmware/util.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down
41 changes: 41 additions & 0 deletions Firmware/util.h
Original file line number Diff line number Diff line change
@@ -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();
Expand Down Expand Up @@ -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;
Expand Down
Loading