diff --git a/Firmware/Configuration_adv.h b/Firmware/Configuration_adv.h
index 15e6bb5b1..75ac0be96 100644
--- a/Firmware/Configuration_adv.h
+++ b/Firmware/Configuration_adv.h
@@ -328,6 +328,11 @@ const unsigned int dropsegments=5; //everything with less than this number of st
// Control heater 0 and heater 1 in parallel.
//#define HEATERS_PARALLEL
+//LCD status clock interval timer to switch between
+// remaining print time
+// and time to change/pause/interaction
+#define CLOCK_INTERVAL_TIME 5
+
//===========================================================================
//=============================Buffers ============================
//===========================================================================
diff --git a/Firmware/Marlin.h b/Firmware/Marlin.h
index cbe03c0f6..a1b6fe4eb 100755
--- a/Firmware/Marlin.h
+++ b/Firmware/Marlin.h
@@ -366,6 +366,8 @@ extern uint8_t print_percent_done_normal;
extern uint16_t print_time_remaining_normal;
extern uint8_t print_percent_done_silent;
extern uint16_t print_time_remaining_silent;
+extern uint16_t print_time_to_change_normal;
+extern uint16_t print_time_to_change_silent;
#define PRINT_TIME_REMAINING_INIT 0xffff
@@ -437,7 +439,6 @@ extern void cancel_saved_printing();
//estimated time to end of the print
-extern uint16_t print_time_remaining();
extern uint8_t calc_percent_done();
diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp
index 34356cdcf..f54b23030 100755
--- a/Firmware/Marlin_main.cpp
+++ b/Firmware/Marlin_main.cpp
@@ -316,6 +316,8 @@ uint8_t print_percent_done_normal = PRINT_PERCENT_DONE_INIT;
uint16_t print_time_remaining_normal = PRINT_TIME_REMAINING_INIT; //estimated remaining print time in minutes
uint8_t print_percent_done_silent = PRINT_PERCENT_DONE_INIT;
uint16_t print_time_remaining_silent = PRINT_TIME_REMAINING_INIT; //estimated remaining print time in minutes
+uint16_t print_time_to_change_normal = PRINT_TIME_REMAINING_INIT; //estimated remaining time to next change in minutes
+uint16_t print_time_to_change_silent = PRINT_TIME_REMAINING_INIT; //estimated remaining time to next change in minutes
uint32_t IP_address = 0;
@@ -707,110 +709,82 @@ 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
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);
+ Sound_MakeCustom(100,0,false);
+ switch (level) {
- 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);
+ case 0: // Level 0: Language reset
+ lang_reset();
+ break;
- 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);
+ case 1: //Level 1: Reset statistics
+ factory_reset_stats();
+ lcd_menu_statistics();
+ break;
- 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;
-
- // 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 2: // Level 2: Prepare for shipping
+ factory_reset_stats();
+ // [[fallthrough]] // there is no break intentionally
+ 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, 2); //run wizard
+ farm_mode = false;
+ eeprom_update_byte((uint8_t*)EEPROM_FARM_MODE, farm_mode);
#ifdef FILAMENT_SENSOR
- fsensor_enable();
- fsensor_autoload_set(true);
+ fsensor_enable();
+ fsensor_autoload_set(true);
#endif //FILAMENT_SENSOR
- Sound_MakeCustom(100,0,false);
- //_delay_ms(2000);
- break;
-
- // Level 3: erase everything, whole EEPROM will be set to 0xFF
-
- case 3:
- menu_progressbar_init(EEPROM_TOP, PSTR("ERASING all data"));
- Sound_MakeCustom(100,0,false);
-
- // Erase EEPROM
- for (uint16_t i = 0; i < EEPROM_TOP; i++) {
- eeprom_update_byte((uint8_t*)i, 0xFF);
- menu_progressbar_update(i);
- }
- menu_progressbar_finish();
- softReset();
-
-
- break;
- case 4:
- bowden_menu();
- break;
-
- default:
- break;
- }
-
+ break;
+ case 3:
+ menu_progressbar_init(EEPROM_TOP, PSTR("ERASING all data"));
+ Sound_MakeCustom(100,0,false);
+
+ // Erase EEPROM
+ for (uint16_t i = 0; i < EEPROM_TOP; i++) {
+ eeprom_update_byte((uint8_t*)i, 0xFF);
+ menu_progressbar_update(i);
+ }
+ menu_progressbar_finish();
+ softReset();
+ break;
+#ifdef SNMM
+ case 5:
+ bowden_menu();
+ break;
+#endif
+ default:
+ break;
+ }
}
extern "C" {
@@ -841,30 +815,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;
}
}
@@ -1577,7 +1548,7 @@ void setup()
lcd_show_fullscreen_message_and_wait_P(_i("Old settings found. Default PID, Esteps etc. will be set.")); //if EEPROM version or printer type was changed, inform user that default setting were loaded////MSG_DEFAULT_SETTINGS_LOADED c=20 r=5
Config_StoreSettings();
}
- if (eeprom_read_byte((uint8_t*)EEPROM_WIZARD_ACTIVE) == 1) {
+ if (eeprom_read_byte((uint8_t*)EEPROM_WIZARD_ACTIVE) >= 1) {
lcd_wizard(WizState::Run);
}
if (eeprom_read_byte((uint8_t*)EEPROM_WIZARD_ACTIVE) == 0) { //dont show calibration status messages if wizard is currently active
@@ -1839,8 +1810,7 @@ void loop()
}
#ifdef FANCHECK
- if (fan_check_error && isPrintPaused)
- {
+ if (fan_check_error && isPrintPaused && !IS_SD_PRINTING) {
KEEPALIVE_STATE(PAUSED_FOR_USER);
host_keepalive(); //prevent timeouts since usb processing is disabled until print is resumed. This is for a crude way of pausing a print on all hosts.
}
@@ -3747,12 +3717,13 @@ There are reasons why some G Codes aren't in numerical order.
void process_commands()
{
#ifdef FANCHECK
- if(fan_check_error == EFCE_DETECTED){
- fan_check_error = EFCE_REPORTED;
- // SERIAL_PROTOCOLLNRPGM(MSG_OCTOPRINT_PAUSED);
- lcd_pause_print();
- cmdqueue_serial_disabled = true;
- }
+ if(fan_check_error == EFCE_DETECTED) {
+ fan_check_error = EFCE_REPORTED;
+ if (is_usb_printing)
+ lcd_pause_usb_print();
+ else
+ lcd_pause_print();
+ }
#endif
if (!buflen) return; //empty command
@@ -3783,31 +3754,90 @@ void process_commands()
float tmp_motor_loud[3] = DEFAULT_PWM_MOTOR_CURRENT_LOUD;
int8_t SilentMode;
#endif
- /*!
+ /*!
+
+ ---------------------------------------------------------------------------------
+ ### M117 - Display Message M117: Display Message
+ 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 M0: Stop or Unconditional stop
+ #### Usage
+
+ M0 [P] [string]
+ M1 [P] [S] [string]
+
+ #### Parameters
- ---------------------------------------------------------------------------------
- ### M117 - Display Message M117: Display Message
- 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);
- }
+ - `P` - Expire time, in milliseconds
+ - `S` - 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)
@@ -5666,60 +5696,10 @@ if(eSoundMode!=e_SOUND_MODE_SILENT)
switch(mcode_in_progress)
{
- /*!
- ### M0, M1 - Stop the printer M0: Stop or Unconditional stop
- */
- 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 M17: Enable/Power all stepper motors
*/
+
case 17:
LCD_MESSAGERPGM(_i("No move."));////MSG_NO_MOVE
enable_x();
@@ -6377,31 +6357,37 @@ Sigma_Exit:
#endif // Z_PROBE_REPEATABILITY_TEST
#endif // ENABLE_AUTO_BED_LEVELING
- /*!
- ### M73 - Set/get print progress M73: Set/Get build percentage
- #### Usage
+ /*!
+ ### M73 - Set/get print progress M73: Set/Get build percentage
+ #### Usage
- M73 [ P | R | Q | S ]
-
- #### Parameters
- - `P` - Percent in normal mode
- - `R` - Time remaining in normal mode
- - `Q` - Percent in silent mode
- - `S` - Time in silent mode
- */
- case 73: //M73 show percent done and time remaining
- if(code_seen('P')) print_percent_done_normal = code_value();
- if(code_seen('R')) print_time_remaining_normal = code_value();
- if(code_seen('Q')) print_percent_done_silent = code_value();
- if(code_seen('S')) print_time_remaining_silent = code_value();
+ M73 [ P | R | Q | S | C | D ]
- {
- const char* _msg_mode_done_remain = _N("%S MODE: Percent done: %d; print time remaining in mins: %d\n");
- printf_P(_msg_mode_done_remain, _N("NORMAL"), int(print_percent_done_normal), print_time_remaining_normal);
- printf_P(_msg_mode_done_remain, _N("SILENT"), int(print_percent_done_silent), print_time_remaining_silent);
- }
- break;
+ #### Parameters
+ - `P` - Percent in normal mode
+ - `R` - Time remaining in normal mode
+ - `Q` - Percent in silent mode
+ - `S` - Time in silent mode
+ - `C` - Time to change/pause/user interaction in normal mode
+ - `D` - Time to change/pause/user interaction in silent mode
+ */
+ //!@todo update RepRap Gcode wiki
+ case 73: //M73 show percent done, time remaining and time to change/pause
+ {
+ if(code_seen('P')) print_percent_done_normal = code_value();
+ if(code_seen('R')) print_time_remaining_normal = code_value();
+ if(code_seen('Q')) print_percent_done_silent = code_value();
+ if(code_seen('S')) print_time_remaining_silent = code_value();
+ if(code_seen('C')) print_time_to_change_normal = code_value();
+ if(code_seen('D')) print_time_to_change_silent = code_value();
+ {
+ const char* _msg_mode_done_remain = _N("%S MODE: Percent done: %d; print time remaining in mins: %d; Change in mins: %d\n");
+ printf_P(_msg_mode_done_remain, _N("NORMAL"), int(print_percent_done_normal), print_time_remaining_normal, print_time_to_change_normal);
+ printf_P(_msg_mode_done_remain, _N("SILENT"), int(print_percent_done_silent), print_time_remaining_silent, print_time_to_change_silent);
+ }
+ break;
+ }
/*!
### M104 - Set hotend temperature M104: Set Extruder Temperature
#### Usage
@@ -8117,35 +8103,34 @@ Sigma_Exit:
/*!
### M25 - Pause SD print M25: Pause SD print
*/
- 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 M602: Resume print
+ ### M602 - Resume print M602: Resume print
*/
- case 602: {
- if (isPrintPaused)
- lcd_resume_print();
- }
- break;
+ case 602:
+ {
+ if (isPrintPaused) lcd_resume_print();
+ }
+ break;
/*!
### M603 - Stop print M603: Stop print
*/
- case 603: {
- lcd_print_stop();
- }
- break;
+ case 603: {
+ lcd_print_stop();
+ }
+ break;
#ifdef PINDA_THERMISTOR
/*!
@@ -9689,7 +9674,7 @@ void manage_inactivity_IR_ANALOG_Check(uint16_t &nFSCheckCount, ClFsensorPCB isV
void manage_inactivity(bool ignore_stepper_queue/*=false*/) //default argument set in Marlin.h
{
#ifdef FILAMENT_SENSOR
-bool bInhibitFlag;
+bool bInhibitFlag = false;
#ifdef IR_SENSOR_ANALOG
static uint16_t nFSCheckCount=0;
#endif // IR_SENSOR_ANALOG
@@ -9697,16 +9682,11 @@ static uint16_t nFSCheckCount=0;
if (mmu_enabled == false)
{
//-// if (mcode_in_progress != 600) //M600 not in progress
-#ifdef PAT9125
- bInhibitFlag=(menu_menu==lcd_menu_extruder_info); // Support::ExtruderInfo menu active
-#endif // PAT9125
-#ifdef IR_SENSOR
- bInhibitFlag=(menu_menu==lcd_menu_show_sensors_state); // Support::SensorInfo menu active
+ if (!PRINTER_ACTIVE) bInhibitFlag=(menu_menu==lcd_menu_show_sensors_state); //Block Filament sensor actions if PRINTER is not active and Support::SensorInfo menu active
#ifdef IR_SENSOR_ANALOG
- bInhibitFlag=bInhibitFlag||bMenuFSDetect; // Settings::HWsetup::FSdetect menu active
+ bInhibitFlag=bInhibitFlag||bMenuFSDetect; // Block Filament sensor actions if Settings::HWsetup::FSdetect menu active
#endif // IR_SENSOR_ANALOG
-#endif // IR_SENSOR
- if ((mcode_in_progress != 600) && (eFilamentAction != FilamentAction::AutoLoad) && (!bInhibitFlag) && (menu_menu != lcd_move_e)) //M600 not in progress, preHeat @ autoLoad menu not active, Support::ExtruderInfo/SensorInfo menu not active
+ if ((mcode_in_progress != 600) && (eFilamentAction != FilamentAction::AutoLoad) && (!bInhibitFlag) && (menu_menu != lcd_move_e)) //M600 not in progress, preHeat @ autoLoad menu not active
{
if (!moves_planned() && !IS_SD_PRINTING && !is_usb_printing && (lcd_commands_type != LcdCommands::Layer1Cal) && ! eeprom_read_byte((uint8_t*)EEPROM_WIZARD_ACTIVE))
{
@@ -11639,46 +11619,40 @@ void print_mesh_bed_leveling_table()
SERIAL_ECHOLN();
}
-uint16_t print_time_remaining() {
- uint16_t print_t = PRINT_TIME_REMAINING_INIT;
-#ifdef TMC2130
- if (SilentModeMenu == SILENT_MODE_OFF) print_t = print_time_remaining_normal;
- else print_t = print_time_remaining_silent;
-#else
- print_t = print_time_remaining_normal;
-#endif //TMC2130
- if ((print_t != PRINT_TIME_REMAINING_INIT) && (feedmultiply != 0)) print_t = 100ul * print_t / feedmultiply;
- return print_t;
-}
-
uint8_t calc_percent_done()
{
- //in case that we have information from M73 gcode return percentage counted by slicer, else return percentage counted as byte_printed/filesize
- uint8_t percent_done = 0;
+ //in case that we have information from M73 gcode return percentage counted by slicer, else return percentage counted as byte_printed/filesize
+ uint8_t percent_done = 0;
#ifdef TMC2130
- if (SilentModeMenu == SILENT_MODE_OFF && print_percent_done_normal <= 100) {
- percent_done = print_percent_done_normal;
- }
- else if (print_percent_done_silent <= 100) {
- percent_done = print_percent_done_silent;
- }
+ if (SilentModeMenu == SILENT_MODE_OFF && print_percent_done_normal <= 100)
+ {
+ percent_done = print_percent_done_normal;
+ }
+ else if (print_percent_done_silent <= 100)
+ {
+ percent_done = print_percent_done_silent;
+ }
#else
- if (print_percent_done_normal <= 100) {
- percent_done = print_percent_done_normal;
- }
+ if (print_percent_done_normal <= 100)
+ {
+ percent_done = print_percent_done_normal;
+ }
#endif //TMC2130
- else {
- percent_done = card.percentDone();
- }
- return percent_done;
+ else
+ {
+ percent_done = card.percentDone();
+ }
+ return percent_done;
}
static void print_time_remaining_init()
{
- print_time_remaining_normal = PRINT_TIME_REMAINING_INIT;
- print_time_remaining_silent = PRINT_TIME_REMAINING_INIT;
- print_percent_done_normal = PRINT_PERCENT_DONE_INIT;
- print_percent_done_silent = PRINT_PERCENT_DONE_INIT;
+ print_time_remaining_normal = PRINT_TIME_REMAINING_INIT;
+ print_percent_done_normal = PRINT_PERCENT_DONE_INIT;
+ print_time_remaining_silent = PRINT_TIME_REMAINING_INIT;
+ print_percent_done_silent = PRINT_PERCENT_DONE_INIT;
+ print_time_to_change_normal = PRINT_TIME_REMAINING_INIT;
+ print_time_to_change_silent = PRINT_TIME_REMAINING_INIT;
}
void load_filament_final_feed()
diff --git a/Firmware/eeprom.h b/Firmware/eeprom.h
index f9f93b7d8..6fa80aa4c 100644
--- a/Firmware/eeprom.h
+++ b/Firmware/eeprom.h
@@ -408,7 +408,7 @@ static_assert(sizeof(Sheets) == EEPROM_SHEETS_SIZEOF, "Sizeof(Sheets) is not EEP
#define EEPROM_POWER_COUNT (EEPROM_FERROR_COUNT - 1) // uint8 (orig EEPROM_UVLO_MESH_BED_LEVELING-17)
#define EEPROM_XYZ_CAL_SKEW (EEPROM_POWER_COUNT - 4) // float for skew backup
-#define EEPROM_WIZARD_ACTIVE (EEPROM_XYZ_CAL_SKEW - 1)
+#define EEPROM_WIZARD_ACTIVE (EEPROM_XYZ_CAL_SKEW - 1) // 0: wizard not active, 1: wizard active, 2: wizard active without yes/no = forced calibrate Z after shipping/service prep.
#define EEPROM_BELTSTATUS_X (EEPROM_WIZARD_ACTIVE - 2) // uint16
#define EEPROM_BELTSTATUS_Y (EEPROM_BELTSTATUS_X - 2) // uint16
diff --git a/Firmware/messages.c b/Firmware/messages.c
index 97cae85d7..25fc1f2a9 100644
--- a/Firmware/messages.c
+++ b/Firmware/messages.c
@@ -16,7 +16,7 @@ const char MSG_BED_DONE[] PROGMEM_I1 = ISTR("Bed done"); ////
const char MSG_BED_HEATING[] PROGMEM_I1 = ISTR("Bed Heating"); ////
const char MSG_BED_LEVELING_FAILED_POINT_LOW[] PROGMEM_I1 = ISTR("Bed leveling failed. Sensor didnt trigger. Debris on nozzle? Waiting for reset."); ////c=20 r=5
const char MSG_BED_SKEW_OFFSET_DETECTION_FITTING_FAILED[] PROGMEM_I1 = ISTR("XYZ calibration failed. Please consult the manual."); ////c=20 r=8
-const char MSG_BELT_STATUS[] PROGMEM_I1 = ISTR("Belt Status");////c=18
+const char MSG_BELT_STATUS[] PROGMEM_I1 = ISTR("Belt status");////c=18
const char MSG_CALIBRATE_Z_AUTO[] PROGMEM_I1 = ISTR("Calibrating Z"); ////c=20 r=2
const char MSG_CARD_MENU[] PROGMEM_I1 = ISTR("Print from SD"); ////
const char MSG_CHECKING_X[] PROGMEM_I1 = ISTR("Checking X axis"); ////c=20
@@ -29,7 +29,7 @@ const char MSG_CRASHDETECT[] PROGMEM_I1 = ISTR("Crash det."); ////c=13
const char MSG_ERROR[] PROGMEM_I1 = ISTR("ERROR:"); ////
const char MSG_EXTRUDER[] PROGMEM_I1 = ISTR("Extruder"); ////c=17
const char MSG_FANS_CHECK[] PROGMEM_I1 = ISTR("Fans check"); ////c=13
-const char MSG_FIL_RUNOUTS[] PROGMEM_I1 = ISTR("Fil. runouts"); ////c=14
+const char MSG_FIL_RUNOUTS[] PROGMEM_I1 = ISTR("Fil. runouts"); ////c=15
const char MSG_FILAMENT[] PROGMEM_I1 = ISTR("Filament"); ////c=17 r=1
const char MSG_FAN_SPEED[] PROGMEM_I1 = ISTR("Fan speed"); ////c=14
const char MSG_FILAMENT_CLEAN[] PROGMEM_I1 = ISTR("Filament extruding & with correct color?"); ////c=20 r=2
@@ -65,14 +65,15 @@ const char MSG_STEEL_SHEETS[] PROGMEM_I1 = ISTR("Steel sheets"); ////c=18
const char MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE1[] PROGMEM_I1 = ISTR("Measuring reference height of calibration point"); ////c=60
const char MSG_MEASURE_BED_REFERENCE_HEIGHT_LINE2[] PROGMEM_I1 = ISTR(" of 9"); ////c=14
const char MSG_MENU_CALIBRATION[] PROGMEM_I1 = ISTR("Calibration"); ////
-const char MSG_MMU_FAILS[] PROGMEM_I1 = ISTR("MMU fails"); ////c=14
-const char MSG_MMU_LOAD_FAILS[] PROGMEM_I1 = ISTR("MMU load fails"); ////c=14
+const char MSG_MMU_FAILS[] PROGMEM_I1 = ISTR("MMU fails"); ////c=15
+const char MSG_MMU_LOAD_FAILS[] PROGMEM_I1 = ISTR("MMU load fails"); ////c=15
const char MSG_NO[] PROGMEM_I1 = ISTR("No"); ////
const char MSG_NOZZLE[] PROGMEM_I1 = ISTR("Nozzle"); ////
const char MSG_PAPER[] PROGMEM_I1 = ISTR("Place a sheet of paper under the nozzle during the calibration of first 4 points. If the nozzle catches the paper, power off the printer immediately."); ////c=20 r=10
+const char MSG_PAUSE_PRINT[] PROGMEM_I1 = ISTR("Pause print");////c=18
const char MSG_PLACE_STEEL_SHEET[] PROGMEM_I1 = ISTR("Please place steel sheet on heatbed."); ////c=20 r=4
const char MSG_PLEASE_WAIT[] PROGMEM_I1 = ISTR("Please wait"); ////c=20
-const char MSG_POWER_FAILURES[] PROGMEM_I1 = ISTR("Power failures"); ////c=14
+const char MSG_POWER_FAILURES[] PROGMEM_I1 = ISTR("Power failures"); ////c=15
const char MSG_PREHEAT_NOZZLE[] PROGMEM_I1 = ISTR("Preheat the nozzle!"); ////c=20
const char MSG_PRESS_TO_UNLOAD[] PROGMEM_I1 = ISTR("Please press the knob to unload filament"); ////c=20 r=4
const char MSG_PRINT_ABORTED[] PROGMEM_I1 = ISTR("Print aborted"); ////c=20
@@ -116,6 +117,8 @@ const char MSG_WIZARD_CALIBRATION_FAILED[] PROGMEM_I1 = ISTR("Please check our h
const char MSG_WIZARD_DONE[] PROGMEM_I1 = ISTR("All is done. Happy printing!"); ////c=20 r=8
const char MSG_WIZARD_HEATING[] PROGMEM_I1 = ISTR("Preheating nozzle. Please wait."); ////c=20 r=3
const char MSG_WIZARD_QUIT[] PROGMEM_I1 = ISTR("You can always resume the Wizard from Calibration -> Wizard."); ////c=20 r=8
+const char MSG_WIZARD_WELCOME[] PROGMEM_I1 = ISTR("Hi, I am your Original Prusa i3 printer. Would you like me to guide you through the setup process?"); //// c=20 r=7
+const char MSG_WIZARD_WELCOME_SHIPPING[] PROGMEM_I1 = ISTR("Hi, I am your Original Prusa i3 printer. I will guide you through a short setup process, in which the Z-axis will be calibrated. Then, you will be ready to print."); ////c=20 r=16
const char MSG_YES[] PROGMEM_I1 = ISTR("Yes"); ////
const char MSG_V2_CALIBRATION[] PROGMEM_I1 = ISTR("First layer cal."); ////c=18
const char WELCOME_MSG[] PROGMEM_I1 = ISTR(CUSTOM_MENDEL_NAME " OK."); ////c=20
@@ -131,7 +134,7 @@ const char MSG_MODEL[] PROGMEM_I1 = ISTR("Model"); ////
const char MSG_FIRMWARE[] PROGMEM_I1 = ISTR("Firmware"); ////
const char MSG_GCODE[] PROGMEM_I1 = ISTR("Gcode"); ////
const char MSG_GCODE_DIFF_PRINTER_CONTINUE[] PROGMEM_I1 = ISTR("G-code sliced for a different printer type. Continue?"); ////c=20 r=5
-const char MSG_GCODE_DIFF_PRINTER_CANCELLED[] PROGMEM_I1 =ISTR("G-code sliced for a different printer type. Please re-slice the model again. Print cancelled."); ////c=20 r=6
+const char MSG_GCODE_DIFF_PRINTER_CANCELLED[] PROGMEM_I1 =ISTR("G-code sliced for a different printer type. Please re-slice the model again. Print cancelled."); ////c=20 r=7
const char MSG_NOZZLE_DIAMETER[] PROGMEM_I1 = ISTR("Nozzle d."); ////
const char MSG_MMU_MODE[] PROGMEM_I1 = ISTR("MMU Mode"); ////
const char MSG_SD_CARD[] PROGMEM_I1 = ISTR("SD card"); ////
@@ -188,7 +191,9 @@ const char MSG_ENDSTOP_OPEN[] PROGMEM_N1 = "open"; ////
const char MSG_POWERUP[] PROGMEM_N1 = "PowerUp"; ////
const char MSG_ERR_STOPPED[] PROGMEM_N1 = "Printer stopped due to errors. Fix the error and use M999 to restart. (Temperature is reset. Set it after restarting)"; ////
const char MSG_ENDSTOP_HIT[] PROGMEM_N1 = "TRIGGERED"; ////
+const char MSG_OCTOPRINT_PAUSE[] PROGMEM_N1 = "// action:pause"; ////
const char MSG_OCTOPRINT_PAUSED[] PROGMEM_N1 = "// action:paused"; ////
+const char MSG_OCTOPRINT_RESUME[] PROGMEM_N1 = "// action:resume"; ////
const char MSG_OCTOPRINT_RESUMED[] PROGMEM_N1 = "// action:resumed"; ////
const char MSG_OCTOPRINT_CANCEL[] PROGMEM_N1 = "// action:cancel"; ////
const char MSG_FANCHECK_EXTRUDER[] PROGMEM_N1 = "Err: EXTR. FAN ERROR"; ////c=20
diff --git a/Firmware/messages.h b/Firmware/messages.h
index 0a05c58f5..f66f64745 100644
--- a/Firmware/messages.h
+++ b/Firmware/messages.h
@@ -69,6 +69,7 @@ extern const char MSG_MMU_LOAD_FAILS[];
extern const char MSG_NO[];
extern const char MSG_NOZZLE[];
extern const char MSG_PAPER[];
+extern const char MSG_PAUSE_PRINT[];
extern const char MSG_PLACE_STEEL_SHEET[];
extern const char MSG_PLEASE_WAIT[];
extern const char MSG_POWER_FAILURES[];
@@ -116,6 +117,8 @@ extern const char MSG_WIZARD_CALIBRATION_FAILED[];
extern const char MSG_WIZARD_DONE[];
extern const char MSG_WIZARD_HEATING[];
extern const char MSG_WIZARD_QUIT[];
+extern const char MSG_WIZARD_WELCOME[];
+extern const char MSG_WIZARD_WELCOME_SHIPPING[];
extern const char MSG_YES[];
extern const char MSG_V2_CALIBRATION[];
extern const char WELCOME_MSG[];
@@ -188,7 +191,9 @@ extern const char MSG_ERR_STOPPED[];
extern const char MSG_ENDSTOP_HIT[];
extern const char MSG_EJECT_FILAMENT[];
extern const char MSG_CUT_FILAMENT[];
+extern const char MSG_OCTOPRINT_PAUSE[];
extern const char MSG_OCTOPRINT_PAUSED[];
+extern const char MSG_OCTOPRINT_RESUME[];
extern const char MSG_OCTOPRINT_RESUMED[];
extern const char MSG_OCTOPRINT_CANCEL[];
extern const char MSG_FANCHECK_EXTRUDER[];
diff --git a/Firmware/optiboot_w25x20cl.cpp b/Firmware/optiboot_w25x20cl.cpp
index dce4074e1..a18c8832d 100644
--- a/Firmware/optiboot_w25x20cl.cpp
+++ b/Firmware/optiboot_w25x20cl.cpp
@@ -7,6 +7,7 @@
#include "w25x20cl.h"
#include "stk500.h"
#include "bootapp.h"
+#include
#define OPTIBOOT_MAJVER 6
#define OPTIBOOT_CUSTOMVER 0
@@ -39,14 +40,10 @@ static unsigned const int __attribute__((section(".version")))
#endif
static void watchdogConfig(uint8_t x) {
+ CRITICAL_SECTION_START
WDTCSR = _BV(WDCE) | _BV(WDE);
WDTCSR = x;
-}
-
-static void watchdogReset() {
- __asm__ __volatile__ (
- "wdr\n"
- );
+ CRITICAL_SECTION_END
}
#define RECV_READY ((UCSR0A & _BV(RXC0)) != 0)
@@ -63,7 +60,7 @@ static uint8_t getch(void) {
* the application "soon", if it keeps happening. (Note that we
* don't care that an invalid char is returned...)
*/
- watchdogReset();
+ wdt_reset();
}
ch = UDR0;
return ch;
@@ -117,7 +114,7 @@ uint8_t optiboot_w25x20cl_enter()
// Handshake sequence: Initialize the serial line, flush serial line, send magic, receive magic.
// If the magic is not received on time, or it is not received correctly, continue to the application.
{
- watchdogReset();
+ wdt_reset();
unsigned long boot_timeout = 2000000;
unsigned long boot_timer = 0;
const char *ptr = entry_magic_send;
@@ -125,7 +122,7 @@ uint8_t optiboot_w25x20cl_enter()
const uint8_t selectedSerialPort_bak = selectedSerialPort;
// Flush the serial line.
while (RECV_READY) {
- watchdogReset();
+ wdt_reset();
// Dummy register read (discard)
(void)(*(char *)UDR0);
}
@@ -135,14 +132,14 @@ uint8_t optiboot_w25x20cl_enter()
// Send the initial magic string.
while (ptr != end)
putch(pgm_read_byte(ptr ++));
- watchdogReset();
+ wdt_reset();
// Wait for two seconds until a magic string (constant entry_magic) is received
// from the serial line.
ptr = entry_magic_receive;
end = strlen_P(entry_magic_receive) + ptr;
while (ptr != end) {
while (rx_buffer.head == SerialHead) {
- watchdogReset();
+ wdt_reset();
delayMicroseconds(1);
if (++ boot_timer > boot_timeout)
{
@@ -159,7 +156,7 @@ uint8_t optiboot_w25x20cl_enter()
selectedSerialPort = selectedSerialPort_bak; //revert Serial setting
return 0;
}
- watchdogReset();
+ wdt_reset();
}
cbi(UCSR0B, RXCIE0); //disable the MarlinSerial0 interrupt
// Send the cfm magic string.
diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp
index 3a8586d0f..de007c8cd 100755
--- a/Firmware/ultralcd.cpp
+++ b/Firmware/ultralcd.cpp
@@ -55,6 +55,8 @@
#endif
+int clock_interval = 0;
+
static void lcd_sd_updir();
static void lcd_mesh_bed_leveling_settings();
static void lcd_backlight_menu();
@@ -505,176 +507,212 @@ void lcdui_print_cmd_diag(void)
// Print time (8 chars total)
void lcdui_print_time(void)
{
- //if remaining print time estimation is available print it else print elapsed time
- uint16_t print_t = 0;
- if (print_time_remaining_normal != PRINT_TIME_REMAINING_INIT)
- print_t = print_time_remaining();
- else if(starttime != 0)
- print_t = _millis() / 60000 - starttime / 60000;
- int chars = 0;
- if ((PRINTER_ACTIVE) && ((print_time_remaining_normal != PRINT_TIME_REMAINING_INIT) || (starttime != 0)))
- {
- char suff = ' ';
- char suff_doubt = ' ';
- if (print_time_remaining_normal != PRINT_TIME_REMAINING_INIT)
- {
- suff = 'R';
- if (feedmultiply != 100)
- suff_doubt = '?';
- }
- if (print_t < 6000) //time<100h
- chars = lcd_printf_P(_N("%c%02u:%02u%c%c"), LCD_STR_CLOCK[0], print_t / 60, print_t % 60, suff, suff_doubt);
- else //time>=100h
- chars = lcd_printf_P(_N("%c%3uh %c%c"), LCD_STR_CLOCK[0], print_t / 60, suff, suff_doubt);
- }
- else
- chars = lcd_printf_P(_N("%c--:-- "), LCD_STR_CLOCK[0]);
- lcd_space(8 - chars);
+ //if remaining print time estimation is available print it else print elapsed time
+ int chars = 0;
+ if ((PRINTER_ACTIVE) && (starttime != 0))
+ {
+ uint16_t print_t = 0;
+ uint16_t print_tr = 0;
+ uint16_t print_tc = 0;
+ char suff = ' ';
+ char suff_doubt = ' ';
+
+#ifdef TMC2130
+ if (SilentModeMenu != SILENT_MODE_OFF)
+ {
+ if (print_time_remaining_silent != PRINT_TIME_REMAINING_INIT)
+ {
+ print_tr = print_time_remaining_silent;
+ }
+//#ifdef CLOCK_INTERVAL_TIME
+ if (print_time_to_change_silent != PRINT_TIME_REMAINING_INIT)
+ {
+ print_tc = print_time_to_change_silent;
+ }
+//#endif //CLOCK_INTERVAL_TIME
+ }
+ else
+ {
+#endif //TMC2130
+ if (print_time_remaining_normal != PRINT_TIME_REMAINING_INIT)
+ {
+ print_tr = print_time_remaining_normal;
+ }
+//#ifdef CLOCK_INTERVAL_TIME
+ if (print_time_to_change_normal != PRINT_TIME_REMAINING_INIT)
+ {
+ print_tc = print_time_to_change_normal;
+ }
+//#endif //CLOCK_INTERVAL_TIME
+#ifdef TMC2130
+ }
+#endif //TMC2130
+
+//#ifdef CLOCK_INTERVAL_TIME
+ if (clock_interval == CLOCK_INTERVAL_TIME*2)
+ {
+ clock_interval = 0;
+ }
+ clock_interval++;
+
+ if (print_tc != 0 && clock_interval > CLOCK_INTERVAL_TIME)
+ {
+ print_t = print_tc;
+ suff = 'C';
+ }
+ else
+//#endif //CLOCK_INTERVAL_TIME
+ if (print_tr != 0)
+ {
+ print_t = print_tr;
+ suff = 'R';
+ }
+ else
+ {
+ print_t = _millis() / 60000 - starttime / 60000;
+ }
+
+ if (feedmultiply != 100 && (print_t == print_tr || print_t == print_tc))
+ {
+ suff_doubt = '?';
+ print_t = 100ul * print_t / feedmultiply;
+ }
+
+ if (print_t < 6000) //time<100h
+ chars = lcd_printf_P(_N("%c%02u:%02u%c%c"), LCD_STR_CLOCK[0], print_t / 60, print_t % 60, suff, suff_doubt);
+ else //time>=100h
+ chars = lcd_printf_P(_N("%c%3uh %c%c"), LCD_STR_CLOCK[0], print_t / 60, suff, suff_doubt);
+ }
+ else
+ chars = lcd_printf_P(_N("%c--:-- "), LCD_STR_CLOCK[0]);
+ lcd_space(8 - chars);
}
-//Print status line on status screen
+//! @Brief Print status line on status screen
void lcdui_print_status_line(void)
{
- if (heating_status)
- { // If heating flag, show progress of heating
- heating_status_counter++;
- if (heating_status_counter > 13)
- {
- heating_status_counter = 0;
- }
- lcd_set_cursor(7, 3);
- lcd_space(13);
+ if (heating_status) { // If heating flag, show progress of heating
+ heating_status_counter++;
+ if (heating_status_counter > 13) {
+ heating_status_counter = 0;
+ }
+ lcd_set_cursor(7, 3);
+ lcd_space(13);
- for (unsigned int dots = 0; dots < heating_status_counter; dots++)
- {
- lcd_putc_at(7 + dots, 3, '.');
- }
- switch (heating_status)
- {
- case 1:
- lcd_puts_at_P(0, 3, _T(MSG_HEATING));
- break;
- case 2:
- lcd_puts_at_P(0, 3, _T(MSG_HEATING_COMPLETE));
- heating_status = 0;
- heating_status_counter = 0;
- break;
- case 3:
- lcd_puts_at_P(0, 3, _T(MSG_BED_HEATING));
- break;
- case 4:
- lcd_puts_at_P(0, 3, _T(MSG_BED_DONE));
- heating_status = 0;
- heating_status_counter = 0;
- break;
- default:
- break;
- }
- }
- else if ((IS_SD_PRINTING) && (custom_message_type == CustomMsg::Status))
- { // If printing from SD, show what we are printing
+ for (unsigned int dots = 0; dots < heating_status_counter; dots++) {
+ lcd_putc_at(7 + dots, 3, '.');
+ }
+ switch (heating_status) {
+ case 1:
+ lcd_puts_at_P(0, 3, _T(MSG_HEATING));
+ break;
+ case 2:
+ lcd_puts_at_P(0, 3, _T(MSG_HEATING_COMPLETE));
+ heating_status = 0;
+ heating_status_counter = 0;
+ break;
+ case 3:
+ lcd_puts_at_P(0, 3, _T(MSG_BED_HEATING));
+ break;
+ case 4:
+ lcd_puts_at_P(0, 3, _T(MSG_BED_DONE));
+ heating_status = 0;
+ heating_status_counter = 0;
+ break;
+ default:
+ break;
+ }
+ }
+ else if ((IS_SD_PRINTING) && (custom_message_type == CustomMsg::Status)) { // If printing from SD, show what we are printing
const char* longFilenameOLD = (card.longFilename[0] ? card.longFilename : card.filename);
- if(strlen(longFilenameOLD) > LCD_WIDTH)
- {
- int inters = 0;
- int gh = scrollstuff;
- while (((gh - scrollstuff) < LCD_WIDTH) && (inters == 0))
- {
- if (longFilenameOLD[gh] == '\0')
- {
- lcd_set_cursor(gh - scrollstuff, 3);
- lcd_print(longFilenameOLD[gh - 1]);
- scrollstuff = 0;
- gh = scrollstuff;
- inters = 1;
- }
- else
- {
- lcd_set_cursor(gh - scrollstuff, 3);
- lcd_print(longFilenameOLD[gh - 1]);
- gh++;
- }
- }
- scrollstuff++;
- }
- else
- {
- lcd_printf_P(PSTR("%-20s"), longFilenameOLD);
- }
- }
- else
- { // Otherwise check for other special events
- switch (custom_message_type)
- {
- case CustomMsg::Status: // Nothing special, print status message normally
- lcd_print(lcd_status_message);
- break;
- case CustomMsg::MeshBedLeveling: // If mesh bed leveling in progress, show the status
- if (custom_message_state > 10)
- {
- lcd_set_cursor(0, 3);
- lcd_space(20);
- lcd_puts_at_P(0, 3, _T(MSG_CALIBRATE_Z_AUTO));
- lcd_puts_P(PSTR(" : "));
- lcd_print(custom_message_state-10);
- }
- else
- {
- if (custom_message_state == 3)
- {
- lcd_puts_P(_T(WELCOME_MSG));
- lcd_setstatuspgm(_T(WELCOME_MSG));
- custom_message_type = CustomMsg::Status;
- }
- if (custom_message_state > 3 && custom_message_state <= 10 )
- {
- lcd_set_cursor(0, 3);
- lcd_space(19);
- lcd_puts_at_P(0, 3, _i("Calibration done"));////MSG_HOMEYZ_DONE
- custom_message_state--;
- }
- }
- break;
- case CustomMsg::FilamentLoading: // If loading filament, print status
- lcd_print(lcd_status_message);
- break;
- case CustomMsg::PidCal: // PID tuning in progress
- lcd_print(lcd_status_message);
- if (pid_cycle <= pid_number_of_cycles && custom_message_state > 0)
- {
- lcd_set_cursor(10, 3);
- lcd_print(itostr3(pid_cycle));
- lcd_print('/');
- lcd_print(itostr3left(pid_number_of_cycles));
- }
- break;
- case CustomMsg::TempCal: // PINDA temp calibration in progress
- {
- char statusLine[LCD_WIDTH + 1];
- sprintf_P(statusLine, PSTR("%-20S"), _T(MSG_TEMP_CALIBRATION));
- char progress[4];
- sprintf_P(progress, PSTR("%d/6"), custom_message_state);
- memcpy(statusLine + 12, progress, sizeof(progress) - 1);
- lcd_set_cursor(0, 3);
- lcd_print(statusLine);
- }
- break;
- case CustomMsg::TempCompPreheat: // temp compensation preheat
- lcd_puts_at_P(0, 3, _i("PINDA Heating"));////MSG_PINDA_PREHEAT c=20 r=1
- if (custom_message_state <= PINDA_HEAT_T)
- {
- lcd_puts_P(PSTR(": "));
- lcd_print(custom_message_state); //seconds
- lcd_print(' ');
- }
- break;
- }
- }
-
+ if(strlen(longFilenameOLD) > LCD_WIDTH) {
+ int inters = 0;
+ int gh = scrollstuff;
+ while (((gh - scrollstuff) < LCD_WIDTH) && (inters == 0)) {
+ if (longFilenameOLD[gh] == '\0') {
+ lcd_set_cursor(gh - scrollstuff, 3);
+ lcd_print(longFilenameOLD[gh - 1]);
+ scrollstuff = 0;
+ gh = scrollstuff;
+ inters = 1;
+ } else {
+ lcd_set_cursor(gh - scrollstuff, 3);
+ lcd_print(longFilenameOLD[gh - 1]);
+ gh++;
+ }
+ }
+ scrollstuff++;
+ } else {
+ lcd_printf_P(PSTR("%-20s"), longFilenameOLD);
+ }
+ } else { // Otherwise check for other special events
+ switch (custom_message_type) {
+ case CustomMsg::MsgUpdate: //Short message even while printing from SD
+ case CustomMsg::Status: // Nothing special, print status message normally
+ case CustomMsg::M0Wait: // M0/M1 Wait command working even from SD
+ lcd_print(lcd_status_message);
+ break;
+ case CustomMsg::MeshBedLeveling: // If mesh bed leveling in progress, show the status
+ if (custom_message_state > 10) {
+ lcd_set_cursor(0, 3);
+ lcd_space(20);
+ lcd_puts_at_P(0, 3, _T(MSG_CALIBRATE_Z_AUTO));
+ lcd_puts_P(PSTR(" : "));
+ lcd_print(custom_message_state-10);
+ } else {
+ if (custom_message_state == 3)
+ {
+ lcd_puts_P(_T(WELCOME_MSG));
+ lcd_setstatuspgm(_T(WELCOME_MSG));
+ custom_message_type = CustomMsg::Status;
+ }
+ if (custom_message_state > 3 && custom_message_state <= 10 ) {
+ lcd_set_cursor(0, 3);
+ lcd_space(19);
+ lcd_puts_at_P(0, 3, _i("Calibration done"));////MSG_HOMEYZ_DONE
+ custom_message_state--;
+ }
+ }
+ break;
+ case CustomMsg::FilamentLoading: // If loading filament, print status
+ lcd_print(lcd_status_message);
+ break;
+ case CustomMsg::PidCal: // PID tuning in progress
+ lcd_print(lcd_status_message);
+ if (pid_cycle <= pid_number_of_cycles && custom_message_state > 0) {
+ lcd_set_cursor(10, 3);
+ lcd_print(itostr3(pid_cycle));
+ lcd_print('/');
+ lcd_print(itostr3left(pid_number_of_cycles));
+ }
+ break;
+ case CustomMsg::TempCal: // PINDA temp calibration in progress
+ char statusLine[LCD_WIDTH + 1];
+ sprintf_P(statusLine, PSTR("%-20S"), _T(MSG_TEMP_CALIBRATION));
+ char progress[4];
+ sprintf_P(progress, PSTR("%d/6"), custom_message_state);
+ memcpy(statusLine + 12, progress, sizeof(progress) - 1);
+ lcd_set_cursor(0, 3);
+ lcd_print(statusLine);
+ break;
+ case CustomMsg::TempCompPreheat: // temp compensation preheat
+ lcd_puts_at_P(0, 3, _i("PINDA Heating"));////MSG_PINDA_PREHEAT c=20 r=1
+ if (custom_message_state <= PINDA_HEAT_T) {
+ lcd_puts_P(PSTR(": "));
+ lcd_print(custom_message_state); //seconds
+ lcd_print(' ');
+ }
+ break;
+ case CustomMsg::Resuming: //Resuming
+ lcd_puts_at_P(0, 3, _T(MSG_RESUMING_PRINT));
+ break;
+ }
+ }
+
// Fill the rest of line to have nice and clean output
- for(int fillspace = 0; fillspace < 20; fillspace++)
- if ((lcd_status_message[fillspace] <= 31 ))
- lcd_print(' ');
+ for(int fillspace = 0; fillspace < 20; fillspace++)
+ if ((lcd_status_message[fillspace] <= 31 ))
+ lcd_print(' ');
}
//! @brief Show Status Screen
@@ -1346,17 +1384,22 @@ void lcd_return_to_status()
eFilamentAction = FilamentAction::None; // i.e. non-autoLoad
}
-//! @brief Pause print, disable nozzle heater, move to park position
+//! @brief Pause print, disable nozzle heater, move to park position, send host action "paused"
void lcd_pause_print()
{
- SERIAL_PROTOCOLLNRPGM(MSG_OCTOPRINT_PAUSED); //pause for octoprint
stop_and_save_print_to_ram(0.0, -default_retraction);
lcd_return_to_status();
isPrintPaused = true;
- if (LcdCommands::Idle == lcd_commands_type)
- {
+ if (LcdCommands::Idle == lcd_commands_type) {
lcd_commands_type = LcdCommands::LongPause;
}
+ SERIAL_PROTOCOLLNRPGM(MSG_OCTOPRINT_PAUSED);
+}
+
+//! @brief Send host action "pause"
+void lcd_pause_usb_print()
+{
+ SERIAL_PROTOCOLLNRPGM(MSG_OCTOPRINT_PAUSE);
}
@@ -1404,8 +1447,8 @@ static void pgmtext_with_colon(const char *ipgmLabel, char *dst, uint8_t dstSize
//! |01234567890123456789|
//! |Nozzle FAN: 0000 RPM| FAN c=10 r=1 SPEED c=3 r=1
//! |Print FAN: 0000 RPM| FAN c=10 r=1 SPEED c=3 r=1
-//! |Fil. Xd:000 Yd:000 | Fil. c=4 r=1
-//! |Int: 000 Shut: 000 | Int: c=4 r=1 Shut: c=4 r=1
+//! | |
+//! | |
//! ----------------------
//! @endcode
//! @todo Positioning of the messages and values on LCD aren't fixed to their exact place. This causes issues with translations.
@@ -1419,40 +1462,14 @@ void lcd_menu_extruder_info() // NOT static due to using ins
char nozzle[maxChars], print[maxChars];
pgmtext_with_colon(_i("Nozzle FAN"), nozzle, maxChars); ////c=10 r=1
pgmtext_with_colon(_i("Print FAN"), print, maxChars); ////c=10 r=1
- lcd_printf_P(_N("%s %4d RPM\n" "%s %4d RPM\n"), nozzle, 60*fan_speed[0], print, 60*fan_speed[1] );
-
-#ifdef PAT9125
- // Display X and Y difference from Filament sensor
- // Display Light intensity from Filament sensor
- // Frame_Avg register represents the average brightness of all pixels within a frame (324 pixels). This
- // value ranges from 0(darkest) to 255(brightest).
- // Display LASER shutter time from Filament sensor
- // Shutter register is an index of LASER shutter time. It is automatically controlled by the chip's internal
- // auto-exposure algorithm. When the chip is tracking on a good reflection surface, the Shutter is small.
- // When the chip is tracking on a poor reflection surface, the Shutter is large. Value ranges from 0 to 46.
- if (mmu_enabled == false)
- {
- if (!fsensor_enabled)
- lcd_puts_P(_N("Filament sensor\n" "is disabled."));
- else
- {
- if (!moves_planned() && !IS_SD_PRINTING && !is_usb_printing && (lcd_commands_type != LcdCommands::Layer1Cal))
- pat9125_update();
- lcd_printf_P(_N(
- "Fil. Xd:%3d Yd:%3d\n" ////c=4 r=1
- "Int: %3d " ////c=4 r=1
- "Shut: %3d" ////c=4 r=1
- ),
- pat9125_x, pat9125_y,
- pat9125_b, pat9125_s
- );
- }
- }
-#endif //PAT9125
-
+ lcd_printf_P(_N("%s %4d RPM\n" "%s %4d RPM\n"), nozzle, 60*fan_speed[0], print, 60*fan_speed[1] );
menu_back_if_clicked();
}
+static uint16_t __attribute__((noinline)) clamp999(uint16_t v){
+ return v > 999 ? 999 : v;
+}
+
//! @brief Show Fails Statistics MMU
//!
//! @code{.unparsed}
@@ -1477,8 +1494,8 @@ static void lcd_menu_fails_stats_mmu()
//! @code{.unparsed}
//! |01234567890123456789|
//! |Last print failures | MSG_LAST_PRINT_FAILURES c=20
-//! | MMU fails: 000| MSG_MMU_FAILS c=14
-//! | MMU load fails: 000| MSG_MMU_LOAD_FAILS c=14
+//! | MMU fails 000| MSG_MMU_FAILS c=15
+//! | MMU load fails 000| MSG_MMU_LOAD_FAILS c=15
//! | |
//! ----------------------
//! @endcode
@@ -1486,13 +1503,11 @@ static void lcd_menu_fails_stats_mmu()
static void lcd_menu_fails_stats_mmu_print()
{
lcd_timeoutToStatus.stop(); //infinite timeout
- uint8_t fails = eeprom_read_byte((uint8_t*)EEPROM_MMU_FAIL);
- uint16_t load_fails = eeprom_read_byte((uint8_t*)EEPROM_MMU_LOAD_FAIL);
lcd_home();
lcd_printf_P(PSTR("%S\n" " %-16.16S%-3d\n" " %-16.16S%-3d"),
_T(MSG_LAST_PRINT_FAILURES), ////c=20
- _T(MSG_MMU_FAILS), fails, ////c=14
- _T(MSG_MMU_LOAD_FAILS), load_fails); ////c=14
+ _T(MSG_MMU_FAILS), clamp999( eeprom_read_byte((uint8_t*)EEPROM_MMU_FAIL) ), ////c=14
+ _T(MSG_MMU_LOAD_FAILS), clamp999( eeprom_read_byte((uint8_t*)EEPROM_MMU_LOAD_FAIL) )); ////c=14
menu_back_if_clicked_fb();
}
@@ -1501,9 +1516,9 @@ static void lcd_menu_fails_stats_mmu_print()
//! @code{.unparsed}
//! |01234567890123456789|
//! |Total failures | MSG_TOTAL_FAILURES c=20
-//! | MMU fails: 000| MSG_MMU_FAILS c=14
-//! | MMU load fails: 000| MSG_MMU_LOAD_FAILS c=14
-//! | MMU power fails:000| c=14 r=1
+//! | MMU fails 000| MSG_MMU_FAILS c=15
+//! | MMU load fails 000| MSG_MMU_LOAD_FAILS c=15
+//! | MMU power fails 000| c=15
//! ----------------------
//! @endcode
//! @todo Positioning of the messages and values on LCD aren't fixed to their exact place. This causes issues with translations.
@@ -1511,14 +1526,12 @@ static void lcd_menu_fails_stats_mmu_total()
{
mmu_command(MmuCmd::S3);
lcd_timeoutToStatus.stop(); //infinite timeout
- uint8_t fails = eeprom_read_byte((uint8_t*)EEPROM_MMU_FAIL_TOT);
- uint16_t load_fails = eeprom_read_byte((uint8_t*)EEPROM_MMU_LOAD_FAIL_TOT);
lcd_home();
lcd_printf_P(PSTR("%S\n" " %-16.16S%-3d\n" " %-16.16S%-3d\n" " %-16.16S%-3d"),
_T(MSG_TOTAL_FAILURES), ////c=20
- _T(MSG_MMU_FAILS), fails, ////c=14
- _T(MSG_MMU_LOAD_FAILS), load_fails, ////c=14
- _i("MMU power fails"), mmu_power_failures); ////c=14 r=1
+ _T(MSG_MMU_FAILS), clamp999( eeprom_read_word((uint16_t*)EEPROM_MMU_FAIL_TOT) ), ////c=14
+ _T(MSG_MMU_LOAD_FAILS), clamp999( eeprom_read_word((uint16_t*)EEPROM_MMU_LOAD_FAIL_TOT) ), ////c=14
+ _i("MMU power fails"), clamp999( mmu_power_failures )); ////c=14 r=1
menu_back_if_clicked_fb();
}
@@ -1530,8 +1543,8 @@ static const char failStatsFmt[] PROGMEM = "%S\n" " %-16.16S%-3d\n" " %-16.16S%-
//! @code{.unparsed}
//! |01234567890123456789|
//! |Total failures | MSG_TOTAL_FAILURES c=20
-//! | Power failures: 000| MSG_POWER_FAILURES c=14
-//! | Fil. runouts : 000| MSG_FIL_RUNOUTS c=14
+//! | Power failures 000| MSG_POWER_FAILURES c=15
+//! | Fil. runouts 000| MSG_FIL_RUNOUTS c=15
//! | Crash X:000 Y:000| MSG_CRASH c=7
//! ----------------------
//! @endcode
@@ -1539,16 +1552,14 @@ static const char failStatsFmt[] PROGMEM = "%S\n" " %-16.16S%-3d\n" " %-16.16S%-
static void lcd_menu_fails_stats_total()
{
lcd_timeoutToStatus.stop(); //infinite timeout
- uint16_t power = eeprom_read_word((uint16_t*)EEPROM_POWER_COUNT_TOT);
- uint16_t filam = eeprom_read_word((uint16_t*)EEPROM_FERROR_COUNT_TOT);
- uint16_t crashX = eeprom_read_word((uint16_t*)EEPROM_CRASH_COUNT_X_TOT);
- uint16_t crashY = eeprom_read_word((uint16_t*)EEPROM_CRASH_COUNT_Y_TOT);
- lcd_home();
+ lcd_home();
lcd_printf_P(failStatsFmt,
_T(MSG_TOTAL_FAILURES), ////c=20
- _T(MSG_POWER_FAILURES), power, ////c=14
- _T(MSG_FIL_RUNOUTS), filam, ////c=14
- _T(MSG_CRASH), crashX, crashY); ////c=7
+ _T(MSG_POWER_FAILURES), clamp999( eeprom_read_word((uint16_t*)EEPROM_POWER_COUNT_TOT) ), ////c=14
+ _T(MSG_FIL_RUNOUTS), clamp999( eeprom_read_word((uint16_t*)EEPROM_FERROR_COUNT_TOT) ), ////c=14
+ _T(MSG_CRASH), ////c=7
+ clamp999( eeprom_read_word((uint16_t*)EEPROM_CRASH_COUNT_X_TOT) ),
+ clamp999( eeprom_read_word((uint16_t*)EEPROM_CRASH_COUNT_Y_TOT) ));
menu_back_if_clicked_fb();
}
@@ -1557,11 +1568,22 @@ static void lcd_menu_fails_stats_total()
//! @code{.unparsed}
//! |01234567890123456789|
//! |Last print failures | MSG_LAST_PRINT_FAILURES c=20
-//! | Power failures 000| MSG_POWER_FAILURES c=14
-//! | Fil. runouts 000| MSG_FIL_RUNOUTS c=14
-//! | Crash X:000 Y:000| MSG_CRASH c=7
+//! | Power failures 000| MSG_POWER_FAILURES c=15
+//! | Fil. runouts 000| MSG_FIL_RUNOUTS c=15
+//! | Crash X 000 Y 000| MSG_CRASH c=7
//! ----------------------
//! @endcode
+//! @brief Show Last Print Failures Statistics with PAT9125
+//!
+//! @code{.unparsed}
+//! |01234567890123456789|
+//! |Last print failures | c=20 r=1
+//! | Power failures 000| c=14 r=1
+//! | Runouts H 000 S 000| c=14 r=1
+//! | Crash X:000 Y:000| c=7 r=1
+//! ----------------------
+//! @endcode
+
//! @todo Positioning of the messages and values on LCD aren't fixed to their exact place. This causes issues with translations.
static void lcd_menu_fails_stats_print()
{
@@ -1574,8 +1596,8 @@ static void lcd_menu_fails_stats_print()
#ifndef PAT9125
lcd_printf_P(failStatsFmt,
_T(MSG_LAST_PRINT_FAILURES), ////c=20
- _T(MSG_POWER_FAILURES), power, ////c=14
- _T(MSG_FIL_RUNOUTS), filam, ////c=14
+ _T(MSG_POWER_FAILURES), power, ////c=15
+ _T(MSG_FIL_RUNOUTS), filam, ////c=15
_T(MSG_CRASH), crashX, crashY); ////c=7
#else
// On the MK3 include detailed PAT9125 statistics about soft failures
@@ -1584,7 +1606,7 @@ static void lcd_menu_fails_stats_print()
" %-7.7S H %-3d S %-3d\n"
" %-7.7S X %-3d Y %-3d"),
_T(MSG_LAST_PRINT_FAILURES), ////c=20
- _T(MSG_POWER_FAILURES), power, ////c=14
+ _T(MSG_POWER_FAILURES), power, ////c=15
_i("Runouts"), filam, fsensor_softfail, //c=7
_T(MSG_CRASH), crashX, crashY); ////c=7
#endif
@@ -1627,9 +1649,9 @@ static const char failStatsFmt[] PROGMEM = "%S\n" " %-16.16S%-3d\n" "%S\n" " %-1
//! @code{.unparsed}
//! |01234567890123456789|
//! |Last print failures | MSG_LAST_PRINT_FAILURES c=20
-//! | Fil. runouts 000| MSG_FIL_RUNOUTS c=14
+//! | Fil. runouts 000| MSG_FIL_RUNOUTS c=15
//! |Total failures | MSG_TOTAL_FAILURES c=20
-//! | Fil. runouts 000| MSG_FIL_RUNOUTS c=14
+//! | Fil. runouts 000| MSG_FIL_RUNOUTS c=15
//! ----------------------
//! @endcode
//! @todo Positioning of the messages and values on LCD aren't fixed to their exact place. This causes issues with translations.
@@ -1637,13 +1659,13 @@ static void lcd_menu_fails_stats()
{
lcd_timeoutToStatus.stop(); //infinite timeout
uint8_t filamentLast = eeprom_read_byte((uint8_t*)EEPROM_FERROR_COUNT);
- uint16_t filamentTotal = eeprom_read_word((uint16_t*)EEPROM_FERROR_COUNT_TOT);
+ uint16_t filamentTotal = clamp999( eeprom_read_word((uint16_t*)EEPROM_FERROR_COUNT_TOT) );
lcd_home();
lcd_printf_P(failStatsFmt,
_T(MSG_LAST_PRINT_FAILURES), ////c=20
- _T(MSG_FIL_RUNOUTS), filamentLast, ////c=14
+ _T(MSG_FIL_RUNOUTS), filamentLast, ////c=15
_T(MSG_TOTAL_FAILURES), ////c=20
- _T(MSG_FIL_RUNOUTS), filamentTotal); ////c=14
+ _T(MSG_FIL_RUNOUTS), filamentTotal); ////c=15
menu_back_if_clicked();
}
@@ -3731,6 +3753,16 @@ static void lcd_print_state(uint8_t state)
}
}
+//! @brief Show sensor state
+//!
+//! @code{.unparsed}
+//! |01234567890123456789|
+//! |PINDA N/A FINDA N/A| MSG_PINDA c=6 MSG_FINDA c=6
+//! |Fil. sensor N/A| MSG_FSENSOR
+//! |Xd 000 Yd 000| MSG_XD
+//! |Int 000 Shut 000|
+//! ----------------------
+//! @endcode
static void lcd_show_sensors_state()
{
//0: N/A; 1: OFF; 2: ON
@@ -3743,21 +3775,56 @@ static void lcd_show_sensors_state()
{
finda_state = mmu_finda;
}
- if (ir_sensor_detected) {
- idler_state = !READ(IR_SENSOR_PIN);
- }
- lcd_puts_at_P(0, 0, _i("Sensor state"));
- lcd_puts_at_P(1, 1, _i("PINDA:"));
- lcd_set_cursor(LCD_WIDTH - 4, 1);
+ //lcd_puts_at_P(0, 0, _i("Sensor state"));
+ lcd_puts_at_P(0, 0, _i("PINDA"));
+ lcd_set_cursor(LCD_WIDTH - 14, 0);
lcd_print_state(pinda_state);
- lcd_puts_at_P(1, 2, _i("FINDA:"));
- lcd_set_cursor(LCD_WIDTH - 4, 2);
- lcd_print_state(finda_state);
+ if (mmu_enabled == true)
+ {
+ lcd_puts_at_P(10, 0, _i("FINDA"));
+ lcd_set_cursor(LCD_WIDTH - 3, 0);
+ lcd_print_state(finda_state);
+ }
- lcd_puts_at_P(1, 3, _i("IR:"));
- lcd_set_cursor(LCD_WIDTH - 4, 3);
- lcd_print_state(idler_state);
+ if (ir_sensor_detected) {
+ idler_state = !READ(IR_SENSOR_PIN);
+ lcd_puts_at_P(0, 1, _i("Fil. sensor"));
+ lcd_set_cursor(LCD_WIDTH - 3, 1);
+ lcd_print_state(idler_state);
+ }
+
+
+#ifdef PAT9125
+ // Display X and Y difference from Filament sensor
+ // Display Light intensity from Filament sensor
+ // Frame_Avg register represents the average brightness of all pixels within a frame (324 pixels). This
+ // value ranges from 0(darkest) to 255(brightest).
+ // Display LASER shutter time from Filament sensor
+ // Shutter register is an index of LASER shutter time. It is automatically controlled by the chip's internal
+ // auto-exposure algorithm. When the chip is tracking on a good reflection surface, the Shutter is small.
+ // When the chip is tracking on a poor reflection surface, the Shutter is large. Value ranges from 0 to 46.
+ if (mmu_enabled == false)
+ {
+ //if (!fsensor_enabled)
+ // lcd_puts_P(_N("Filament sensor\n" "is disabled."));
+ //else
+ //{
+ if (!moves_planned() && !IS_SD_PRINTING && !is_usb_printing && (lcd_commands_type != LcdCommands::Layer1Cal))
+ pat9125_update();
+ lcd_set_cursor(0, 2);
+ lcd_printf_P(_N(
+ "Xd: %3d "
+ "Yd: %3d\n" ////c=4 r=1
+ "Int: %3d " ////c=4 r=1
+ "Shut: %3d" ////c=4 r=1
+ ),
+ pat9125_x, pat9125_y,
+ pat9125_b, pat9125_s
+ );
+ //}
+ }
+#endif //PAT9125
}
void lcd_menu_show_sensors_state() // NOT static due to using inside "Marlin_main" module ("manage_inactivity()")
@@ -4726,7 +4793,7 @@ void lcd_wizard(WizState state)
{
using S = WizState;
bool end = false;
- int wizard_event;
+ int8_t wizard_event;
const char *msg = NULL;
// Make sure EEPROM_WIZARD_ACTIVE is true if entering using different entry point
// other than WizState::Run - it is useful for debugging wizard.
@@ -4750,14 +4817,18 @@ void lcd_wizard(WizState state)
// Btw. the flag may even trigger the viper situation on normal start this way and the user won't be able to find out why.
saved_printing = false;
- wizard_event = lcd_show_multiscreen_message_yes_no_and_wait_P(_i("Hi, I am your Original Prusa i3 printer. Would you like me to guide you through the setup process?"), false, true);////MSG_WIZARD_WELCOME c=20 r=7
- if (wizard_event) {
+ if( eeprom_read_byte((uint8_t*)EEPROM_WIZARD_ACTIVE)==2){
+ lcd_show_fullscreen_message_and_wait_P(MSG_WIZARD_WELCOME_SHIPPING);
state = S::Restore;
- eeprom_update_byte((uint8_t*)EEPROM_WIZARD_ACTIVE, 1);
- }
- else {
- eeprom_update_byte((uint8_t*)EEPROM_WIZARD_ACTIVE, 0);
- end = true;
+ } else {
+ wizard_event = lcd_show_multiscreen_message_yes_no_and_wait_P(MSG_WIZARD_WELCOME, false, true);
+ if (wizard_event) {
+ state = S::Restore;
+ eeprom_update_byte((uint8_t*)EEPROM_WIZARD_ACTIVE, 1);
+ } else {
+ eeprom_update_byte((uint8_t*)EEPROM_WIZARD_ACTIVE, 0);
+ end = true;
+ }
}
break;
case S::Restore:
@@ -5900,15 +5971,15 @@ uint8_t choose_menu_P(const char *header, const char *item, const char *last_ite
char reset_menu() {
const uint8_t items_no =
#ifdef SNMM
- 5;
+ 6;
#else
- 4;
+ 5;
#endif
static int8_t first = 0;
int8_t enc_dif = 0;
char cursor_pos = 0;
- const char *const item[items_no] PROGMEM = {PSTR("Language"), PSTR("Statistics"), PSTR("Shipping prep"), PSTR("All Data")
+ const char *const item[items_no] PROGMEM = {PSTR("Language"), PSTR("Statistics"), PSTR("Shipping prep"), PSTR("All Data"), PSTR("Service prep")
#ifdef SNMM
, PSTR("Bowden length")
#endif
@@ -6286,25 +6357,33 @@ static bool fan_error_selftest()
return 0;
}
-//! @brief Resume paused print
+//! @brief Resume paused print, send host action "resumed"
//! @todo It is not good to call restore_print_from_ram_and_continue() from function called by lcd_update(),
//! as restore_print_from_ram_and_continue() calls lcd_update() internally.
void lcd_resume_print()
{
lcd_return_to_status();
lcd_reset_alert_level(); //for fan speed error
- if (fan_error_selftest()) return; //abort if error persists
+ if (fan_error_selftest()) {
+ if (is_usb_printing) SERIAL_PROTOCOLLNRPGM(MSG_OCTOPRINT_PAUSED);
+ return; //abort if error persists
+ }
cmdqueue_serial_disabled = false;
-
lcd_setstatuspgm(_T(MSG_FINISHING_MOVEMENTS));
st_synchronize();
-
- lcd_setstatuspgm(_T(MSG_RESUMING_PRINT)); ////MSG_RESUMING_PRINT c=20
+ custom_message_type = CustomMsg::Resuming;
isPrintPaused = false;
restore_print_from_ram_and_continue(default_retraction);
pause_time += (_millis() - start_pause_print); //accumulate time when print is paused for correct statistics calculation
refresh_cmd_timeout();
SERIAL_PROTOCOLLNRPGM(MSG_OCTOPRINT_RESUMED); //resume octoprint
+ custom_message_type = CustomMsg::Status;
+}
+
+//! @brief Resume paused USB/host print, send host action "resume"
+void lcd_resume_usb_print()
+{
+ SERIAL_PROTOCOLLNRPGM(MSG_OCTOPRINT_RESUME); //resume octoprint
}
static void change_sheet()
@@ -6403,174 +6482,183 @@ static void lcd_sheet_menu()
MENU_END();
}
+//! @brief Show Main Menu
+//!
+//! @code{.unparsed}
+//! |01234567890123456789|
+//! | Info screen | allways
+//!
+//! | tst - Save | ifdef RESUME_DEBUG
+//! | tst - Restore | ifdef RESUME_DEBUG
+//!
+//! | recover print | ifdef TMC2130_DEBUG
+//! | power panic | ifdef TMC2130_DEBUG
+//!
+//! | Live adjust Z | printing + Z low
+//!
+//! | Change filament | farm mode
+//!
+//! | Tune | printing + paused
+//! | Pause print | printing + not paused
+//! | Resume print | printing + paused
+//! | Stop print | printing or paused + NOT MBL
+//! | Preheat | not printing + not paused
+//! | Print from SD | not printing or paused
+//!
+//! | Switch sheet | farm mode
+//!
+//! | AutoLoad filament | not printing + not mmu or paused
+//! | Load filament | not printing + mmu or paused
+//! | Load to nozzle | not printing + mmu or paused
+//! | Unload filament | not printing or paused
+//! | Eject filament | not printing + mmu or paused
+//! | Cut filament | not printing + mmu or paused + cut atctive
+//! | Settings | not printing or paused
+//! | Calibration | not printing
+//! | Statistics | not printing
+//! | Fail stats | allways
+//! | Fail stats MMU | mmu
+//! | Support | allways
+//! @endcode
static void lcd_main_menu()
{
- MENU_BEGIN();
+ MENU_BEGIN();
- // Majkl superawesome menu
+ // Majkl superawesome menu
- MENU_ITEM_BACK_P(_T(MSG_WATCH));
+ MENU_ITEM_BACK_P(_T(MSG_WATCH));
#ifdef RESUME_DEBUG
- if (!saved_printing)
- MENU_ITEM_FUNCTION_P(PSTR("tst - Save"), lcd_menu_test_save);
- else
- MENU_ITEM_FUNCTION_P(PSTR("tst - Restore"), lcd_menu_test_restore);
+ if (!saved_printing)
+ MENU_ITEM_FUNCTION_P(PSTR("tst - Save"), lcd_menu_test_save);
+ else
+ MENU_ITEM_FUNCTION_P(PSTR("tst - Restore"), lcd_menu_test_restore);
#endif //RESUME_DEBUG
#ifdef TMC2130_DEBUG
- MENU_ITEM_FUNCTION_P(PSTR("recover print"), recover_print);
- MENU_ITEM_FUNCTION_P(PSTR("power panic"), uvlo_);
+ MENU_ITEM_FUNCTION_P(PSTR("recover print"), recover_print);
+ MENU_ITEM_FUNCTION_P(PSTR("power panic"), uvlo_);
#endif //TMC2130_DEBUG
-
- if ( ( IS_SD_PRINTING || is_usb_printing || (lcd_commands_type == LcdCommands::Layer1Cal)) && (current_position[Z_AXIS] < Z_HEIGHT_HIDE_LIVE_ADJUST_MENU) && !homing_flag && !mesh_bed_leveling_flag)
- {
- MENU_ITEM_SUBMENU_P(_T(MSG_BABYSTEP_Z), lcd_babystep_z);//8
- }
- if (farm_mode)
- MENU_ITEM_FUNCTION_P(_T(MSG_FILAMENTCHANGE), lcd_colorprint_change);//8
-
- if ( moves_planned() || IS_SD_PRINTING || is_usb_printing || (lcd_commands_type == LcdCommands::Layer1Cal))
- {
- MENU_ITEM_SUBMENU_P(_i("Tune"), lcd_tune_menu);////MSG_TUNE
- } else
- {
- MENU_ITEM_SUBMENU_P(_i("Preheat"), lcd_preheat_menu);////MSG_PREHEAT
- }
-
-
- if(isPrintPaused && saved_printing_type == PRINTING_TYPE_USB)
- {
-#ifdef FANCHECK
- if((fan_check_error == EFCE_FIXED) || (fan_check_error == EFCE_OK))
- MENU_ITEM_SUBMENU_P(_T(MSG_RESUME_PRINT), lcd_resume_print);////MSG_RESUME_PRINT c=18
-#else
- MENU_ITEM_SUBMENU_P(_T(MSG_RESUME_PRINT), lcd_resume_print);////MSG_RESUME_PRINT c=18
-#endif
- }
-
-#ifdef SDSUPPORT
- if (card.cardOK || lcd_commands_type == LcdCommands::Layer1Cal)
- {
- if (card.isFileOpen())
- {
- if (mesh_bed_leveling_flag == false && homing_flag == false) {
- if (card.sdprinting)
- {
- MENU_ITEM_FUNCTION_P(_i("Pause print"), lcd_pause_print);////MSG_PAUSE_PRINT
- }
- else if(isPrintPaused)
- {
- #ifdef FANCHECK
- if((fan_check_error == EFCE_FIXED) || (fan_check_error == EFCE_OK))
- MENU_ITEM_SUBMENU_P(_T(MSG_RESUME_PRINT), lcd_resume_print);////MSG_RESUME_PRINT c=18
- #else
- MENU_ITEM_SUBMENU_P(_T(MSG_RESUME_PRINT), lcd_resume_print);////MSG_RESUME_PRINT c=18
- #endif
-
- }
- MENU_ITEM_SUBMENU_P(_T(MSG_STOP_PRINT), lcd_sdcard_stop);
- }
- }
- else if (lcd_commands_type == LcdCommands::Layer1Cal && mesh_bed_leveling_flag == false && homing_flag == false) {
- //MENU_ITEM_SUBMENU_P(_T(MSG_STOP_PRINT), lcd_sdcard_stop);
- }
- else
- {
- if (!is_usb_printing && (lcd_commands_type != LcdCommands::Layer1Cal))
- {
- //if (farm_mode) MENU_ITEM_SUBMENU_P(MSG_FARM_CARD_MENU, lcd_farm_sdcard_menu);
- /*else*/ {
- bMain=true; // flag ('fake parameter') for 'lcd_sdcard_menu()' function
- MENU_ITEM_SUBMENU_P(_T(MSG_CARD_MENU), lcd_sdcard_menu);
- }
- }
-#if SDCARDDETECT < 1
- MENU_ITEM_GCODE_P(_i("Change SD card"), PSTR("M21")); // SD-card changed by user////MSG_CNG_SDCARD
-#endif
+ if ( ( IS_SD_PRINTING || is_usb_printing || (lcd_commands_type == LcdCommands::Layer1Cal)) && (current_position[Z_AXIS] < Z_HEIGHT_HIDE_LIVE_ADJUST_MENU) && !homing_flag && !mesh_bed_leveling_flag) {
+ MENU_ITEM_SUBMENU_P(_T(MSG_BABYSTEP_Z), lcd_babystep_z);//8
}
-
- } else
- {
- bMain=true; // flag (i.e. 'fake parameter') for 'lcd_sdcard_menu()' function
- MENU_ITEM_SUBMENU_P(_i("No SD card"), lcd_sdcard_menu);////MSG_NO_CARD
-#if SDCARDDETECT < 1
- MENU_ITEM_GCODE_P(_i("Init. SD card"), PSTR("M21")); // Manually initialize the SD-card via user interface////MSG_INIT_SDCARD
-#endif
- }
-#endif
- if(!isPrintPaused && !IS_SD_PRINTING && !is_usb_printing && (lcd_commands_type != LcdCommands::Layer1Cal))
- {
- if (!farm_mode)
- {
- const int8_t sheet = eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet));
- const int8_t nextSheet = eeprom_next_initialized_sheet(sheet);
- if ((nextSheet >= 0) && (sheet != nextSheet)) // show menu only if we have 2 or more sheets initialized
- {
- MENU_ITEM_FUNCTION_E(EEPROM_Sheets_base->s[sheet], eeprom_switch_to_next_sheet);
+ if (farm_mode)
+ MENU_ITEM_FUNCTION_P(_T(MSG_FILAMENTCHANGE), lcd_colorprint_change);//8
+
+ if ( moves_planned() || PRINTER_ACTIVE ) {
+ MENU_ITEM_SUBMENU_P(_i("Tune"), lcd_tune_menu);////MSG_TUNE
+ } else {
+ MENU_ITEM_SUBMENU_P(_i("Preheat"), lcd_preheat_menu);////MSG_PREHEAT
+ }
+
+ if (mesh_bed_leveling_flag == false && homing_flag == false && !isPrintPaused) {
+ if (is_usb_printing) {
+ MENU_ITEM_FUNCTION_P(_T(MSG_PAUSE_PRINT), lcd_pause_usb_print);////MSG_PAUSE_PRINT c=18
+ } else if (IS_SD_PRINTING) {
+ MENU_ITEM_FUNCTION_P(_T(MSG_PAUSE_PRINT), lcd_pause_print);////MSG_PAUSE_PRINT c=18
}
}
- }
+ if(isPrintPaused)
+ {
+#ifdef FANCHECK
+ if((fan_check_error == EFCE_FIXED) || (fan_check_error == EFCE_OK))
+#endif //FANCHECK
+ {
+ if (is_usb_printing) {
+ MENU_ITEM_SUBMENU_P(_T(MSG_RESUME_PRINT), lcd_resume_usb_print);////MSG_RESUME_PRINT c=18
+ } else {
+ MENU_ITEM_SUBMENU_P(_T(MSG_RESUME_PRINT), lcd_resume_print);////MSG_RESUME_PRINT c=18
+ }
+ }
+ }
+ if((IS_SD_PRINTING || is_usb_printing || isPrintPaused) && (custom_message_type != CustomMsg::MeshBedLeveling)) {
+ MENU_ITEM_SUBMENU_P(_T(MSG_STOP_PRINT), lcd_sdcard_stop);
+ }
+#ifdef SDSUPPORT //!@todo SDSUPPORT undefined creates several issues in source code
+ if (card.cardOK || lcd_commands_type == LcdCommands::Layer1Cal) {
+ if (!card.isFileOpen()) {
+ if (!is_usb_printing && (lcd_commands_type != LcdCommands::Layer1Cal)) {
+ //if (farm_mode) MENU_ITEM_SUBMENU_P(MSG_FARM_CARD_MENU, lcd_farm_sdcard_menu);
+ /*else*/{
+ bMain=true; // flag ('fake parameter') for 'lcd_sdcard_menu()' function
+ MENU_ITEM_SUBMENU_P(_T(MSG_CARD_MENU), lcd_sdcard_menu);
+ }
+ }
+#if SDCARDDETECT < 1
+ MENU_ITEM_GCODE_P(_i("Change SD card"), PSTR("M21")); // SD-card changed by user////MSG_CNG_SDCARD
+#endif //SDCARDDETECT
+ }
+ } else {
+ bMain=true; // flag (i.e. 'fake parameter') for 'lcd_sdcard_menu()' function
+ MENU_ITEM_SUBMENU_P(_i("No SD card"), lcd_sdcard_menu);////MSG_NO_CARD
+#if SDCARDDETECT < 1
+ MENU_ITEM_GCODE_P(_i("Init. SD card"), PSTR("M21")); // Manually initialize the SD-card via user interface////MSG_INIT_SDCARD
+#endif //SDCARDDETECT
+ }
+#endif //SDSUPPORT
+ if(!isPrintPaused && !IS_SD_PRINTING && !is_usb_printing && (lcd_commands_type != LcdCommands::Layer1Cal)) {
+ if (!farm_mode) {
+ const int8_t sheet = eeprom_read_byte(&(EEPROM_Sheets_base->active_sheet));
+ const int8_t nextSheet = eeprom_next_initialized_sheet(sheet);
+ if ((nextSheet >= 0) && (sheet != nextSheet)) { // show menu only if we have 2 or more sheets initialized
+ MENU_ITEM_FUNCTION_E(EEPROM_Sheets_base->s[sheet], eeprom_switch_to_next_sheet);
+ }
+ }
+ }
- if ( ! ( IS_SD_PRINTING || is_usb_printing || (lcd_commands_type == LcdCommands::Layer1Cal) ) )
- {
- if (mmu_enabled)
- {
- MENU_ITEM_SUBMENU_P(_T(MSG_LOAD_FILAMENT), fil_load_menu);
- MENU_ITEM_SUBMENU_P(_i("Load to nozzle"), mmu_load_to_nozzle_menu);
+ if ( ! ( IS_SD_PRINTING || is_usb_printing || (lcd_commands_type == LcdCommands::Layer1Cal) ) ) {
+ if (mmu_enabled) {
+ MENU_ITEM_SUBMENU_P(_T(MSG_LOAD_FILAMENT), fil_load_menu);
+ MENU_ITEM_SUBMENU_P(_i("Load to nozzle"), mmu_load_to_nozzle_menu);
//-// MENU_ITEM_FUNCTION_P(_T(MSG_UNLOAD_FILAMENT), extr_unload);
//bFilamentFirstRun=true;
- MENU_ITEM_SUBMENU_P(_T(MSG_UNLOAD_FILAMENT), mmu_unload_filament);
- MENU_ITEM_SUBMENU_P(_T(MSG_EJECT_FILAMENT), mmu_fil_eject_menu);
+ MENU_ITEM_SUBMENU_P(_T(MSG_UNLOAD_FILAMENT), mmu_unload_filament);
+ MENU_ITEM_SUBMENU_P(_T(MSG_EJECT_FILAMENT), mmu_fil_eject_menu);
#ifdef MMU_HAS_CUTTER
- MENU_ITEM_SUBMENU_P(_T(MSG_CUT_FILAMENT), mmu_cut_filament_menu);
+ MENU_ITEM_SUBMENU_P(_T(MSG_CUT_FILAMENT), mmu_cut_filament_menu);
#endif //MMU_HAS_CUTTER
- }
- else
- {
+ } else {
#ifdef SNMM
- MENU_ITEM_SUBMENU_P(_T(MSG_UNLOAD_FILAMENT), fil_unload_menu);
- MENU_ITEM_SUBMENU_P(_i("Change extruder"), change_extr_menu);////MSG_CHANGE_EXTR c=20 r=1
+ MENU_ITEM_SUBMENU_P(_T(MSG_UNLOAD_FILAMENT), fil_unload_menu);
+ MENU_ITEM_SUBMENU_P(_i("Change extruder"), change_extr_menu);////MSG_CHANGE_EXTR c=20 r=1
#endif
#ifdef FILAMENT_SENSOR
- if ((fsensor_autoload_enabled == true) && (fsensor_enabled == true) && (mmu_enabled == false))
- MENU_ITEM_SUBMENU_P(_i("AutoLoad filament"), lcd_menu_AutoLoadFilament);////MSG_AUTOLOAD_FILAMENT c=18
- else
+ if ((fsensor_autoload_enabled == true) && (fsensor_enabled == true) && (mmu_enabled == false))
+ MENU_ITEM_SUBMENU_P(_i("AutoLoad filament"), lcd_menu_AutoLoadFilament);////MSG_AUTOLOAD_FILAMENT c=18
+ else
#endif //FILAMENT_SENSOR
- {
- bFilamentFirstRun=true;
- MENU_ITEM_SUBMENU_P(_T(MSG_LOAD_FILAMENT), lcd_LoadFilament);
- }
- bFilamentFirstRun=true;
- MENU_ITEM_SUBMENU_P(_T(MSG_UNLOAD_FILAMENT), lcd_unLoadFilament);
- }
- MENU_ITEM_SUBMENU_P(_T(MSG_SETTINGS), lcd_settings_menu);
+ {
+ bFilamentFirstRun=true;
+ MENU_ITEM_SUBMENU_P(_T(MSG_LOAD_FILAMENT), lcd_LoadFilament);
+ }
+ bFilamentFirstRun=true;
+ MENU_ITEM_SUBMENU_P(_T(MSG_UNLOAD_FILAMENT), lcd_unLoadFilament);
+ }
+ MENU_ITEM_SUBMENU_P(_T(MSG_SETTINGS), lcd_settings_menu);
if(!isPrintPaused) MENU_ITEM_SUBMENU_P(_T(MSG_MENU_CALIBRATION), lcd_calibration_menu);
+ }
+
+ if (!is_usb_printing && (lcd_commands_type != LcdCommands::Layer1Cal)) {
+ MENU_ITEM_SUBMENU_P(_i("Statistics "), lcd_menu_statistics);////MSG_STATISTICS
+ }
- }
-
- if (!is_usb_printing && (lcd_commands_type != LcdCommands::Layer1Cal))
- {
- MENU_ITEM_SUBMENU_P(_i("Statistics "), lcd_menu_statistics);////MSG_STATISTICS
- }
-
#if defined(TMC2130) || defined(FILAMENT_SENSOR)
- MENU_ITEM_SUBMENU_P(_i("Fail stats"), lcd_menu_fails_stats);
+ MENU_ITEM_SUBMENU_P(_i("Fail stats"), lcd_menu_fails_stats);
#endif
- if (mmu_enabled) {
- MENU_ITEM_SUBMENU_P(_i("Fail stats MMU"), lcd_menu_fails_stats_mmu);
- }
- MENU_ITEM_SUBMENU_P(_i("Support"), lcd_support_menu);////MSG_SUPPORT
+ if (mmu_enabled) {
+ MENU_ITEM_SUBMENU_P(_i("Fail stats MMU"), lcd_menu_fails_stats_mmu);
+ }
+ MENU_ITEM_SUBMENU_P(_i("Support"), lcd_support_menu);////MSG_SUPPORT
#ifdef LCD_TEST
MENU_ITEM_SUBMENU_P(_i("W25x20CL init"), lcd_test_menu);////MSG_SUPPORT
#endif //LCD_TEST
- MENU_END();
+ MENU_END();
}
@@ -6735,10 +6823,8 @@ static void lcd_tune_menu()
SETTINGS_CUTTER;
- if(farm_mode)
- {
- MENU_ITEM_TOGGLE_P(_T(MSG_FANS_CHECK), fans_check_enabled ? _T(MSG_ON) : _T(MSG_OFF), lcd_set_fan_check);
- }
+ MENU_ITEM_TOGGLE_P(_T(MSG_FANS_CHECK), fans_check_enabled ? _T(MSG_ON) : _T(MSG_OFF), lcd_set_fan_check);
+
#ifdef TMC2130
if(!farm_mode)
@@ -8314,7 +8400,7 @@ static int lcd_selftest_screen(TestScreen screen, int _progress, int _progress_s
if (screen == TestScreen::EndStops) lcd_puts_P(_i("Checking endstops"));////MSG_SELFTEST_CHECK_ENDSTOPS c=20
if (screen == TestScreen::AxisX) lcd_puts_P(_T(MSG_CHECKING_X));
if (screen == TestScreen::AxisY) lcd_puts_P(_T(MSG_CHECKING_Y));
- if (screen == TestScreen::AxisZ) lcd_puts_P(_i("Checking Z axis "));////MSG_SELFTEST_CHECK_Z c=20
+ if (screen == TestScreen::AxisZ) lcd_puts_P(_i("Checking Z axis"));////MSG_SELFTEST_CHECK_Z c=20
if (screen == TestScreen::Bed) lcd_puts_P(_T(MSG_SELFTEST_CHECK_BED));
if (screen == TestScreen::Hotend
|| screen == TestScreen::HotendOk) lcd_puts_P(_i("Checking hotend "));////MSG_SELFTEST_CHECK_HOTEND c=20
diff --git a/Firmware/ultralcd.h b/Firmware/ultralcd.h
index 76993b159..008a106e6 100755
--- a/Firmware/ultralcd.h
+++ b/Firmware/ultralcd.h
@@ -44,6 +44,7 @@ void lcd_change_success();
void lcd_loading_color();
void lcd_sdcard_stop();
void lcd_pause_print();
+void lcd_pause_usb_print();
void lcd_resume_print();
void lcd_print_stop();
void prusa_statistics(int _message, uint8_t _col_nr = 0);
@@ -114,12 +115,15 @@ extern int8_t FSensorStateMenu;
enum class CustomMsg : uint_least8_t
{
- Status, //!< status message from lcd_status_message variable
- MeshBedLeveling, //!< Mesh bed leveling in progress
- FilamentLoading, //!< Loading filament in progress
- PidCal, //!< PID tuning in progress
- TempCal, //!< PINDA temperature calibration
- TempCompPreheat, //!< Temperature compensation preheat
+ Status, //!< status message from lcd_status_message variable
+ MeshBedLeveling, //!< Mesh bed leveling in progress
+ FilamentLoading, //!< Loading filament in progress
+ PidCal, //!< PID tuning in progress
+ TempCal, //!< PINDA temperature calibration
+ TempCompPreheat, //!< Temperature compensation preheat
+ M0Wait, //!< M0/M1 Wait command working even from SD
+ MsgUpdate, //!< Short message even while printing from SD
+ Resuming, //!< Resuming message
};
extern CustomMsg custom_message_type;
diff --git a/lang/lang_en.txt b/lang/lang_en.txt
index 8c0e6eb9d..02d42080b 100644
--- a/lang/lang_en.txt
+++ b/lang/lang_en.txt
@@ -142,6 +142,9 @@
#MSG_SD_REMOVED
"Card removed"
+#
+"Checking file"
+
#MSG_NOT_COLOR
"Color not correct"
@@ -253,8 +256,8 @@
#MSG_FSENSOR
"Fil. sensor"
-#MSG_FIL_RUNOUTS c=14
-"Fil. runouts "
+#MSG_FIL_RUNOUTS c=15
+"Fil. runouts"
#MSG_FILAMENT_CLEAN c=20 r=2
"Filament extruding & with correct color?"
@@ -382,6 +385,9 @@
#MSG_LAST_PRINT_FAILURES c=20
"Last print failures"
+#MSG_WIZARD_WELCOME_SHIPPING c=20 r=16
+"Hi, I am your Original Prusa i3 printer. I will guide you through a short setup process, in which the Z-axis will be calibrated. Then, you will be ready to print."
+
#
"If you have additional steel sheets, calibrate their presets in Settings - HW Setup - Steel sheets."
@@ -448,13 +454,13 @@
#
"Measured skew"
-#MSG_MMU_FAILS c=14
+#MSG_MMU_FAILS c=15
"MMU fails"
#
"MMU load failed "
-#MSG_MMU_LOAD_FAILS c=14
+#MSG_MMU_LOAD_FAILS c=15
"MMU load fails"
#MSG_MMU_OK_RESUMING c=20 r=4
@@ -544,7 +550,7 @@
#
"Nozzle FAN"
-#MSG_PAUSE_PRINT
+#MSG_PAUSE_PRINT c=18
"Pause print"
#MSG_PID_RUNNING c=20 r=1
@@ -625,7 +631,7 @@
#MSG_FS_PAUSE c=5
"Pause"
-#MSG_POWER_FAILURES c=14
+#MSG_POWER_FAILURES c=15
"Power failures"
#MSG_PRINT_ABORTED c=20
@@ -1048,7 +1054,7 @@
#MSG_GCODE_DIFF_PRINTER_CONTINUE c=20 r=5
"G-code sliced for a different printer type. Continue?"
-#MSG_GCODE_DIFF_PRINTER_CANCELLED c=20 r=6
+#MSG_GCODE_DIFF_PRINTER_CANCELLED c=20 r=7
"G-code sliced for a different printer type. Please re-slice the model again. Print cancelled."
#
diff --git a/lang/lang_en_cz.txt b/lang/lang_en_cz.txt
index 2c0bc664b..bbf307486 100644
--- a/lang/lang_en_cz.txt
+++ b/lang/lang_en_cz.txt
@@ -190,6 +190,10 @@
"Card removed"
"Karta vyjmuta"
+#
+"Checking file"
+"\x00"
+
#MSG_NOT_COLOR
"Color not correct"
"Barva neni cista"
@@ -338,8 +342,8 @@
"Fil. sensor"
"Fil. senzor"
-#MSG_FIL_RUNOUTS c=14
-"Fil. runouts "
+#MSG_FIL_RUNOUTS c=15
+"Fil. runouts"
"Vypadky filam."
#MSG_FILAMENT_CLEAN c=20 r=2
@@ -510,6 +514,10 @@
"Last print failures"
"Selhani posl. tisku"
+#MSG_WIZARD_WELCOME_SHIPPING c=20 r=16
+"Hi, I am your Original Prusa i3 printer. I will guide you through a short setup process, in which the Z-axis will be calibrated. Then, you will be ready to print."
+"Ahoj, jsem vase tiskarna Original Prusa i3. Provedu vas kratkym procesem nastaveni, ve kterem zkalibrujeme osu Z. Pak budete moct zacit tisknout."
+
#
"If you have additional steel sheets, calibrate their presets in Settings - HW Setup - Steel sheets."
"Mate-li vice tiskovych platu, kalibrujte je v menu Nastaveni - HW nastaveni - Tiskove platy"
@@ -598,7 +606,7 @@
"Measured skew"
"Merene zkoseni"
-#MSG_MMU_FAILS c=14
+#MSG_MMU_FAILS c=15
"MMU fails"
"Selhani MMU"
@@ -606,7 +614,7 @@
"MMU load failed "
"Zavedeni MMU selhalo"
-#MSG_MMU_LOAD_FAILS c=14
+#MSG_MMU_LOAD_FAILS c=15
"MMU load fails"
"MMU selhani zavadeni"
@@ -726,7 +734,7 @@
"Nozzle FAN"
"Vent. trysky"
-#MSG_PAUSE_PRINT
+#MSG_PAUSE_PRINT c=18
"Pause print"
"Pozastavit tisk"
@@ -834,7 +842,7 @@
"Pause"
"\x00"
-#MSG_POWER_FAILURES c=14
+#MSG_POWER_FAILURES c=15
"Power failures"
"Vypadky proudu"
@@ -1398,7 +1406,7 @@
"G-code sliced for a different printer type. Continue?"
"G-code je pripraven pro jiny typ tiskarny. Pokracovat?"
-#MSG_GCODE_DIFF_PRINTER_CANCELLED c=20 r=6
+#MSG_GCODE_DIFF_PRINTER_CANCELLED c=20 r=7
"G-code sliced for a different printer type. Please re-slice the model again. Print cancelled."
"G-code je pripraven pro jiny typ tiskarny. Prosim preslicujte model znovu. Tisk zrusen."
diff --git a/lang/lang_en_de.txt b/lang/lang_en_de.txt
index e6fd5bccc..02dc1a7f7 100644
--- a/lang/lang_en_de.txt
+++ b/lang/lang_en_de.txt
@@ -190,6 +190,10 @@
"Card removed"
"SD Karte entfernt"
+#
+"Checking file"
+"\x00"
+
#MSG_NOT_COLOR
"Color not correct"
"Falsche Farbe"
@@ -338,9 +342,9 @@
"Fil. sensor"
"Fil. Sensor"
-#MSG_FIL_RUNOUTS c=14
-"Fil. runouts "
-"Fil. Maengel "
+#MSG_FIL_RUNOUTS c=15
+"Fil. runouts"
+"Fil. Maengel"
#MSG_FILAMENT_CLEAN c=20 r=2
"Filament extruding & with correct color?"
@@ -510,6 +514,10 @@
"Last print failures"
"Letzte Druckfehler"
+#MSG_WIZARD_WELCOME_SHIPPING c=20 r=16
+"Hi, I am your Original Prusa i3 printer. I will guide you through a short setup process, in which the Z-axis will be calibrated. Then, you will be ready to print."
+"Hallo, ich bin Ihr Original Prusa i3 Drucker. Ich werde Sie durch einen kurzen Einrichtungsprozess fuehren, bei dem die Z-Achse kalibriert wird. Danach sind Sie bereit fuer den Druck."
+
#
"If you have additional steel sheets, calibrate their presets in Settings - HW Setup - Steel sheets."
"Wenn Sie zusaetzliche Stahlbleche haben, kalibrieren Sie deren Voreinstellungen unter Einstellungen - HW Setup - Stahlbleche."
@@ -598,7 +606,7 @@
"Measured skew"
"Schraeglauf"
-#MSG_MMU_FAILS c=14
+#MSG_MMU_FAILS c=15
"MMU fails"
"MMU Fehler"
@@ -606,7 +614,7 @@
"MMU load failed "
"MMU Ladefehler"
-#MSG_MMU_LOAD_FAILS c=14
+#MSG_MMU_LOAD_FAILS c=15
"MMU load fails"
"MMU Ladefehler"
@@ -726,7 +734,7 @@
"Nozzle FAN"
"Duesevent."
-#MSG_PAUSE_PRINT
+#MSG_PAUSE_PRINT c=18
"Pause print"
"Druck pausieren"
@@ -834,7 +842,7 @@
"Pause"
"\x00"
-#MSG_POWER_FAILURES c=14
+#MSG_POWER_FAILURES c=15
"Power failures"
"Netzfehler"
@@ -1398,7 +1406,7 @@
"G-code sliced for a different printer type. Continue?"
"G-Code ist fuer einen anderen Drucker geslict. Fortfahren?"
-#MSG_GCODE_DIFF_PRINTER_CANCELLED c=20 r=6
+#MSG_GCODE_DIFF_PRINTER_CANCELLED c=20 r=7
"G-code sliced for a different printer type. Please re-slice the model again. Print cancelled."
"G-Code ist fuer einen anderen Drucker geslict. Bitte slicen Sie das Modell erneut. Druck abgebrochen."
diff --git a/lang/lang_en_es.txt b/lang/lang_en_es.txt
index 4e622ebb9..76cfd6acf 100644
--- a/lang/lang_en_es.txt
+++ b/lang/lang_en_es.txt
@@ -190,6 +190,10 @@
"Card removed"
"Tarjeta retirada"
+#
+"Checking file"
+"\x00"
+
#MSG_NOT_COLOR
"Color not correct"
"Color no homogeneo"
@@ -338,9 +342,9 @@
"Fil. sensor"
"Sensor Fil."
-#MSG_FIL_RUNOUTS c=14
-"Fil. runouts "
-"Fil. acabado "
+#MSG_FIL_RUNOUTS c=15
+"Fil. runouts"
+"Fil. acabado"
#MSG_FILAMENT_CLEAN c=20 r=2
"Filament extruding & with correct color?"
@@ -510,6 +514,10 @@
"Last print failures"
"Ultimos imp. fallos"
+#MSG_WIZARD_WELCOME_SHIPPING c=20 r=16
+"Hi, I am your Original Prusa i3 printer. I will guide you through a short setup process, in which the Z-axis will be calibrated. Then, you will be ready to print."
+"Hola, soy tu impresora Original Prusa i3. Te guiare a traves de un breve proceso de configuracion, en el que se calibrara el eje Z. Despues, estaras listo para imprimir."
+
#
"If you have additional steel sheets, calibrate their presets in Settings - HW Setup - Steel sheets."
"Si tienes planchas de acero adicionales, calibra sus ajustes en Ajustes - Ajustes HW - Planchas acero."
@@ -598,7 +606,7 @@
"Measured skew"
"Desviacion med:"
-#MSG_MMU_FAILS c=14
+#MSG_MMU_FAILS c=15
"MMU fails"
"Fallos MMU"
@@ -606,7 +614,7 @@
"MMU load failed "
"Carga MMU fallida"
-#MSG_MMU_LOAD_FAILS c=14
+#MSG_MMU_LOAD_FAILS c=15
"MMU load fails"
"Carga MMU falla"
@@ -726,7 +734,7 @@
"Nozzle FAN"
"Vent. capa"
-#MSG_PAUSE_PRINT
+#MSG_PAUSE_PRINT c=18
"Pause print"
"Pausar impresion"
@@ -834,9 +842,9 @@
"Pause"
"Pausa"
-#MSG_POWER_FAILURES c=14
+#MSG_POWER_FAILURES c=15
"Power failures"
-"Cortes de energia"
+"Fallas energia"
#MSG_PRINT_ABORTED c=20
"Print aborted"
@@ -1398,7 +1406,7 @@
"G-code sliced for a different printer type. Continue?"
"Codigo G laminado para un tipo de impresora diferente. ?Continuar?"
-#MSG_GCODE_DIFF_PRINTER_CANCELLED c=20 r=6
+#MSG_GCODE_DIFF_PRINTER_CANCELLED c=20 r=7
"G-code sliced for a different printer type. Please re-slice the model again. Print cancelled."
"Codigo G laminado para una impresora diferente. Por favor relamina el modelo de nuevo. Impresion cancelada."
diff --git a/lang/lang_en_fr.txt b/lang/lang_en_fr.txt
index edf2bb8b4..77e31256e 100644
--- a/lang/lang_en_fr.txt
+++ b/lang/lang_en_fr.txt
@@ -190,6 +190,10 @@
"Card removed"
"Carte retiree"
+#
+"Checking file"
+"\x00"
+
#MSG_NOT_COLOR
"Color not correct"
"Couleur incorrecte"
@@ -338,9 +342,9 @@
"Fil. sensor"
"Capteur Fil."
-#MSG_FIL_RUNOUTS c=14
-"Fil. runouts "
-"Fins filament "
+#MSG_FIL_RUNOUTS c=15
+"Fil. runouts"
+"Fins filament"
#MSG_FILAMENT_CLEAN c=20 r=2
"Filament extruding & with correct color?"
@@ -510,6 +514,10 @@
"Last print failures"
"Echecs derniere imp."
+#MSG_WIZARD_WELCOME_SHIPPING c=20 r=16
+"Hi, I am your Original Prusa i3 printer. I will guide you through a short setup process, in which the Z-axis will be calibrated. Then, you will be ready to print."
+"Bonjour, je suis votre imprimante Original Prusa i3. Je vais vous accompagner au cours d'un bref processus de reglage, qui permettra de calibrer le Z-axis. Apres cela, tout sera pret pour imprimer."
+
#
"If you have additional steel sheets, calibrate their presets in Settings - HW Setup - Steel sheets."
"Si vous avez d'autres feuilles d'acier, calibrez leurs pre-reglages dans Reglages - Config HW - Plaque en acier."
@@ -598,7 +606,7 @@
"Measured skew"
"Deviat.mesuree"
-#MSG_MMU_FAILS c=14
+#MSG_MMU_FAILS c=15
"MMU fails"
"Echecs MMU"
@@ -606,7 +614,7 @@
"MMU load failed "
"Echec chargement MMU"
-#MSG_MMU_LOAD_FAILS c=14
+#MSG_MMU_LOAD_FAILS c=15
"MMU load fails"
"Echecs charg. MMU"
@@ -726,7 +734,7 @@
"Nozzle FAN"
"Vent. buse"
-#MSG_PAUSE_PRINT
+#MSG_PAUSE_PRINT c=18
"Pause print"
"Pause de l'impr."
@@ -834,7 +842,7 @@
"Pause"
"\x00"
-#MSG_POWER_FAILURES c=14
+#MSG_POWER_FAILURES c=15
"Power failures"
"Coup.de courant"
@@ -1398,7 +1406,7 @@
"G-code sliced for a different printer type. Continue?"
"Le G-code a ete prepare pour une autre version de l'imprimante. Continuer?"
-#MSG_GCODE_DIFF_PRINTER_CANCELLED c=20 r=6
+#MSG_GCODE_DIFF_PRINTER_CANCELLED c=20 r=7
"G-code sliced for a different printer type. Please re-slice the model again. Print cancelled."
"Le G-code a ete prepare pour une autre version de l'imprimante. Veuillez decouper le modele a nouveau. L'impression a ete annulee."
diff --git a/lang/lang_en_it.txt b/lang/lang_en_it.txt
index 043d1141b..b0bebf1ad 100644
--- a/lang/lang_en_it.txt
+++ b/lang/lang_en_it.txt
@@ -190,6 +190,10 @@
"Card removed"
"SD rimossa"
+#
+"Checking file"
+"\x00"
+
#MSG_NOT_COLOR
"Color not correct"
"Colore non puro"
@@ -338,9 +342,9 @@
"Fil. sensor"
"Sensore fil."
-#MSG_FIL_RUNOUTS c=14
-"Fil. runouts "
-"Fil. esauriti "
+#MSG_FIL_RUNOUTS c=15
+"Fil. runouts"
+"Fil. esauriti"
#MSG_FILAMENT_CLEAN c=20 r=2
"Filament extruding & with correct color?"
@@ -510,6 +514,10 @@
"Last print failures"
"Errori ultima stampa"
+#MSG_WIZARD_WELCOME_SHIPPING c=20 r=16
+"Hi, I am your Original Prusa i3 printer. I will guide you through a short setup process, in which the Z-axis will be calibrated. Then, you will be ready to print."
+"Ciao, sono la tua stampante Original Prusa i3. Ti guidero attraverso un rapido processo in cui verra calibrato l'asse Z. Poi, sarai pronto a stampare."
+
#
"If you have additional steel sheets, calibrate their presets in Settings - HW Setup - Steel sheets."
"Se hai piastre d'acciaio aggiuntive, calibra i preset in Impostazioni - Setup HW - Piastre in Acciaio."
@@ -598,7 +606,7 @@
"Measured skew"
"Deviazione mis"
-#MSG_MMU_FAILS c=14
+#MSG_MMU_FAILS c=15
"MMU fails"
"Fallimenti MMU"
@@ -606,7 +614,7 @@
"MMU load failed "
"Caricamento MMU fallito"
-#MSG_MMU_LOAD_FAILS c=14
+#MSG_MMU_LOAD_FAILS c=15
"MMU load fails"
"Caricamenti MMU falliti"
@@ -726,7 +734,7 @@
"Nozzle FAN"
"Ventola estrusore"
-#MSG_PAUSE_PRINT
+#MSG_PAUSE_PRINT c=18
"Pause print"
"Metti in pausa"
@@ -834,7 +842,7 @@
"Pause"
"Pausa"
-#MSG_POWER_FAILURES c=14
+#MSG_POWER_FAILURES c=15
"Power failures"
"Mancanza corrente"
@@ -1398,7 +1406,7 @@
"G-code sliced for a different printer type. Continue?"
"G-code processato per una stampante diversa. Continuare?"
-#MSG_GCODE_DIFF_PRINTER_CANCELLED c=20 r=6
+#MSG_GCODE_DIFF_PRINTER_CANCELLED c=20 r=7
"G-code sliced for a different printer type. Please re-slice the model again. Print cancelled."
"G-code processato per una stampante diversa. Per favore esegui nuovamente lo slice del modello. Stampa annullata."
diff --git a/lang/lang_en_pl.txt b/lang/lang_en_pl.txt
index 4e6be18e0..89db5b6de 100644
--- a/lang/lang_en_pl.txt
+++ b/lang/lang_en_pl.txt
@@ -190,6 +190,10 @@
"Card removed"
"Karta wyjeta"
+#
+"Checking file"
+"\x00"
+
#MSG_NOT_COLOR
"Color not correct"
"Kolor zanieczysz."
@@ -338,8 +342,8 @@
"Fil. sensor"
"Czuj. filam."
-#MSG_FIL_RUNOUTS c=14
-"Fil. runouts "
+#MSG_FIL_RUNOUTS c=15
+"Fil. runouts"
"Konc.filamentu"
#MSG_FILAMENT_CLEAN c=20 r=2
@@ -510,6 +514,10 @@
"Last print failures"
"Ostatnie bledy druku"
+#MSG_WIZARD_WELCOME_SHIPPING c=20 r=16
+"Hi, I am your Original Prusa i3 printer. I will guide you through a short setup process, in which the Z-axis will be calibrated. Then, you will be ready to print."
+"Czesc, jestem Twoja drukarka Original Prusa i3. Przeprowadze Cie przez krotka kalibracje osi Z, po ktorej mozesz rozpoczac drukowanie."
+
#
"If you have additional steel sheets, calibrate their presets in Settings - HW Setup - Steel sheets."
"Jesli masz dodatkowe plyty stalowe, to skalibruj ich ustawienia w menu Ustawienia - Ustawienia HW - Plyty stalowe."
@@ -598,7 +606,7 @@
"Measured skew"
"Zmierzony skos"
-#MSG_MMU_FAILS c=14
+#MSG_MMU_FAILS c=15
"MMU fails"
"Bledy MMU"
@@ -606,7 +614,7 @@
"MMU load failed "
"Blad ladowania MMU"
-#MSG_MMU_LOAD_FAILS c=14
+#MSG_MMU_LOAD_FAILS c=15
"MMU load fails"
"Bledy ladow. MMU"
@@ -726,7 +734,7 @@
"Nozzle FAN"
"WentHotend"
-#MSG_PAUSE_PRINT
+#MSG_PAUSE_PRINT c=18
"Pause print"
"Wstrzymanie wydruku"
@@ -834,7 +842,7 @@
"Pause"
"Pauza"
-#MSG_POWER_FAILURES c=14
+#MSG_POWER_FAILURES c=15
"Power failures"
"Zaniki zasilania"
@@ -1398,7 +1406,7 @@
"G-code sliced for a different printer type. Continue?"
"G-code pociety dla innej drukarki. Kontynuowac?"
-#MSG_GCODE_DIFF_PRINTER_CANCELLED c=20 r=6
+#MSG_GCODE_DIFF_PRINTER_CANCELLED c=20 r=7
"G-code sliced for a different printer type. Please re-slice the model again. Print cancelled."
"G-code pociety dla drukarki innego typu. Potnij model ponownie. Druk anulowany."