Merge pull request #3432 from leptun/MK3_3.12_Optimizations_PR3

memory and flash optimizations for 3.12 PR3
This commit is contained in:
Alex Voinea 2022-02-28 13:16:41 +02:00 committed by GitHub
commit 56cb8cbc63
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 53 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_PROTOCOL_F(x,y) (MYSERIAL.print(x,y))
#define SERIAL_PROTOCOLPGM(x) (serialprintPGM(PSTR(x))) #define SERIAL_PROTOCOLPGM(x) (serialprintPGM(PSTR(x)))
#define SERIAL_PROTOCOLRPGM(x) (serialprintPGM((x))) #define SERIAL_PROTOCOLRPGM(x) (serialprintPGM((x)))
#define SERIAL_PROTOCOLLN(x) (MYSERIAL.println(x)/*,MYSERIAL.write('\n')*/) #define SERIAL_PROTOCOLLN(x) (MYSERIAL.println(x))
#define SERIAL_PROTOCOLLNPGM(x) (serialprintPGM(PSTR(x)),MYSERIAL.println()/*write('\n')*/) #define SERIAL_PROTOCOLLNPGM(x) (serialprintlnPGM(PSTR(x)))
#define SERIAL_PROTOCOLLNRPGM(x) (serialprintPGM((x)),MYSERIAL.println()/*write('\n')*/) #define SERIAL_PROTOCOLLNRPGM(x) (serialprintlnPGM((x)))
extern const char errormagic[] PROGMEM; extern const char errormagic[] PROGMEM;
@ -115,6 +115,9 @@ void serial_echopair_P(const char *s_P, unsigned long v);
// I'd rather skip a few CPU ticks than 5.5KB (!!) of FLASH // I'd rather skip a few CPU ticks than 5.5KB (!!) of FLASH
void serialprintPGM(const char *str); void serialprintPGM(const char *str);
//The "ln" variant of the function above.
void serialprintlnPGM(const char *str);
bool is_buffer_empty(); bool is_buffer_empty();
void process_commands(); void process_commands();
void ramming(); void ramming();

View File

@ -467,22 +467,16 @@ void serial_echopair_P(const char *s_P, double v)
void serial_echopair_P(const char *s_P, unsigned long v) void serial_echopair_P(const char *s_P, unsigned long v)
{ serialprintPGM(s_P); SERIAL_ECHO(v); } { serialprintPGM(s_P); SERIAL_ECHO(v); }
/*FORCE_INLINE*/ void serialprintPGM(const char *str) void serialprintPGM(const char *str) {
{ while(uint8_t ch = pgm_read_byte(str)) {
#if 0 MYSERIAL.write((char)ch);
char ch=pgm_read_byte(str); ++str;
while(ch) }
{ }
MYSERIAL.write(ch);
ch=pgm_read_byte(++str); void serialprintlnPGM(const char *str) {
} serialprintPGM(str);
#else MYSERIAL.println();
// 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 #ifdef SDSUPPORT
@ -3676,9 +3670,7 @@ void gcode_M114()
SERIAL_PROTOCOLPGM(" Z:"); SERIAL_PROTOCOLPGM(" Z:");
SERIAL_PROTOCOL(float(st_get_position(Z_AXIS)) / cs.axis_steps_per_unit[Z_AXIS]); SERIAL_PROTOCOL(float(st_get_position(Z_AXIS)) / cs.axis_steps_per_unit[Z_AXIS]);
SERIAL_PROTOCOLPGM(" E:"); SERIAL_PROTOCOLPGM(" E:");
SERIAL_PROTOCOL(float(st_get_position(E_AXIS)) / cs.axis_steps_per_unit[E_AXIS]); SERIAL_PROTOCOLLN(float(st_get_position(E_AXIS)) / cs.axis_steps_per_unit[E_AXIS]);
SERIAL_PROTOCOLLN();
} }
#if (defined(FANCHECK) && (((defined(TACH_0) && (TACH_0 >-1)) || (defined(TACH_1) && (TACH_1 > -1))))) #if (defined(FANCHECK) && (((defined(TACH_0) && (TACH_0 >-1)) || (defined(TACH_1) && (TACH_1 > -1)))))
@ -6158,8 +6150,7 @@ if(eSoundMode!=e_SOUND_MODE_SILENT)
SERIAL_PROTOCOL('.'); SERIAL_PROTOCOL('.');
SERIAL_PROTOCOL(uint8_t(ip[2])); SERIAL_PROTOCOL(uint8_t(ip[2]));
SERIAL_PROTOCOL('.'); SERIAL_PROTOCOL('.');
SERIAL_PROTOCOL(uint8_t(ip[3])); SERIAL_PROTOCOLLN(uint8_t(ip[3]));
SERIAL_PROTOCOLLN();
} else { } else {
SERIAL_PROTOCOLPGM("?Toshiba FlashAir GetIP failed\n"); SERIAL_PROTOCOLPGM("?Toshiba FlashAir GetIP failed\n");
} }
@ -7730,8 +7721,7 @@ Sigma_Exit:
SERIAL_PROTOCOL(" Servo "); SERIAL_PROTOCOL(" Servo ");
SERIAL_PROTOCOL(servo_index); SERIAL_PROTOCOL(servo_index);
SERIAL_PROTOCOL(": "); SERIAL_PROTOCOL(": ");
SERIAL_PROTOCOL(servos[servo_index].read()); SERIAL_PROTOCOLLN(servos[servo_index].read());
SERIAL_PROTOCOLLN();
} }
} }
break; break;
@ -7796,14 +7786,14 @@ Sigma_Exit:
updatePID(); updatePID();
SERIAL_PROTOCOLRPGM(MSG_OK); SERIAL_PROTOCOLRPGM(MSG_OK);
SERIAL_PROTOCOL(" p:"); SERIAL_PROTOCOLPGM(" p:");
SERIAL_PROTOCOL(cs.Kp); SERIAL_PROTOCOL(cs.Kp);
SERIAL_PROTOCOL(" i:"); SERIAL_PROTOCOLPGM(" i:");
SERIAL_PROTOCOL(unscalePID_i(cs.Ki)); SERIAL_PROTOCOL(unscalePID_i(cs.Ki));
SERIAL_PROTOCOL(" d:"); SERIAL_PROTOCOLPGM(" d:");
SERIAL_PROTOCOL(unscalePID_d(cs.Kd)); SERIAL_PROTOCOL(unscalePID_d(cs.Kd));
#ifdef PID_ADD_EXTRUSION_RATE #ifdef PID_ADD_EXTRUSION_RATE
SERIAL_PROTOCOL(" c:"); SERIAL_PROTOCOLPGM(" c:");
//Kc does not have scaling applied above, or in resetting defaults //Kc does not have scaling applied above, or in resetting defaults
SERIAL_PROTOCOL(Kc); SERIAL_PROTOCOL(Kc);
#endif #endif
@ -7834,13 +7824,12 @@ Sigma_Exit:
updatePID(); updatePID();
SERIAL_PROTOCOLRPGM(MSG_OK); SERIAL_PROTOCOLRPGM(MSG_OK);
SERIAL_PROTOCOL(" p:"); SERIAL_PROTOCOLPGM(" p:");
SERIAL_PROTOCOL(cs.bedKp); SERIAL_PROTOCOL(cs.bedKp);
SERIAL_PROTOCOL(" i:"); SERIAL_PROTOCOLPGM(" i:");
SERIAL_PROTOCOL(unscalePID_i(cs.bedKi)); SERIAL_PROTOCOL(unscalePID_i(cs.bedKi));
SERIAL_PROTOCOL(" d:"); SERIAL_PROTOCOLPGM(" d:");
SERIAL_PROTOCOL(unscalePID_d(cs.bedKd)); SERIAL_PROTOCOLLN(unscalePID_d(cs.bedKd));
SERIAL_PROTOCOLLN();
} }
break; break;
#endif //PIDTEMP #endif //PIDTEMP
@ -8272,8 +8261,7 @@ Sigma_Exit:
LCD_MESSAGERPGM(_T(MSG_PLEASE_WAIT)); LCD_MESSAGERPGM(_T(MSG_PLEASE_WAIT));
SERIAL_PROTOCOLPGM("Wait for PINDA target temperature:"); SERIAL_PROTOCOLPGM("Wait for PINDA target temperature:");
SERIAL_PROTOCOL(set_target_pinda); SERIAL_PROTOCOLLN(set_target_pinda);
SERIAL_PROTOCOLLN();
codenum = _millis(); codenum = _millis();
cancel_heatup = false; cancel_heatup = false;
@ -8315,12 +8303,13 @@ Sigma_Exit:
- `S` - Microsteps - `S` - Microsteps
- `I` - Table index - `I` - Table index
*/ */
case 861: case 861: {
const char * const _header = PSTR("index, temp, ustep, um");
if (code_seen('?')) { // ? - Print out current EEPROM offset values if (code_seen('?')) { // ? - Print out current EEPROM offset values
uint8_t cal_status = calibration_status_pinda();
int16_t usteps = 0; int16_t usteps = 0;
cal_status ? SERIAL_PROTOCOLLN("PINDA cal status: 1") : SERIAL_PROTOCOLLN("PINDA cal status: 0"); SERIAL_PROTOCOLPGM("PINDA cal status: ");
SERIAL_PROTOCOLLN("index, temp, ustep, um"); SERIAL_PROTOCOLLN(calibration_status_pinda());
SERIAL_PROTOCOLLNRPGM(_header);
for (uint8_t i = 0; i < 6; i++) for (uint8_t i = 0; i < 6; i++)
{ {
if(i > 0) { if(i > 0) {
@ -8333,8 +8322,7 @@ Sigma_Exit:
SERIAL_PROTOCOLPGM(", "); SERIAL_PROTOCOLPGM(", ");
SERIAL_PROTOCOL(usteps); SERIAL_PROTOCOL(usteps);
SERIAL_PROTOCOLPGM(", "); SERIAL_PROTOCOLPGM(", ");
SERIAL_PROTOCOL(mm * 1000); SERIAL_PROTOCOLLN(mm * 1000);
SERIAL_PROTOCOLLN();
} }
} }
else if (code_seen('!')) { // ! - Set factory default values else if (code_seen('!')) { // ! - Set factory default values
@ -8349,7 +8337,7 @@ Sigma_Exit:
eeprom_update_word((uint16_t*)EEPROM_PROBE_TEMP_SHIFT + 3, z_shift); eeprom_update_word((uint16_t*)EEPROM_PROBE_TEMP_SHIFT + 3, z_shift);
z_shift = 120; //60C - 300um - 120usteps z_shift = 120; //60C - 300um - 120usteps
eeprom_update_word((uint16_t*)EEPROM_PROBE_TEMP_SHIFT + 4, z_shift); eeprom_update_word((uint16_t*)EEPROM_PROBE_TEMP_SHIFT + 4, z_shift);
SERIAL_PROTOCOLLN("factory restored"); SERIAL_PROTOCOLLNPGM("factory restored");
} }
else if (code_seen('Z')) { // Z - Set all values to 0 (effectively disabling PINDA temperature compensation) else if (code_seen('Z')) { // Z - Set all values to 0 (effectively disabling PINDA temperature compensation)
eeprom_write_byte((uint8_t*)EEPROM_CALIBRATION_STATUS_PINDA, 1); eeprom_write_byte((uint8_t*)EEPROM_CALIBRATION_STATUS_PINDA, 1);
@ -8357,7 +8345,7 @@ Sigma_Exit:
for (uint8_t i = 0; i < 5; i++) { for (uint8_t i = 0; i < 5; i++) {
eeprom_update_word((uint16_t*)EEPROM_PROBE_TEMP_SHIFT + i, z_shift); eeprom_update_word((uint16_t*)EEPROM_PROBE_TEMP_SHIFT + i, z_shift);
} }
SERIAL_PROTOCOLLN("zerorized"); SERIAL_PROTOCOLLNPGM("zerorized");
} }
else if (code_seen('S')) { // Sxxx Iyyy - Set compensation ustep value S for compensation table index I else if (code_seen('S')) { // Sxxx Iyyy - Set compensation ustep value S for compensation table index I
int16_t usteps = code_value_short(); int16_t usteps = code_value_short();
@ -8365,8 +8353,8 @@ Sigma_Exit:
uint8_t index = code_value_uint8(); uint8_t index = code_value_uint8();
if (index < 5) { if (index < 5) {
eeprom_update_word((uint16_t*)EEPROM_PROBE_TEMP_SHIFT + index, usteps); eeprom_update_word((uint16_t*)EEPROM_PROBE_TEMP_SHIFT + index, usteps);
SERIAL_PROTOCOLLN("OK"); SERIAL_PROTOCOLLNRPGM(MSG_OK);
SERIAL_PROTOCOLLN("index, temp, ustep, um"); SERIAL_PROTOCOLLNRPGM(_header);
for (uint8_t i = 0; i < 6; i++) for (uint8_t i = 0; i < 6; i++)
{ {
usteps = 0; usteps = 0;
@ -8380,16 +8368,15 @@ Sigma_Exit:
SERIAL_PROTOCOLPGM(", "); SERIAL_PROTOCOLPGM(", ");
SERIAL_PROTOCOL(usteps); SERIAL_PROTOCOL(usteps);
SERIAL_PROTOCOLPGM(", "); SERIAL_PROTOCOLPGM(", ");
SERIAL_PROTOCOL(mm * 1000); SERIAL_PROTOCOLLN(mm * 1000);
SERIAL_PROTOCOLLN();
} }
} }
} }
} }
else { else {
SERIAL_PROTOCOLPGM("no valid command"); SERIAL_PROTOCOLLNPGM("no valid command");
} }
break; } break;
#endif //PINDA_THERMISTOR #endif //PINDA_THERMISTOR
@ -11462,8 +11449,7 @@ void restore_print_from_eeprom(bool mbl_was_active) {
enquecommand(cmd); enquecommand(cmd);
// Recover final E axis position and mode // Recover final E axis position and mode
float pos_e = eeprom_read_float((float*)(EEPROM_UVLO_CURRENT_POSITION_E)); float pos_e = eeprom_read_float((float*)(EEPROM_UVLO_CURRENT_POSITION_E));
sprintf_P(cmd, PSTR("G92 E")); sprintf_P(cmd, PSTR("G92 E%6.3f"), pos_e);
dtostrf(pos_e, 6, 3, cmd + strlen(cmd));
enquecommand(cmd); enquecommand(cmd);
if (eeprom_read_byte((uint8_t*)EEPROM_UVLO_E_ABS)) if (eeprom_read_byte((uint8_t*)EEPROM_UVLO_E_ABS))
enquecommand_P(PSTR("M82")); //E axis abslute mode enquecommand_P(PSTR("M82")); //E axis abslute mode
@ -11957,7 +11943,7 @@ void M600_wait_for_user(float HotendTempBckp) {
else { else {
counterBeep = 20; //beeper will be inactive during waiting for nozzle preheat counterBeep = 20; //beeper will be inactive during waiting for nozzle preheat
lcd_set_cursor(1, 4); lcd_set_cursor(1, 4);
lcd_print(ftostr3(degHotend(active_extruder))); lcd_printf_P(PSTR("%3d"), (int16_t)degHotend(active_extruder));
} }
break; break;

View File

@ -86,7 +86,7 @@ uint8_t farm_timer = 8;
bool printer_connected = true; bool printer_connected = true;
static ShortTimer display_time; //just timer for showing pid finished message on lcd; static ShortTimer display_time; //just timer for showing pid finished message on lcd;
float pid_temp = DEFAULT_PID_TEMP; static uint16_t pid_temp = DEFAULT_PID_TEMP;
static bool forceMenuExpire = false; static bool forceMenuExpire = false;
static bool lcd_autoDeplete; static bool lcd_autoDeplete;
@ -1018,8 +1018,7 @@ void lcd_commands()
lcd_commands_step = 3; lcd_commands_step = 3;
} }
if (lcd_commands_step == 3 && !blocks_queued()) { //PID calibration if (lcd_commands_step == 3 && !blocks_queued()) { //PID calibration
strcpy(cmd1, "M303 E0 S"); sprintf_P(cmd1, PSTR("M303 E0 S%3u"), pid_temp);
strcat(cmd1, ftostr3(pid_temp));
// setting the correct target temperature (for visualization) is done in PID_autotune // setting the correct target temperature (for visualization) is done in PID_autotune
enquecommand(cmd1); enquecommand(cmd1);
lcd_setstatuspgm(_i("PID cal."));////MSG_PID_RUNNING c=20 lcd_setstatuspgm(_i("PID cal."));////MSG_PID_RUNNING c=20
@ -1031,14 +1030,9 @@ void lcd_commands()
lcd_setstatuspgm(_i("PID cal. finished"));////MSG_PID_FINISHED c=20 lcd_setstatuspgm(_i("PID cal. finished"));////MSG_PID_FINISHED c=20
setAllTargetHotends(0); // reset all hotends temperature including the number displayed on the main screen setAllTargetHotends(0); // reset all hotends temperature including the number displayed on the main screen
if (_Kp != 0 || _Ki != 0 || _Kd != 0) { if (_Kp != 0 || _Ki != 0 || _Kd != 0) {
strcpy(cmd1, "M301 P"); sprintf_P(cmd1, PSTR("M301 P%.2f I%.2f D%.2f"), _Kp, _Ki, _Kd);
strcat(cmd1, ftostr32(_Kp)); enquecommand(cmd1);
strcat(cmd1, " I"); enquecommand_P(PSTR("M500"));
strcat(cmd1, ftostr32(_Ki));
strcat(cmd1, " D");
strcat(cmd1, ftostr32(_Kd));
enquecommand(cmd1);
enquecommand_P(PSTR("M500"));
} }
else { else {
SERIAL_ECHOPGM("Invalid PID cal. results. Not stored to EEPROM."); SERIAL_ECHOPGM("Invalid PID cal. results. Not stored to EEPROM.");
@ -2791,7 +2785,7 @@ void pid_extruder()
if (pid_temp < HEATER_0_MINTEMP) pid_temp = HEATER_0_MINTEMP; if (pid_temp < HEATER_0_MINTEMP) pid_temp = HEATER_0_MINTEMP;
lcd_encoder = 0; lcd_encoder = 0;
lcd_set_cursor(1, 2); lcd_set_cursor(1, 2);
lcd_print(ftostr3(pid_temp)); lcd_printf_P(PSTR("%3u"), pid_temp);
if (lcd_clicked()) { if (lcd_clicked()) {
lcd_commands_type = LcdCommands::PidExtruder; lcd_commands_type = LcdCommands::PidExtruder;
lcd_return_to_status(); lcd_return_to_status();
@ -2897,9 +2891,7 @@ bool lcd_wait_for_pinda(float temp) {
lcd_set_cursor(0, 4); lcd_set_cursor(0, 4);
lcd_print(LCD_STR_THERMOMETER[0]); lcd_print(LCD_STR_THERMOMETER[0]);
lcd_print(ftostr3(current_temperature_pinda)); lcd_printf_P(PSTR("%3d/%3d"), (int16_t)current_temperature_pinda, (int16_t) temp);
lcd_print('/');
lcd_print(ftostr3(temp));
lcd_print(LCD_STR_DEGREE[0]); lcd_print(LCD_STR_DEGREE[0]);
delay_keep_alive(1000); delay_keep_alive(1000);
serialecho_temperatures(); serialecho_temperatures();
@ -2917,9 +2909,7 @@ void lcd_wait_for_heater() {
lcd_display_message_fullscreen_P(_T(MSG_WIZARD_HEATING)); lcd_display_message_fullscreen_P(_T(MSG_WIZARD_HEATING));
lcd_set_cursor(0, 4); lcd_set_cursor(0, 4);
lcd_print(LCD_STR_THERMOMETER[0]); lcd_print(LCD_STR_THERMOMETER[0]);
lcd_print(ftostr3(degHotend(active_extruder))); lcd_printf_P(PSTR("%3d/%3d"), (int16_t)degHotend(active_extruder), (int16_t) degTargetHotend(active_extruder));
lcd_print('/');
lcd_print(ftostr3(degTargetHotend(active_extruder)));
lcd_print(LCD_STR_DEGREE[0]); lcd_print(LCD_STR_DEGREE[0]);
} }
@ -2933,14 +2923,12 @@ void lcd_wait_for_cool_down() {
lcd_set_cursor(0, 4); lcd_set_cursor(0, 4);
lcd_print(LCD_STR_THERMOMETER[0]); lcd_print(LCD_STR_THERMOMETER[0]);
lcd_print(ftostr3(degHotend(0))); lcd_printf_P(PSTR("%3d/0"), (int16_t)degHotend(0));
lcd_print("/0");
lcd_print(LCD_STR_DEGREE[0]); lcd_print(LCD_STR_DEGREE[0]);
lcd_set_cursor(9, 4); lcd_set_cursor(9, 4);
lcd_print(LCD_STR_BEDTEMP[0]); lcd_print(LCD_STR_BEDTEMP[0]);
lcd_print(ftostr3(degBed())); lcd_printf_P(PSTR("%3d/0"), (int16_t)degBed());
lcd_print("/0");
lcd_print(LCD_STR_DEGREE[0]); lcd_print(LCD_STR_DEGREE[0]);
delay_keep_alive(1000); delay_keep_alive(1000);
serialecho_temperatures(); serialecho_temperatures();