More than 7.5KB saved by slight refactoring of printing to serial line

This commit is contained in:
DRracer 2019-07-12 10:10:56 +02:00
parent a38f37aa06
commit a3fde091ab
4 changed files with 63 additions and 76 deletions

View File

@ -79,9 +79,9 @@ extern FILE _uartout;
#define SERIAL_PROTOCOL_F(x,y) (MYSERIAL.print(x,y))
#define SERIAL_PROTOCOLPGM(x) (serialprintPGM(PSTR(x)))
#define SERIAL_PROTOCOLRPGM(x) (serialprintPGM((x)))
#define SERIAL_PROTOCOLLN(x) (MYSERIAL.print(x),MYSERIAL.write('\n'))
#define SERIAL_PROTOCOLLNPGM(x) (serialprintPGM(PSTR(x)),MYSERIAL.write('\n'))
#define SERIAL_PROTOCOLLNRPGM(x) (serialprintPGM((x)),MYSERIAL.write('\n'))
#define SERIAL_PROTOCOLLN(x) (MYSERIAL.println(x)/*,MYSERIAL.write('\n')*/)
#define SERIAL_PROTOCOLLNPGM(x) (serialprintPGM(PSTR(x)),MYSERIAL.println()/*write('\n')*/)
#define SERIAL_PROTOCOLLNRPGM(x) (serialprintPGM((x)),MYSERIAL.println()/*write('\n')*/)
extern const char errormagic[] PROGMEM;
@ -111,15 +111,9 @@ void serial_echopair_P(const char *s_P, unsigned long v);
//Things to write to serial from Program memory. Saves 400 to 2k of RAM.
FORCE_INLINE void serialprintPGM(const char *str)
{
char ch=pgm_read_byte(str);
while(ch)
{
MYSERIAL.write(ch);
ch=pgm_read_byte(++str);
}
}
// Making this FORCE_INLINE is not a good idea when running out of FLASH
// I'd rather skip a few CPU ticks than 5.5KB (!!) of FLASH
void serialprintPGM(const char *str);
bool is_buffer_empty();
void get_command();

View File

@ -96,7 +96,7 @@ class MarlinSerial //: public Stream
static int read(void);
static void flush(void);
static FORCE_INLINE int available(void)
static /*FORCE_INLINE*/ int available(void)
{
return (unsigned int)(RX_BUFFER_SIZE + rx_buffer.head - rx_buffer.tail) % RX_BUFFER_SIZE;
}
@ -184,14 +184,14 @@ class MarlinSerial //: public Stream
public:
static FORCE_INLINE void write(const char *str)
static /*FORCE_INLINE*/ void write(const char *str)
{
while (*str)
write(*str++);
}
static FORCE_INLINE void write(const uint8_t *buffer, size_t size)
static /*FORCE_INLINE*/ void write(const uint8_t *buffer, size_t size)
{
while (size--)
write(*buffer++);

View File

@ -411,6 +411,24 @@ void serial_echopair_P(const char *s_P, double v)
void serial_echopair_P(const char *s_P, unsigned long v)
{ serialprintPGM(s_P); SERIAL_ECHO(v); }
/*FORCE_INLINE*/ void serialprintPGM(const char *str)
{
#if 0
char ch=pgm_read_byte(str);
while(ch)
{
MYSERIAL.write(ch);
ch=pgm_read_byte(++str);
}
#else
// hmm, same size as the above version, the compiler did a good job optimizing the above
while( uint8_t ch = pgm_read_byte(str) ){
MYSERIAL.write((char)ch);
++str;
}
#endif
}
#ifdef SDSUPPORT
#include "SdFatUtil.h"
int freeMemory() { return SdFatUtil::FreeRam(); }

View File

@ -3954,6 +3954,13 @@ void lcd_menu_show_sensors_state() // NOT static due to using ins
}
}
void prusa_statistics_err(char c){
SERIAL_ECHO("{[ERR:");
SERIAL_ECHO(c);
SERIAL_ECHO(']');
prusa_stat_farm_number();
}
void prusa_statistics(int _message, uint8_t _fil_nr) {
#ifdef DEBUG_DISABLE_PRUSA_STATISTICS
return;
@ -3963,114 +3970,93 @@ void prusa_statistics(int _message, uint8_t _fil_nr) {
case 0: // default message
if (busy_state == PAUSED_FOR_USER)
{
SERIAL_ECHO("{");
prusa_stat_printerstatus(15);
prusa_stat_farm_number();
prusa_stat_printinfo();
SERIAL_ECHOLN("}");
{
status_number = 15;
}
else if (isPrintPaused || card.paused)
{
SERIAL_ECHO("{");
prusa_stat_printerstatus(14);
prusa_stat_farm_number();
prusa_stat_printinfo();
SERIAL_ECHOLN("}");
status_number = 14;
}
else if (IS_SD_PRINTING || loading_flag)
{
SERIAL_ECHO("{");
prusa_stat_printerstatus(4);
prusa_stat_farm_number();
prusa_stat_printinfo();
SERIAL_ECHOLN("}");
status_number = 4;
}
else
{
SERIAL_ECHO("{");
prusa_stat_printerstatus(1);
prusa_stat_farm_number();
prusa_stat_diameter();
SERIAL_ECHOLN("}");
status_number = 1;
}
SERIAL_ECHO('{');
prusa_stat_printerstatus(status_number);
prusa_stat_farm_number();
prusa_stat_printinfo();
break;
case 1: // 1 heating
farm_status = 2;
SERIAL_ECHO("{");
SERIAL_ECHO('{');
prusa_stat_printerstatus(2);
prusa_stat_farm_number();
SERIAL_ECHOLN("}");
status_number = 2;
farm_timer = 1;
break;
case 2: // heating done
farm_status = 3;
SERIAL_ECHO("{");
SERIAL_ECHO('{');
prusa_stat_printerstatus(3);
prusa_stat_farm_number();
SERIAL_ECHOLN("}");
SERIAL_ECHOLN('}');
status_number = 3;
farm_timer = 1;
if (IS_SD_PRINTING || loading_flag)
{
farm_status = 4;
SERIAL_ECHO("{");
SERIAL_ECHO('{');
prusa_stat_printerstatus(4);
prusa_stat_farm_number();
SERIAL_ECHOLN("}");
status_number = 4;
}
else
{
SERIAL_ECHO("{");
SERIAL_ECHO('{');
prusa_stat_printerstatus(3);
prusa_stat_farm_number();
SERIAL_ECHOLN("}");
status_number = 3;
}
farm_timer = 1;
break;
case 3: // filament change
// must do a return here to prevent doing SERIAL_ECHOLN("}") at the very end of this function
// saved a considerable amount of FLASH
return;
break;
case 4: // print succesfull
SERIAL_ECHO("{[RES:1][FIL:");
MYSERIAL.print(int(_fil_nr));
SERIAL_ECHO("]");
SERIAL_ECHO(']');
prusa_stat_printerstatus(status_number);
prusa_stat_farm_number();
SERIAL_ECHOLN("}");
farm_timer = 2;
break;
case 5: // print not succesfull
SERIAL_ECHO("{[RES:0][FIL:");
MYSERIAL.print(int(_fil_nr));
SERIAL_ECHO("]");
SERIAL_ECHO(']');
prusa_stat_printerstatus(status_number);
prusa_stat_farm_number();
SERIAL_ECHOLN("}");
farm_timer = 2;
break;
case 6: // print done
SERIAL_ECHO("{[PRN:8]");
prusa_stat_farm_number();
SERIAL_ECHOLN("}");
status_number = 8;
farm_timer = 2;
break;
case 7: // print done - stopped
SERIAL_ECHO("{[PRN:9]");
prusa_stat_farm_number();
SERIAL_ECHOLN("}");
status_number = 9;
farm_timer = 2;
break;
@ -4078,49 +4064,38 @@ void prusa_statistics(int _message, uint8_t _fil_nr) {
SERIAL_ECHO("{[PRN:0][PFN:");
status_number = 0;
SERIAL_ECHO(farm_no);
SERIAL_ECHOLN("]}");
SERIAL_ECHO(']');
farm_timer = 2;
break;
case 20: // echo farm no
SERIAL_ECHO("{");
SERIAL_ECHO('{');
prusa_stat_printerstatus(status_number);
prusa_stat_farm_number();
SERIAL_ECHOLN("}");
farm_timer = 4;
break;
case 21: // temperatures
SERIAL_ECHO("{");
SERIAL_ECHO('{');
prusa_stat_temperatures();
prusa_stat_farm_number();
prusa_stat_printerstatus(status_number);
SERIAL_ECHOLN("}");
break;
case 22: // waiting for filament change
SERIAL_ECHO("{[PRN:5]");
prusa_stat_farm_number();
SERIAL_ECHOLN("}");
status_number = 5;
break;
case 90: // Error - Thermal Runaway
SERIAL_ECHO("{[ERR:1]");
prusa_stat_farm_number();
SERIAL_ECHOLN("}");
prusa_statistics_err('1');
break;
case 91: // Error - Thermal Runaway Preheat
SERIAL_ECHO("{[ERR:2]");
prusa_stat_farm_number();
SERIAL_ECHOLN("}");
prusa_statistics_err('2');
break;
case 92: // Error - Min temp
SERIAL_ECHO("{[ERR:3]");
prusa_stat_farm_number();
SERIAL_ECHOLN("}");
prusa_statistics_err('3');
break;
case 93: // Error - Max temp
SERIAL_ECHO("{[ERR:4]");
prusa_stat_farm_number();
SERIAL_ECHOLN("}");
prusa_statistics_err('4');
break;
case 99: // heartbeat
@ -4128,11 +4103,11 @@ void prusa_statistics(int _message, uint8_t _fil_nr) {
prusa_stat_temperatures();
SERIAL_ECHO("[PFN:");
SERIAL_ECHO(farm_no);
SERIAL_ECHO("]");
SERIAL_ECHOLN("}");
SERIAL_ECHO(']');
break;
}
SERIAL_ECHOLN('}');
}
@ -4140,19 +4115,19 @@ static void prusa_stat_printerstatus(int _status)
{
SERIAL_ECHO("[PRN:");
SERIAL_ECHO(_status);
SERIAL_ECHO("]");
SERIAL_ECHO(']');
}
static void prusa_stat_farm_number() {
SERIAL_ECHO("[PFN:");
SERIAL_ECHO(farm_no);
SERIAL_ECHO("]");
SERIAL_ECHO(']');
}
static void prusa_stat_diameter() {
SERIAL_ECHO("[DIA:");
SERIAL_ECHO(eeprom_read_word((uint16_t*)EEPROM_NOZZLE_DIAMETER_uM));
SERIAL_ECHO("]");
SERIAL_ECHO(']');
}
static void prusa_stat_temperatures()
@ -4165,7 +4140,7 @@ static void prusa_stat_temperatures()
SERIAL_ECHO(current_temperature[0]);
SERIAL_ECHO("][ATB:");
SERIAL_ECHO(current_temperature_bed);
SERIAL_ECHO("]");
SERIAL_ECHO(']');
}
static void prusa_stat_printinfo()
@ -4189,7 +4164,7 @@ static void prusa_stat_printinfo()
}
SERIAL_ECHO("][FWR:");
SERIAL_ECHO(FW_VERSION);
SERIAL_ECHO("]");
SERIAL_ECHO(']');
prusa_stat_diameter();
}