From da5f1f71eab686c45b3d2e8e743c67e4a608499c Mon Sep 17 00:00:00 2001
From: akukan <alexandr@prusa3d.cz>
Date: Tue, 11 Oct 2016 18:07:27 +0200
Subject: [PATCH] Fan selftest, error on TR reported via serial

---
 Firmware/language_all.cpp |  18 +++++
 Firmware/language_all.h   |   4 ++
 Firmware/language_en.h    |   2 +
 Firmware/temperature.cpp  |   5 +-
 Firmware/ultralcd.cpp     | 139 ++++++++++++++++++++++++++++++++++----
 Firmware/ultralcd.h       |   1 +
 6 files changed, 156 insertions(+), 13 deletions(-)

diff --git a/Firmware/language_all.cpp b/Firmware/language_all.cpp
index ce30b53b..e5cd4c20 100644
--- a/Firmware/language_all.cpp
+++ b/Firmware/language_all.cpp
@@ -1840,6 +1840,24 @@ const char * const MSG_SELFTEST_START_LANG_TABLE[LANG_NUM] PROGMEM = {
 	MSG_SELFTEST_START_EN
 };
 
+const char MSG_SELFTEST_COOLING_FAN_EN[] PROGMEM = "Print fan ok ?";
+const char * const MSG_SELFTEST_COOLING_FAN_LANG_TABLE[LANG_NUM] PROGMEM = {
+	MSG_SELFTEST_COOLING_FAN_EN,
+	MSG_SELFTEST_COOLING_FAN_EN,
+	MSG_SELFTEST_COOLING_FAN_EN,
+	MSG_SELFTEST_COOLING_FAN_EN,
+	MSG_SELFTEST_COOLING_FAN_EN
+};
+
+const char MSG_SELFTEST_EXTRUDER_FAN_EN[] PROGMEM = "Fan ok ?";
+const char * const MSG_SELFTEST_EXTRUDER_FAN_LANG_TABLE[LANG_NUM] PROGMEM = {
+	MSG_SELFTEST_EXTRUDER_FAN_EN,
+	MSG_SELFTEST_EXTRUDER_FAN_EN,
+	MSG_SELFTEST_EXTRUDER_FAN_EN,
+	MSG_SELFTEST_EXTRUDER_FAN_EN,
+	MSG_SELFTEST_EXTRUDER_FAN_EN
+};
+
 const char MSG_SELFTEST_WIRINGERROR_EN[] PROGMEM = "Wiring error";
 const char MSG_SELFTEST_WIRINGERROR_CZ[] PROGMEM = "Chyba zapojeni";
 const char MSG_SELFTEST_WIRINGERROR_IT[] PROGMEM = "Errore cablaggio";
diff --git a/Firmware/language_all.h b/Firmware/language_all.h
index 52809883..e409f422 100644
--- a/Firmware/language_all.h
+++ b/Firmware/language_all.h
@@ -418,6 +418,10 @@ extern const char* const MSG_SELFTEST_PLEASECHECK_LANG_TABLE[LANG_NUM];
 #define MSG_SELFTEST_PLEASECHECK LANG_TABLE_SELECT(MSG_SELFTEST_PLEASECHECK_LANG_TABLE)
 extern const char* const MSG_SELFTEST_START_LANG_TABLE[LANG_NUM];
 #define MSG_SELFTEST_START LANG_TABLE_SELECT(MSG_SELFTEST_START_LANG_TABLE)
+extern const char* const MSG_SELFTEST_EXTRUDER_FAN_LANG_TABLE[LANG_NUM];
+#define MSG_SELFTEST_EXTRUDER_FAN LANG_TABLE_SELECT(MSG_SELFTEST_EXTRUDER_FAN_LANG_TABLE)
+extern const char* const MSG_SELFTEST_COOLING_FAN_LANG_TABLE[LANG_NUM];
+#define MSG_SELFTEST_COOLING_FAN LANG_TABLE_SELECT(MSG_SELFTEST_COOLING_FAN_LANG_TABLE)
 extern const char* const MSG_SELFTEST_WIRINGERROR_LANG_TABLE[LANG_NUM];
 #define MSG_SELFTEST_WIRINGERROR LANG_TABLE_SELECT(MSG_SELFTEST_WIRINGERROR_LANG_TABLE)
 extern const char* const MSG_SERIAL_ERROR_MENU_STRUCTURE_LANG_TABLE[1];
diff --git a/Firmware/language_en.h b/Firmware/language_en.h
index e3008e60..19dc85cc 100644
--- a/Firmware/language_en.h
+++ b/Firmware/language_en.h
@@ -164,6 +164,8 @@
 #define MSG_SELFTEST_ENDSTOP				"Endstop"
 #define MSG_SELFTEST_ENDSTOP_NOTHIT			"Endstop not hit"
 #define MSG_SELFTEST_OK						"Self test OK"
+#define MSG_SELFTEST_COOLING_FAN			"Print fan ok ?";
+#define MSG_SELFTEST_EXTRUDER_FAN			"Fan ok ?";
 #define(length=20) MSG_STATS_TOTALFILAMENT	"Total filament :"
 #define(length=20) MSG_STATS_TOTALPRINTTIME "Total print time :"
 #define(length=20) MSG_STATS_FILAMENTUSED	"Filament used:  "
diff --git a/Firmware/temperature.cpp b/Firmware/temperature.cpp
index 6b31953d..304ad471 100644
--- a/Firmware/temperature.cpp
+++ b/Firmware/temperature.cpp
@@ -1187,7 +1187,8 @@ void temp_runaway_stop(bool isPreheat)
 	{
 		Stop();
 		LCD_ALERTMESSAGEPGM("   PREHEAT ERROR");
-
+		SERIAL_ERROR_START;
+		SERIAL_ERRORLNPGM(": THERMAL RUNAWAY ( PREHEAT )");
 		SET_OUTPUT(EXTRUDER_0_AUTO_FAN_PIN);
 		SET_OUTPUT(FAN_PIN);
 		WRITE(EXTRUDER_0_AUTO_FAN_PIN, 1);
@@ -1198,6 +1199,8 @@ void temp_runaway_stop(bool isPreheat)
 	else
 	{
 		LCD_ALERTMESSAGEPGM("THERMAL RUNAWAY");
+		SERIAL_ERROR_START;
+		SERIAL_ERRORLNPGM(": THERMAL RUNAWAY");
 	}
 }
 #endif
diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp
index d21387c3..922ab99d 100644
--- a/Firmware/ultralcd.cpp
+++ b/Firmware/ultralcd.cpp
@@ -2822,7 +2822,24 @@ static void lcd_selftest()
 	int _progress = 0;
 	bool _result = false;
 
-	_progress = lcd_selftest_screen(-1, _progress, 4, true, 2000);
+	lcd_implementation_clear();
+	lcd.setCursor(0, 0); lcd_printPGM(MSG_SELFTEST);
+	delay(2000);
+
+
+	_result = lcd_selftest_fan_dialog(1);
+
+	if (_result)
+	{
+		_result = lcd_selftest_fan_dialog(2);
+	}
+
+	if (_result)
+	{
+		_progress = lcd_selftest_screen(0, _progress, 3, true, 2000);
+		_progress = lcd_selftest_screen(-1, _progress, 4, true, 3000);
+		_result = lcd_selfcheck_endstops();
+	}
 
 	_progress = lcd_selftest_screen(0, _progress, 3, true, 2000);
 	_result = lcd_selfcheck_endstops();
@@ -3124,6 +3141,102 @@ static void lcd_selftest_error(int _error_no, const char *_error_1, const char *
 	lcd_return_to_status();
 
 }
+
+static bool lcd_selftest_fan_dialog(int _fan)
+{
+	bool _result = false;
+	lcd_implementation_clear();
+
+	lcd.setCursor(0, 0); lcd_printPGM(MSG_SELFTEST);
+	switch (_fan)
+	{
+	case 1:
+		// extruder cooling fan
+		lcd.setCursor(0, 1); lcd_printPGM(MSG_SELFTEST_EXTRUDER_FAN);
+		SET_OUTPUT(EXTRUDER_0_AUTO_FAN_PIN);
+		WRITE(EXTRUDER_0_AUTO_FAN_PIN, 1);
+		break;
+	case 2:
+		// object cooling fan
+		lcd.setCursor(0, 1); lcd_printPGM(MSG_SELFTEST_COOLING_FAN);
+		SET_OUTPUT(FAN_PIN);
+		analogWrite(FAN_PIN, 255);
+		break;
+	}
+	delay(500);
+
+	lcd.setCursor(1, 2); lcd_printPGM(MSG_YES);
+	lcd.setCursor(0, 3); lcd.print(">");
+	lcd.setCursor(1, 3); lcd_printPGM(MSG_NO);
+
+
+
+
+
+	int8_t enc_dif = 0;
+	bool _response = false;
+	do
+	{
+
+		switch (_fan)
+		{
+		case 1:
+			// extruder cooling fan
+			SET_OUTPUT(EXTRUDER_0_AUTO_FAN_PIN);
+			WRITE(EXTRUDER_0_AUTO_FAN_PIN, 1);
+			break;
+		case 2:
+			// object cooling fan
+			SET_OUTPUT(FAN_PIN);
+			analogWrite(FAN_PIN, 255);
+			break;
+		}
+
+
+		if (abs((enc_dif - encoderDiff)) > 2) {
+			if (enc_dif > encoderDiff) {
+				_result = true;
+				lcd.setCursor(0, 2); lcd.print(">");
+				lcd.setCursor(1, 2); lcd_printPGM(MSG_YES);
+				lcd.setCursor(0, 3); lcd.print(" ");
+				lcd.setCursor(1, 3); lcd_printPGM(MSG_NO);
+			}
+
+			if (enc_dif < encoderDiff) {
+				_result = false;
+				lcd.setCursor(0, 2); lcd.print(" ");
+				lcd.setCursor(1, 2); lcd_printPGM(MSG_YES);
+				lcd.setCursor(0, 3); lcd.print(">");
+				lcd.setCursor(1, 3); lcd_printPGM(MSG_NO);
+			}
+			enc_dif = 0;
+			encoderDiff = 0;
+		}
+
+
+		manage_heater();
+		delay(100);
+
+		if (lcd_clicked())
+		{
+			_response = true;
+		}
+
+
+	} while (!_response);
+
+	SET_OUTPUT(EXTRUDER_0_AUTO_FAN_PIN);
+	WRITE(EXTRUDER_0_AUTO_FAN_PIN, 0);
+	SET_OUTPUT(FAN_PIN);
+	analogWrite(FAN_PIN, 0);
+
+	fanSpeed = 0;
+	manage_heater();
+
+	return _result;
+
+}
+
 static int lcd_selftest_screen(int _step, int _progress, int _progress_scale, bool _clear, int _delay)
 {
 	lcd_next_update_millis = millis() + (LCD_UPDATE_INTERVAL * 10000);
@@ -3149,21 +3262,23 @@ static int lcd_selftest_screen(int _step, int _progress, int _progress_scale, bo
 	lcd.setCursor(0, 1);
 	lcd.print("--------------------");
 
-	_step_block = 1;
-	lcd_selftest_screen_step(3, 9, ((_step == _step_block) ? 1 : (_step < _step_block) ? 0 : 2), "Hotend", _indicator);
+	if (_step != 7)
+	{
+		_step_block = 1;
+		lcd_selftest_screen_step(3, 9, ((_step == _step_block) ? 1 : (_step < _step_block) ? 0 : 2), "Hotend", _indicator);
 
-	_step_block = 2;
-	lcd_selftest_screen_step(2, 2, ((_step == _step_block) ? 1 : (_step < _step_block) ? 0 : 2), "X", _indicator);
+		_step_block = 2;
+		lcd_selftest_screen_step(2, 2, ((_step == _step_block) ? 1 : (_step < _step_block) ? 0 : 2), "X", _indicator);
 
-	_step_block = 3;
-	lcd_selftest_screen_step(2, 8, ((_step == _step_block) ? 1 : (_step < _step_block) ? 0 : 2), "Y", _indicator);
+		_step_block = 3;
+		lcd_selftest_screen_step(2, 8, ((_step == _step_block) ? 1 : (_step < _step_block) ? 0 : 2), "Y", _indicator);
 
-	_step_block = 4;
-	lcd_selftest_screen_step(2, 14, ((_step == _step_block) ? 1 : (_step < _step_block) ? 0 : 2), "Z", _indicator);
-
-	_step_block = 5;
-	lcd_selftest_screen_step(3, 0, ((_step == _step_block) ? 1 : (_step < _step_block) ? 0 : 2), "Bed", _indicator);
+		_step_block = 4;
+		lcd_selftest_screen_step(2, 14, ((_step == _step_block) ? 1 : (_step < _step_block) ? 0 : 2), "Z", _indicator);
 
+		_step_block = 5;
+		lcd_selftest_screen_step(3, 0, ((_step == _step_block) ? 1 : (_step < _step_block) ? 0 : 2), "Bed", _indicator);
+	}
 
 	if (_delay > 0) delay(_delay);
 	_progress++;
diff --git a/Firmware/ultralcd.h b/Firmware/ultralcd.h
index dae218c3..06939e2f 100644
--- a/Firmware/ultralcd.h
+++ b/Firmware/ultralcd.h
@@ -37,6 +37,7 @@ void lcd_mylang();
   static bool lcd_selfcheck_check_heater(bool _isbed);
   static int  lcd_selftest_screen(int _step, int _progress, int _progress_scale, bool _clear, int _delay);
   static void lcd_selftest_screen_step(int _row, int _col, int _state, const char *_name, const char *_indicator);
+  static bool lcd_selftest_fan_dialog(int _fan);
   static void lcd_selftest_error(int _error_no, const char *_error_1, const char *_error_2);
   static void lcd_menu_statistics();