|
@@ -709,124 +709,98 @@ void softReset()
|
|
|
#endif
|
|
|
|
|
|
|
|
|
+static void factory_reset_stats(){
|
|
|
+ eeprom_update_dword((uint32_t *)EEPROM_TOTALTIME, 0);
|
|
|
+ eeprom_update_dword((uint32_t *)EEPROM_FILAMENTUSED, 0);
|
|
|
+
|
|
|
+ eeprom_update_byte((uint8_t *)EEPROM_CRASH_COUNT_X, 0);
|
|
|
+ eeprom_update_byte((uint8_t *)EEPROM_CRASH_COUNT_Y, 0);
|
|
|
+ eeprom_update_byte((uint8_t *)EEPROM_FERROR_COUNT, 0);
|
|
|
+ eeprom_update_byte((uint8_t *)EEPROM_POWER_COUNT, 0);
|
|
|
+
|
|
|
+ eeprom_update_word((uint16_t *)EEPROM_CRASH_COUNT_X_TOT, 0);
|
|
|
+ eeprom_update_word((uint16_t *)EEPROM_CRASH_COUNT_Y_TOT, 0);
|
|
|
+ eeprom_update_word((uint16_t *)EEPROM_FERROR_COUNT_TOT, 0);
|
|
|
+ eeprom_update_word((uint16_t *)EEPROM_POWER_COUNT_TOT, 0);
|
|
|
+
|
|
|
+ eeprom_update_word((uint16_t *)EEPROM_MMU_FAIL_TOT, 0);
|
|
|
+ eeprom_update_word((uint16_t *)EEPROM_MMU_LOAD_FAIL_TOT, 0);
|
|
|
+ eeprom_update_byte((uint8_t *)EEPROM_MMU_FAIL, 0);
|
|
|
+ eeprom_update_byte((uint8_t *)EEPROM_MMU_LOAD_FAIL, 0);
|
|
|
+}
|
|
|
+
|
|
|
// Factory reset function
|
|
|
// This function is used to erase parts or whole EEPROM memory which is used for storing calibration and and so on.
|
|
|
// Level input parameter sets depth of reset
|
|
|
-int er_progress = 0;
|
|
|
static void factory_reset(char level)
|
|
|
-{
|
|
|
+{
|
|
|
lcd_clear();
|
|
|
- switch (level) {
|
|
|
-
|
|
|
- // Level 0: Language reset
|
|
|
- case 0:
|
|
|
- Sound_MakeCustom(100,0,false);
|
|
|
- lang_reset();
|
|
|
- break;
|
|
|
-
|
|
|
- //Level 1: Reset statistics
|
|
|
- case 1:
|
|
|
- Sound_MakeCustom(100,0,false);
|
|
|
- eeprom_update_dword((uint32_t *)EEPROM_TOTALTIME, 0);
|
|
|
- eeprom_update_dword((uint32_t *)EEPROM_FILAMENTUSED, 0);
|
|
|
-
|
|
|
- eeprom_update_byte((uint8_t *)EEPROM_CRASH_COUNT_X, 0);
|
|
|
- eeprom_update_byte((uint8_t *)EEPROM_CRASH_COUNT_Y, 0);
|
|
|
- eeprom_update_byte((uint8_t *)EEPROM_FERROR_COUNT, 0);
|
|
|
- eeprom_update_byte((uint8_t *)EEPROM_POWER_COUNT, 0);
|
|
|
-
|
|
|
- eeprom_update_word((uint16_t *)EEPROM_CRASH_COUNT_X_TOT, 0);
|
|
|
- eeprom_update_word((uint16_t *)EEPROM_CRASH_COUNT_Y_TOT, 0);
|
|
|
- eeprom_update_word((uint16_t *)EEPROM_FERROR_COUNT_TOT, 0);
|
|
|
- eeprom_update_word((uint16_t *)EEPROM_POWER_COUNT_TOT, 0);
|
|
|
-
|
|
|
- eeprom_update_word((uint16_t *)EEPROM_MMU_FAIL_TOT, 0);
|
|
|
- eeprom_update_word((uint16_t *)EEPROM_MMU_LOAD_FAIL_TOT, 0);
|
|
|
- eeprom_update_byte((uint8_t *)EEPROM_MMU_FAIL, 0);
|
|
|
- eeprom_update_byte((uint8_t *)EEPROM_MMU_LOAD_FAIL, 0);
|
|
|
-
|
|
|
-
|
|
|
- lcd_menu_statistics();
|
|
|
-
|
|
|
- break;
|
|
|
+ Sound_MakeCustom(100,0,false);
|
|
|
+ switch (level) {
|
|
|
|
|
|
- // Level 2: Prepare for shipping
|
|
|
- case 2:
|
|
|
- //lcd_puts_P(PSTR("Factory RESET"));
|
|
|
- //lcd_puts_at_P(1,2,PSTR("Shipping prep"));
|
|
|
-
|
|
|
- // Force language selection at the next boot up.
|
|
|
- lang_reset();
|
|
|
- // Force the "Follow calibration flow" message at the next boot up.
|
|
|
- calibration_status_store(CALIBRATION_STATUS_Z_CALIBRATION);
|
|
|
- eeprom_write_byte((uint8_t*)EEPROM_WIZARD_ACTIVE, 1); //run wizard
|
|
|
- farm_mode = false;
|
|
|
- eeprom_update_byte((uint8_t*)EEPROM_FARM_MODE, farm_mode);
|
|
|
-
|
|
|
- eeprom_update_dword((uint32_t *)EEPROM_TOTALTIME, 0);
|
|
|
- eeprom_update_dword((uint32_t *)EEPROM_FILAMENTUSED, 0);
|
|
|
-
|
|
|
- eeprom_update_byte((uint8_t *)EEPROM_CRASH_COUNT_X, 0);
|
|
|
- eeprom_update_byte((uint8_t *)EEPROM_CRASH_COUNT_Y, 0);
|
|
|
- eeprom_update_byte((uint8_t *)EEPROM_FERROR_COUNT, 0);
|
|
|
- eeprom_update_byte((uint8_t *)EEPROM_POWER_COUNT, 0);
|
|
|
-
|
|
|
- eeprom_update_word((uint16_t *)EEPROM_CRASH_COUNT_X_TOT, 0);
|
|
|
- eeprom_update_word((uint16_t *)EEPROM_CRASH_COUNT_Y_TOT, 0);
|
|
|
- eeprom_update_word((uint16_t *)EEPROM_FERROR_COUNT_TOT, 0);
|
|
|
- eeprom_update_word((uint16_t *)EEPROM_POWER_COUNT_TOT, 0);
|
|
|
-
|
|
|
- eeprom_update_word((uint16_t *)EEPROM_MMU_FAIL_TOT, 0);
|
|
|
- eeprom_update_word((uint16_t *)EEPROM_MMU_LOAD_FAIL_TOT, 0);
|
|
|
- eeprom_update_byte((uint8_t *)EEPROM_MMU_FAIL, 0);
|
|
|
- eeprom_update_byte((uint8_t *)EEPROM_MMU_LOAD_FAIL, 0);
|
|
|
+ case 0: // Level 0: Language reset
|
|
|
+ lang_reset();
|
|
|
+ break;
|
|
|
|
|
|
-#ifdef FILAMENT_SENSOR
|
|
|
- fsensor_enable();
|
|
|
- fsensor_autoload_set(true);
|
|
|
-#endif //FILAMENT_SENSOR
|
|
|
- Sound_MakeCustom(100,0,false);
|
|
|
- //_delay_ms(2000);
|
|
|
- break;
|
|
|
+ case 1: //Level 1: Reset statistics
|
|
|
+ factory_reset_stats();
|
|
|
+ lcd_menu_statistics();
|
|
|
+ break;
|
|
|
|
|
|
- // Level 3: erase everything, whole EEPROM will be set to 0xFF
|
|
|
+ case 2: // Level 2: Prepare for shipping
|
|
|
+ factory_reset_stats();
|
|
|
+ // [[fallthrough]] // there is no break intentionally
|
|
|
|
|
|
- case 3:
|
|
|
- lcd_puts_P(PSTR("Factory RESET"));
|
|
|
- lcd_puts_at_P(1, 2, PSTR("ERASING all data"));
|
|
|
-
|
|
|
- Sound_MakeCustom(100,0,false);
|
|
|
- er_progress = 0;
|
|
|
- lcd_puts_at_P(3, 3, PSTR(" "));
|
|
|
- lcd_set_cursor(3, 3);
|
|
|
- lcd_print(er_progress);
|
|
|
-
|
|
|
- // Erase EEPROM
|
|
|
- for (int i = 0; i < 4096; i++) {
|
|
|
- eeprom_update_byte((uint8_t*)i, 0xFF);
|
|
|
-
|
|
|
- if (i % 41 == 0) {
|
|
|
- er_progress++;
|
|
|
- lcd_puts_at_P(3, 3, PSTR(" "));
|
|
|
- lcd_set_cursor(3, 3);
|
|
|
- lcd_print(er_progress);
|
|
|
- lcd_puts_P(PSTR("%"));
|
|
|
- }
|
|
|
+ case 4: // Level 4: Preparation after being serviced
|
|
|
+ // Force language selection at the next boot up.
|
|
|
+ lang_reset();
|
|
|
+ // Force the "Follow calibration flow" message at the next boot up.
|
|
|
+ calibration_status_store(CALIBRATION_STATUS_Z_CALIBRATION);
|
|
|
+ eeprom_write_byte((uint8_t*)EEPROM_WIZARD_ACTIVE, 1); //run wizard
|
|
|
+ farm_mode = false;
|
|
|
+ eeprom_update_byte((uint8_t*)EEPROM_FARM_MODE, farm_mode);
|
|
|
|
|
|
+#ifdef FILAMENT_SENSOR
|
|
|
+ fsensor_enable();
|
|
|
+ fsensor_autoload_set(true);
|
|
|
+#endif //FILAMENT_SENSOR
|
|
|
+ break;
|
|
|
+
|
|
|
+ case 3:{ // Level 3: erase everything, whole EEPROM will be set to 0xFF
|
|
|
+ lcd_puts_P(PSTR("Factory RESET"));
|
|
|
+ lcd_puts_at_P(1, 2, PSTR("ERASING all data"));
|
|
|
+ uint16_t er_progress = 0;
|
|
|
+ lcd_set_cursor(3, 3);
|
|
|
+ lcd_space(6);
|
|
|
+ lcd_set_cursor(3, 3);
|
|
|
+ lcd_print(er_progress);
|
|
|
+
|
|
|
+ // Erase EEPROM
|
|
|
+ for (uint16_t i = 0; i < 4096; i++) {
|
|
|
+ eeprom_update_byte((uint8_t*)i, 0xFF);
|
|
|
+
|
|
|
+ if (i % 41 == 0) {
|
|
|
+ er_progress++;
|
|
|
+ lcd_set_cursor(3, 3);
|
|
|
+ lcd_space(6);
|
|
|
+ lcd_set_cursor(3, 3);
|
|
|
+ lcd_print(er_progress);
|
|
|
+ lcd_puts_P(PSTR("%"));
|
|
|
}
|
|
|
- softReset();
|
|
|
|
|
|
+ }
|
|
|
+ softReset();
|
|
|
+ }break;
|
|
|
|
|
|
- break;
|
|
|
- case 4:
|
|
|
- bowden_menu();
|
|
|
- break;
|
|
|
-
|
|
|
- default:
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
|
|
|
+#ifdef SNMM
|
|
|
+ case 5:
|
|
|
+ bowden_menu();
|
|
|
+ break;
|
|
|
+#endif
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
extern "C" {
|
|
@@ -857,30 +831,27 @@ void factory_reset()
|
|
|
{
|
|
|
lcd_clear();
|
|
|
|
|
|
-
|
|
|
lcd_puts_P(PSTR("Factory RESET"));
|
|
|
|
|
|
-
|
|
|
SET_OUTPUT(BEEPER);
|
|
|
- if(eSoundMode!=e_SOUND_MODE_SILENT)
|
|
|
- WRITE(BEEPER, HIGH);
|
|
|
+ if(eSoundMode!=e_SOUND_MODE_SILENT)
|
|
|
+ WRITE(BEEPER, HIGH);
|
|
|
|
|
|
while (!READ(BTN_ENC));
|
|
|
|
|
|
WRITE(BEEPER, LOW);
|
|
|
|
|
|
-
|
|
|
-
|
|
|
_delay_ms(2000);
|
|
|
|
|
|
char level = reset_menu();
|
|
|
factory_reset(level);
|
|
|
|
|
|
switch (level) {
|
|
|
- case 0: _delay_ms(0); break;
|
|
|
- case 1: _delay_ms(0); break;
|
|
|
- case 2: _delay_ms(0); break;
|
|
|
- case 3: _delay_ms(0); break;
|
|
|
+ case 0:
|
|
|
+ case 1:
|
|
|
+ case 2:
|
|
|
+ case 3:
|
|
|
+ case 4: _delay_ms(0); break;
|
|
|
}
|
|
|
|
|
|
}
|
|
@@ -3799,31 +3770,90 @@ void process_commands()
|
|
|
float tmp_motor_loud[3] = DEFAULT_PWM_MOTOR_CURRENT_LOUD;
|
|
|
int8_t SilentMode;
|
|
|
#endif
|
|
|
- /*!
|
|
|
-
|
|
|
- ---------------------------------------------------------------------------------
|
|
|
- ### M117 - Display Message <a href="https://reprap.org/wiki/G-code#M117:_Display_Message">M117: Display Message</a>
|
|
|
- This causes the given message to be shown in the status line on an attached LCD.
|
|
|
- It is processed early as to allow printing messages that contain G, M, N or T.
|
|
|
+ /*!
|
|
|
+
|
|
|
+ ---------------------------------------------------------------------------------
|
|
|
+ ### M117 - Display Message <a href="https://reprap.org/wiki/G-code#M117:_Display_Message">M117: Display Message</a>
|
|
|
+ This causes the given message to be shown in the status line on an attached LCD.
|
|
|
+ It is processed early as to allow printing messages that contain G, M, N or T.
|
|
|
+
|
|
|
+ ---------------------------------------------------------------------------------
|
|
|
+ ### Special internal commands
|
|
|
+ These are used by internal functions to process certain actions in the right order. Some of these are also usable by the user.
|
|
|
+ They are processed early as the commands are complex (strings).
|
|
|
+ These are only available on the MK3(S) as these require TMC2130 drivers:
|
|
|
+ - CRASH DETECTED
|
|
|
+ - CRASH RECOVER
|
|
|
+ - CRASH_CANCEL
|
|
|
+ - TMC_SET_WAVE
|
|
|
+ - TMC_SET_STEP
|
|
|
+ - TMC_SET_CHOP
|
|
|
+ */
|
|
|
+ if (code_seen_P(PSTR("M117"))) //moved to highest priority place to be able to to print strings which includes "G", "PRUSA" and "^"
|
|
|
+ {
|
|
|
+ starpos = (strchr(strchr_pointer + 5, '*'));
|
|
|
+ if (starpos != NULL)
|
|
|
+ *(starpos) = '\0';
|
|
|
+ lcd_setstatus(strchr_pointer + 5);
|
|
|
+ custom_message_type = CustomMsg::MsgUpdate;
|
|
|
+ }
|
|
|
+
|
|
|
+ /*!
|
|
|
+ ### M0, M1 - Stop the printer <a href="https://reprap.org/wiki/G-code#M0:_Stop_or_Unconditional_stop">M0: Stop or Unconditional stop</a>
|
|
|
+ #### Usage
|
|
|
+
|
|
|
+ M0 [P<ms<] [S<sec>] [string]
|
|
|
+ M1 [P<ms>] [S<sec>] [string]
|
|
|
+
|
|
|
+ #### Parameters
|
|
|
|
|
|
- ---------------------------------------------------------------------------------
|
|
|
- ### Special internal commands
|
|
|
- These are used by internal functions to process certain actions in the right order. Some of these are also usable by the user.
|
|
|
- They are processed early as the commands are complex (strings).
|
|
|
- These are only available on the MK3(S) as these require TMC2130 drivers:
|
|
|
- - CRASH DETECTED
|
|
|
- - CRASH RECOVER
|
|
|
- - CRASH_CANCEL
|
|
|
- - TMC_SET_WAVE
|
|
|
- - TMC_SET_STEP
|
|
|
- - TMC_SET_CHOP
|
|
|
- */
|
|
|
- if (code_seen_P(PSTR("M117"))) { //moved to highest priority place to be able to to print strings which includes "G", "PRUSA" and "^"
|
|
|
- starpos = (strchr(strchr_pointer + 5, '*'));
|
|
|
- if (starpos != NULL)
|
|
|
- *(starpos) = '\0';
|
|
|
- lcd_setstatus(strchr_pointer + 5);
|
|
|
- }
|
|
|
+ - `P<ms>` - Expire time, in milliseconds
|
|
|
+ - `S<sec>` - Expire time, in seconds
|
|
|
+ - `string` - Must for M1 and optional for M0 message to display on the LCD
|
|
|
+ */
|
|
|
+
|
|
|
+ else if (code_seen_P(PSTR("M0")) || code_seen_P(PSTR("M1 "))) {// M0 and M1 - (Un)conditional stop - Wait for user button press on LCD
|
|
|
+ char *src = strchr_pointer + 2;
|
|
|
+ codenum = 0;
|
|
|
+ bool hasP = false, hasS = false;
|
|
|
+ if (code_seen('P')) {
|
|
|
+ codenum = code_value(); // milliseconds to wait
|
|
|
+ hasP = codenum > 0;
|
|
|
+ }
|
|
|
+ if (code_seen('S')) {
|
|
|
+ codenum = code_value() * 1000; // seconds to wait
|
|
|
+ hasS = codenum > 0;
|
|
|
+ }
|
|
|
+ starpos = strchr(src, '*');
|
|
|
+ if (starpos != NULL) *(starpos) = '\0';
|
|
|
+ while (*src == ' ') ++src;
|
|
|
+ custom_message_type = CustomMsg::M0Wait;
|
|
|
+ if (!hasP && !hasS && *src != '\0') {
|
|
|
+ lcd_setstatus(src);
|
|
|
+ } else {
|
|
|
+ LCD_MESSAGERPGM(_i("Wait for user..."));////MSG_USERWAIT
|
|
|
+ }
|
|
|
+ lcd_ignore_click(); //call lcd_ignore_click aslo for else ???
|
|
|
+ st_synchronize();
|
|
|
+ previous_millis_cmd = _millis();
|
|
|
+ if (codenum > 0) {
|
|
|
+ codenum += _millis(); // keep track of when we started waiting
|
|
|
+ KEEPALIVE_STATE(PAUSED_FOR_USER);
|
|
|
+ while(_millis() < codenum && !lcd_clicked()) {
|
|
|
+ manage_heater();
|
|
|
+ manage_inactivity(true);
|
|
|
+ lcd_update(0);
|
|
|
+ }
|
|
|
+ KEEPALIVE_STATE(IN_HANDLER);
|
|
|
+ lcd_ignore_click(false);
|
|
|
+ } else {
|
|
|
+ marlin_wait_for_click();
|
|
|
+ }
|
|
|
+ if (IS_SD_PRINTING)
|
|
|
+ custom_message_type = CustomMsg::Status;
|
|
|
+ else
|
|
|
+ LCD_MESSAGERPGM(_T(WELCOME_MSG));
|
|
|
+ }
|
|
|
|
|
|
#ifdef TMC2130
|
|
|
else if (strncmp_P(CMDBUFFER_CURRENT_STRING, PSTR("CRASH_"), 6) == 0)
|
|
@@ -5682,60 +5712,10 @@ if(eSoundMode!=e_SOUND_MODE_SILENT)
|
|
|
switch(mcode_in_progress)
|
|
|
{
|
|
|
|
|
|
- /*!
|
|
|
- ### M0, M1 - Stop the printer <a href="https://reprap.org/wiki/G-code#M0:_Stop_or_Unconditional_stop">M0: Stop or Unconditional stop</a>
|
|
|
- */
|
|
|
- case 0: // M0 - Unconditional stop - Wait for user button press on LCD
|
|
|
- case 1: // M1 - Conditional stop - Wait for user button press on LCD
|
|
|
- {
|
|
|
- char *src = strchr_pointer + 2;
|
|
|
-
|
|
|
- codenum = 0;
|
|
|
-
|
|
|
- bool hasP = false, hasS = false;
|
|
|
- if (code_seen('P')) {
|
|
|
- codenum = code_value(); // milliseconds to wait
|
|
|
- hasP = codenum > 0;
|
|
|
- }
|
|
|
- if (code_seen('S')) {
|
|
|
- codenum = code_value() * 1000; // seconds to wait
|
|
|
- hasS = codenum > 0;
|
|
|
- }
|
|
|
- starpos = strchr(src, '*');
|
|
|
- if (starpos != NULL) *(starpos) = '\0';
|
|
|
- while (*src == ' ') ++src;
|
|
|
- if (!hasP && !hasS && *src != '\0') {
|
|
|
- lcd_setstatus(src);
|
|
|
- } else {
|
|
|
- LCD_MESSAGERPGM(_i("Wait for user..."));////MSG_USERWAIT
|
|
|
- }
|
|
|
-
|
|
|
- lcd_ignore_click(); //call lcd_ignore_click aslo for else ???
|
|
|
- st_synchronize();
|
|
|
- previous_millis_cmd = _millis();
|
|
|
- if (codenum > 0){
|
|
|
- codenum += _millis(); // keep track of when we started waiting
|
|
|
- KEEPALIVE_STATE(PAUSED_FOR_USER);
|
|
|
- while(_millis() < codenum && !lcd_clicked()){
|
|
|
- manage_heater();
|
|
|
- manage_inactivity(true);
|
|
|
- lcd_update(0);
|
|
|
- }
|
|
|
- KEEPALIVE_STATE(IN_HANDLER);
|
|
|
- lcd_ignore_click(false);
|
|
|
- }else{
|
|
|
- marlin_wait_for_click();
|
|
|
- }
|
|
|
- if (IS_SD_PRINTING)
|
|
|
- LCD_MESSAGERPGM(_T(MSG_RESUMING_PRINT));
|
|
|
- else
|
|
|
- LCD_MESSAGERPGM(_T(WELCOME_MSG));
|
|
|
- }
|
|
|
- break;
|
|
|
-
|
|
|
/*!
|
|
|
### M17 - Enable all axes <a href="https://reprap.org/wiki/G-code#M17:_Enable.2FPower_all_stepper_motors">M17: Enable/Power all stepper motors</a>
|
|
|
*/
|
|
|
+
|
|
|
case 17:
|
|
|
LCD_MESSAGERPGM(_i("No move."));////MSG_NO_MOVE
|
|
|
enable_x();
|
|
@@ -8139,35 +8119,34 @@ Sigma_Exit:
|
|
|
/*!
|
|
|
### M25 - Pause SD print <a href="https://reprap.org/wiki/G-code#M25:_Pause_SD_print">M25: Pause SD print</a>
|
|
|
*/
|
|
|
- case 25:
|
|
|
- case 601:
|
|
|
- {
|
|
|
- if (!isPrintPaused)
|
|
|
- {
|
|
|
+ case 25:
|
|
|
+ case 601:
|
|
|
+ {
|
|
|
+ if (!isPrintPaused) {
|
|
|
st_synchronize();
|
|
|
ClearToSend(); //send OK even before the command finishes executing because we want to make sure it is not skipped because of cmdqueue_pop_front();
|
|
|
cmdqueue_pop_front(); //trick because we want skip this command (M601) after restore
|
|
|
lcd_pause_print();
|
|
|
}
|
|
|
- }
|
|
|
- break;
|
|
|
+ }
|
|
|
+ break;
|
|
|
|
|
|
/*!
|
|
|
- ### M602 - Resume print <a href="https://reprap.org/wiki/G-code#M602:_Resume_print">M602: Resume print</a>
|
|
|
+ ### M602 - Resume print <a href="https://reprap.org/wiki/G-code#M602:_Resume_print">M602: Resume print</a>
|
|
|
*/
|
|
|
- case 602: {
|
|
|
- if (isPrintPaused)
|
|
|
- lcd_resume_print();
|
|
|
- }
|
|
|
- break;
|
|
|
+ case 602: {
|
|
|
+ if (isPrintPaused)
|
|
|
+ lcd_resume_print();
|
|
|
+ }
|
|
|
+ break;
|
|
|
|
|
|
/*!
|
|
|
### M603 - Stop print <a href="https://reprap.org/wiki/G-code#M603:_Stop_print">M603: Stop print</a>
|
|
|
*/
|
|
|
- case 603: {
|
|
|
- lcd_print_stop();
|
|
|
- }
|
|
|
- break;
|
|
|
+ case 603: {
|
|
|
+ lcd_print_stop();
|
|
|
+ }
|
|
|
+ break;
|
|
|
|
|
|
#ifdef PINDA_THERMISTOR
|
|
|
/*!
|