diff --git a/Firmware/Marlin.h b/Firmware/Marlin.h index 230eb2e55..61d7c2c75 100644 --- a/Firmware/Marlin.h +++ b/Firmware/Marlin.h @@ -302,6 +302,10 @@ extern unsigned int custom_message_type; extern unsigned int custom_message_state; extern char snmm_filaments_used; extern unsigned long PingTime; +extern unsigned long NcTime; +extern bool no_response; +extern uint8_t important_status; +extern uint8_t saved_filament_type; // Handling multiple extruders pins @@ -351,3 +355,4 @@ void temp_compensation_apply(); void temp_compensation_start(); void wait_for_heater(long codenum); void serialecho_temperatures(); +void proc_commands(); diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 1aaa892d2..a86c7daa1 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -225,6 +225,8 @@ CardReader card; unsigned long TimeSent = millis(); unsigned long TimeNow = millis(); unsigned long PingTime = millis(); +unsigned long NcTime; + union Data { byte b[2]; @@ -385,6 +387,10 @@ bool cancel_heatup = false ; const char errormagic[] PROGMEM = "Error:"; const char echomagic[] PROGMEM = "echo:"; +bool no_response = false; +uint8_t important_status; +uint8_t saved_filament_type; + //=========================================================================== //=============================Private Variables============================= //=========================================================================== @@ -1010,6 +1016,8 @@ void setup() if (farm_mode) { prusa_statistics(8); + no_response = true; //we need confirmation by recieving PRUSA thx + important_status = 8; selectedSerialPort = 1; } else { selectedSerialPort = 0; @@ -1167,6 +1175,8 @@ void setup() if (farm_mode) { prusa_statistics(8); + no_response = true; //we need confirmation by recieving PRUSA thx + important_status = 8; } // Enable Toshiba FlashAir SD card / WiFi enahanced card. @@ -1385,6 +1395,16 @@ void loop() lcd_update(); } +void proc_commands() { + if (buflen) + { + process_commands(); + if (!cmdbuffer_front_already_processed) + cmdqueue_pop_front(); + cmdbuffer_front_already_processed = false; + } +} + void get_command() { // Test and reserve space for the new command string. @@ -2115,6 +2135,9 @@ void process_commands() MYSERIAL.println("Not in farm mode."); } + } + else if (code_seen("thx")) { + no_response = false; }else if (code_seen("fv")) { // get file version #ifdef SDSUPPORT diff --git a/Firmware/cardreader.cpp b/Firmware/cardreader.cpp index 51c02d7d9..db20b6a86 100644 --- a/Firmware/cardreader.cpp +++ b/Firmware/cardreader.cpp @@ -706,6 +706,7 @@ void CardReader::getfilename_sorted(const uint16_t nr) { */ void CardReader::presort() { + if (farm_mode) return; //sorting is not used in farm mode uint8_t sdSort = eeprom_read_byte((uint8_t*)EEPROM_SD_SORT); if (sdSort == SD_SORT_NONE) return; //sd sort is turned off diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 40e036741..ffeb1315f 100644 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -506,10 +506,10 @@ static void lcd_status_screen() feedmultiply = 999; #endif //ULTIPANEL - if (farm_mode && !printer_connected) { + /*if (farm_mode && !printer_connected) { lcd.setCursor(0, 3); lcd_printPGM(MSG_PRINTER_DISCONNECTED); - } + }*/ } @@ -2133,14 +2133,14 @@ void prusa_statistics(int _message, uint8_t _fil_nr) { farm_timer = 2; break; case 6: // print done - SERIAL_ECHOLN("{[PRN:8]"); + SERIAL_ECHO("{[PRN:8]"); prusa_stat_farm_number(); SERIAL_ECHOLN("}"); status_number = 8; farm_timer = 2; break; case 7: // print done - stopped - SERIAL_ECHOLN("{[PRN:9]"); + SERIAL_ECHO("{[PRN:9]"); prusa_stat_farm_number(); SERIAL_ECHOLN("}"); status_number = 9; @@ -2154,7 +2154,7 @@ void prusa_statistics(int _message, uint8_t _fil_nr) { farm_timer = 2; break; case 20: // echo farm no - SERIAL_ECHOLN("{"); + SERIAL_ECHO("{"); prusa_stat_printerstatus(status_number); prusa_stat_farm_number(); SERIAL_ECHOLN("}"); @@ -2168,19 +2168,19 @@ void prusa_statistics(int _message, uint8_t _fil_nr) { SERIAL_ECHOLN("}"); break; case 22: // waiting for filament change - SERIAL_ECHOLN("{[PRN:5]"); + SERIAL_ECHO("{[PRN:5]"); prusa_stat_farm_number(); SERIAL_ECHOLN("}"); status_number = 5; break; case 90: // Error - Thermal Runaway - SERIAL_ECHOLN("{[ERR:1]"); + SERIAL_ECHO("{[ERR:1]"); prusa_stat_farm_number(); SERIAL_ECHOLN("}"); break; case 91: // Error - Thermal Runaway Preheat - SERIAL_ECHOLN("{[ERR:2]"); + SERIAL_ECHO("{[ERR:2]"); prusa_stat_farm_number(); SERIAL_ECHOLN("}"); break; @@ -2190,7 +2190,7 @@ void prusa_statistics(int _message, uint8_t _fil_nr) { SERIAL_ECHOLN("}"); break; case 93: // Error - Max temp - SERIAL_ECHOLN("{[ERR:4]"); + SERIAL_ECHO("{[ERR:4]"); prusa_stat_farm_number(); SERIAL_ECHOLN("}"); break; @@ -3773,12 +3773,20 @@ void lcd_confirm_print() _ret = 1; filament_type = lcd_choose_color(); prusa_statistics(4, filament_type); + no_response = true; //we need confirmation by recieving PRUSA thx + important_status = 4; + saved_filament_type = filament_type; + NcTime = millis(); } if (cursor_pos == 2) { _ret = 2; filament_type = lcd_choose_color(); prusa_statistics(5, filament_type); + no_response = true; //we need confirmation by recieving PRUSA thx + important_status = 5; + saved_filament_type = filament_type; + NcTime = millis(); } } @@ -3849,7 +3857,7 @@ static void lcd_main_menu() }*/ - + if ( ( IS_SD_PRINTING || is_usb_printing ) && (current_position[Z_AXIS] < Z_HEIGHT_HIDE_LIVE_ADJUST_MENU) && !homing_flag && !mesh_bed_leveling_flag) { MENU_ITEM(submenu, MSG_BABYSTEP_Z, lcd_babystep_z);//8 @@ -4109,7 +4117,7 @@ void lcd_sdcard_stop() lcd_return_to_status(); lcd_ignore_click(true); lcd_commands_type = LCD_COMMAND_STOP_PRINT; - + if (farm_mode) prusa_statistics(7); // Turn off the print fan SET_OUTPUT(FAN_PIN); WRITE(FAN_PIN, 0); @@ -4159,14 +4167,16 @@ void lcd_sdcard_menu() START_MENU(); MENU_ITEM(back, MSG_MAIN, lcd_main_menu); + if (!farm_mode) { #ifdef SDCARD_SORT_ALPHA - EEPROM_read(EEPROM_SD_SORT, (uint8_t*)&sdSort, sizeof(sdSort)); - switch(sdSort){ - case SD_SORT_TIME: MENU_ITEM(function, MSG_SORT_TIME, lcd_sort_type_set); break; - case SD_SORT_ALPHA: MENU_ITEM(function, MSG_SORT_ALPHA, lcd_sort_type_set); break; - default: MENU_ITEM(function, MSG_SORT_NONE, lcd_sort_type_set); - } + EEPROM_read(EEPROM_SD_SORT, (uint8_t*)&sdSort, sizeof(sdSort)); + switch (sdSort) { + case SD_SORT_TIME: MENU_ITEM(function, MSG_SORT_TIME, lcd_sort_type_set); break; + case SD_SORT_ALPHA: MENU_ITEM(function, MSG_SORT_ALPHA, lcd_sort_type_set); break; + default: MENU_ITEM(function, MSG_SORT_NONE, lcd_sort_type_set); + } #endif // SDCARD_SORT_ALPHA + } card.getWorkDirName(); if (card.filename[0] == '/') { @@ -5202,12 +5212,56 @@ void lcd_update(uint8_t lcdDrawUpdateOverride) } if (!SdFatUtil::test_stack_integrity()) stack_error(); lcd_ping(); //check that we have received ping command if we are in farm mode + lcd_send_status(); } void lcd_printer_connected() { printer_connected = true; } +static void lcd_send_status() { + if (farm_mode && no_response && ((millis() - NcTime) > (NC_TIME * 1000))) { + //send important status messages periodicaly + prusa_statistics(important_status, saved_filament_type); + NcTime = millis(); + lcd_connect_printer(); + } +}; + +static void lcd_connect_printer() { + lcd_update_enable(false); + lcd_implementation_clear(); + + bool pressed = false; + int i = 0; + int t = 0; + lcd_set_custom_characters_progress(); + lcd_implementation_print_at(0, 0, "Connect printer to"); + lcd_implementation_print_at(0, 1, "monitoring or hold"); + lcd_implementation_print_at(0, 2, "the knob to continue"); + while (no_response) { + i++; + t++; + delay_keep_alive(100); + proc_commands(); + if (t == 10) { + prusa_statistics(important_status, saved_filament_type); + t = 0; + } + if (READ(BTN_ENC)) { //if button is not pressed + i = 0; + lcd_implementation_print_at(0, 3, " "); + } + if (i!=0) lcd_implementation_print_at((i * 20) / (NC_BUTTON_LONG_PRESS * 10), 3, "\x01"); + if (i == NC_BUTTON_LONG_PRESS * 10) { + no_response = false; + } + } + lcd_set_custom_characters_degree(); + lcd_update_enable(true); + lcd_update(2); +} + void lcd_ping() { //chceck if printer is connected to monitoring when in farm mode if (farm_mode) { bool empty = is_buffer_empty(); diff --git a/Firmware/ultralcd.h b/Firmware/ultralcd.h index 99b3c4485..c0c8d67f0 100644 --- a/Firmware/ultralcd.h +++ b/Firmware/ultralcd.h @@ -266,4 +266,7 @@ void lcd_set_arrows(); void lcd_set_progress(); #endif +static void lcd_send_status(); +static void lcd_connect_printer(); + #endif //ULTRALCD_H \ No newline at end of file diff --git a/Firmware/ultralcd_implementation_hitachi_HD44780.h b/Firmware/ultralcd_implementation_hitachi_HD44780.h index 3c7bbd009..c421140f7 100644 --- a/Firmware/ultralcd_implementation_hitachi_HD44780.h +++ b/Firmware/ultralcd_implementation_hitachi_HD44780.h @@ -831,7 +831,7 @@ static void lcd_implementation_status_screen() if (heating_status != 0) { custom_message = true; } // If printing from SD, show what we are printing - if ((IS_SD_PRINTING) && !custom_message) + if (IS_SD_PRINTING) { if(strcmp(longFilenameOLD, card.longFilename) != 0) @@ -840,38 +840,40 @@ static void lcd_implementation_status_screen() sprintf_P(longFilenameOLD, PSTR("%s"), card.longFilename); scrollstuff = 0; } + if (!custom_message) { - if(strlen(card.longFilename) > LCD_WIDTH) - { - - int inters = 0; - int gh = scrollstuff; - while( ((gh-scrollstuff) LCD_WIDTH) { - lcd.setCursor(gh-scrollstuff, 3); - lcd.print(card.longFilename[gh-1]); - scrollstuff = 0; - gh = scrollstuff; - inters = 1; - } + + int inters = 0; + int gh = scrollstuff; + while (((gh - scrollstuff) < LCD_WIDTH) && (inters == 0)) + { + + if (card.longFilename[gh] == '\0') + { + lcd.setCursor(gh - scrollstuff, 3); + lcd.print(card.longFilename[gh - 1]); + scrollstuff = 0; + gh = scrollstuff; + inters = 1; + } + else + { + lcd.setCursor(gh - scrollstuff, 3); + lcd.print(card.longFilename[gh - 1]); + gh++; + } + + + } + scrollstuff++; + } else { - lcd.setCursor(gh-scrollstuff, 3); - lcd.print(card.longFilename[gh-1]); - gh++; - } - - - } - scrollstuff++; - } - else - { - lcd.print(longFilenameOLD); - } + lcd.print(longFilenameOLD); + } + } } diff --git a/Firmware/variants/1_75mm_MK1-RAMBo10a-E3Dv6full.h b/Firmware/variants/1_75mm_MK1-RAMBo10a-E3Dv6full.h index ba9f55289..ac0463370 100644 --- a/Firmware/variants/1_75mm_MK1-RAMBo10a-E3Dv6full.h +++ b/Firmware/variants/1_75mm_MK1-RAMBo10a-E3Dv6full.h @@ -391,6 +391,8 @@ THERMISTORS SETTINGS #define PING_TIME 60 //time in s #define PING_TIME_LONG 600 //10 min; used when length of commands buffer > 0 to avoid false triggering when dealing with long gcodes #define PING_ALLERT_PERIOD 60 //time in s +#define NC_TIME 10 //time in s for periodic important status messages sending which needs reponse from monitoring +#define NC_BUTTON_LONG_PRESS 15 //time in s #define LONG_PRESS_TIME 1000 //time in ms for button long press #define BUTTON_BLANKING_TIME 200 //time in ms for blanking after button release diff --git a/Firmware/variants/1_75mm_MK1-RAMBo13a-E3Dv6full.h b/Firmware/variants/1_75mm_MK1-RAMBo13a-E3Dv6full.h index 1822a9d73..bf748354b 100644 --- a/Firmware/variants/1_75mm_MK1-RAMBo13a-E3Dv6full.h +++ b/Firmware/variants/1_75mm_MK1-RAMBo13a-E3Dv6full.h @@ -391,6 +391,8 @@ THERMISTORS SETTINGS #define PING_TIME 60 //time in s #define PING_TIME_LONG 600 //10 min; used when length of commands buffer > 0 to avoid false triggering when dealing with long gcodes #define PING_ALLERT_PERIOD 60 //time in s +#define NC_TIME 10 //time in s for periodic important status messages sending which needs reponse from monitoring +#define NC_BUTTON_LONG_PRESS 15 //time in s #define LONG_PRESS_TIME 1000 //time in ms for button long press #define BUTTON_BLANKING_TIME 200 //time in ms for blanking after button release diff --git a/Firmware/variants/1_75mm_MK2-MultiMaterial-RAMBo10a-E3Dv6full.h b/Firmware/variants/1_75mm_MK2-MultiMaterial-RAMBo10a-E3Dv6full.h index 06a7410c3..83917cb98 100644 --- a/Firmware/variants/1_75mm_MK2-MultiMaterial-RAMBo10a-E3Dv6full.h +++ b/Firmware/variants/1_75mm_MK2-MultiMaterial-RAMBo10a-E3Dv6full.h @@ -386,6 +386,8 @@ THERMISTORS SETTINGS #define PING_TIME 60 //time in s #define PING_TIME_LONG 600 //10 min; used when length of commands buffer > 0 to avoid false triggering when dealing with long gcodes #define PING_ALLERT_PERIOD 60 //time in s +#define NC_TIME 10 //time in s for periodic important status messages sending which needs reponse from monitoring +#define NC_BUTTON_LONG_PRESS 15 //time in s #define LONG_PRESS_TIME 1000 //time in ms for button long press #define BUTTON_BLANKING_TIME 200 //time in ms for blanking after button release diff --git a/Firmware/variants/1_75mm_MK2-MultiMaterial-RAMBo13a-E3Dv6full.h b/Firmware/variants/1_75mm_MK2-MultiMaterial-RAMBo13a-E3Dv6full.h index a0afa5f7f..fb3329db6 100644 --- a/Firmware/variants/1_75mm_MK2-MultiMaterial-RAMBo13a-E3Dv6full.h +++ b/Firmware/variants/1_75mm_MK2-MultiMaterial-RAMBo13a-E3Dv6full.h @@ -388,6 +388,8 @@ THERMISTORS SETTINGS #define PING_TIME 60 //time in s #define PING_TIME_LONG 600 //10 min; used when length of commands buffer > 0 to avoid false triggering when dealing with long gcodes #define PING_ALLERT_PERIOD 60 //time in s +#define NC_TIME 10 //time in s for periodic important status messages sending which needs reponse from monitoring +#define NC_BUTTON_LONG_PRESS 15 //time in s #define LONG_PRESS_TIME 1000 //time in ms for button long press #define BUTTON_BLANKING_TIME 200 //time in ms for blanking after button release diff --git a/Firmware/variants/1_75mm_MK2-RAMBo10a-E3Dv6full.h b/Firmware/variants/1_75mm_MK2-RAMBo10a-E3Dv6full.h index d7019845f..d42400dcc 100644 --- a/Firmware/variants/1_75mm_MK2-RAMBo10a-E3Dv6full.h +++ b/Firmware/variants/1_75mm_MK2-RAMBo10a-E3Dv6full.h @@ -386,6 +386,8 @@ THERMISTORS SETTINGS #define PING_TIME 60 //time in s #define PING_TIME_LONG 600 //10 min; used when length of commands buffer > 0 to avoid false triggering when dealing with long gcodes #define PING_ALLERT_PERIOD 60 //time in s +#define NC_TIME 10 //time in s for periodic important status messages sending which needs reponse from monitoring +#define NC_BUTTON_LONG_PRESS 15 //time in s #define LONG_PRESS_TIME 1000 //time in ms for button long press #define BUTTON_BLANKING_TIME 200 //time in ms for blanking after button release diff --git a/Firmware/variants/1_75mm_MK2-RAMBo13a-E3Dv6full.h b/Firmware/variants/1_75mm_MK2-RAMBo13a-E3Dv6full.h index 720e74f5e..6c71bab92 100644 --- a/Firmware/variants/1_75mm_MK2-RAMBo13a-E3Dv6full.h +++ b/Firmware/variants/1_75mm_MK2-RAMBo13a-E3Dv6full.h @@ -388,6 +388,8 @@ THERMISTORS SETTINGS #define PING_TIME 60 //time in s #define PING_TIME_LONG 600 //10 min; used when length of commands buffer > 0 to avoid false triggering when dealing with long gcodes #define PING_ALLERT_PERIOD 60 //time in s +#define NC_TIME 10 //time in s for periodic important status messages sending which needs reponse from monitoring +#define NC_BUTTON_LONG_PRESS 15 //time in s #define LONG_PRESS_TIME 1000 //time in ms for button long press #define BUTTON_BLANKING_TIME 200 //time in ms for blanking after button release