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;