From e878572b935352b50139306717c761cdb7d13380 Mon Sep 17 00:00:00 2001 From: Bjarke Istrup Pedersen Date: Mon, 7 Aug 2017 16:39:00 +0200 Subject: [PATCH 01/37] Ported MarlinFirmware/#3109 - Provide feedback to hosts when busy --- Firmware/Marlin_main.cpp | 62 +++++++++++++++++++ .../variants/1_75mm_MK1-RAMBo10a-E3Dv6full.h | 3 + .../variants/1_75mm_MK1-RAMBo13a-E3Dv6full.h | 3 + ...5mm_MK2-MultiMaterial-RAMBo10a-E3Dv6full.h | 3 + ...5mm_MK2-MultiMaterial-RAMBo13a-E3Dv6full.h | 3 + .../variants/1_75mm_MK2-RAMBo10a-E3Dv6full.h | 3 + .../variants/1_75mm_MK2-RAMBo13a-E3Dv6full.h | 3 + 7 files changed, 80 insertions(+) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index a783af48a..492defe70 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -368,6 +368,26 @@ int fanSpeed=0; bool cancel_heatup = false ; +#ifdef HOST_KEEPALIVE_FEATURE + // States for managing Marlin and host communication + // Marlin sends messages if blocked or busy + enum MarlinBusyState { + NOT_BUSY, // Not in a handler + IN_HANDLER, // Processing a GCode + IN_PROCESS, // Known to be blocking command input (as in G29) + PAUSED_FOR_USER, // Blocking pending any input + PAUSED_FOR_INPUT // Blocking pending text input (concept) + }; + + static MarlinBusyState busy_state = NOT_BUSY; + static long next_busy_signal_ms = -1; + + #define KEEPALIVE_STATE(n) do { busy_state = n; } while (0) +#else + #define host_keepalive(); + #define KEEPALIVE_STATE(n); +#endif + #ifdef FILAMENT_SENSOR //Variables for Filament Sensor input float filament_width_nominal=DEFAULT_NOMINAL_FILAMENT_DIA; //Set nominal filament width, can be changed with M404 @@ -1300,6 +1320,33 @@ int serial_read_stream() { } } +#ifdef HOST_KEEPALIVE_FEATURE +void host_keepalive() { + long ms = millis(); + if (busy_state != NOT_BUSY) { + if (ms < next_busy_signal_ms) return; + switch (busy_state) { + case NOT_BUSY: + break; + case IN_HANDLER: + case IN_PROCESS: + SERIAL_ECHO_START; + SERIAL_ECHOLNPGM("busy: processing"); + break; + case PAUSED_FOR_USER: + SERIAL_ECHO_START; + SERIAL_ECHOLNPGM("busy: paused for user"); + break; + case PAUSED_FOR_INPUT: + SERIAL_ECHO_START; + SERIAL_ECHOLNPGM("busy: paused for input"); + break; + } + } + next_busy_signal_ms = ms + 2000UL; +} +#endif + // The loop() function is called in an endless loop by the Arduino framework from the default main() routine. // Before loop(), the setup() function is called by the main() routine. void loop() @@ -1361,6 +1408,7 @@ void loop() manage_heater(); isPrintPaused ? manage_inactivity(true) : manage_inactivity(false); checkHitEndstops(); + host_keepalive(); lcd_update(); } @@ -2058,6 +2106,8 @@ void process_commands() float tmp_motor_loud[3] = DEFAULT_PWM_MOTOR_CURRENT_LOUD; int8_t SilentMode; #endif + KEEPALIVE_STATE(IN_HANDLER); + if (code_seen("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) @@ -2388,6 +2438,8 @@ void process_commands() case 28: //G28 Home all Axis one at a time homing_flag = true; + KEEPALIVE_STATE(IN_HANDLER); + #ifdef ENABLE_AUTO_BED_LEVELING plan_bed_level_matrix.set_to_identity(); //Reset the plane ("erase" all leveling data) #endif //ENABLE_AUTO_BED_LEVELING @@ -3441,20 +3493,24 @@ void process_commands() 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(); } + KEEPALIVE_STATE(IN_HANDLER); lcd_ignore_click(false); }else{ if (!lcd_detected()) break; + KEEPALIVE_STATE(PAUSED_FOR_USER); while(!lcd_clicked()){ manage_heater(); manage_inactivity(true); lcd_update(); } + KEEPALIVE_STATE(IN_HANDLER); } if (IS_SD_PRINTING) LCD_MESSAGERPGM(MSG_RESUMING); @@ -4940,6 +4996,8 @@ Sigma_Exit: temp=70; if (code_seen('S')) temp=code_value(); if (code_seen('C')) c=code_value(); + + KEEPALIVE_STATE(NOT_BUSY); PID_autotune(temp, e, c); } break; @@ -5217,6 +5275,7 @@ case 404: //M404 Enter the nominal filament width (3mm, 1.75mm ) N<3.0> or disp int counterBeep = 0; lcd_wait_interact(); load_filament_time = millis(); + KEEPALIVE_STATE(PAUSED_FOR_USER); while(!lcd_clicked()){ cnt++; @@ -5253,6 +5312,7 @@ case 404: //M404 Enter the nominal filament width (3mm, 1.75mm ) N<3.0> or disp } } + KEEPALIVE_STATE(IN_HANDLER); WRITE(BEEPER, LOW); #ifdef SNMM display_loading(); @@ -5717,6 +5777,8 @@ case 404: //M404 Enter the nominal filament width (3mm, 1.75mm ) N<3.0> or disp SERIAL_ECHOLNPGM("\""); } + KEEPALIVE_STATE(NOT_BUSY); + ClearToSend(); } diff --git a/Firmware/variants/1_75mm_MK1-RAMBo10a-E3Dv6full.h b/Firmware/variants/1_75mm_MK1-RAMBo10a-E3Dv6full.h index ba9f55289..0dc72e79f 100644 --- a/Firmware/variants/1_75mm_MK1-RAMBo10a-E3Dv6full.h +++ b/Firmware/variants/1_75mm_MK1-RAMBo10a-E3Dv6full.h @@ -186,6 +186,9 @@ ADDITIONAL FEATURES SETTINGS #define TEMP_RUNAWAY_EXTRUDER_HYSTERESIS 15 #define TEMP_RUNAWAY_EXTRUDER_TIMEOUT 45 +// USB host keep alive +#define HOST_KEEPALIVE_FEATURE + /*------------------------------------ MOTOR CURRENT SETTINGS *------------------------------------*/ diff --git a/Firmware/variants/1_75mm_MK1-RAMBo13a-E3Dv6full.h b/Firmware/variants/1_75mm_MK1-RAMBo13a-E3Dv6full.h index 1822a9d73..634c578a3 100644 --- a/Firmware/variants/1_75mm_MK1-RAMBo13a-E3Dv6full.h +++ b/Firmware/variants/1_75mm_MK1-RAMBo13a-E3Dv6full.h @@ -186,6 +186,9 @@ ADDITIONAL FEATURES SETTINGS #define TEMP_RUNAWAY_EXTRUDER_HYSTERESIS 15 #define TEMP_RUNAWAY_EXTRUDER_TIMEOUT 45 +// USB host keep alive +#define HOST_KEEPALIVE_FEATURE + /*------------------------------------ MOTOR CURRENT SETTINGS *------------------------------------*/ diff --git a/Firmware/variants/1_75mm_MK2-MultiMaterial-RAMBo10a-E3Dv6full.h b/Firmware/variants/1_75mm_MK2-MultiMaterial-RAMBo10a-E3Dv6full.h index 06a7410c3..eab7541a1 100644 --- a/Firmware/variants/1_75mm_MK2-MultiMaterial-RAMBo10a-E3Dv6full.h +++ b/Firmware/variants/1_75mm_MK2-MultiMaterial-RAMBo10a-E3Dv6full.h @@ -181,6 +181,9 @@ ADDITIONAL FEATURES SETTINGS #define TEMP_RUNAWAY_EXTRUDER_HYSTERESIS 15 #define TEMP_RUNAWAY_EXTRUDER_TIMEOUT 45 +// USB host keep alive +#define HOST_KEEPALIVE_FEATURE + /*------------------------------------ MOTOR CURRENT SETTINGS *------------------------------------*/ diff --git a/Firmware/variants/1_75mm_MK2-MultiMaterial-RAMBo13a-E3Dv6full.h b/Firmware/variants/1_75mm_MK2-MultiMaterial-RAMBo13a-E3Dv6full.h index a0afa5f7f..a39519bd2 100644 --- a/Firmware/variants/1_75mm_MK2-MultiMaterial-RAMBo13a-E3Dv6full.h +++ b/Firmware/variants/1_75mm_MK2-MultiMaterial-RAMBo13a-E3Dv6full.h @@ -183,6 +183,9 @@ ADDITIONAL FEATURES SETTINGS #define TEMP_RUNAWAY_EXTRUDER_HYSTERESIS 15 #define TEMP_RUNAWAY_EXTRUDER_TIMEOUT 45 +// USB host keep alive +#define HOST_KEEPALIVE_FEATURE + /*------------------------------------ MOTOR CURRENT SETTINGS *------------------------------------*/ diff --git a/Firmware/variants/1_75mm_MK2-RAMBo10a-E3Dv6full.h b/Firmware/variants/1_75mm_MK2-RAMBo10a-E3Dv6full.h index d7019845f..a182f9fec 100644 --- a/Firmware/variants/1_75mm_MK2-RAMBo10a-E3Dv6full.h +++ b/Firmware/variants/1_75mm_MK2-RAMBo10a-E3Dv6full.h @@ -181,6 +181,9 @@ ADDITIONAL FEATURES SETTINGS #define TEMP_RUNAWAY_EXTRUDER_HYSTERESIS 15 #define TEMP_RUNAWAY_EXTRUDER_TIMEOUT 45 +// USB host keep alive +#define HOST_KEEPALIVE_FEATURE + /*------------------------------------ MOTOR CURRENT SETTINGS *------------------------------------*/ diff --git a/Firmware/variants/1_75mm_MK2-RAMBo13a-E3Dv6full.h b/Firmware/variants/1_75mm_MK2-RAMBo13a-E3Dv6full.h index 720e74f5e..ff37a14e8 100644 --- a/Firmware/variants/1_75mm_MK2-RAMBo13a-E3Dv6full.h +++ b/Firmware/variants/1_75mm_MK2-RAMBo13a-E3Dv6full.h @@ -183,6 +183,9 @@ ADDITIONAL FEATURES SETTINGS #define TEMP_RUNAWAY_EXTRUDER_HYSTERESIS 15 #define TEMP_RUNAWAY_EXTRUDER_TIMEOUT 45 +// USB host keep alive +#define HOST_KEEPALIVE_FEATURE + /*------------------------------------ MOTOR CURRENT SETTINGS *------------------------------------*/ From 9c7de9292af1b854bdc561eee92482f3baa5b60a Mon Sep 17 00:00:00 2001 From: Bjarke Istrup Pedersen Date: Wed, 9 Aug 2017 10:24:19 +0200 Subject: [PATCH 02/37] Ported the remaining HOST_KEEPALIVE commits from Marlin --- Firmware/Configuration.h | 8 ++++- Firmware/Marlin.h | 6 ++++ Firmware/Marlin_main.cpp | 34 +++++++++++++++---- .../variants/1_75mm_MK1-RAMBo10a-E3Dv6full.h | 3 -- .../variants/1_75mm_MK1-RAMBo13a-E3Dv6full.h | 3 -- ...5mm_MK2-MultiMaterial-RAMBo10a-E3Dv6full.h | 3 -- ...5mm_MK2-MultiMaterial-RAMBo13a-E3Dv6full.h | 3 -- .../variants/1_75mm_MK2-RAMBo10a-E3Dv6full.h | 3 -- .../variants/1_75mm_MK2-RAMBo13a-E3Dv6full.h | 3 -- 9 files changed, 40 insertions(+), 26 deletions(-) diff --git a/Firmware/Configuration.h b/Firmware/Configuration.h index 5a3abcd4c..ceb8ae89c 100644 --- a/Firmware/Configuration.h +++ b/Firmware/Configuration.h @@ -461,7 +461,13 @@ const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of // please keep turned on if you can. //#define EEPROM_CHITCHAT - +// Host Keepalive +// +// When enabled Marlin will send a busy status message to the host +// every couple of seconds when it can't accept commands. +// +#define HOST_KEEPALIVE_FEATURE // Disable this if your host doesn't like keepalive messages +#define HOST_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113. //LCD and SD support #define ULTRA_LCD //general LCD support, also 16x2 diff --git a/Firmware/Marlin.h b/Firmware/Marlin.h index a5c7ffa2a..1215bd468 100644 --- a/Firmware/Marlin.h +++ b/Firmware/Marlin.h @@ -108,6 +108,8 @@ FORCE_INLINE void serialprintPGM(const char *str) } } +#define NOMORE(v,n) do{ if (v > n) v = n; }while(0) + bool is_buffer_empty(); void get_command(); void process_commands(); @@ -280,6 +282,10 @@ extern float retract_length, retract_length_swap, retract_feedrate, retract_zlif extern float retract_recover_length, retract_recover_length_swap, retract_recover_feedrate; #endif +#ifdef HOST_KEEPALIVE_FEATURE +extern uint8_t host_keepalive_interval; +#endif + extern unsigned long starttime; extern unsigned long stoptime; extern int bowden_length[4]; diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 492defe70..a0ce4e307 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -151,6 +151,7 @@ // Rxxx Wait for extruder current temp to reach target temp. Waits when heating and cooling // IF AUTOTEMP is enabled, S B F. Exit autotemp by any M109 without F // M112 - Emergency stop +// M113 - Get or set the timeout interval for Host Keepalive "busy" messages // M114 - Output current position to serial port // M115 - Capabilities string // M117 - display message @@ -380,8 +381,8 @@ bool cancel_heatup = false ; }; static MarlinBusyState busy_state = NOT_BUSY; - static long next_busy_signal_ms = -1; - + static long prev_busy_signal_ms = -1; + uint8_t host_keepalive_interval = HOST_KEEPALIVE_INTERVAL; #define KEEPALIVE_STATE(n) do { busy_state = n; } while (0) #else #define host_keepalive(); @@ -1321,13 +1322,15 @@ int serial_read_stream() { } #ifdef HOST_KEEPALIVE_FEATURE +/** +* Output a "busy" message at regular intervals +* while the machine is not accepting commands. +*/ void host_keepalive() { long ms = millis(); - if (busy_state != NOT_BUSY) { - if (ms < next_busy_signal_ms) return; + if (host_keepalive_interval && busy_state != NOT_BUSY) { + if (ms - prev_busy_signal_ms < 1000UL * host_keepalive_interval) return; switch (busy_state) { - case NOT_BUSY: - break; case IN_HANDLER: case IN_PROCESS: SERIAL_ECHO_START; @@ -1343,7 +1346,7 @@ void host_keepalive() { break; } } - next_busy_signal_ms = ms + 2000UL; + prev_busy_signal_ms = ms; } #endif @@ -4215,6 +4218,7 @@ Sigma_Exit: }} #endif SERIAL_PROTOCOLLN(""); + KEEPALIVE_STATE(NOT_BUSY); return; break; case 109: @@ -4252,11 +4256,14 @@ Sigma_Exit: /* See if we are heating up or cooling down */ target_direction = isHeatingHotend(tmp_extruder); // true if heating, false if cooling + KEEPALIVE_STATE(NOT_BUSY); + cancel_heatup = false; wait_for_heater(codenum); //loops until target temperature is reached LCD_MESSAGERPGM(MSG_HEATING_COMPLETE); + KEEPALIVE_STATE(IN_HANDLER); heating_status = 2; if (farm_mode) { prusa_statistics(2); }; @@ -4284,6 +4291,7 @@ Sigma_Exit: cancel_heatup = false; target_direction = isHeatingBed(); // true if heating, false if cooling + KEEPALIVE_STATE(NOT_BUSY); while ( (target_direction)&&(!cancel_heatup) ? (isHeatingBed()) : (isCoolingBed()&&(CooldownNoWait==false)) ) { if(( millis() - codenum) > 1000 ) //Print Temp Reading every 1 second while heating up. @@ -4306,6 +4314,7 @@ Sigma_Exit: lcd_update(); } LCD_MESSAGERPGM(MSG_BED_DONE); + KEEPALIVE_STATE(IN_HANDLER); heating_status = 4; previous_millis_cmd = millis(); @@ -4449,6 +4458,17 @@ Sigma_Exit: else gcode_LastN = 0; break; +#ifdef HOST_KEEPALIVE_FEATURE + case 113: // M113 - Get or set Host Keepalive interval + if (code_seen('S')) { + host_keepalive_interval = (uint8_t)code_value_short(); + NOMORE(host_keepalive_interval, 60); + } else { + SERIAL_ECHO_START; + SERIAL_ECHOPAIR("M113 S", (unsigned long)host_keepalive_interval); + SERIAL_PROTOCOLLN(""); + } +#endif case 115: // M115 if (code_seen('V')) { // Report the Prusa version number. diff --git a/Firmware/variants/1_75mm_MK1-RAMBo10a-E3Dv6full.h b/Firmware/variants/1_75mm_MK1-RAMBo10a-E3Dv6full.h index 0dc72e79f..ba9f55289 100644 --- a/Firmware/variants/1_75mm_MK1-RAMBo10a-E3Dv6full.h +++ b/Firmware/variants/1_75mm_MK1-RAMBo10a-E3Dv6full.h @@ -186,9 +186,6 @@ ADDITIONAL FEATURES SETTINGS #define TEMP_RUNAWAY_EXTRUDER_HYSTERESIS 15 #define TEMP_RUNAWAY_EXTRUDER_TIMEOUT 45 -// USB host keep alive -#define HOST_KEEPALIVE_FEATURE - /*------------------------------------ MOTOR CURRENT SETTINGS *------------------------------------*/ diff --git a/Firmware/variants/1_75mm_MK1-RAMBo13a-E3Dv6full.h b/Firmware/variants/1_75mm_MK1-RAMBo13a-E3Dv6full.h index 634c578a3..1822a9d73 100644 --- a/Firmware/variants/1_75mm_MK1-RAMBo13a-E3Dv6full.h +++ b/Firmware/variants/1_75mm_MK1-RAMBo13a-E3Dv6full.h @@ -186,9 +186,6 @@ ADDITIONAL FEATURES SETTINGS #define TEMP_RUNAWAY_EXTRUDER_HYSTERESIS 15 #define TEMP_RUNAWAY_EXTRUDER_TIMEOUT 45 -// USB host keep alive -#define HOST_KEEPALIVE_FEATURE - /*------------------------------------ MOTOR CURRENT SETTINGS *------------------------------------*/ diff --git a/Firmware/variants/1_75mm_MK2-MultiMaterial-RAMBo10a-E3Dv6full.h b/Firmware/variants/1_75mm_MK2-MultiMaterial-RAMBo10a-E3Dv6full.h index eab7541a1..06a7410c3 100644 --- a/Firmware/variants/1_75mm_MK2-MultiMaterial-RAMBo10a-E3Dv6full.h +++ b/Firmware/variants/1_75mm_MK2-MultiMaterial-RAMBo10a-E3Dv6full.h @@ -181,9 +181,6 @@ ADDITIONAL FEATURES SETTINGS #define TEMP_RUNAWAY_EXTRUDER_HYSTERESIS 15 #define TEMP_RUNAWAY_EXTRUDER_TIMEOUT 45 -// USB host keep alive -#define HOST_KEEPALIVE_FEATURE - /*------------------------------------ MOTOR CURRENT SETTINGS *------------------------------------*/ diff --git a/Firmware/variants/1_75mm_MK2-MultiMaterial-RAMBo13a-E3Dv6full.h b/Firmware/variants/1_75mm_MK2-MultiMaterial-RAMBo13a-E3Dv6full.h index a39519bd2..a0afa5f7f 100644 --- a/Firmware/variants/1_75mm_MK2-MultiMaterial-RAMBo13a-E3Dv6full.h +++ b/Firmware/variants/1_75mm_MK2-MultiMaterial-RAMBo13a-E3Dv6full.h @@ -183,9 +183,6 @@ ADDITIONAL FEATURES SETTINGS #define TEMP_RUNAWAY_EXTRUDER_HYSTERESIS 15 #define TEMP_RUNAWAY_EXTRUDER_TIMEOUT 45 -// USB host keep alive -#define HOST_KEEPALIVE_FEATURE - /*------------------------------------ MOTOR CURRENT SETTINGS *------------------------------------*/ diff --git a/Firmware/variants/1_75mm_MK2-RAMBo10a-E3Dv6full.h b/Firmware/variants/1_75mm_MK2-RAMBo10a-E3Dv6full.h index a182f9fec..d7019845f 100644 --- a/Firmware/variants/1_75mm_MK2-RAMBo10a-E3Dv6full.h +++ b/Firmware/variants/1_75mm_MK2-RAMBo10a-E3Dv6full.h @@ -181,9 +181,6 @@ ADDITIONAL FEATURES SETTINGS #define TEMP_RUNAWAY_EXTRUDER_HYSTERESIS 15 #define TEMP_RUNAWAY_EXTRUDER_TIMEOUT 45 -// USB host keep alive -#define HOST_KEEPALIVE_FEATURE - /*------------------------------------ MOTOR CURRENT SETTINGS *------------------------------------*/ diff --git a/Firmware/variants/1_75mm_MK2-RAMBo13a-E3Dv6full.h b/Firmware/variants/1_75mm_MK2-RAMBo13a-E3Dv6full.h index ff37a14e8..720e74f5e 100644 --- a/Firmware/variants/1_75mm_MK2-RAMBo13a-E3Dv6full.h +++ b/Firmware/variants/1_75mm_MK2-RAMBo13a-E3Dv6full.h @@ -183,9 +183,6 @@ ADDITIONAL FEATURES SETTINGS #define TEMP_RUNAWAY_EXTRUDER_HYSTERESIS 15 #define TEMP_RUNAWAY_EXTRUDER_TIMEOUT 45 -// USB host keep alive -#define HOST_KEEPALIVE_FEATURE - /*------------------------------------ MOTOR CURRENT SETTINGS *------------------------------------*/ From 9e73c96223342ab235d77b73c3038cabd3ae0a34 Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Thu, 17 Aug 2017 19:07:38 +0200 Subject: [PATCH 03/37] Host keep alive messages --- Firmware/Configuration_adv.h | 2 +- Firmware/Marlin.h | 23 ++++++++++++++-- Firmware/Marlin_main.cpp | 52 ++++++++++++++++-------------------- Firmware/cardreader.cpp | 2 +- Firmware/temperature.cpp | 15 ++++++----- Firmware/ultralcd.cpp | 15 ++++++++--- 6 files changed, 66 insertions(+), 43 deletions(-) diff --git a/Firmware/Configuration_adv.h b/Firmware/Configuration_adv.h index 9112c2a50..455eb5c18 100644 --- a/Firmware/Configuration_adv.h +++ b/Firmware/Configuration_adv.h @@ -261,7 +261,7 @@ #define SD_SORT_ALPHA 1 #define SD_SORT_NONE 2 - #define SDSORT_LIMIT 40 // Maximum number of sorted items (10-256). + #define SDSORT_LIMIT 20 // Maximum number of sorted items (10-256). #define FOLDER_SORTING -1 // -1=above 0=none 1=below #define SDSORT_GCODE false // Allow turning sorting on/off with LCD and M34 g-code. #define SDSORT_USES_RAM true // Pre-allocate a static array for faster pre-sorting. diff --git a/Firmware/Marlin.h b/Firmware/Marlin.h index 20b9aac65..856e9a914 100644 --- a/Firmware/Marlin.h +++ b/Firmware/Marlin.h @@ -318,8 +318,6 @@ extern void digipot_i2c_set_current( int channel, float current ); extern void digipot_i2c_init(); #endif -#endif - //Long pause extern int saved_feedmultiply; extern float HotendTempBckp; @@ -352,8 +350,29 @@ float d_ReadData(); void bed_analysis(float x_dimension, float y_dimension, int x_points_num, int y_points_num, float shift_x, float shift_y); #endif + float temp_comp_interpolation(float temperature); void temp_compensation_apply(); void temp_compensation_start(); void wait_for_heater(long codenum); void serialecho_temperatures(); + +#ifdef HOST_KEEPALIVE_FEATURE + +// States for managing Marlin and host communication +// Marlin sends messages if blocked or busy +enum MarlinBusyState { + NOT_BUSY, // Not in a handler + IN_HANDLER, // Processing a GCode + IN_PROCESS, // Known to be blocking command input (as in G29) + PAUSED_FOR_USER, // Blocking pending any input + PAUSED_FOR_INPUT // Blocking pending text input (concept) +}; + +#define KEEPALIVE_STATE(n) do { busy_state = n;} while (0) +extern void host_keepalive(); +extern MarlinBusyState busy_state; + +#endif //HOST_KEEPALIVE_FEATURE + +#endif //ifndef marlin.h diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index c045eb9f5..405ff3b6d 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -372,20 +372,10 @@ int fanSpeed=0; bool cancel_heatup = false ; #ifdef HOST_KEEPALIVE_FEATURE - // States for managing Marlin and host communication - // Marlin sends messages if blocked or busy - enum MarlinBusyState { - NOT_BUSY, // Not in a handler - IN_HANDLER, // Processing a GCode - IN_PROCESS, // Known to be blocking command input (as in G29) - PAUSED_FOR_USER, // Blocking pending any input - PAUSED_FOR_INPUT // Blocking pending text input (concept) - }; - - static MarlinBusyState busy_state = NOT_BUSY; + + MarlinBusyState busy_state = NOT_BUSY; static long prev_busy_signal_ms = -1; uint8_t host_keepalive_interval = HOST_KEEPALIVE_INTERVAL; - #define KEEPALIVE_STATE(n) do { busy_state = n; } while (0) #else #define host_keepalive(); #define KEEPALIVE_STATE(n); @@ -1099,6 +1089,7 @@ void setup() world2machine_reset(); lcd_init(); + KEEPALIVE_STATE(PAUSED_FOR_USER); if (!READ(BTN_ENC)) { _delay_ms(1000); @@ -1120,7 +1111,7 @@ void setup() _delay_ms(2000); - + char level = reset_menu(); factory_reset(level, false); @@ -1266,6 +1257,7 @@ void setup() // Store the currently running firmware into an eeprom, // so the next time the firmware gets updated, it will know from which version it has been updated. update_current_firmware_version_to_eeprom(); + KEEPALIVE_STATE(NOT_BUSY); } void trace(); @@ -1351,7 +1343,7 @@ void host_keepalive() { long ms = millis(); if (host_keepalive_interval && busy_state != NOT_BUSY) { if (ms - prev_busy_signal_ms < 1000UL * host_keepalive_interval) return; - switch (busy_state) { + switch (busy_state) { case IN_HANDLER: case IN_PROCESS: SERIAL_ECHO_START; @@ -1432,7 +1424,6 @@ void loop() manage_heater(); isPrintPaused ? manage_inactivity(true) : manage_inactivity(false); checkHitEndstops(); - host_keepalive(); lcd_update(); } @@ -2460,7 +2451,7 @@ void process_commands() prepare_arc_move(false); } break; - case 4: // G4 dwell + case 4: // G4 dwell codenum = 0; if(code_seen('P')) codenum = code_value(); // milliseconds to wait if(code_seen('S')) codenum = code_value() * 1000; // seconds to wait @@ -2493,10 +2484,7 @@ void process_commands() #endif //FWRETRACT case 28: //G28 Home all Axis one at a time homing_flag = true; - - KEEPALIVE_STATE(IN_HANDLER); - -#ifdef ENABLE_AUTO_BED_LEVELING + #ifdef ENABLE_AUTO_BED_LEVELING plan_bed_level_matrix.set_to_identity(); //Reset the plane ("erase" all leveling data) #endif //ENABLE_AUTO_BED_LEVELING @@ -2943,6 +2931,7 @@ void process_commands() enquecommand_front_P((PSTR("G28 W0"))); break; } + KEEPALIVE_STATE(NOT_BUSY); //no need to print busy messages as we print current temperatures periodicaly SERIAL_ECHOLNPGM("PINDA probe calibration start"); custom_message = true; custom_message_type = 4; @@ -3540,9 +3529,9 @@ void process_commands() while (*src == ' ') ++src; if (!hasP && !hasS && *src != '\0') { lcd_setstatus(src); - } else { - LCD_MESSAGERPGM(MSG_USERWAIT); - } + } else { + LCD_MESSAGERPGM(MSG_USERWAIT); + } lcd_ignore_click(); //call lcd_ignore_click aslo for else ??? st_synchronize(); @@ -3754,7 +3743,6 @@ void process_commands() { // Only Z calibration? bool onlyZ = code_seen('Z'); - if (!onlyZ) { setTargetBed(0); setTargetHotend(0, 0); @@ -3777,7 +3765,9 @@ void process_commands() memset(axis_known_position, 0, sizeof(axis_known_position)); // Let the user move the Z axes up to the end stoppers. + KEEPALIVE_STATE(PAUSED_FOR_USER); if (lcd_calibrate_z_end_stop_manual( onlyZ )) { + KEEPALIVE_STATE(IN_HANDLER); refresh_cmd_timeout(); if (((degHotend(0) > MAX_HOTEND_TEMP_CALIBRATION) || (degBed() > MAX_BED_TEMP_CALIBRATION)) && (!onlyZ)) { lcd_wait_for_cool_down(); @@ -3857,6 +3847,7 @@ void process_commands() } } else { // Timeouted. + KEEPALIVE_STATE(IN_HANDLER); } lcd_update_enable(true); break; @@ -3887,8 +3878,10 @@ void process_commands() case 47: // M47: Prusa3D: Show end stops dialog on the display. + KEEPALIVE_STATE(PAUSED_FOR_USER); lcd_diag_show_end_stops(); - break; + KEEPALIVE_STATE(IN_HANDLER); + break; #if 0 case 48: // M48: scan the bed induction sensor points, print the sensor trigger coordinates to the serial line for visualization on the PC. @@ -5070,8 +5063,7 @@ Sigma_Exit: if (code_seen('S')) temp=code_value(); if (code_seen('C')) c=code_value(); - KEEPALIVE_STATE(NOT_BUSY); - PID_autotune(temp, e, c); + PID_autotune(temp, e, c); } break; case 400: // M400 finish all moves @@ -5433,7 +5425,9 @@ case 404: //M404 Enter the nominal filament width (3mm, 1.75mm ) N<3.0> or disp lcd_loading_filament(); while ((lcd_change_fil_state == 0)||(lcd_change_fil_state != 1)){ lcd_change_fil_state = 0; + KEEPALIVE_STATE(PAUSED_FOR_USER); lcd_alright(); + KEEPALIVE_STATE(IN_HANDLER); switch(lcd_change_fil_state){ // Filament failed to load so load it again @@ -6095,7 +6089,7 @@ void manage_inactivity(bool ignore_stepper_queue/*=false*/) //default argument s static int killCount = 0; // make the inactivity button a bit less responsive const int KILL_DELAY = 10000; #endif - + if(buflen < (BUFSIZE-1)){ get_command(); } @@ -6371,7 +6365,7 @@ void calculate_volumetric_multipliers() { void delay_keep_alive(unsigned int ms) { - for (;;) { + for (;;) { manage_heater(); // Manage inactivity, but don't disable steppers on timeout. manage_inactivity(true); diff --git a/Firmware/cardreader.cpp b/Firmware/cardreader.cpp index 51c02d7d9..aa1b489fb 100644 --- a/Firmware/cardreader.cpp +++ b/Firmware/cardreader.cpp @@ -705,7 +705,7 @@ void CardReader::getfilename_sorted(const uint16_t nr) { * - Most RAM: Buffer the directory and return filenames from RAM */ void CardReader::presort() { - + uint8_t sdSort = eeprom_read_byte((uint8_t*)EEPROM_SD_SORT); if (sdSort == SD_SORT_NONE) return; //sd sort is turned off diff --git a/Firmware/temperature.cpp b/Firmware/temperature.cpp index 36ee56001..2d9c815e7 100644 --- a/Firmware/temperature.cpp +++ b/Firmware/temperature.cpp @@ -220,7 +220,7 @@ unsigned long watchmillis[EXTRUDERS] = ARRAY_BY_EXTRUDERS(0,0,0); pid_cycle = 0; return; } - + SERIAL_ECHOLN("PID Autotune start"); disable_heater(); // switch off all heaters. @@ -336,13 +336,13 @@ unsigned long watchmillis[EXTRUDERS] = ARRAY_BY_EXTRUDERS(0,0,0); p=soft_pwm_bed; SERIAL_PROTOCOLPGM("ok B:"); }else{ - p=soft_pwm[extruder]; - SERIAL_PROTOCOLPGM("ok T:"); + p=soft_pwm[extruder]; + SERIAL_PROTOCOLPGM("ok T:"); } - - SERIAL_PROTOCOL(input); - SERIAL_PROTOCOLPGM(" @:"); - SERIAL_PROTOCOLLN(p); + + SERIAL_PROTOCOL(input); + SERIAL_PROTOCOLPGM(" @:"); + SERIAL_PROTOCOLLN(p); temp_millis = millis(); } @@ -686,6 +686,7 @@ void manage_heater() volumetric_multiplier[FILAMENT_SENSOR_EXTRUDER_NUM]=0.01; } #endif + host_keepalive(); } #define PGM_RD_W(x) (short)pgm_read_word(&x) diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 40e036741..5e1ffa589 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -1283,13 +1283,14 @@ void lcd_menu_statistics() lcd.print(itostr3(_days)); - + KEEPALIVE_STATE(PAUSED_FOR_USER); while (!lcd_clicked()) { manage_heater(); manage_inactivity(true); delay(100); } + KEEPALIVE_STATE(NOT_BUSY); lcd_quick_feedback(); lcd_return_to_status(); @@ -1367,6 +1368,7 @@ void lcd_service_mode_show_result() { } else lcd_print_at_PGM(11, i + 1, PSTR("N/A")); } delay_keep_alive(500); + KEEPALIVE_STATE(PAUSED_FOR_USER); while (!lcd_clicked()) { delay_keep_alive(100); } @@ -1393,6 +1395,7 @@ void lcd_service_mode_show_result() { while (!lcd_clicked()) { delay_keep_alive(100); } + KEEPALIVE_STATE(NOT_BUSY); delay_keep_alive(500); lcd_set_custom_characters_arrows(); lcd_return_to_status(); @@ -1865,6 +1868,7 @@ void lcd_show_fullscreen_message_and_wait_P(const char *msg) const char *msg_next = lcd_display_message_fullscreen_P(msg); bool multi_screen = msg_next != NULL; + KEEPALIVE_STATE(PAUSED_FOR_USER); // Until confirmed by a button click. for (;;) { // Wait for 5 seconds before displaying the next text. @@ -1874,6 +1878,7 @@ void lcd_show_fullscreen_message_and_wait_P(const char *msg) while (lcd_clicked()) ; delay(10); while (lcd_clicked()) ; + KEEPALIVE_STATE(IN_HANDLER); return; } } @@ -1887,6 +1892,7 @@ void lcd_show_fullscreen_message_and_wait_P(const char *msg) void lcd_wait_for_click() { + KEEPALIVE_STATE(PAUSED_FOR_USER); for (;;) { manage_heater(); manage_inactivity(true); @@ -1894,6 +1900,7 @@ void lcd_wait_for_click() while (lcd_clicked()) ; delay(10); while (lcd_clicked()) ; + KEEPALIVE_STATE(IN_HANDLER); return; } } @@ -1901,7 +1908,6 @@ void lcd_wait_for_click() int8_t lcd_show_fullscreen_message_yes_no_and_wait_P(const char *msg, bool allow_timeouting, bool default_yes) { - lcd_display_message_fullscreen_P(msg); if (default_yes) { @@ -1923,6 +1929,7 @@ int8_t lcd_show_fullscreen_message_yes_no_and_wait_P(const char *msg, bool allow // Wait for user confirmation or a timeout. unsigned long previous_millis_cmd = millis(); int8_t enc_dif = encoderDiff; + KEEPALIVE_STATE(PAUSED_FOR_USER); for (;;) { if (allow_timeouting && millis() - previous_millis_cmd > LCD_TIMEOUT_TO_STATUS) return -1; @@ -1948,6 +1955,7 @@ int8_t lcd_show_fullscreen_message_yes_no_and_wait_P(const char *msg, bool allow while (lcd_clicked()); delay(10); while (lcd_clicked()); + KEEPALIVE_STATE(IN_HANDLER); return yes; } } @@ -4800,6 +4808,7 @@ static bool lcd_selftest_fan_dialog(int _fan) lcd.setCursor(1, 3); lcd_printPGM(MSG_SELFTEST_FAN_NO); int8_t enc_dif = 0; + KEEPALIVE_STATE(PAUSED_FOR_USER); do { switch (_fan) @@ -4840,7 +4849,7 @@ static bool lcd_selftest_fan_dialog(int _fan) delay(100); } while (!lcd_clicked()); - + KEEPALIVE_STATE(IN_HANDLER); SET_OUTPUT(EXTRUDER_0_AUTO_FAN_PIN); WRITE(EXTRUDER_0_AUTO_FAN_PIN, 0); SET_OUTPUT(FAN_PIN); From faeafa1100d86e03df02fd12e8cb6b58cb2074e2 Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Mon, 28 Aug 2017 14:52:15 +0200 Subject: [PATCH 04/37] host keep alive multi material messages, load filament for multi material --- Firmware/Marlin_main.cpp | 9 ++++++++- Firmware/ultralcd.cpp | 15 ++++++++------- Firmware/ultralcd.h | 2 +- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 405ff3b6d..d9115b6f8 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -3332,6 +3332,7 @@ void process_commands() current_position[E_AXIS] += DEFAULT_RETRACTION; plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 400, active_extruder); } + KEEPALIVE_STATE(NOT_BUSY); // Restore custom message state custom_message = custom_message_old; custom_message_type = custom_message_type_old; @@ -5381,11 +5382,13 @@ case 404: //M404 Enter the nominal filament width (3mm, 1.75mm ) N<3.0> or disp WRITE(BEEPER, LOW); #ifdef SNMM display_loading(); + KEEPALIVE_STATE(PAUSED_FOR_USER); do { target[E_AXIS] += 0.002; plan_buffer_line(target[X_AXIS], target[Y_AXIS], target[Z_AXIS], target[E_AXIS], 500, active_extruder); delay_keep_alive(2); - } while (!lcd_clicked()); + } while (!lcd_clicked()); + KEEPALIVE_STATE(IN_HANDLER); /*if (millis() - load_filament_time > 2) { load_filament_time = millis(); target[E_AXIS] += 0.001; @@ -5600,6 +5603,9 @@ case 404: //M404 Enter the nominal filament width (3mm, 1.75mm ) N<3.0> or disp break; case 701: //M701: load filament { +#ifdef SNMM + extr_adj(snmm_extruder);//loads current extruder +#else enable_z(); custom_message = true; custom_message_type = 2; @@ -5631,6 +5637,7 @@ case 404: //M404 Enter the nominal filament width (3mm, 1.75mm ) N<3.0> or disp loading_flag = false; custom_message = false; custom_message_type = 0; +#endif } break; case 702: diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 5e1ffa589..1b240c90f 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -3009,7 +3009,7 @@ static char snmm_stop_print_menu() { //menu for choosing which filaments will be lcd_print_at_PGM(1,3,MSG_CURRENT); char cursor_pos = 1; int enc_dif = 0; - + KEEPALIVE_STATE(PAUSED_FOR_USER); while (1) { manage_heater(); manage_inactivity(true); @@ -3037,10 +3037,10 @@ static char snmm_stop_print_menu() { //menu for choosing which filaments will be while (lcd_clicked()); delay(10); while (lcd_clicked()); + KEEPALIVE_STATE(IN_HANDLER); return(cursor_pos - 1); } - } - + } } char choose_extruder_menu() { @@ -3059,7 +3059,7 @@ char choose_extruder_menu() { for (int i = 0; i < 3; i++) { lcd_print_at_PGM(1, i + 1, MSG_EXTRUDER); } - + KEEPALIVE_STATE(PAUSED_FOR_USER); while (1) { for (int i = 0; i < 3; i++) { @@ -3123,6 +3123,7 @@ char choose_extruder_menu() { while (lcd_clicked()); delay(10); while (lcd_clicked()); + KEEPALIVE_STATE(IN_HANDLER); return(cursor_pos + first - 1); } @@ -3317,7 +3318,7 @@ void display_loading() { } } -static void extr_adj(int extruder) //loading filament for SNMM +void extr_adj(int extruder) //loading filament for SNMM { bool correct; max_feedrate[E_AXIS] =80; @@ -3331,13 +3332,13 @@ static void extr_adj(int extruder) //loading filament for SNMM case 3: lcd_display_message_fullscreen_P(MSG_FILAMENT_LOADING_T3); break; default: lcd_display_message_fullscreen_P(MSG_FILAMENT_LOADING_T0); break; } - + KEEPALIVE_STATE(PAUSED_FOR_USER); do{ extr_mov(0.001,1000); delay_keep_alive(2); } while (!lcd_clicked()); //delay_keep_alive(500); - + KEEPALIVE_STATE(IN_HANDLER); st_synchronize(); //correct = lcd_show_fullscreen_message_yes_no_and_wait_P(MSG_FIL_LOADED_CHECK, false); //if (!correct) goto START; diff --git a/Firmware/ultralcd.h b/Firmware/ultralcd.h index 99b3c4485..a89c370fb 100644 --- a/Firmware/ultralcd.h +++ b/Firmware/ultralcd.h @@ -211,7 +211,7 @@ extern void lcd_implementation_print_at(uint8_t x, uint8_t y, const char *str); void change_extr(int extr); static void lcd_colorprint_change(); static int get_ext_nr(); -static void extr_adj(int extruder); +void extr_adj(int extruder); static void extr_adj_0(); static void extr_adj_1(); static void extr_adj_2(); From 71b313cf269d744fb2e83551dd44a2f5fa52de9e Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Wed, 30 Aug 2017 16:18:43 +0200 Subject: [PATCH 05/37] timer reset after processing current command --- Firmware/Marlin_main.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index d9115b6f8..a76d5b54e 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -1418,6 +1418,7 @@ void loop() if (! cmdbuffer_front_already_processed) cmdqueue_pop_front(); cmdbuffer_front_already_processed = false; + host_keepalive(); } } //check heater every n milliseconds From 0f4e08d51df4d45744bb82f45f0ff8f34de92e8d Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Wed, 30 Aug 2017 17:19:34 +0200 Subject: [PATCH 06/37] M113 updated --- Firmware/Marlin_main.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index a76d5b54e..1b0d04eb6 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -4516,6 +4516,7 @@ Sigma_Exit: SERIAL_ECHOPAIR("M113 S", (unsigned long)host_keepalive_interval); SERIAL_PROTOCOLLN(""); } + break; #endif case 115: // M115 if (code_seen('V')) { From aa2dc723a1af905036642496fb2ad1f98dd059b2 Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Fri, 1 Sep 2017 14:23:04 +0200 Subject: [PATCH 07/37] fixed serial communication on PORT1, reduced "enqueing command" messages on serial in farm mode --- Firmware/Configuration.h | 2 +- Firmware/MarlinSerial.h | 22 +++++++++++++++------- Firmware/Marlin_main.cpp | 20 ++++++++++++-------- 3 files changed, 28 insertions(+), 16 deletions(-) diff --git a/Firmware/Configuration.h b/Firmware/Configuration.h index 1ea4091d0..f8f163f07 100644 --- a/Firmware/Configuration.h +++ b/Firmware/Configuration.h @@ -5,7 +5,7 @@ #include "Configuration_prusa.h" // Firmware version -#define FW_version "3.0.12-3" +#define FW_version "3.0.12-4" #define FW_PRUSA3D_MAGIC "PRUSA3DFW" #define FW_PRUSA3D_MAGIC_LEN 10 diff --git a/Firmware/MarlinSerial.h b/Firmware/MarlinSerial.h index 30f5b83db..15ed3dc81 100644 --- a/Firmware/MarlinSerial.h +++ b/Firmware/MarlinSerial.h @@ -101,14 +101,22 @@ class MarlinSerial //: public Stream { return (unsigned int)(RX_BUFFER_SIZE + rx_buffer.head - rx_buffer.tail) % RX_BUFFER_SIZE; } - - FORCE_INLINE void write(uint8_t c) - { - while (!((M_UCSRxA) & (1 << M_UDREx))) - ; - M_UDRx = c; - } + void write(uint8_t c) + { + if (selectedSerialPort == 0) { + while (!((M_UCSRxA) & (1 << M_UDREx))) + ; + + M_UDRx = c; + } + else if (selectedSerialPort == 1) { + while (!((UCSR2A) & (1 << UDRE2))) + ; + + UDR2 = c; + } + } void checkRx(void) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index b1f2a5f55..13f81aba1 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -761,10 +761,12 @@ void enquecommand(const char *cmd, bool from_progmem) strcpy_P(cmdbuffer + bufindw + 1, cmd); else strcpy(cmdbuffer + bufindw + 1, cmd); - SERIAL_ECHO_START; - SERIAL_ECHORPGM(MSG_Enqueing); - SERIAL_ECHO(cmdbuffer + bufindw + 1); - SERIAL_ECHOLNPGM("\""); + if (!farm_mode) { + SERIAL_ECHO_START; + SERIAL_ECHORPGM(MSG_Enqueing); + SERIAL_ECHO(cmdbuffer + bufindw + 1); + SERIAL_ECHOLNPGM("\""); + } bufindw += len + 2; if (bufindw == sizeof(cmdbuffer)) bufindw = 0; @@ -797,10 +799,12 @@ void enquecommand_front(const char *cmd, bool from_progmem) else strcpy(cmdbuffer + bufindr + 1, cmd); ++ buflen; - SERIAL_ECHO_START; - SERIAL_ECHOPGM("Enqueing to the front: \""); - SERIAL_ECHO(cmdbuffer + bufindr + 1); - SERIAL_ECHOLNPGM("\""); + if (!farm_mode) { + SERIAL_ECHO_START; + SERIAL_ECHOPGM("Enqueing to the front: \""); + SERIAL_ECHO(cmdbuffer + bufindr + 1); + SERIAL_ECHOLNPGM("\""); + } #ifdef CMDBUFFER_DEBUG cmdqueue_dump_to_serial(); #endif /* CMDBUFFER_DEBUG */ From 1ed4dcfca13c463323e85e7643a8544d1b5511af Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Mon, 4 Sep 2017 14:41:31 +0200 Subject: [PATCH 08/37] removed duplicit code in setup function, G98 stores farm number to eeprom, shipping prep: fixed typo --- Firmware/Marlin_main.cpp | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 3902c10a5..2fa709945 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -963,7 +963,7 @@ void factory_reset(char level, bool quiet) // Force the "Follow calibration flow" message at the next boot up. calibration_status_store(CALIBRATION_STATUS_Z_CALIBRATION); farm_no = 0; - farm_mode == false; + farm_mode = false; eeprom_update_byte((uint8_t*)EEPROM_FARM_MODE, farm_mode); EEPROM_save_B(EEPROM_FARM_NUMBER, &farm_no); @@ -1026,7 +1026,7 @@ void setup() setup_powerhold(); farm_mode = eeprom_read_byte((uint8_t*)EEPROM_FARM_MODE); EEPROM_read_B(EEPROM_FARM_NUMBER, &farm_no); - //if ((farm_mode == 0xFF && farm_no == 0) || (farm_no == 0xFFFF)) farm_mode = false; //if farm_mode has not been stored to eeprom yet and farm number is set to zero or EEPROM is fresh, deactivate farm mode + if ((farm_mode == 0xFF && farm_no == 0) || (farm_no == 0xFFFF)) farm_mode = false; //if farm_mode has not been stored to eeprom yet and farm number is set to zero or EEPROM is fresh, deactivate farm mode if (farm_no == 0xFFFF) farm_no = 0; if (farm_mode) { @@ -1041,6 +1041,7 @@ void setup() SERIAL_PROTOCOLLNPGM("start"); SERIAL_ECHO_START; + #if 0 SERIAL_ECHOLN("Reading eeprom from 0 to 100: start"); for (int i = 0; i < 4096; ++i) { @@ -1184,17 +1185,7 @@ void setup() #if defined(Z_AXIS_ALWAYS_ON) enable_z(); #endif - farm_mode = eeprom_read_byte((uint8_t*)EEPROM_FARM_MODE); - EEPROM_read_B(EEPROM_FARM_NUMBER, &farm_no); - if ((farm_mode == 0xFF && farm_no == 0) || (farm_no == 0xFFFF)) farm_mode = false; //if farm_mode has not been stored to eeprom yet and farm number is set to zero or EEPROM is fresh, deactivate farm mode - if (farm_no == 0xFFFF) farm_no = 0; - if (farm_mode) - { - prusa_statistics(8); - no_response = true; //we need confirmation by recieving PRUSA thx - important_status = 8; - } - + // Enable Toshiba FlashAir SD card / WiFi enahanced card. card.ToshibaFlashAir_enable(eeprom_read_byte((unsigned char*)EEPROM_TOSHIBA_FLASH_AIR_COMPATIBLITY) == 1); // Force SD card update. Otherwise the SD card update is done from loop() on card.checkautostart(false), @@ -1354,6 +1345,7 @@ int serial_read_stream() { * while the machine is not accepting commands. */ void host_keepalive() { + if (farm_mode) return; long ms = millis(); if (host_keepalive_interval && busy_state != NOT_BUSY) { if (ms - prev_busy_signal_ms < 1000UL * host_keepalive_interval) return; @@ -3512,7 +3504,9 @@ void process_commands() case 98: //activate farm mode farm_mode = 1; PingTime = millis(); + EEPROM_save_B(EEPROM_FARM_NUMBER, &farm_no); eeprom_update_byte((unsigned char *)EEPROM_FARM_MODE, farm_mode); + break; case 99: //deactivate farm mode From 1f2f0ab35cdc3d2823849aa27774211e979e9fe8 Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Mon, 4 Sep 2017 14:43:06 +0200 Subject: [PATCH 09/37] changed version --- Firmware/Configuration.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Firmware/Configuration.h b/Firmware/Configuration.h index 9cda0ae16..cac5271b4 100644 --- a/Firmware/Configuration.h +++ b/Firmware/Configuration.h @@ -5,7 +5,7 @@ #include "Configuration_prusa.h" // Firmware version -#define FW_version "3.0.12-4" +#define FW_version "3.0.12-5" #define FW_PRUSA3D_MAGIC "PRUSA3DFW" #define FW_PRUSA3D_MAGIC_LEN 10 From a056d11af0b88abb401c4bac75a5623f0146bc60 Mon Sep 17 00:00:00 2001 From: Andre Sklenar Date: Tue, 5 Sep 2017 11:10:08 +0200 Subject: [PATCH 10/37] Don't use the serial number when multimaterial --- Firmware/MarlinSerial.cpp | 12 ++++++++---- Firmware/MarlinSerial.h | 31 +++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 4 deletions(-) diff --git a/Firmware/MarlinSerial.cpp b/Firmware/MarlinSerial.cpp index c07ec458a..8baab6dd3 100644 --- a/Firmware/MarlinSerial.cpp +++ b/Firmware/MarlinSerial.cpp @@ -64,7 +64,7 @@ FORCE_INLINE void store_char(unsigned char c) store_char(c); } } - +#ifndef SNMM SIGNAL(USART2_RX_vect) { if (selectedSerialPort == 1) { @@ -82,6 +82,7 @@ FORCE_INLINE void store_char(unsigned char c) } } #endif +#endif // Constructors //////////////////////////////////////////////////////////////// @@ -122,7 +123,7 @@ void MarlinSerial::begin(long baud) sbi(M_UCSRxB, M_TXENx); sbi(M_UCSRxB, M_RXCIEx); - +#ifndef SNMM // set up the second serial port if (useU2X) { UCSR2A = 1 << U2X2; @@ -139,6 +140,7 @@ void MarlinSerial::begin(long baud) sbi(UCSR2B, RXEN2); sbi(UCSR2B, TXEN2); sbi(UCSR2B, RXCIE2); +#endif } void MarlinSerial::end() @@ -146,10 +148,12 @@ void MarlinSerial::end() cbi(M_UCSRxB, M_RXENx); cbi(M_UCSRxB, M_TXENx); cbi(M_UCSRxB, M_RXCIEx); - + +#ifndef SNMM cbi(UCSR2B, RXEN2); cbi(UCSR2B, TXEN2); - cbi(UCSR2B, RXCIE2); + cbi(UCSR2B, RXCIE2); +#endif } diff --git a/Firmware/MarlinSerial.h b/Firmware/MarlinSerial.h index 15ed3dc81..f7d333a19 100644 --- a/Firmware/MarlinSerial.h +++ b/Firmware/MarlinSerial.h @@ -104,6 +104,12 @@ class MarlinSerial //: public Stream void write(uint8_t c) { +#ifdef SNMM // don't do the second serial port when multimaterialing + while (!((M_UCSRxA) & (1 << M_UDREx))) + ; + + M_UDRx = c; +#else if (selectedSerialPort == 0) { while (!((M_UCSRxA) & (1 << M_UDREx))) ; @@ -116,11 +122,35 @@ class MarlinSerial //: public Stream UDR2 = c; } +#endif } void checkRx(void) { + +#ifdef SNMM + if((M_UCSRxA & (1< Date: Tue, 5 Sep 2017 11:19:10 +0200 Subject: [PATCH 11/37] added messages --- Firmware/language_en.h | 5 ++++- Firmware/ultralcd.cpp | 2 ++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/Firmware/language_en.h b/Firmware/language_en.h index 4e5e7b195..1afea9f31 100644 --- a/Firmware/language_en.h +++ b/Firmware/language_en.h @@ -315,4 +315,7 @@ #define(length=17, lines=1) MSG_SORT_TIME "Sort: [Time]" #define(length=17, lines=1) MSG_SORT_ALPHA "Sort: [Alphabet]" #define(length=17, lines=1) MSG_SORT_NONE "Sort: [None]" -#define(length=20, lines=1) MSG_SORTING "Sorting files" \ No newline at end of file +#define(length=20, lines=1) MSG_SORTING "Sorting files" +#define(length=17, lines=1) MSG_WIZARD "Wizard" +#define MSG_WIZARD_LANGUAGE "Please choose your language" +#define MSG_WIZARD_WELCOME "Hi, I’m your new Original Prusa i3 printer. Would you like me to guide you through the setup process?" \ No newline at end of file diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 5e5ffc2b2..ba1a6a165 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -2659,6 +2659,8 @@ static void lcd_settings_menu() MENU_ITEM(function, PSTR("Disable farm mode"), lcd_disable_farm_mode); } + MENU_ITEM(function, MSG_WIZARD, lcd_wizard); + END_MENU(); } From e52e8e21b1ed5ca3c34d4813657ec6424c4f72bb Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Thu, 7 Sep 2017 20:06:23 +0200 Subject: [PATCH 12/37] initial version of wizard --- Firmware/Configuration.h | 5 +- Firmware/Configuration_adv.h | 2 +- Firmware/Marlin.h | 5 + Firmware/Marlin_main.cpp | 375 +++++++++++++++++++---------------- Firmware/language_all.cpp | 85 ++++++++ Firmware/language_all.h | 34 ++++ Firmware/language_en.h | 18 +- Firmware/ultralcd.cpp | 364 +++++++++++++++++++++++++++++++++- Firmware/ultralcd.h | 10 +- 9 files changed, 714 insertions(+), 184 deletions(-) diff --git a/Firmware/Configuration.h b/Firmware/Configuration.h index cac5271b4..2402f9070 100644 --- a/Firmware/Configuration.h +++ b/Firmware/Configuration.h @@ -5,7 +5,7 @@ #include "Configuration_prusa.h" // Firmware version -#define FW_version "3.0.12-5" +#define FW_version "3.0.12-6" #define FW_PRUSA3D_MAGIC "PRUSA3DFW" #define FW_PRUSA3D_MAGIC_LEN 10 @@ -49,6 +49,7 @@ #define EEPROM_CALIBRATION_STATUS_PINDA (EEPROM_BOWDEN_LENGTH - 1) //0 - not calibrated; 1 - calibrated #define EEPROM_SD_SORT (EEPROM_CALIBRATION_STATUS_PINDA - 1) //0 -time, 1-alpha, 2-none #define EEPROM_XYZ_CAL_SKEW (EEPROM_SD_SORT - 4) +#define EEPROM_WIZARD_ACTIVE (EEPROM_XYZ_CAL_SKEW - 1) // Currently running firmware, each digit stored as uint16_t. // The flavor differentiates a dev, alpha, beta, release candidate or a release version. @@ -722,7 +723,7 @@ enum CalibrationStatus CALIBRATION_STATUS_ASSEMBLED = 255, // For the wizard: self test has been performed, now the XYZ calibration is needed. - // CALIBRATION_STATUS_XYZ_CALIBRATION = 250, + CALIBRATION_STATUS_XYZ_CALIBRATION = 250, // For the wizard: factory assembled, needs to run Z calibration. CALIBRATION_STATUS_Z_CALIBRATION = 240, diff --git a/Firmware/Configuration_adv.h b/Firmware/Configuration_adv.h index 455eb5c18..4f3a71c49 100644 --- a/Firmware/Configuration_adv.h +++ b/Firmware/Configuration_adv.h @@ -323,7 +323,7 @@ * K=0 means advance disabled. * See Marlin documentation for calibration instructions. */ -//#define LIN_ADVANCE +#define LIN_ADVANCE #ifdef LIN_ADVANCE #define LIN_ADVANCE_K 0 //Try around 45 for PLA, around 25 for ABS. diff --git a/Firmware/Marlin.h b/Firmware/Marlin.h index bceec18ac..24cce19bd 100644 --- a/Firmware/Marlin.h +++ b/Firmware/Marlin.h @@ -222,6 +222,7 @@ void enquecommand(const char *cmd, bool from_progmem = false); //put an ASCII command at the end of the current buffer, read from flash #define enquecommand_P(cmd) enquecommand(cmd, true) void enquecommand_front(const char *cmd, bool from_progmem = false); +bool cmd_buffer_empty(); //put an ASCII command at the end of the current buffer, read from flash #define enquecommand_P(cmd) enquecommand(cmd, true) #define enquecommand_front_P(cmd) enquecommand_front(cmd, true) @@ -380,4 +381,8 @@ extern MarlinBusyState busy_state; #endif //HOST_KEEPALIVE_FEATURE +bool gcode_M45(bool onlyZ); +void gcode_M701(); + + #endif //ifndef marlin.h diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 2fa709945..66a53dd79 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -799,6 +799,11 @@ void enquecommand(const char *cmd, bool from_progmem) } } +bool cmd_buffer_empty() +{ + return (buflen == 0); +} + void enquecommand_front(const char *cmd, bool from_progmem) { int len = from_progmem ? strlen_P(cmd) : strlen(cmd); @@ -1231,30 +1236,39 @@ void setup() #ifndef DEBUG_DISABLE_STARTMSGS check_babystep(); //checking if Z babystep is in allowed range - - if (calibration_status() == CALIBRATION_STATUS_ASSEMBLED || - calibration_status() == CALIBRATION_STATUS_UNKNOWN) { - // Reset the babystepping values, so the printer will not move the Z axis up when the babystepping is enabled. - eeprom_update_word((uint16_t*)EEPROM_BABYSTEP_Z, 0); - // Show the message. - lcd_show_fullscreen_message_and_wait_P(MSG_FOLLOW_CALIBRATION_FLOW); - } else if (calibration_status() == CALIBRATION_STATUS_LIVE_ADJUST) { - // Show the message. - lcd_show_fullscreen_message_and_wait_P(MSG_BABYSTEP_Z_NOT_SET); - lcd_update_enable(true); - } else if (calibration_status() == CALIBRATION_STATUS_CALIBRATED && temp_cal_active == true && calibration_status_pinda() == false) { - lcd_show_fullscreen_message_and_wait_P(MSG_PINDA_NOT_CALIBRATED); - lcd_update_enable(true); - } else if (calibration_status() == CALIBRATION_STATUS_Z_CALIBRATION) { - // Show the message. - lcd_show_fullscreen_message_and_wait_P(MSG_FOLLOW_CALIBRATION_FLOW); + + if (eeprom_read_byte((uint8_t*)EEPROM_WIZARD_ACTIVE) == 255) { + eeprom_write_byte((uint8_t*)EEPROM_WIZARD_ACTIVE, 1); + lcd_wizard(0); } - for (int i = 0; i<4; i++) EEPROM_read_B(EEPROM_BOWDEN_LENGTH + i * 2, &bowden_length[i]); - - //If eeprom version for storing parameters to eeprom using M500 changed, default settings are used. Inform user in this case - if (!previous_settings_retrieved) { - lcd_show_fullscreen_message_and_wait_P(MSG_DEFAULT_SETTINGS_LOADED); + else if (eeprom_read_byte((uint8_t*)EEPROM_WIZARD_ACTIVE) == 0) { //dont show calibration status messages if wizard is currently active + + if (calibration_status() == CALIBRATION_STATUS_ASSEMBLED || + calibration_status() == CALIBRATION_STATUS_UNKNOWN) { + // Reset the babystepping values, so the printer will not move the Z axis up when the babystepping is enabled. + eeprom_update_word((uint16_t*)EEPROM_BABYSTEP_Z, 0); + // Show the message. + lcd_show_fullscreen_message_and_wait_P(MSG_FOLLOW_CALIBRATION_FLOW); + } + else if (calibration_status() == CALIBRATION_STATUS_LIVE_ADJUST) { + // Show the message. + lcd_show_fullscreen_message_and_wait_P(MSG_BABYSTEP_Z_NOT_SET); + lcd_update_enable(true); + } + else if (calibration_status() == CALIBRATION_STATUS_CALIBRATED && temp_cal_active == true && calibration_status_pinda() == false) { + lcd_show_fullscreen_message_and_wait_P(MSG_PINDA_NOT_CALIBRATED); + lcd_update_enable(true); + } + else if (calibration_status() == CALIBRATION_STATUS_Z_CALIBRATION) { + // Show the message. + lcd_show_fullscreen_message_and_wait_P(MSG_FOLLOW_CALIBRATION_FLOW); + } + //If eeprom version for storing parameters to eeprom using M500 changed, default settings are used. Inform user in this case + if (!previous_settings_retrieved) { + lcd_show_fullscreen_message_and_wait_P(MSG_DEFAULT_SETTINGS_LOADED); + } } + for (int i = 0; i < 4; i++) EEPROM_read_B(EEPROM_BOWDEN_LENGTH + i * 2, &bowden_length[i]); #endif //DEBUG_DISABLE_STARTMSGS lcd_update_enable(true); @@ -2115,6 +2129,162 @@ void ramming() { } } */ + + +void gcode_M701() { +#ifdef SNMM + extr_adj(snmm_extruder);//loads current extruder +#else + enable_z(); + custom_message = true; + custom_message_type = 2; + + lcd_setstatuspgm(MSG_LOADING_FILAMENT); + current_position[E_AXIS] += 70; + plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 400 / 60, active_extruder); //fast sequence + + current_position[E_AXIS] += 25; + plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 100 / 60, active_extruder); //slow sequence + st_synchronize(); + + if (!farm_mode && loading_flag) { + bool clean = lcd_show_fullscreen_message_yes_no_and_wait_P(MSG_FILAMENT_CLEAN, false, true); + + while (!clean) { + lcd_update_enable(true); + lcd_update(2); + current_position[E_AXIS] += 25; + plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 100 / 60, active_extruder); //slow sequence + st_synchronize(); + clean = lcd_show_fullscreen_message_yes_no_and_wait_P(MSG_FILAMENT_CLEAN, false, true); + } + } + lcd_update_enable(true); + lcd_update(2); + lcd_setstatuspgm(WELCOME_MSG); + disable_z(); + loading_flag = false; + custom_message = false; + custom_message_type = 0; +#endif +} + +bool gcode_M45(bool onlyZ) { + bool final_result = false; + if (!onlyZ) { + setTargetBed(0); + setTargetHotend(0, 0); + setTargetHotend(0, 1); + setTargetHotend(0, 2); + adjust_bed_reset(); //reset bed level correction + } + + // Disable the default update procedure of the display. We will do a modal dialog. + lcd_update_enable(false); + // Let the planner use the uncorrected coordinates. + mbl.reset(); + // Reset world2machine_rotation_and_skew and world2machine_shift, therefore + // the planner will not perform any adjustments in the XY plane. + // Wait for the motors to stop and update the current position with the absolute values. + world2machine_revert_to_uncorrected(); + // Reset the baby step value applied without moving the axes. + babystep_reset(); + // Mark all axes as in a need for homing. + memset(axis_known_position, 0, sizeof(axis_known_position)); + + // Let the user move the Z axes up to the end stoppers. + KEEPALIVE_STATE(PAUSED_FOR_USER); + if (lcd_calibrate_z_end_stop_manual(onlyZ)) { + KEEPALIVE_STATE(IN_HANDLER); + refresh_cmd_timeout(); + if (((degHotend(0) > MAX_HOTEND_TEMP_CALIBRATION) || (degBed() > MAX_BED_TEMP_CALIBRATION)) && (!onlyZ)) { + lcd_wait_for_cool_down(); + lcd_show_fullscreen_message_and_wait_P(MSG_PAPER); + lcd_display_message_fullscreen_P(MSG_FIND_BED_OFFSET_AND_SKEW_LINE1); + lcd_implementation_print_at(0, 2, 1); + lcd_printPGM(MSG_FIND_BED_OFFSET_AND_SKEW_LINE2); + } + + // Move the print head close to the bed. + current_position[Z_AXIS] = MESH_HOME_Z_SEARCH; + plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], homing_feedrate[Z_AXIS] / 40, active_extruder); + st_synchronize(); + + // Home in the XY plane. + set_destination_to_current(); + setup_for_endstop_move(); + home_xy(); + + int8_t verbosity_level = 0; + if (code_seen('V')) { + // Just 'V' without a number counts as V1. + char c = strchr_pointer[1]; + verbosity_level = (c == ' ' || c == '\t' || c == 0) ? 1 : code_value_short(); + } + + if (onlyZ) { + clean_up_after_endstop_move(); + // Z only calibration. + // Load the machine correction matrix + world2machine_initialize(); + // and correct the current_position to match the transformed coordinate system. + world2machine_update_current(); + //FIXME + bool result = sample_mesh_and_store_reference(); + if (result) { + if (calibration_status() == CALIBRATION_STATUS_Z_CALIBRATION) + // Shipped, the nozzle height has been set already. The user can start printing now. + calibration_status_store(CALIBRATION_STATUS_CALIBRATED); + // babystep_apply(); + final_result = true; + } + } + else { + // Reset the baby step value and the baby step applied flag. + calibration_status_store(CALIBRATION_STATUS_ASSEMBLED); + eeprom_update_word((uint16_t*)EEPROM_BABYSTEP_Z, 0); + // Complete XYZ calibration. + uint8_t point_too_far_mask = 0; + BedSkewOffsetDetectionResultType result = find_bed_offset_and_skew(verbosity_level, point_too_far_mask); + clean_up_after_endstop_move(); + // Print head up. + current_position[Z_AXIS] = MESH_HOME_Z_SEARCH; + plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], homing_feedrate[Z_AXIS] / 40, active_extruder); + st_synchronize(); + if (result >= 0) { + point_too_far_mask = 0; + // Second half: The fine adjustment. + // Let the planner use the uncorrected coordinates. + mbl.reset(); + world2machine_reset(); + // Home in the XY plane. + setup_for_endstop_move(); + home_xy(); + result = improve_bed_offset_and_skew(1, verbosity_level, point_too_far_mask); + clean_up_after_endstop_move(); + // Print head up. + current_position[Z_AXIS] = MESH_HOME_Z_SEARCH; + plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], homing_feedrate[Z_AXIS] / 40, active_extruder); + st_synchronize(); + // if (result >= 0) babystep_apply(); + } + lcd_bed_calibration_show_result(result, point_too_far_mask); + if (result >= 0) { + // Calibration valid, the machine should be able to print. Advise the user to run the V2Calibration.gcode. + calibration_status_store(CALIBRATION_STATUS_LIVE_ADJUST); + if(eeprom_read_byte((uint8_t*)EEPROM_WIZARD_ACTIVE) != 1) lcd_show_fullscreen_message_and_wait_P(MSG_BABYSTEP_Z_NOT_SET); + final_result = true; + } + } + } + else { + // Timeouted. + KEEPALIVE_STATE(IN_HANDLER); + } + lcd_update_enable(true); + return final_result; +} + void process_commands() { #ifdef FILAMENT_RUNOUT_SUPPORT @@ -3468,13 +3638,14 @@ void process_commands() calibration_status_store(CALIBRATION_STATUS_CALIBRATED); break; - /** - * G88: Prusa3D specific: Don't know what it is for, it is in V2Calibration.gcode - */ - case 88: - break; - - + case 88: //just for test + SERIAL_ECHOPGM("Calibration status:"); + MYSERIAL.println(int(calibration_status())); + if (code_seen('S')) codenum = code_value(); + calibration_status_store(codenum); + SERIAL_ECHOPGM("Calibration status:"); + MYSERIAL.println(int(calibration_status())); + break; #endif // ENABLE_MESH_BED_LEVELING @@ -3772,114 +3943,8 @@ void process_commands() case 45: // M45: Prusa3D: bed skew and offset with manual Z up { // Only Z calibration? - bool onlyZ = code_seen('Z'); - if (!onlyZ) { - setTargetBed(0); - setTargetHotend(0, 0); - setTargetHotend(0, 1); - setTargetHotend(0, 2); - adjust_bed_reset(); //reset bed level correction - } - - // Disable the default update procedure of the display. We will do a modal dialog. - lcd_update_enable(false); - // Let the planner use the uncorrected coordinates. - mbl.reset(); - // Reset world2machine_rotation_and_skew and world2machine_shift, therefore - // the planner will not perform any adjustments in the XY plane. - // Wait for the motors to stop and update the current position with the absolute values. - world2machine_revert_to_uncorrected(); - // Reset the baby step value applied without moving the axes. - babystep_reset(); - // Mark all axes as in a need for homing. - memset(axis_known_position, 0, sizeof(axis_known_position)); - - // Let the user move the Z axes up to the end stoppers. - KEEPALIVE_STATE(PAUSED_FOR_USER); - if (lcd_calibrate_z_end_stop_manual( onlyZ )) { - KEEPALIVE_STATE(IN_HANDLER); - refresh_cmd_timeout(); - if (((degHotend(0) > MAX_HOTEND_TEMP_CALIBRATION) || (degBed() > MAX_BED_TEMP_CALIBRATION)) && (!onlyZ)) { - lcd_wait_for_cool_down(); - lcd_show_fullscreen_message_and_wait_P(MSG_PAPER); - lcd_display_message_fullscreen_P(MSG_FIND_BED_OFFSET_AND_SKEW_LINE1); - lcd_implementation_print_at(0, 2, 1); - lcd_printPGM(MSG_FIND_BED_OFFSET_AND_SKEW_LINE2); - } - - // Move the print head close to the bed. - current_position[Z_AXIS] = MESH_HOME_Z_SEARCH; - plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS],current_position[Z_AXIS] , current_position[E_AXIS], homing_feedrate[Z_AXIS]/40, active_extruder); - st_synchronize(); - - // Home in the XY plane. - set_destination_to_current(); - setup_for_endstop_move(); - home_xy(); - - int8_t verbosity_level = 0; - if (code_seen('V')) { - // Just 'V' without a number counts as V1. - char c = strchr_pointer[1]; - verbosity_level = (c == ' ' || c == '\t' || c == 0) ? 1 : code_value_short(); - } - - if (onlyZ) { - clean_up_after_endstop_move(); - // Z only calibration. - // Load the machine correction matrix - world2machine_initialize(); - // and correct the current_position to match the transformed coordinate system. - world2machine_update_current(); - //FIXME - bool result = sample_mesh_and_store_reference(); - if (result) { - if (calibration_status() == CALIBRATION_STATUS_Z_CALIBRATION) - // Shipped, the nozzle height has been set already. The user can start printing now. - calibration_status_store(CALIBRATION_STATUS_CALIBRATED); - // babystep_apply(); - } - } else { - // Reset the baby step value and the baby step applied flag. - calibration_status_store(CALIBRATION_STATUS_ASSEMBLED); - eeprom_update_word((uint16_t*)EEPROM_BABYSTEP_Z, 0); - // Complete XYZ calibration. - uint8_t point_too_far_mask = 0; - BedSkewOffsetDetectionResultType result = find_bed_offset_and_skew(verbosity_level, point_too_far_mask); - clean_up_after_endstop_move(); - // Print head up. - current_position[Z_AXIS] = MESH_HOME_Z_SEARCH; - plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS],current_position[Z_AXIS] , current_position[E_AXIS], homing_feedrate[Z_AXIS]/40, active_extruder); - st_synchronize(); - if (result >= 0) { - point_too_far_mask = 0; - // Second half: The fine adjustment. - // Let the planner use the uncorrected coordinates. - mbl.reset(); - world2machine_reset(); - // Home in the XY plane. - setup_for_endstop_move(); - home_xy(); - result = improve_bed_offset_and_skew(1, verbosity_level, point_too_far_mask); - clean_up_after_endstop_move(); - // Print head up. - current_position[Z_AXIS] = MESH_HOME_Z_SEARCH; - plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS],current_position[Z_AXIS] , current_position[E_AXIS], homing_feedrate[Z_AXIS]/40, active_extruder); - st_synchronize(); - // if (result >= 0) babystep_apply(); - } - lcd_bed_calibration_show_result(result, point_too_far_mask); - if (result >= 0) { - // Calibration valid, the machine should be able to print. Advise the user to run the V2Calibration.gcode. - calibration_status_store(CALIBRATION_STATUS_LIVE_ADJUST); - lcd_show_fullscreen_message_and_wait_P(MSG_BABYSTEP_Z_NOT_SET); - } - } - } else { - // Timeouted. - KEEPALIVE_STATE(IN_HANDLER); - } - lcd_update_enable(true); + bool only_Z = code_seen('Z'); + gcode_M45(only_Z); break; } @@ -5633,41 +5698,7 @@ case 404: //M404 Enter the nominal filament width (3mm, 1.75mm ) N<3.0> or disp break; case 701: //M701: load filament { -#ifdef SNMM - extr_adj(snmm_extruder);//loads current extruder -#else - enable_z(); - custom_message = true; - custom_message_type = 2; - - lcd_setstatuspgm(MSG_LOADING_FILAMENT); - current_position[E_AXIS] += 70; - plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 400 / 60, active_extruder); //fast sequence - - current_position[E_AXIS] += 25; - plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 100 / 60, active_extruder); //slow sequence - st_synchronize(); - - if (!farm_mode && loading_flag) { - bool clean = lcd_show_fullscreen_message_yes_no_and_wait_P(MSG_FILAMENT_CLEAN, false, true); - - while (!clean) { - lcd_update_enable(true); - lcd_update(2); - current_position[E_AXIS] += 25; - plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 100 / 60, active_extruder); //slow sequence - st_synchronize(); - clean = lcd_show_fullscreen_message_yes_no_and_wait_P(MSG_FILAMENT_CLEAN, false, true); - } - } - lcd_update_enable(true); - lcd_update(2); - lcd_setstatuspgm(WELCOME_MSG); - disable_z(); - loading_flag = false; - custom_message = false; - custom_message_type = 0; -#endif + gcode_M701(); } break; case 702: diff --git a/Firmware/language_all.cpp b/Firmware/language_all.cpp index 7035a2d8f..756682e25 100644 --- a/Firmware/language_all.cpp +++ b/Firmware/language_all.cpp @@ -3422,6 +3422,11 @@ const char * const MSG_USERWAIT_LANG_TABLE[LANG_NUM] PROGMEM = { MSG_USERWAIT_DE }; +const char MSG_V2_CALIBRATION_EN[] PROGMEM = "First layer cal."; +const char * const MSG_V2_CALIBRATION_LANG_TABLE[1] PROGMEM = { + MSG_V2_CALIBRATION_EN +}; + const char MSG_VMIN_EN[] PROGMEM = "Vmin"; const char * const MSG_VMIN_LANG_TABLE[1] PROGMEM = { MSG_VMIN_EN @@ -3477,6 +3482,86 @@ const char * const MSG_WATCHDOG_RESET_LANG_TABLE[1] PROGMEM = { MSG_WATCHDOG_RESET_EN }; +const char MSG_WIZARD_EN[] PROGMEM = "Wizard"; +const char * const MSG_WIZARD_LANG_TABLE[1] PROGMEM = { + MSG_WIZARD_EN +}; + +const char MSG_WIZARD_DONE_EN[] PROGMEM = "All is done. Happy printing!"; +const char * const MSG_WIZARD_DONE_LANG_TABLE[1] PROGMEM = { + MSG_WIZARD_DONE_EN +}; + +const char MSG_WIZARD_FILAMENT_LOADED_EN[] PROGMEM = "Is filament loaded?"; +const char * const MSG_WIZARD_FILAMENT_LOADED_LANG_TABLE[1] PROGMEM = { + MSG_WIZARD_FILAMENT_LOADED_EN +}; + +const char MSG_WIZARD_HEATING_EN[] PROGMEM = "Preheating nozzle. Please wait."; +const char * const MSG_WIZARD_HEATING_LANG_TABLE[1] PROGMEM = { + MSG_WIZARD_HEATING_EN +}; + +const char MSG_WIZARD_LANGUAGE_EN[] PROGMEM = "Please choose your language"; +const char * const MSG_WIZARD_LANGUAGE_LANG_TABLE[1] PROGMEM = { + MSG_WIZARD_LANGUAGE_EN +}; + +const char MSG_WIZARD_LOAD_FILAMENT_EN[] PROGMEM = "Please insert PLA filament to the extruder, then press knob to load it."; +const char * const MSG_WIZARD_LOAD_FILAMENT_LANG_TABLE[1] PROGMEM = { + MSG_WIZARD_LOAD_FILAMENT_EN +}; + +const char MSG_WIZARD_QUIT_EN[] PROGMEM = "You can always resume the Wizard from Setting->Wizard."; +const char * const MSG_WIZARD_QUIT_LANG_TABLE[1] PROGMEM = { + MSG_WIZARD_QUIT_EN +}; + +const char MSG_WIZARD_RERUN_EN[] PROGMEM = "Running Wizard will delete current calibration results and start from the beginning. Continue?"; +const char * const MSG_WIZARD_RERUN_LANG_TABLE[1] PROGMEM = { + MSG_WIZARD_RERUN_EN +}; + +const char MSG_WIZARD_SELFTEST_EN[] PROGMEM = "First, I will run the selftest to check most common assembly problems."; +const char * const MSG_WIZARD_SELFTEST_LANG_TABLE[1] PROGMEM = { + MSG_WIZARD_SELFTEST_EN +}; + +const char MSG_WIZARD_SELFTEST_FAILED_EN[] PROGMEM = "Wizard: selftest failed"; +const char * const MSG_WIZARD_SELFTEST_FAILED_LANG_TABLE[1] PROGMEM = { + MSG_WIZARD_SELFTEST_FAILED_EN +}; + +const char MSG_WIZARD_V2_CAL_EN[] PROGMEM = "Now I will calibrate distance between tip of the nozzle and heatbed surface."; +const char * const MSG_WIZARD_V2_CAL_LANG_TABLE[1] PROGMEM = { + MSG_WIZARD_V2_CAL_EN +}; + +const char MSG_WIZARD_V2_CAL_2_EN[] PROGMEM = "I will start to print line and you will gradually lower the nozzle by rotating the knob, until you reach optimal height. Check the pictures in our handbook in chapter Calibration."; +const char * const MSG_WIZARD_V2_CAL_2_LANG_TABLE[1] PROGMEM = { + MSG_WIZARD_V2_CAL_2_EN +}; + +const char MSG_WIZARD_WELCOME_EN[] PROGMEM = "Hi, I am your Original Prusa i3 printer. Would you like me to guide you through the setup process?"; +const char * const MSG_WIZARD_WELCOME_LANG_TABLE[1] PROGMEM = { + MSG_WIZARD_WELCOME_EN +}; + +const char MSG_WIZARD_WILL_PREHEAT_EN[] PROGMEM = "No I will preheat nozzle for PLA."; +const char * const MSG_WIZARD_WILL_PREHEAT_LANG_TABLE[1] PROGMEM = { + MSG_WIZARD_WILL_PREHEAT_EN +}; + +const char MSG_WIZARD_XYZ_CAL_EN[] PROGMEM = "I will run xyz calibration now\x85 It will take approx. 12 mins."; +const char * const MSG_WIZARD_XYZ_CAL_LANG_TABLE[1] PROGMEM = { + MSG_WIZARD_XYZ_CAL_EN +}; + +const char MSG_WIZARD_Z_CAL_EN[] PROGMEM = "I will run z calibration now\x85"; +const char * const MSG_WIZARD_Z_CAL_LANG_TABLE[1] PROGMEM = { + MSG_WIZARD_Z_CAL_EN +}; + const char MSG_XYZ_DETAILS_EN[] PROGMEM = "XYZ cal. details"; const char MSG_XYZ_DETAILS_CZ[] PROGMEM = "Detaily XYZ kal."; const char MSG_XYZ_DETAILS_IT[] PROGMEM = "XYZ Cal. dettagli"; diff --git a/Firmware/language_all.h b/Firmware/language_all.h index 209c4954a..1d42ea290 100644 --- a/Firmware/language_all.h +++ b/Firmware/language_all.h @@ -626,6 +626,8 @@ extern const char* const MSG_USED_LANG_TABLE[LANG_NUM]; #define MSG_USED LANG_TABLE_SELECT(MSG_USED_LANG_TABLE) extern const char* const MSG_USERWAIT_LANG_TABLE[LANG_NUM]; #define MSG_USERWAIT LANG_TABLE_SELECT(MSG_USERWAIT_LANG_TABLE) +extern const char* const MSG_V2_CALIBRATION_LANG_TABLE[1]; +#define MSG_V2_CALIBRATION LANG_TABLE_SELECT_EXPLICIT(MSG_V2_CALIBRATION_LANG_TABLE, 0) extern const char* const MSG_VMIN_LANG_TABLE[1]; #define MSG_VMIN LANG_TABLE_SELECT_EXPLICIT(MSG_VMIN_LANG_TABLE, 0) extern const char* const MSG_VOLUMETRIC_LANG_TABLE[1]; @@ -640,6 +642,38 @@ extern const char* const MSG_WATCH_LANG_TABLE[LANG_NUM]; #define MSG_WATCH LANG_TABLE_SELECT(MSG_WATCH_LANG_TABLE) extern const char* const MSG_WATCHDOG_RESET_LANG_TABLE[1]; #define MSG_WATCHDOG_RESET LANG_TABLE_SELECT_EXPLICIT(MSG_WATCHDOG_RESET_LANG_TABLE, 0) +extern const char* const MSG_WIZARD_LANG_TABLE[1]; +#define MSG_WIZARD LANG_TABLE_SELECT_EXPLICIT(MSG_WIZARD_LANG_TABLE, 0) +extern const char* const MSG_WIZARD_DONE_LANG_TABLE[1]; +#define MSG_WIZARD_DONE LANG_TABLE_SELECT_EXPLICIT(MSG_WIZARD_DONE_LANG_TABLE, 0) +extern const char* const MSG_WIZARD_FILAMENT_LOADED_LANG_TABLE[1]; +#define MSG_WIZARD_FILAMENT_LOADED LANG_TABLE_SELECT_EXPLICIT(MSG_WIZARD_FILAMENT_LOADED_LANG_TABLE, 0) +extern const char* const MSG_WIZARD_HEATING_LANG_TABLE[1]; +#define MSG_WIZARD_HEATING LANG_TABLE_SELECT_EXPLICIT(MSG_WIZARD_HEATING_LANG_TABLE, 0) +extern const char* const MSG_WIZARD_LANGUAGE_LANG_TABLE[1]; +#define MSG_WIZARD_LANGUAGE LANG_TABLE_SELECT_EXPLICIT(MSG_WIZARD_LANGUAGE_LANG_TABLE, 0) +extern const char* const MSG_WIZARD_LOAD_FILAMENT_LANG_TABLE[1]; +#define MSG_WIZARD_LOAD_FILAMENT LANG_TABLE_SELECT_EXPLICIT(MSG_WIZARD_LOAD_FILAMENT_LANG_TABLE, 0) +extern const char* const MSG_WIZARD_QUIT_LANG_TABLE[1]; +#define MSG_WIZARD_QUIT LANG_TABLE_SELECT_EXPLICIT(MSG_WIZARD_QUIT_LANG_TABLE, 0) +extern const char* const MSG_WIZARD_RERUN_LANG_TABLE[1]; +#define MSG_WIZARD_RERUN LANG_TABLE_SELECT_EXPLICIT(MSG_WIZARD_RERUN_LANG_TABLE, 0) +extern const char* const MSG_WIZARD_SELFTEST_LANG_TABLE[1]; +#define MSG_WIZARD_SELFTEST LANG_TABLE_SELECT_EXPLICIT(MSG_WIZARD_SELFTEST_LANG_TABLE, 0) +extern const char* const MSG_WIZARD_SELFTEST_FAILED_LANG_TABLE[1]; +#define MSG_WIZARD_SELFTEST_FAILED LANG_TABLE_SELECT_EXPLICIT(MSG_WIZARD_SELFTEST_FAILED_LANG_TABLE, 0) +extern const char* const MSG_WIZARD_V2_CAL_LANG_TABLE[1]; +#define MSG_WIZARD_V2_CAL LANG_TABLE_SELECT_EXPLICIT(MSG_WIZARD_V2_CAL_LANG_TABLE, 0) +extern const char* const MSG_WIZARD_V2_CAL_2_LANG_TABLE[1]; +#define MSG_WIZARD_V2_CAL_2 LANG_TABLE_SELECT_EXPLICIT(MSG_WIZARD_V2_CAL_2_LANG_TABLE, 0) +extern const char* const MSG_WIZARD_WELCOME_LANG_TABLE[1]; +#define MSG_WIZARD_WELCOME LANG_TABLE_SELECT_EXPLICIT(MSG_WIZARD_WELCOME_LANG_TABLE, 0) +extern const char* const MSG_WIZARD_WILL_PREHEAT_LANG_TABLE[1]; +#define MSG_WIZARD_WILL_PREHEAT LANG_TABLE_SELECT_EXPLICIT(MSG_WIZARD_WILL_PREHEAT_LANG_TABLE, 0) +extern const char* const MSG_WIZARD_XYZ_CAL_LANG_TABLE[1]; +#define MSG_WIZARD_XYZ_CAL LANG_TABLE_SELECT_EXPLICIT(MSG_WIZARD_XYZ_CAL_LANG_TABLE, 0) +extern const char* const MSG_WIZARD_Z_CAL_LANG_TABLE[1]; +#define MSG_WIZARD_Z_CAL LANG_TABLE_SELECT_EXPLICIT(MSG_WIZARD_Z_CAL_LANG_TABLE, 0) extern const char* const MSG_XYZ_DETAILS_LANG_TABLE[LANG_NUM]; #define MSG_XYZ_DETAILS LANG_TABLE_SELECT(MSG_XYZ_DETAILS_LANG_TABLE) extern const char* const MSG_X_MAX_LANG_TABLE[1]; diff --git a/Firmware/language_en.h b/Firmware/language_en.h index 1afea9f31..b97c49b49 100644 --- a/Firmware/language_en.h +++ b/Firmware/language_en.h @@ -317,5 +317,19 @@ #define(length=17, lines=1) MSG_SORT_NONE "Sort: [None]" #define(length=20, lines=1) MSG_SORTING "Sorting files" #define(length=17, lines=1) MSG_WIZARD "Wizard" -#define MSG_WIZARD_LANGUAGE "Please choose your language" -#define MSG_WIZARD_WELCOME "Hi, I’m your new Original Prusa i3 printer. Would you like me to guide you through the setup process?" \ No newline at end of file +#define MSG_WIZARD_LANGUAGE "Please choose your language" +#define MSG_WIZARD_WELCOME "Hi, I am your Original Prusa i3 printer. Would you like me to guide you through the setup process?" +#define MSG_WIZARD_QUIT "You can always resume the Wizard from Calibration -> Wizard." +#define MSG_WIZARD_SELFTEST "First, I will run the selftest to check most common assembly problems." +#define MSG_WIZARD_CALIBRATION_FAILED "Please check our handbook and fix the problem. Then resume the Wizard by rebooting the printer." +#define MSG_WIZARD_XYZ_CAL "I will run xyz calibration now… It will take approx. 12 mins." +#define MSG_WIZARD_FILAMENT_LOADED "Is filament loaded?" +#define MSG_WIZARD_Z_CAL "I will run z calibration now…" +#define MSG_WIZARD_WILL_PREHEAT "No I will preheat nozzle for PLA." +#define MSG_WIZARD_HEATING "Preheating nozzle. Please wait." +#define MSG_WIZARD_V2_CAL "Now I will calibrate distance between tip of the nozzle and heatbed surface." +#define MSG_WIZARD_V2_CAL_2 "I will start to print line and you will gradually lower the nozzle by rotating the knob, until you reach optimal height. Check the pictures in our handbook in chapter Calibration." +#define MSG_V2_CALIBRATION "First layer cal." +#define MSG_WIZARD_DONE "All is done. Happy printing!" +#define MSG_WIZARD_LOAD_FILAMENT "Please insert PLA filament to the extruder, then press knob to load it." +#define MSG_WIZARD_RERUN "Running Wizard will delete current calibration results and start from the beginning. Continue?" diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index ba1a6a165..5ca340c16 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -590,6 +590,109 @@ void lcd_commands() } } + if (lcd_commands_type == LCD_COMMAND_V2_CAL) + { + lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS; + if (lcd_commands_step == 0) + { + lcd_commands_step = 5; + } + if (lcd_commands_step == 5 && !blocks_queued() && cmd_buffer_empty()) + { + enquecommand_P(PSTR("M107")); + enquecommand_P(PSTR("M104 S210")); + enquecommand_P(PSTR("M140 S55")); + enquecommand_P(PSTR("M190 S55")); + enquecommand_P(PSTR("M109 S210")); + enquecommand_P(PSTR("M117 First layer cal.")); + enquecommand_P(PSTR("G87")); //sets calibration status + enquecommand_P(PSTR("G28")); + enquecommand_P(PSTR("G92 E0.0")); + lcd_commands_step = 4; + } + if (lcd_commands_step == 4 && !blocks_queued() && cmd_buffer_empty()) + { + + lcd_implementation_clear(); + lcd_goto_menu(lcd_babystep_z, 0, false); + enquecommand_P(PSTR("G1 X60.0 E9.0 F1000.0")); //intro line + enquecommand_P(PSTR("G1 X100.0 E12.5 F1000.0")); //intro line + enquecommand_P(PSTR("G92 E0.0")); + enquecommand_P(PSTR("G21")); //set units to millimeters + enquecommand_P(PSTR("G90")); //use absolute coordinates + enquecommand_P(PSTR("M83")); //use relative distances for extrusion + enquecommand_P(PSTR("G1 E - 1.50000 F2100.00000")); + enquecommand_P(PSTR("G1 Z0.150 F7200.000")); + enquecommand_P(PSTR("M204 S1000")); //set acceleration + enquecommand_P(PSTR("G1 F4000")); + lcd_commands_step = 3; + } + if (lcd_commands_step == 3 && !blocks_queued() && cmd_buffer_empty()) //draw meander + { + lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS; + + + //just opposite direction + /*enquecommand_P(PSTR("G1 X50 Y55")); + enquecommand_P(PSTR("G1 F1080")); + enquecommand_P(PSTR("G1 X200 Y55 E3.62773")); + enquecommand_P(PSTR("G1 X200 Y75 E0.49386")); + enquecommand_P(PSTR("G1 X50 Y75 E3.62773")); + enquecommand_P(PSTR("G1 X50 Y95 E0.49386")); + enquecommand_P(PSTR("G1 X200 Y95 E3.62773")); + enquecommand_P(PSTR("G1 X200 Y115 E0.49386")); + enquecommand_P(PSTR("G1 X50 Y115 E3.62773")); + enquecommand_P(PSTR("G1 X50 Y135 E0.49386")); + enquecommand_P(PSTR("G1 X200 Y135 E3.62773")); + enquecommand_P(PSTR("G1 X200 Y155 E0.66174")); + enquecommand_P(PSTR("G1 X100 Y155 E2.62773")); + enquecommand_P(PSTR("G1 X75 Y155 E2")); + enquecommand_P(PSTR("G1 X50 Y155 E2.5")); + enquecommand_P(PSTR("G1 E - 0.07500 F2100.00000"));*/ + + + enquecommand_P(PSTR("G1 X50 Y155")); + enquecommand_P(PSTR("G1 F1080")); + enquecommand_P(PSTR("G1 X75 Y155 E2.5")); + enquecommand_P(PSTR("G1 X100 Y155 E2")); + enquecommand_P(PSTR("G1 X200 Y155 E2.62773")); + enquecommand_P(PSTR("G1 X200 Y135 E0.66174")); + enquecommand_P(PSTR("G1 X50 Y135 E3.62773")); + enquecommand_P(PSTR("G1 X50 Y115 E0.49386")); + enquecommand_P(PSTR("G1 X200 Y115 E3.62773")); + enquecommand_P(PSTR("G1 X200 Y95 E0.49386")); + enquecommand_P(PSTR("G1 X50 Y95 E3.62773")); + enquecommand_P(PSTR("G1 X50 Y75 E0.49386")); + enquecommand_P(PSTR("G1 X200 Y75 E3.62773")); + enquecommand_P(PSTR("G1 X200 Y55 E0.49386")); + enquecommand_P(PSTR("G1 X50 Y55 E3.62773")); + enquecommand_P(PSTR("G1 E - 0.07500 F2100.00000")); + lcd_commands_step = 2; + } + + if (lcd_commands_step == 2 && !blocks_queued() && cmd_buffer_empty()) + { + lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS; + enquecommand_P(PSTR("M107")); //turn off printer fan + enquecommand_P(PSTR("M104 S0")); // turn off temperature + enquecommand_P(PSTR("M140 S0")); // turn off heatbed + enquecommand_P(PSTR("G1 Z10 F1300.000")); + enquecommand_P(PSTR("G1 X10 Y180 F4000")); //home X axis + enquecommand_P(PSTR("M84"));// disable motors + lcd_commands_step = 1; + } + if (lcd_commands_step == 1 && !blocks_queued() && cmd_buffer_empty()) + { + lcd_setstatuspgm(WELCOME_MSG); + lcd_commands_step = 0; + lcd_commands_type = 0; + if (eeprom_read_byte((uint8_t*)EEPROM_WIZARD_ACTIVE) == 1) { + lcd_wizard(9); + } + } + + } + if (lcd_commands_type == LCD_COMMAND_STOP_PRINT) /// stop print { uint8_t stopped_extruder; @@ -1906,6 +2009,73 @@ void lcd_wait_for_click() } } +int8_t lcd_show_multiscreen_message_yes_no_and_wait_P(const char *msg, bool allow_timeouting, bool default_yes) //currently just max. n*4 + 3 lines supported (set in language header files) +{ + const char *msg_next = lcd_display_message_fullscreen_P(msg); + bool multi_screen = msg_next != NULL; + bool yes = default_yes ? true : false; + + // Wait for user confirmation or a timeout. + unsigned long previous_millis_cmd = millis(); + int8_t enc_dif = encoderDiff; + KEEPALIVE_STATE(PAUSED_FOR_USER); + for (;;) { + for (uint8_t i = 0; i < 100; ++i) { + delay_keep_alive(50); + if (allow_timeouting && millis() - previous_millis_cmd > LCD_TIMEOUT_TO_STATUS) + return -1; + manage_heater(); + manage_inactivity(true); + + if (abs(enc_dif - encoderDiff) > 4) { + if (msg_next == NULL) { + lcd.setCursor(0, 3); + if (enc_dif < encoderDiff && yes) { + lcd_printPGM((PSTR(" "))); + lcd.setCursor(7, 3); + lcd_printPGM((PSTR(">"))); + yes = false; + } + else if (enc_dif > encoderDiff && !yes) { + lcd_printPGM((PSTR(">"))); + lcd.setCursor(7, 3); + lcd_printPGM((PSTR(" "))); + yes = true; + } + enc_dif = encoderDiff; + } + else { + break; //turning knob skips waiting loop + } + } + if (lcd_clicked()) { + while (lcd_clicked()); + delay(10); + while (lcd_clicked()); + KEEPALIVE_STATE(IN_HANDLER); + if(msg_next == NULL) return yes; + else break; + } + } + if (multi_screen) { + if (msg_next == NULL) { + msg_next = msg; + } + msg_next = lcd_display_message_fullscreen_P(msg_next); + } + if (msg_next == NULL){ + lcd.setCursor(0, 3); + if (yes) lcd_printPGM(PSTR(">")); + lcd.setCursor(1, 3); + lcd_printPGM(MSG_YES); + lcd.setCursor(7, 3); + if (!yes) lcd_printPGM(PSTR(">")); + lcd.setCursor(8, 3); + lcd_printPGM(MSG_NO); + } + } +} + int8_t lcd_show_fullscreen_message_yes_no_and_wait_P(const char *msg, bool allow_timeouting, bool default_yes) { lcd_display_message_fullscreen_P(msg); @@ -2618,6 +2788,185 @@ void lcd_toshiba_flash_air_compatibility_toggle() eeprom_update_byte((uint8_t*)EEPROM_TOSHIBA_FLASH_AIR_COMPATIBLITY, card.ToshibaFlashAir_isEnabled()); } +void lcd_v2_calibration() { + lcd_commands_type = LCD_COMMAND_V2_CAL; + lcd_return_to_status(); +} + +void lcd_wizard() { + bool result = true; + if(calibration_status() != CALIBRATION_STATUS_ASSEMBLED){ + result = lcd_show_multiscreen_message_yes_no_and_wait_P(MSG_WIZARD_RERUN, true ,false); + } + if (result) { + calibration_status_store(CALIBRATION_STATUS_ASSEMBLED); + lcd_wizard(0); + } + else { + lcd_update_enable(true); + lcd_update(2); + } +} + +void lcd_wizard(int state) { + + /* + if (eeprom_read_byte((uint8_t*)EEPROM_TEMP_CAL_ACTIVE) == 255) { + eeprom_write_byte((uint8_t*)EEPROM_TEMP_CAL_ACTIVE, 0); + */ + eeprom_write_byte((uint8_t*)EEPROM_WIZARD_ACTIVE, 1); + +#define WIZARD_END 255 + + //int state = 0; + bool end = false; + int wizard_event; + const char *msg = NULL; + + while (!end) { + switch (state) { + case 0: // run wizard? + wizard_event = lcd_show_multiscreen_message_yes_no_and_wait_P(MSG_WIZARD_WELCOME, false, true); + if (wizard_event) { + state = 1; + //eeprom_write_byte((uint8_t*)EEPROM_WIZARD_ACTIVE, 1); + }else end = true; + break; + case 1: // restore calibration status + + switch (calibration_status()) { + case CALIBRATION_STATUS_ASSEMBLED: state = 2; break; //run selftest + case CALIBRATION_STATUS_XYZ_CALIBRATION: state = 3; break; //run xyz cal. + case CALIBRATION_STATUS_Z_CALIBRATION: state = 4; break; //run z cal. + case CALIBRATION_STATUS_LIVE_ADJUST: state = 5; break; //run live adjust + case CALIBRATION_STATUS_CALIBRATED: end = true; break; + default: state = 2; break; //if calibration status is unknown, run wizard from the beginning + } + case 2: //selftest + lcd_show_fullscreen_message_and_wait_P(MSG_WIZARD_SELFTEST); + wizard_event = lcd_selftest(); + if (wizard_event) state = 3; + else end = true; + break; + case 3: //xyz cal. + lcd_show_fullscreen_message_and_wait_P(MSG_WIZARD_XYZ_CAL); + wizard_event = gcode_M45(false); + if (wizard_event) state = 5; + else end = true; + break; + case 4: //z cal. + lcd_show_fullscreen_message_and_wait_P(MSG_WIZARD_Z_CAL); + wizard_event = gcode_M45(true); + if (wizard_event) state = 9; //shipped, no need to set first layer, go to final message directly + else end = true; + break; + case 5: //is filament loaded? + //start to preheat nozzle and bed to save some time later + setTargetHotend(PLA_PREHEAT_HOTEND_TEMP, 0); + setTargetBed(PLA_PREHEAT_HPB_TEMP); + wizard_event = lcd_show_fullscreen_message_yes_no_and_wait_P(MSG_WIZARD_FILAMENT_LOADED, false); + if (wizard_event) state = 8; + else state = 6; + break; + case 6: //waiting for preheat nozzle for PLA; + lcd_display_message_fullscreen_P(MSG_WIZARD_WILL_PREHEAT); + delay_keep_alive(2000); + lcd_display_message_fullscreen_P(MSG_WIZARD_HEATING); + while (abs(degHotend(0) - PLA_PREHEAT_HOTEND_TEMP) > 3) { + lcd_display_message_fullscreen_P(MSG_WIZARD_HEATING); + + lcd.setCursor(0, 4); + lcd.print(LCD_STR_THERMOMETER[0]); + lcd.print(ftostr3(degHotend(0))); + lcd.print("/"); + lcd.print(PLA_PREHEAT_HOTEND_TEMP); + lcd.print(LCD_STR_DEGREE); + lcd_set_custom_characters(); + delay_keep_alive(1000); + } + state = 7; + break; + case 7: //load filament + lcd_show_fullscreen_message_and_wait_P(MSG_WIZARD_LOAD_FILAMENT); + lcd_implementation_clear(); + lcd_print_at_PGM(0,2,MSG_LOADING_FILAMENT); + loading_flag = true; + gcode_M701(); + state = 8; + break; + case 8: + lcd_show_fullscreen_message_and_wait_P(MSG_WIZARD_V2_CAL); + lcd_show_fullscreen_message_and_wait_P(MSG_WIZARD_V2_CAL_2); + lcd_commands_type = LCD_COMMAND_V2_CAL; + end = true; + break; + case 9: //we are finished + eeprom_write_byte((uint8_t*)EEPROM_WIZARD_ACTIVE, 0); + end = true; + break; + + /* + // Freshly assembled, needs to peform a self-test and the XYZ calibration. + CALIBRATION_STATUS_ASSEMBLED = 255, + + // For the wizard: self test has been performed, now the XYZ calibration is needed. + CALIBRATION_STATUS_XYZ_CALIBRATION = 250, + + // For the wizard: factory assembled, needs to run Z calibration. + CALIBRATION_STATUS_Z_CALIBRATION = 240, + + // The XYZ calibration has been performed, now it remains to run the V2Calibration.gcode. + CALIBRATION_STATUS_LIVE_ADJUST = 230, + + // Calibrated, ready to print. + CALIBRATION_STATUS_CALIBRATED = 1, + + // Legacy: resetted by issuing a G86 G-code. + // This value can only be expected after an upgrade from the initial MK2 firmware releases. + // Currently the G86 sets the calibration status to + CALIBRATION_STATUS_UNKNOWN = 0, + */ + + default: break; + } + } + + SERIAL_ECHOPGM("State: "); + MYSERIAL.println(state); + switch (state) { //final message + case 0: //user dont want to use wizard + msg = MSG_WIZARD_QUIT; + break; + + case 1: //printer was already calibrated + msg = MSG_WIZARD_DONE; + break; + case 2: //selftest + msg = MSG_WIZARD_CALIBRATION_FAILED; + break; + case 3: //xyz cal. + msg = MSG_WIZARD_CALIBRATION_FAILED; + case 4: //z cal. + msg = MSG_WIZARD_CALIBRATION_FAILED; + case 8: break; //exit wizard for v2 calibration, which is implemted in lcd_commands (we need lcd_update running) + case 9: //we are finished + + msg = MSG_WIZARD_DONE; + lcd_reset_alert_level(); + lcd_setstatuspgm(WELCOME_MSG); + break; + + default: + lcd_show_fullscreen_message_and_wait_P(MSG_WIZARD_QUIT); + break; + + } + if(state != 8) lcd_show_fullscreen_message_and_wait_P(msg); + lcd_update_enable(true); + lcd_return_to_status(); + lcd_update(2); +} + static void lcd_settings_menu() { EEPROM_read(EEPROM_SILENT, (uint8_t*)&SilentModeMenu, sizeof(SilentModeMenu)); @@ -2677,9 +3026,10 @@ static void lcd_calibration_menu() MENU_ITEM(gcode, MSG_HOMEYZ, PSTR("G28 Z")); #else //MK1BP // MK2 -MENU_ITEM(function, MSG_CALIBRATE_BED, lcd_mesh_calibration); + MENU_ITEM(function, MSG_CALIBRATE_BED, lcd_mesh_calibration); // "Calibrate Z" with storing the reference values to EEPROM. MENU_ITEM(submenu, MSG_HOMEYZ, lcd_mesh_calibration_z); + MENU_ITEM(submenu, MSG_V2_CALIBRATION, lcd_v2_calibration); #ifndef SNMM //MENU_ITEM(function, MSG_CALIBRATE_E, lcd_calibrate_extruder); @@ -4346,7 +4696,7 @@ menu_edit_type(float, float51, ftostr51, 10) menu_edit_type(float, float52, ftostr52, 100) menu_edit_type(unsigned long, long5, ftostr5, 0.01) -static void lcd_selftest() +static bool lcd_selftest() { int _progress = 0; bool _result = false; @@ -4409,8 +4759,10 @@ static void lcd_selftest() current_position[Y_AXIS] = current_position[Y_AXIS] - 14; _progress = lcd_selftest_screen(4, _progress, 3, true, 1500); _result = lcd_selfcheck_axis(2, Z_MAX_POS); - enquecommand_P(PSTR("G28 W")); - enquecommand_P(PSTR("G1 Z15")); + if (eeprom_read_byte((uint8_t*)EEPROM_WIZARD_ACTIVE) != 1) { + enquecommand_P(PSTR("G28 W")); + enquecommand_P(PSTR("G1 Z15")); + } } if (_result) @@ -4433,12 +4785,13 @@ static void lcd_selftest() if (_result) { - LCD_ALERTMESSAGERPGM(MSG_SELFTEST_OK); + LCD_ALERTMESSAGERPGM(MSG_SELFTEST_OK); } else { LCD_ALERTMESSAGERPGM(MSG_SELFTEST_FAILED); } + return(_result); } static bool lcd_selfcheck_axis(int _axis, int _travel) @@ -5221,6 +5574,7 @@ void lcd_update(uint8_t lcdDrawUpdateOverride) if (!SdFatUtil::test_stack_integrity()) stack_error(); lcd_ping(); //check that we have received ping command if we are in farm mode lcd_send_status(); + if (lcd_commands_type == LCD_COMMAND_V2_CAL) lcd_commands(); } void lcd_printer_connected() { diff --git a/Firmware/ultralcd.h b/Firmware/ultralcd.h index 216752f98..7ff4ab805 100644 --- a/Firmware/ultralcd.h +++ b/Firmware/ultralcd.h @@ -33,7 +33,7 @@ void lcd_mylang(); bool lcd_detected(void); - static void lcd_selftest(); + static bool lcd_selftest(); static bool lcd_selfcheck_endstops(); static bool lcd_selfcheck_axis(int _axis, int _travel); static bool lcd_selfcheck_check_heater(bool _isbed); @@ -44,6 +44,7 @@ void lcd_mylang(); void lcd_menu_statistics(); static bool lcd_selfcheck_pulleys(int axis); + extern const char* lcd_display_message_fullscreen_P(const char *msg, uint8_t &nlines); inline const char* lcd_display_message_fullscreen_P(const char *msg) { uint8_t nlines; return lcd_display_message_fullscreen_P(msg, nlines); } @@ -52,7 +53,7 @@ void lcd_mylang(); extern void lcd_show_fullscreen_message_and_wait_P(const char *msg); // 0: no, 1: yes, -1: timeouted extern int8_t lcd_show_fullscreen_message_yes_no_and_wait_P(const char *msg, bool allow_timeouting = true, bool default_yes = false); - + extern int8_t lcd_show_multiscreen_message_yes_no_and_wait_P(const char *msg, bool allow_timeouting = true, bool default_yes = false); // Ask the user to move the Z axis up to the end stoppers and let // the user confirm that it has been done. extern bool lcd_calibrate_z_end_stop_manual(bool only_z); @@ -95,6 +96,7 @@ void lcd_mylang(); #define LCD_COMMAND_LONG_PAUSE 5 #define LCD_COMMAND_LONG_PAUSE_RESUME 6 #define LCD_COMMAND_PID_EXTRUDER 7 + #define LCD_COMMAND_V2_CAL 8 extern unsigned long lcd_timeoutToStatus; extern int lcd_commands_type; @@ -227,6 +229,7 @@ void extr_unload_all(); void extr_unload_used(); void extr_unload(); static char snmm_stop_print_menu(); +static void lcd_babystep_z(); #ifdef SDCARD_SORT_ALPHA static void lcd_sort_type_set(); #endif @@ -269,4 +272,7 @@ void lcd_set_progress(); static void lcd_send_status(); static void lcd_connect_printer(); +void lcd_wizard(); +void lcd_wizard(int state); + #endif //ULTRALCD_H \ No newline at end of file From 29f6033bdb0d81435cb74eb7d4354698e07132de Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Fri, 8 Sep 2017 11:20:41 +0200 Subject: [PATCH 13/37] message added --- Firmware/language_all.cpp | 12 ++++++------ Firmware/language_all.h | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Firmware/language_all.cpp b/Firmware/language_all.cpp index 756682e25..03a4eac69 100644 --- a/Firmware/language_all.cpp +++ b/Firmware/language_all.cpp @@ -3487,6 +3487,11 @@ const char * const MSG_WIZARD_LANG_TABLE[1] PROGMEM = { MSG_WIZARD_EN }; +const char MSG_WIZARD_CALIBRATION_FAILED_EN[] PROGMEM = "Please check our handbook and fix the problem. Then resume the Wizard by rebooting the printer."; +const char * const MSG_WIZARD_CALIBRATION_FAILED_LANG_TABLE[1] PROGMEM = { + MSG_WIZARD_CALIBRATION_FAILED_EN +}; + const char MSG_WIZARD_DONE_EN[] PROGMEM = "All is done. Happy printing!"; const char * const MSG_WIZARD_DONE_LANG_TABLE[1] PROGMEM = { MSG_WIZARD_DONE_EN @@ -3512,7 +3517,7 @@ const char * const MSG_WIZARD_LOAD_FILAMENT_LANG_TABLE[1] PROGMEM = { MSG_WIZARD_LOAD_FILAMENT_EN }; -const char MSG_WIZARD_QUIT_EN[] PROGMEM = "You can always resume the Wizard from Setting->Wizard."; +const char MSG_WIZARD_QUIT_EN[] PROGMEM = "You can always resume the Wizard from Calibration -> Wizard."; const char * const MSG_WIZARD_QUIT_LANG_TABLE[1] PROGMEM = { MSG_WIZARD_QUIT_EN }; @@ -3527,11 +3532,6 @@ const char * const MSG_WIZARD_SELFTEST_LANG_TABLE[1] PROGMEM = { MSG_WIZARD_SELFTEST_EN }; -const char MSG_WIZARD_SELFTEST_FAILED_EN[] PROGMEM = "Wizard: selftest failed"; -const char * const MSG_WIZARD_SELFTEST_FAILED_LANG_TABLE[1] PROGMEM = { - MSG_WIZARD_SELFTEST_FAILED_EN -}; - const char MSG_WIZARD_V2_CAL_EN[] PROGMEM = "Now I will calibrate distance between tip of the nozzle and heatbed surface."; const char * const MSG_WIZARD_V2_CAL_LANG_TABLE[1] PROGMEM = { MSG_WIZARD_V2_CAL_EN diff --git a/Firmware/language_all.h b/Firmware/language_all.h index 1d42ea290..012e24d9e 100644 --- a/Firmware/language_all.h +++ b/Firmware/language_all.h @@ -644,6 +644,8 @@ extern const char* const MSG_WATCHDOG_RESET_LANG_TABLE[1]; #define MSG_WATCHDOG_RESET LANG_TABLE_SELECT_EXPLICIT(MSG_WATCHDOG_RESET_LANG_TABLE, 0) extern const char* const MSG_WIZARD_LANG_TABLE[1]; #define MSG_WIZARD LANG_TABLE_SELECT_EXPLICIT(MSG_WIZARD_LANG_TABLE, 0) +extern const char* const MSG_WIZARD_CALIBRATION_FAILED_LANG_TABLE[1]; +#define MSG_WIZARD_CALIBRATION_FAILED LANG_TABLE_SELECT_EXPLICIT(MSG_WIZARD_CALIBRATION_FAILED_LANG_TABLE, 0) extern const char* const MSG_WIZARD_DONE_LANG_TABLE[1]; #define MSG_WIZARD_DONE LANG_TABLE_SELECT_EXPLICIT(MSG_WIZARD_DONE_LANG_TABLE, 0) extern const char* const MSG_WIZARD_FILAMENT_LOADED_LANG_TABLE[1]; @@ -660,8 +662,6 @@ extern const char* const MSG_WIZARD_RERUN_LANG_TABLE[1]; #define MSG_WIZARD_RERUN LANG_TABLE_SELECT_EXPLICIT(MSG_WIZARD_RERUN_LANG_TABLE, 0) extern const char* const MSG_WIZARD_SELFTEST_LANG_TABLE[1]; #define MSG_WIZARD_SELFTEST LANG_TABLE_SELECT_EXPLICIT(MSG_WIZARD_SELFTEST_LANG_TABLE, 0) -extern const char* const MSG_WIZARD_SELFTEST_FAILED_LANG_TABLE[1]; -#define MSG_WIZARD_SELFTEST_FAILED LANG_TABLE_SELECT_EXPLICIT(MSG_WIZARD_SELFTEST_FAILED_LANG_TABLE, 0) extern const char* const MSG_WIZARD_V2_CAL_LANG_TABLE[1]; #define MSG_WIZARD_V2_CAL LANG_TABLE_SELECT_EXPLICIT(MSG_WIZARD_V2_CAL_LANG_TABLE, 0) extern const char* const MSG_WIZARD_V2_CAL_2_LANG_TABLE[1]; From 2f7ef212b07f559cdc85401d24d83d75a6f9ec77 Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Fri, 8 Sep 2017 13:25:13 +0200 Subject: [PATCH 14/37] farm mode: confirm print has lower sensitivity, changed items order in color selection menu --- Firmware/ultralcd.cpp | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 5e5ffc2b2..74187b14f 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -3649,8 +3649,8 @@ unsigned char lcd_choose_color() { //----------------------------------------------------- unsigned char items_no = 2; const char *item[items_no]; - item[0] = "Black"; - item[1] = "Orange"; + item[0] = "Orange"; + item[1] = "Black"; //----------------------------------------------------- unsigned char active_rows; static int first = 0; @@ -3673,9 +3673,8 @@ unsigned char lcd_choose_color() { manage_heater(); manage_inactivity(true); - if (abs((enc_dif - encoderDiff)) > 4) { - - if ((abs(enc_dif - encoderDiff)) > 1) { + if (abs((enc_dif - encoderDiff)) > 12) { + if (enc_dif > encoderDiff) { cursor_pos--; } @@ -3683,7 +3682,7 @@ unsigned char lcd_choose_color() { if (enc_dif < encoderDiff) { cursor_pos++; } - + if (cursor_pos > active_rows) { cursor_pos = active_rows; if (first < items_no - active_rows) { @@ -3709,7 +3708,6 @@ unsigned char lcd_choose_color() { lcd.print(">"); enc_dif = encoderDiff; delay(100); - } } @@ -3717,7 +3715,11 @@ unsigned char lcd_choose_color() { while (lcd_clicked()); delay(10); while (lcd_clicked()); - return(cursor_pos + first - 1); + switch(cursor_pos + first - 1) { + case 0: return 1; break; + case 1: return 0; break; + default: return 99; break; + } } } @@ -3732,7 +3734,7 @@ void lcd_confirm_print() int _ret = 0; int _t = 0; - + enc_dif = encoderDiff; lcd_implementation_clear(); lcd.setCursor(0, 0); @@ -3741,7 +3743,7 @@ void lcd_confirm_print() do { - if (abs((enc_dif - encoderDiff)) > 2) { + if (abs(enc_dif - encoderDiff) > 12) { if (enc_dif > encoderDiff) { cursor_pos--; } @@ -3749,6 +3751,7 @@ void lcd_confirm_print() if (enc_dif < encoderDiff) { cursor_pos++; } + enc_dif = encoderDiff; } if (cursor_pos > 2) { cursor_pos = 2; } @@ -3793,7 +3796,7 @@ void lcd_confirm_print() NcTime = millis(); } } - + manage_heater(); manage_inactivity(); From 2322830c8998ddbe6bd6bc3ba3796c8012830288 Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Fri, 8 Sep 2017 13:26:33 +0200 Subject: [PATCH 15/37] changed version --- Firmware/Configuration.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Firmware/Configuration.h b/Firmware/Configuration.h index cac5271b4..6f14080dc 100644 --- a/Firmware/Configuration.h +++ b/Firmware/Configuration.h @@ -5,7 +5,7 @@ #include "Configuration_prusa.h" // Firmware version -#define FW_version "3.0.12-5" +#define FW_version "3.0.12-6" #define FW_PRUSA3D_MAGIC "PRUSA3DFW" #define FW_PRUSA3D_MAGIC_LEN 10 From 54083e28ac1a3411e21409a14045c57749051b2b Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Fri, 8 Sep 2017 14:10:28 +0200 Subject: [PATCH 16/37] farm mode: sending status every 10 seconds, printer can response on serial communication when in confirm mode --- Firmware/ultralcd.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 74187b14f..9bfb24ce8 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -105,7 +105,7 @@ int lcd_commands_step=0; bool isPrintPaused = false; uint8_t farm_mode = 0; int farm_no = 0; -int farm_timer = 30; +int farm_timer = 8; int farm_status = 0; unsigned long allert_timer = millis(); bool printer_connected = true; @@ -408,15 +408,15 @@ static void lcd_status_screen() farm_timer--; if (farm_timer < 1) { - farm_timer = 180; + farm_timer = 10; prusa_statistics(0); } switch (farm_timer) { - case 45: + case 8: prusa_statistics(21); break; - case 10: + case 5: if (IS_SD_PRINTING) { prusa_statistics(20); @@ -2166,7 +2166,7 @@ void prusa_statistics(int _message, uint8_t _fil_nr) { prusa_stat_printerstatus(status_number); prusa_stat_farm_number(); SERIAL_ECHOLN("}"); - farm_timer = 5; + farm_timer = 4; break; case 21: // temperatures SERIAL_ECHO("{"); @@ -3672,7 +3672,7 @@ unsigned char lcd_choose_color() { manage_heater(); manage_inactivity(true); - + proc_commands(); if (abs((enc_dif - encoderDiff)) > 12) { if (enc_dif > encoderDiff) { @@ -3742,7 +3742,6 @@ void lcd_confirm_print() do { - if (abs(enc_dif - encoderDiff) > 12) { if (enc_dif > encoderDiff) { cursor_pos--; @@ -3799,6 +3798,7 @@ void lcd_confirm_print() manage_heater(); manage_inactivity(); + proc_commands(); } while (_ret == 0); From 70544f1cea558c713641d3469c58bb330e0254aa Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Fri, 8 Sep 2017 14:47:51 +0200 Subject: [PATCH 17/37] min temp error message on serial updated --- Firmware/ultralcd.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 9bfb24ce8..a663a5fe4 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -2193,7 +2193,7 @@ void prusa_statistics(int _message, uint8_t _fil_nr) { SERIAL_ECHOLN("}"); break; case 92: // Error - Min temp - SERIAL_ECHOLN("{[ERR:3]"); + SERIAL_ECHO("{[ERR:3]"); prusa_stat_farm_number(); SERIAL_ECHOLN("}"); break; From 7b407b2aba74d085cfddf46040660f65f04a31fe Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Fri, 8 Sep 2017 15:22:42 +0200 Subject: [PATCH 18/37] run wizard after printer startup just in case, that it is freshly build machine --- Firmware/Marlin_main.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 66a53dd79..bf3ac1806 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -1206,6 +1206,8 @@ void setup() // EEPROM_LANG to number lower than 0x0ff. // 1) Set a high power mode. eeprom_write_byte((uint8_t*)EEPROM_SILENT, 0); + eeprom_write_byte((uint8_t*)EEPROM_WIZARD_ACTIVE, 1); //run wizard + } #ifdef SNMM if (eeprom_read_dword((uint32_t*)EEPROM_BOWDEN_LENGTH) == 0x0ffffffff) { //bowden length used for SNMM @@ -1237,8 +1239,7 @@ void setup() #ifndef DEBUG_DISABLE_STARTMSGS check_babystep(); //checking if Z babystep is in allowed range - if (eeprom_read_byte((uint8_t*)EEPROM_WIZARD_ACTIVE) == 255) { - eeprom_write_byte((uint8_t*)EEPROM_WIZARD_ACTIVE, 1); + if (eeprom_read_byte((uint8_t*)EEPROM_WIZARD_ACTIVE) == 1) { lcd_wizard(0); } else if (eeprom_read_byte((uint8_t*)EEPROM_WIZARD_ACTIVE) == 0) { //dont show calibration status messages if wizard is currently active From 92d09efb012e46d9d872fff37fdc48d8d75ae2c8 Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Fri, 8 Sep 2017 17:20:16 +0200 Subject: [PATCH 19/37] start using CALIBRATION_STATUS_XYZ_CALIBRATION --- Firmware/Marlin_main.cpp | 7 ++++-- Firmware/ultralcd.cpp | 47 ++++++++++------------------------------ 2 files changed, 17 insertions(+), 37 deletions(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index bf3ac1806..f048360f8 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -1245,7 +1245,8 @@ void setup() else if (eeprom_read_byte((uint8_t*)EEPROM_WIZARD_ACTIVE) == 0) { //dont show calibration status messages if wizard is currently active if (calibration_status() == CALIBRATION_STATUS_ASSEMBLED || - calibration_status() == CALIBRATION_STATUS_UNKNOWN) { + calibration_status() == CALIBRATION_STATUS_UNKNOWN || + calibration_status() == CALIBRATION_STATUS_XYZ_CALIBRATION){ // Reset the babystepping values, so the printer will not move the Z axis up when the babystepping is enabled. eeprom_update_word((uint16_t*)EEPROM_BABYSTEP_Z, 0); // Show the message. @@ -3639,14 +3640,16 @@ void process_commands() calibration_status_store(CALIBRATION_STATUS_CALIBRATED); break; - case 88: //just for test + /*case 88: //just for test SERIAL_ECHOPGM("Calibration status:"); MYSERIAL.println(int(calibration_status())); if (code_seen('S')) codenum = code_value(); calibration_status_store(codenum); SERIAL_ECHOPGM("Calibration status:"); MYSERIAL.println(int(calibration_status())); + eeprom_write_byte((uint8_t*)EEPROM_WIZARD_ACTIVE, 1); //run wizard break; + */ #endif // ENABLE_MESH_BED_LEVELING diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 5ca340c16..075d39b95 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -2810,30 +2810,25 @@ void lcd_wizard() { void lcd_wizard(int state) { - /* - if (eeprom_read_byte((uint8_t*)EEPROM_TEMP_CAL_ACTIVE) == 255) { - eeprom_write_byte((uint8_t*)EEPROM_TEMP_CAL_ACTIVE, 0); - */ - eeprom_write_byte((uint8_t*)EEPROM_WIZARD_ACTIVE, 1); -#define WIZARD_END 255 - //int state = 0; bool end = false; int wizard_event; const char *msg = NULL; - while (!end) { switch (state) { case 0: // run wizard? wizard_event = lcd_show_multiscreen_message_yes_no_and_wait_P(MSG_WIZARD_WELCOME, false, true); if (wizard_event) { state = 1; - //eeprom_write_byte((uint8_t*)EEPROM_WIZARD_ACTIVE, 1); - }else end = true; + eeprom_write_byte((uint8_t*)EEPROM_WIZARD_ACTIVE, 1); + } + else { + eeprom_write_byte((uint8_t*)EEPROM_WIZARD_ACTIVE, 0); + end = true; + } break; case 1: // restore calibration status - switch (calibration_status()) { case CALIBRATION_STATUS_ASSEMBLED: state = 2; break; //run selftest case CALIBRATION_STATUS_XYZ_CALIBRATION: state = 3; break; //run xyz cal. @@ -2842,10 +2837,14 @@ void lcd_wizard(int state) { case CALIBRATION_STATUS_CALIBRATED: end = true; break; default: state = 2; break; //if calibration status is unknown, run wizard from the beginning } + break; case 2: //selftest lcd_show_fullscreen_message_and_wait_P(MSG_WIZARD_SELFTEST); wizard_event = lcd_selftest(); - if (wizard_event) state = 3; + if (wizard_event) { + calibration_status_store(CALIBRATION_STATUS_XYZ_CALIBRATION); + state = 3; + } else end = true; break; case 3: //xyz cal. @@ -2905,28 +2904,6 @@ void lcd_wizard(int state) { end = true; break; - /* - // Freshly assembled, needs to peform a self-test and the XYZ calibration. - CALIBRATION_STATUS_ASSEMBLED = 255, - - // For the wizard: self test has been performed, now the XYZ calibration is needed. - CALIBRATION_STATUS_XYZ_CALIBRATION = 250, - - // For the wizard: factory assembled, needs to run Z calibration. - CALIBRATION_STATUS_Z_CALIBRATION = 240, - - // The XYZ calibration has been performed, now it remains to run the V2Calibration.gcode. - CALIBRATION_STATUS_LIVE_ADJUST = 230, - - // Calibrated, ready to print. - CALIBRATION_STATUS_CALIBRATED = 1, - - // Legacy: resetted by issuing a G86 G-code. - // This value can only be expected after an upgrade from the initial MK2 firmware releases. - // Currently the G86 sets the calibration status to - CALIBRATION_STATUS_UNKNOWN = 0, - */ - default: break; } } @@ -2957,7 +2934,7 @@ void lcd_wizard(int state) { break; default: - lcd_show_fullscreen_message_and_wait_P(MSG_WIZARD_QUIT); + msg = MSG_WIZARD_QUIT; break; } From dba7d51fc2cd0267de13232a8fb609b518a69b63 Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Fri, 8 Sep 2017 17:27:38 +0200 Subject: [PATCH 20/37] version changed, wizard moved to calibration menu --- Firmware/Configuration.h | 2 +- Firmware/ultralcd.cpp | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Firmware/Configuration.h b/Firmware/Configuration.h index 2402f9070..0f8b2986a 100644 --- a/Firmware/Configuration.h +++ b/Firmware/Configuration.h @@ -5,7 +5,7 @@ #include "Configuration_prusa.h" // Firmware version -#define FW_version "3.0.12-6" +#define FW_version "3.0.12-7" #define FW_PRUSA3D_MAGIC "PRUSA3DFW" #define FW_PRUSA3D_MAGIC_LEN 10 diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 075d39b95..35c73a550 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -2985,8 +2985,6 @@ static void lcd_settings_menu() MENU_ITEM(function, PSTR("Disable farm mode"), lcd_disable_farm_mode); } - MENU_ITEM(function, MSG_WIZARD, lcd_wizard); - END_MENU(); } @@ -2996,6 +2994,7 @@ static void lcd_calibration_menu() MENU_ITEM(back, MSG_MAIN, lcd_main_menu); if (!isPrintPaused) { + MENU_ITEM(gcode, MSG_AUTO_HOME, PSTR("G28 W")); MENU_ITEM(function, MSG_SELFTEST, lcd_selftest); #ifdef MK1BP // MK1 @@ -3013,8 +3012,9 @@ static void lcd_calibration_menu() #endif // "Mesh Bed Leveling" MENU_ITEM(submenu, MSG_MESH_BED_LEVELING, lcd_mesh_bedleveling); + MENU_ITEM(function, MSG_WIZARD, lcd_wizard); #endif //MK1BP - MENU_ITEM(gcode, MSG_AUTO_HOME, PSTR("G28 W")); + MENU_ITEM(submenu, MSG_BED_CORRECTION_MENU, lcd_adjust_bed); #ifndef MK1BP MENU_ITEM(submenu, MSG_CALIBRATION_PINDA_MENU, lcd_pinda_calibration_menu); From 61592f9bfa21cb6dae53fcecf7a6e54adb9a80da Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Mon, 11 Sep 2017 02:55:06 +0200 Subject: [PATCH 21/37] initial version --- Firmware/Marlin.h | 4 +++ Firmware/Marlin_main.cpp | 36 ++++++++++++++++++++++++++ Firmware/SdBaseFile.cpp | 2 ++ Firmware/cardreader.cpp | 8 +++++- Firmware/cardreader.h | 5 +++- Firmware/language_all.cpp | 5 ++++ Firmware/language_all.h | 2 ++ Firmware/language_en.h | 3 ++- Firmware/ultralcd.cpp | 54 +++++++++++++++++++++++++++++++++++---- 9 files changed, 111 insertions(+), 8 deletions(-) diff --git a/Firmware/Marlin.h b/Firmware/Marlin.h index 61d7c2c75..bfb940ef4 100644 --- a/Firmware/Marlin.h +++ b/Firmware/Marlin.h @@ -356,3 +356,7 @@ void temp_compensation_start(); void wait_for_heater(long codenum); void serialecho_temperatures(); void proc_commands(); +bool check_commands(); +bool search_end_command(); +void empty_buffer(); +void show_buffer(); \ No newline at end of file diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index b1f2a5f55..79d6c3b73 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -1405,8 +1405,34 @@ void proc_commands() { } } +bool check_commands() { + bool ret = false; + + if (buflen) + { + //SERIAL_ECHOLNPGM("search_end "); + ret = search_end_command(); + if (!cmdbuffer_front_already_processed) + cmdqueue_pop_front(); + cmdbuffer_front_already_processed = false; + } + return ret; +} + +void show_buffer() { + SERIAL_ECHOPGM("bufindr:"); + MYSERIAL.println(bufindr); + SERIAL_ECHOPGM("bufindw:"); + MYSERIAL.println(bufindw); +} + +void empty_buffer() { + bufindr = bufindw; +} + void get_command() { + //show_buffer(); // Test and reserve space for the new command string. if (!cmdqueue_could_enqueue_back(MAX_CMD_SIZE - 1)) return; @@ -2076,6 +2102,16 @@ void ramming() { } } */ + +bool search_end_command() +{ + //SERIAL_ECHOLNPGM("E"); + bool return_value = false; + if (code_seen("M84")) return_value = true; + return return_value; + +} + void process_commands() { #ifdef FILAMENT_RUNOUT_SUPPORT diff --git a/Firmware/SdBaseFile.cpp b/Firmware/SdBaseFile.cpp index be04ab1a2..d8eca5fc8 100644 --- a/Firmware/SdBaseFile.cpp +++ b/Firmware/SdBaseFile.cpp @@ -277,6 +277,8 @@ int16_t SdBaseFile::fgets(char* str, int16_t num, char* delim) { * \return The value one, true, is returned for success and * the value zero, false, is returned for failure. */ + + bool SdBaseFile::getFilename(char* name) { if (!isOpen()) return false; diff --git a/Firmware/cardreader.cpp b/Firmware/cardreader.cpp index db20b6a86..b37b42233 100644 --- a/Firmware/cardreader.cpp +++ b/Firmware/cardreader.cpp @@ -162,6 +162,7 @@ void CardReader::lsDive(const char *prepend, SdFile parent, const char * const m } // while readDir } + void CardReader::ls() { lsAction=LS_SerialPrint; @@ -500,6 +501,11 @@ void CardReader::removeFile(char* name) } +void CardReader::getFileSize() +{ + public_fileSize = filesize; +} + void CardReader::getStatus() { if(sdprinting){ @@ -964,7 +970,7 @@ void CardReader::printingHasFinished() if(SD_FINISHED_STEPPERRELEASE) { //finishAndDisableSteppers(); - enquecommand_P(PSTR(SD_FINISHED_RELEASECOMMAND)); + //enquecommand_P(PSTR(SD_FINISHED_RELEASECOMMAND)); } autotempShutdown(); #ifdef SDCARD_SORT_ALPHA diff --git a/Firmware/cardreader.h b/Firmware/cardreader.h index 3ef9ff297..ccc8df3f6 100644 --- a/Firmware/cardreader.h +++ b/Firmware/cardreader.h @@ -27,6 +27,7 @@ public: void release(); void startFileprint(); void pauseSDPrint(); + void getFileSize(); void getStatus(); void printingHasFinished(); @@ -69,9 +70,11 @@ public: bool cardOK ; char filename[13]; uint16_t creationTime, creationDate; + uint32_t public_fileSize; char longFilename[LONG_FILENAME_LENGTH]; bool filenameIsDir; int lastnr; //last number of the autostart; + uint32_t sdpos; private: SdFile root,*curDir,workDir,workDirParents[MAX_DIR_DEPTH]; uint16_t workDirDepth; @@ -133,7 +136,7 @@ private: uint32_t filesize; //int16_t n; unsigned long autostart_atmillis; - uint32_t sdpos ; + //uint32_t sdpos ; bool autostart_stilltocheck; //the sd start is delayed, because otherwise the serial cannot answer fast enought to make contact with the hostsoftware. diff --git a/Firmware/language_all.cpp b/Firmware/language_all.cpp index 7035a2d8f..66f618db2 100644 --- a/Firmware/language_all.cpp +++ b/Firmware/language_all.cpp @@ -1092,6 +1092,11 @@ const char * const MSG_FILAMENT_LOADING_T3_LANG_TABLE[LANG_NUM] PROGMEM = { MSG_FILAMENT_LOADING_T3_DE }; +const char MSG_FILE_INCOMPLETE_EN[] PROGMEM = "File incomplete. Continue anyway?"; +const char * const MSG_FILE_INCOMPLETE_LANG_TABLE[1] PROGMEM = { + MSG_FILE_INCOMPLETE_EN +}; + const char MSG_FILE_PRINTED_EN[] PROGMEM = "Done printing file"; const char * const MSG_FILE_PRINTED_LANG_TABLE[1] PROGMEM = { MSG_FILE_PRINTED_EN diff --git a/Firmware/language_all.h b/Firmware/language_all.h index 209c4954a..e4d512a7a 100644 --- a/Firmware/language_all.h +++ b/Firmware/language_all.h @@ -218,6 +218,8 @@ extern const char* const MSG_FILAMENT_LOADING_T2_LANG_TABLE[LANG_NUM]; #define MSG_FILAMENT_LOADING_T2 LANG_TABLE_SELECT(MSG_FILAMENT_LOADING_T2_LANG_TABLE) extern const char* const MSG_FILAMENT_LOADING_T3_LANG_TABLE[LANG_NUM]; #define MSG_FILAMENT_LOADING_T3 LANG_TABLE_SELECT(MSG_FILAMENT_LOADING_T3_LANG_TABLE) +extern const char* const MSG_FILE_INCOMPLETE_LANG_TABLE[1]; +#define MSG_FILE_INCOMPLETE LANG_TABLE_SELECT_EXPLICIT(MSG_FILE_INCOMPLETE_LANG_TABLE, 0) extern const char* const MSG_FILE_PRINTED_LANG_TABLE[1]; #define MSG_FILE_PRINTED LANG_TABLE_SELECT_EXPLICIT(MSG_FILE_PRINTED_LANG_TABLE, 0) extern const char* const MSG_FILE_SAVED_LANG_TABLE[1]; diff --git a/Firmware/language_en.h b/Firmware/language_en.h index 4e5e7b195..2251753e6 100644 --- a/Firmware/language_en.h +++ b/Firmware/language_en.h @@ -315,4 +315,5 @@ #define(length=17, lines=1) MSG_SORT_TIME "Sort: [Time]" #define(length=17, lines=1) MSG_SORT_ALPHA "Sort: [Alphabet]" #define(length=17, lines=1) MSG_SORT_NONE "Sort: [None]" -#define(length=20, lines=1) MSG_SORTING "Sorting files" \ No newline at end of file +#define(length=20, lines=1) MSG_SORTING "Sorting files" +#define MSG_FILE_INCOMPLETE "File incomplete. Continue anyway?" \ No newline at end of file diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index e44dbe855..39e235cc0 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -4964,17 +4964,61 @@ static void menu_action_setlang(unsigned char lang) { static void menu_action_function(menuFunc_t data) { (*data)(); } + +/*check_file() { + +}*/ + +static bool check_file(const char* filename) { + bool result = false; + card.openFile(filename, true); + card.getFileSize(); + //SERIAL_ECHOPGM("Filesize my:"); + //MYSERIAL.println(card.public_fileSize); + card.setIndex((card.public_fileSize) - 10000); + //SERIAL_ECHOPGM("Position:"); + //MYSERIAL.println(card.sdpos); + + while (!card.eof() && !result) { + //show_buffer(); + +// SERIAL_ECHOPGM("Position prior:"); +// MYSERIAL.println(card.sdpos); + card.sdprinting = true; + get_command(); + //result = search_end_command(); + result = check_commands(); + + +/* SERIAL_ECHOPGM("Position after:"); + MYSERIAL.println(card.sdpos); + SERIAL_ECHOPGM("Command find:"); + MYSERIAL.println(int(result));*/ + } + //empty_buffer(); + return result; +} + static void menu_action_sdfile(const char* filename, char* longFilename) -{ +{ loading_flag = false; char cmd[30]; char* c; + bool result = true; sprintf_P(cmd, PSTR("M23 %s"), filename); for (c = &cmd[4]; *c; c++) - *c = tolower(*c); - enquecommand(cmd); - enquecommand_P(PSTR("M24")); - lcd_return_to_status(); + *c = tolower(*c); + if (!check_file(filename)) { + result = lcd_show_fullscreen_message_yes_no_and_wait_P(MSG_FILE_INCOMPLETE, false, false); + lcd_update_enable(true); + } + + if (!result) lcd_return_to_status(); + else { + enquecommand(cmd); + enquecommand_P(PSTR("M24")); + lcd_return_to_status(); + } } static void menu_action_sddirectory(const char* filename, char* longFilename) { From 34a1a4d4c704040f10cdea23024f1f64ca170f64 Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Mon, 11 Sep 2017 11:27:32 +0200 Subject: [PATCH 22/37] messages corrected --- Firmware/language_all.cpp | 6 +++--- Firmware/language_en.h | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Firmware/language_all.cpp b/Firmware/language_all.cpp index 03a4eac69..87919bf07 100644 --- a/Firmware/language_all.cpp +++ b/Firmware/language_all.cpp @@ -3547,17 +3547,17 @@ const char * const MSG_WIZARD_WELCOME_LANG_TABLE[1] PROGMEM = { MSG_WIZARD_WELCOME_EN }; -const char MSG_WIZARD_WILL_PREHEAT_EN[] PROGMEM = "No I will preheat nozzle for PLA."; +const char MSG_WIZARD_WILL_PREHEAT_EN[] PROGMEM = "Now I will preheat nozzle for PLA."; const char * const MSG_WIZARD_WILL_PREHEAT_LANG_TABLE[1] PROGMEM = { MSG_WIZARD_WILL_PREHEAT_EN }; -const char MSG_WIZARD_XYZ_CAL_EN[] PROGMEM = "I will run xyz calibration now\x85 It will take approx. 12 mins."; +const char MSG_WIZARD_XYZ_CAL_EN[] PROGMEM = "I will run xyz calibration now. It will take approx. 12 mins."; const char * const MSG_WIZARD_XYZ_CAL_LANG_TABLE[1] PROGMEM = { MSG_WIZARD_XYZ_CAL_EN }; -const char MSG_WIZARD_Z_CAL_EN[] PROGMEM = "I will run z calibration now\x85"; +const char MSG_WIZARD_Z_CAL_EN[] PROGMEM = "I will run z calibration now."; const char * const MSG_WIZARD_Z_CAL_LANG_TABLE[1] PROGMEM = { MSG_WIZARD_Z_CAL_EN }; diff --git a/Firmware/language_en.h b/Firmware/language_en.h index b97c49b49..a8112ac78 100644 --- a/Firmware/language_en.h +++ b/Firmware/language_en.h @@ -322,10 +322,10 @@ #define MSG_WIZARD_QUIT "You can always resume the Wizard from Calibration -> Wizard." #define MSG_WIZARD_SELFTEST "First, I will run the selftest to check most common assembly problems." #define MSG_WIZARD_CALIBRATION_FAILED "Please check our handbook and fix the problem. Then resume the Wizard by rebooting the printer." -#define MSG_WIZARD_XYZ_CAL "I will run xyz calibration now… It will take approx. 12 mins." +#define MSG_WIZARD_XYZ_CAL "I will run xyz calibration now. It will take approx. 12 mins." #define MSG_WIZARD_FILAMENT_LOADED "Is filament loaded?" -#define MSG_WIZARD_Z_CAL "I will run z calibration now…" -#define MSG_WIZARD_WILL_PREHEAT "No I will preheat nozzle for PLA." +#define MSG_WIZARD_Z_CAL "I will run z calibration now." +#define MSG_WIZARD_WILL_PREHEAT "Now I will preheat nozzle for PLA." #define MSG_WIZARD_HEATING "Preheating nozzle. Please wait." #define MSG_WIZARD_V2_CAL "Now I will calibrate distance between tip of the nozzle and heatbed surface." #define MSG_WIZARD_V2_CAL_2 "I will start to print line and you will gradually lower the nozzle by rotating the knob, until you reach optimal height. Check the pictures in our handbook in chapter Calibration." From fe04b9f467fe62eecda79d63e426ec9230ad7fc1 Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Mon, 11 Sep 2017 14:42:23 +0200 Subject: [PATCH 23/37] cleanup --- Firmware/Marlin.h | 5 +---- Firmware/Marlin_main.cpp | 28 +++------------------------- Firmware/ultralcd.cpp | 24 +++--------------------- 3 files changed, 7 insertions(+), 50 deletions(-) diff --git a/Firmware/Marlin.h b/Firmware/Marlin.h index bfb940ef4..deda0421d 100644 --- a/Firmware/Marlin.h +++ b/Firmware/Marlin.h @@ -356,7 +356,4 @@ void temp_compensation_start(); void wait_for_heater(long codenum); void serialecho_temperatures(); void proc_commands(); -bool check_commands(); -bool search_end_command(); -void empty_buffer(); -void show_buffer(); \ No newline at end of file +bool check_commands(); \ No newline at end of file diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 79d6c3b73..229789f64 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -1406,33 +1406,20 @@ void proc_commands() { } bool check_commands() { - bool ret = false; + bool end_command_found = false; if (buflen) { - //SERIAL_ECHOLNPGM("search_end "); - ret = search_end_command(); + if ((code_seen("M84")) || (code_seen("M 84"))) end_command_found = true; if (!cmdbuffer_front_already_processed) cmdqueue_pop_front(); cmdbuffer_front_already_processed = false; } - return ret; -} - -void show_buffer() { - SERIAL_ECHOPGM("bufindr:"); - MYSERIAL.println(bufindr); - SERIAL_ECHOPGM("bufindw:"); - MYSERIAL.println(bufindw); -} - -void empty_buffer() { - bufindr = bufindw; + return end_command_found; } void get_command() { - //show_buffer(); // Test and reserve space for the new command string. if (!cmdqueue_could_enqueue_back(MAX_CMD_SIZE - 1)) return; @@ -2103,15 +2090,6 @@ void ramming() { } */ -bool search_end_command() -{ - //SERIAL_ECHOLNPGM("E"); - bool return_value = false; - if (code_seen("M84")) return_value = true; - return return_value; - -} - void process_commands() { #ifdef FILAMENT_RUNOUT_SUPPORT diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 39e235cc0..ecd1c587e 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -4965,37 +4965,19 @@ static void menu_action_function(menuFunc_t data) { (*data)(); } -/*check_file() { - -}*/ - static bool check_file(const char* filename) { bool result = false; card.openFile(filename, true); card.getFileSize(); - //SERIAL_ECHOPGM("Filesize my:"); - //MYSERIAL.println(card.public_fileSize); - card.setIndex((card.public_fileSize) - 10000); - //SERIAL_ECHOPGM("Position:"); - //MYSERIAL.println(card.sdpos); + if (card.public_fileSize > END_FILE_SECTION) { + card.setIndex((card.public_fileSize) - END_FILE_SECTION); + } while (!card.eof() && !result) { - //show_buffer(); - -// SERIAL_ECHOPGM("Position prior:"); -// MYSERIAL.println(card.sdpos); card.sdprinting = true; get_command(); - //result = search_end_command(); result = check_commands(); - - -/* SERIAL_ECHOPGM("Position after:"); - MYSERIAL.println(card.sdpos); - SERIAL_ECHOPGM("Command find:"); - MYSERIAL.println(int(result));*/ } - //empty_buffer(); return result; } From 7d7b617442ff6d6bf9a68c4a5300d646f3145de6 Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Mon, 11 Sep 2017 16:11:49 +0200 Subject: [PATCH 24/37] linear advance using allowed in config file, version changed --- Firmware/Configuration.h | 2 +- Firmware/Configuration_adv.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Firmware/Configuration.h b/Firmware/Configuration.h index 6f14080dc..8e248e563 100644 --- a/Firmware/Configuration.h +++ b/Firmware/Configuration.h @@ -5,7 +5,7 @@ #include "Configuration_prusa.h" // Firmware version -#define FW_version "3.0.12-6" +#define FW_version "3.0.12-7" #define FW_PRUSA3D_MAGIC "PRUSA3DFW" #define FW_PRUSA3D_MAGIC_LEN 10 diff --git a/Firmware/Configuration_adv.h b/Firmware/Configuration_adv.h index 455eb5c18..4f3a71c49 100644 --- a/Firmware/Configuration_adv.h +++ b/Firmware/Configuration_adv.h @@ -323,7 +323,7 @@ * K=0 means advance disabled. * See Marlin documentation for calibration instructions. */ -//#define LIN_ADVANCE +#define LIN_ADVANCE #ifdef LIN_ADVANCE #define LIN_ADVANCE_K 0 //Try around 45 for PLA, around 25 for ABS. From 26cd35a8cb56a07bb3ae95b0593ecb30f191a28b Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Mon, 11 Sep 2017 17:31:06 +0200 Subject: [PATCH 25/37] reverting few changes, --- Firmware/Marlin_main.cpp | 26 +++++++++++++------------- Firmware/cardreader.cpp | 2 +- Firmware/cardreader.h | 3 +-- 3 files changed, 15 insertions(+), 16 deletions(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 229789f64..4b2e30b08 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -1405,19 +1405,6 @@ void proc_commands() { } } -bool check_commands() { - bool end_command_found = false; - - if (buflen) - { - if ((code_seen("M84")) || (code_seen("M 84"))) end_command_found = true; - if (!cmdbuffer_front_already_processed) - cmdqueue_pop_front(); - cmdbuffer_front_already_processed = false; - } - return end_command_found; -} - void get_command() { // Test and reserve space for the new command string. @@ -1905,6 +1892,19 @@ static float probe_pt(float x, float y, float z_before) { } #endif // LIN_ADVANCE +bool check_commands() { + bool end_command_found = false; + + if (buflen) + { + if ((code_seen("M84")) || (code_seen("M 84"))) end_command_found = true; + if (!cmdbuffer_front_already_processed) + cmdqueue_pop_front(); + cmdbuffer_front_already_processed = false; + } + return end_command_found; +} + void homeaxis(int axis) { #define HOMEAXIS_DO(LETTER) \ ((LETTER##_MIN_PIN > -1 && LETTER##_HOME_DIR==-1) || (LETTER##_MAX_PIN > -1 && LETTER##_HOME_DIR==1)) diff --git a/Firmware/cardreader.cpp b/Firmware/cardreader.cpp index b37b42233..59116f919 100644 --- a/Firmware/cardreader.cpp +++ b/Firmware/cardreader.cpp @@ -970,7 +970,7 @@ void CardReader::printingHasFinished() if(SD_FINISHED_STEPPERRELEASE) { //finishAndDisableSteppers(); - //enquecommand_P(PSTR(SD_FINISHED_RELEASECOMMAND)); + enquecommand_P(PSTR(SD_FINISHED_RELEASECOMMAND)); } autotempShutdown(); #ifdef SDCARD_SORT_ALPHA diff --git a/Firmware/cardreader.h b/Firmware/cardreader.h index ccc8df3f6..ec6c00728 100644 --- a/Firmware/cardreader.h +++ b/Firmware/cardreader.h @@ -74,7 +74,6 @@ public: char longFilename[LONG_FILENAME_LENGTH]; bool filenameIsDir; int lastnr; //last number of the autostart; - uint32_t sdpos; private: SdFile root,*curDir,workDir,workDirParents[MAX_DIR_DEPTH]; uint16_t workDirDepth; @@ -136,7 +135,7 @@ private: uint32_t filesize; //int16_t n; unsigned long autostart_atmillis; - //uint32_t sdpos ; + uint32_t sdpos ; bool autostart_stilltocheck; //the sd start is delayed, because otherwise the serial cannot answer fast enought to make contact with the hostsoftware. From 77937ab4bbe63d9395f9a7ce5738c202374a831e Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Tue, 12 Sep 2017 17:34:28 +0200 Subject: [PATCH 26/37] wizard :checking if PLA is loaded, user can repeat v2 cal., M117 and M1 hotfix --- Firmware/Marlin_main.cpp | 16 +++++++++---- Firmware/language_all.cpp | 30 ++++++++++++++++++++++++ Firmware/language_all.h | 12 ++++++++++ Firmware/language_en.h | 8 ++++++- Firmware/ultralcd.cpp | 49 ++++++++++++++++++++++++++++++++++----- 5 files changed, 104 insertions(+), 11 deletions(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index f048360f8..6bee0ae29 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -2318,10 +2318,14 @@ void process_commands() KEEPALIVE_STATE(IN_HANDLER); if (code_seen("M117")) { //moved to highest priority place to be able to to print strings which includes "G", "PRUSA" and "^" + custom_message = true; + custom_message_type = 2; starpos = (strchr(strchr_pointer + 5, '*')); if (starpos != NULL) *(starpos) = '\0'; lcd_setstatus(strchr_pointer + 5); + custom_message = false; + custom_message_type = 0; } else if(code_seen("PRUSA")){ if (code_seen("Ping")) { //PRUSA Ping @@ -3716,9 +3720,11 @@ void process_commands() 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; + custom_message = true; + custom_message_type = 2; - codenum = 0; + char *src = strchr_pointer + 2; + codenum = 0; bool hasP = false, hasS = false; if (code_seen('P')) { @@ -3744,7 +3750,7 @@ void process_commands() if (codenum > 0){ codenum += millis(); // keep track of when we started waiting KEEPALIVE_STATE(PAUSED_FOR_USER); - while(millis() < codenum && !lcd_clicked()){ + while(millis() < codenum && !lcd_clicked()){ manage_heater(); manage_inactivity(true); lcd_update(); @@ -3766,7 +3772,9 @@ void process_commands() LCD_MESSAGERPGM(MSG_RESUMING); else LCD_MESSAGERPGM(WELCOME_MSG); - } + custom_message = false; + custom_message_type = 0; + } break; #endif case 17: diff --git a/Firmware/language_all.cpp b/Firmware/language_all.cpp index 87919bf07..e947bc289 100644 --- a/Firmware/language_all.cpp +++ b/Firmware/language_all.cpp @@ -2097,6 +2097,16 @@ const char * const MSG_PLANNER_BUFFER_BYTES_LANG_TABLE[1] PROGMEM = { MSG_PLANNER_BUFFER_BYTES_EN }; +const char MSG_PLA_FILAMENT_LOADED_EN[] PROGMEM = "Is PLA filament loaded?"; +const char * const MSG_PLA_FILAMENT_LOADED_LANG_TABLE[1] PROGMEM = { + MSG_PLA_FILAMENT_LOADED_EN +}; + +const char MSG_PLEASE_LOAD_PLA_EN[] PROGMEM = "Please load PLA filament first."; +const char * const MSG_PLEASE_LOAD_PLA_LANG_TABLE[1] PROGMEM = { + MSG_PLEASE_LOAD_PLA_EN +}; + const char MSG_PLEASE_WAIT_EN[] PROGMEM = "Please wait"; const char MSG_PLEASE_WAIT_CZ[] PROGMEM = "Prosim cekejte"; const char MSG_PLEASE_WAIT_IT[] PROGMEM = "Aspetta"; @@ -3492,6 +3502,11 @@ const char * const MSG_WIZARD_CALIBRATION_FAILED_LANG_TABLE[1] PROGMEM = { MSG_WIZARD_CALIBRATION_FAILED_EN }; +const char MSG_WIZARD_CLEAN_HEATBED_EN[] PROGMEM = "Please clean heatbed and then press the knob."; +const char * const MSG_WIZARD_CLEAN_HEATBED_LANG_TABLE[1] PROGMEM = { + MSG_WIZARD_CLEAN_HEATBED_EN +}; + const char MSG_WIZARD_DONE_EN[] PROGMEM = "All is done. Happy printing!"; const char * const MSG_WIZARD_DONE_LANG_TABLE[1] PROGMEM = { MSG_WIZARD_DONE_EN @@ -3507,6 +3522,11 @@ const char * const MSG_WIZARD_HEATING_LANG_TABLE[1] PROGMEM = { MSG_WIZARD_HEATING_EN }; +const char MSG_WIZARD_INSERT_CORRECT_FILAMENT_EN[] PROGMEM = "Please load PLA filament and then resume Wizard by rebooting the printer."; +const char * const MSG_WIZARD_INSERT_CORRECT_FILAMENT_LANG_TABLE[1] PROGMEM = { + MSG_WIZARD_INSERT_CORRECT_FILAMENT_EN +}; + const char MSG_WIZARD_LANGUAGE_EN[] PROGMEM = "Please choose your language"; const char * const MSG_WIZARD_LANGUAGE_LANG_TABLE[1] PROGMEM = { MSG_WIZARD_LANGUAGE_EN @@ -3517,11 +3537,21 @@ const char * const MSG_WIZARD_LOAD_FILAMENT_LANG_TABLE[1] PROGMEM = { MSG_WIZARD_LOAD_FILAMENT_EN }; +const char MSG_WIZARD_PLA_FILAMENT_EN[] PROGMEM = "Is it PLA filament?"; +const char * const MSG_WIZARD_PLA_FILAMENT_LANG_TABLE[1] PROGMEM = { + MSG_WIZARD_PLA_FILAMENT_EN +}; + const char MSG_WIZARD_QUIT_EN[] PROGMEM = "You can always resume the Wizard from Calibration -> Wizard."; const char * const MSG_WIZARD_QUIT_LANG_TABLE[1] PROGMEM = { MSG_WIZARD_QUIT_EN }; +const char MSG_WIZARD_REPEAT_V2_CAL_EN[] PROGMEM = "Do you want to repeat last step to readjust distance between nozzle and heatbed?"; +const char * const MSG_WIZARD_REPEAT_V2_CAL_LANG_TABLE[1] PROGMEM = { + MSG_WIZARD_REPEAT_V2_CAL_EN +}; + const char MSG_WIZARD_RERUN_EN[] PROGMEM = "Running Wizard will delete current calibration results and start from the beginning. Continue?"; const char * const MSG_WIZARD_RERUN_LANG_TABLE[1] PROGMEM = { MSG_WIZARD_RERUN_EN diff --git a/Firmware/language_all.h b/Firmware/language_all.h index 012e24d9e..8a951d299 100644 --- a/Firmware/language_all.h +++ b/Firmware/language_all.h @@ -396,6 +396,10 @@ extern const char* const MSG_PINDA_PREHEAT_LANG_TABLE[LANG_NUM]; #define MSG_PINDA_PREHEAT LANG_TABLE_SELECT(MSG_PINDA_PREHEAT_LANG_TABLE) extern const char* const MSG_PLANNER_BUFFER_BYTES_LANG_TABLE[1]; #define MSG_PLANNER_BUFFER_BYTES LANG_TABLE_SELECT_EXPLICIT(MSG_PLANNER_BUFFER_BYTES_LANG_TABLE, 0) +extern const char* const MSG_PLA_FILAMENT_LOADED_LANG_TABLE[1]; +#define MSG_PLA_FILAMENT_LOADED LANG_TABLE_SELECT_EXPLICIT(MSG_PLA_FILAMENT_LOADED_LANG_TABLE, 0) +extern const char* const MSG_PLEASE_LOAD_PLA_LANG_TABLE[1]; +#define MSG_PLEASE_LOAD_PLA LANG_TABLE_SELECT_EXPLICIT(MSG_PLEASE_LOAD_PLA_LANG_TABLE, 0) extern const char* const MSG_PLEASE_WAIT_LANG_TABLE[LANG_NUM]; #define MSG_PLEASE_WAIT LANG_TABLE_SELECT(MSG_PLEASE_WAIT_LANG_TABLE) extern const char* const MSG_POSITION_UNKNOWN_LANG_TABLE[1]; @@ -646,18 +650,26 @@ extern const char* const MSG_WIZARD_LANG_TABLE[1]; #define MSG_WIZARD LANG_TABLE_SELECT_EXPLICIT(MSG_WIZARD_LANG_TABLE, 0) extern const char* const MSG_WIZARD_CALIBRATION_FAILED_LANG_TABLE[1]; #define MSG_WIZARD_CALIBRATION_FAILED LANG_TABLE_SELECT_EXPLICIT(MSG_WIZARD_CALIBRATION_FAILED_LANG_TABLE, 0) +extern const char* const MSG_WIZARD_CLEAN_HEATBED_LANG_TABLE[1]; +#define MSG_WIZARD_CLEAN_HEATBED LANG_TABLE_SELECT_EXPLICIT(MSG_WIZARD_CLEAN_HEATBED_LANG_TABLE, 0) extern const char* const MSG_WIZARD_DONE_LANG_TABLE[1]; #define MSG_WIZARD_DONE LANG_TABLE_SELECT_EXPLICIT(MSG_WIZARD_DONE_LANG_TABLE, 0) extern const char* const MSG_WIZARD_FILAMENT_LOADED_LANG_TABLE[1]; #define MSG_WIZARD_FILAMENT_LOADED LANG_TABLE_SELECT_EXPLICIT(MSG_WIZARD_FILAMENT_LOADED_LANG_TABLE, 0) extern const char* const MSG_WIZARD_HEATING_LANG_TABLE[1]; #define MSG_WIZARD_HEATING LANG_TABLE_SELECT_EXPLICIT(MSG_WIZARD_HEATING_LANG_TABLE, 0) +extern const char* const MSG_WIZARD_INSERT_CORRECT_FILAMENT_LANG_TABLE[1]; +#define MSG_WIZARD_INSERT_CORRECT_FILAMENT LANG_TABLE_SELECT_EXPLICIT(MSG_WIZARD_INSERT_CORRECT_FILAMENT_LANG_TABLE, 0) extern const char* const MSG_WIZARD_LANGUAGE_LANG_TABLE[1]; #define MSG_WIZARD_LANGUAGE LANG_TABLE_SELECT_EXPLICIT(MSG_WIZARD_LANGUAGE_LANG_TABLE, 0) extern const char* const MSG_WIZARD_LOAD_FILAMENT_LANG_TABLE[1]; #define MSG_WIZARD_LOAD_FILAMENT LANG_TABLE_SELECT_EXPLICIT(MSG_WIZARD_LOAD_FILAMENT_LANG_TABLE, 0) +extern const char* const MSG_WIZARD_PLA_FILAMENT_LANG_TABLE[1]; +#define MSG_WIZARD_PLA_FILAMENT LANG_TABLE_SELECT_EXPLICIT(MSG_WIZARD_PLA_FILAMENT_LANG_TABLE, 0) extern const char* const MSG_WIZARD_QUIT_LANG_TABLE[1]; #define MSG_WIZARD_QUIT LANG_TABLE_SELECT_EXPLICIT(MSG_WIZARD_QUIT_LANG_TABLE, 0) +extern const char* const MSG_WIZARD_REPEAT_V2_CAL_LANG_TABLE[1]; +#define MSG_WIZARD_REPEAT_V2_CAL LANG_TABLE_SELECT_EXPLICIT(MSG_WIZARD_REPEAT_V2_CAL_LANG_TABLE, 0) extern const char* const MSG_WIZARD_RERUN_LANG_TABLE[1]; #define MSG_WIZARD_RERUN LANG_TABLE_SELECT_EXPLICIT(MSG_WIZARD_RERUN_LANG_TABLE, 0) extern const char* const MSG_WIZARD_SELFTEST_LANG_TABLE[1]; diff --git a/Firmware/language_en.h b/Firmware/language_en.h index a8112ac78..25209b417 100644 --- a/Firmware/language_en.h +++ b/Firmware/language_en.h @@ -323,7 +323,7 @@ #define MSG_WIZARD_SELFTEST "First, I will run the selftest to check most common assembly problems." #define MSG_WIZARD_CALIBRATION_FAILED "Please check our handbook and fix the problem. Then resume the Wizard by rebooting the printer." #define MSG_WIZARD_XYZ_CAL "I will run xyz calibration now. It will take approx. 12 mins." -#define MSG_WIZARD_FILAMENT_LOADED "Is filament loaded?" +#define MSG_WIZARD_FILAMENT_LOADED "Is filament loaded?" #define MSG_WIZARD_Z_CAL "I will run z calibration now." #define MSG_WIZARD_WILL_PREHEAT "Now I will preheat nozzle for PLA." #define MSG_WIZARD_HEATING "Preheating nozzle. Please wait." @@ -333,3 +333,9 @@ #define MSG_WIZARD_DONE "All is done. Happy printing!" #define MSG_WIZARD_LOAD_FILAMENT "Please insert PLA filament to the extruder, then press knob to load it." #define MSG_WIZARD_RERUN "Running Wizard will delete current calibration results and start from the beginning. Continue?" +#define MSG_WIZARD_REPEAT_V2_CAL "Do you want to repeat last step to readjust distance between nozzle and heatbed?" +#define MSG_WIZARD_CLEAN_HEATBED "Please clean heatbed and then press the knob." +#define MSG_WIZARD_PLA_FILAMENT "Is it PLA filament?" +#define MSG_WIZARD_INSERT_CORRECT_FILAMENT "Please load PLA filament and then resume Wizard by rebooting the printer." +#define MSG_PLA_FILAMENT_LOADED "Is PLA filament loaded?" +#define MSG_PLEASE_LOAD_PLA "Please load PLA filament first." \ No newline at end of file diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 35c73a550..4f19bcf7f 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -687,7 +687,7 @@ void lcd_commands() lcd_commands_step = 0; lcd_commands_type = 0; if (eeprom_read_byte((uint8_t*)EEPROM_WIZARD_ACTIVE) == 1) { - lcd_wizard(9); + lcd_wizard(10); } } @@ -2789,7 +2789,21 @@ void lcd_toshiba_flash_air_compatibility_toggle() } void lcd_v2_calibration() { - lcd_commands_type = LCD_COMMAND_V2_CAL; + bool loaded = lcd_show_fullscreen_message_yes_no_and_wait_P(MSG_PLA_FILAMENT_LOADED, true, false); + if (loaded) lcd_commands_type = LCD_COMMAND_V2_CAL; + else { + lcd_display_message_fullscreen_P(MSG_PLEASE_LOAD_PLA); + for (int i = 0; i < 20; i++) { //wait max. 2s + delay_keep_alive(100); + if (lcd_clicked()) { + while (lcd_clicked()); + delay(10); + while (lcd_clicked()); + break; + } + } + } + lcd_update_enable(true); lcd_return_to_status(); } @@ -2891,15 +2905,33 @@ void lcd_wizard(int state) { lcd_print_at_PGM(0,2,MSG_LOADING_FILAMENT); loading_flag = true; gcode_M701(); - state = 8; + state = 9; break; case 8: + wizard_event = lcd_show_fullscreen_message_yes_no_and_wait_P(MSG_WIZARD_PLA_FILAMENT, false, true); + if (wizard_event) state = 9; + else end = true; + break; + case 9: lcd_show_fullscreen_message_and_wait_P(MSG_WIZARD_V2_CAL); lcd_show_fullscreen_message_and_wait_P(MSG_WIZARD_V2_CAL_2); lcd_commands_type = LCD_COMMAND_V2_CAL; end = true; break; - case 9: //we are finished + case 10: //repeat firt layer cal.? + wizard_event = lcd_show_multiscreen_message_yes_no_and_wait_P(MSG_WIZARD_REPEAT_V2_CAL, false); + if (wizard_event) { + current_position[Z_AXIS] += 100; + plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], homing_feedrate[Z_AXIS]/60, active_extruder); + current_position[Y_AXIS] = 205; + plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], homing_feedrate[Y_AXIS]/60, active_extruder); + lcd_show_fullscreen_message_and_wait_P(MSG_WIZARD_CLEAN_HEATBED); + state = 9; + } + else { + state = 11; + } + case 11: //we are finished eeprom_write_byte((uint8_t*)EEPROM_WIZARD_ACTIVE, 0); end = true; break; @@ -2923,10 +2955,15 @@ void lcd_wizard(int state) { break; case 3: //xyz cal. msg = MSG_WIZARD_CALIBRATION_FAILED; + break; case 4: //z cal. msg = MSG_WIZARD_CALIBRATION_FAILED; - case 8: break; //exit wizard for v2 calibration, which is implemted in lcd_commands (we need lcd_update running) - case 9: //we are finished + break; + case 8: + msg = MSG_WIZARD_INSERT_CORRECT_FILAMENT; + break; + case 9: break; //exit wizard for v2 calibration, which is implemted in lcd_commands (we need lcd_update running) + case 11: //we are finished msg = MSG_WIZARD_DONE; lcd_reset_alert_level(); From 7e7a562ee0b87dc11776f26ef8518135c9724828 Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Wed, 13 Sep 2017 11:49:54 +0200 Subject: [PATCH 27/37] v2 cal. for multi material added, "Is PLA filament loaded?" question added when run v2 cal. from menu --- Firmware/ultralcd.cpp | 158 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 151 insertions(+), 7 deletions(-) diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 4f19bcf7f..1acee81c7 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -589,6 +589,146 @@ void lcd_commands() lcd_commands_step = 3; } } +#ifdef SNMM + if (lcd_commands_type == LCD_COMMAND_V2_CAL) + { + lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS; + if (lcd_commands_step == 0) + { + lcd_commands_step = 6; + } + if (lcd_commands_step == 6 && !blocks_queued() && cmd_buffer_empty()) + { + enquecommand_P(PSTR("M107")); + enquecommand_P(PSTR("M104 S210")); + enquecommand_P(PSTR("M140 S55")); + enquecommand_P(PSTR("M190 S55")); + enquecommand_P(PSTR("M109 S210")); + enquecommand_P(PSTR("T0")); + enquecommand_P(PSTR("M117 First layer cal.")); + enquecommand_P(PSTR("G87")); //sets calibration status + enquecommand_P(PSTR("G28")); + enquecommand_P(PSTR("G21")); //set units to millimeters + enquecommand_P(PSTR("G90")); //use absolute coordinates + enquecommand_P(PSTR("M83")); //use relative distances for extrusion + enquecommand_P(PSTR("G92 E0")); + enquecommand_P(PSTR("M203 E100")); + enquecommand_P(PSTR("M92 E140")); + lcd_commands_step = 5; + } + if (lcd_commands_step == 5 && !blocks_queued() && cmd_buffer_empty()) + { + lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS; + enquecommand_P(PSTR("G1 Z0.250 F7200.000")); + enquecommand_P(PSTR("G1 X50.0 E80.0 F1000.0)); + nquecommand_P(PSTR("G1 X160.0 E20.0 F1000.0)); + enquecommand_P(PSTR("G1 Z0.200 F7200.000)); + enquecommand_P(PSTR("G1 X220.0 E13 F1000.0")); + enquecommand_P(PSTR("G1 X240.0 E0 F1000.0")); + enquecommand_P(PSTR("G92 E0.0")); + enquecommand_P(PSTR("G21")); + enquecommand_P(PSTR("G90")); + enquecommand_P(PSTR("M83")); + enquecommand_P(PSTR("G1 E-4 F2100.00000")); + enquecommand_P(PSTR("G1 Z0.150 F7200.000")); + enquecommand_P(PSTR("M204 S1000")); + enquecommand_P(PSTR("G1 F4000")); + + lcd_implementation_clear(); + lcd_goto_menu(lcd_babystep_z, 0, false); + + + lcd_commands_step = 4; + } + if (lcd_commands_step == 4 && !blocks_queued() && cmd_buffer_empty()) //draw meander + { + lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS; + + + enquecommand_P(PSTR("G1 X50 Y155")); + enquecommand_P(PSTR("G1 X60 Y155 E4")); + enquecommand_P(PSTR("G1 F1080")); + enquecommand_P(PSTR("G1 X75 Y155 E2.5")); + enquecommand_P(PSTR("G1 X100 Y155 E2")); + enquecommand_P(PSTR("G1 X200 Y155 E2.62773")); + enquecommand_P(PSTR("G1 X200 Y135 E0.66174")); + enquecommand_P(PSTR("G1 X50 Y135 E3.62773")); + enquecommand_P(PSTR("G1 X50 Y115 E0.49386")); + enquecommand_P(PSTR("G1 X200 Y115 E3.62773")); + enquecommand_P(PSTR("G1 X200 Y95 E0.49386")); + enquecommand_P(PSTR("G1 X50 Y95 E3.62773")); + enquecommand_P(PSTR("G1 X50 Y75 E0.49386")); + enquecommand_P(PSTR("G1 X200 Y75 E3.62773")); + enquecommand_P(PSTR("G1 X200 Y55 E0.49386")); + enquecommand_P(PSTR("G1 X50 Y55 E3.62773")); + enquecommand_P(PSTR("G1 E - 0.07500 F2100.00000")); + lcd_commands_step = 3; + } + + if (lcd_commands_step == 3 && !blocks_queued() && cmd_buffer_empty()) + { + lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS; + + enquecommand_P(PSTR("G4 S0")); + enquecommand_P(PSTR("G1 E-4 F2100.00000")); + enquecommand_P(PSTR("G1 Z0.5 F7200.000")); + enquecommand_P(PSTR("G1 X245 Y1")); + enquecommand_P(PSTR("G1 X240 E4")); + enquecommand_P(PSTR("G1 F4000")); + enquecommand_P(PSTR("G1 X190 E2.7")); + enquecommand_P(PSTR("G1 F4600")); + enquecommand_P(PSTR("G1 X110 E2.8")); + enquecommand_P(PSTR("G1 F5200")); + enquecommand_P(PSTR("G1 X40 E3")); + enquecommand_P(PSTR("G1 E-15.0000 F5000")); + enquecommand_P(PSTR("G1 E-50.0000 F5400")); + enquecommand_P(PSTR("G1 E-15.0000 F3000")); + enquecommand_P(PSTR("G1 E-12.0000 F2000")); + enquecommand_P(PSTR("G1 F1600")); + + lcd_commands_step = 2; + } + if (lcd_commands_step == 2 && !blocks_queued() && cmd_buffer_empty()) + { + lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS; + + enquecommand_P(PSTR("G1 X0 Y1 E3.0000")); + enquecommand_P(PSTR("G1 X50 Y1 E-5.0000")); + enquecommand_P(PSTR("G1 F2000")); + enquecommand_P(PSTR("G1 X0 Y1 E5.0000")); + enquecommand_P(PSTR("G1 X50 Y1 E-5.0000")); + enquecommand_P(PSTR("G1 F2400")); + enquecommand_P(PSTR("G1 X0 Y1 E5.0000")); + enquecommand_P(PSTR("G1 X50 Y1 E - 5.0000")); + enquecommand_P(PSTR("G1 F2400")); + enquecommand_P(PSTR("G1 X0 Y1 E5.0000")); + enquecommand_P(PSTR("G1 X50 Y1 E-3.0000")); + enquecommand_P(PSTR("G4 S0")); + enquecommand_P(PSTR("M107")); + enquecommand_P(PSTR("M104 S0")); + enquecommand_P(PSTR("M140 S0")); + enquecommand_P(PSTR("G1 X10 Y180 F4000")); + enquecommand_P(PSTR("G1 Z10 F1300.000")); + enquecommand_P(PSTR("M84")); + + lcd_commands_step = 1; + + } + + if (lcd_commands_step == 1 && !blocks_queued() && cmd_buffer_empty()) + { + lcd_setstatuspgm(WELCOME_MSG); + lcd_commands_step = 0; + lcd_commands_type = 0; + if (eeprom_read_byte((uint8_t*)EEPROM_WIZARD_ACTIVE) == 1) { + lcd_wizard(10); + } + } + + } + +#else //if not SNMM + if (lcd_commands_type == LCD_COMMAND_V2_CAL) { @@ -614,7 +754,7 @@ void lcd_commands() { lcd_implementation_clear(); - lcd_goto_menu(lcd_babystep_z, 0, false); + lcd_goto_menu(lcd_babystep_z, 0, false); enquecommand_P(PSTR("G1 X60.0 E9.0 F1000.0")); //intro line enquecommand_P(PSTR("G1 X100.0 E12.5 F1000.0")); //intro line enquecommand_P(PSTR("G92 E0.0")); @@ -630,8 +770,8 @@ void lcd_commands() if (lcd_commands_step == 3 && !blocks_queued() && cmd_buffer_empty()) //draw meander { lcd_timeoutToStatus = millis() + LCD_TIMEOUT_TO_STATUS; - - + + //just opposite direction /*enquecommand_P(PSTR("G1 X50 Y55")); enquecommand_P(PSTR("G1 F1080")); @@ -650,7 +790,7 @@ void lcd_commands() enquecommand_P(PSTR("G1 X50 Y155 E2.5")); enquecommand_P(PSTR("G1 E - 0.07500 F2100.00000"));*/ - + enquecommand_P(PSTR("G1 X50 Y155")); enquecommand_P(PSTR("G1 F1080")); enquecommand_P(PSTR("G1 X75 Y155 E2.5")); @@ -693,6 +833,8 @@ void lcd_commands() } +#endif // not SNMM + if (lcd_commands_type == LCD_COMMAND_STOP_PRINT) /// stop print { uint8_t stopped_extruder; @@ -2789,8 +2931,10 @@ void lcd_toshiba_flash_air_compatibility_toggle() } void lcd_v2_calibration() { - bool loaded = lcd_show_fullscreen_message_yes_no_and_wait_P(MSG_PLA_FILAMENT_LOADED, true, false); - if (loaded) lcd_commands_type = LCD_COMMAND_V2_CAL; + bool loaded = lcd_show_fullscreen_message_yes_no_and_wait_P(MSG_PLA_FILAMENT_LOADED, false, true); + if (loaded) { + lcd_commands_type = LCD_COMMAND_V2_CAL; + } else { lcd_display_message_fullscreen_P(MSG_PLEASE_LOAD_PLA); for (int i = 0; i < 20; i++) { //wait max. 2s @@ -2803,8 +2947,8 @@ void lcd_v2_calibration() { } } } - lcd_update_enable(true); lcd_return_to_status(); + lcd_update_enable(true); } void lcd_wizard() { From c3e01dd4495abca3b2382375ca39f9bfe7e12ea1 Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Wed, 13 Sep 2017 13:50:32 +0200 Subject: [PATCH 28/37] wizard: loading filament for SNMM, saving calibration status in xyz cal. updated --- Firmware/Marlin_main.cpp | 5 ++++- Firmware/ultralcd.cpp | 8 +++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 6bee0ae29..144b01d48 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -2242,8 +2242,11 @@ bool gcode_M45(bool onlyZ) { } } else { + //if wizard is active and selftest was succefully completed, we dont want to loose information about it + if (calibration_status() != 250 || eeprom_read_byte((uint8_t*)EEPROM_WIZARD_ACTIVE) == 0) { + calibration_status_store(CALIBRATION_STATUS_ASSEMBLED); + } // Reset the baby step value and the baby step applied flag. - calibration_status_store(CALIBRATION_STATUS_ASSEMBLED); eeprom_update_word((uint16_t*)EEPROM_BABYSTEP_Z, 0); // Complete XYZ calibration. uint8_t point_too_far_mask = 0; diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 1acee81c7..a839e753f 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -2968,8 +2968,6 @@ void lcd_wizard() { void lcd_wizard(int state) { - - bool end = false; int wizard_event; const char *msg = NULL; @@ -3048,6 +3046,9 @@ void lcd_wizard(int state) { lcd_implementation_clear(); lcd_print_at_PGM(0,2,MSG_LOADING_FILAMENT); loading_flag = true; +#ifdef SNMM + change_extr(0); +#endif gcode_M701(); state = 9; break; @@ -3062,7 +3063,7 @@ void lcd_wizard(int state) { lcd_commands_type = LCD_COMMAND_V2_CAL; end = true; break; - case 10: //repeat firt layer cal.? + case 10: //repeat first layer cal.? wizard_event = lcd_show_multiscreen_message_yes_no_and_wait_P(MSG_WIZARD_REPEAT_V2_CAL, false); if (wizard_event) { current_position[Z_AXIS] += 100; @@ -3075,6 +3076,7 @@ void lcd_wizard(int state) { else { state = 11; } + break; case 11: //we are finished eeprom_write_byte((uint8_t*)EEPROM_WIZARD_ACTIVE, 0); end = true; From 827a9ce6cb7e73b50da75e44c30b159c87260e65 Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Wed, 13 Sep 2017 15:41:19 +0200 Subject: [PATCH 29/37] added confirm character for messages which waits for user to press the knob --- Firmware/ultralcd.cpp | 31 ++++++++++++++----- .../ultralcd_implementation_hitachi_HD44780.h | 10 ++++++ 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index a839e753f..d2bcc13da 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -2096,13 +2096,13 @@ const char* lcd_display_message_fullscreen_P(const char *msg, uint8_t &nlines) } if (multi_screen) { - // Display the "next screen" indicator character. - // lcd_set_custom_characters_arrows(); - lcd_set_custom_characters_nextpage(); - lcd.setCursor(19, 3); + // Display the "next screen" indicator character. + // lcd_set_custom_characters_arrows(); + lcd_set_custom_characters_nextpage(); + lcd.setCursor(19, 3); // Display the down arrow. lcd.print(char(1)); - } + } nlines = row; return multi_screen ? msgend : NULL; @@ -2123,15 +2123,30 @@ void lcd_show_fullscreen_message_and_wait_P(const char *msg) while (lcd_clicked()) ; delay(10); while (lcd_clicked()) ; + lcd_set_custom_characters(); + lcd_update_enable(true); + lcd_update(2); KEEPALIVE_STATE(IN_HANDLER); return; } } if (multi_screen) { - if (msg_next == NULL) - msg_next = msg; + if (msg_next == NULL) + msg_next = msg; msg_next = lcd_display_message_fullscreen_P(msg_next); - } + if (msg_next == NULL) { + lcd_set_custom_characters_nextpage(); + lcd.setCursor(19, 3); + // Display the confirm char. + lcd.print(char(2)); + } + } + else { + lcd_set_custom_characters_nextpage(); + lcd.setCursor(19, 3); + // Display the confirm char. + lcd.print(char(2)); + } } } diff --git a/Firmware/ultralcd_implementation_hitachi_HD44780.h b/Firmware/ultralcd_implementation_hitachi_HD44780.h index ec360c626..f880da88c 100644 --- a/Firmware/ultralcd_implementation_hitachi_HD44780.h +++ b/Firmware/ultralcd_implementation_hitachi_HD44780.h @@ -491,8 +491,18 @@ void lcd_set_custom_characters_nextpage() B01010, B00100 }; + byte confirm[8] = { + B00000, + B00001, + B00011, + B10110, + B11100, + B01000, + B00000 + }; lcd.createChar(1, arrdown); + lcd.createChar(2, confirm); } void lcd_set_custom_characters_degree() From 0f8468bef29250b41de1e84b30b145e33aca53f5 Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Wed, 13 Sep 2017 16:57:53 +0200 Subject: [PATCH 30/37] comments added --- Firmware/Marlin_main.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 144b01d48..da848e0fa 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -2321,8 +2321,8 @@ void process_commands() KEEPALIVE_STATE(IN_HANDLER); if (code_seen("M117")) { //moved to highest priority place to be able to to print strings which includes "G", "PRUSA" and "^" - custom_message = true; - custom_message_type = 2; + custom_message = true; //fixes using M117 during SD print, but needs to be be updated in future + custom_message_type = 2; //fixes using M117 during SD print, but needs to be be updated in future starpos = (strchr(strchr_pointer + 5, '*')); if (starpos != NULL) *(starpos) = '\0'; @@ -3723,8 +3723,8 @@ void process_commands() case 0: // M0 - Unconditional stop - Wait for user button press on LCD case 1: // M1 - Conditional stop - Wait for user button press on LCD { - custom_message = true; - custom_message_type = 2; + custom_message = true; //fixes using M1 during SD print, but needs to be be updated in future + custom_message_type = 2; //fixes using M1 during SD print, but needs to be be updated in future char *src = strchr_pointer + 2; codenum = 0; @@ -3775,7 +3775,7 @@ void process_commands() LCD_MESSAGERPGM(MSG_RESUMING); else LCD_MESSAGERPGM(WELCOME_MSG); - custom_message = false; + custom_message = false; custom_message_type = 0; } break; From ff73fbc5627eb058bc1a667347d294c7852a1c4d Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Wed, 13 Sep 2017 18:38:46 +0200 Subject: [PATCH 31/37] code simplified --- Firmware/ultralcd.cpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index ecd1c587e..955e2d68c 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -4993,14 +4993,12 @@ static void menu_action_sdfile(const char* filename, char* longFilename) if (!check_file(filename)) { result = lcd_show_fullscreen_message_yes_no_and_wait_P(MSG_FILE_INCOMPLETE, false, false); lcd_update_enable(true); - } - - if (!result) lcd_return_to_status(); - else { + } + if (result) { enquecommand(cmd); - enquecommand_P(PSTR("M24")); - lcd_return_to_status(); + enquecommand_P(PSTR("M24")); } + lcd_return_to_status(); } static void menu_action_sddirectory(const char* filename, char* longFilename) { From 362ffa158587f697d6b4a45b635055d2a9f68b73 Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Wed, 13 Sep 2017 19:18:31 +0200 Subject: [PATCH 32/37] storing calibration status after v2 cal. changed, changed some axes moves during cal. proces --- Firmware/ultralcd.cpp | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index d2bcc13da..defa24cf9 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -3021,7 +3021,11 @@ void lcd_wizard(int state) { case 3: //xyz cal. lcd_show_fullscreen_message_and_wait_P(MSG_WIZARD_XYZ_CAL); wizard_event = gcode_M45(false); - if (wizard_event) state = 5; + if (wizard_event) { + current_position[Z_AXIS] += 100; //move in z axis to make space for loading filament + plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], homing_feedrate[Z_AXIS] / 60, active_extruder); + state = 5; + } else end = true; break; case 4: //z cal. @@ -3033,7 +3037,7 @@ void lcd_wizard(int state) { case 5: //is filament loaded? //start to preheat nozzle and bed to save some time later setTargetHotend(PLA_PREHEAT_HOTEND_TEMP, 0); - setTargetBed(PLA_PREHEAT_HPB_TEMP); + setTargetBed(PLA_PREHEAT_HPB_TEMP); wizard_event = lcd_show_fullscreen_message_yes_no_and_wait_P(MSG_WIZARD_FILAMENT_LOADED, false); if (wizard_event) state = 8; else state = 6; @@ -3081,10 +3085,7 @@ void lcd_wizard(int state) { case 10: //repeat first layer cal.? wizard_event = lcd_show_multiscreen_message_yes_no_and_wait_P(MSG_WIZARD_REPEAT_V2_CAL, false); if (wizard_event) { - current_position[Z_AXIS] += 100; - plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], homing_feedrate[Z_AXIS]/60, active_extruder); - current_position[Y_AXIS] = 205; - plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], homing_feedrate[Y_AXIS]/60, active_extruder); + calibration_status_store(CALIBRATION_STATUS_LIVE_ADJUST) lcd_show_fullscreen_message_and_wait_P(MSG_WIZARD_CLEAN_HEATBED); state = 9; } @@ -3136,7 +3137,7 @@ void lcd_wizard(int state) { break; } - if(state != 8) lcd_show_fullscreen_message_and_wait_P(msg); + if(state != 9) lcd_show_fullscreen_message_and_wait_P(msg); lcd_update_enable(true); lcd_return_to_status(); lcd_update(2); From 0a8572bfbe628e1f81eb48b91eb89482c5b09296 Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Thu, 14 Sep 2017 13:28:15 +0200 Subject: [PATCH 33/37] fullscreen message confirm char displayed imidiately, different changes in wizard --- Firmware/ultralcd.cpp | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index defa24cf9..9fa1759dc 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -2113,9 +2113,15 @@ void lcd_show_fullscreen_message_and_wait_P(const char *msg) const char *msg_next = lcd_display_message_fullscreen_P(msg); bool multi_screen = msg_next != NULL; + lcd_set_custom_characters_nextpage(); KEEPALIVE_STATE(PAUSED_FOR_USER); // Until confirmed by a button click. for (;;) { + if (!multi_screen) { + lcd.setCursor(19, 3); + // Display the confirm char. + lcd.print(char(2)); + } // Wait for 5 seconds before displaying the next text. for (uint8_t i = 0; i < 100; ++ i) { delay_keep_alive(50); @@ -2135,18 +2141,12 @@ void lcd_show_fullscreen_message_and_wait_P(const char *msg) msg_next = msg; msg_next = lcd_display_message_fullscreen_P(msg_next); if (msg_next == NULL) { - lcd_set_custom_characters_nextpage(); + lcd.setCursor(19, 3); // Display the confirm char. lcd.print(char(2)); } } - else { - lcd_set_custom_characters_nextpage(); - lcd.setCursor(19, 3); - // Display the confirm char. - lcd.print(char(2)); - } } } @@ -3005,7 +3005,7 @@ void lcd_wizard(int state) { case CALIBRATION_STATUS_XYZ_CALIBRATION: state = 3; break; //run xyz cal. case CALIBRATION_STATUS_Z_CALIBRATION: state = 4; break; //run z cal. case CALIBRATION_STATUS_LIVE_ADJUST: state = 5; break; //run live adjust - case CALIBRATION_STATUS_CALIBRATED: end = true; break; + case CALIBRATION_STATUS_CALIBRATED: end = true; eeprom_write_byte((uint8_t*)EEPROM_WIZARD_ACTIVE, 0); break; default: state = 2; break; //if calibration status is unknown, run wizard from the beginning } break; @@ -3021,17 +3021,13 @@ void lcd_wizard(int state) { case 3: //xyz cal. lcd_show_fullscreen_message_and_wait_P(MSG_WIZARD_XYZ_CAL); wizard_event = gcode_M45(false); - if (wizard_event) { - current_position[Z_AXIS] += 100; //move in z axis to make space for loading filament - plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], homing_feedrate[Z_AXIS] / 60, active_extruder); - state = 5; - } + if (wizard_event) state = 5; else end = true; break; case 4: //z cal. lcd_show_fullscreen_message_and_wait_P(MSG_WIZARD_Z_CAL); wizard_event = gcode_M45(true); - if (wizard_event) state = 9; //shipped, no need to set first layer, go to final message directly + if (wizard_event) state = 11; //shipped, no need to set first layer, go to final message directly else end = true; break; case 5: //is filament loaded? @@ -3044,6 +3040,8 @@ void lcd_wizard(int state) { break; case 6: //waiting for preheat nozzle for PLA; lcd_display_message_fullscreen_P(MSG_WIZARD_WILL_PREHEAT); + current_position[Z_AXIS] = 100; //move in z axis to make space for loading filament + plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], homing_feedrate[Z_AXIS] / 60, active_extruder); delay_keep_alive(2000); lcd_display_message_fullscreen_P(MSG_WIZARD_HEATING); while (abs(degHotend(0) - PLA_PREHEAT_HOTEND_TEMP) > 3) { @@ -3085,7 +3083,7 @@ void lcd_wizard(int state) { case 10: //repeat first layer cal.? wizard_event = lcd_show_multiscreen_message_yes_no_and_wait_P(MSG_WIZARD_REPEAT_V2_CAL, false); if (wizard_event) { - calibration_status_store(CALIBRATION_STATUS_LIVE_ADJUST) + calibration_status_store(CALIBRATION_STATUS_LIVE_ADJUST); lcd_show_fullscreen_message_and_wait_P(MSG_WIZARD_CLEAN_HEATBED); state = 9; } From 026e3ecaac7df98bdef466547027bfc0d4628444 Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Thu, 14 Sep 2017 14:21:16 +0200 Subject: [PATCH 34/37] getter function for filesize --- Firmware/cardreader.cpp | 4 ++-- Firmware/cardreader.h | 3 +-- Firmware/ultralcd.cpp | 7 ++++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Firmware/cardreader.cpp b/Firmware/cardreader.cpp index 59116f919..77c52a6b4 100644 --- a/Firmware/cardreader.cpp +++ b/Firmware/cardreader.cpp @@ -501,9 +501,9 @@ void CardReader::removeFile(char* name) } -void CardReader::getFileSize() +uint32_t CardReader::getFileSize() { - public_fileSize = filesize; + return filesize; } void CardReader::getStatus() diff --git a/Firmware/cardreader.h b/Firmware/cardreader.h index ec6c00728..dff3d263d 100644 --- a/Firmware/cardreader.h +++ b/Firmware/cardreader.h @@ -27,7 +27,7 @@ public: void release(); void startFileprint(); void pauseSDPrint(); - void getFileSize(); + uint32_t getFileSize(); void getStatus(); void printingHasFinished(); @@ -70,7 +70,6 @@ public: bool cardOK ; char filename[13]; uint16_t creationTime, creationDate; - uint32_t public_fileSize; char longFilename[LONG_FILENAME_LENGTH]; bool filenameIsDir; int lastnr; //last number of the autostart; diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 955e2d68c..c49dfe1fc 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -4967,10 +4967,11 @@ static void menu_action_function(menuFunc_t data) { static bool check_file(const char* filename) { bool result = false; + uint32_t filesize; card.openFile(filename, true); - card.getFileSize(); - if (card.public_fileSize > END_FILE_SECTION) { - card.setIndex((card.public_fileSize) - END_FILE_SECTION); + filesize = card.getFileSize(); + if (fileSize > END_FILE_SECTION) { + card.setIndex(filesize - END_FILE_SECTION); } while (!card.eof() && !result) { From 7cf8920c0a8803e24c5e99a82aee9621cb9e08ce Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Thu, 14 Sep 2017 14:41:51 +0200 Subject: [PATCH 35/37] typo fixed --- Firmware/ultralcd.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index c49dfe1fc..91b7bbb59 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -4970,7 +4970,7 @@ static bool check_file(const char* filename) { uint32_t filesize; card.openFile(filename, true); filesize = card.getFileSize(); - if (fileSize > END_FILE_SECTION) { + if (filesize > END_FILE_SECTION) { card.setIndex(filesize - END_FILE_SECTION); } From f9153d4417b2cb341f976f2f81bf8763a7cba963 Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Thu, 14 Sep 2017 15:27:01 +0200 Subject: [PATCH 36/37] dont enque M84 function at the end of print, changed to function; added defines to config files --- Firmware/cardreader.cpp | 4 ++-- Firmware/variants/1_75mm_MK1-RAMBo10a-E3Dv6full.h | 2 ++ Firmware/variants/1_75mm_MK1-RAMBo13a-E3Dv6full.h | 2 ++ .../variants/1_75mm_MK2-MultiMaterial-RAMBo10a-E3Dv6full.h | 2 ++ .../variants/1_75mm_MK2-MultiMaterial-RAMBo13a-E3Dv6full.h | 2 ++ Firmware/variants/1_75mm_MK2-RAMBo10a-E3Dv6full.h | 2 ++ Firmware/variants/1_75mm_MK2-RAMBo13a-E3Dv6full.h | 2 ++ 7 files changed, 14 insertions(+), 2 deletions(-) diff --git a/Firmware/cardreader.cpp b/Firmware/cardreader.cpp index 77c52a6b4..27100077c 100644 --- a/Firmware/cardreader.cpp +++ b/Firmware/cardreader.cpp @@ -969,8 +969,8 @@ void CardReader::printingHasFinished() sdprinting = false; if(SD_FINISHED_STEPPERRELEASE) { - //finishAndDisableSteppers(); - enquecommand_P(PSTR(SD_FINISHED_RELEASECOMMAND)); + finishAndDisableSteppers(); + //enquecommand_P(PSTR(SD_FINISHED_RELEASECOMMAND)); } autotempShutdown(); #ifdef SDCARD_SORT_ALPHA diff --git a/Firmware/variants/1_75mm_MK1-RAMBo10a-E3Dv6full.h b/Firmware/variants/1_75mm_MK1-RAMBo10a-E3Dv6full.h index ac0463370..27bece70c 100644 --- a/Firmware/variants/1_75mm_MK1-RAMBo10a-E3Dv6full.h +++ b/Firmware/variants/1_75mm_MK1-RAMBo10a-E3Dv6full.h @@ -403,4 +403,6 @@ THERMISTORS SETTINGS #define DEFAULT_RETRACTION 1 //used for PINDA temp calibration +#define END_FILE_SECTION 10000 //number of bytes from end of file used for checking if file is complete + #endif //__CONFIGURATION_PRUSA_H diff --git a/Firmware/variants/1_75mm_MK1-RAMBo13a-E3Dv6full.h b/Firmware/variants/1_75mm_MK1-RAMBo13a-E3Dv6full.h index bf748354b..e372831c4 100644 --- a/Firmware/variants/1_75mm_MK1-RAMBo13a-E3Dv6full.h +++ b/Firmware/variants/1_75mm_MK1-RAMBo13a-E3Dv6full.h @@ -403,4 +403,6 @@ THERMISTORS SETTINGS #define DEFAULT_RETRACTION 1 //used for PINDA temp calibration +#define END_FILE_SECTION 10000 //number of bytes from end of file used for checking if file is complete + #endif //__CONFIGURATION_PRUSA_H diff --git a/Firmware/variants/1_75mm_MK2-MultiMaterial-RAMBo10a-E3Dv6full.h b/Firmware/variants/1_75mm_MK2-MultiMaterial-RAMBo10a-E3Dv6full.h index 83917cb98..6093f8ac5 100644 --- a/Firmware/variants/1_75mm_MK2-MultiMaterial-RAMBo10a-E3Dv6full.h +++ b/Firmware/variants/1_75mm_MK2-MultiMaterial-RAMBo10a-E3Dv6full.h @@ -400,4 +400,6 @@ THERMISTORS SETTINGS #define DEFAULT_RETRACTION 1 //used for PINDA temp calibration and pause print #endif +#define END_FILE_SECTION 10000 //number of bytes from end of file used for checking if file is complete + #endif //__CONFIGURATION_PRUSA_H diff --git a/Firmware/variants/1_75mm_MK2-MultiMaterial-RAMBo13a-E3Dv6full.h b/Firmware/variants/1_75mm_MK2-MultiMaterial-RAMBo13a-E3Dv6full.h index fb3329db6..06ea61f83 100644 --- a/Firmware/variants/1_75mm_MK2-MultiMaterial-RAMBo13a-E3Dv6full.h +++ b/Firmware/variants/1_75mm_MK2-MultiMaterial-RAMBo13a-E3Dv6full.h @@ -402,4 +402,6 @@ THERMISTORS SETTINGS #define DEFAULT_RETRACTION 1 //used for PINDA temp calibration and pause print #endif +#define END_FILE_SECTION 10000 //number of bytes from end of file used for checking if file is complete + #endif //__CONFIGURATION_PRUSA_H diff --git a/Firmware/variants/1_75mm_MK2-RAMBo10a-E3Dv6full.h b/Firmware/variants/1_75mm_MK2-RAMBo10a-E3Dv6full.h index d42400dcc..fc89c0656 100644 --- a/Firmware/variants/1_75mm_MK2-RAMBo10a-E3Dv6full.h +++ b/Firmware/variants/1_75mm_MK2-RAMBo10a-E3Dv6full.h @@ -400,4 +400,6 @@ THERMISTORS SETTINGS #define DEFAULT_RETRACTION 1 //used for PINDA temp calibration and pause print #endif +#define END_FILE_SECTION 10000 //number of bytes from end of file used for checking if file is complete + #endif //__CONFIGURATION_PRUSA_H diff --git a/Firmware/variants/1_75mm_MK2-RAMBo13a-E3Dv6full.h b/Firmware/variants/1_75mm_MK2-RAMBo13a-E3Dv6full.h index 6c71bab92..5307ede95 100644 --- a/Firmware/variants/1_75mm_MK2-RAMBo13a-E3Dv6full.h +++ b/Firmware/variants/1_75mm_MK2-RAMBo13a-E3Dv6full.h @@ -402,4 +402,6 @@ THERMISTORS SETTINGS #define DEFAULT_RETRACTION 1 //used for PINDA temp calibration and pause print #endif +#define END_FILE_SECTION 10000 //number of bytes from end of file used for checking if file is complete + #endif //__CONFIGURATION_PRUSA_H From a3f49d7879e7b7d6fdebf151a5037d0471a3251c Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Thu, 14 Sep 2017 16:39:14 +0200 Subject: [PATCH 37/37] changed status in case that print is aborted --- Firmware/ultralcd.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 7d53e8bb4..f954b0dfb 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -4993,6 +4993,8 @@ static bool check_file(const char* filename) { get_command(); result = check_commands(); } + card.printingHasFinished(); + strncpy_P(lcd_status_message, WELCOME_MSG, LCD_WIDTH); return result; }