From f8843b25b04723c8799ea64f07f7c2d266e1a7f7 Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Wed, 1 Apr 2020 22:09:49 +0300 Subject: [PATCH 01/36] :sparkles: Progress bar for check_file() --- Firmware/ultralcd.cpp | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index daf9f017..6b140910 100755 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -8760,20 +8760,33 @@ static void lcd_selftest_screen_step(int _row, int _col, int _state, const char static bool check_file(const char* filename) { if (farm_mode) return true; - bool result = false; - uint32_t filesize; card.openFile((char*)filename, true); - filesize = card.getFileSize(); + bool result = false; + const uint32_t filesize = card.getFileSize(); + uint32_t startPos = 0; + const uint16_t bytesToCheck = min(END_FILE_SECTION, filesize); if (filesize > END_FILE_SECTION) { - card.setIndex(filesize - END_FILE_SECTION); - + startPos = filesize - END_FILE_SECTION; + card.setIndex(startPos); } - - while (!card.eof() && !result) { + + lcd_clear(); + lcd_puts_at_P(0, 1, _i("Checking file"));////c=20 r=1 + printf_P(PSTR("startPos=%lu\n"), startPos); + while (!card.eof() && !result) { + lcd_set_cursor(0, 2); + for (int column = 0; column < 20; column++) { + const int8_t percent = ((card.get_sdpos() - startPos) * 100) / bytesToCheck; + if (column < (percent / 5)) + { + lcd_set_cursor(column, 2); + lcd_print('\xFF'); //simple progress bar + } + } + card.sdprinting = true; get_command(); result = check_commands(); - } card.printingHasFinished(); strncpy_P(lcd_status_message, _T(WELCOME_MSG), LCD_WIDTH); From 4c4b4c489cf632b9c7535e1971b96782f3b5f78e Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Tue, 7 Apr 2020 17:09:48 +0300 Subject: [PATCH 02/36] :bug::recycle: Update the feedrate percentage before drawing the screen --- Firmware/ultralcd.cpp | 60 +++++++++++++++++++++---------------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 62c41072..c60b6e42 100755 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -997,6 +997,36 @@ void lcd_status_screen() // NOT static due to using ins } } +#ifdef ULTIPANEL_FEEDMULTIPLY + // Dead zone at 100% feedrate + if ((feedmultiply < 100 && (feedmultiply + int(lcd_encoder)) > 100) || + (feedmultiply > 100 && (feedmultiply + int(lcd_encoder)) < 100)) + { + lcd_encoder = 0; + feedmultiply = 100; + } + if (feedmultiply == 100 && int(lcd_encoder) > ENCODER_FEEDRATE_DEADZONE) + { + feedmultiply += int(lcd_encoder) - ENCODER_FEEDRATE_DEADZONE; + lcd_encoder = 0; + } + else if (feedmultiply == 100 && int(lcd_encoder) < -ENCODER_FEEDRATE_DEADZONE) + { + feedmultiply += int(lcd_encoder) + ENCODER_FEEDRATE_DEADZONE; + lcd_encoder = 0; + } + else if (feedmultiply != 100) + { + feedmultiply += int(lcd_encoder); + lcd_encoder = 0; + } +#endif //ULTIPANEL_FEEDMULTIPLY + + if (feedmultiply < 10) + feedmultiply = 10; + else if (feedmultiply > 999) + feedmultiply = 999; + if (lcd_status_update_delay) lcd_status_update_delay--; else @@ -1073,36 +1103,6 @@ void lcd_status_screen() // NOT static due to using ins menu_submenu(lcd_main_menu); lcd_refresh(); // to maybe revive the LCD if static electricity killed it. } - -#ifdef ULTIPANEL_FEEDMULTIPLY - // Dead zone at 100% feedrate - if ((feedmultiply < 100 && (feedmultiply + int(lcd_encoder)) > 100) || - (feedmultiply > 100 && (feedmultiply + int(lcd_encoder)) < 100)) - { - lcd_encoder = 0; - feedmultiply = 100; - } - if (feedmultiply == 100 && int(lcd_encoder) > ENCODER_FEEDRATE_DEADZONE) - { - feedmultiply += int(lcd_encoder) - ENCODER_FEEDRATE_DEADZONE; - lcd_encoder = 0; - } - else if (feedmultiply == 100 && int(lcd_encoder) < -ENCODER_FEEDRATE_DEADZONE) - { - feedmultiply += int(lcd_encoder) + ENCODER_FEEDRATE_DEADZONE; - lcd_encoder = 0; - } - else if (feedmultiply != 100) - { - feedmultiply += int(lcd_encoder); - lcd_encoder = 0; - } -#endif //ULTIPANEL_FEEDMULTIPLY - - if (feedmultiply < 10) - feedmultiply = 10; - else if (feedmultiply > 999) - feedmultiply = 999; } void lcd_commands() From 1bac0c176518a13a320d7dd69d400f21902927c7 Mon Sep 17 00:00:00 2001 From: 3d-gussner <3d.gussner@gmail.com> Date: Sat, 18 Apr 2020 16:39:04 +0200 Subject: [PATCH 03/36] Add dummy G21 to prevent UNKOWN warnings in serial And as Prusa firmware operates ONLY in milimeters it kind of does what G21 is supposed to do. --- Firmware/Marlin_main.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index e4e1e0b2..d6955f89 100755 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -4276,6 +4276,14 @@ if(eSoundMode!=e_SOUND_MODE_SILENT) #endif //FWRETRACT + /*! + ### G21 - Sets Units to Millimters G21: Set Units to Millimeters + Units are in millimeters. Prusa doesn't support inches. + */ + case 21: + break; //Doing nothing. This is just to prevent serial UNKOWN warnings. + + /*! ### G28 - Home all Axes one at a time G28: Move to Origin (Home) Using `G28` without any parameters will perfom homing of all axes AND mesh bed leveling, while `G28 W` will just home all axes (no mesh bed leveling). From a0cf5714ceca7d60c5874c376898ecd8badd7d13 Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Fri, 19 Jun 2020 15:39:16 +0300 Subject: [PATCH 04/36] M220 M221 --- Firmware/Marlin_main.cpp | 58 ++++++++++++++++++++++++---------------- 1 file changed, 35 insertions(+), 23 deletions(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 8dbc0d84..d4ed0c51 100755 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -7300,17 +7300,26 @@ Sigma_Exit: */ case 220: // M220 S- set speed factor override percentage { - if (code_seen('B')) //backup current speed factor - { - saved_feedmultiply_mm = feedmultiply; - } - if(code_seen('S')) - { - feedmultiply = code_value() ; - } - if (code_seen('R')) { //restore previous feedmultiply - feedmultiply = saved_feedmultiply_mm; - } + bool codesWereSeen = false; + if (code_seen('B')) //backup current speed factor + { + saved_feedmultiply_mm = feedmultiply; + codesWereSeen = true; + } + if (code_seen('S')) + { + feedmultiply = code_value(); + codesWereSeen = true; + } + if (code_seen('R')) //restore previous feedmultiply + { + feedmultiply = saved_feedmultiply_mm; + codesWereSeen = true; + } + if (!codesWereSeen) + { + printf_P(PSTR("%i%%\n"), feedmultiply); + } } break; @@ -7326,23 +7335,26 @@ Sigma_Exit: */ case 221: // M221 S- set extrude factor override percentage { - if(code_seen('S')) - { - int tmp_code = code_value(); - if (code_seen('T')) + if (code_seen('S')) { - uint8_t extruder; - if(setTargetedHotend(221, extruder)){ - break; - } - extruder_multiply[extruder] = tmp_code; + int tmp_code = code_value(); + if (code_seen('T')) + { + uint8_t extruder; + if (setTargetedHotend(221, extruder)) + break; + extruder_multiply[extruder] = tmp_code; + } + else + { + extrudemultiply = tmp_code ; + } } else { - extrudemultiply = tmp_code ; + printf_P(PSTR("%i%%\n"), extrudemultiply); } - } - calculate_extruder_multipliers(); + calculate_extruder_multipliers(); } break; From e2856ba4f579c51c6aa58e8614f71a498e021a6c Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Tue, 21 Jul 2020 12:52:04 +0300 Subject: [PATCH 05/36] Make the serial number available to the user --- Firmware/Marlin_main.cpp | 45 +++++++++++++++------------------------- 1 file changed, 17 insertions(+), 28 deletions(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 8dbc0d84..49470ae1 100755 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -3286,37 +3286,26 @@ void gcode_M701() */ static void gcode_PRUSA_SN() { - if (farm_mode) { - selectedSerialPort = 0; - putchar(';'); - putchar('S'); - int numbersRead = 0; - ShortTimer timeout; - timeout.start(); + uint8_t selectedSerialPort_bak = selectedSerialPort; + selectedSerialPort = 0; + putchar(';'); + putchar('S'); + int numbersRead = 0; + ShortTimer timeout; + timeout.start(); - while (numbersRead < 19) { - while (MSerial.available() > 0) { - uint8_t serial_char = MSerial.read(); - selectedSerialPort = 1; - putchar(serial_char); - numbersRead++; - selectedSerialPort = 0; - } - if (timeout.expired(100u)) break; + while (numbersRead < 19) { + while (MSerial.available() > 0) { + uint8_t serial_char = MSerial.read(); + selectedSerialPort = selectedSerialPort_bak; + putchar(serial_char); + numbersRead++; + selectedSerialPort = 0; } - selectedSerialPort = 1; - putchar('\n'); -#if 0 - for (int b = 0; b < 3; b++) { - _tone(BEEPER, 110); - _delay(50); - _noTone(BEEPER); - _delay(50); - } -#endif - } else { - puts_P(_N("Not in farm mode.")); + if (timeout.expired(100u)) break; } + selectedSerialPort = selectedSerialPort_bak; + putchar('\n'); } //! Detection of faulty RAMBo 1.1b boards equipped with bigger capacitors //! at the TACH_1 pin, which causes bad detection of print fan speed. From d8fbd46cd28910f17e5c7c3947394a61c2c7ff50 Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Thu, 23 Jul 2020 17:28:25 +0300 Subject: [PATCH 06/36] M155 --- Firmware/Configuration_adv.h | 5 + Firmware/Marlin_main.cpp | 214 +++++++++++++++++++++-------------- 2 files changed, 133 insertions(+), 86 deletions(-) diff --git a/Firmware/Configuration_adv.h b/Firmware/Configuration_adv.h index 5386c281..18e7a11b 100644 --- a/Firmware/Configuration_adv.h +++ b/Firmware/Configuration_adv.h @@ -62,6 +62,11 @@ // before setting a PWM value. (Does not work with software PWM for fan on Sanguinololu) #define FAN_KICKSTART_TIME 800 +/** + * Auto-report temperatures with M155 S + */ +#define AUTO_REPORT_TEMPERATURES + diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 8dbc0d84..53b04eee 100755 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -393,6 +393,11 @@ static int saved_fanSpeed = 0; //!< Print fan speed static int saved_feedmultiply_mm = 100; +#ifdef AUTO_REPORT_TEMPERATURES +static LongTimer auto_report_temp_timer; +static uint8_t auto_report_temp_period = 0; +#endif //AUTO_REPORT_TEMPERATURES + //=========================================================================== //=============================Routines====================================== //=========================================================================== @@ -402,6 +407,7 @@ static bool setTargetedHotend(int code, uint8_t &extruder); static void print_time_remaining_init(); static void wait_for_heater(long codenum, uint8_t extruder); static void gcode_G28(bool home_x_axis, bool home_y_axis, bool home_z_axis); +static void gcode_M115(uint8_t extruder); static void temp_compensation_start(); static void temp_compensation_apply(); @@ -1720,6 +1726,18 @@ void host_keepalive() { #endif //HOST_KEEPALIVE_FEATURE if (farm_mode) return; long ms = _millis(); + +#ifdef AUTO_REPORT_TEMPERATURES + if (auto_report_temp_timer.running()) + { + if (auto_report_temp_timer.expired(auto_report_temp_period * 1000ul)) + { + gcode_M115(active_extruder); + auto_report_temp_timer.start(); + } + } +#endif //AUTO_REPORT_TEMPERATURES + if (host_keepalive_interval && busy_state != NOT_BUSY) { if ((ms - prev_busy_signal_ms) < (long)(1000L * host_keepalive_interval)) return; switch (busy_state) { @@ -2523,6 +2541,96 @@ void force_high_power_mode(bool start_high_power_section) { } #endif //TMC2130 +void gcode_M115(uint8_t extruder) +{ +#if defined(TEMP_0_PIN) && TEMP_0_PIN > -1 + SERIAL_PROTOCOLPGM("T:"); + SERIAL_PROTOCOL_F(degHotend(extruder),1); + SERIAL_PROTOCOLPGM(" /"); + SERIAL_PROTOCOL_F(degTargetHotend(extruder),1); +#if defined(TEMP_BED_PIN) && TEMP_BED_PIN > -1 + SERIAL_PROTOCOLPGM(" B:"); + SERIAL_PROTOCOL_F(degBed(),1); + SERIAL_PROTOCOLPGM(" /"); + SERIAL_PROTOCOL_F(degTargetBed(),1); +#endif //TEMP_BED_PIN + for (int8_t cur_extruder = 0; cur_extruder < EXTRUDERS; ++cur_extruder) { + SERIAL_PROTOCOLPGM(" T"); + SERIAL_PROTOCOL(cur_extruder); + SERIAL_PROTOCOL(':'); + SERIAL_PROTOCOL_F(degHotend(cur_extruder),1); + SERIAL_PROTOCOLPGM(" /"); + SERIAL_PROTOCOL_F(degTargetHotend(cur_extruder),1); + } +#else + SERIAL_ERROR_START; + SERIAL_ERRORLNRPGM(_i("No thermistors - no temperature"));////MSG_ERR_NO_THERMISTORS +#endif + + SERIAL_PROTOCOLPGM(" @:"); +#ifdef EXTRUDER_WATTS + SERIAL_PROTOCOL((EXTRUDER_WATTS * getHeaterPower(tmp_extruder))/127); + SERIAL_PROTOCOLPGM("W"); +#else + SERIAL_PROTOCOL(getHeaterPower(extruder)); +#endif + + SERIAL_PROTOCOLPGM(" B@:"); +#ifdef BED_WATTS + SERIAL_PROTOCOL((BED_WATTS * getHeaterPower(-1))/127); + SERIAL_PROTOCOLPGM("W"); +#else + SERIAL_PROTOCOL(getHeaterPower(-1)); +#endif + +#ifdef PINDA_THERMISTOR + SERIAL_PROTOCOLPGM(" P:"); + SERIAL_PROTOCOL_F(current_temperature_pinda,1); +#endif //PINDA_THERMISTOR + +#ifdef AMBIENT_THERMISTOR + SERIAL_PROTOCOLPGM(" A:"); + SERIAL_PROTOCOL_F(current_temperature_ambient,1); +#endif //AMBIENT_THERMISTOR + + +#ifdef SHOW_TEMP_ADC_VALUES + { + float raw = 0.0; +#if defined(TEMP_BED_PIN) && TEMP_BED_PIN > -1 + SERIAL_PROTOCOLPGM(" ADC B:"); + SERIAL_PROTOCOL_F(degBed(),1); + SERIAL_PROTOCOLPGM("C->"); + raw = rawBedTemp(); + SERIAL_PROTOCOL_F(raw/OVERSAMPLENR,5); + SERIAL_PROTOCOLPGM(" Rb->"); + SERIAL_PROTOCOL_F(100 * (1 + (PtA * (raw/OVERSAMPLENR)) + (PtB * sq((raw/OVERSAMPLENR)))), 5); + SERIAL_PROTOCOLPGM(" Rxb->"); + SERIAL_PROTOCOL_F(raw, 5); +#endif + for (int8_t cur_extruder = 0; cur_extruder < EXTRUDERS; ++cur_extruder) { + SERIAL_PROTOCOLPGM(" T"); + SERIAL_PROTOCOL(cur_extruder); + SERIAL_PROTOCOLPGM(":"); + SERIAL_PROTOCOL_F(degHotend(cur_extruder),1); + SERIAL_PROTOCOLPGM("C->"); + raw = rawHotendTemp(cur_extruder); + SERIAL_PROTOCOL_F(raw/OVERSAMPLENR,5); + SERIAL_PROTOCOLPGM(" Rt"); + SERIAL_PROTOCOL(cur_extruder); + SERIAL_PROTOCOLPGM("->"); + SERIAL_PROTOCOL_F(100 * (1 + (PtA * (raw/OVERSAMPLENR)) + (PtB * sq((raw/OVERSAMPLENR)))), 5); + SERIAL_PROTOCOLPGM(" Rx"); + SERIAL_PROTOCOL(cur_extruder); + SERIAL_PROTOCOLPGM("->"); + SERIAL_PROTOCOL_F(raw, 5); + } + } +#endif + SERIAL_PROTOCOLLN(""); + KEEPALIVE_STATE(NOT_BUSY); +} + #ifdef TMC2130 static void gcode_G28(bool home_x_axis, long home_x_value, bool home_y_axis, long home_y_value, bool home_z_axis, long home_z_value, bool calib, bool without_mbl) #else @@ -6280,96 +6388,30 @@ Sigma_Exit: uint8_t extruder; if(setTargetedHotend(105, extruder)){ break; - } - #if defined(TEMP_0_PIN) && TEMP_0_PIN > -1 - SERIAL_PROTOCOLPGM("ok T:"); - SERIAL_PROTOCOL_F(degHotend(extruder),1); - SERIAL_PROTOCOLPGM(" /"); - SERIAL_PROTOCOL_F(degTargetHotend(extruder),1); - #if defined(TEMP_BED_PIN) && TEMP_BED_PIN > -1 - SERIAL_PROTOCOLPGM(" B:"); - SERIAL_PROTOCOL_F(degBed(),1); - SERIAL_PROTOCOLPGM(" /"); - SERIAL_PROTOCOL_F(degTargetBed(),1); - #endif //TEMP_BED_PIN - for (int8_t cur_extruder = 0; cur_extruder < EXTRUDERS; ++cur_extruder) { - SERIAL_PROTOCOLPGM(" T"); - SERIAL_PROTOCOL(cur_extruder); - SERIAL_PROTOCOL(':'); - SERIAL_PROTOCOL_F(degHotend(cur_extruder),1); - SERIAL_PROTOCOLPGM(" /"); - SERIAL_PROTOCOL_F(degTargetHotend(cur_extruder),1); - } - #else - SERIAL_ERROR_START; - SERIAL_ERRORLNRPGM(_i("No thermistors - no temperature"));////MSG_ERR_NO_THERMISTORS - #endif - - SERIAL_PROTOCOLPGM(" @:"); - #ifdef EXTRUDER_WATTS - SERIAL_PROTOCOL((EXTRUDER_WATTS * getHeaterPower(tmp_extruder))/127); - SERIAL_PROTOCOLPGM("W"); - #else - SERIAL_PROTOCOL(getHeaterPower(extruder)); - #endif - - SERIAL_PROTOCOLPGM(" B@:"); - #ifdef BED_WATTS - SERIAL_PROTOCOL((BED_WATTS * getHeaterPower(-1))/127); - SERIAL_PROTOCOLPGM("W"); - #else - SERIAL_PROTOCOL(getHeaterPower(-1)); - #endif - -#ifdef PINDA_THERMISTOR - SERIAL_PROTOCOLPGM(" P:"); - SERIAL_PROTOCOL_F(current_temperature_pinda,1); -#endif //PINDA_THERMISTOR - -#ifdef AMBIENT_THERMISTOR - SERIAL_PROTOCOLPGM(" A:"); - SERIAL_PROTOCOL_F(current_temperature_ambient,1); -#endif //AMBIENT_THERMISTOR - - - #ifdef SHOW_TEMP_ADC_VALUES - {float raw = 0.0; - - #if defined(TEMP_BED_PIN) && TEMP_BED_PIN > -1 - SERIAL_PROTOCOLPGM(" ADC B:"); - SERIAL_PROTOCOL_F(degBed(),1); - SERIAL_PROTOCOLPGM("C->"); - raw = rawBedTemp(); - SERIAL_PROTOCOL_F(raw/OVERSAMPLENR,5); - SERIAL_PROTOCOLPGM(" Rb->"); - SERIAL_PROTOCOL_F(100 * (1 + (PtA * (raw/OVERSAMPLENR)) + (PtB * sq((raw/OVERSAMPLENR)))), 5); - SERIAL_PROTOCOLPGM(" Rxb->"); - SERIAL_PROTOCOL_F(raw, 5); - #endif - for (int8_t cur_extruder = 0; cur_extruder < EXTRUDERS; ++cur_extruder) { - SERIAL_PROTOCOLPGM(" T"); - SERIAL_PROTOCOL(cur_extruder); - SERIAL_PROTOCOLPGM(":"); - SERIAL_PROTOCOL_F(degHotend(cur_extruder),1); - SERIAL_PROTOCOLPGM("C->"); - raw = rawHotendTemp(cur_extruder); - SERIAL_PROTOCOL_F(raw/OVERSAMPLENR,5); - SERIAL_PROTOCOLPGM(" Rt"); - SERIAL_PROTOCOL(cur_extruder); - SERIAL_PROTOCOLPGM("->"); - SERIAL_PROTOCOL_F(100 * (1 + (PtA * (raw/OVERSAMPLENR)) + (PtB * sq((raw/OVERSAMPLENR)))), 5); - SERIAL_PROTOCOLPGM(" Rx"); - SERIAL_PROTOCOL(cur_extruder); - SERIAL_PROTOCOLPGM("->"); - SERIAL_PROTOCOL_F(raw, 5); - }} - #endif - SERIAL_PROTOCOLLN(""); - KEEPALIVE_STATE(NOT_BUSY); + } + + SERIAL_PROTOCOLPGM("ok "); + gcode_M115(extruder); + return; break; } +#ifdef AUTO_REPORT_TEMPERATURES + case 155: + { + if (code_seen('S')) + { + auto_report_temp_period = code_value_uint8(); + if (auto_report_temp_period != 0) + auto_report_temp_timer.start(); + else + auto_report_temp_timer.stop(); + } + } + break; +#endif //AUTO_REPORT_TEMPERATURES + /*! ### M109 - Wait for extruder temperature M109: Set Extruder Temperature and Wait #### Usage From 2c2926882a924d1deabaf046f8a9a82eae9f3594 Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Tue, 18 Aug 2020 19:29:18 +0300 Subject: [PATCH 07/36] Don't switch unnecessarily. Also "\n" the ";S" request --- Firmware/Marlin_main.cpp | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 49470ae1..70a8f7e5 100755 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -3287,25 +3287,23 @@ void gcode_M701() static void gcode_PRUSA_SN() { uint8_t selectedSerialPort_bak = selectedSerialPort; + char SN[20]; selectedSerialPort = 0; - putchar(';'); - putchar('S'); - int numbersRead = 0; + SERIAL_ECHOLNRPGM(PSTR(";S")); + uint8_t numbersRead = 0; ShortTimer timeout; timeout.start(); - while (numbersRead < 19) { - while (MSerial.available() > 0) { - uint8_t serial_char = MSerial.read(); - selectedSerialPort = selectedSerialPort_bak; - putchar(serial_char); + while (numbersRead < (sizeof(SN) - 1)) { + if (MSerial.available() > 0) { + SN[numbersRead] = MSerial.read(); numbersRead++; - selectedSerialPort = 0; } if (timeout.expired(100u)) break; } + SN[numbersRead] = 0; selectedSerialPort = selectedSerialPort_bak; - putchar('\n'); + SERIAL_ECHOLN(SN); } //! Detection of faulty RAMBo 1.1b boards equipped with bigger capacitors //! at the TACH_1 pin, which causes bad detection of print fan speed. From 1659f61dd52ed0be9bc4e825fb10df4414176c2a Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Fri, 21 Aug 2020 10:51:46 +0300 Subject: [PATCH 08/36] Fix fastio extra parenthesis --- Firmware/fastio.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Firmware/fastio.h b/Firmware/fastio.h index e4f25ed8..acded8cb 100644 --- a/Firmware/fastio.h +++ b/Firmware/fastio.h @@ -58,7 +58,7 @@ #define _GET_OUTPUT(IO) ((DIO ## IO ## _DDR & MASK(DIO ## IO ## _PIN)) != 0) /// check if pin is an timer -#define _GET_TIMER(IO) ((DIO ## IO ## _PWM) +#define _GET_TIMER(IO) (DIO ## IO ## _PWM) // why double up on these macros? see http://gcc.gnu.org/onlinedocs/cpp/Stringification.html From 3e7bba54e0c4caffc8d39e47af9f4659d8589aac Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Fri, 28 Aug 2020 17:32:07 +0300 Subject: [PATCH 09/36] SD card released message --- Firmware/cardreader.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Firmware/cardreader.cpp b/Firmware/cardreader.cpp index a49cd6d6..fdef1cd4 100644 --- a/Firmware/cardreader.cpp +++ b/Firmware/cardreader.cpp @@ -243,6 +243,8 @@ void CardReader::release() { sdprinting = false; cardOK = false; + SERIAL_ECHO_START; + SERIAL_ECHOLNRPGM(_n("SD card released"));////MSG_SD_CARD_RELEASED } void CardReader::startFileprint() From 7ac16d5f045aef836a1cf7d36b9f9cfeee45192d Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Mon, 7 Sep 2020 19:42:53 +0300 Subject: [PATCH 10/36] Menu view return patch --- Firmware/menu.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Firmware/menu.cpp b/Firmware/menu.cpp index d31dce7e..3c4e8926 100755 --- a/Firmware/menu.cpp +++ b/Firmware/menu.cpp @@ -48,6 +48,7 @@ void menu_goto(menu_func_t menu, const uint32_t encoder, const bool feedback, bo { menu_menu = menu; lcd_encoder = encoder; + menu_top = 0; //reset menu view. Needed if menu_back() is called from deep inside a menu, such as Support asm("sei"); if (reset_menu_state) { From 160af0a62482c27d57f152a2e5c8bdcb84214166 Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Fri, 11 Sep 2020 16:11:28 +0300 Subject: [PATCH 11/36] Printer capabilities --- Firmware/Configuration_adv.h | 5 +++++ Firmware/Marlin_main.cpp | 16 ++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/Firmware/Configuration_adv.h b/Firmware/Configuration_adv.h index 7ab7a2ee..29f7e951 100644 --- a/Firmware/Configuration_adv.h +++ b/Firmware/Configuration_adv.h @@ -376,6 +376,11 @@ const unsigned int dropsegments=5; //everything with less than this number of st #endif #endif +/** + * Include capabilities in M115 output + */ +// #define EXTENDED_CAPABILITIES_REPORT + //=========================================================================== //============================= Define Defines ============================ //=========================================================================== diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index f1908f21..85d54d3b 100755 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -3404,6 +3404,17 @@ static void gcode_G92() } } +#ifdef EXTENDED_CAPABILITIES_REPORT + +static void cap_line(const char* name, bool ena = false) { + printf_P(PSTR("Cap:%S:%c\n"), name, (char)ena + '0'); +} + +static void extended_capabilities_report() +{ + //@todo +} +#endif //EXTENDED_CAPABILITIES_REPORT #ifdef BACKLASH_X extern uint8_t st_backlash_x; @@ -6803,6 +6814,11 @@ Sigma_Exit: SERIAL_ECHOPGM(" UUID:"); SERIAL_ECHOLNPGM(MACHINE_UUID); } + +#ifdef EXTENDED_CAPABILITIES_REPORT + extended_capabilities_report(); +#endif //EXTENDED_CAPABILITIES_REPORT + break; /*! From eb007c35d27f94eb880653a39ba21930cae497bd Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Fri, 11 Sep 2020 16:12:49 +0300 Subject: [PATCH 12/36] Macros initial --- Firmware/Marlin.h | 7 +------ Firmware/Marlin_main.cpp | 9 +++------ Firmware/backlight.cpp | 6 +++--- Firmware/language.c | 6 +++--- Firmware/language.h | 4 +--- Firmware/macros.h | 18 ++++++++++++++++++ Firmware/tone04.c | 12 +++--------- Firmware/uart2.c | 5 +++-- 8 files changed, 35 insertions(+), 32 deletions(-) create mode 100644 Firmware/macros.h diff --git a/Firmware/Marlin.h b/Firmware/Marlin.h index a1736e9c..6e4b2420 100755 --- a/Firmware/Marlin.h +++ b/Firmware/Marlin.h @@ -4,7 +4,7 @@ #ifndef MARLIN_H #define MARLIN_H -#define FORCE_INLINE __attribute__((always_inline)) inline +#include "macros.h" #include #include @@ -287,11 +287,6 @@ FORCE_INLINE unsigned long millis_nc() { void setPwmFrequency(uint8_t pin, int val); #endif -#ifndef CRITICAL_SECTION_START - #define CRITICAL_SECTION_START unsigned char _sreg = SREG; cli(); - #define CRITICAL_SECTION_END SREG = _sreg; -#endif //CRITICAL_SECTION_START - extern bool fans_check_enabled; extern float homing_feedrate[]; extern uint8_t axis_relative_modes; diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 85d54d3b..4ea48894 100755 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -47,7 +47,9 @@ #include "Configuration.h" #include "Marlin.h" #include "config.h" - + +#include "macros.h" + #ifdef ENABLE_AUTO_BED_LEVELING #include "vector_3.h" #ifdef AUTO_BED_LEVELING_GRID @@ -139,11 +141,6 @@ #include "cmdqueue.h" #include "io_atmega2560.h" -// Macros for bit masks -#define BIT(b) (1<<(b)) -#define TEST(n,b) (((n)&BIT(b))!=0) -#define SET_BIT(n,b,value) (n) ^= ((-value)^(n)) & (BIT(b)) - //Macro for print fan speed #define FAN_PULSE_WIDTH_LIMIT ((fanSpeed > 100) ? 3 : 4) //time in ms diff --git a/Firmware/backlight.cpp b/Firmware/backlight.cpp index 6500837e..b59a65ef 100644 --- a/Firmware/backlight.cpp +++ b/Firmware/backlight.cpp @@ -1,10 +1,10 @@ //backlight.cpp #include "backlight.h" +#include "macros.h" #include #include #include "eeprom.h" -#include "Marlin.h" #include "pins.h" #include "fastio.h" #include "Timer.h" @@ -111,10 +111,10 @@ void backlight_init() #else //LCD_BL_PIN -void force_bl_on(__attribute__((unused)) bool section_start) {} +void force_bl_on(_UNUSED bool section_start) {} void backlight_update() {} void backlight_init() {} void backlight_save() {} -void backlight_wake(__attribute__((unused)) const uint8_t flashNo) {} +void backlight_wake(_UNUSED const uint8_t flashNo) {} #endif //LCD_BL_PIN \ No newline at end of file diff --git a/Firmware/language.c b/Firmware/language.c index e4376096..f7d02b22 100644 --- a/Firmware/language.c +++ b/Firmware/language.c @@ -17,10 +17,10 @@ uint8_t lang_selected = 0; #if (LANG_MODE == 0) //primary language only -uint8_t lang_select(__attribute__((unused)) uint8_t lang) { return 0; } +uint8_t lang_select(_UNUSED uint8_t lang) { return 0; } uint8_t lang_get_count() { return 1; } -uint16_t lang_get_code(__attribute__((unused)) uint8_t lang) { return LANG_CODE_EN; } -const char* lang_get_name_by_code(__attribute__((unused)) uint16_t code) { return _n("English"); } +uint16_t lang_get_code(_UNUSED uint8_t lang) { return LANG_CODE_EN; } +const char* lang_get_name_by_code(_UNUSED uint16_t code) { return _n("English"); } void lang_reset(void) { } uint8_t lang_is_selected(void) { return 1; } diff --git a/Firmware/language.h b/Firmware/language.h index 1e4137bf..4f89b9f2 100644 --- a/Firmware/language.h +++ b/Firmware/language.h @@ -5,6 +5,7 @@ #include "config.h" +#include "macros.h" #include #ifdef DEBUG_SEC_LANG #include @@ -22,9 +23,6 @@ #define MSG_FW_VERSION "Firmware" -#define STRINGIFY_(n) #n -#define STRINGIFY(n) STRINGIFY_(n) - #if (LANG_MODE == 0) //primary language only #define PROGMEM_I2 __attribute__((section(".progmem0"))) #define PROGMEM_I1 __attribute__((section(".progmem1"))) diff --git a/Firmware/macros.h b/Firmware/macros.h new file mode 100644 index 00000000..c27dbde7 --- /dev/null +++ b/Firmware/macros.h @@ -0,0 +1,18 @@ +#ifndef MACROS_H +#define MACROS_H + + +#define FORCE_INLINE __attribute__((always_inline)) inline +#define _UNUSED __attribute__((unused)) + +#ifndef CRITICAL_SECTION_START + #define CRITICAL_SECTION_START unsigned char _sreg = SREG; cli(); + #define CRITICAL_SECTION_END SREG = _sreg; +#endif //CRITICAL_SECTION_START + +// Macros to make a string from a macro +#define STRINGIFY_(M) #M +#define STRINGIFY(M) STRINGIFY_(M) + + +#endif //MACROS_H diff --git a/Firmware/tone04.c b/Firmware/tone04.c index 41f904a9..42b19682 100644 --- a/Firmware/tone04.c +++ b/Firmware/tone04.c @@ -10,14 +10,8 @@ #include #include #include "pins.h" - -#ifndef CRITICAL_SECTION_START - #define CRITICAL_SECTION_START unsigned char _sreg = SREG; cli(); - #define CRITICAL_SECTION_END SREG = _sreg; -#endif //CRITICAL_SECTION_START - - #include "fastio.h" +#include "macros.h" void timer4_init(void) { @@ -79,7 +73,7 @@ ISR(TIMER4_OVF_vect) WRITE(BEEPER, 0); } -void tone4(__attribute__((unused)) uint8_t _pin, uint16_t frequency) +void tone4(_UNUSED uint8_t _pin, uint16_t frequency) { //this ocr and prescalarbits calculation is taken from the Arduino core and simplified for one type of timer only uint8_t prescalarbits = 0b001; @@ -105,7 +99,7 @@ void tone4(__attribute__((unused)) uint8_t _pin, uint16_t frequency) CRITICAL_SECTION_END; } -void noTone4(__attribute__((unused)) uint8_t _pin) +void noTone4(_UNUSED uint8_t _pin) { CRITICAL_SECTION_START; // Revert prescaler to CLK/1024 diff --git a/Firmware/uart2.c b/Firmware/uart2.c index 47238999..9a2a724e 100644 --- a/Firmware/uart2.c +++ b/Firmware/uart2.c @@ -4,6 +4,7 @@ #include #include #include "rbuf.h" +#include "macros.h" #define UART2_BAUD 115200 #define UART_BAUD_SELECT(baudRate,xtalCpu) (((float)(xtalCpu))/(((float)(baudRate))*8.0)-1.0+0.5) @@ -16,7 +17,7 @@ uint8_t uart2_ibuf[14] = {0, 0}; FILE _uart2io = {0}; -int uart2_putchar(char c, FILE *stream __attribute__((unused))) +int uart2_putchar(char c, _UNUSED FILE *stream) { while (!uart2_txready); UDR2 = c; // transmit byte @@ -25,7 +26,7 @@ int uart2_putchar(char c, FILE *stream __attribute__((unused))) return 0; } -int uart2_getchar(FILE *stream __attribute__((unused))) +int uart2_getchar(_UNUSED FILE *stream) { if (rbuf_empty(uart2_ibuf)) return -1; return rbuf_get(uart2_ibuf); From c3abd4ffe670faaa1d9b44bf4c52bfcd58ba500c Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Fri, 11 Sep 2020 17:43:38 +0300 Subject: [PATCH 13/36] Remove io_atmega2560.h and some more macros --- Firmware/Marlin_main.cpp | 3 +- Firmware/fastio.h | 28 +-- Firmware/fsensor.cpp | 6 +- Firmware/heatbed_pwm.cpp | 1 - Firmware/io_atmega2560.h | 374 -------------------------------------- Firmware/macros.h | 17 ++ Firmware/mmu.cpp | 26 ++- Firmware/pins_Einsy_1_0.h | 2 + Firmware/swi2c.c | 58 +++--- Firmware/timer02.c | 3 - Firmware/ultralcd.cpp | 5 +- Firmware/w25x20cl.c | 8 +- 12 files changed, 79 insertions(+), 452 deletions(-) delete mode 100644 Firmware/io_atmega2560.h diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 4ea48894..7f61c0a8 100755 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -139,7 +139,6 @@ #include "sound.h" #include "cmdqueue.h" -#include "io_atmega2560.h" //Macro for print fan speed #define FAN_PULSE_WIDTH_LIMIT ((fanSpeed > 100) ? 3 : 4) //time in ms @@ -876,7 +875,7 @@ static void check_if_fw_is_on_right_printer(){ #ifdef PAT9125 //will return 1 only if IR can detect filament in bondtech extruder so this may fail even when we have IR sensor - const uint8_t ir_detected = !(PIN_GET(IR_SENSOR_PIN)); + const uint8_t ir_detected = !READ(IR_SENSOR_PIN); if (ir_detected){ lcd_show_fullscreen_message_and_wait_P(_i("MK3 firmware detected on MK3S printer"));}////c=20 r=3 #endif //PAT9125 diff --git a/Firmware/fastio.h b/Firmware/fastio.h index acded8cb..19c278d4 100644 --- a/Firmware/fastio.h +++ b/Firmware/fastio.h @@ -7,15 +7,7 @@ #define _FASTIO_ARDUINO_H #include - -/* - utility functions -*/ - -#ifndef MASK -/// MASKING- returns \f$2^PIN\f$ -#define MASK(PIN) (1 << PIN) -#endif +#include "macros.h" /* magic I/O routines @@ -23,20 +15,20 @@ */ /// Read a pin -#define _READ(IO) ((bool)(DIO ## IO ## _RPORT & MASK(DIO ## IO ## _PIN))) +#define _READ(IO) ((bool)(DIO ## IO ## _RPORT & _BV(DIO ## IO ## _PIN))) /// write to a pin // On some boards pins > 0x100 are used. These are not converted to atomic actions. An critical section is needed. -#define _WRITE_NC(IO, v) do { if (v) {DIO ## IO ## _WPORT |= MASK(DIO ## IO ## _PIN); } else {DIO ## IO ## _WPORT &= ~MASK(DIO ## IO ## _PIN); }; } while (0) +#define _WRITE_NC(IO, v) do { if (v) {DIO ## IO ## _WPORT |= _BV(DIO ## IO ## _PIN); } else {DIO ## IO ## _WPORT &= ~_BV(DIO ## IO ## _PIN); }; } while (0) #define _WRITE_C(IO, v) do { if (v) { \ CRITICAL_SECTION_START; \ - {DIO ## IO ## _WPORT |= MASK(DIO ## IO ## _PIN); }\ + {DIO ## IO ## _WPORT |= _BV(DIO ## IO ## _PIN); }\ CRITICAL_SECTION_END; \ }\ else {\ CRITICAL_SECTION_START; \ - {DIO ## IO ## _WPORT &= ~MASK(DIO ## IO ## _PIN); }\ + {DIO ## IO ## _WPORT &= ~_BV(DIO ## IO ## _PIN); }\ CRITICAL_SECTION_END; \ }\ }\ @@ -45,17 +37,17 @@ #define _WRITE(IO, v) do { if (&(DIO ## IO ## _RPORT) >= (uint8_t *)0x100) {_WRITE_C(IO, v); } else {_WRITE_NC(IO, v); }; } while (0) /// toggle a pin -#define _TOGGLE(IO) do {DIO ## IO ## _RPORT = MASK(DIO ## IO ## _PIN); } while (0) +#define _TOGGLE(IO) do {DIO ## IO ## _RPORT = _BV(DIO ## IO ## _PIN); } while (0) /// set pin as input -#define _SET_INPUT(IO) do {DIO ## IO ## _DDR &= ~MASK(DIO ## IO ## _PIN); } while (0) +#define _SET_INPUT(IO) do {DIO ## IO ## _DDR &= ~_BV(DIO ## IO ## _PIN); } while (0) /// set pin as output -#define _SET_OUTPUT(IO) do {DIO ## IO ## _DDR |= MASK(DIO ## IO ## _PIN); } while (0) +#define _SET_OUTPUT(IO) do {DIO ## IO ## _DDR |= _BV(DIO ## IO ## _PIN); } while (0) /// check if pin is an input -#define _GET_INPUT(IO) ((DIO ## IO ## _DDR & MASK(DIO ## IO ## _PIN)) == 0) +#define _GET_INPUT(IO) ((DIO ## IO ## _DDR & _BV(DIO ## IO ## _PIN)) == 0) /// check if pin is an output -#define _GET_OUTPUT(IO) ((DIO ## IO ## _DDR & MASK(DIO ## IO ## _PIN)) != 0) +#define _GET_OUTPUT(IO) ((DIO ## IO ## _DDR & _BV(DIO ## IO ## _PIN)) != 0) /// check if pin is an timer #define _GET_TIMER(IO) (DIO ## IO ## _PWM) diff --git a/Firmware/fsensor.cpp b/Firmware/fsensor.cpp index 7908c5db..c81a5ac6 100755 --- a/Firmware/fsensor.cpp +++ b/Firmware/fsensor.cpp @@ -6,7 +6,6 @@ #include #include "pat9125.h" #include "stepper.h" -#include "io_atmega2560.h" #include "cmdqueue.h" #include "ultralcd.h" #include "mmu.h" @@ -608,9 +607,8 @@ void fsensor_st_block_chunk(int cnt) if (!fsensor_enabled) return; fsensor_st_cnt += cnt; - // !!! bit toggling (PINxn <- 1) (for PinChangeInterrupt) does not work for some MCU pins - if (PIN_GET(FSENSOR_INT_PIN)) {PIN_VAL(FSENSOR_INT_PIN, LOW);} - else {PIN_VAL(FSENSOR_INT_PIN, HIGH);} + // !!! bit toggling (PINxn <- 1) (for PinChangeInterrupt) does not work for some MCU pins + WRITE(FSENSOR_INT_PIN, !READ(FSENSOR_INT_PIN)); } #endif //PAT9125 diff --git a/Firmware/heatbed_pwm.cpp b/Firmware/heatbed_pwm.cpp index 8121df3e..b97da52c 100755 --- a/Firmware/heatbed_pwm.cpp +++ b/Firmware/heatbed_pwm.cpp @@ -1,6 +1,5 @@ #include #include -#include "io_atmega2560.h" // All this is about silencing the heat bed, as it behaves like a loudspeaker. // Basically, we want the PWM heating switched at 30Hz (or so) which is a well ballanced diff --git a/Firmware/io_atmega2560.h b/Firmware/io_atmega2560.h deleted file mode 100644 index e353eb05..00000000 --- a/Firmware/io_atmega2560.h +++ /dev/null @@ -1,374 +0,0 @@ -//io_atmega2560.h -#ifndef _IO_ATMEGA2560 -#define _IO_ATMEGA2560 - - -#define __PIN_P0 PINE -#define __PIN_P1 PINE -#define __PIN_P2 PINE -#define __PIN_P3 PINE -#define __PIN_P4 PING -#define __PIN_P5 PINE -#define __PIN_P6 PINH -#define __PIN_P7 PINH -#define __PIN_P8 PINH -#define __PIN_P9 PINH -#define __PIN_P10 PINB -#define __PIN_P11 PINB -#define __PIN_P12 PINB -#define __PIN_P13 PINB -#define __PIN_P14 PINJ -#define __PIN_P15 PINJ -#define __PIN_P16 PINH -#define __PIN_P17 PINH -#define __PIN_P18 PIND -#define __PIN_P19 PIND -#define __PIN_P20 PIND -#define __PIN_P21 PIND -#define __PIN_P22 PINA -#define __PIN_P23 PINA -#define __PIN_P24 PINA -#define __PIN_P25 PINA -#define __PIN_P26 PINA -#define __PIN_P27 PINA -#define __PIN_P28 PINA -#define __PIN_P29 PINA -#define __PIN_P30 PINC -#define __PIN_P31 PINC -#define __PIN_P32 PINC -#define __PIN_P33 PINC -#define __PIN_P34 PINC -#define __PIN_P35 PINC -#define __PIN_P36 PINC -#define __PIN_P37 PINC -#define __PIN_P38 PIND -#define __PIN_P39 PING -#define __PIN_P40 PING -#define __PIN_P41 PING -#define __PIN_P42 PINL -#define __PIN_P43 PINL -#define __PIN_P44 PINL -#define __PIN_P45 PINL -#define __PIN_P46 PINL -#define __PIN_P47 PINL -#define __PIN_P48 PINL -#define __PIN_P49 PINL -#define __PIN_P50 PINB -#define __PIN_P51 PINB -#define __PIN_P52 PINB -#define __PIN_P53 PINB -#define __PIN_P54 PINF -#define __PIN_P55 PINF -#define __PIN_P56 PINF -#define __PIN_P57 PINF -#define __PIN_P58 PINF -#define __PIN_P59 PINF -#define __PIN_P60 PINF -#define __PIN_P61 PINF -#define __PIN_P62 PINK -#define __PIN_P63 PINK -#define __PIN_P64 PINK -#define __PIN_P65 PINK -#define __PIN_P66 PINK -#define __PIN_P67 PINK -#define __PIN_P68 PINK -#define __PIN_P69 PINK -#define __PIN_P70 PING -#define __PIN_P71 PING -#define __PIN_P72 PINJ -#define __PIN_P73 PINJ -#define __PIN_P74 PINJ -#define __PIN_P75 PINJ -#define __PIN_P76 PINJ -#define __PIN_P77 PINJ -#define __PIN_P78 PINE -#define __PIN_P79 PINE -#define __PIN_P80 PINE -#define __PIN_P81 PIND -#define __PIN_P82 PIND -#define __PIN_P83 PIND -#define __PIN_P84 PINH -#define __PIN_P85 PINH - -#define __PORT_P0 PORTE -#define __PORT_P1 PORTE -#define __PORT_P2 PORTE -#define __PORT_P3 PORTE -#define __PORT_P4 PORTG -#define __PORT_P5 PORTE -#define __PORT_P6 PORTH -#define __PORT_P7 PORTH -#define __PORT_P8 PORTH -#define __PORT_P9 PORTH -#define __PORT_P10 PORTB -#define __PORT_P11 PORTB -#define __PORT_P12 PORTB -#define __PORT_P13 PORTB -#define __PORT_P14 PORTJ -#define __PORT_P15 PORTJ -#define __PORT_P16 PORTH -#define __PORT_P17 PORTH -#define __PORT_P18 PORTD -#define __PORT_P19 PORTD -#define __PORT_P20 PORTD -#define __PORT_P21 PORTD -#define __PORT_P22 PORTA -#define __PORT_P23 PORTA -#define __PORT_P24 PORTA -#define __PORT_P25 PORTA -#define __PORT_P26 PORTA -#define __PORT_P27 PORTA -#define __PORT_P28 PORTA -#define __PORT_P29 PORTA -#define __PORT_P30 PORTC -#define __PORT_P31 PORTC -#define __PORT_P32 PORTC -#define __PORT_P33 PORTC -#define __PORT_P34 PORTC -#define __PORT_P35 PORTC -#define __PORT_P36 PORTC -#define __PORT_P37 PORTC -#define __PORT_P38 PORTD -#define __PORT_P39 PORTG -#define __PORT_P40 PORTG -#define __PORT_P41 PORTG -#define __PORT_P42 PORTL -#define __PORT_P43 PORTL -#define __PORT_P44 PORTL -#define __PORT_P45 PORTL -#define __PORT_P46 PORTL -#define __PORT_P47 PORTL -#define __PORT_P48 PORTL -#define __PORT_P49 PORTL -#define __PORT_P50 PORTB -#define __PORT_P51 PORTB -#define __PORT_P52 PORTB -#define __PORT_P53 PORTB -#define __PORT_P54 PORTF -#define __PORT_P55 PORTF -#define __PORT_P56 PORTF -#define __PORT_P57 PORTF -#define __PORT_P58 PORTF -#define __PORT_P59 PORTF -#define __PORT_P60 PORTF -#define __PORT_P61 PORTF -#define __PORT_P62 PORTK -#define __PORT_P63 PORTK -#define __PORT_P64 PORTK -#define __PORT_P65 PORTK -#define __PORT_P66 PORTK -#define __PORT_P67 PORTK -#define __PORT_P68 PORTK -#define __PORT_P69 PORTK -#define __PORT_P70 PORTG -#define __PORT_P71 PORTG -#define __PORT_P72 PORTJ -#define __PORT_P73 PORTJ -#define __PORT_P74 PORTJ -#define __PORT_P75 PORTJ -#define __PORT_P76 PORTJ -#define __PORT_P77 PORTJ -#define __PORT_P78 PORTE -#define __PORT_P79 PORTE -#define __PORT_P80 PORTE -#define __PORT_P81 PORTD -#define __PORT_P82 PORTD -#define __PORT_P83 PORTD -#define __PORT_P84 PORTH -#define __PORT_P85 PORTH - -#define __DDR_P0 DDRE -#define __DDR_P1 DDRE -#define __DDR_P2 DDRE -#define __DDR_P3 DDRE -#define __DDR_P4 DDRG -#define __DDR_P5 DDRE -#define __DDR_P6 DDRH -#define __DDR_P7 DDRH -#define __DDR_P8 DDRH -#define __DDR_P9 DDRH -#define __DDR_P10 DDRB -#define __DDR_P11 DDRB -#define __DDR_P12 DDRB -#define __DDR_P13 DDRB -#define __DDR_P14 DDRJ -#define __DDR_P15 DDRJ -#define __DDR_P16 DDRH -#define __DDR_P17 DDRH -#define __DDR_P18 DDRD -#define __DDR_P19 DDRD -#define __DDR_P20 DDRD -#define __DDR_P21 DDRD -#define __DDR_P22 DDRA -#define __DDR_P23 DDRA -#define __DDR_P24 DDRA -#define __DDR_P25 DDRA -#define __DDR_P26 DDRA -#define __DDR_P27 DDRA -#define __DDR_P28 DDRA -#define __DDR_P29 DDRA -#define __DDR_P30 DDRC -#define __DDR_P31 DDRC -#define __DDR_P32 DDRC -#define __DDR_P33 DDRC -#define __DDR_P34 DDRC -#define __DDR_P35 DDRC -#define __DDR_P36 DDRC -#define __DDR_P37 DDRC -#define __DDR_P38 DDRD -#define __DDR_P39 DDRG -#define __DDR_P40 DDRG -#define __DDR_P41 DDRG -#define __DDR_P42 DDRL -#define __DDR_P43 DDRL -#define __DDR_P44 DDRL -#define __DDR_P45 DDRL -#define __DDR_P46 DDRL -#define __DDR_P47 DDRL -#define __DDR_P48 DDRL -#define __DDR_P49 DDRL -#define __DDR_P50 DDRB -#define __DDR_P51 DDRB -#define __DDR_P52 DDRB -#define __DDR_P53 DDRB -#define __DDR_P54 DDRF -#define __DDR_P55 DDRF -#define __DDR_P56 DDRF -#define __DDR_P57 DDRF -#define __DDR_P58 DDRF -#define __DDR_P59 DDRF -#define __DDR_P60 DDRF -#define __DDR_P61 DDRF -#define __DDR_P62 DDRK -#define __DDR_P63 DDRK -#define __DDR_P64 DDRK -#define __DDR_P65 DDRK -#define __DDR_P66 DDRK -#define __DDR_P67 DDRK -#define __DDR_P68 DDRK -#define __DDR_P69 DDRK -#define __DDR_P70 DDRG -#define __DDR_P71 DDRG -#define __DDR_P72 DDRJ -#define __DDR_P73 DDRJ -#define __DDR_P74 DDRJ -#define __DDR_P75 DDRJ -#define __DDR_P76 DDRJ -#define __DDR_P77 DDRJ -#define __DDR_P78 DDRE -#define __DDR_P79 DDRE -#define __DDR_P80 DDRE -#define __DDR_P81 DDRD -#define __DDR_P82 DDRD -#define __DDR_P83 DDRD -#define __DDR_P84 DDRH -#define __DDR_P85 DDRH - -#define __BIT_P0 0 -#define __BIT_P1 1 -#define __BIT_P2 4 -#define __BIT_P3 5 -#define __BIT_P4 5 -#define __BIT_P5 3 -#define __BIT_P6 3 -#define __BIT_P7 4 -#define __BIT_P8 5 -#define __BIT_P9 6 -#define __BIT_P10 4 -#define __BIT_P11 5 -#define __BIT_P12 6 -#define __BIT_P13 7 -#define __BIT_P14 1 -#define __BIT_P15 0 -#define __BIT_P16 0 -#define __BIT_P17 1 -#define __BIT_P18 3 -#define __BIT_P19 2 -#define __BIT_P20 1 -#define __BIT_P21 0 -#define __BIT_P22 0 -#define __BIT_P23 1 -#define __BIT_P24 2 -#define __BIT_P25 3 -#define __BIT_P26 4 -#define __BIT_P27 5 -#define __BIT_P28 6 -#define __BIT_P29 7 -#define __BIT_P30 7 -#define __BIT_P31 6 -#define __BIT_P32 5 -#define __BIT_P33 4 -#define __BIT_P34 3 -#define __BIT_P35 2 -#define __BIT_P36 1 -#define __BIT_P37 0 -#define __BIT_P38 7 -#define __BIT_P39 2 -#define __BIT_P40 1 -#define __BIT_P41 0 -#define __BIT_P42 7 -#define __BIT_P43 6 -#define __BIT_P44 5 -#define __BIT_P45 4 -#define __BIT_P46 3 -#define __BIT_P47 2 -#define __BIT_P48 1 -#define __BIT_P49 0 -#define __BIT_P50 3 -#define __BIT_P51 2 -#define __BIT_P52 1 -#define __BIT_P53 0 -#define __BIT_P54 0 -#define __BIT_P55 1 -#define __BIT_P56 2 -#define __BIT_P57 3 -#define __BIT_P58 4 -#define __BIT_P59 5 -#define __BIT_P60 6 -#define __BIT_P61 7 -#define __BIT_P62 0 -#define __BIT_P63 1 -#define __BIT_P64 2 -#define __BIT_P65 3 -#define __BIT_P66 4 -#define __BIT_P67 5 -#define __BIT_P68 6 -#define __BIT_P69 7 -#define __BIT_P70 4 -#define __BIT_P71 3 -#define __BIT_P72 2 -#define __BIT_P73 3 -#define __BIT_P74 7 -#define __BIT_P75 4 -#define __BIT_P76 5 -#define __BIT_P77 6 -#define __BIT_P78 2 -#define __BIT_P79 6 -#define __BIT_P80 7 -#define __BIT_P81 4 -#define __BIT_P82 5 -#define __BIT_P83 6 -#define __BIT_P84 2 -#define __BIT_P85 7 - -#define __BIT(pin) __BIT_P##pin -#define __MSK(pin) (1 << __BIT(pin)) - -#define __PIN(pin) __PIN_P##pin -#define __PORT(pin) __PORT_P##pin -#define __DDR(pin) __DDR_P##pin - -#define PIN(pin) __PIN(pin) -#define PORT(pin) __PORT(pin) -#define DDR(pin) __DDR(pin) - -#define PIN_INP(pin) DDR(pin) &= ~__MSK(pin) -#define PIN_OUT(pin) DDR(pin) |= __MSK(pin) -#define PIN_CLR(pin) PORT(pin) &= ~__MSK(pin) -#define PIN_SET(pin) PORT(pin) |= __MSK(pin) -#define PIN_VAL(pin, val) if (val) PIN_SET(pin); else PIN_CLR(pin); -#define PIN_GET(pin) (PIN(pin) & __MSK(pin)) -#define PIN_INQ(pin) (PORT(pin) & __MSK(pin)) - - -#endif //_IO_ATMEGA2560 diff --git a/Firmware/macros.h b/Firmware/macros.h index c27dbde7..4d421a27 100644 --- a/Firmware/macros.h +++ b/Firmware/macros.h @@ -1,6 +1,7 @@ #ifndef MACROS_H #define MACROS_H +#include //for cli() and sei() #define FORCE_INLINE __attribute__((always_inline)) inline #define _UNUSED __attribute__((unused)) @@ -14,5 +15,21 @@ #define STRINGIFY_(M) #M #define STRINGIFY(M) STRINGIFY_(M) +// Macros for bit masks +#undef _BV +#define _BV(n) (1<<(n)) +#define TEST(n,b) (!!((n)&_BV(b))) +#define SET_BIT_TO(N,B,TF) do{ if (TF) SBI(N,B); else CBI(N,B); }while(0) + +#ifndef SBI + #define SBI(A,B) (A |= (1 << (B))) +#endif + +#ifndef CBI + #define CBI(A,B) (A &= ~(1 << (B))) +#endif + +#define TBI(N,B) (N ^= _BV(B)) + #endif //MACROS_H diff --git a/Firmware/mmu.cpp b/Firmware/mmu.cpp index c5981894..ab4af5e2 100755 --- a/Firmware/mmu.cpp +++ b/Firmware/mmu.cpp @@ -13,8 +13,9 @@ #include "sound.h" #include "printers.h" #include -#include "io_atmega2560.h" #include "AutoDeplete.h" +#include "fastio.h" +#include "pins.h" //-// #include "util.h" @@ -28,9 +29,6 @@ #define MMU_P0_TIMEOUT 3000ul //timeout for P0 command: 3seconds #define MMU_MAX_RESEND_ATTEMPTS 2 -#ifdef MMU_HWRESET -#define MMU_RST_PIN 76 -#endif //MMU_HWRESET namespace { @@ -156,8 +154,8 @@ void mmu_init(void) _delay_ms(10); //wait 10ms for sure mmu_reset(); //reset mmu (HW or SW), do not wait for response mmu_state = S::Init; - PIN_INP(IR_SENSOR_PIN); //input mode - PIN_SET(IR_SENSOR_PIN); //pullup + SET_INPUT(IR_SENSOR_PIN); //input mode + WRITE(IR_SENSOR_PIN, 1); //pullup } //if IR_SENSOR defined, always returns true @@ -170,7 +168,7 @@ bool check_for_ir_sensor() bool detected = false; //if IR_SENSOR_PIN input is low and pat9125sensor is not present we detected idler sensor - if ((PIN_GET(IR_SENSOR_PIN) == 0) + if ((READ(IR_SENSOR_PIN) == 0) #ifdef PAT9125 && fsensor_not_responding #endif //PAT9125 @@ -363,7 +361,7 @@ void mmu_loop(void) case S::GetFinda: //response to command P0 if (mmu_idl_sens) { - if (PIN_GET(IR_SENSOR_PIN) == 0 && mmu_loading_flag) + if (READ(IR_SENSOR_PIN) == 0 && mmu_loading_flag) { #ifdef MMU_DEBUG printf_P(PSTR("MMU <= 'A'\n")); @@ -406,7 +404,7 @@ void mmu_loop(void) case S::WaitCmd: //response to mmu commands if (mmu_idl_sens) { - if (PIN_GET(IR_SENSOR_PIN) == 0 && mmu_loading_flag) + if (READ(IR_SENSOR_PIN) == 0 && mmu_loading_flag) { DEBUG_PRINTF_P(PSTR("MMU <= 'A'\n")); mmu_puts_P(PSTR("A\n")); //send 'abort' request @@ -596,10 +594,10 @@ bool mmu_get_response(uint8_t move) mmu_loading_flag = true; if (can_extrude()) mmu_load_step(); //don't rely on "ok" signal from mmu unit; if filament detected by idler sensor during loading stop loading movements to prevent infinite loading - if (PIN_GET(IR_SENSOR_PIN) == 0) move = MMU_NO_MOVE; + if (READ(IR_SENSOR_PIN) == 0) move = MMU_NO_MOVE; break; case MMU_UNLOAD_MOVE: - if (PIN_GET(IR_SENSOR_PIN) == 0) //filament is still detected by idler sensor, printer helps with unlading + if (READ(IR_SENSOR_PIN) == 0) //filament is still detected by idler sensor, printer helps with unlading { if (can_extrude()) { @@ -617,7 +615,7 @@ bool mmu_get_response(uint8_t move) } break; case MMU_TCODE_MOVE: //first do unload and then continue with infinite loading movements - if (PIN_GET(IR_SENSOR_PIN) == 0) //filament detected by idler sensor, we must unload first + if (READ(IR_SENSOR_PIN) == 0) //filament detected by idler sensor, we must unload first { if (can_extrude()) { @@ -1460,7 +1458,7 @@ static bool can_load() current_position[E_AXIS] -= e_increment; plan_buffer_line_curposXYZE(MMU_LOAD_FEEDRATE); st_synchronize(); - if(0 == PIN_GET(IR_SENSOR_PIN)) + if(0 == READ(IR_SENSOR_PIN)) { ++filament_detected_count; DEBUG_PUTCHAR('O'); @@ -1491,7 +1489,7 @@ static bool load_more() { for (uint8_t i = 0; i < MMU_IDLER_SENSOR_ATTEMPTS_NR; i++) { - if (PIN_GET(IR_SENSOR_PIN) == 0) return true; + if (READ(IR_SENSOR_PIN) == 0) return true; DEBUG_PRINTF_P(PSTR("Additional load attempt nr. %d\n"), i); mmu_command(MmuCmd::C0); manage_response(true, true, MMU_LOAD_MOVE); diff --git a/Firmware/pins_Einsy_1_0.h b/Firmware/pins_Einsy_1_0.h index 14b56233..88713e6a 100755 --- a/Firmware/pins_Einsy_1_0.h +++ b/Firmware/pins_Einsy_1_0.h @@ -121,6 +121,8 @@ #define IR_SENSOR_PIN 62 //idler sensor @PK0 (digital pin 62/A8) +#define MMU_RST_PIN 76 + // Support for an 8 bit logic analyzer, for example the Saleae. // Channels 0-2 are fast, they could generate 2.667Mhz waveform with a software loop. #define LOGIC_ANALYZER_CH0 X_MIN_PIN // PB6 diff --git a/Firmware/swi2c.c b/Firmware/swi2c.c index 49fbc5ef..02cca220 100644 --- a/Firmware/swi2c.c +++ b/Firmware/swi2c.c @@ -3,9 +3,10 @@ #include #include #include +#include "stdbool.h" #include "Configuration_prusa.h" #include "pins.h" -#include "io_atmega2560.h" +#include "fastio.h" #define SWI2C_RMSK 0x01 //read mask (bit0 = 1) @@ -21,75 +22,75 @@ void __delay(void) void swi2c_init(void) { - PIN_OUT(SWI2C_SDA); - PIN_OUT(SWI2C_SCL); - PIN_SET(SWI2C_SDA); - PIN_SET(SWI2C_SCL); + WRITE(SWI2C_SDA, 1); + WRITE(SWI2C_SCL, 1); + SET_OUTPUT(SWI2C_SDA); + SET_OUTPUT(SWI2C_SCL); uint8_t i; for (i = 0; i < 100; i++) __delay(); } void swi2c_start(void) { - PIN_CLR(SWI2C_SDA); + WRITE(SWI2C_SDA, 0); __delay(); - PIN_CLR(SWI2C_SCL); + WRITE(SWI2C_SCL, 0); __delay(); } void swi2c_stop(void) { - PIN_SET(SWI2C_SCL); + WRITE(SWI2C_SCL, 1); __delay(); - PIN_SET(SWI2C_SDA); + WRITE(SWI2C_SDA, 1); __delay(); } void swi2c_ack(void) { - PIN_CLR(SWI2C_SDA); + WRITE(SWI2C_SDA, 0); __delay(); - PIN_SET(SWI2C_SCL); + WRITE(SWI2C_SCL, 1); __delay(); - PIN_CLR(SWI2C_SCL); + WRITE(SWI2C_SCL, 0); __delay(); } uint8_t swi2c_wait_ack() { - PIN_INP(SWI2C_SDA); + SET_INPUT(SWI2C_SDA); __delay(); -// PIN_SET(SWI2C_SDA); +// WRITE(SWI2C_SDA, 1); __delay(); - PIN_SET(SWI2C_SCL); + WRITE(SWI2C_SCL, 1); // __delay(); uint8_t ack = 0; uint16_t ackto = SWI2C_TMO; - while (!(ack = (PIN_GET(SWI2C_SDA)?0:1)) && ackto--) __delay(); - PIN_CLR(SWI2C_SCL); + while (!(ack = (!READ(SWI2C_SDA))) && ackto--) __delay(); + WRITE(SWI2C_SCL, 0); __delay(); - PIN_OUT(SWI2C_SDA); + SET_OUTPUT(SWI2C_SDA); __delay(); - PIN_CLR(SWI2C_SDA); + WRITE(SWI2C_SDA, 0); __delay(); return ack; } uint8_t swi2c_read(void) { - PIN_SET(SWI2C_SDA); + WRITE(SWI2C_SDA, 1); __delay(); - PIN_INP(SWI2C_SDA); + SET_INPUT(SWI2C_SDA); uint8_t data = 0; int8_t bit; for (bit = 7; bit >= 0; bit--) { - PIN_SET(SWI2C_SCL); + WRITE(SWI2C_SCL, 1); __delay(); - data |= (PIN_GET(SWI2C_SDA)?1:0) << bit; - PIN_CLR(SWI2C_SCL); + data |= (READ(SWI2C_SDA)) << bit; + WRITE(SWI2C_SCL, 0); __delay(); } - PIN_OUT(SWI2C_SDA); + SET_OUTPUT(SWI2C_SDA); return data; } @@ -97,12 +98,11 @@ void swi2c_write(uint8_t data) { int8_t bit; for (bit = 7; bit >= 0; bit--) { - if (data & (1 << bit)) PIN_SET(SWI2C_SDA); - else PIN_CLR(SWI2C_SDA); + WRITE(SWI2C_SDA, data & _BV(bit)); __delay(); - PIN_SET(SWI2C_SCL); + WRITE(SWI2C_SCL, 1); __delay(); - PIN_CLR(SWI2C_SCL); + WRITE(SWI2C_SCL, 0); __delay(); } } diff --git a/Firmware/timer02.c b/Firmware/timer02.c index 7c6b4ef0..a866fa25 100644 --- a/Firmware/timer02.c +++ b/Firmware/timer02.c @@ -9,9 +9,6 @@ #include #include -#include "io_atmega2560.h" - -#define BEEPER 84 void timer0_init(void) { diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 6f82db04..e8031ea5 100755 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -44,7 +44,6 @@ #include "mmu.h" #include "static_assert.h" -#include "io_atmega2560.h" #include "first_lay_cal.h" #include "fsensor.h" @@ -3999,7 +3998,7 @@ static void lcd_show_sensors_state() finda_state = mmu_finda; } if (ir_sensor_detected) { - idler_state = !PIN_GET(IR_SENSOR_PIN); + idler_state = !READ(IR_SENSOR_PIN); } lcd_puts_at_P(0, 0, _i("Sensor state")); lcd_puts_at_P(1, 1, _i("PINDA:")); @@ -8474,7 +8473,7 @@ static bool selftest_irsensor() mmu_load_step(false); while (blocks_queued()) { - if (PIN_GET(IR_SENSOR_PIN) == 0) + if (READ(IR_SENSOR_PIN) == 0) { lcd_selftest_error(TestError::TriggeringFsensor, "", ""); return false; diff --git a/Firmware/w25x20cl.c b/Firmware/w25x20cl.c index 79467cb6..40d183f1 100644 --- a/Firmware/w25x20cl.c +++ b/Firmware/w25x20cl.c @@ -3,8 +3,8 @@ #include "w25x20cl.h" #include #include -#include "io_atmega2560.h" #include "spi.h" +#include "fastio.h" #define _MFRID 0xEF #define _DEVID 0x11 @@ -31,8 +31,8 @@ #define _CMD_JEDEC_ID 0x9f #define _CMD_RD_UID 0x4b -#define _CS_LOW() PORT(W25X20CL_PIN_CS) &= ~__MSK(W25X20CL_PIN_CS) -#define _CS_HIGH() PORT(W25X20CL_PIN_CS) |= __MSK(W25X20CL_PIN_CS) +#define _CS_LOW() WRITE(W25X20CL_PIN_CS, 0) +#define _CS_HIGH() WRITE(W25X20CL_PIN_CS, 1) //#define _SPI_TX swspi_tx //#define _SPI_RX swspi_rx @@ -45,8 +45,8 @@ int w25x20cl_mfrid_devid(void); int8_t w25x20cl_init(void) { - PIN_OUT(W25X20CL_PIN_CS); _CS_HIGH(); + SET_OUTPUT(W25X20CL_PIN_CS); W25X20CL_SPI_ENTER(); if (!w25x20cl_mfrid_devid()) return 0; return 1; From 44b1b1c2194a7f4cdd335515024812546186b258 Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Fri, 11 Sep 2020 18:48:44 +0300 Subject: [PATCH 14/36] More macros --- Firmware/Configuration_adv.h | 2 +- Firmware/macros.h | 55 ++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 1 deletion(-) diff --git a/Firmware/Configuration_adv.h b/Firmware/Configuration_adv.h index 29f7e951..b5ea3d22 100644 --- a/Firmware/Configuration_adv.h +++ b/Firmware/Configuration_adv.h @@ -379,7 +379,7 @@ const unsigned int dropsegments=5; //everything with less than this number of st /** * Include capabilities in M115 output */ -// #define EXTENDED_CAPABILITIES_REPORT +#define EXTENDED_CAPABILITIES_REPORT //=========================================================================== //============================= Define Defines ============================ diff --git a/Firmware/macros.h b/Firmware/macros.h index 4d421a27..95a737e1 100644 --- a/Firmware/macros.h +++ b/Firmware/macros.h @@ -32,4 +32,59 @@ #define TBI(N,B) (N ^= _BV(B)) +// Macros to chain up to 12 conditions +#define _DO_1(W,C,A) (_##W##_1(A)) +#define _DO_2(W,C,A,B) (_##W##_1(A) C _##W##_1(B)) +#define _DO_3(W,C,A,V...) (_##W##_1(A) C _DO_2(W,C,V)) +#define _DO_4(W,C,A,V...) (_##W##_1(A) C _DO_3(W,C,V)) +#define _DO_5(W,C,A,V...) (_##W##_1(A) C _DO_4(W,C,V)) +#define _DO_6(W,C,A,V...) (_##W##_1(A) C _DO_5(W,C,V)) +#define _DO_7(W,C,A,V...) (_##W##_1(A) C _DO_6(W,C,V)) +#define _DO_8(W,C,A,V...) (_##W##_1(A) C _DO_7(W,C,V)) +#define _DO_9(W,C,A,V...) (_##W##_1(A) C _DO_8(W,C,V)) +#define _DO_10(W,C,A,V...) (_##W##_1(A) C _DO_9(W,C,V)) +#define _DO_11(W,C,A,V...) (_##W##_1(A) C _DO_10(W,C,V)) +#define _DO_12(W,C,A,V...) (_##W##_1(A) C _DO_11(W,C,V)) +#define __DO_N(W,C,N,V...) _DO_##N(W,C,V) +#define _DO_N(W,C,N,V...) __DO_N(W,C,N,V) +#define DO(W,C,V...) _DO_N(W,C,NUM_ARGS(V),V) + +// Macros to support option testing +#define _CAT(a,V...) a##V +#define CAT(a,V...) _CAT(a,V) + +#define _ISENA_ ~,1 +#define _ISENA_1 ~,1 +#define _ISENA_0x1 ~,1 +#define _ISENA_true ~,1 +#define _ISENA(V...) IS_PROBE(V) + +#define _ENA_1(O) _ISENA(CAT(_IS,CAT(ENA_, O))) +#define _DIS_1(O) NOT(_ENA_1(O)) +#define ENABLED(V...) DO(ENA,&&,V) +#define DISABLED(V...) DO(DIS,&&,V) + +#define TERN(O,A,B) _TERN(_ENA_1(O),B,A) // OPTION converted to '0' or '1' +#define TERN0(O,A) _TERN(_ENA_1(O),0,A) // OPTION converted to A or '0' +#define TERN1(O,A) _TERN(_ENA_1(O),1,A) // OPTION converted to A or '1' +#define TERN_(O,A) _TERN(_ENA_1(O),,A) // OPTION converted to A or '' +#define _TERN(E,V...) __TERN(_CAT(T_,E),V) // Prepend 'T_' to get 'T_0' or 'T_1' +#define __TERN(T,V...) ___TERN(_CAT(_NO,T),V) // Prepend '_NO' to get '_NOT_0' or '_NOT_1' +#define ___TERN(P,V...) THIRD(P,V) // If first argument has a comma, A. Else B. + + +// Use NUM_ARGS(__VA_ARGS__) to get the number of variadic arguments +#define _NUM_ARGS(_,Z,Y,X,W,V,U,T,S,R,Q,P,O,N,M,L,K,J,I,H,G,F,E,D,C,B,A,OUT,...) OUT +#define NUM_ARGS(V...) _NUM_ARGS(0,V,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0) + +// +// Primitives supporting precompiler REPEAT +// +#define FIRST(a,...) a +#define SECOND(a,b,...) b +#define THIRD(a,b,c,...) c + +#define IS_PROBE(V...) SECOND(V, 0) // Get the second item passed, or 0 +#define NOT(x) IS_PROBE(_CAT(_NOT_, x)) // NOT('0') gets '1'. Anything else gets '0'. + #endif //MACROS_H From c1582599707552bc6d2959354e84096561136411 Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Fri, 11 Sep 2020 20:04:06 +0300 Subject: [PATCH 15/36] Remove unused where C++ alternative can be used --- Firmware/backlight.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Firmware/backlight.cpp b/Firmware/backlight.cpp index b59a65ef..04128be8 100644 --- a/Firmware/backlight.cpp +++ b/Firmware/backlight.cpp @@ -111,10 +111,10 @@ void backlight_init() #else //LCD_BL_PIN -void force_bl_on(_UNUSED bool section_start) {} +void force_bl_on(bool) {} void backlight_update() {} void backlight_init() {} void backlight_save() {} -void backlight_wake(_UNUSED const uint8_t flashNo) {} +void backlight_wake(const uint8_t) {} #endif //LCD_BL_PIN \ No newline at end of file From e2ef5af40e6e7f73ddb750f672282d13d085d416 Mon Sep 17 00:00:00 2001 From: Voinea Dragos Date: Tue, 15 Sep 2020 14:21:09 +0300 Subject: [PATCH 16/36] Add capability line --- Firmware/Marlin_main.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index f304c18b..812cc383 100755 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -3516,6 +3516,7 @@ static void cap_line(const char* name, bool ena = false) { static void extended_capabilities_report() { + cap_line(PSTR("AUTOREPORT_TEMP"), ENABLED(AUTO_REPORT_TEMPERATURES)); //@todo } #endif //EXTENDED_CAPABILITIES_REPORT From c0fced2f3cb7457fae78e1920d2ab373c5f16f4f Mon Sep 17 00:00:00 2001 From: Voinea Dragos Date: Tue, 15 Sep 2020 14:21:21 +0300 Subject: [PATCH 17/36] Fix typo --- Firmware/Marlin_main.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 812cc383..f030f689 100755 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -403,7 +403,7 @@ static bool setTargetedHotend(int code, uint8_t &extruder); static void print_time_remaining_init(); static void wait_for_heater(long codenum, uint8_t extruder); static void gcode_G28(bool home_x_axis, bool home_y_axis, bool home_z_axis); -static void gcode_M115(uint8_t extruder); +static void gcode_M105(uint8_t extruder); static void temp_compensation_start(); static void temp_compensation_apply(); @@ -1735,7 +1735,7 @@ void host_keepalive() { { if (auto_report_temp_timer.expired(auto_report_temp_period * 1000ul)) { - gcode_M115(active_extruder); + gcode_M105(active_extruder); auto_report_temp_timer.start(); } } @@ -2544,7 +2544,7 @@ void force_high_power_mode(bool start_high_power_section) { } #endif //TMC2130 -void gcode_M115(uint8_t extruder) +void gcode_M105(uint8_t extruder) { #if defined(TEMP_0_PIN) && TEMP_0_PIN > -1 SERIAL_PROTOCOLPGM("T:"); @@ -6399,7 +6399,7 @@ Sigma_Exit: } SERIAL_PROTOCOLPGM("ok "); - gcode_M115(extruder); + gcode_M105(extruder); return; break; From 9fb6efc4355c618b91b2d22ce5c3f9259c26ff75 Mon Sep 17 00:00:00 2001 From: DRracer Date: Tue, 15 Sep 2020 14:56:41 +0200 Subject: [PATCH 18/36] Add newline at the end of file --- Firmware/backlight.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Firmware/backlight.cpp b/Firmware/backlight.cpp index 04128be8..bc63d8e6 100644 --- a/Firmware/backlight.cpp +++ b/Firmware/backlight.cpp @@ -117,4 +117,4 @@ void backlight_init() {} void backlight_save() {} void backlight_wake(const uint8_t) {} -#endif //LCD_BL_PIN \ No newline at end of file +#endif //LCD_BL_PIN From d9fa44c142db83014c6186483b3d76578f1f10b1 Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Wed, 23 Sep 2020 09:14:35 +0300 Subject: [PATCH 19/36] Document M155 command --- Firmware/Marlin_main.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index f030f689..dd6dd78b 100755 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -3613,6 +3613,7 @@ extern uint8_t st_backlash_y; //!@n M129 - EtoP Closed (BariCUDA EtoP = electricity to air pressure transducer by jmil) //!@n M140 - Set bed target temp //!@n M150 - Set BlinkM Color Output R: Red<0-255> U(!): Green<0-255> B: Blue<0-255> over i2c, G for green does not work. +//!@n M155 - Automatically send temperatures //!@n M190 - Sxxx Wait for bed current temp to reach target temp. Waits only when heating //! Rxxx Wait for bed current temp to reach target temp. Waits when heating and cooling //!@n M200 D- set filament diameter and set E axis units to cubic millimeters (use S0 to set back to millimeters). @@ -6406,6 +6407,17 @@ Sigma_Exit: } #ifdef AUTO_REPORT_TEMPERATURES + /*! + ### M155 - Automatically send temperatures M155: Automatically send temperatures + #### Usage + + M155 [ S ] + + #### Parameters + + - `S` - Set temperature autoreporting interval in seconds. 0 to disable. Maximum: 255 + + */ case 155: { if (code_seen('S')) From c8c7563e8a1366330c80c0da5d70dcf87e6959ad Mon Sep 17 00:00:00 2001 From: MartinPoupa <58166333+MartinPoupa@users.noreply.github.com> Date: Wed, 7 Oct 2020 17:44:17 +0200 Subject: [PATCH 20/36] LCD status changed When the lcd status changed it will be printed "LCD status changed" to serial line. --- Firmware/ultralcd.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 936ae873..a9d3da59 100755 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -8968,6 +8968,7 @@ void lcd_ignore_click(bool b) } void lcd_finishstatus() { + SERIAL_PROTOCOLLN("LCD status changed"); int len = strlen(lcd_status_message); if (len > 0) { while (len < LCD_WIDTH) { From a84d7ef8d6e7bf37ec6290e92b23cf823bcd1fa8 Mon Sep 17 00:00:00 2001 From: MartinPoupa <58166333+MartinPoupa@users.noreply.github.com> Date: Wed, 7 Oct 2020 18:41:49 +0200 Subject: [PATCH 21/36] corectino of declaration --- Firmware/messages.c | 2 +- Firmware/messages.h | 1 + Firmware/ultralcd.cpp | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Firmware/messages.c b/Firmware/messages.c index be613cab..1c442b47 100644 --- a/Firmware/messages.c +++ b/Firmware/messages.c @@ -176,4 +176,4 @@ const char MSG_FANCHECK_PRINT[] PROGMEM_N1 = "Err: PRINT FAN ERROR"; ////c=20 const char MSG_M112_KILL[] PROGMEM_N1 = "M112 called. Emergency Stop."; ////c=20 const char MSG_ADVANCE_K[] PROGMEM_N1 = "Advance K:"; ////c=13 const char MSG_POWERPANIC_DETECTED[] PROGMEM_N1 = "POWER PANIC DETECTED"; ////c=20 - +const char MSG_LCD_STATUS_CHANGED[] PROGMEM_N1 = "LCD status changed"; diff --git a/Firmware/messages.h b/Firmware/messages.h index 4653c869..a9a23f0d 100644 --- a/Firmware/messages.h +++ b/Firmware/messages.h @@ -176,6 +176,7 @@ extern const char MSG_FANCHECK_PRINT[]; extern const char MSG_M112_KILL[]; extern const char MSG_ADVANCE_K[]; extern const char MSG_POWERPANIC_DETECTED[]; +extern const char MSG_LCD_STATUS_CHANGED[]; #if defined(__cplusplus) } diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index a9d3da59..63fea0e3 100755 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -8968,7 +8968,7 @@ void lcd_ignore_click(bool b) } void lcd_finishstatus() { - SERIAL_PROTOCOLLN("LCD status changed"); + SERIAL_PROTOCOLLNRPGM(MSG_LCD_STATUS_CHANGED); int len = strlen(lcd_status_message); if (len > 0) { while (len < LCD_WIDTH) { From c05d4c9112c3b4ef8b086ef4fb18fda983a66599 Mon Sep 17 00:00:00 2001 From: DRracer Date: Wed, 21 Oct 2020 17:04:20 +0200 Subject: [PATCH 22/36] Update messages.h cleanup space --- Firmware/messages.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Firmware/messages.h b/Firmware/messages.h index a9a23f0d..cb801022 100644 --- a/Firmware/messages.h +++ b/Firmware/messages.h @@ -176,7 +176,7 @@ extern const char MSG_FANCHECK_PRINT[]; extern const char MSG_M112_KILL[]; extern const char MSG_ADVANCE_K[]; extern const char MSG_POWERPANIC_DETECTED[]; -extern const char MSG_LCD_STATUS_CHANGED[]; +extern const char MSG_LCD_STATUS_CHANGED[]; #if defined(__cplusplus) } From 26f62f042ee0a0448eba6310547d8f47219e6218 Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Sun, 25 Oct 2020 19:32:03 +0200 Subject: [PATCH 23/36] Use the longest filename instead of just using the long filename in M27 --- Firmware/cardreader.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Firmware/cardreader.cpp b/Firmware/cardreader.cpp index fdef1cd4..0a6fdeea 100644 --- a/Firmware/cardreader.cpp +++ b/Firmware/cardreader.cpp @@ -498,7 +498,7 @@ void CardReader::getStatus() SERIAL_PROTOCOLLNPGM("Print saved"); } else { - SERIAL_PROTOCOLLN(longFilename); + SERIAL_PROTOCOLLN(LONGEST_FILENAME); SERIAL_PROTOCOLRPGM(_N("SD printing byte "));////MSG_SD_PRINTING_BYTE SERIAL_PROTOCOL(sdpos); SERIAL_PROTOCOL('/'); From e5ebf7c67f057f1ddeba53c759238d2c3b65bdd2 Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Sun, 25 Oct 2020 19:32:23 +0200 Subject: [PATCH 24/36] Fix missing keep-alive messages --- Firmware/Marlin_main.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index dd6dd78b..dac3aa6a 100755 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -2631,7 +2631,6 @@ void gcode_M105(uint8_t extruder) } #endif SERIAL_PROTOCOLLN(""); - KEEPALIVE_STATE(NOT_BUSY); } #ifdef TMC2130 From 0ee8e1f424a2895912e39349ef1a6965a341fb24 Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Sun, 25 Oct 2020 19:32:41 +0200 Subject: [PATCH 25/36] Fix missing ok in M601 --- Firmware/Marlin_main.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index dac3aa6a..f1abeb87 100755 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -7994,6 +7994,7 @@ Sigma_Exit: if (!isPrintPaused) { st_synchronize(); + ClearToSend(); //send OK even before the command finishes executing because we want to make sure it is not skipped because of cmdqueue_pop_front(); cmdqueue_pop_front(); //trick because we want skip this command (M601) after restore lcd_pause_print(); } From 6873a9d28e527dbcf9d26495e18133c2649e8e87 Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Sun, 25 Oct 2020 19:33:02 +0200 Subject: [PATCH 26/36] Only send capabilities when M115 is run without arguments --- Firmware/Marlin_main.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index f1abeb87..fe8bbbad 100755 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -6863,12 +6863,10 @@ Sigma_Exit: SERIAL_ECHOPGM(STRINGIFY(EXTRUDERS)); SERIAL_ECHOPGM(" UUID:"); SERIAL_ECHOLNPGM(MACHINE_UUID); - } - #ifdef EXTENDED_CAPABILITIES_REPORT - extended_capabilities_report(); + extended_capabilities_report(); #endif //EXTENDED_CAPABILITIES_REPORT - + } break; /*! From 5f0e4a1cac9abb3ef35137038afe7945c76f6c8e Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Sun, 25 Oct 2020 19:33:23 +0200 Subject: [PATCH 27/36] Temporary M602 patch. Needs more work --- Firmware/Marlin_main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index fe8bbbad..260b9a30 100755 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -11459,7 +11459,7 @@ void restore_print_from_ram_and_continue(float e_move) //not sd printing nor usb printing } - SERIAL_PROTOCOLLNRPGM(MSG_OK); //dummy response because of octoprint is waiting for this + // SERIAL_PROTOCOLLNRPGM(MSG_OK); //dummy response because of octoprint is waiting for this lcd_setstatuspgm(_T(WELCOME_MSG)); saved_printing_type = PRINTING_TYPE_NONE; saved_printing = false; From ff56ece6f8f5037bf5f00a194911be0fe856bc93 Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Sun, 25 Oct 2020 19:48:48 +0200 Subject: [PATCH 28/36] Remove redundant get_command prototype --- Firmware/Marlin.h | 1 - 1 file changed, 1 deletion(-) diff --git a/Firmware/Marlin.h b/Firmware/Marlin.h index 6e4b2420..5a38cae5 100755 --- a/Firmware/Marlin.h +++ b/Firmware/Marlin.h @@ -116,7 +116,6 @@ void serial_echopair_P(const char *s_P, unsigned long v); void serialprintPGM(const char *str); bool is_buffer_empty(); -void get_command(); void process_commands(); void ramming(); From fdbbc7d62a0336280d4cf043018ee66ba21e824f Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Sun, 25 Oct 2020 20:12:01 +0200 Subject: [PATCH 29/36] Terminate last line from the SD card even if it doesn't have a \n --- Firmware/cmdqueue.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Firmware/cmdqueue.cpp b/Firmware/cmdqueue.cpp index c8693552..9167aaaa 100755 --- a/Firmware/cmdqueue.cpp +++ b/Firmware/cmdqueue.cpp @@ -582,8 +582,6 @@ void get_command() ((serial_char == '#' || serial_char == ':') && comment_mode == false) || serial_count >= (MAX_CMD_SIZE - 1) || n==-1) { - if(card.eof()) break; - if(serial_char=='#') stop_buffering=true; @@ -631,6 +629,9 @@ void get_command() comment_mode = false; //for new command serial_count = 0; //clear buffer + + if(card.eof()) break; + // The following line will reserve buffer space if available. if (! cmdqueue_could_enqueue_back(MAX_CMD_SIZE-1, true)) return; From 4abf1f436a43fa4a0ae7b5237acdc251c85d85d5 Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Mon, 26 Oct 2020 09:42:26 +0200 Subject: [PATCH 30/36] Gracefully dump the queue + fixes to fancheck --- Firmware/Marlin.h | 11 ----------- Firmware/Marlin_main.cpp | 17 +++++++---------- Firmware/cardreader.cpp | 1 + Firmware/cmdqueue.cpp | 20 +++++++++++++++----- Firmware/cmdqueue.h | 5 +++-- Firmware/first_lay_cal.cpp | 1 + Firmware/menu.cpp | 1 + Firmware/mmu.cpp | 1 + Firmware/temperature.cpp | 2 +- Firmware/ultralcd.cpp | 16 ++++++++++------ 10 files changed, 40 insertions(+), 35 deletions(-) diff --git a/Firmware/Marlin.h b/Firmware/Marlin.h index 5a38cae5..19635c17 100755 --- a/Firmware/Marlin.h +++ b/Firmware/Marlin.h @@ -240,23 +240,12 @@ void Stop(); bool IsStopped(); void finishAndDisableSteppers(); -//put an ASCII command at the end of the current buffer. -void enquecommand(const char *cmd, bool from_progmem = false); - //put an ASCII command at the end of the current buffer, read from flash #define enquecommand_P(cmd) enquecommand(cmd, true) -//put an ASCII command at the begin of the current buffer -void enquecommand_front(const char *cmd, bool from_progmem = false); - //put an ASCII command at the begin of the current buffer, read from flash #define enquecommand_front_P(cmd) enquecommand_front(cmd, true) -void repeatcommand_front(); - -// Remove all lines from the command queue. -void cmdqueue_reset(); - void prepare_arc_move(char isclockwise); void clamp_to_software_endstops(float target[3]); void refresh_cmd_timeout(void); diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 260b9a30..5376daef 100755 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -631,7 +631,7 @@ void crashdet_cancel() lcd_print_stop(); }else if(saved_printing_type == PRINTING_TYPE_USB){ SERIAL_ECHOLNRPGM(MSG_OCTOPRINT_CANCEL); //for Octoprint: works the same as clicking "Abort" button in Octoprint GUI - SERIAL_PROTOCOLLNRPGM(MSG_OK); + cmdqueue_reset(); } } @@ -3678,14 +3678,12 @@ There are reasons why some G Codes aren't in numerical order. void process_commands() { #ifdef FANCHECK - if(fan_check_error){ - if(fan_check_error == EFCE_DETECTED){ - fan_check_error = EFCE_REPORTED; - // SERIAL_PROTOCOLLNRPGM(MSG_OCTOPRINT_PAUSED); - lcd_pause_print(); - } // otherwise it has already been reported, so just ignore further processing - return; //ignore usb stream. It is reenabled by selecting resume from the lcd. - } + if(fan_check_error == EFCE_DETECTED){ + fan_check_error = EFCE_REPORTED; + // SERIAL_PROTOCOLLNRPGM(MSG_OCTOPRINT_PAUSED); + lcd_pause_print(); + cmdqueue_serial_disabled = true; + } #endif if (!buflen) return; //empty command @@ -11459,7 +11457,6 @@ void restore_print_from_ram_and_continue(float e_move) //not sd printing nor usb printing } - // SERIAL_PROTOCOLLNRPGM(MSG_OK); //dummy response because of octoprint is waiting for this lcd_setstatuspgm(_T(WELCOME_MSG)); saved_printing_type = PRINTING_TYPE_NONE; saved_printing = false; diff --git a/Firmware/cardreader.cpp b/Firmware/cardreader.cpp index 0a6fdeea..94077f4c 100644 --- a/Firmware/cardreader.cpp +++ b/Firmware/cardreader.cpp @@ -1,4 +1,5 @@ #include "Marlin.h" +#include "cmdqueue.h" #include "cardreader.h" #include "ultralcd.h" #include "stepper.h" diff --git a/Firmware/cmdqueue.cpp b/Firmware/cmdqueue.cpp index 9167aaaa..5c5a7173 100755 --- a/Firmware/cmdqueue.cpp +++ b/Firmware/cmdqueue.cpp @@ -18,6 +18,10 @@ int buflen = 0; // Therefore don't remove the command from the queue in the loop() function. bool cmdbuffer_front_already_processed = false; +// Used for temporarely preventing accidental adding of Serial commands to the queue. +// For now only check_file and the fancheck pause use this. +bool cmdqueue_serial_disabled = false; + int serial_count = 0; //index of character read from serial line boolean comment_mode = false; char *strchr_pointer; // just a pointer to find chars in the command string like X, Y, Z, E, etc @@ -91,14 +95,20 @@ bool cmdqueue_pop_front() void cmdqueue_reset() { - bufindr = 0; - bufindw = 0; - buflen = 0; + while (buflen) + { + uint8_t cmdqueue_current_type = *(cmdbuffer+bufindr); + // printf_P(PSTR("dumping: \"%s\" of type %hu\n"), cmdbuffer+bufindr+CMDHDRSIZE, cmdqueue_current_type); + ClearToSend(); + cmdqueue_pop_front(); + } + bufindr = 0; + bufindw = 0; //commands are removed from command queue after process_command() function is finished //reseting command queue and enqueing new commands during some (usually long running) command processing would cause that new commands are immediately removed from queue (or damaged) //this will ensure that all new commands which are enqueued after cmdqueue reset, will be always executed - cmdbuffer_front_already_processed = true; + cmdbuffer_front_already_processed = true; } // How long a string could be pushed to the front of the command queue? @@ -390,7 +400,7 @@ void get_command() } // start of serial line processing loop - while ((MYSERIAL.available() > 0 && !saved_printing) || (MYSERIAL.available() > 0 && isPrintPaused)) { //is print is saved (crash detection or filament detection), dont process data from serial line + while (((MYSERIAL.available() > 0 && !saved_printing) || (MYSERIAL.available() > 0 && isPrintPaused)) && !cmdqueue_serial_disabled) { //is print is saved (crash detection or filament detection), dont process data from serial line char serial_char = MYSERIAL.read(); /* if (selectedSerialPort == 1) diff --git a/Firmware/cmdqueue.h b/Firmware/cmdqueue.h index 13185f17..017452a2 100644 --- a/Firmware/cmdqueue.h +++ b/Firmware/cmdqueue.h @@ -35,6 +35,7 @@ extern char cmdbuffer[BUFSIZE * (MAX_CMD_SIZE + 1) + CMDBUFFER_RESERVE_FRONT]; extern size_t bufindr; extern int buflen; extern bool cmdbuffer_front_already_processed; +extern bool cmdqueue_serial_disabled; // Type of a command, which is to be executed right now. #define CMDBUFFER_CURRENT_TYPE (cmdbuffer[bufindr]) @@ -65,8 +66,8 @@ extern void cmdqueue_dump_to_serial_single_line(int nr, const char *p); extern void cmdqueue_dump_to_serial(); #endif /* CMDBUFFER_DEBUG */ extern bool cmd_buffer_empty(); -extern void enquecommand(const char *cmd, bool from_progmem); -extern void enquecommand_front(const char *cmd, bool from_progmem); +extern void enquecommand(const char *cmd, bool from_progmem = false); +extern void enquecommand_front(const char *cmd, bool from_progmem = false); extern void repeatcommand_front(); extern bool is_buffer_empty(); extern void get_command(); diff --git a/Firmware/first_lay_cal.cpp b/Firmware/first_lay_cal.cpp index a6b5f109..d7ddc5c8 100644 --- a/Firmware/first_lay_cal.cpp +++ b/Firmware/first_lay_cal.cpp @@ -7,6 +7,7 @@ #include "Configuration_prusa.h" #include "language.h" #include "Marlin.h" +#include "cmdqueue.h" #include "mmu.h" #include diff --git a/Firmware/menu.cpp b/Firmware/menu.cpp index 3c4e8926..9c7704e6 100755 --- a/Firmware/menu.cpp +++ b/Firmware/menu.cpp @@ -8,6 +8,7 @@ #include "lcd.h" #include "Configuration.h" #include "Marlin.h" +#include "cmdqueue.h" #include "ultralcd.h" #include "language.h" #include "static_assert.h" diff --git a/Firmware/mmu.cpp b/Firmware/mmu.cpp index ab4af5e2..18b5d5e7 100755 --- a/Firmware/mmu.cpp +++ b/Firmware/mmu.cpp @@ -9,6 +9,7 @@ #include "Configuration_prusa.h" #include "fsensor.h" #include "cardreader.h" +#include "cmdqueue.h" #include "ultralcd.h" #include "sound.h" #include "printers.h" diff --git a/Firmware/temperature.cpp b/Firmware/temperature.cpp index cb4fc8ae..b4977c40 100755 --- a/Firmware/temperature.cpp +++ b/Firmware/temperature.cpp @@ -30,6 +30,7 @@ #include "Marlin.h" +#include "cmdqueue.h" #include "ultralcd.h" #include "sound.h" #include "temperature.h" @@ -632,7 +633,6 @@ void fanSpeedError(unsigned char _fan) { fanSpeedErrorBeep(PSTR("Print fan speed is lower than expected"), MSG_FANCHECK_PRINT); break; } - // SERIAL_PROTOCOLLNRPGM(MSG_OK); //This ok messes things up with octoprint. } #endif //(defined(TACH_0) && TACH_0 >-1) || (defined(TACH_1) && TACH_1 > -1) diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 63fea0e3..e9304746 100755 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -1582,6 +1582,7 @@ void lcd_return_to_status() //! @brief Pause print, disable nozzle heater, move to park position void lcd_pause_print() { + SERIAL_PROTOCOLLNRPGM(MSG_OCTOPRINT_PAUSED); //pause for octoprint stop_and_save_print_to_ram(0.0, -default_retraction); lcd_return_to_status(); isPrintPaused = true; @@ -1589,7 +1590,6 @@ void lcd_pause_print() { lcd_commands_type = LcdCommands::LongPause; } - SERIAL_PROTOCOLLNRPGM(MSG_OCTOPRINT_PAUSED); //pause for octoprint } @@ -6740,6 +6740,7 @@ void lcd_resume_print() lcd_return_to_status(); lcd_reset_alert_level(); //for fan speed error if (fan_error_selftest()) return; //abort if error persists + cmdqueue_serial_disabled = false; lcd_setstatuspgm(_T(MSG_FINISHING_MOVEMENTS)); st_synchronize(); @@ -7352,6 +7353,7 @@ void lcd_print_stop() if (!card.sdprinting) { SERIAL_ECHOLNRPGM(MSG_OCTOPRINT_CANCEL); // for Octoprint } + cmdqueue_serial_disabled = false; //for when canceling a print with a fancheck CRITICAL_SECTION_START; @@ -8780,27 +8782,29 @@ static void lcd_selftest_screen_step(int _row, int _col, int _state, const char /** Menu action functions **/ static bool check_file(const char* filename) { - if (farm_mode) return true; + if (farm_mode) + return true; bool result = false; uint32_t filesize; card.openFile((char*)filename, true); filesize = card.getFileSize(); if (filesize > END_FILE_SECTION) { card.setIndex(filesize - END_FILE_SECTION); - } + cmdqueue_reset(); + cmdqueue_serial_disabled = true; - while (!card.eof() && !result) { + while (!card.eof() && !result) { card.sdprinting = true; get_command(); result = check_commands(); - } + + cmdqueue_serial_disabled = false; card.printingHasFinished(); strncpy_P(lcd_status_message, _T(WELCOME_MSG), LCD_WIDTH); lcd_finishstatus(); return result; - } static void menu_action_sdfile(const char* filename) From 0c305ee5f573c3b925e5089eb0bc8dae60b30143 Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Wed, 28 Oct 2020 10:07:46 +0200 Subject: [PATCH 31/36] Fix warning --- Firmware/cmdqueue.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Firmware/cmdqueue.cpp b/Firmware/cmdqueue.cpp index 5c5a7173..afdddfba 100755 --- a/Firmware/cmdqueue.cpp +++ b/Firmware/cmdqueue.cpp @@ -97,8 +97,7 @@ void cmdqueue_reset() { while (buflen) { - uint8_t cmdqueue_current_type = *(cmdbuffer+bufindr); - // printf_P(PSTR("dumping: \"%s\" of type %hu\n"), cmdbuffer+bufindr+CMDHDRSIZE, cmdqueue_current_type); + // printf_P(PSTR("dumping: \"%s\" of type %hu\n"), cmdbuffer+bufindr+CMDHDRSIZE, CMDBUFFER_CURRENT_TYPE); ClearToSend(); cmdqueue_pop_front(); } From 023ccb0e895c4c936e5e2ceb49fd8a40c34c533b Mon Sep 17 00:00:00 2001 From: Voinea Dragos Date: Mon, 9 Nov 2020 21:39:10 +0200 Subject: [PATCH 32/36] Fix double ok in M603 --- Firmware/Marlin_main.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 5376daef..d47576cd 100755 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -9205,8 +9205,8 @@ void FlushSerialRequestResend() // Execution of a command from a SD card will not be confirmed. void ClearToSend() { - previous_millis_cmd = _millis(); - if ((CMDBUFFER_CURRENT_TYPE == CMDBUFFER_CURRENT_TYPE_USB) || (CMDBUFFER_CURRENT_TYPE == CMDBUFFER_CURRENT_TYPE_USB_WITH_LINENR)) + previous_millis_cmd = _millis(); + if (buflen && ((CMDBUFFER_CURRENT_TYPE == CMDBUFFER_CURRENT_TYPE_USB) || (CMDBUFFER_CURRENT_TYPE == CMDBUFFER_CURRENT_TYPE_USB_WITH_LINENR))) SERIAL_PROTOCOLLNRPGM(MSG_OK); } From 176e2674b9b3bebdff40f3afc393ee1992801e9c Mon Sep 17 00:00:00 2001 From: Voinea Dragos Date: Mon, 9 Nov 2020 21:39:22 +0200 Subject: [PATCH 33/36] Fix M105 ok hack --- Firmware/Marlin_main.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index d47576cd..c6f9e4b7 100755 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -6399,7 +6399,8 @@ Sigma_Exit: SERIAL_PROTOCOLPGM("ok "); gcode_M105(extruder); - return; + cmdqueue_pop_front(); //prevent an ok after the command since this command uses an ok at the beginning. + break; } From 43ace00a243cc221b8bfcdc4b61c2e5f16a784d4 Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Thu, 12 Nov 2020 18:43:48 +0200 Subject: [PATCH 34/36] Fill the progress bar at the end and code optimizations --- Firmware/ultralcd.cpp | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 15d0d68c..0a2236f4 100755 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -8786,6 +8786,7 @@ static bool check_file(const char* filename) { const uint32_t filesize = card.getFileSize(); uint32_t startPos = 0; const uint16_t bytesToCheck = min(END_FILE_SECTION, filesize); + uint8_t blocksPrinted = 0; if (filesize > END_FILE_SECTION) { startPos = filesize - END_FILE_SECTION; card.setIndex(startPos); @@ -8793,23 +8794,23 @@ static bool check_file(const char* filename) { lcd_clear(); lcd_puts_at_P(0, 1, _i("Checking file"));////c=20 r=1 + lcd_set_cursor(0, 2); printf_P(PSTR("startPos=%lu\n"), startPos); while (!card.eof() && !result) { - lcd_set_cursor(0, 2); - for (int column = 0; column < 20; column++) { - const int8_t percent = ((card.get_sdpos() - startPos) * 100) / bytesToCheck; - if (column < (percent / 5)) - { - lcd_set_cursor(column, 2); - lcd_print('\xFF'); //simple progress bar - } - } + for (; blocksPrinted < (((card.get_sdpos() - startPos) * LCD_WIDTH) / bytesToCheck); blocksPrinted++) + lcd_print('\xFF'); //simple progress bar card.sdprinting = true; get_command(); result = check_commands(); } + + for (; blocksPrinted < LCD_WIDTH; blocksPrinted++) + lcd_print('\xFF'); //simple progress bar + _delay(100); //for the user to see the end of the progress bar. + card.printingHasFinished(); + strncpy_P(lcd_status_message, _T(WELCOME_MSG), LCD_WIDTH); lcd_finishstatus(); return result; From 807eddafb046bf15e68019244cff927980775ab5 Mon Sep 17 00:00:00 2001 From: Alex Voinea Date: Fri, 13 Nov 2020 12:12:18 +0200 Subject: [PATCH 35/36] Remove debugging code --- Firmware/ultralcd.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/Firmware/ultralcd.cpp b/Firmware/ultralcd.cpp index 0a2236f4..0a6e4791 100755 --- a/Firmware/ultralcd.cpp +++ b/Firmware/ultralcd.cpp @@ -8795,7 +8795,6 @@ static bool check_file(const char* filename) { lcd_clear(); lcd_puts_at_P(0, 1, _i("Checking file"));////c=20 r=1 lcd_set_cursor(0, 2); - printf_P(PSTR("startPos=%lu\n"), startPos); while (!card.eof() && !result) { for (; blocksPrinted < (((card.get_sdpos() - startPos) * LCD_WIDTH) / bytesToCheck); blocksPrinted++) lcd_print('\xFF'); //simple progress bar From f96f75bd171cf32afec9e876bc2ff3c2a76db5e7 Mon Sep 17 00:00:00 2001 From: Voinea Dragos Date: Mon, 16 Nov 2020 10:58:26 +0200 Subject: [PATCH 36/36] Fix warning and a bit of indentation Saved 64B of flash and 1B of SRAM --- Firmware/xyzcal.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/Firmware/xyzcal.cpp b/Firmware/xyzcal.cpp index 767024db..7179996d 100644 --- a/Firmware/xyzcal.cpp +++ b/Firmware/xyzcal.cpp @@ -495,20 +495,22 @@ int8_t xyzcal_find_point_center2(uint16_t delay_us) xyzcal_lineXYZ_to(_X, _Y, z0 - 400, 500, 1); if (has_temperature_compensation()){ - z0 = _Z - 20; // normal PINDA + z0 = _Z - 20; // normal PINDA return xyzcal_find_point_center2A(x0, y0, z0, delay_us); } else { // try searching harder, each PINDA is different + int8_t rv = 0; for(z0 = _Z - 20; z0 <= _Z + 140; z0 += 20 ){ // alternate PINDA - int8_t rv = xyzcal_find_point_center2A(x0, y0, z0, delay_us); + rv = xyzcal_find_point_center2A(x0, y0, z0, delay_us); printf_P(PSTR(" z0=%d"), z0); if( rv != 0 ){ - printf_P(PSTR("ok\n")); - return rv; + puts_P(PSTR("ok")); + break; } else { - printf_P(PSTR("fail\n")); + puts_P(PSTR("fail")); } } + return rv; } }