diff --git a/Firmware/Marlin.h b/Firmware/Marlin.h index afc01859..c71f70ea 100755 --- a/Firmware/Marlin.h +++ b/Firmware/Marlin.h @@ -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(); diff --git a/Firmware/MarlinSerial.h b/Firmware/MarlinSerial.h index d596708e..27e722bc 100644 --- a/Firmware/MarlinSerial.h +++ b/Firmware/MarlinSerial.h @@ -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++); diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 3bde7239..d21d11b6 100755 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -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(); } diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index e1d9e0ab..d3699f45 100755 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -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(); }