From 011468598e2dc10c898e28ee48e6fdf53d2bbf45 Mon Sep 17 00:00:00 2001 From: MRprusa3d Date: Mon, 16 Sep 2019 00:43:37 +0200 Subject: [PATCH 1/4] IR sensor gen. II disconnected PCB detection --- Firmware/adc.c | 5 +- Firmware/config.h | 17 ++++- Firmware/eeprom.h | 3 + Firmware/fsensor.cpp | 138 +++++++++++++++++++++++++++++----- Firmware/fsensor.h | 29 +++++++- Firmware/pins_Einsy_1_0.h | 3 +- Firmware/temperature.cpp | 11 ++- Firmware/temperature.h | 6 ++ Firmware/ultralcd.cpp | 152 ++++++++++++++++++++++++++++++++++---- Firmware/ultralcd.h | 10 +++ 10 files changed, 330 insertions(+), 44 deletions(-) diff --git a/Firmware/adc.c b/Firmware/adc.c index 26728cef..3144990d 100644 --- a/Firmware/adc.c +++ b/Firmware/adc.c @@ -4,6 +4,7 @@ #include #include #include +#include "pins.h" uint8_t adc_state; uint8_t adc_count; @@ -24,8 +25,8 @@ void adc_init(void) ADMUX |= (1 << REFS0); ADCSRA |= (1 << ADEN); // ADCSRA |= (1 << ADIF) | (1 << ADSC); - DIDR0 = (ADC_CHAN_MSK & 0xff); - DIDR2 = (ADC_CHAN_MSK >> 8); + DIDR0 = ((ADC_CHAN_MSK & ADC_DIDR_MSK) & 0xff); + DIDR2 = ((ADC_CHAN_MSK & ADC_DIDR_MSK) >> 8); adc_reset(); // adc_sim_mask = 0b0101; // adc_sim_mask = 0b100101; diff --git a/Firmware/config.h b/Firmware/config.h index a712839b..3242e47c 100644 --- a/Firmware/config.h +++ b/Firmware/config.h @@ -2,9 +2,21 @@ #define _CONFIG_H +#include "Configuration_prusa.h" +#include "pins.h" + +#define IR_SENSOR_ANALOG (defined(VOLT_IR_PIN) && defined(IR_SENSOR)) + //ADC configuration +#if !IR_SENSOR_ANALOG #define ADC_CHAN_MSK 0b0000001001011111 //used AD channels bit mask (0,1,2,3,4,6,9) +#define ADC_DIDR_MSK 0b0000001001011111 //AD channels DIDR mask (1 ~ disabled digital input) #define ADC_CHAN_CNT 7 //number of used channels) +#else //!IR_SENSOR_ANALOG +#define ADC_CHAN_MSK 0b0000001101011111 //used AD channels bit mask (0,1,2,3,4,6,8,9) +#define ADC_DIDR_MSK 0b0000001001011111 //AD channels DIDR mask (1 ~ disabled digital input) +#define ADC_CHAN_CNT 8 //number of used channels) +#endif //!IR_SENSOR_ANALOG #define ADC_OVRSAMPL 16 //oversampling multiplier #define ADC_CALLBACK adc_ready //callback function () @@ -42,11 +54,8 @@ #define W25X20CL_SPCR SPI_SPCR(W25X20CL_SPI_RATE, 1, 1, 1, 0) #define W25X20CL_SPSR SPI_SPSR(W25X20CL_SPI_RATE) -#include "boards.h" -#include "Configuration_prusa.h" - //LANG - Multi-language support -//#define LANG_MODE 0 // primary language only +//define LANG_MODE 0 // primary language only #define LANG_MODE 1 // sec. language support #define LANG_SIZE_RESERVED 0x2800 // reserved space for secondary language (10240 bytes) diff --git a/Firmware/eeprom.h b/Firmware/eeprom.h index c41fb9ff..83fdfe39 100644 --- a/Firmware/eeprom.h +++ b/Firmware/eeprom.h @@ -203,6 +203,9 @@ static_assert(sizeof(Sheets) == EEPROM_SHEETS_SIZEOF, "Sizeof(Sheets) is not EEP #define EEPROM_SHEETS_BASE (EEPROM_CHECK_GCODE - EEPROM_SHEETS_SIZEOF) // Sheets static Sheets * const EEPROM_Sheets_base = (Sheets*)(EEPROM_SHEETS_BASE); +#define EEPROM_FSENSOR_PCB (EEPROM_SHEETS_BASE-1) // uint8 +#define EEPROM_FSENSOR_ACTION_NA (EEPROM_FSENSOR_PCB-1) // uint8 + //This is supposed to point to last item to allow EEPROM overrun check. Please update when adding new items. #define EEPROM_LAST_ITEM EEPROM_SHEETS_BASE diff --git a/Firmware/fsensor.cpp b/Firmware/fsensor.cpp index f20f647d..c01274fb 100755 --- a/Firmware/fsensor.cpp +++ b/Firmware/fsensor.cpp @@ -15,6 +15,10 @@ #include "mmu.h" #include "cardreader.h" +#include "adc.h" +#include "temperature.h" +#include "config.h" + //! @name Basic parameters //! @{ #define FSENSOR_CHUNK_LEN 0.64F //!< filament sensor chunk length 0.64mm @@ -117,6 +121,13 @@ int16_t fsensor_oq_yd_max; uint16_t fsensor_oq_sh_sum; //! @} +#if IR_SENSOR_ANALOG +ClFsensorPCB oFsensorPCB; +ClFsensorActionNA oFsensorActionNA; +bool bIRsensorStateFlag=false; +unsigned long nIRsensorLastTime; +#endif //IR_SENSOR_ANALOG + void fsensor_stop_and_save_print(void) { printf_P(PSTR("fsensor_stop_and_save_print\n")); @@ -136,10 +147,11 @@ void fsensor_init(void) { #ifdef PAT9125 uint8_t pat9125 = pat9125_init(); - printf_P(PSTR("PAT9125_init:%hhu\n"), pat9125); + printf_P(PSTR("PAT9125_init:%hhu\n"), pat9125); #endif //PAT9125 uint8_t fsensor = eeprom_read_byte((uint8_t*)EEPROM_FSENSOR); fsensor_autoload_enabled=eeprom_read_byte((uint8_t*)EEPROM_FSENS_AUTOLOAD_ENABLED); + fsensor_not_responding = false; #ifdef PAT9125 uint8_t oq_meassure_enabled = eeprom_read_byte((uint8_t*)EEPROM_FSENS_OQ_MEASS_ENABLED); fsensor_oq_meassure_enabled = (oq_meassure_enabled == 1)?true:false; @@ -150,19 +162,27 @@ void fsensor_init(void) fsensor = 0; //disable sensor fsensor_not_responding = true; } - else - fsensor_not_responding = false; #endif //PAT9125 +#if IR_SENSOR_ANALOG + bIRsensorStateFlag=false; + oFsensorPCB=(ClFsensorPCB)eeprom_read_byte((uint8_t*)EEPROM_FSENSOR_PCB); + oFsensorActionNA=(ClFsensorActionNA)eeprom_read_byte((uint8_t*)EEPROM_FSENSOR_ACTION_NA); +#endif //IR_SENSOR_ANALOG if (fsensor) - fsensor_enable(); + fsensor_enable(false); // (in this case) EEPROM update is not necessary else - fsensor_disable(); - printf_P(PSTR("FSensor %S\n"), (fsensor_enabled?PSTR("ENABLED"):PSTR("DISABLED\n"))); + fsensor_disable(false); // (in this case) EEPROM update is not necessary + printf_P(PSTR("FSensor %S"), (fsensor_enabled?PSTR("ENABLED"):PSTR("DISABLED"))); +#if IR_SENSOR_ANALOG + printf_P(PSTR(" (sensor board revision: %S)\n"),(oFsensorPCB==ClFsensorPCB::_Rev03b)?PSTR("03b or newer"):PSTR("03 or older")); +#else //IR_SENSOR_ANALOG + printf_P(PSTR("\n")); +#endif //IR_SENSOR_ANALOG if (check_for_ir_sensor()) ir_sensor_detected = true; } -bool fsensor_enable(void) +bool fsensor_enable(bool bUpdateEEPROM) { #ifdef PAT9125 if (mmu_enabled == false) { //filament sensor is pat9125, enable only if it is working @@ -187,18 +207,34 @@ bool fsensor_enable(void) FSensorStateMenu = 1; } #else // PAT9125 - fsensor_enabled = true; - eeprom_update_byte((uint8_t*)EEPROM_FSENSOR, 0x01); - FSensorStateMenu = 1; -#endif // PAT9125 +#if IR_SENSOR_ANALOG + if(!fsensor_IR_check()) + { + bUpdateEEPROM=true; + fsensor_enabled=false; + fsensor_not_responding=true; + FSensorStateMenu=0; + } + else { +#endif //IR_SENSOR_ANALOG + fsensor_enabled=true; + fsensor_not_responding=false; + FSensorStateMenu=1; +#if IR_SENSOR_ANALOG + } +#endif //IR_SENSOR_ANALOG + if(bUpdateEEPROM) + eeprom_update_byte((uint8_t*)EEPROM_FSENSOR, FSensorStateMenu); +#endif //PAT9125 return fsensor_enabled; } -void fsensor_disable(void) -{ +void fsensor_disable(bool bUpdateEEPROM) +{ fsensor_enabled = false; - eeprom_update_byte((uint8_t*)EEPROM_FSENSOR, 0x00); FSensorStateMenu = 0; + if(bUpdateEEPROM) + eeprom_update_byte((uint8_t*)EEPROM_FSENSOR, 0x00); } void fsensor_autoload_set(bool State) @@ -589,10 +625,76 @@ void fsensor_update(void) fsensor_oq_meassure_enabled = oq_meassure_enabled_tmp; } #else //PAT9125 - if ((digitalRead(IR_SENSOR_PIN) == 1) && CHECK_FSENSOR && fsensor_enabled && ir_sensor_detected && ( ! fsensor_m600_enqueued) ) - { - fsensor_stop_and_save_print(); - fsensor_enque_M600(); + if (CHECK_FSENSOR && fsensor_enabled && ir_sensor_detected && ( ! fsensor_m600_enqueued) ) + { + if(digitalRead(IR_SENSOR_PIN)) + { // IR_SENSOR_PIN ~ H +#if IR_SENSOR_ANALOG + if(!bIRsensorStateFlag) + { + bIRsensorStateFlag=true; + nIRsensorLastTime=_millis(); + } + else + { + if((_millis()-nIRsensorLastTime)>IR_SENSOR_STEADY) + { + uint8_t nMUX1,nMUX2; + uint16_t nADC; + bIRsensorStateFlag=false; + // sequence for direct data reading from AD converter + DISABLE_TEMPERATURE_INTERRUPT(); + nMUX1=ADMUX; // ADMUX saving + nMUX2=ADCSRB; + adc_setmux(VOLT_IR_PIN); + ADCSRA|=(1<((int)IRsensor_Hopen_TRESHOLD))) + { + fsensor_disable(); + fsensor_not_responding = true; + printf_P(PSTR("IR sensor not responding (%d)!\n"),1); + if((ClFsensorActionNA)eeprom_read_byte((uint8_t*)EEPROM_FSENSOR_ACTION_NA)==ClFsensorActionNA::_Pause) + if(oFsensorActionNA==ClFsensorActionNA::_Pause) + lcd_pause_print(); + } + else + { +#endif //IR_SENSOR_ANALOG + fsensor_stop_and_save_print(); + fsensor_enque_M600(); +#if IR_SENSOR_ANALOG + } + } + } + } + else + { // IR_SENSOR_PIN ~ L + bIRsensorStateFlag=false; +#endif //IR_SENSOR_ANALOG + } } #endif //PAT9125 } + +#if IR_SENSOR_ANALOG +bool fsensor_IR_check() +{ +uint16_t volt_IR_int; +bool bCheckResult; + +volt_IR_int=current_voltage_raw_IR; +bCheckResult=(volt_IR_int<((int)IRsensor_Lmax_TRESHOLD))||(volt_IR_int>((int)IRsensor_Hmin_TRESHOLD)); +bCheckResult=bCheckResult&&(!((oFsensorPCB==ClFsensorPCB::_Rev03b)&&(volt_IR_int>((int)IRsensor_Hopen_TRESHOLD)))); +return(bCheckResult); +} +#endif //IR_SENSOR_ANALOG diff --git a/Firmware/fsensor.h b/Firmware/fsensor.h index fa7ab585..48ad5fba 100755 --- a/Firmware/fsensor.h +++ b/Firmware/fsensor.h @@ -3,6 +3,7 @@ #define FSENSOR_H #include +#include "config.h" //! minimum meassured chunk length in steps @@ -27,8 +28,8 @@ extern void fsensor_init(void); //! @name enable/disable //! @{ -extern bool fsensor_enable(void); -extern void fsensor_disable(void); +extern bool fsensor_enable(bool bUpdateEEPROM=true); +extern void fsensor_disable(bool bUpdateEEPROM=true); //! @} //autoload feature enabled @@ -65,4 +66,28 @@ extern void fsensor_st_block_begin(block_t* bl); extern void fsensor_st_block_chunk(block_t* bl, int cnt); //! @} + +#if IR_SENSOR_ANALOG +#define IR_SENSOR_STEADY 10 // [ms] + +enum class ClFsensorPCB:uint_least8_t +{ + _Old=0, + _Rev03b=1, + _Undef=EEPROM_EMPTY_VALUE +}; + +enum class ClFsensorActionNA:uint_least8_t +{ + _Continue=0, + _Pause=1, + _Undef=EEPROM_EMPTY_VALUE +}; + +extern ClFsensorPCB oFsensorPCB; +extern ClFsensorActionNA oFsensorActionNA; + +extern bool fsensor_IR_check(); +#endif //IR_SENSOR_ANALOG + #endif //FSENSOR_H diff --git a/Firmware/pins_Einsy_1_0.h b/Firmware/pins_Einsy_1_0.h index 33363388..1ea69a40 100755 --- a/Firmware/pins_Einsy_1_0.h +++ b/Firmware/pins_Einsy_1_0.h @@ -71,12 +71,13 @@ #define HEATER_2_PIN -1 #define TEMP_2_PIN -1 -#define TEMP_AMBIENT_PIN 5 //A5 +#define TEMP_AMBIENT_PIN 6 //A6 #define TEMP_PINDA_PIN 3 //A3 #define VOLT_PWR_PIN 4 //A4 #define VOLT_BED_PIN 9 //A9 +#define VOLT_IR_PIN 8 //A8 #define E0_TMC2130_CS 66 diff --git a/Firmware/temperature.cpp b/Firmware/temperature.cpp index 391607e8..80497480 100755 --- a/Firmware/temperature.cpp +++ b/Firmware/temperature.cpp @@ -44,6 +44,8 @@ #include "Timer.h" #include "Configuration_prusa.h" +#include "config.h" + //=========================================================================== //=============================public variables============================ //=========================================================================== @@ -71,6 +73,10 @@ int current_voltage_raw_pwr = 0; int current_voltage_raw_bed = 0; #endif +#if IR_SENSOR_ANALOG +int current_voltage_raw_IR = 0; +#endif //IR_SENSOR_ANALOG + int current_temperature_bed_raw = 0; float current_temperature_bed = 0.0; #ifdef TEMP_SENSOR_1_AS_REDUNDANT @@ -1635,11 +1641,14 @@ void adc_ready(void) //callback from adc when sampling finished current_voltage_raw_pwr = adc_values[ADC_PIN_IDX(VOLT_PWR_PIN)]; #endif #ifdef AMBIENT_THERMISTOR - current_temperature_raw_ambient = adc_values[ADC_PIN_IDX(TEMP_AMBIENT_PIN)]; + current_temperature_raw_ambient = adc_values[ADC_PIN_IDX(TEMP_AMBIENT_PIN)]; // 5->6 #endif //AMBIENT_THERMISTOR #ifdef VOLT_BED_PIN current_voltage_raw_bed = adc_values[ADC_PIN_IDX(VOLT_BED_PIN)]; // 6->9 #endif +#if IR_SENSOR_ANALOG + current_voltage_raw_IR = adc_values[ADC_PIN_IDX(VOLT_IR_PIN)]; +#endif //IR_SENSOR_ANALOG temp_meas_ready = true; } diff --git a/Firmware/temperature.h b/Firmware/temperature.h index e9ba11b4..7ece8927 100755 --- a/Firmware/temperature.h +++ b/Firmware/temperature.h @@ -27,6 +27,8 @@ #include "stepper.h" #endif +#include "config.h" + #ifdef SYSTEM_TIMER_2 @@ -74,6 +76,10 @@ extern int current_voltage_raw_pwr; extern int current_voltage_raw_bed; #endif +#if IR_SENSOR_ANALOG +extern int current_voltage_raw_IR; +#endif //IR_SENSOR_ANALOG + #ifdef TEMP_SENSOR_1_AS_REDUNDANT extern float redundant_temperature; #endif diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 0d726769..ffc12c26 100755 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -42,6 +42,10 @@ #include "io_atmega2560.h" #include "first_lay_cal.h" +#include "fsensor.h" +#include "adc.h" +#include "config.h" + int scrollstuff = 0; char longFilenameOLD[LONG_FILENAME_LENGTH]; @@ -61,9 +65,6 @@ int8_t FSensorStateMenu = 1; int8_t CrashDetectMenu = 1; -extern bool fsensor_enable(); -extern void fsensor_disable(); - #ifdef TMC2130 extern void crashdet_enable(); extern void crashdet_disable(); @@ -200,6 +201,7 @@ enum class TestError : uint_least8_t SwappedFan, WiringFsensor, TriggeringFsensor, + FsensorLevel }; static int lcd_selftest_screen(TestScreen screen, int _progress, int _progress_scale, bool _clear, int _delay); @@ -231,6 +233,9 @@ static FanCheck lcd_selftest_fan_auto(int _fan); static bool lcd_selftest_fsensor(); #endif //PAT9125 static bool selftest_irsensor(); +#if IR_SENSOR_ANALOG +static bool lcd_selftest_IRsensor(); +#endif //IR_SENSOR_ANALOG static void lcd_selftest_error(TestError error, const char *_error_1, const char *_error_2); static void lcd_colorprint_change(); #ifdef SNMM @@ -1984,21 +1989,28 @@ static void lcd_menu_temperatures() menu_back_if_clicked(); } -#if defined (VOLT_BED_PIN) || defined (VOLT_PWR_PIN) +#if defined (VOLT_BED_PIN) || defined (VOLT_PWR_PIN) || IR_SENSOR_ANALOG #define VOLT_DIV_R1 10000 #define VOLT_DIV_R2 2370 #define VOLT_DIV_FAC ((float)VOLT_DIV_R2 / (VOLT_DIV_R2 + VOLT_DIV_R1)) -#define VOLT_DIV_REF 5 + static void lcd_menu_voltages() { lcd_timeoutToStatus.stop(); //infinite timeout float volt_pwr = VOLT_DIV_REF * ((float)current_voltage_raw_pwr / (1023 * OVERSAMPLENR)) / VOLT_DIV_FAC; float volt_bed = VOLT_DIV_REF * ((float)current_voltage_raw_bed / (1023 * OVERSAMPLENR)) / VOLT_DIV_FAC; lcd_home(); - lcd_printf_P(PSTR(" PWR: %d.%01dV\n" " BED: %d.%01dV"), (int)volt_pwr, (int)(10*fabs(volt_pwr - (int)volt_pwr)), (int)volt_bed, (int)(10*fabs(volt_bed - (int)volt_bed))); - menu_back_if_clicked(); +#if !IR_SENSOR_ANALOG + lcd_printf_P(PSTR("\n")); +#endif //!IR_SENSOR_ANALOG + lcd_printf_P(PSTR(" PWR: %4.1fV\n" " BED: %4.1fV"), volt_pwr, volt_bed); +#if IR_SENSOR_ANALOG + float volt_IR = VOLT_DIV_REF * ((float)current_voltage_raw_IR / (1023 * OVERSAMPLENR)); + lcd_printf_P(PSTR("\n IR : %3.1fV"),volt_IR); +#endif //IR_SENSOR_ANALOG + menu_back_if_clicked(); } -#endif //defined VOLT_BED_PIN || defined VOLT_PWR_PIN +#endif //defined (VOLT_BED_PIN) || defined (VOLT_PWR_PIN) || IR_SENSOR_ANALOG #ifdef TMC2130 static void lcd_menu_belt_status() @@ -5505,6 +5517,41 @@ SETTINGS_VERSION; MENU_END(); } +#if IR_SENSOR_ANALOG +static void lcd_fsensor_actionNA_set(void) +{ +switch(oFsensorActionNA) + { + case ClFsensorActionNA::_Continue: + oFsensorActionNA=ClFsensorActionNA::_Pause; + break; + case ClFsensorActionNA::_Pause: + oFsensorActionNA=ClFsensorActionNA::_Continue; + break; + default: + oFsensorActionNA=ClFsensorActionNA::_Continue; + } +eeprom_update_byte((uint8_t*)EEPROM_FSENSOR_ACTION_NA,(uint8_t)oFsensorActionNA); +} + +#define FSENSOR_ACTION_NA \ +do\ +{\ + switch(oFsensorActionNA)\ + {\ + case ClFsensorActionNA::_Continue:\ + MENU_ITEM_FUNCTION_P(_i("FS Action [cont.]"),lcd_fsensor_actionNA_set);\ + break;\ + case ClFsensorActionNA::_Pause:\ + MENU_ITEM_FUNCTION_P(_i("FS Action [pause]"),lcd_fsensor_actionNA_set);\ + break;\ + default:\ + oFsensorActionNA=ClFsensorActionNA::_Continue;\ + }\ +}\ +while (0) +#endif //IR_SENSOR_ANALOG + void lcd_hw_setup_menu(void) // can not be "static" { MENU_BEGIN(); @@ -5536,6 +5583,11 @@ if(!farm_mode){ SETTINGS_NOZZLE; MENU_ITEM_SUBMENU_P(_i("Checks"), lcd_checking_menu); } + +#if IR_SENSOR_ANALOG +FSENSOR_ACTION_NA; +#endif //IR_SENSOR_ANALOG + MENU_END(); } @@ -6850,11 +6902,21 @@ static void lcd_tune_menu() #ifdef FILAMENT_SENSOR if (FSensorStateMenu == 0) { - MENU_ITEM_FUNCTION_P(_T(MSG_FSENSOR_OFF), lcd_fsensor_state_set); + if (fsensor_not_responding && (mmu_enabled == false)) { + /* Filament sensor not working*/ + MENU_ITEM_FUNCTION_P(_i("Fil. sensor [N/A]"), lcd_fsensor_state_set); + } + else { + /* Filament sensor turned off, working, no problems*/ + MENU_ITEM_FUNCTION_P(_T(MSG_FSENSOR_OFF), lcd_fsensor_state_set); + } } else { MENU_ITEM_FUNCTION_P(_T(MSG_FSENSOR_ON), lcd_fsensor_state_set); } +#if IR_SENSOR_ANALOG + FSENSOR_ACTION_NA; +#endif //IR_SENSOR_ANALOG #endif //FILAMENT_SENSOR SETTINGS_AUTO_DEPLETE; @@ -7137,6 +7199,42 @@ void lcd_sdcard_menu() MENU_END(); } +#if IR_SENSOR_ANALOG +static bool lcd_selftest_IRsensor() +{ +bool bAction; +bool bPCBrev03b; +uint16_t volt_IR_int; +float volt_IR; + +volt_IR_int=current_voltage_raw_IR; +bPCBrev03b=(volt_IR_int<((int)IRsensor_Hopen_TRESHOLD)); +volt_IR=VOLT_DIV_REF*((float)volt_IR_int/(1023*OVERSAMPLENR)); +printf_P(PSTR("Measured filament sensor high level: %4.2fV\n"),volt_IR); +if(volt_IR_int<((int)IRsensor_Hmin_TRESHOLD)) + { + lcd_selftest_error(TestError::FsensorLevel,"HIGH",""); + return(false); + } +lcd_show_fullscreen_message_and_wait_P(_i("Please insert filament (but not load them!) into extruder and then press the knob.")); +volt_IR_int=current_voltage_raw_IR; +volt_IR=VOLT_DIV_REF*((float)volt_IR_int/(1023*OVERSAMPLENR)); +printf_P(PSTR("Measured filament sensor low level: %4.2fV\n"),volt_IR); +if(volt_IR_int>((int)IRsensor_Lmax_TRESHOLD)) + { + lcd_selftest_error(TestError::FsensorLevel,"LOW",""); + return(false); + } +if((bPCBrev03b?1:0)!=(uint8_t)oFsensorPCB) // safer then "(uint8_t)bPCBrev03b" + { + printf_P(PSTR("Filament sensor board change detected: revision %S\n"),bPCBrev03b?PSTR("03b or newer"):PSTR("03 or older")); + oFsensorPCB=bPCBrev03b?ClFsensorPCB::_Rev03b:ClFsensorPCB::_Old; + eeprom_update_byte((uint8_t*)EEPROM_FSENSOR_PCB,(uint8_t)oFsensorPCB); + } +return(true); +} +#endif //IR_SENSOR_ANALOG + static void lcd_selftest_v() { (void)lcd_selftest(); @@ -7153,8 +7251,16 @@ bool lcd_selftest() #ifdef TMC2130 FORCE_HIGH_POWER_START; #endif // TMC2130 - _delay(2000); +#if !IR_SENSOR_ANALOG + _delay(2000); +#endif //!IR_SENSOR_ANALOG KEEPALIVE_STATE(IN_HANDLER); +#if IR_SENSOR_ANALOG + bool bAction; + bAction=lcd_show_fullscreen_message_yes_no_and_wait_P(_i("Is filament unloaded?"),false,true); + if(!bAction) + return(false); +#endif //IR_SENSOR_ANALOG _progress = lcd_selftest_screen(TestScreen::ExtruderFan, _progress, 3, true, 2000); #if (defined(FANCHECK) && defined(TACH_0)) @@ -7340,12 +7446,20 @@ bool lcd_selftest() { #ifdef PAT9125 _progress = lcd_selftest_screen(TestScreen::Fsensor, _progress, 3, true, 2000); //check filaments sensor - _result = lcd_selftest_fsensor(); + _result = lcd_selftest_fsensor(); if (_result) { _progress = lcd_selftest_screen(TestScreen::FsensorOk, _progress, 3, true, 2000); //fil sensor OK } #endif //PAT9125 +#if IR_SENSOR_ANALOG + _progress = lcd_selftest_screen(TestScreen::Fsensor, _progress, 3, true, 2000); //check filament sensor + _result = lcd_selftest_IRsensor(); + if (_result) + { + _progress = lcd_selftest_screen(TestScreen::FsensorOk, _progress, 3, true, 2000); //filament sensor OK + } +#endif //IR_SENSOR_ANALOG } } #endif //FILAMENT_SENSOR @@ -7881,11 +7995,17 @@ static void lcd_selftest_error(TestError testError, const char *_error_1, const lcd_puts_P(_T(MSG_SELFTEST_WIRINGERROR)); break; case TestError::TriggeringFsensor: - lcd_set_cursor(0, 2); - lcd_puts_P(_T(MSG_SELFTEST_FILAMENT_SENSOR)); - lcd_set_cursor(0, 3); - lcd_puts_P(_i("False triggering"));////c=20 - break; + lcd_set_cursor(0, 2); + lcd_puts_P(_T(MSG_SELFTEST_FILAMENT_SENSOR)); + lcd_set_cursor(0, 3); + lcd_puts_P(_i("False triggering"));////c=20 + break; + case TestError::FsensorLevel: + lcd_set_cursor(0, 2); + lcd_puts_P(_T(MSG_SELFTEST_FILAMENT_SENSOR)); + lcd_set_cursor(0, 3); + lcd_printf_P(_i("%s level expected"),_error_1);////c=20 + break; } _delay(1000); diff --git a/Firmware/ultralcd.h b/Firmware/ultralcd.h index 2c57c944..65e886c6 100755 --- a/Firmware/ultralcd.h +++ b/Firmware/ultralcd.h @@ -7,6 +7,8 @@ #include "menu.h" #include "mesh_bed_calibration.h" +#include "config.h" + extern void menu_lcd_longpress_func(void); extern void menu_lcd_charsetup_func(void); extern void menu_lcd_lcdupdate_func(void); @@ -234,4 +236,12 @@ enum class WizState : uint8_t void lcd_wizard(WizState state); +#define VOLT_DIV_REF 5 +#if IR_SENSOR_ANALOG +#define IRsensor_Hmin_TRESHOLD (3.0*1023*OVERSAMPLENR/VOLT_DIV_REF) // ~3.0V (0.6*Vcc) +#define IRsensor_Lmax_TRESHOLD (1.5*1023*OVERSAMPLENR/VOLT_DIV_REF) // ~1.5V (0.3*Vcc) +#define IRsensor_Hopen_TRESHOLD (4.6*1023*OVERSAMPLENR/VOLT_DIV_REF) // ~4.6V (N.C. @ Ru~20-50k, Rd'=56k, Ru'=10k) +#define IRsensor_Ldiode_TRESHOLD (0.3*1023*OVERSAMPLENR/VOLT_DIV_REF) // ~0.3V +#endif //IR_SENSOR_ANALOG + #endif //ULTRALCD_H From d491a9801d2f5a6869db658283f380f7ca145ef3 Mon Sep 17 00:00:00 2001 From: MRprusa3d <38257799+MRprusa3d@users.noreply.github.com> Date: Mon, 16 Sep 2019 16:04:45 +0200 Subject: [PATCH 2/4] Update ultralcd.cpp --- Firmware/ultralcd.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 5fe2e976..5a710ba3 100755 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -5392,7 +5392,6 @@ do\ while (0) #endif //IR_SENSOR_ANALOG -void lcd_hw_setup_menu(void) // can not be "static" template static void select_sheet_menu() { From e66574ac5f547c766bb04a0c8bd9b4a8c28d7a2e Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Tue, 19 Nov 2019 13:51:10 +0200 Subject: [PATCH 3/4] Updated branch to use TOGGLE --- Firmware/messages.c | 3 +++ Firmware/messages.h | 3 +++ Firmware/ultralcd.cpp | 8 ++++---- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/Firmware/messages.c b/Firmware/messages.c index f38c2939..bb2e9510 100644 --- a/Firmware/messages.c +++ b/Firmware/messages.c @@ -128,6 +128,9 @@ const char MSG_SOUND_BLIND[] PROGMEM_I1 = ISTR("Assist"); //// const char MSG_MESH[] PROGMEM_I1 = ISTR("Mesh"); //// const char MSG_Z_PROBE_NR[] PROGMEM_I1 = ISTR("Z-probe nr."); //// const char MSG_MAGNETS_COMP[] PROGMEM_I1 = ISTR("Magnets comp."); //// +const char MSG_FS_ACTION[] PROGMEM_I1 = ISTR("FS Action"); //// +const char MSG_FS_CONTINUE[] PROGMEM_I1 = ISTR("Cont."); //// +const char MSG_FS_PAUSE[] PROGMEM_I1 = ISTR("Pause"); //// //not internationalized messages const char MSG_SD_WORKDIR_FAIL[] PROGMEM_N1 = "workDir open failed"; //// diff --git a/Firmware/messages.h b/Firmware/messages.h index 30671533..60a4cc1c 100644 --- a/Firmware/messages.h +++ b/Firmware/messages.h @@ -128,6 +128,9 @@ extern const char MSG_SOUND_BLIND[]; extern const char MSG_MESH[]; extern const char MSG_Z_PROBE_NR[]; extern const char MSG_MAGNETS_COMP[]; +extern const char MSG_FS_ACTION[]; +extern const char MSG_FS_CONTINUE[]; +extern const char MSG_FS_PAUSE[]; //not internationalized messages extern const char MSG_BROWNOUT_RESET[]; diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index e2c82c03..68710ec3 100755 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -5726,10 +5726,10 @@ do\ switch(oFsensorActionNA)\ {\ case ClFsensorActionNA::_Continue:\ - MENU_ITEM_FUNCTION_P(_i("FS Action [cont.]"),lcd_fsensor_actionNA_set);\ + MENU_ITEM_TOGGLE_P(_T(MSG_FS_ACTION), _T(MSG_FS_CONTINUE), lcd_fsensor_actionNA_set);\ break;\ case ClFsensorActionNA::_Pause:\ - MENU_ITEM_FUNCTION_P(_i("FS Action [pause]"),lcd_fsensor_actionNA_set);\ + MENU_ITEM_TOGGLE_P(_T(MSG_FS_ACTION), _T(MSG_FS_PAUSE), lcd_fsensor_actionNA_set);\ break;\ default:\ oFsensorActionNA=ClFsensorActionNA::_Continue;\ @@ -7107,11 +7107,11 @@ static void lcd_tune_menu() if (FSensorStateMenu == 0) { if (fsensor_not_responding && (mmu_enabled == false)) { /* Filament sensor not working*/ - MENU_ITEM_FUNCTION_P(_i("Fil. sensor [N/A]"), lcd_fsensor_state_set); + MENU_ITEM_TOGGLE_P(_T(MSG_MSG_FSENSOR), _T(MSG_NA), lcd_fsensor_state_set); } else { /* Filament sensor turned off, working, no problems*/ - MENU_ITEM_FUNCTION_P(_T(MSG_FSENSOR_OFF), lcd_fsensor_state_set); + MENU_ITEM_TOGGLE_P(_T(MSG_MSG_FSENSOR), _T(MSG_OFF), lcd_fsensor_state_set); } } else { From 45b89c5728f487a3c3a408f52b86aa31d2b04ae7 Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Tue, 19 Nov 2019 13:55:37 +0200 Subject: [PATCH 4/4] Fix typo --- Firmware/ultralcd.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 68710ec3..465fde2b 100755 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -7107,11 +7107,11 @@ static void lcd_tune_menu() if (FSensorStateMenu == 0) { if (fsensor_not_responding && (mmu_enabled == false)) { /* Filament sensor not working*/ - MENU_ITEM_TOGGLE_P(_T(MSG_MSG_FSENSOR), _T(MSG_NA), lcd_fsensor_state_set); + MENU_ITEM_TOGGLE_P(_T(MSG_FSENSOR), _T(MSG_NA), lcd_fsensor_state_set); } else { /* Filament sensor turned off, working, no problems*/ - MENU_ITEM_TOGGLE_P(_T(MSG_MSG_FSENSOR), _T(MSG_OFF), lcd_fsensor_state_set); + MENU_ITEM_TOGGLE_P(_T(MSG_FSENSOR), _T(MSG_OFF), lcd_fsensor_state_set); } } else {