From 356bc403b151698f8776669dcaf91fcaed586ae5 Mon Sep 17 00:00:00 2001 From: Robert Pelnar <robert.pelnar@seznam.cz> Date: Wed, 13 Dec 2017 17:39:32 +0100 Subject: [PATCH 1/3] Automatic filament load when printer idle and preheated --- Firmware/Marlin_main.cpp | 39 +++++++++++++++++++++---------- Firmware/fsensor.cpp | 50 ++++++++++++++++++++++++++++++++++++++++ Firmware/fsensor.h | 11 +++++++++ 3 files changed, 88 insertions(+), 12 deletions(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index f495d7f7..99ab2eef 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -5556,21 +5556,17 @@ case 404: //M404 Enter the nominal filament width (3mm, 1.75mm ) N<3.0> or disp lcd_wait_interact(); //load_filament_time = millis(); KEEPALIVE_STATE(PAUSED_FOR_USER); - pat9125_update_y(); //update sensor - uint16_t y_old = pat9125_y; //save current y value - uint8_t change_cnt = 0; //reset number of changes counter +#ifdef PAT9125 + if (fsensor_M600) fsensor_autoload_check_start(); +#endif //PAT9125 while(!lcd_clicked()) { manage_heater(); manage_inactivity(true); - pat9125_update_y(); //update sensor - if (y_old != pat9125_y) //? y value is different - { - if ((y_old - pat9125_y) > 0) //? delta-y value is positive (inserting) - change_cnt++; //increment change counter - y_old = pat9125_y; //save current value - if (change_cnt > 20) break; //number of positive changes > 20, start loading - } +#ifdef PAT9125 + if (fsensor_M600 && fsensor_check_autoload()) + break; +#endif //PAT9125 /*#ifdef SNMM target[E_AXIS] += 0.002; plan_buffer_line(target[X_AXIS], target[Y_AXIS], target[Z_AXIS], target[E_AXIS], 500, active_extruder); @@ -5578,6 +5574,9 @@ case 404: //M404 Enter the nominal filament width (3mm, 1.75mm ) N<3.0> or disp #endif // SNMM*/ } +#ifdef PAT9125 + if (fsensor_M600) fsensor_autoload_check_stop(); +#endif //PAT9125 //WRITE(BEEPER, LOW); KEEPALIVE_STATE(IN_HANDLER); @@ -6349,7 +6348,23 @@ void handle_status_leds(void) { void manage_inactivity(bool ignore_stepper_queue/*=false*/) //default argument set in Marlin.h { - + if (fsensor_enabled && !fsensor_M600 && !moves_planned() && !IS_SD_PRINTING && !is_usb_printing && (lcd_commands_type != LCD_COMMAND_V2_CAL) && (current_temperature[0] > EXTRUDE_MINTEMP)) + { + if (fsensor_autoload_enabled) + { + if (fsensor_check_autoload()) + { + fsensor_autoload_check_stop(); + enquecommand_front_P((PSTR("M701"))); + } + } + else + fsensor_autoload_check_start(); + } + else + if (fsensor_autoload_enabled) + fsensor_autoload_check_stop(); + #if defined(KILL_PIN) && KILL_PIN > -1 static int killCount = 0; // make the inactivity button a bit less responsive const int KILL_DELAY = 10000; diff --git a/Firmware/fsensor.cpp b/Firmware/fsensor.cpp index a591dd3b..1404f714 100644 --- a/Firmware/fsensor.cpp +++ b/Firmware/fsensor.cpp @@ -41,6 +41,11 @@ uint8_t fsensor_err_cnt = 0; int16_t fsensor_st_cnt = 0; uint8_t fsensor_log = 1; +//autoload enable/disable flag +bool fsensor_autoload_enabled = false; +uint16_t fsensor_autoload_y = 0; +uint8_t fsensor_autoload_c = 0; +uint32_t fsensor_autoload_last_millis = 0; bool fsensor_enable() @@ -89,6 +94,51 @@ void fsensor_setup_interrupt() pciSetup(FSENSOR_INT_PIN); } +void fsensor_autoload_check_start(void) +{ + puts_P(PSTR("fsensor_autoload_check_start\n")); + pat9125_update_y(); //update sensor + fsensor_autoload_y = pat9125_y; //save current y value + fsensor_autoload_c = 0; //reset number of changes counter + fsensor_autoload_last_millis = millis(); + fsensor_autoload_enabled = true; +} + +void fsensor_autoload_check_stop(void) +{ + puts_P(PSTR("fsensor_autoload_check_stop\n")); + fsensor_autoload_enabled = false; +} + +bool fsensor_check_autoload(void) +{ + if ((millis() - fsensor_autoload_last_millis) < 50) return false; + fsensor_autoload_last_millis = millis(); + pat9125_update_y(); //update sensor + uint16_t dy = fsensor_autoload_y - pat9125_y; + if (dy) //? y value is different + { + if (dy > 0) //? delta-y value is positive (inserting) + { + fsensor_autoload_c+=3; //increment change counter +// printf_P(PSTR("fsensor_check_autoload dy=%d c=%d\n"), dy, fsensor_autoload_c); + } + else if (fsensor_autoload_c > 0) + { + fsensor_autoload_c--; +// printf_P(PSTR("fsensor_check_autoload dy=%d c=%d\n"), dy, fsensor_autoload_c); + } + fsensor_autoload_y = pat9125_y; //save current value + if (fsensor_autoload_c > 10) return true; //number of positive changes > 10, start loading + } + else if (fsensor_autoload_c > 0) + { + fsensor_autoload_c--; +// printf_P(PSTR("fsensor_check_autoload dy=%d c=%d\n"), dy, fsensor_autoload_c); + } + return false; +} + ISR(PCINT2_vect) { // return; diff --git a/Firmware/fsensor.h b/Firmware/fsensor.h index 3d1dea86..ee02f16f 100644 --- a/Firmware/fsensor.h +++ b/Firmware/fsensor.h @@ -17,6 +17,15 @@ extern void fsensor_update(); //setup pin-change interrupt extern void fsensor_setup_interrupt(); +// +extern void fsensor_autoload_check_start(void); + +// +extern void fsensor_autoload_check_stop(void); + +// +extern bool fsensor_check_autoload(void); + //callbacks from stepper extern void fsensor_st_block_begin(block_t* bl); extern void fsensor_st_block_chunk(block_t* bl, int cnt); @@ -30,6 +39,8 @@ extern bool fsensor_enabled; //not responding flag extern bool fsensor_not_responding; +//autoload enable/disable flag +extern bool fsensor_autoload_enabled; #endif //FSENSOR_H From 66e279b41c7a652862d8e877e62c63e10f4933f0 Mon Sep 17 00:00:00 2001 From: Robert Pelnar <robert.pelnar@seznam.cz> Date: Wed, 13 Dec 2017 18:12:05 +0100 Subject: [PATCH 2/3] Autoload filament - fsensor error couter reset when switched. --- Firmware/fsensor.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Firmware/fsensor.cpp b/Firmware/fsensor.cpp index 1404f714..5edec1d8 100644 --- a/Firmware/fsensor.cpp +++ b/Firmware/fsensor.cpp @@ -102,12 +102,14 @@ void fsensor_autoload_check_start(void) fsensor_autoload_c = 0; //reset number of changes counter fsensor_autoload_last_millis = millis(); fsensor_autoload_enabled = true; + fsensor_err_cnt = 0; } void fsensor_autoload_check_stop(void) { puts_P(PSTR("fsensor_autoload_check_stop\n")); fsensor_autoload_enabled = false; + fsensor_err_cnt = 0; } bool fsensor_check_autoload(void) From ca55cf74e20971112ed2373946395d7709025606 Mon Sep 17 00:00:00 2001 From: Robert Pelnar <robert.pelnar@seznam.cz> Date: Wed, 13 Dec 2017 22:58:34 +0100 Subject: [PATCH 3/3] Merge remote-tracking branch 'upstream/MK3' into MK3 # Please enter a commit message to explain why this merge is necessary, # especially if it merges an updated upstream into a topic branch. # # Lines starting with '#' will be ignored, and an empty message aborts # the commit. --- Firmware/Configuration.h | 17 ++++++++--------- Firmware/Marlin_main.cpp | 9 +++++---- Firmware/ultralcd.cpp | 2 +- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/Firmware/Configuration.h b/Firmware/Configuration.h index babbf4f9..58aaa752 100644 --- a/Firmware/Configuration.h +++ b/Firmware/Configuration.h @@ -9,7 +9,7 @@ // Firmware version #define FW_version "3.1.1-RC1" -#define FW_build 131 +#define FW_build 134 //#define FW_build --BUILD-NUMBER-- #define FW_version_build FW_version " b" STR(FW_build) @@ -79,7 +79,13 @@ #define EEPROM_FERROR_COUNT (EEPROM_UVLO_MESH_BED_LEVELING-16) // Power loss errors #define EEPROM_POWER_COUNT (EEPROM_UVLO_MESH_BED_LEVELING-17) -#define EEPROM_DIR_DEPTH (EEPROM_POWER_COUNT-1) + +#define EEPROM_XYZ_CAL_SKEW (EEPROM_POWER_COUNT - 4) //float for skew backup +#define EEPROM_WIZARD_ACTIVE (EEPROM_XYZ_CAL_SKEW - 1) +#define EEPROM_BELTSTATUS_X (EEPROM_WIZARD_ACTIVE - 2) //uint16 +#define EEPROM_BELTSTATUS_Y (EEPROM_BELTSTATUS_X - 2) //uint16 + +#define EEPROM_DIR_DEPTH (EEPROM_BELTSTATUS_Y-1) #define EEPROM_DIRS (EEPROM_DIR_DEPTH-80) //8 chars for each dir name, max 10 levels #define EEPROM_SD_SORT (EEPROM_DIRS - 1) //0 -time, 1-alpha, 2-none #define EEPROM_SECOND_SERIAL_ACTIVE (EEPROM_SD_SORT - 1) @@ -106,13 +112,6 @@ #define EEPROM_TMC_X_SG_THRS_LOW (EEPROM_TMC_X + 13) // 1byte, (-64..+63) #define EEPROM_TMC_X_SG_THRS_HIGH (EEPROM_TMC_X + 14) // 1byte, (-64..+63) -#define EEPROM_XYZ_CAL_SKEW (EEPROM_POWER_COUNT - 4) //float for skew backup - -#define EEPROM_WIZARD_ACTIVE (EEPROM_XYZ_CAL_SKEW - 1) - -#define EEPROM_BELTSTATUS_X (EEPROM_WIZARD_ACTIVE - 2) //uint16 -#define EEPROM_BELTSTATUS_Y (EEPROM_BELTSTATUS_X - 2) //uint16 - // Currently running firmware, each digit stored as uint16_t. // The flavor differentiates a dev, alpha, beta, release candidate or a release version. #define EEPROM_FIRMWARE_VERSION_END (FW_PRUSA3D_MAGIC_LEN+8) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 99ab2eef..eecd4c07 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -1062,10 +1062,7 @@ void setup() // 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), - // but this times out if a blocking dialog is shown in setup(). - card.initsd(); - + if (eeprom_read_dword((uint32_t*)(EEPROM_TOP - 4)) == 0x0ffffffff && eeprom_read_dword((uint32_t*)(EEPROM_TOP - 8)) == 0x0ffffffff && eeprom_read_dword((uint32_t*)(EEPROM_TOP - 12)) == 0x0ffffffff) { @@ -1078,6 +1075,10 @@ void setup() eeprom_write_byte((uint8_t*)EEPROM_WIZARD_ACTIVE, 1); //run wizard } + + // Force SD card update. Otherwise the SD card update is done from loop() on card.checkautostart(false), + // but this times out if a blocking dialog is shown in setup(). + card.initsd(); if (eeprom_read_byte((uint8_t*)EEPROM_POWER_COUNT) == 0xff) eeprom_write_byte((uint8_t*)EEPROM_POWER_COUNT, 0); if (eeprom_read_byte((uint8_t*)EEPROM_CRASH_COUNT) == 0xff) diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index f29a8063..097eaa57 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -6193,7 +6193,7 @@ static int lcd_selftest_screen(int _step, int _progress, int _progress_scale, bo lcd_selftest_screen_step(3, 0, ((_step == _step_block) ? 1 : (_step < _step_block) ? 0 : 2), "Bed", _indicator); } - if (_delay > 0) delay(_delay); + if (_delay > 0) delay_keep_alive(_delay); _progress++; return (_progress > _progress_scale * 2) ? 0 : _progress;