Merge branch 'MK3' into MK3_NEW_SD_COMPILATION

This commit is contained in:
Alex Voinea 2021-02-26 09:48:46 +02:00
commit 7faffa539a
No known key found for this signature in database
GPG key ID: F5034E7CFCF2F973
16 changed files with 877 additions and 746 deletions

View file

@ -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 ============================
//===========================================================================

View file

@ -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();

View file

@ -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,87 +709,61 @@ 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();
Sound_MakeCustom(100,0,false);
switch (level) {
// Level 0: Language reset
case 0:
Sound_MakeCustom(100,0,false);
case 0: // Level 0: Language reset
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);
case 1: //Level 1: Reset statistics
factory_reset_stats();
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"));
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, 1); //run wizard
eeprom_write_byte((uint8_t*)EEPROM_WIZARD_ACTIVE, 2); //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);
#ifdef FILAMENT_SENSOR
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);
@ -799,18 +775,16 @@ static void factory_reset(char level)
}
menu_progressbar_finish();
softReset();
break;
case 4:
#ifdef SNMM
case 5:
bowden_menu();
break;
#endif
default:
break;
}
}
extern "C" {
@ -841,10 +815,8 @@ void factory_reset()
{
lcd_clear();
lcd_puts_P(PSTR("Factory RESET"));
SET_OUTPUT(BEEPER);
if(eSoundMode!=e_SOUND_MODE_SILENT)
WRITE(BEEPER, HIGH);
@ -853,18 +825,17 @@ void factory_reset()
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.
}
@ -3749,9 +3719,10 @@ void process_commands()
#ifdef FANCHECK
if(fan_check_error == EFCE_DETECTED) {
fan_check_error = EFCE_REPORTED;
// SERIAL_PROTOCOLLNRPGM(MSG_OCTOPRINT_PAUSED);
if (is_usb_printing)
lcd_pause_usb_print();
else
lcd_pause_print();
cmdqueue_serial_disabled = true;
}
#endif
@ -3802,11 +3773,70 @@ void process_commands()
- 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 "^"
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
- `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
@ -5666,60 +5696,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();
@ -6381,27 +6361,33 @@ Sigma_Exit:
### M73 - Set/get print progress <a href="https://reprap.org/wiki/G-code#M73:_Set.2FGet_build_percentage">M73: Set/Get build percentage</a>
#### Usage
M73 [ P | R | Q | S ]
M73 [ P | R | Q | S | C | D ]
#### 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
*/
case 73: //M73 show percent done and time remaining
//!@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\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);
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 <a href="https://reprap.org/wiki/G-code#M104:_Set_Extruder_Temperature">M104: Set Extruder Temperature</a>
#### Usage
@ -8120,8 +8106,7 @@ Sigma_Exit:
case 25:
case 601:
{
if (!isPrintPaused)
{
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
@ -8133,9 +8118,9 @@ Sigma_Exit:
/*!
### 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();
case 602:
{
if (isPrintPaused) lcd_resume_print();
}
break;
@ -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,35 +11619,27 @@ 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;
#ifdef TMC2130
if (SilentModeMenu == SILENT_MODE_OFF && print_percent_done_normal <= 100) {
if (SilentModeMenu == SILENT_MODE_OFF && print_percent_done_normal <= 100)
{
percent_done = print_percent_done_normal;
}
else if (print_percent_done_silent <= 100) {
else if (print_percent_done_silent <= 100)
{
percent_done = print_percent_done_silent;
}
#else
if (print_percent_done_normal <= 100) {
if (print_percent_done_normal <= 100)
{
percent_done = print_percent_done_normal;
}
#endif //TMC2130
else {
else
{
percent_done = card.percentDone();
}
return percent_done;
@ -11676,9 +11648,11 @@ uint8_t calc_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_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()

View file

@ -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

View file

@ -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

View file

@ -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[];

View file

@ -7,6 +7,7 @@
#include "w25x20cl.h"
#include "stk500.h"
#include "bootapp.h"
#include <avr/wdt.h>
#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.

View file

@ -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();
@ -506,22 +508,76 @@ void lcdui_print_cmd_diag(void)
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)))
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)
{
suff = 'R';
if (feedmultiply != 100)
suff_doubt = '?';
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
@ -532,25 +588,21 @@ void lcdui_print_time(void)
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
if (heating_status) { // If heating flag, show progress of heating
heating_status_counter++;
if (heating_status_counter > 13)
{
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++)
{
for (unsigned int dots = 0; dots < heating_status_counter; dots++) {
lcd_putc_at(7 + dots, 3, '.');
}
switch (heating_status)
{
switch (heating_status) {
case 1:
lcd_puts_at_P(0, 3, _T(MSG_HEATING));
break;
@ -571,63 +623,50 @@ void lcdui_print_status_line(void)
break;
}
}
else if ((IS_SD_PRINTING) && (custom_message_type == CustomMsg::Status))
{ // If printing from SD, show what we are printing
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)
{
if(strlen(longFilenameOLD) > LCD_WIDTH) {
int inters = 0;
int gh = scrollstuff;
while (((gh - scrollstuff) < LCD_WIDTH) && (inters == 0))
{
if (longFilenameOLD[gh] == '\0')
{
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
{
} else {
lcd_set_cursor(gh - scrollstuff, 3);
lcd_print(longFilenameOLD[gh - 1]);
gh++;
}
}
scrollstuff++;
}
else
{
} else {
lcd_printf_P(PSTR("%-20s"), longFilenameOLD);
}
}
else
{ // Otherwise check for other special events
switch (custom_message_type)
{
} 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)
{
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
{
} 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 )
{
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
@ -640,8 +679,7 @@ void lcdui_print_status_line(void)
break;
case CustomMsg::PidCal: // PID tuning in progress
lcd_print(lcd_status_message);
if (pid_cycle <= pid_number_of_cycles && custom_message_state > 0)
{
if (pid_cycle <= pid_number_of_cycles && custom_message_state > 0) {
lcd_set_cursor(10, 3);
lcd_print(itostr3(pid_cycle));
lcd_print('/');
@ -649,7 +687,6 @@ void lcdui_print_status_line(void)
}
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];
@ -657,17 +694,18 @@ void lcdui_print_status_line(void)
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)
{
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;
}
}
@ -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.
@ -1420,39 +1463,13 @@ void lcd_menu_extruder_info() // NOT static due to using ins
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
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_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,23 +3775,58 @@ 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);
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);
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()")
{
lcd_timeoutToStatus.stop();
@ -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,15 +4817,19 @@ 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( eeprom_read_byte((uint8_t*)EEPROM_WIZARD_ACTIVE)==2){
lcd_show_fullscreen_message_and_wait_P(MSG_WIZARD_WELCOME_SHIPPING);
state = S::Restore;
} 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 {
} else {
eeprom_update_byte((uint8_t*)EEPROM_WIZARD_ACTIVE, 0);
end = true;
}
}
break;
case S::Restore:
switch (calibration_status()) {
@ -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,6 +6482,44 @@ 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()
{
@ -6425,63 +6542,46 @@ static void lcd_main_menu()
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)
{
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))
{
if ( moves_planned() || PRINTER_ACTIVE ) {
MENU_ITEM_SUBMENU_P(_i("Tune"), lcd_tune_menu);////MSG_TUNE
} else
{
} else {
MENU_ITEM_SUBMENU_P(_i("Preheat"), lcd_preheat_menu);////MSG_PREHEAT
}
if(isPrintPaused && saved_printing_type == PRINTING_TYPE_USB)
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
#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
}
if((IS_SD_PRINTING || is_usb_printing || isPrintPaused) && (custom_message_type != CustomMsg::MeshBedLeveling)) {
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))
{
#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
@ -6490,37 +6590,29 @@ static void lcd_main_menu()
}
#if SDCARDDETECT < 1
MENU_ITEM_GCODE_P(_i("Change SD card"), PSTR("M21")); // SD-card changed by user////MSG_CNG_SDCARD
#endif
#endif //SDCARDDETECT
}
} else
{
} 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 //SDCARDDETECT
}
#endif
#endif //SDSUPPORT
if(!isPrintPaused && !IS_SD_PRINTING && !is_usb_printing && (lcd_commands_type != LcdCommands::Layer1Cal))
{
if (!farm_mode)
{
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
{
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)
{
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);
@ -6530,9 +6622,7 @@ static void lcd_main_menu()
#ifdef MMU_HAS_CUTTER
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
@ -6551,11 +6641,9 @@ static void lcd_main_menu()
}
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))
{
if (!is_usb_printing && (lcd_commands_type != LcdCommands::Layer1Cal)) {
MENU_ITEM_SUBMENU_P(_i("Statistics "), lcd_menu_statistics);////MSG_STATISTICS
}
@ -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);
}
#ifdef TMC2130
if(!farm_mode)

View file

@ -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);
@ -120,6 +121,9 @@ enum class CustomMsg : uint_least8_t
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;

View file

@ -142,6 +142,9 @@
#MSG_SD_REMOVED
"Card removed"
#
"Checking file"
#MSG_NOT_COLOR
"Color not correct"
@ -253,7 +256,7 @@
#MSG_FSENSOR
"Fil. sensor"
#MSG_FIL_RUNOUTS c=14
#MSG_FIL_RUNOUTS c=15
"Fil. runouts"
#MSG_FILAMENT_CLEAN c=20 r=2
@ -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."
#

View file

@ -190,6 +190,10 @@
"Card removed"
"Karta vyjmuta"
#
"Checking file"
"\x00"
#MSG_NOT_COLOR
"Color not correct"
"Barva neni cista"
@ -338,7 +342,7 @@
"Fil. sensor"
"Fil. senzor"
#MSG_FIL_RUNOUTS c=14
#MSG_FIL_RUNOUTS c=15
"Fil. runouts"
"Vypadky filam."
@ -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."

View file

@ -190,6 +190,10 @@
"Card removed"
"SD Karte entfernt"
#
"Checking file"
"\x00"
#MSG_NOT_COLOR
"Color not correct"
"Falsche Farbe"
@ -338,7 +342,7 @@
"Fil. sensor"
"Fil. Sensor"
#MSG_FIL_RUNOUTS c=14
#MSG_FIL_RUNOUTS c=15
"Fil. runouts"
"Fil. Maengel"
@ -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."

View file

@ -190,6 +190,10 @@
"Card removed"
"Tarjeta retirada"
#
"Checking file"
"\x00"
#MSG_NOT_COLOR
"Color not correct"
"Color no homogeneo"
@ -338,7 +342,7 @@
"Fil. sensor"
"Sensor Fil."
#MSG_FIL_RUNOUTS c=14
#MSG_FIL_RUNOUTS c=15
"Fil. runouts"
"Fil. acabado"
@ -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."

View file

@ -190,6 +190,10 @@
"Card removed"
"Carte retiree"
#
"Checking file"
"\x00"
#MSG_NOT_COLOR
"Color not correct"
"Couleur incorrecte"
@ -338,7 +342,7 @@
"Fil. sensor"
"Capteur Fil."
#MSG_FIL_RUNOUTS c=14
#MSG_FIL_RUNOUTS c=15
"Fil. runouts"
"Fins filament"
@ -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."

View file

@ -190,6 +190,10 @@
"Card removed"
"SD rimossa"
#
"Checking file"
"\x00"
#MSG_NOT_COLOR
"Color not correct"
"Colore non puro"
@ -338,7 +342,7 @@
"Fil. sensor"
"Sensore fil."
#MSG_FIL_RUNOUTS c=14
#MSG_FIL_RUNOUTS c=15
"Fil. runouts"
"Fil. esauriti"
@ -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."

View file

@ -190,6 +190,10 @@
"Card removed"
"Karta wyjeta"
#
"Checking file"
"\x00"
#MSG_NOT_COLOR
"Color not correct"
"Kolor zanieczysz."
@ -338,7 +342,7 @@
"Fil. sensor"
"Czuj. filam."
#MSG_FIL_RUNOUTS c=14
#MSG_FIL_RUNOUTS c=15
"Fil. runouts"
"Konc.filamentu"
@ -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."