diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index b386d2a0..4dccdf64 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -205,10 +205,6 @@ static LongTimer crashDetTimer; bool mesh_bed_leveling_flag = false; -#ifdef PRUSA_M28 -bool prusa_sd_card_upload = false; -#endif - unsigned long total_filament_used; HeatingStatus heating_status; uint8_t heating_status_counter; @@ -1677,79 +1673,6 @@ void stack_error() { crash_and_burn(dump_crash_reason::stack_error); } -#ifdef PRUSA_M28 -void trace(); - -#define CHUNK_SIZE 64 // bytes -#define SAFETY_MARGIN 1 -char chunk[CHUNK_SIZE+SAFETY_MARGIN]; - -void serial_read_stream() { - - setAllTargetHotends(0); - setTargetBed(0); - - lcd_clear(); - lcd_puts_P(PSTR(" Upload in progress")); - - // first wait for how many bytes we will receive - uint32_t bytesToReceive; - - // receive the four bytes - char bytesToReceiveBuffer[4]; - for (int i=0; i<4; i++) { - int data; - while ((data = MYSERIAL.read()) == -1) {}; - bytesToReceiveBuffer[i] = data; - - } - - // make it a uint32 - memcpy(&bytesToReceive, &bytesToReceiveBuffer, 4); - - // we're ready, notify the sender - MYSERIAL.write('+'); - - // lock in the routine - uint32_t receivedBytes = 0; - while (prusa_sd_card_upload) { - int i; - for (i=0; i<CHUNK_SIZE; i++) { - int data; - - // check if we're not done - if (receivedBytes == bytesToReceive) { - break; - } - - // read the next byte - while ((data = MYSERIAL.read()) == -1) {}; - receivedBytes++; - - // save it to the chunk - chunk[i] = data; - } - - // write the chunk to SD - card.write_command_no_newline(&chunk[0]); - - // notify the sender we're ready for more data - MYSERIAL.write('+'); - - // for safety - manage_heater(); - - // check if we're done - if(receivedBytes == bytesToReceive) { - trace(); // beep - card.closefile(); - prusa_sd_card_upload = false; - SERIAL_PROTOCOLLNRPGM(MSG_FILE_SAVED); - } - } -} -#endif //PRUSA_M28 - /** * Output autoreport values according to features requested in M155 @@ -2481,96 +2404,7 @@ void retract(bool retracting, bool swapretract = false) { } //retract #endif //FWRETRACT -#ifdef PRUSA_M28 -void trace() { - Sound_MakeCustom(25,440,true); -} -#endif -/* -void ramming() { -// float tmp[4] = DEFAULT_MAX_FEEDRATE; - if (current_temperature[0] < 230) { - //PLA - - max_feedrate[E_AXIS] = 50; - //current_position[E_AXIS] -= 8; - //plan_buffer_line_curposXYZE(2100 / 60, active_extruder); - //current_position[E_AXIS] += 8; - //plan_buffer_line_curposXYZE(2100 / 60, active_extruder); - current_position[E_AXIS] += 5.4; - plan_buffer_line_curposXYZE(2800 / 60, active_extruder); - current_position[E_AXIS] += 3.2; - plan_buffer_line_curposXYZE(3000 / 60, active_extruder); - current_position[E_AXIS] += 3; - plan_buffer_line_curposXYZE(3400 / 60, active_extruder); - st_synchronize(); - max_feedrate[E_AXIS] = 80; - current_position[E_AXIS] -= 82; - plan_buffer_line_curposXYZE(9500 / 60, active_extruder); - max_feedrate[E_AXIS] = 50;//tmp[E_AXIS]; - current_position[E_AXIS] -= 20; - plan_buffer_line_curposXYZE(1200 / 60, active_extruder); - current_position[E_AXIS] += 5; - plan_buffer_line_curposXYZE(400 / 60, active_extruder); - current_position[E_AXIS] += 5; - plan_buffer_line_curposXYZE(600 / 60, active_extruder); - current_position[E_AXIS] -= 10; - st_synchronize(); - plan_buffer_line_curposXYZE(600 / 60, active_extruder); - current_position[E_AXIS] += 10; - plan_buffer_line_curposXYZE(600 / 60, active_extruder); - current_position[E_AXIS] -= 10; - plan_buffer_line_curposXYZE(800 / 60, active_extruder); - current_position[E_AXIS] += 10; - plan_buffer_line_curposXYZE(800 / 60, active_extruder); - current_position[E_AXIS] -= 10; - plan_buffer_line_curposXYZE(800 / 60, active_extruder); - st_synchronize(); - } - else { - //ABS - max_feedrate[E_AXIS] = 50; - //current_position[E_AXIS] -= 8; - //plan_buffer_line_curposXYZE(2100 / 60, active_extruder); - //current_position[E_AXIS] += 8; - //plan_buffer_line_curposXYZE(2100 / 60, active_extruder); - current_position[E_AXIS] += 3.1; - plan_buffer_line_curposXYZE(2000 / 60, active_extruder); - current_position[E_AXIS] += 3.1; - plan_buffer_line_curposXYZE(2500 / 60, active_extruder); - current_position[E_AXIS] += 4; - plan_buffer_line_curposXYZE(3000 / 60, active_extruder); - st_synchronize(); - //current_position[X_AXIS] += 23; //delay - //plan_buffer_line_curposXYZE(600/60, active_extruder); //delay - //current_position[X_AXIS] -= 23; //delay - //plan_buffer_line_curposXYZE(600/60, active_extruder); //delay - _delay(4700); - max_feedrate[E_AXIS] = 80; - current_position[E_AXIS] -= 92; - plan_buffer_line_curposXYZE(9900 / 60, active_extruder); - max_feedrate[E_AXIS] = 50;//tmp[E_AXIS]; - current_position[E_AXIS] -= 5; - plan_buffer_line_curposXYZE(800 / 60, active_extruder); - current_position[E_AXIS] += 5; - plan_buffer_line_curposXYZE(400 / 60, active_extruder); - current_position[E_AXIS] -= 5; - plan_buffer_line_curposXYZE(600 / 60, active_extruder); - st_synchronize(); - current_position[E_AXIS] += 5; - plan_buffer_line_curposXYZE(600 / 60, active_extruder); - current_position[E_AXIS] -= 5; - plan_buffer_line_curposXYZE(600 / 60, active_extruder); - current_position[E_AXIS] += 5; - plan_buffer_line_curposXYZE(600 / 60, active_extruder); - current_position[E_AXIS] -= 5; - plan_buffer_line_curposXYZE(600 / 60, active_extruder); - st_synchronize(); - - } - } -*/ #ifdef TMC2130 void force_high_power_mode(bool start_high_power_section) { @@ -4384,10 +4218,9 @@ void process_commands() Set of internal PRUSA commands #### Usage - PRUSA [ Ping | PRN | FAN | thx | uvlo | MMURES | RESET | fv | M28 | SN | Fir | Rev | Lang | Lz | FR ] + PRUSA [ PRN | FAN | thx | uvlo | MMURES | RESET | fv | M28 | SN | Fir | Rev | Lang | Lz | FR ] #### Parameters - - `Ping` - `PRN` - Prints revision of the printer - `FAN` - Prints fan details - `thx` @@ -4408,7 +4241,7 @@ void process_commands() */ if (farm_prusa_code_seen()) {} - else if( code_seen_P(PSTR("FANPINTST"))) { + else if(code_seen_P(PSTR("FANPINTST"))) { gcode_PRUSA_BadRAMBoFanTest(); } else if (code_seen_P(PSTR("FAN"))) { // PRUSA FAN @@ -4432,30 +4265,7 @@ void process_commands() #elif defined(BOOTAPP) //this is a safety precaution. This is because the new bootloader turns off the heaters, but the old one doesn't. The watchdog should be used most of the time. asm volatile("jmp 0x3E000"); #endif - } else if (code_seen_P(PSTR("fv"))) { // PRUSA fv - // get file version - #ifdef SDSUPPORT - card.openFileReadFilteredGcode(strchr_pointer + 3,true); - while (true) { - uint16_t readByte = card.getFilteredGcodeChar(); - MYSERIAL.write(readByte); - if (readByte=='\n') { - break; - } } - card.closefile(); - - #endif // SDSUPPORT - - } -#ifdef PRUSA_M28 - else if (code_seen_P(PSTR("M28"))) { // PRUSA M28 - trace(); - prusa_sd_card_upload = true; - card.openFileWrite(strchr_pointer+4); - - } -#endif //PRUSA_M28 #ifdef PRUSA_SN_SUPPORT else if (code_seen_P(PSTR("SN"))) { // PRUSA SN char SN[20]; diff --git a/Firmware/Prusa_farm.cpp b/Firmware/Prusa_farm.cpp index 059028b5..424f89ff 100644 --- a/Firmware/Prusa_farm.cpp +++ b/Firmware/Prusa_farm.cpp @@ -11,10 +11,6 @@ #ifdef PRUSA_FARM -#define PING_TIME 60 //time in s -#define PING_TIME_LONG 600 //10 min; used when length of commands buffer > 0 to avoid 0 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 @@ -22,11 +18,14 @@ uint8_t farm_mode = 0; static ShortTimer NcTime; static uint8_t farm_timer = 8; -static bool printer_connected = true; -static unsigned long PingTime = 0; static uint8_t status_number = 0; static bool no_response = false; -static uint8_t important_status; +#ifdef PRUSA_M28 +#define CHUNK_SIZE 64 // bytes +#define SAFETY_MARGIN 1 +bool prusa_sd_card_upload = false; +char chunk[CHUNK_SIZE+SAFETY_MARGIN]; +#endif static void prusa_statistics_err(char c); @@ -40,7 +39,9 @@ static void lcd_send_status(); static void proc_commands(); static void lcd_connect_printer(); #endif //FARM_CONNECT_MESSAGE -static void lcd_ping(); +#ifdef PRUSA_M28 +static void trace(); +#endif static void prusa_statistics_err(char c) { @@ -110,7 +111,7 @@ static void prusa_stat_printinfo() { static void lcd_send_status() { if (farm_mode && no_response && (NcTime.expired(NC_TIME * 1000))) { //send important status messages periodicaly - prusa_statistics(important_status); + prusa_statistics(8); NcTime.start(); #ifdef FARM_CONNECT_MESSAGE lcd_connect_printer(); @@ -143,7 +144,7 @@ static void lcd_connect_printer() { delay_keep_alive(100); proc_commands(); if (t == 10) { - prusa_statistics(important_status); + prusa_statistics(8); t = 0; } if (READ(BTN_ENC)) { //if button is not pressed @@ -160,23 +161,76 @@ static void lcd_connect_printer() { } #endif //FARM_CONNECT_MESSAGE -static void lcd_ping() { //chceck if printer is connected to monitoring when in farm mode - if (farm_mode) { - bool empty = cmd_buffer_empty(); - if ((_millis() - PingTime) * 0.001 > (empty ? PING_TIME : PING_TIME_LONG)) { - //if commands buffer is empty use shorter time period - //if there are comamnds in buffer, some long gcodes can delay execution of ping command - //therefore longer period is used - printer_connected = false; +#ifdef PRUSA_M28 +static void trace() { + Sound_MakeCustom(25,440,true); +} + +void serial_read_stream() { + + setAllTargetHotends(0); + setTargetBed(0); + + lcd_clear(); + lcd_puts_P(PSTR(" Upload in progress")); + + // first wait for how many bytes we will receive + uint32_t bytesToReceive; + + // receive the four bytes + char bytesToReceiveBuffer[4]; + for (int i=0; i<4; i++) { + int data; + while ((data = MYSERIAL.read()) == -1) {}; + bytesToReceiveBuffer[i] = data; + + } + + // make it a uint32 + memcpy(&bytesToReceive, &bytesToReceiveBuffer, 4); + + // we're ready, notify the sender + MYSERIAL.write('+'); + + // lock in the routine + uint32_t receivedBytes = 0; + while (prusa_sd_card_upload) { + int i; + for (i=0; i<CHUNK_SIZE; i++) { + int data; + + // check if we're not done + if (receivedBytes == bytesToReceive) { + break; + } + + // read the next byte + while ((data = MYSERIAL.read()) == -1) {}; + receivedBytes++; + + // save it to the chunk + chunk[i] = data; } - else { - printer_connected = true; + + // write the chunk to SD + card.write_command_no_newline(&chunk[0]); + + // notify the sender we're ready for more data + MYSERIAL.write('+'); + + // for safety + manage_heater(); + + // check if we're done + if(receivedBytes == bytesToReceive) { + trace(); // beep + card.closefile(); + prusa_sd_card_upload = false; + SERIAL_PROTOCOLLNRPGM(MSG_FILE_SAVED); } } } - - - +#endif //PRUSA_M28 void prusa_statistics(uint8_t _message) { @@ -336,7 +390,6 @@ void prusa_statistics_update_from_status_screen() { } void prusa_statistics_update_from_lcd_update() { - lcd_ping(); //check that we have received ping command if we are in farm mode lcd_send_status(); } @@ -348,7 +401,6 @@ void farm_mode_init() { } else if (farm_mode) { no_response = true; //we need confirmation by recieving PRUSA thx - important_status = 8; prusa_statistics(8); #ifdef HAS_SECOND_SERIAL_PORT selectedSerialPort = 1; @@ -368,15 +420,33 @@ bool farm_prusa_code_seen() { if (!farm_mode) return false; - if (code_seen_P(PSTR("Ping"))) { // PRUSA Ping - PingTime = _millis(); - } - else if (code_seen_P(PSTR("PRN"))) { // PRUSA PRN + if (code_seen_P(PSTR("PRN"))) { // PRUSA PRN printf_P(_N("%u"), status_number); } else if (code_seen_P(PSTR("thx"))) { // PRUSA thx no_response = false; } +#ifdef PRUSA_M28 + else if (code_seen_P(PSTR("M28"))) { // PRUSA M28 + trace(); + prusa_sd_card_upload = true; + card.openFileWrite(strchr_pointer+4); + } +#endif //PRUSA_M28 + else if (code_seen_P(PSTR("fv"))) { // PRUSA fv + // get file version +#ifdef SDSUPPORT + card.openFileReadFilteredGcode(strchr_pointer + 3, true); + while (true) { + uint16_t readByte = card.getFilteredGcodeChar(); + MYSERIAL.write(readByte); + if (readByte == '\n') { + break; + } + } + card.closefile(); +#endif // SDSUPPORT + } else { return false; } @@ -386,7 +456,6 @@ bool farm_prusa_code_seen() { void farm_gcode_g98() { farm_mode = 1; - PingTime = _millis(); eeprom_update_byte((unsigned char *)EEPROM_FARM_MODE, farm_mode); SilentModeMenu = SILENT_MODE_OFF; eeprom_update_byte((unsigned char *)EEPROM_SILENT, SilentModeMenu); @@ -395,7 +464,6 @@ void farm_gcode_g98() { void farm_gcode_g99() { farm_disable(); - printer_connected = true; lcd_update(2); fCheckModeInit(); // alternatively invoke printer reset } diff --git a/Firmware/Prusa_farm.h b/Firmware/Prusa_farm.h index fc14e1b5..40066db9 100644 --- a/Firmware/Prusa_farm.h +++ b/Firmware/Prusa_farm.h @@ -9,6 +9,10 @@ extern uint8_t farm_mode; #define farm_mode 0 #endif +#ifdef PRUSA_M28 +extern bool prusa_sd_card_upload; +extern void serial_read_stream(); +#endif extern void prusa_statistics(uint8_t _message); extern void prusa_statistics_update_from_status_screen(); extern void prusa_statistics_update_from_lcd_update();