Merge pull request #1826 from ondratu/selftest_wizard

Selftest fan improvements
This commit is contained in:
Marek Běl 2019-05-15 13:43:48 +02:00 committed by GitHub
commit fbc0c260b1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 113 additions and 56 deletions

169
Firmware/ultralcd.cpp Executable file → Normal file
View File

@ -202,10 +202,29 @@ enum class TestError : uint_least8_t
static int lcd_selftest_screen(testScreen screen, int _progress, int _progress_scale, bool _clear, int _delay); static int lcd_selftest_screen(testScreen screen, 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 void lcd_selftest_screen_step(int _row, int _col, int _state, const char *_name, const char *_indicator);
static bool lcd_selftest_manual_fan_check(int _fan, bool check_opposite); static bool lcd_selftest_manual_fan_check(int _fan, bool check_opposite,
bool _default=false);
#ifdef FANCHECK #ifdef FANCHECK
static bool lcd_selftest_fan_dialog(int _fan); /** Enumerate for lcd_selftest_fan_auto function.
*/
enum class FanCheck : uint_least8_t {
success,
printFan = TestError::printFan,
extruderFan = TestError::extruderFan,
swappedFan = TestError::swappedFan,
};
/**
* Try to check fan working and wiring.
*
* @param _fan i fan number 0 means extruder fan, 1 means print fan.
*
* @returns a TestError noerror, extruderFan, printFan or swappedFan.
*/
static FanCheck lcd_selftest_fan_auto(int _fan);
#endif //FANCHECK #endif //FANCHECK
#ifdef PAT9125 #ifdef PAT9125
static bool lcd_selftest_fsensor(); static bool lcd_selftest_fsensor();
#endif //PAT9125 #endif //PAT9125
@ -6909,6 +6928,7 @@ bool lcd_selftest()
{ {
int _progress = 0; int _progress = 0;
bool _result = true; bool _result = true;
bool _swapped_fan = false;
lcd_wait_for_cool_down(); lcd_wait_for_cool_down();
lcd_clear(); lcd_clear();
lcd_set_cursor(0, 0); lcd_puts_P(_i("Self test start "));////MSG_SELFTEST_START c=20 lcd_set_cursor(0, 0); lcd_puts_P(_i("Self test start "));////MSG_SELFTEST_START c=20
@ -6920,29 +6940,63 @@ bool lcd_selftest()
_progress = lcd_selftest_screen(testScreen::extruderFan, _progress, 3, true, 2000); _progress = lcd_selftest_screen(testScreen::extruderFan, _progress, 3, true, 2000);
#if (defined(FANCHECK) && defined(TACH_0)) #if (defined(FANCHECK) && defined(TACH_0))
_result = lcd_selftest_fan_dialog(0); switch (lcd_selftest_fan_auto(0)){ // check extruder Fan
case FanCheck::extruderFan:
_result = false;
break;
case FanCheck::swappedFan:
_swapped_fan = true;
// no break
default:
_result = true;
break;
}
#else //defined(TACH_0) #else //defined(TACH_0)
_result = lcd_selftest_manual_fan_check(0, false); _result = lcd_selftest_manual_fan_check(0, false);
#endif //defined(TACH_0)
if (!_result) if (!_result)
{ {
lcd_selftest_error(TestError::extruderFan, "", ""); lcd_selftest_error(TestError::extruderFan, "", "");
} }
#endif //defined(TACH_0)
if (_result) if (_result)
{ {
_progress = lcd_selftest_screen(testScreen::printFan, _progress, 3, true, 2000); _progress = lcd_selftest_screen(testScreen::printFan, _progress, 3, true, 2000);
#if (defined(FANCHECK) && defined(TACH_1)) #if (defined(FANCHECK) && defined(TACH_1))
_result = lcd_selftest_fan_dialog(1); switch (lcd_selftest_fan_auto(1)){ // check print fan
case FanCheck::printFan:
_result = false;
break;
case FanCheck::swappedFan:
_swapped_fan = true;
// no break
default:
_result = true;
break;
}
#else //defined(TACH_1) #else //defined(TACH_1)
_result = lcd_selftest_manual_fan_check(1, false); _result = lcd_selftest_manual_fan_check(1, false);
#endif //defined(TACH_1)
if (!_result) if (!_result)
{ {
lcd_selftest_error(TestError::printFan, "", ""); //print fan not spinning lcd_selftest_error(TestError::printFan, "", ""); //print fan not spinning
} }
}
#endif //defined(TACH_1) if (_swapped_fan) {
//turn on print fan and check that left extruder fan is not spinning
_result = lcd_selftest_manual_fan_check(1, true);
if (_result) {
//print fan is stil turned on; check that it is spinning
_result = lcd_selftest_manual_fan_check(1, false, true);
if (!_result){
lcd_selftest_error(TestError::printFan, "", "");
}
}
else {
// fans are swapped
lcd_selftest_error(TestError::swappedFan, "", "");
}
} }
if (_result) if (_result)
@ -7712,19 +7766,20 @@ static bool selftest_irsensor()
} }
#endif //FILAMENT_SENSOR #endif //FILAMENT_SENSOR
static bool lcd_selftest_manual_fan_check(int _fan, bool check_opposite) static bool lcd_selftest_manual_fan_check(int _fan, bool check_opposite,
bool _default)
{ {
bool _result = check_opposite; bool _result = check_opposite;
lcd_clear(); lcd_clear();
lcd_set_cursor(0, 0); lcd_puts_P(_T(MSG_SELFTEST_FAN)); lcd_set_cursor(0, 0); lcd_puts_P(_T(MSG_SELFTEST_FAN));
switch (_fan) switch (_fan)
{ {
case 0: case 0:
// extruder cooling fan // extruder cooling fan
lcd_set_cursor(0, 1); lcd_set_cursor(0, 1);
if(check_opposite == true) lcd_puts_P(_T(MSG_SELFTEST_COOLING_FAN)); if(check_opposite == true) lcd_puts_P(_T(MSG_SELFTEST_COOLING_FAN));
else lcd_puts_P(_T(MSG_SELFTEST_EXTRUDER_FAN)); else lcd_puts_P(_T(MSG_SELFTEST_EXTRUDER_FAN));
SET_OUTPUT(EXTRUDER_0_AUTO_FAN_PIN); SET_OUTPUT(EXTRUDER_0_AUTO_FAN_PIN);
@ -7750,10 +7805,11 @@ static bool lcd_selftest_manual_fan_check(int _fan, bool check_opposite)
lcd_set_cursor(0, 3); lcd_print(">"); lcd_set_cursor(0, 3); lcd_print(">");
lcd_set_cursor(1, 3); lcd_puts_P(_T(MSG_SELFTEST_FAN_NO)); lcd_set_cursor(1, 3); lcd_puts_P(_T(MSG_SELFTEST_FAN_NO));
int8_t enc_dif = 0; int8_t enc_dif = int(_default)*3;
KEEPALIVE_STATE(PAUSED_FOR_USER); KEEPALIVE_STATE(PAUSED_FOR_USER);
lcd_button_pressed = false; lcd_button_pressed = false;
do do
{ {
switch (_fan) switch (_fan)
@ -7773,7 +7829,6 @@ static bool lcd_selftest_manual_fan_check(int _fan, bool check_opposite)
#endif //FAN_SOFT_PWM #endif //FAN_SOFT_PWM
break; break;
} }
if (abs((enc_dif - lcd_encoder_diff)) > 2) { if (abs((enc_dif - lcd_encoder_diff)) > 2) {
if (enc_dif > lcd_encoder_diff) { if (enc_dif > lcd_encoder_diff) {
_result = !check_opposite; _result = !check_opposite;
@ -7812,14 +7867,11 @@ static bool lcd_selftest_manual_fan_check(int _fan, bool check_opposite)
manage_heater(); manage_heater();
return _result; return _result;
} }
#ifdef FANCHECK #ifdef FANCHECK
static bool lcd_selftest_fan_dialog(int _fan) static FanCheck lcd_selftest_fan_auto(int _fan)
{ {
bool _result = true;
TestError testError = TestError::extruderFan;
switch (_fan) { switch (_fan) {
case 0: case 0:
fanSpeed = 0; fanSpeed = 0;
@ -7832,23 +7884,26 @@ static bool lcd_selftest_fan_dialog(int _fan)
_delay(2000); //delay_keep_alive would turn off extruder fan, because temerature is too low _delay(2000); //delay_keep_alive would turn off extruder fan, because temerature is too low
manage_heater(); //count average fan speed from 2s delay and turn off fans manage_heater(); //count average fan speed from 2s delay and turn off fans
if (!fan_speed[0]) _result = false;
printf_P(PSTR("Test 1:\n")); printf_P(PSTR("Test 1:\n"));
printf_P(PSTR("Print fan speed: %d \n"), fan_speed[1]); printf_P(PSTR("Print fan speed: %d \n"), fan_speed[1]);
printf_P(PSTR("Extr fan speed: %d \n"), fan_speed[0]); printf_P(PSTR("Extr fan speed: %d \n"), fan_speed[0]);
//SERIAL_ECHOPGM("Extruder fan speed: ");
//MYSERIAL.println(fan_speed[0]); if (!fan_speed[0]) {
//SERIAL_ECHOPGM("Print fan speed: "); return FanCheck::extruderFan;
//MYSERIAL.print(fan_speed[1]); }
#ifdef FAN_SOFT_PWM
else if (fan_speed[0] > 50 ) { // printerFan is faster
return FanCheck::swappedFan;
}
break; break;
#endif
case 1: case 1:
//will it work with Thotend > 50 C ? //will it work with Thotend > 50 C ?
#ifdef FAN_SOFT_PWM #ifdef FAN_SOFT_PWM
fanSpeed = 255; fanSpeed = 255;
fanSpeedSoftPwm = 255; fanSpeedSoftPwm = 255;
extruder_autofan_last_check = _millis(); //store time when measurement starts extruder_autofan_last_check = _millis(); //store time when measurement starts
fan_measuring = true; //start fan measuring, rest is on manage_heater fan_measuring = true; //start fan measuring, rest is on manage_heater
#else //FAN_SOFT_PWM #else //FAN_SOFT_PWM
@ -7862,11 +7917,11 @@ static bool lcd_selftest_fan_dialog(int _fan)
lcd_set_cursor(18, 3); lcd_set_cursor(18, 3);
lcd_print("|"); lcd_print("|");
} }
fanSpeed = 0;
#ifdef FAN_SOFT_PWM #ifdef FAN_SOFT_PWM
fanSpeed = 0; fanSpeedSoftPwm = 0;
fanSpeedSoftPwm = 0;
#else //FAN_SOFT_PWM #else //FAN_SOFT_PWM
fanSpeed = 0;
manage_heater(); //turn off fan manage_heater(); //turn off fan
manage_inactivity(true); //to turn off print fan manage_inactivity(true); //to turn off print fan
#endif //FAN_SOFT_PWM #endif //FAN_SOFT_PWM
@ -7874,35 +7929,37 @@ static bool lcd_selftest_fan_dialog(int _fan)
printf_P(PSTR("Print fan speed: %d \n"), fan_speed[1]); printf_P(PSTR("Print fan speed: %d \n"), fan_speed[1]);
printf_P(PSTR("Extr fan speed: %d \n"), fan_speed[0]); printf_P(PSTR("Extr fan speed: %d \n"), fan_speed[0]);
if (!fan_speed[1]) { if (!fan_speed[1]) {
_result = false; testError = TestError::printFan; return FanCheck::printFan;
}
#ifdef FAN_SOFT_PWM
else {
#else //FAN_SOFT_PWM
else if (fan_speed[1] < 34) { //fan is spinning, but measured RPM are too low for print fan, it must be left extruder fan
#endif //FAN_SOFT_PWM
//check fans manually
_result = lcd_selftest_manual_fan_check(1, true); //turn on print fan and check that left extruder fan is not spinning
if (_result) {
_result = lcd_selftest_manual_fan_check(1, false); //print fan is stil turned on; check that it is spinning
if (!_result) testError = TestError::printFan;
}
else {
testError = TestError::swappedFan;
}
} }
//SERIAL_ECHOPGM("Extruder fan speed: "); #ifdef FAN_SOFT_PWM
//MYSERIAL.println(fan_speed[0]); fanSpeed = 80;
//SERIAL_ECHOPGM("Print fan speed: "); fanSpeedSoftPwm = 80;
//MYSERIAL.println(fan_speed[1]);
for (uint8_t i = 0; i < 5; i++) {
delay_keep_alive(1000);
lcd_set_cursor(18, 3);
lcd_print("-");
delay_keep_alive(1000);
lcd_set_cursor(18, 3);
lcd_print("|");
}
fanSpeed = 0;
// noctua speed is between 17 and 24, turbine more then 30
if (fan_speed[1] < 30) {
return FanCheck::swappedFan;
}
#else
// fan is spinning, but measured RPM are too low for print fan, it must
// be left extruder fan
else if (fan_speed[1] < 34) {
return FanCheck::swappedFan;
}
#endif //FAN_SOFT_PWM
break; break;
} }
if (!_result) return FanCheck::success;
{
lcd_selftest_error(testError, "", "");
}
return _result;
} }
#endif //FANCHECK #endif //FANCHECK