Merge pull request #186 from PavelSindler/MK2

farm mode: improved statistics, "PRUSA thx" gcode, connection to monitoring is forced
This commit is contained in:
PavelSindler 2017-08-29 17:40:34 +02:00 committed by GitHub
commit 4f4d354892
12 changed files with 146 additions and 46 deletions

View File

@ -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();

View File

@ -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

View File

@ -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

View File

@ -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();

View File

@ -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

View File

@ -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) && (inters == 0) )
{
if(card.longFilename[gh] == '\0')
if (strlen(card.longFilename) > 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);
}
}
}

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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