diff --git a/Firmware/Configuration.h b/Firmware/Configuration.h
index af89dea9c..7a782d71c 100644
--- a/Firmware/Configuration.h
+++ b/Firmware/Configuration.h
@@ -16,8 +16,8 @@ extern uint16_t nPrinterType;
extern PGM_P sPrinterName;
// Firmware version
-#define FW_VERSION "3.7.2-RC1"
-#define FW_COMMIT_NR 2359
+#define FW_VERSION "3.7.2"
+#define FW_COMMIT_NR 2363
// FW_VERSION_UNKNOWN means this is an unofficial build.
// The firmware should only be checked into github with this symbol.
#define FW_DEV_VERSION FW_VERSION_UNKNOWN
diff --git a/Firmware/Marlin.h b/Firmware/Marlin.h
index fd5824808..625e079ea 100755
--- a/Firmware/Marlin.h
+++ b/Firmware/Marlin.h
@@ -166,6 +166,17 @@ void manage_inactivity(bool ignore_stepper_queue=false);
#define disable_z() {}
#endif
+#ifdef PSU_Delta
+ void init_force_z();
+ void check_force_z();
+ #undef disable_z
+ #define disable_z() disable_force_z()
+ void disable_force_z();
+ #undef enable_z
+ #define enable_z() enable_force_z()
+ void enable_force_z();
+#endif // PSU_Delta
+
diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp
index 5ca850241..d3b15f515 100755
--- a/Firmware/Marlin_main.cpp
+++ b/Firmware/Marlin_main.cpp
@@ -793,12 +793,8 @@ int uart_putchar(char c, FILE *)
void lcd_splash()
{
-// lcd_puts_at_P(0, 1, PSTR(" Original Prusa "));
-// lcd_puts_at_P(0, 2, PSTR(" 3D Printers "));
-// lcd_puts_P(PSTR("\x1b[1;3HOriginal Prusa\x1b[2;4H3D Printers"));
-// fputs_P(PSTR(ESC_2J ESC_H(1,1) "Original Prusa i3" ESC_H(3,2) "Prusa Research"), lcdout);
- lcd_puts_P(PSTR(ESC_2J ESC_H(1,1) "Original Prusa i3" ESC_H(3,2) "Prusa Research"));
-// lcd_printf_P(_N(ESC_2J "x:%.3f\ny:%.3f\nz:%.3f\ne:%.3f"), _x, _y, _z, _e);
+ lcd_clear(); // clears display and homes screen
+ lcd_puts_P(PSTR("\n Original Prusa i3\n Prusa Research"));
}
@@ -928,7 +924,7 @@ void update_sec_lang_from_external_flash()
uint32_t src_addr;
if (lang_get_header(lang, &header, &src_addr))
{
- fputs_P(PSTR(ESC_H(1,3) "Language update."), lcdout);
+ lcd_puts_at_P(1,3,PSTR("Language update."));
for (uint8_t i = 0; i < state; i++) fputc('.', lcdout);
_delay(100);
boot_reserved = (state + 1) | (lang << 4);
@@ -1002,8 +998,8 @@ void list_sec_lang_from_external_flash()
static void w25x20cl_err_msg()
{
- lcd_puts_P(_n(ESC_2J ESC_H(0,0) "External SPI flash" ESC_H(0,1) "W25X20CL is not res-"
- ESC_H(0,2) "ponding. Language" ESC_H(0,3) "switch unavailable."));
+ lcd_clear();
+ lcd_puts_P(_n("External SPI flash\nW25X20CL is not res-\nponding. Language\nswitch unavailable."));
}
// "Setup" function is called by the Arduino framework on startup.
@@ -1316,6 +1312,9 @@ void setup()
update_mode_profile();
tmc2130_init();
#endif //TMC2130
+#ifdef PSU_Delta
+ init_force_z(); // ! important for correct Z-axis initialization
+#endif // PSU_Delta
setup_photpin();
@@ -1353,7 +1352,7 @@ void setup()
}
#endif //TMC2130
-#if defined(Z_AXIS_ALWAYS_ON)
+#if defined(Z_AXIS_ALWAYS_ON) && !defined(PSU_Delta)
enable_z();
#endif
farm_mode = eeprom_read_byte((uint8_t*)EEPROM_FARM_MODE);
@@ -3275,14 +3274,19 @@ extern uint8_t st_backlash_x;
extern uint8_t st_backlash_y;
#endif //BACKLASH_Y
+//! \ingroup marlin_main
+
//! @brief Parse and process commands
//!
//! look here for descriptions of G-codes: http://linuxcnc.org/handbook/gcode/g-code.html
//! http://objects.reprap.org/wiki/Mendel_User_Manual:_RepRapGCodes
//!
-//! Implemented Codes
+//!
+//! Implemented Codes
//! -------------------
//!
+//! * _This list is not updated. Current documentation is maintained inside the process_cmd function._
+//!
//!@n PRUSA CODES
//!@n P F - Returns FW versions
//!@n P R - Returns revision of printer
@@ -3405,14 +3409,30 @@ extern uint8_t st_backlash_y;
//!
//!@n M928 - Start SD logging (M928 filename.g) - ended by M29
//!@n M999 - Restart after being stopped by error
+//!
+
+/** @defgroup marlin_main Marlin main */
+
+/** \ingroup GCodes */
+
+//! _This is a list of currently implemented G Codes in Prusa firmware (dynamically generated from doxygen)_
+
+
void process_commands()
{
#ifdef FANCHECK
if (fan_check_error){
if( fan_check_error == EFCE_DETECTED ){
fan_check_error = EFCE_REPORTED;
- lcd_pause_print();
- } // otherwise it has already been reported, so just ignore further processing
+
+ if(is_usb_printing){
+ SERIAL_PROTOCOLLNRPGM(MSG_OCTOPRINT_PAUSE);
+ }
+ else{
+ lcd_pause_print();
+ }
+
+ } // otherwise it has already been reported, so just ignore further processing
return;
}
#endif
@@ -3456,21 +3476,33 @@ void process_commands()
#ifdef TMC2130
else if (strncmp_P(CMDBUFFER_CURRENT_STRING, PSTR("CRASH_"), 6) == 0)
{
- if(code_seen("CRASH_DETECTED")) //! CRASH_DETECTED
+
+ //! ### CRASH_DETECTED - TMC2130
+ // ---------------------------------
+ if(code_seen("CRASH_DETECTED"))
{
uint8_t mask = 0;
if (code_seen('X')) mask |= X_AXIS_MASK;
if (code_seen('Y')) mask |= Y_AXIS_MASK;
crashdet_detected(mask);
}
- else if(code_seen("CRASH_RECOVER")) //! CRASH_RECOVER
+
+ //! ### CRASH_RECOVER - TMC2130
+ // ----------------------------------
+ else if(code_seen("CRASH_RECOVER"))
crashdet_recover();
- else if(code_seen("CRASH_CANCEL")) //! CRASH_CANCEL
+
+ //! ### CRASH_CANCEL - TMC2130
+ // ----------------------------------
+ else if(code_seen("CRASH_CANCEL"))
crashdet_cancel();
}
else if (strncmp_P(CMDBUFFER_CURRENT_STRING, PSTR("TMC_"), 4) == 0)
{
- if (strncmp_P(CMDBUFFER_CURRENT_STRING + 4, PSTR("SET_WAVE_"), 9) == 0) //! TMC_SET_WAVE_
+
+ //! ### TMC_SET_WAVE_
+ // --------------------
+ if (strncmp_P(CMDBUFFER_CURRENT_STRING + 4, PSTR("SET_WAVE_"), 9) == 0)
{
uint8_t axis = *(CMDBUFFER_CURRENT_STRING + 13);
axis = (axis == 'E')?3:(axis - 'X');
@@ -3480,7 +3512,10 @@ void process_commands()
tmc2130_set_wave(axis, 247, fac);
}
}
- else if (strncmp_P(CMDBUFFER_CURRENT_STRING + 4, PSTR("SET_STEP_"), 9) == 0) //! TMC_SET_STEP_
+
+ //! ### TMC_SET_STEP_
+ // ------------------
+ else if (strncmp_P(CMDBUFFER_CURRENT_STRING + 4, PSTR("SET_STEP_"), 9) == 0)
{
uint8_t axis = *(CMDBUFFER_CURRENT_STRING + 13);
axis = (axis == 'E')?3:(axis - 'X');
@@ -3491,7 +3526,10 @@ void process_commands()
tmc2130_goto_step(axis, step & (4*res - 1), 2, 1000, res);
}
}
- else if (strncmp_P(CMDBUFFER_CURRENT_STRING + 4, PSTR("SET_CHOP_"), 9) == 0) //! TMC_SET_CHOP_
+
+ //! ### TMC_SET_CHOP_
+ // -------------------
+ else if (strncmp_P(CMDBUFFER_CURRENT_STRING + 4, PSTR("SET_CHOP_"), 9) == 0)
{
uint8_t axis = *(CMDBUFFER_CURRENT_STRING + 13);
axis = (axis == 'E')?3:(axis - 'X');
@@ -3542,19 +3580,50 @@ void process_commands()
}
#endif //BACKLASH_Y
#endif //TMC2130
- else if(code_seen("PRUSA")){
- if (code_seen("Ping")) { //! PRUSA Ping
+ else if(code_seen("PRUSA")){
+ /*!
+ *
+ ### PRUSA - Internal command set
+
+ Set of internal PRUSA commands
+
+ PRUSA [ Ping | PRN | FAN | fn | thx | uvlo | fsensor_recover | MMURES | RESET | fv | M28 | SN | Fir | Rev | Lang | Lz | Beat | FR ]
+
+ - `Ping`
+ - `PRN` - Prints revision of the printer
+ - `FAN` - Prints fan details
+ - `fn` - Prints farm no.
+ - `thx`
+ - `uvlo`
+ - `fsensor_recover` - Filament sensor recover - restore print and continue
+ - `MMURES` - Reset MMU
+ - `RESET` - (Careful!)
+ - `fv` - ?
+ - `M28`
+ - `SN`
+ - `Fir` - Prints firmware version
+ - `Rev`- Prints filament size, elelectronics, nozzle type
+ - `Lang` - Reset the language
+ - `Lz`
+ - `Beat` - Kick farm link timer
+ - `FR` - Full factory reset
+ - `nozzle D G1
case 1: // G1
if(Stopped == false) {
@@ -3919,19 +3991,30 @@ if(eSoundMode!=e_SOUND_MODE_SILENT)
//ClearToSend();
}
break;
- case 2: // G2 - CW ARC
+
+ //! ### G2 - CW ARC
+ // ------------------------------
+ case 2:
if(Stopped == false) {
get_arc_coordinates();
prepare_arc_move(true);
}
break;
- case 3: // G3 - CCW ARC
+
+
+ //! ### G3 - CCW ARC
+ // -------------------------------
+ case 3:
if(Stopped == false) {
get_arc_coordinates();
prepare_arc_move(false);
}
break;
- case 4: // G4 dwell
+
+
+ //! ### G4 - Dwell
+ // -------------------------------
+ case 4:
codenum = 0;
if(code_seen('P')) codenum = code_value(); // milliseconds to wait
if(code_seen('S')) codenum = code_value() * 1000; // seconds to wait
@@ -3946,7 +4029,11 @@ if(eSoundMode!=e_SOUND_MODE_SILENT)
}
break;
#ifdef FWRETRACT
- case 10: // G10 retract
+
+
+ //! ### G10 Retract
+ // ------------------------------
+ case 10:
#if EXTRUDERS > 1
retracted_swap[active_extruder]=(code_seen('S') && code_value_long() == 1); // checks for swap retract argument
retract(true,retracted_swap[active_extruder]);
@@ -3954,7 +4041,11 @@ if(eSoundMode!=e_SOUND_MODE_SILENT)
retract(true);
#endif
break;
- case 11: // G11 retract_recover
+
+
+ //! ### G11 - Retract recover
+ // -----------------------------
+ case 11:
#if EXTRUDERS > 1
retract(false,retracted_swap[active_extruder]);
#else
@@ -3962,7 +4053,11 @@ if(eSoundMode!=e_SOUND_MODE_SILENT)
#endif
break;
#endif //FWRETRACT
- case 28: //G28 Home all Axis one at a time
+
+
+ //! ### G28 - Home all Axis one at a time
+ // --------------------------------------------
+ case 28:
{
long home_x_value = 0;
long home_y_value = 0;
@@ -3989,8 +4084,13 @@ if(eSoundMode!=e_SOUND_MODE_SILENT)
}
break;
}
+
#ifdef ENABLE_AUTO_BED_LEVELING
- case 29: // G29 Detailed Z-Probe, probes the bed at 3 or more points.
+
+
+ //! ### G29 - Detailed Z-Probe
+ // --------------------------------
+ case 29:
{
#if Z_MIN_PIN == -1
#error "You must have a Z_MIN endstop in order to enable Auto Bed Leveling feature! Z_MIN_PIN must point to a valid hardware pin."
@@ -4133,7 +4233,10 @@ if(eSoundMode!=e_SOUND_MODE_SILENT)
}
break;
#ifndef Z_PROBE_SLED
- case 30: // G30 Single Z Probe
+
+ //! ### G30 - Single Z Probe
+ // ------------------------------------
+ case 30:
{
st_synchronize();
// TODO: make sure the bed_level_rotation_matrix is identity or the planner will get set incorectly
@@ -4155,17 +4258,27 @@ if(eSoundMode!=e_SOUND_MODE_SILENT)
}
break;
#else
- case 31: // dock the sled
+
+ //! ### G31 - Dock the sled
+ // ---------------------------
+ case 31:
dock_sled(true);
break;
- case 32: // undock the sled
+
+
+ //! ### G32 - Undock the sled
+ // ----------------------------
+ case 32:
dock_sled(false);
break;
#endif // Z_PROBE_SLED
#endif // ENABLE_AUTO_BED_LEVELING
#ifdef MESH_BED_LEVELING
- case 30: // G30 Single Z Probe
+
+ //! ### G30 - Single Z Probe
+ // ----------------------------
+ case 30:
{
st_synchronize();
// TODO: make sure the bed_level_rotation_matrix is identity or the planner will get set incorectly
@@ -4181,7 +4294,8 @@ if(eSoundMode!=e_SOUND_MODE_SILENT)
}
break;
-
+ //! ### G75 - Print temperature interpolation
+ // ---------------------------------------------
case 75:
{
for (int i = 40; i <= 110; i++)
@@ -4189,7 +4303,9 @@ if(eSoundMode!=e_SOUND_MODE_SILENT)
}
break;
- case 76: //! G76 - PINDA probe temperature calibration
+ //! ### G76 - PINDA probe temperature calibration
+ // ------------------------------------------------
+ case 76:
{
#ifdef PINDA_THERMISTOR
if (true)
@@ -4446,18 +4562,16 @@ if(eSoundMode!=e_SOUND_MODE_SILENT)
break;
-
- /**
- * G80: Mesh-based Z probe, probes a grid and produces a
- * mesh to compensate for variable bed height
- *
+ //! ### G80 - Mesh-based Z probe
+ // -----------------------------------
+
+ /*
+ * Probes a grid and produces a mesh to compensate for variable bed height
* The S0 report the points as below
- * @code{.unparsed}
* +----> X-axis
* |
* |
* v Y-axis
- * @endcode
*/
case 80:
@@ -4881,8 +4995,11 @@ if(eSoundMode!=e_SOUND_MODE_SILENT)
}
break;
- /**
- * G81: Print mesh bed leveling status and bed profile if activated
+ //! ### G81 - Mesh bed leveling status
+ // -----------------------------------------
+
+ /*
+ * Prints mesh bed leveling status and bed profile if activated
*/
case 81:
if (mbl.active) {
@@ -4906,7 +5023,7 @@ if(eSoundMode!=e_SOUND_MODE_SILENT)
break;
#if 0
- /**
+ /*
* G82: Single Z probe at current location
*
* WARNING! USE WITH CAUTION! If you'll try to probe where is no leveling pad, nasty things can happen!
@@ -4922,7 +5039,7 @@ if(eSoundMode!=e_SOUND_MODE_SILENT)
SERIAL_PROTOCOLPGM("\n");
break;
- /**
+ /*
* G83: Prusa3D specific: Babystep in Z and store to EEPROM
*/
case 83:
@@ -4947,7 +5064,7 @@ if(eSoundMode!=e_SOUND_MODE_SILENT)
}
break;
- /**
+ /*
* G84: Prusa3D specific: UNDO Babystep Z (move Z axis back)
*/
case 84:
@@ -4955,7 +5072,7 @@ if(eSoundMode!=e_SOUND_MODE_SILENT)
// babystepLoadZ = 0;
break;
- /**
+ /*
* G85: Prusa3D specific: Pick best babystep
*/
case 85:
@@ -4963,38 +5080,58 @@ if(eSoundMode!=e_SOUND_MODE_SILENT)
break;
#endif
- /**
- * G86: Prusa3D specific: Disable babystep correction after home.
- * This G-code will be performed at the start of a calibration script.
- */
+ /**
+ * ### G86 - Disable babystep correction after home
+ *
+ * This G-code will be performed at the start of a calibration script.
+ * (Prusa3D specific)
+ */
case 86:
calibration_status_store(CALIBRATION_STATUS_LIVE_ADJUST);
break;
- /**
- * G87: Prusa3D specific: Enable babystep correction after home
- * This G-code will be performed at the end of a calibration script.
- */
+
+
+ /**
+ * ### G87 - Enable babystep correction after home
+ *
+ *
+ * This G-code will be performed at the end of a calibration script.
+ * (Prusa3D specific)
+ */
case 87:
calibration_status_store(CALIBRATION_STATUS_CALIBRATED);
break;
- /**
- * G88: Prusa3D specific: Don't know what it is for, it is in V2Calibration.gcode
- */
+
+ /**
+ * ### G88 - Reserved
+ *
+ * Currently has no effect.
+ */
+
+ // Prusa3D specific: Don't know what it is for, it is in V2Calibration.gcode
+
case 88:
break;
#endif // ENABLE_MESH_BED_LEVELING
-
- case 90: // G90
+ //! ### G90 - Switch off relative mode
+ // -------------------------------
+ case 90:
relative_mode = false;
break;
- case 91: // G91
+
+ //! ### G91 - Switch on relative mode
+ // -------------------------------
+ case 91:
relative_mode = true;
break;
- case 92: // G92
+
+ //! ### G92 - Set position
+ // -----------------------------
+ case 92:
if(!code_seen(axis_codes[E_AXIS]))
st_synchronize();
for(int8_t i=0; i < NUM_AXIS; i++) {
@@ -5011,7 +5148,10 @@ if(eSoundMode!=e_SOUND_MODE_SILENT)
}
break;
- case 98: //! G98 (activate farm mode)
+
+ //! ### G98 - Activate farm mode
+ // -----------------------------------
+ case 98:
farm_mode = 1;
PingTime = _millis();
eeprom_update_byte((unsigned char *)EEPROM_FARM_MODE, farm_mode);
@@ -5021,7 +5161,9 @@ if(eSoundMode!=e_SOUND_MODE_SILENT)
fCheckModeInit(); // alternatively invoke printer reset
break;
- case 99: //! G99 (deactivate farm mode)
+ //! ### G99 - Deactivate farm mode
+ // -------------------------------------
+ case 99:
farm_mode = 0;
lcd_printer_connected();
eeprom_update_byte((unsigned char *)EEPROM_FARM_MODE, farm_mode);
@@ -5035,6 +5177,9 @@ if(eSoundMode!=e_SOUND_MODE_SILENT)
gcode_in_progress = 0;
} // end if(code_seen('G'))
+
+ //! ---------------------------------------------------------------------------------
+
else if(code_seen('M'))
{
@@ -5053,6 +5198,8 @@ if(eSoundMode!=e_SOUND_MODE_SILENT)
switch(mcode_in_progress)
{
+ //! ### M0, M1 - Stop the printer
+ // ---------------------------------------------------------------
case 0: // M0 - Unconditional stop - Wait for user button press on LCD
case 1: // M1 - Conditional stop - Wait for user button press on LCD
{
@@ -5100,6 +5247,9 @@ if(eSoundMode!=e_SOUND_MODE_SILENT)
LCD_MESSAGERPGM(_T(WELCOME_MSG));
}
break;
+
+ //! ### M17 - Enable axes
+ // ---------------------------------
case 17:
LCD_MESSAGERPGM(_i("No move."));////MSG_NO_MOVE
enable_x();
@@ -5111,44 +5261,68 @@ if(eSoundMode!=e_SOUND_MODE_SILENT)
break;
#ifdef SDSUPPORT
- case 20: // M20 - list SD card
+
+ //! ### M20 - SD Card file list
+ // -----------------------------------
+ case 20:
SERIAL_PROTOCOLLNRPGM(_N("Begin file list"));////MSG_BEGIN_FILE_LIST
card.ls();
SERIAL_PROTOCOLLNRPGM(_N("End file list"));////MSG_END_FILE_LIST
break;
- case 21: // M21 - init SD card
+ //! ### M21 - Init SD card
+ // ------------------------------------
+ case 21:
card.initsd();
-
break;
- case 22: //M22 - release SD card
+
+ //! ### M22 - Release SD card
+ // -----------------------------------
+ case 22:
card.release();
-
break;
- case 23: //M23 - Select file
+
+ //! ### M23 - Select file
+ // -----------------------------------
+ case 23:
starpos = (strchr(strchr_pointer + 4,'*'));
if(starpos!=NULL)
*(starpos)='\0';
card.openFile(strchr_pointer + 4,true);
break;
- case 24: //M24 - Start SD print
+
+ //! ### M24 - Start SD print
+ // ----------------------------------
+ case 24:
if (!card.paused)
failstats_reset_print();
card.startFileprint();
starttime=_millis();
break;
- case 25: //M25 - Pause SD print
+
+ //! ### M25 - Pause SD print
+ // ----------------------------------
+ case 25:
card.pauseSDPrint();
break;
- case 26: //M26 - Set SD index
+
+ //! ### M26 - Set SD index
+ // ----------------------------------
+ case 26:
if(card.cardOK && code_seen('S')) {
card.setIndex(code_value_long());
}
break;
- case 27: //M27 - Get SD status
+
+ //! ### M27 - Get SD status
+ // ----------------------------------
+ case 27:
card.getStatus();
break;
- case 28: //M28 - Start SD write
+
+ //! ### M28 - Start SD write
+ // ---------------------------------
+ case 28:
starpos = (strchr(strchr_pointer + 4,'*'));
if(starpos != NULL){
char* npos = strchr(CMDBUFFER_CURRENT_STRING, 'N');
@@ -5157,11 +5331,18 @@ if(eSoundMode!=e_SOUND_MODE_SILENT)
}
card.openFile(strchr_pointer+4,false);
break;
- case 29: //M29 - Stop SD write
+
+ //! ### M29 - Stop SD write
+ // -------------------------------------
+ //! Currently has no effect.
+ case 29:
//processed in write to file routine above
//card,saving = false;
break;
- case 30: //M30 Delete File
+
+ //! ### M30 - Delete file
+ // ----------------------------------
+ case 30:
if (card.cardOK){
card.closefile();
starpos = (strchr(strchr_pointer + 4,'*'));
@@ -5173,7 +5354,10 @@ if(eSoundMode!=e_SOUND_MODE_SILENT)
card.removeFile(strchr_pointer + 4);
}
break;
- case 32: //M32 - Select file and start SD print
+
+ //! ### M32 - Select file and start SD print
+ // ------------------------------------
+ case 32:
{
if(card.sdprinting) {
st_synchronize();
@@ -5208,7 +5392,10 @@ if(eSoundMode!=e_SOUND_MODE_SILENT)
starttime=_millis(); //procedure calls count as normal print time.
}
} break;
- case 928: //M928 - Start SD write
+
+ //! ### M982 - Start SD write
+ // ---------------------------------
+ case 928:
starpos = (strchr(strchr_pointer + 5,'*'));
if(starpos != NULL){
char* npos = strchr(CMDBUFFER_CURRENT_STRING, 'N');
@@ -5220,6 +5407,8 @@ if(eSoundMode!=e_SOUND_MODE_SILENT)
#endif //SDSUPPORT
+ //! ### M31 - Report current print time
+ // --------------------------------------------------
case 31: //M31 take time since the start of the SD print or an M109 command
{
stoptime=_millis();
@@ -5235,7 +5424,10 @@ if(eSoundMode!=e_SOUND_MODE_SILENT)
autotempShutdown();
}
break;
- case 42: //M42 -Change pin status via gcode
+
+ //! ### M42 - Set pin state
+ // -----------------------------
+ case 42:
if (code_seen('S'))
{
int pin_status = code_value();
@@ -5262,7 +5454,11 @@ if(eSoundMode!=e_SOUND_MODE_SILENT)
}
}
break;
- case 44: //! M44: Prusa3D: Reset the bed skew and offset calibration.
+
+
+ //! ### M44 - Reset the bed skew and offset calibration (Prusa specific)
+ // --------------------------------------------------------------------
+ case 44: // M44: Prusa3D: Reset the bed skew and offset calibration.
// Reset the baby step value and the baby step applied flag.
calibration_status_store(CALIBRATION_STATUS_ASSEMBLED);
@@ -5276,7 +5472,9 @@ if(eSoundMode!=e_SOUND_MODE_SILENT)
world2machine_revert_to_uncorrected();
break;
- case 45: //! M45: Prusa3D: bed skew and offset with manual Z up
+ //! ### M45 - Bed skew and offset with manual Z up (Prusa specific)
+ // ------------------------------------------------------
+ case 45: // M45: Prusa3D: bed skew and offset with manual Z up
{
int8_t verbosity_level = 0;
bool only_Z = code_seen('Z');
@@ -5315,15 +5513,17 @@ if(eSoundMode!=e_SOUND_MODE_SILENT)
}
*/
+ //! ### M47 - Show end stops dialog on the display (Prusa specific)
+ // ----------------------------------------------------
case 47:
- //! M47: Prusa3D: Show end stops dialog on the display.
+
KEEPALIVE_STATE(PAUSED_FOR_USER);
lcd_diag_show_end_stops();
KEEPALIVE_STATE(IN_HANDLER);
break;
#if 0
- case 48: //! M48: scan the bed induction sensor points, print the sensor trigger coordinates to the serial line for visualization on the PC.
+ case 48: // M48: scan the bed induction sensor points, print the sensor trigger coordinates to the serial line for visualization on the PC.
{
// Disable the default update procedure of the display. We will do a modal dialog.
lcd_update_enable(false);
@@ -5361,11 +5561,15 @@ if(eSoundMode!=e_SOUND_MODE_SILENT)
#ifdef ENABLE_AUTO_BED_LEVELING
#ifdef Z_PROBE_REPEATABILITY_TEST
- //! M48 Z-Probe repeatability measurement function.
+
+ //! ### M48 - Z-Probe repeatability measurement function.
+ // ------------------------------------------------------
//!
- //! Usage: M48
- //!
- //! This function assumes the bed has been homed. Specificaly, that a G28 command
+ //! _Usage:_
+ //!
+ //! M48
+ //!
+ //! This function assumes the bed has been homed. Specifically, that a G28 command
//! as been issued prior to invoking the M48 Z-Probe repeatability measurement function.
//! Any information generated by a prior G29 Bed leveling command will be lost and need to be
//! regenerated.
@@ -5611,6 +5815,13 @@ Sigma_Exit:
}
#endif // Z_PROBE_REPEATABILITY_TEST
#endif // ENABLE_AUTO_BED_LEVELING
+
+ //! ### M73 - Set/get print progress
+ // -------------------------------------
+ //! _Usage:_
+ //!
+ //! M73 P R Q S
+ //!
case 73: //M73 show percent done and time remaining
if(code_seen('P')) print_percent_done_normal = code_value();
if(code_seen('R')) print_time_remaining_normal = code_value();
@@ -5624,6 +5835,8 @@ Sigma_Exit:
}
break;
+ //! ### M104 - Set hotend temperature
+ // -----------------------------------------
case 104: // M104
{
uint8_t extruder;
@@ -5637,13 +5850,22 @@ Sigma_Exit:
setWatch();
break;
}
- case 112: // M112 -Emergency Stop
+
+ //! ### M112 - Emergency stop
+ // -----------------------------------------
+ case 112:
kill(_n(""), 3);
break;
- case 140: // M140 set bed temp
+
+ //! ### M140 - Set bed temperature
+ // -----------------------------------------
+ case 140:
if (code_seen('S')) setTargetBed(code_value());
break;
- case 105 : // M105
+
+ //! ### M105 - Report temperatures
+ // -----------------------------------------
+ case 105:
{
uint8_t extruder;
if(setTargetedHotend(105, extruder)){
@@ -5737,8 +5959,11 @@ Sigma_Exit:
return;
break;
}
+
+ //! ### M109 - Wait for extruder temperature
+ // -------------------------------------------------
case 109:
- {// M109 - Wait for extruder heater to reach target.
+ {
uint8_t extruder;
if(setTargetedHotend(109, extruder)){
break;
@@ -5788,7 +6013,10 @@ Sigma_Exit:
previous_millis_cmd = _millis();
}
break;
- case 190: // M190 - Wait for bed heater to reach target.
+
+ //! ### M190 - Wait for bed temperature
+ // ---------------------------------------
+ case 190:
#if defined(TEMP_BED_PIN) && TEMP_BED_PIN > -1
LCD_MESSAGERPGM(_T(MSG_BED_HEATING));
heating_status = 3;
@@ -5839,7 +6067,10 @@ Sigma_Exit:
break;
#if defined(FAN_PIN) && FAN_PIN > -1
- case 106: //!M106 Sxxx Fan On S 0 .. 255
+
+ //! ### M106 - Set fan speed
+ // -------------------------------------------
+ case 106: // M106 Sxxx Fan On S 0 .. 255
if (code_seen('S')){
fanSpeed=constrain(code_value(),0,255);
}
@@ -5847,13 +6078,19 @@ Sigma_Exit:
fanSpeed=255;
}
break;
- case 107: //M107 Fan Off
+
+ //! ### M107 - Fan off
+ // -------------------------------
+ case 107:
fanSpeed = 0;
break;
#endif //FAN_PIN
#if defined(PS_ON_PIN) && PS_ON_PIN > -1
- case 80: // M80 - Turn on Power Supply
+
+ //! ### M80 - Turn on the Power Supply
+ // -------------------------------
+ case 80:
SET_OUTPUT(PS_ON_PIN); //GND
WRITE(PS_ON_PIN, PS_ON_AWAKE);
@@ -5871,7 +6108,9 @@ Sigma_Exit:
break;
#endif
- case 81: // M81 - Turn off Power Supply
+ //! ### M81 - Turn off Power Supply
+ // --------------------------------------
+ case 81:
disable_heater();
st_synchronize();
disable_e0();
@@ -5892,12 +6131,24 @@ Sigma_Exit:
lcd_update(0);
break;
+ //! ### M82 - Set E axis to absolute mode
+ // ---------------------------------------
case 82:
axis_relative_modes[3] = false;
break;
+
+ //! ### M83 - Set E axis to relative mode
+ // ---------------------------------------
case 83:
axis_relative_modes[3] = true;
break;
+
+ //! ### M84, M18 - Disable steppers
+ //---------------------------------------
+ //! This command can be used to set the stepper inactivity timeout (`S`) or to disable steppers (`X`,`Y`,`Z`,`E`)
+ //!
+ //! M84 [E] [S] [X] [Y] [Z]
+ //!
case 18: //compatibility
case 84: // M84
if(code_seen('S')){
@@ -5933,21 +6184,35 @@ Sigma_Exit:
print_time_remaining_init();
snmm_filaments_used = 0;
break;
+
+ //! ### M85 - Set max inactive time
+ // ---------------------------------------
case 85: // M85
if(code_seen('S')) {
max_inactive_time = code_value() * 1000;
}
break;
#ifdef SAFETYTIMER
- case 86: // M86 - set safety timer expiration time in seconds; M86 S0 will disable safety timer
- //when safety timer expires heatbed and nozzle target temperatures are set to zero
+
+ //! ### M86 - Set safety timer expiration time
+ //!
+ //! _Usage:_
+ //! M86 S
+ //!
+ //! Sets the safety timer expiration time in seconds. M86 S0 will disable safety timer.
+ //! When safety timer expires, heatbed and nozzle target temperatures are set to zero.
+ case 86:
if (code_seen('S')) {
safetytimer_inactive_time = code_value() * 1000;
safetyTimer.start();
}
break;
#endif
- case 92: // M92
+
+ //! ### M92 Set Axis steps-per-unit
+ // ---------------------------------------
+ //! Same syntax as G92
+ case 92:
for(int8_t i=0; i < NUM_AXIS; i++)
{
if(code_seen(axis_codes[i]))
@@ -5968,11 +6233,17 @@ Sigma_Exit:
}
}
break;
- case 110: //! M110 N - reset line pos
+
+ //! ### M110 - Set Line number
+ // ---------------------------------------
+ case 110:
if (code_seen('N'))
gcode_LastN = code_value_long();
break;
- case 113: // M113 - Get or set Host Keepalive interval
+
+ //! ### M113 - Get or set host keep-alive interval
+ // ------------------------------------------
+ case 113:
if (code_seen('S')) {
host_keepalive_interval = (uint8_t)code_value_short();
// NOMORE(host_keepalive_interval, 60);
@@ -5983,6 +6254,16 @@ Sigma_Exit:
SERIAL_PROTOCOLLN("");
}
break;
+
+ //! ### M115 - Firmware info
+ // --------------------------------------
+ //! Print the firmware info and capabilities
+ //!
+ //! M115 [V] [U]
+ //!
+ //! Without any arguments, prints Prusa firmware version number, machine type, extruder count and UUID.
+ //! `M115 U` Checks the firmware version provided. If the firmware version provided by the U code is higher than the currently running firmware,
+ //! pause the print for 30s and ask the user to upgrade the firmware.
case 115: // M115
if (code_seen('V')) {
// Report the Prusa version number.
@@ -6004,22 +6285,43 @@ Sigma_Exit:
SERIAL_ECHOLNPGM(MACHINE_UUID);
}
break;
-/* case 117: // M117 display message
+
+ //! ### M114 - Get current position
+ // -------------------------------------
+ case 114:
+ gcode_M114();
+ break;
+
+
+
+ //! ### M117 - Set LCD Message
+ // --------------------------------------
+
+ /*
+ M117 moved up to get the high priority
+
+ case 117: // M117 display message
starpos = (strchr(strchr_pointer + 5,'*'));
if(starpos!=NULL)
*(starpos)='\0';
lcd_setstatus(strchr_pointer + 5);
break;*/
- case 114: // M114
- gcode_M114();
- break;
- case 120: //! M120 - Disable endstops
+
+ //! ### M120 - Disable endstops
+ // ----------------------------------------
+ case 120:
enable_endstops(false) ;
break;
- case 121: //! M121 - Enable endstops
+
+ //! ### M121 - Enable endstops
+ // ----------------------------------------
+ case 121:
enable_endstops(true) ;
break;
- case 119: // M119
+
+ //! ### M119 - Get endstop states
+ // ----------------------------------------
+ case 119:
SERIAL_PROTOCOLRPGM(_N("Reporting endstop status"));////MSG_M119_REPORT
SERIAL_PROTOCOLLN("");
#if defined(X_MIN_PIN) && X_MIN_PIN > -1
@@ -6078,8 +6380,12 @@ Sigma_Exit:
#endif
break;
//TODO: update for all axis, use for loop
+
#ifdef BLINKM
- case 150: // M150
+
+ //! ### M150 - Set RGB(W) Color
+ // -------------------------------------------
+ case 150:
{
byte red;
byte grn;
@@ -6093,6 +6399,9 @@ Sigma_Exit:
}
break;
#endif //BLINKM
+
+ //! ### M200 - Set filament diameter
+ // ----------------------------------------
case 200: // M200 D set filament diameter and set E axis units to cubic millimeters (use S0 to set back to millimeters).
{
@@ -6131,7 +6440,10 @@ Sigma_Exit:
calculate_extruder_multipliers();
}
break;
- case 201: // M201
+
+ //! ### M201 - Set Print Max Acceleration
+ // -------------------------------------------
+ case 201:
for (int8_t i = 0; i < NUM_AXIS; i++)
{
if (code_seen(axis_codes[i]))
@@ -6163,6 +6475,9 @@ Sigma_Exit:
}
break;
#endif
+
+ //! ### M203 - Set Max Feedrate
+ // ---------------------------------------
case 203: // M203 max feedrate mm/sec
for (int8_t i = 0; i < NUM_AXIS; i++)
{
@@ -6186,10 +6501,17 @@ Sigma_Exit:
}
}
break;
+
+ //! ### M204 - Acceleration settings
+ // ------------------------------------------
+ //! Supporting old format:
+ //!
+ //! M204 S[normal moves] T[filmanent only moves]
+ //!
+ //! and new format:
+ //!
+ //! M204 P[printing moves] R[filmanent only moves] T[travel moves] (as of now T is ignored)
case 204:
- //! M204 acclereration settings.
- //!@n Supporting old format: M204 S[normal moves] T[filmanent only moves]
- //!@n and new format: M204 P[printing moves] R[filmanent only moves] T[travel moves] (as of now T is ignored)
{
if(code_seen('S')) {
// Legacy acceleration format. This format is used by the legacy Marlin, MK2 or MK3 firmware,
@@ -6213,7 +6535,19 @@ Sigma_Exit:
}
}
break;
- case 205: //M205 advanced settings: minimum travel speed S=while printing T=travel only, B=minimum segment time X= maximum xy jerk, Z=maximum Z jerk
+
+ //! ### M205 - Set advanced settings
+ // ---------------------------------------------
+ //! Set some advanced settings related to movement.
+ //!
+ //! M205 [S] [T] [B] [X] [Y] [Z] [E]
+ /*!
+ - `S` - Minimum feedrate for print moves (unit/s)
+ - `T` - Minimum feedrate for travel moves (units/s)
+ - `B` - Minimum segment time (us)
+ - `X` - Maximum X jerk (units/s), similarly for other axes
+ */
+ case 205:
{
if(code_seen('S')) cs.minimumfeedrate = code_value();
if(code_seen('T')) cs.mintravelfeedrate = code_value();
@@ -6226,13 +6560,19 @@ Sigma_Exit:
if (cs.max_jerk[Y_AXIS] > DEFAULT_YJERK) cs.max_jerk[Y_AXIS] = DEFAULT_YJERK;
}
break;
- case 206: // M206 additional homing offset
+
+ //! ### M206 - Set additional homing offsets
+ // ----------------------------------------------
+ case 206:
for(int8_t i=0; i < 3; i++)
{
if(code_seen(axis_codes[i])) cs.add_homing[i] = code_value();
}
break;
#ifdef FWRETRACT
+
+ //! ### M207 - Set firmware retraction
+ // --------------------------------------------------
case 207: //M207 - set retract length S[positive mm] F[feedrate mm/min] Z[additional zlift/hop]
{
if(code_seen('S'))
@@ -6248,6 +6588,9 @@ Sigma_Exit:
cs.retract_zlift = code_value() ;
}
}break;
+
+ //! ### M208 - Set retract recover length
+ // --------------------------------------------
case 208: // M208 - set retract recover length S[positive mm surplus to the M207 S*] F[feedrate mm/min]
{
if(code_seen('S'))
@@ -6259,6 +6602,9 @@ Sigma_Exit:
cs.retract_recover_feedrate = code_value()/60 ;
}
}break;
+
+ //! ### M209 - Enable/disable automatict retract
+ // ---------------------------------------------
case 209: // M209 - S<1=true/0=false> enable automatic retract detect if the slicer did not support G10/11: every normal extrude-only move will be classified as retract depending on the direction.
{
if(code_seen('S'))
@@ -6299,6 +6645,9 @@ Sigma_Exit:
}break;
#endif // FWRETRACT
#if EXTRUDERS > 1
+
+ // ### M218 - Set hotend offset
+ // ----------------------------------------
case 218: // M218 - set hotend offset (in mm), T X Y
{
uint8_t extruder;
@@ -6326,6 +6675,8 @@ Sigma_Exit:
}break;
#endif
+ //! ### M220 Set feedrate percentage
+ // -----------------------------------------------
case 220: // M220 S- set speed factor override percentage
{
if (code_seen('B')) //backup current speed factor
@@ -6341,6 +6692,9 @@ Sigma_Exit:
}
}
break;
+
+ //! ### M221 - Set extrude factor override percentage
+ // ----------------------------------------------------
case 221: // M221 S- set extrude factor override percentage
{
if(code_seen('S'))
@@ -6363,6 +6717,8 @@ Sigma_Exit:
}
break;
+ //! ### M226 - Wait for Pin state
+ // ------------------------------------------
case 226: // M226 P S- Wait until the specified pin reaches the state required
{
if(code_seen('P')){
@@ -6416,6 +6772,9 @@ Sigma_Exit:
break;
#if NUM_SERVOS > 0
+
+ //! ### M280 - Set/Get servo position
+ // --------------------------------------------
case 280: // M280 - set servo position absolute. P: servo index, S: angle or microseconds
{
int servo_index = -1;
@@ -6454,6 +6813,9 @@ Sigma_Exit:
#endif // NUM_SERVOS > 0
#if (LARGE_FLASH == true && ( BEEPER > 0 || defined(ULTRALCD) || defined(LCD_USE_I2C_BUZZER)))
+
+ //! ### M300 - Play tone
+ // -----------------------
case 300: // M300
{
int beepS = code_seen('S') ? code_value() : 110;
@@ -6473,7 +6835,10 @@ Sigma_Exit:
#endif // M300
#ifdef PIDTEMP
- case 301: // M301
+
+ //! ### M301 - Set hotend PID
+ // ---------------------------------------
+ case 301:
{
if(code_seen('P')) cs.Kp = code_value();
if(code_seen('I')) cs.Ki = scalePID_i(code_value());
@@ -6501,7 +6866,10 @@ Sigma_Exit:
break;
#endif //PIDTEMP
#ifdef PIDTEMPBED
- case 304: // M304
+
+ //! ### M304 - Set bed PID
+ // --------------------------------------
+ case 304:
{
if(code_seen('P')) cs.bedKp = code_value();
if(code_seen('I')) cs.bedKi = scalePID_i(code_value());
@@ -6519,6 +6887,9 @@ Sigma_Exit:
}
break;
#endif //PIDTEMP
+
+ //! ### M240 - Trigger camera
+ // --------------------------------------------
case 240: // M240 Triggers a camera by emulating a Canon RC-1 : http://www.doc-diy.net/photo/rc-1_hacked/
{
#ifdef CHDK
@@ -6551,7 +6922,10 @@ Sigma_Exit:
}
break;
#ifdef PREVENT_DANGEROUS_EXTRUDE
- case 302: // allow cold extrudes, or set the minimum extrude temperature
+
+ //! ### M302 - Allow cold extrude, or set minimum extrude temperature
+ // -------------------------------------------------------------------
+ case 302:
{
float temp = .0;
if (code_seen('S')) temp=code_value();
@@ -6559,7 +6933,10 @@ Sigma_Exit:
}
break;
#endif
- case 303: // M303 PID autotune
+
+ //! ### M303 - PID autotune
+ // -------------------------------------
+ case 303:
{
float temp = 150.0;
int e=0;
@@ -6572,17 +6949,22 @@ Sigma_Exit:
PID_autotune(temp, e, c);
}
break;
- case 400: // M400 finish all moves
+
+ //! ### M400 - Wait for all moves to finish
+ // -----------------------------------------
+ case 400:
{
st_synchronize();
}
break;
- case 403: //! M403 set filament type (material) for particular extruder and send this information to mmu
+ //! ### M403 - Set filament type (material) for particular extruder and notify the MMU
+ // ----------------------------------------------
+ case 403:
{
- //! currently three different materials are needed (default, flex and PVA)
- //! add storing this information for different load/unload profiles etc. in the future
- //!firmware does not wait for "ok" from mmu
+ // currently three different materials are needed (default, flex and PVA)
+ // add storing this information for different load/unload profiles etc. in the future
+ // firmware does not wait for "ok" from mmu
if (mmu_enabled)
{
uint8_t extruder = 255;
@@ -6594,27 +6976,41 @@ Sigma_Exit:
}
break;
- case 500: // M500 Store settings in EEPROM
+ //! ### M500 - Store settings in EEPROM
+ // -----------------------------------------
+ case 500:
{
Config_StoreSettings();
}
break;
- case 501: // M501 Read settings from EEPROM
+
+ //! ### M501 - Read settings from EEPROM
+ // ----------------------------------------
+ case 501:
{
Config_RetrieveSettings();
}
break;
- case 502: // M502 Revert to default settings
+
+ //! ### M502 - Revert all settings to factory default
+ // -------------------------------------------------
+ case 502:
{
Config_ResetDefault();
}
break;
- case 503: // M503 print settings currently in memory
+
+ //! ### M503 - Repport all settings currently in memory
+ // -------------------------------------------------
+ case 503:
{
Config_PrintSettings();
}
break;
- case 509: //M509 Force language selection
+
+ //! ### M509 - Force language selection
+ // ------------------------------------------------
+ case 509:
{
lang_reset();
SERIAL_ECHO_START;
@@ -6622,6 +7018,9 @@ Sigma_Exit:
}
break;
#ifdef ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED
+
+ //! ### M540 - Abort print on endstop hit (enable/disable)
+ // -----------------------------------------------------
case 540:
{
if(code_seen('S')) abort_on_endstop_hit = code_value() > 0;
@@ -6666,6 +7065,9 @@ Sigma_Exit:
#endif // CUSTOM_M_CODE_SET_Z_PROBE_OFFSET
#ifdef FILAMENTCHANGEENABLE
+
+ //! ### M600 - Initiate Filament change procedure
+ // --------------------------------------
case 600: //Pause for filament change X[pos] Y[pos] Z[relative lift] E[initial retract] L[later retract distance for removal]
{
st_synchronize();
@@ -6740,20 +7142,39 @@ Sigma_Exit:
}
break;
#endif //FILAMENTCHANGEENABLE
- case 601: //! M601 - Pause print
+
+ //! ### M601 - Pause print
+ // -------------------------------
+ case 601:
{
cmdqueue_pop_front(); //trick because we want skip this command (M601) after restore
lcd_pause_print();
}
break;
- case 602: { //! M602 - Resume print
+ //! ### M602 - Resume print
+ // -------------------------------
+ case 602: {
lcd_resume_print();
}
break;
+ //! ### M603 - Stop print
+ // -------------------------------
+ case 603: {
+ lcd_print_stop();
+ }
+
#ifdef PINDA_THERMISTOR
- case 860: // M860 - Wait for PINDA thermistor to reach target temperature.
+ //! ### M860 - Wait for extruder temperature (PINDA)
+ // --------------------------------------------------------------
+ /*!
+ Wait for PINDA thermistor to reach target temperature
+
+ M860 [S]
+
+ */
+ case 860:
{
int set_target_pinda = 0;
@@ -6797,7 +7218,18 @@ Sigma_Exit:
break;
}
- case 861: // M861 - Set/Read PINDA temperature compensation offsets
+ //! ### M861 - Set/Get PINDA temperature compensation offsets
+ // -----------------------------------------------------------
+ /*!
+
+ M861 [ ? | ! | Z | S [I] ]
+
+ - `?` - Print current EEPROM offset values
+ - `!` - Set factory default values
+ - `Z` - Set all values to 0 (effectively disabling PINDA temperature compensation)
+ - `S` `I` - Set compensation ustep value S for compensation table index I
+ */
+ case 861:
if (code_seen('?')) { // ? - Print out current EEPROM offset values
uint8_t cal_status = calibration_status_pinda();
int16_t usteps = 0;
@@ -6868,7 +7300,27 @@ Sigma_Exit:
break;
#endif //PINDA_THERMISTOR
+
+ //! ### M862 - Print checking
+ // ----------------------------------------------
+ /*!
+ Checks the parameters of the printer and gcode and performs compatibility check
+ - M862.1 [ P | Q ]
+
+ - M862.2 [ P | Q ]
+
+ - M862.3 [ P | Q ]
+
+ - M862.4 [ P | Q]
+
+ - M862.5 [ P | Q]
+
+
+ When run with P<> argument, the check is performed against the input value.
+ When run with Q argument, the current value is shown.
+
+ */
case 862: // M862: print checking
float nDummy;
uint8_t nCommand;
@@ -6929,12 +7381,16 @@ Sigma_Exit:
break;
#ifdef LIN_ADVANCE
- case 900: // M900: Set LIN_ADVANCE options.
+ //! ### M900 - Set Linear advance options
+ // ----------------------------------------------
+ case 900:
gcode_M900();
break;
#endif
- case 907: // M907 Set digital trimpot motor current using axis codes.
+ //! ### M907 - Set digital trimpot motor current using axis codes
+ // ---------------------------------------------------------------
+ case 907:
{
#ifdef TMC2130
for (int i = 0; i < NUM_AXIS; i++)
@@ -6965,7 +7421,10 @@ Sigma_Exit:
#endif //TMC2130
}
break;
- case 908: // M908 Control digital trimpot directly.
+
+ //! ### M908 - Control digital trimpot directly
+ // ---------------------------------------------------------
+ case 908:
{
#if defined(DIGIPOTSS_PIN) && DIGIPOTSS_PIN > -1
uint8_t channel,current;
@@ -6978,13 +7437,17 @@ Sigma_Exit:
#ifdef TMC2130_SERVICE_CODES_M910_M918
- case 910: //! M910 - TMC2130 init
+ //! ### M910 - TMC2130 init
+ // -----------------------------------------------
+ case 910:
{
tmc2130_init();
}
break;
- case 911: //! M911 - Set TMC2130 holding currents
+ //! ### M911 - Set TMC2130 holding currents
+ // -------------------------------------------------
+ case 911:
{
if (code_seen('X')) tmc2130_set_current_h(0, code_value());
if (code_seen('Y')) tmc2130_set_current_h(1, code_value());
@@ -6993,7 +7456,9 @@ Sigma_Exit:
}
break;
- case 912: //! M912 - Set TMC2130 running currents
+ //! ### M912 - Set TMC2130 running currents
+ // -----------------------------------------------
+ case 912:
{
if (code_seen('X')) tmc2130_set_current_r(0, code_value());
if (code_seen('Y')) tmc2130_set_current_r(1, code_value());
@@ -7001,13 +7466,18 @@ Sigma_Exit:
if (code_seen('E')) tmc2130_set_current_r(3, code_value());
}
break;
- case 913: //! M913 - Print TMC2130 currents
+
+ //! ### M913 - Print TMC2130 currents
+ // -----------------------------
+ case 913:
{
tmc2130_print_currents();
}
break;
- case 914: //! M914 - Set normal mode
+ //! ### M914 - Set TMC2130 normal mode
+ // ------------------------------
+ case 914:
{
tmc2130_mode = TMC2130_MODE_NORMAL;
update_mode_profile();
@@ -7015,7 +7485,9 @@ Sigma_Exit:
}
break;
- case 915: //! M915 - Set silent mode
+ //! ### M95 - Set TMC2130 silent mode
+ // ------------------------------
+ case 915:
{
tmc2130_mode = TMC2130_MODE_SILENT;
update_mode_profile();
@@ -7023,7 +7495,9 @@ Sigma_Exit:
}
break;
- case 916: //! M916 - Set sg_thrs
+ //! ### M916 - Set TMC2130 Stallguard sensitivity threshold
+ // -------------------------------------------------------
+ case 916:
{
if (code_seen('X')) tmc2130_sg_thr[X_AXIS] = code_value();
if (code_seen('Y')) tmc2130_sg_thr[Y_AXIS] = code_value();
@@ -7034,7 +7508,9 @@ Sigma_Exit:
}
break;
- case 917: //! M917 - Set TMC2130 pwm_ampl
+ //! ### M917 - Set TMC2130 PWM amplitude offset (pwm_ampl)
+ // --------------------------------------------------------------
+ case 917:
{
if (code_seen('X')) tmc2130_set_pwm_ampl(0, code_value());
if (code_seen('Y')) tmc2130_set_pwm_ampl(1, code_value());
@@ -7043,7 +7519,9 @@ Sigma_Exit:
}
break;
- case 918: //! M918 - Set TMC2130 pwm_grad
+ //! ### M918 - Set TMC2130 PWM amplitude gradient (pwm_grad)
+ // -------------------------------------------------------------
+ case 918:
{
if (code_seen('X')) tmc2130_set_pwm_grad(0, code_value());
if (code_seen('Y')) tmc2130_set_pwm_grad(1, code_value());
@@ -7054,7 +7532,10 @@ Sigma_Exit:
#endif //TMC2130_SERVICE_CODES_M910_M918
- case 350: //! M350 - Set microstepping mode. Warning: Steps per unit remains unchanged. S code sets stepping mode for all drivers.
+ //! ### M350 - Set microstepping mode
+ // ---------------------------------------------------
+ //! Warning: Steps per unit remains unchanged. S code sets stepping mode for all drivers.
+ case 350:
{
#ifdef TMC2130
if(code_seen('E'))
@@ -7091,7 +7572,13 @@ Sigma_Exit:
#endif //TMC2130
}
break;
- case 351: //! M351 - Toggle MS1 MS2 pins directly, S# determines MS1 or MS2, X# sets the pin high/low.
+
+ //! ### M351 - Toggle Microstep Pins
+ // -----------------------------------
+ //! Toggle MS1 MS2 pins directly, S# determines MS1 or MS2, X# sets the pin high/low.
+ //!
+ //! M351 [B<0|1>] [E<0|1>] S<1|2> [X<0|1>] [Y<0|1>] [Z<0|1>]
+ case 351:
{
#if defined(X_MS1_PIN) && X_MS1_PIN > -1
if(code_seen('S')) switch((int)code_value())
@@ -7109,14 +7596,28 @@ Sigma_Exit:
#endif
}
break;
- case 701: //! M701 - load filament
+
+ //! ### M701 - Load filament
+ // -------------------------
+ case 701:
{
if (mmu_enabled && code_seen('E'))
tmp_extruder = code_value();
gcode_M701();
}
break;
- case 702: //! M702 [U C] -
+
+ //! ### M702 - Unload filament
+ // ------------------------
+ /*!
+
+ M702 [U C]
+
+ - `U` Unload all filaments used in current print
+ - `C` Unload just current filament
+ - without any parameters unload all filaments
+ */
+ case 702:
{
#ifdef SNMM
if (code_seen('U'))
@@ -7138,7 +7639,9 @@ Sigma_Exit:
}
break;
- case 999: // M999: Restart after being stopped
+ //! ### M999 - Restart after being stopped
+ // ------------------------------------
+ case 999:
Stopped = false;
lcd_reset_alert_level();
gcode_LastN = Stopped_gcode_LastN;
@@ -7152,6 +7655,10 @@ Sigma_Exit:
}
}
// end if(code_seen('M')) (end of M codes)
+
+ //! -----------------------------------------------------------------------------------------
+ //! T Codes
+ //!
//! T - select extruder in case of multi extruder printer
//! select filament in case of MMU_V2
//! if extruder is "?", open menu to let the user select extruder/filament
@@ -7345,46 +7852,95 @@ Sigma_Exit:
}
} // end if(code_seen('T')) (end of T codes)
+ //! ----------------------------------------------------------------------------------------------
+
else if (code_seen('D')) // D codes (debug)
{
switch((int)code_value())
{
- case -1: //! D-1 - Endless loop
+
+ //! ### D-1 - Endless loop
+ // -------------------
+ case -1:
dcode__1(); break;
#ifdef DEBUG_DCODES
- case 0: //! D0 - Reset
+
+ //! ### D0 - Reset
+ // --------------
+ case 0:
dcode_0(); break;
- case 1: //! D1 - Clear EEPROM
+
+ //! ### D1 - Clear EEPROM
+ // ------------------
+ case 1:
dcode_1(); break;
- case 2: //! D2 - Read/Write RAM
+
+ //! ### D2 - Read/Write RAM
+ // --------------------
+ case 2:
dcode_2(); break;
#endif //DEBUG_DCODES
#ifdef DEBUG_DCODE3
- case 3: //! D3 - Read/Write EEPROM
+
+ //! ### D3 - Read/Write EEPROM
+ // -----------------------
+ case 3:
dcode_3(); break;
#endif //DEBUG_DCODE3
#ifdef DEBUG_DCODES
- case 4: //! D4 - Read/Write PIN
+
+ //! ### D4 - Read/Write PIN
+ // ---------------------
+ case 4:
dcode_4(); break;
#endif //DEBUG_DCODES
#ifdef DEBUG_DCODE5
- case 5: // D5 - Read/Write FLASH
+
+ //! ### D5 - Read/Write FLASH
+ // ------------------------
+ case 5:
dcode_5(); break;
break;
#endif //DEBUG_DCODE5
#ifdef DEBUG_DCODES
- case 6: // D6 - Read/Write external FLASH
+
+ //! ### D6 - Read/Write external FLASH
+ // ---------------------------------------
+ case 6:
dcode_6(); break;
- case 7: //! D7 - Read/Write Bootloader
+
+ //! ### D7 - Read/Write Bootloader
+ // -------------------------------
+ case 7:
dcode_7(); break;
- case 8: //! D8 - Read/Write PINDA
+
+ //! ### D8 - Read/Write PINDA
+ // ---------------------------
+ case 8:
dcode_8(); break;
- case 9: //! D9 - Read/Write ADC
+
+ // ### D9 - Read/Write ADC
+ // ------------------------
+ case 9:
dcode_9(); break;
- case 10: //! D10 - XYZ calibration = OK
+
+ //! ### D10 - XYZ calibration = OK
+ // ------------------------------
+ case 10:
dcode_10(); break;
#endif //DEBUG_DCODES
#ifdef HEATBED_ANALYSIS
+
+ //! ### D80 - Bed check
+ // ---------------------
+ /*!
+ - `E` - dimension x
+ - `F` - dimention y
+ - `G` - points_x
+ - `H` - points_y
+ - `I` - offset_x
+ - `J` - offset_y
+ */
case 80:
{
float dimension_x = 40;
@@ -7409,6 +7965,16 @@ Sigma_Exit:
bed_check(dimension_x,dimension_y,points_x,points_y,offset_x,offset_y);
}break;
+ //! ### D81 - Bed analysis
+ // -----------------------------
+ /*!
+ - `E` - dimension x
+ - `F` - dimention y
+ - `G` - points_x
+ - `H` - points_y
+ - `I` - offset_x
+ - `J` - offset_y
+ */
case 81:
{
float dimension_x = 40;
@@ -7431,7 +7997,10 @@ Sigma_Exit:
#endif //HEATBED_ANALYSIS
#ifdef DEBUG_DCODES
- case 106: //D106 print measured fan speed for different pwm values
+
+ //! ### D106 print measured fan speed for different pwm values
+ // --------------------------------------------------------------
+ case 106:
{
for (int i = 255; i > 0; i = i - 5) {
fanSpeed = i;
@@ -7445,12 +8014,52 @@ Sigma_Exit:
}break;
#ifdef TMC2130
- case 2130: //! D2130 - TMC2130
+ //! ### D2130 - TMC2130 Trinamic stepper controller
+ // ---------------------------
+
+
+ /*!
+
+
+ D2130[subcommand][value]
+
+ - :
+ - '0' current off
+ - '1' current on
+ - '+' single step
+ - * value sereval steps
+ - '-' dtto oposite direction
+ - '?' read register
+ - * "mres"
+ - * "step"
+ - * "mscnt"
+ - * "mscuract"
+ - * "wave"
+ - '!' set register
+ - * "mres"
+ - * "step"
+ - * "wave"
+ - '@' home calibrate axis
+
+ Example:
+
+ D2130E?wave ... print extruder microstep linearity compensation curve
+
+ D2130E!wave0 ... disable extruder linearity compensation curve, (sine curve is used)
+
+ D2130E!wave220 ... (sin(x))^1.1 extruder microstep compensation curve used
+ */
+
+
+ case 2130:
dcode_2130(); break;
#endif //TMC2130
#if (defined (FILAMENT_SENSOR) && defined(PAT9125))
- case 9125: //! D9125 - FILAMENT_SENSOR
+
+ //! ### D9125 - FILAMENT_SENSOR
+ // ---------------------------------
+ case 9125:
dcode_9125(); break;
#endif //FILAMENT_SENSOR
@@ -7469,6 +8078,13 @@ Sigma_Exit:
ClearToSend();
}
+
+
+ /** @defgroup GCodes G-Code List
+ */
+
+// ---------------------------------------------------
+
void FlushSerialRequestResend()
{
//char cmdbuffer[bufindr][100]="Resend:";
@@ -9454,7 +10070,6 @@ void stop_and_save_print_to_ram(float z_move, float e_move)
if(!saved_extruder_relative_mode){
enquecommand(PSTR("M83"), true);
}
-
//retract 45mm/s
// A single sprintf may not be faster, but is definitely 20B shorter
// than a sequence of commands building the string piece by piece
@@ -9482,10 +10097,11 @@ void stop_and_save_print_to_ram(float z_move, float e_move)
//! @brief Restore print from ram
//!
-//! Restore print saved by stop_and_save_print_to_ram(). Is blocking,
-//! waits for extruder temperature restore, then restores position and continues
-//! print moves.
-//! Internaly lcd_update() is called by wait_for_heater().
+//! Restore print saved by stop_and_save_print_to_ram(). Is blocking, restores
+//! print fan speed, waits for extruder temperature restore, then restores
+//! position and continues print moves.
+//!
+//! Internally lcd_update() is called by wait_for_heater().
//!
//! @param e_move
void restore_print_from_ram_and_continue(float e_move)
@@ -9500,7 +10116,9 @@ void restore_print_from_ram_and_continue(float e_move)
// for (int axis = X_AXIS; axis <= E_AXIS; axis++)
// current_position[axis] = st_get_position_mm(axis);
active_extruder = saved_active_extruder; //restore active_extruder
- if (saved_extruder_temperature) {
+ fanSpeed = saved_fanSpeed;
+ if (degTargetHotend(saved_active_extruder) != saved_extruder_temperature)
+ {
setTargetHotendSafe(saved_extruder_temperature, saved_active_extruder);
heating_status = 1;
wait_for_heater(_millis(), saved_active_extruder);
@@ -9508,9 +10126,13 @@ void restore_print_from_ram_and_continue(float e_move)
}
feedrate = saved_feedrate2; //restore feedrate
axis_relative_modes[E_AXIS] = saved_extruder_relative_mode;
- fanSpeed = saved_fanSpeed;
float e = saved_pos[E_AXIS] - e_move;
plan_set_e_position(e);
+
+ #ifdef FANCHECK
+ fans_check_enabled = false;
+ #endif
+
//first move print head in XY to the saved position:
plan_buffer_line(saved_pos[X_AXIS], saved_pos[Y_AXIS], current_position[Z_AXIS], saved_pos[E_AXIS] - e_move, homing_feedrate[Z_AXIS]/13, active_extruder);
st_synchronize();
@@ -9521,13 +10143,16 @@ void restore_print_from_ram_and_continue(float e_move)
plan_buffer_line(saved_pos[X_AXIS], saved_pos[Y_AXIS], saved_pos[Z_AXIS], saved_pos[E_AXIS], 35, active_extruder);
st_synchronize();
+ #ifdef FANCHECK
+ fans_check_enabled = true;
+ #endif
+
memcpy(current_position, saved_pos, sizeof(saved_pos));
memcpy(destination, current_position, sizeof(destination));
if (saved_printing_type == PRINTING_TYPE_SD) { //was sd printing
card.setIndex(saved_sdpos);
sdpos_atomic = saved_sdpos;
card.sdprinting = true;
- printf_P(PSTR("ok\n")); //dummy response because of octoprint is waiting for this
}
else if (saved_printing_type == PRINTING_TYPE_USB) { //was usb printing
gcode_LastN = saved_sdpos; //saved_sdpos was reused for storing line number when usb printing
@@ -9537,6 +10162,7 @@ void restore_print_from_ram_and_continue(float e_move)
else {
//not sd printing nor usb printing
}
+ printf_P(PSTR("ok\n")); //dummy response because of octoprint is waiting for this
lcd_setstatuspgm(_T(WELCOME_MSG));
saved_printing = false;
}
@@ -9828,3 +10454,69 @@ void marlin_wait_for_click()
}
#define FIL_LOAD_LENGTH 60
+
+#ifdef PSU_Delta
+bool bEnableForce_z;
+
+void init_force_z()
+{
+WRITE(Z_ENABLE_PIN,Z_ENABLE_ON);
+bEnableForce_z=true; // "true"-value enforce "disable_force_z()" executing
+disable_force_z();
+}
+
+void check_force_z()
+{
+if(!(bEnableForce_z||eeprom_read_byte((uint8_t*)EEPROM_SILENT)))
+ init_force_z(); // causes enforced switching into disable-state
+}
+
+void disable_force_z()
+{
+uint16_t z_microsteps=0;
+
+if(!bEnableForce_z)
+ return; // motor already disabled (may be ;-p )
+bEnableForce_z=false;
+
+// alignment to full-step
+#ifdef TMC2130
+z_microsteps=tmc2130_rd_MSCNT(Z_TMC2130_CS);
+#endif // TMC2130
+planner_abort_hard();
+sei();
+plan_buffer_line(
+ current_position[X_AXIS],
+ current_position[Y_AXIS],
+ current_position[Z_AXIS]+float((1024-z_microsteps+7)>>4)/cs.axis_steps_per_unit[Z_AXIS],
+ current_position[E_AXIS],
+ 40, active_extruder);
+st_synchronize();
+
+// switching to silent mode
+#ifdef TMC2130
+tmc2130_mode=TMC2130_MODE_SILENT;
+update_mode_profile();
+tmc2130_init(true);
+#endif // TMC2130
+
+axis_known_position[Z_AXIS]=false;
+}
+
+
+void enable_force_z()
+{
+if(bEnableForce_z)
+ return; // motor already enabled (may be ;-p )
+bEnableForce_z=true;
+
+// mode recovering
+#ifdef TMC2130
+tmc2130_mode=eeprom_read_byte((uint8_t*)EEPROM_SILENT)?TMC2130_MODE_SILENT:TMC2130_MODE_NORMAL;
+update_mode_profile();
+tmc2130_init(true);
+#endif // TMC2130
+
+WRITE(Z_ENABLE_PIN,Z_ENABLE_ON); // slightly redundant ;-p
+}
+#endif // PSU_Delta
diff --git a/Firmware/doxyfile b/Firmware/doxyfile
index 9c2d550c0..346ce6045 100644
--- a/Firmware/doxyfile
+++ b/Firmware/doxyfile
@@ -2050,7 +2050,7 @@ PERLMOD_MAKEVAR_PREFIX =
# C-preprocessor directives found in the sources and include files.
# The default value is: YES.
-ENABLE_PREPROCESSING = YES
+ENABLE_PREPROCESSING = NO
# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names
# in the source code. If set to NO, only conditional compilation will be
diff --git a/Firmware/eeprom.cpp b/Firmware/eeprom.cpp
index 1be708d00..f2d897165 100644
--- a/Firmware/eeprom.cpp
+++ b/Firmware/eeprom.cpp
@@ -71,6 +71,12 @@ void eeprom_init()
}
if(is_uninitialized)
{
+ // When upgrading from version older version (before multiple sheets were implemented in v3.8.0)
+ // Sheet 1 uses the previous Live adjust Z (@EEPROM_BABYSTEP_Z)
+ if(i == 0){
+ int last_babystep = eeprom_read_word((uint16_t *)EEPROM_BABYSTEP_Z);
+ eeprom_write_word(reinterpret_cast(&(EEPROM_Sheets_base->s[i].z_offset)), last_babystep);
+ }
eeprom_write(&(EEPROM_Sheets_base->s[i].name[0]), static_cast(i + '1'));
eeprom_write(&(EEPROM_Sheets_base->s[i].name[1]), '\0');
}
diff --git a/Firmware/fsensor.cpp b/Firmware/fsensor.cpp
index fd7936ee9..f20f647d6 100755
--- a/Firmware/fsensor.cpp
+++ b/Firmware/fsensor.cpp
@@ -522,19 +522,6 @@ void fsensor_st_block_chunk(block_t* bl, int cnt)
}
}
-//! This ensures generating z-position at least 25mm above the heat bed.
-//! Making this a template enables changing the computation data type easily at all spots where necessary.
-//! @param current_z current z-position
-//! @return z-position at least 25mm above the heat bed plus FILAMENTCHANGE_ZADD
-template
-inline T fsensor_clamp_z(float current_z){
- T z( current_z );
- if(z < T(25)){ // make sure the compiler understands, that the constant 25 is of correct type
- // - necessary for uint8_t -> results in shorter code
- z = T(25); // move to at least 25mm above heat bed
- }
- return z + T(FILAMENTCHANGE_ZADD); // always move above the printout by FILAMENTCHANGE_ZADD (default 2mm)
-}
//! Common code for enqueing M600 and supplemental codes into the command queue.
//! Used both for the IR sensor and the PAT9125
@@ -545,22 +532,6 @@ void fsensor_enque_M600(){
enquecommand_front_P(PSTR("PRUSA fsensor_recover"));
fsensor_m600_enqueued = true;
enquecommand_front_P((PSTR("M600")));
-#define xstr(a) str(a)
-#define str(a) #a
- static const char gcodeMove[] PROGMEM =
- "G1 X" xstr(FILAMENTCHANGE_XPOS)
- " Y" xstr(FILAMENTCHANGE_YPOS)
- " Z%u";
-#undef str
-#undef xstr
- char buf[32];
- // integer arithmetics is far shorter, I don't need a precise float position here, just move a bit above
- // 8bit arithmetics in fsensor_clamp_z is 10B shorter than 16bit (not talking about float ;) )
- // The compile-time static_assert here ensures, that the computation gets enough bits in case of Z-range too high,
- // i.e. makes the user change the data type, which also results in larger code
- static_assert(Z_MAX_POS < (255 - FILAMENTCHANGE_ZADD), "Z-range too high, change fsensor_clamp_z to ");
- sprintf_P(buf, gcodeMove, fsensor_clamp_z(current_position[Z_AXIS]) );
- enquecommand_front(buf, false);
}
//! @brief filament sensor update (perform M600 on filament runout)
diff --git a/Firmware/io_atmega2560.h b/Firmware/io_atmega2560.h
index e8c756ffb..e353eb05e 100644
--- a/Firmware/io_atmega2560.h
+++ b/Firmware/io_atmega2560.h
@@ -368,6 +368,7 @@
#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/lcd.cpp b/Firmware/lcd.cpp
index 5bd7cad67..1f4e6e2f4 100644
--- a/Firmware/lcd.cpp
+++ b/Firmware/lcd.cpp
@@ -10,12 +10,19 @@
#include "Configuration.h"
#include "pins.h"
#include
-//#include
+#include
#include "Marlin.h"
#include "fastio.h"
//-//
#include "sound.h"
+#define LCD_DEFAULT_DELAY 100
+
+#if (defined(LCD_PINS_D0) && defined(LCD_PINS_D1) && defined(LCD_PINS_D2) && defined(LCD_PINS_D3))
+ #define LCD_8BIT
+#endif
+
+// #define VT100
// commands
#define LCD_CLEARDISPLAY 0x01
@@ -55,242 +62,202 @@
#define LCD_5x10DOTS 0x04
#define LCD_5x8DOTS 0x00
+// bitmasks for flag argument settings
+#define LCD_RS_FLAG 0x01
+#define LCD_HALF_FLAG 0x02
FILE _lcdout; // = {0}; Global variable is always zero initialized, no need to explicitly state that.
+uint8_t lcd_displayfunction = 0;
+uint8_t lcd_displaycontrol = 0;
+uint8_t lcd_displaymode = 0;
-uint8_t lcd_rs_pin; // LOW: command. HIGH: character.
-uint8_t lcd_rw_pin; // LOW: write to LCD. HIGH: read from LCD.
-uint8_t lcd_enable_pin; // activated by a HIGH pulse.
-uint8_t lcd_data_pins[8];
-
-uint8_t lcd_displayfunction;
-uint8_t lcd_displaycontrol;
-uint8_t lcd_displaymode;
-
-uint8_t lcd_numlines;
uint8_t lcd_currline;
+#ifdef VT100
uint8_t lcd_escape[8];
+#endif
+static void lcd_display(void);
-void lcd_pulseEnable(void)
-{
- digitalWrite(lcd_enable_pin, LOW);
- delayMicroseconds(1);
- digitalWrite(lcd_enable_pin, HIGH);
- delayMicroseconds(1); // enable pulse must be >450ns
- digitalWrite(lcd_enable_pin, LOW);
- delayMicroseconds(100); // commands need > 37us to settle
+#if 0
+static void lcd_no_display(void);
+static void lcd_no_cursor(void);
+static void lcd_cursor(void);
+static void lcd_no_blink(void);
+static void lcd_blink(void);
+static void lcd_scrollDisplayLeft(void);
+static void lcd_scrollDisplayRight(void);
+static void lcd_leftToRight(void);
+static void lcd_rightToLeft(void);
+static void lcd_autoscroll(void);
+static void lcd_no_autoscroll(void);
+#endif
+
+#ifdef VT100
+void lcd_escape_write(uint8_t chr);
+#endif
+
+static void lcd_pulseEnable(void)
+{
+ WRITE(LCD_PINS_ENABLE,HIGH);
+ _delay_us(1); // enable pulse must be >450ns
+ WRITE(LCD_PINS_ENABLE,LOW);
}
-void lcd_write4bits(uint8_t value)
+static void lcd_writebits(uint8_t value)
{
- for (int i = 0; i < 4; i++)
- {
- pinMode(lcd_data_pins[i], OUTPUT);
- digitalWrite(lcd_data_pins[i], (value >> i) & 0x01);
- }
+#ifdef LCD_8BIT
+ WRITE(LCD_PINS_D0, value & 0x01);
+ WRITE(LCD_PINS_D1, value & 0x02);
+ WRITE(LCD_PINS_D2, value & 0x04);
+ WRITE(LCD_PINS_D3, value & 0x08);
+#endif
+ WRITE(LCD_PINS_D4, value & 0x10);
+ WRITE(LCD_PINS_D5, value & 0x20);
+ WRITE(LCD_PINS_D6, value & 0x40);
+ WRITE(LCD_PINS_D7, value & 0x80);
+
lcd_pulseEnable();
}
-void lcd_write8bits(uint8_t value)
+static void lcd_send(uint8_t data, uint8_t flags, uint16_t duration = LCD_DEFAULT_DELAY)
{
- for (int i = 0; i < 8; i++)
+ WRITE(LCD_PINS_RS,flags&LCD_RS_FLAG);
+ _delay_us(5);
+ lcd_writebits(data);
+#ifndef LCD_8BIT
+ if (!(flags & LCD_HALF_FLAG))
{
- pinMode(lcd_data_pins[i], OUTPUT);
- digitalWrite(lcd_data_pins[i], (value >> i) & 0x01);
+ _delay_us(LCD_DEFAULT_DELAY);
+ lcd_writebits(data<<4);
}
- lcd_pulseEnable();
+#endif
+ delayMicroseconds(duration);
}
-// write either command or data, with automatic 4/8-bit selection
-void lcd_send(uint8_t value, uint8_t mode)
+static void lcd_command(uint8_t value, uint16_t delayExtra = 0)
{
- digitalWrite(lcd_rs_pin, mode);
- // if there is a RW pin indicated, set it low to Write
- if (lcd_rw_pin != 255) digitalWrite(lcd_rw_pin, LOW);
- if (lcd_displayfunction & LCD_8BITMODE)
- lcd_write8bits(value);
- else
- {
- lcd_write4bits(value>>4);
- lcd_write4bits(value);
- }
+ lcd_send(value, LOW, LCD_DEFAULT_DELAY + delayExtra);
}
-void lcd_command(uint8_t value)
+static void lcd_write(uint8_t value)
{
- lcd_send(value, LOW);
-}
-
-void lcd_clear(void);
-void lcd_home(void);
-void lcd_no_display(void);
-void lcd_display(void);
-void lcd_no_cursor(void);
-void lcd_cursor(void);
-void lcd_no_blink(void);
-void lcd_blink(void);
-void lcd_scrollDisplayLeft(void);
-void lcd_scrollDisplayRight(void);
-void lcd_leftToRight(void);
-void lcd_rightToLeft(void);
-void lcd_autoscroll(void);
-void lcd_no_autoscroll(void);
-void lcd_set_cursor(uint8_t col, uint8_t row);
-void lcd_createChar_P(uint8_t location, const uint8_t* charmap);
-
-uint8_t lcd_escape_write(uint8_t chr);
-
-uint8_t lcd_write(uint8_t value)
-{
- if (value == '\n')
+ if (value == '\n' || value == '\r')
{
if (lcd_currline > 3) lcd_currline = -1;
lcd_set_cursor(0, lcd_currline + 1); // LF
- return 1;
+ return;
}
- if (lcd_escape[0] || (value == 0x1b))
- return lcd_escape_write(value);
+ #ifdef VT100
+ if (lcd_escape[0] || (value == 0x1b)){
+ lcd_escape_write(value);
+ return;
+ }
+ #endif
lcd_send(value, HIGH);
- return 1; // assume sucess
}
-static void lcd_begin(uint8_t lines, uint8_t dotsize, uint8_t clear)
+static void lcd_begin(uint8_t clear)
{
- if (lines > 1) lcd_displayfunction |= LCD_2LINE;
- lcd_numlines = lines;
lcd_currline = 0;
- // for some 1 line displays you can select a 10 pixel high font
- if ((dotsize != 0) && (lines == 1)) lcd_displayfunction |= LCD_5x10DOTS;
- // SEE PAGE 45/46 FOR INITIALIZATION SPECIFICATION!
- // according to datasheet, we need at least 40ms after power rises above 2.7V
- // before sending commands. Arduino can turn on way befer 4.5V so we'll wait 50
- _delay_us(50000);
- // Now we pull both RS and R/W low to begin commands
- digitalWrite(lcd_rs_pin, LOW);
- digitalWrite(lcd_enable_pin, LOW);
- if (lcd_rw_pin != 255)
- digitalWrite(lcd_rw_pin, LOW);
- //put the LCD into 4 bit or 8 bit mode
- if (!(lcd_displayfunction & LCD_8BITMODE))
- {
- // this is according to the hitachi HD44780 datasheet
- // figure 24, pg 46
- // we start in 8bit mode, try to set 4 bit mode
- lcd_write4bits(0x03);
- _delay_us(4500); // wait min 4.1ms
- // second try
- lcd_write4bits(0x03);
- _delay_us(4500); // wait min 4.1ms
- // third go!
- lcd_write4bits(0x03);
- _delay_us(150);
- // finally, set to 4-bit interface
- lcd_write4bits(0x02);
- }
- else
- {
- // this is according to the hitachi HD44780 datasheet
- // page 45 figure 23
- // Send function set command sequence
- lcd_command(LCD_FUNCTIONSET | lcd_displayfunction);
- _delay_us(4500); // wait more than 4.1ms
- // second try
- lcd_command(LCD_FUNCTIONSET | lcd_displayfunction);
- _delay_us(150);
- // third go
- lcd_command(LCD_FUNCTIONSET | lcd_displayfunction);
- }
- // finally, set # lines, font size, etc.
- lcd_command(LCD_FUNCTIONSET | lcd_displayfunction);
- _delay_us(60);
+
+ lcd_send(LCD_FUNCTIONSET | LCD_8BITMODE, LOW | LCD_HALF_FLAG, 4500); // wait min 4.1ms
+ // second try
+ lcd_send(LCD_FUNCTIONSET | LCD_8BITMODE, LOW | LCD_HALF_FLAG, 150);
+ // third go!
+ lcd_send(LCD_FUNCTIONSET | LCD_8BITMODE, LOW | LCD_HALF_FLAG, 150);
+#ifndef LCD_8BIT
+ // set to 4-bit interface
+ lcd_send(LCD_FUNCTIONSET | LCD_4BITMODE, LOW | LCD_HALF_FLAG, 150);
+#endif
+
+ // finally, set # lines, font size, etc.0
+ lcd_command(LCD_FUNCTIONSET | lcd_displayfunction);
// turn the display on with no cursor or blinking default
- lcd_displaycontrol = LCD_DISPLAYON | LCD_CURSOROFF | LCD_BLINKOFF;
+ lcd_displaycontrol = LCD_CURSOROFF | LCD_BLINKOFF;
lcd_display();
- _delay_us(60);
// clear it off
if (clear) lcd_clear();
- _delay_us(3000);
// Initialize to default text direction (for romance languages)
lcd_displaymode = LCD_ENTRYLEFT | LCD_ENTRYSHIFTDECREMENT;
// set the entry mode
lcd_command(LCD_ENTRYMODESET | lcd_displaymode);
- _delay_us(60);
+
+ #ifdef VT100
lcd_escape[0] = 0;
+ #endif
}
-int lcd_putchar(char c, FILE *)
+static void lcd_putchar(char c, FILE *)
{
lcd_write(c);
- return 0;
}
void lcd_init(void)
{
- uint8_t fourbitmode = 1;
- lcd_rs_pin = LCD_PINS_RS;
- lcd_rw_pin = 255;
- lcd_enable_pin = LCD_PINS_ENABLE;
- lcd_data_pins[0] = LCD_PINS_D4;
- lcd_data_pins[1] = LCD_PINS_D5;
- lcd_data_pins[2] = LCD_PINS_D6;
- lcd_data_pins[3] = LCD_PINS_D7;
- lcd_data_pins[4] = 0;
- lcd_data_pins[5] = 0;
- lcd_data_pins[6] = 0;
- lcd_data_pins[7] = 0;
- pinMode(lcd_rs_pin, OUTPUT);
- // we can save 1 pin by not using RW. Indicate by passing 255 instead of pin#
- if (lcd_rw_pin != 255) pinMode(lcd_rw_pin, OUTPUT);
- pinMode(lcd_enable_pin, OUTPUT);
- if (fourbitmode) lcd_displayfunction = LCD_4BITMODE | LCD_1LINE | LCD_5x8DOTS;
- else lcd_displayfunction = LCD_8BITMODE | LCD_1LINE | LCD_5x8DOTS;
- lcd_begin(LCD_HEIGHT, LCD_5x8DOTS, 1);
- //lcd_clear();
+ WRITE(LCD_PINS_ENABLE,LOW);
+ SET_OUTPUT(LCD_PINS_RS);
+ SET_OUTPUT(LCD_PINS_ENABLE);
+
+#ifdef LCD_8BIT
+ SET_OUTPUT(LCD_PINS_D0);
+ SET_OUTPUT(LCD_PINS_D1);
+ SET_OUTPUT(LCD_PINS_D2);
+ SET_OUTPUT(LCD_PINS_D3);
+#endif
+ SET_OUTPUT(LCD_PINS_D4);
+ SET_OUTPUT(LCD_PINS_D5);
+ SET_OUTPUT(LCD_PINS_D6);
+ SET_OUTPUT(LCD_PINS_D7);
+
+#ifdef LCD_8BIT
+ lcd_displayfunction |= LCD_8BITMODE;
+#endif
+ lcd_displayfunction |= LCD_2LINE;
+ _delay_us(50000);
+ lcd_begin(1); //first time init
fdev_setup_stream(lcdout, lcd_putchar, NULL, _FDEV_SETUP_WRITE); //setup lcdout stream
}
void lcd_refresh(void)
{
- lcd_begin(LCD_HEIGHT, LCD_5x8DOTS, 1);
+ lcd_begin(1);
lcd_set_custom_characters();
}
void lcd_refresh_noclear(void)
{
- lcd_begin(LCD_HEIGHT, LCD_5x8DOTS, 0);
+ lcd_begin(0);
lcd_set_custom_characters();
}
-
-
void lcd_clear(void)
{
- lcd_command(LCD_CLEARDISPLAY); // clear display, set cursor position to zero
- _delay_us(1600); // this command takes a long time
+ lcd_command(LCD_CLEARDISPLAY, 1600); // clear display, set cursor position to zero
+ lcd_currline = 0;
}
void lcd_home(void)
{
- lcd_command(LCD_RETURNHOME); // set cursor position to zero
- _delay_us(1600); // this command takes a long time!
+ lcd_command(LCD_RETURNHOME, 1600); // set cursor position to zero
+ lcd_currline = 0;
}
// Turn the display on/off (quickly)
+void lcd_display(void)
+{
+ lcd_displaycontrol |= LCD_DISPLAYON;
+ lcd_command(LCD_DISPLAYCONTROL | lcd_displaycontrol);
+}
+
+#if 0
void lcd_no_display(void)
{
lcd_displaycontrol &= ~LCD_DISPLAYON;
lcd_command(LCD_DISPLAYCONTROL | lcd_displaycontrol);
}
-void lcd_display(void)
-{
- lcd_displaycontrol |= LCD_DISPLAYON;
- lcd_command(LCD_DISPLAYCONTROL | lcd_displaycontrol);
-}
-
// Turns the underline cursor on/off
void lcd_no_cursor(void)
{
@@ -355,12 +322,13 @@ void lcd_no_autoscroll(void)
lcd_displaymode &= ~LCD_ENTRYSHIFTINCREMENT;
lcd_command(LCD_ENTRYMODESET | lcd_displaymode);
}
+#endif
void lcd_set_cursor(uint8_t col, uint8_t row)
{
int row_offsets[] = { 0x00, 0x40, 0x14, 0x54 };
- if ( row >= lcd_numlines )
- row = lcd_numlines-1; // we count rows starting w/0
+ if (row >= LCD_HEIGHT)
+ row = LCD_HEIGHT - 1; // we count rows starting w/0
lcd_currline = row;
lcd_command(LCD_SETDDRAMADDR | (col + row_offsets[row]));
}
@@ -375,12 +343,14 @@ void lcd_createChar_P(uint8_t location, const uint8_t* charmap)
lcd_send(pgm_read_byte(&charmap[i]), HIGH);
}
+#ifdef VT100
+
//Supported VT100 escape codes:
//EraseScreen "\x1b[2J"
//CursorHome "\x1b[%d;%dH"
//CursorShow "\x1b[?25h"
//CursorHide "\x1b[?25l"
-uint8_t lcd_escape_write(uint8_t chr)
+void lcd_escape_write(uint8_t chr)
{
#define escape_cnt (lcd_escape[0]) //escape character counter
#define is_num_msk (lcd_escape[1]) //numeric character bit mask
@@ -410,26 +380,26 @@ uint8_t lcd_escape_write(uint8_t chr)
switch (escape_cnt++)
{
case 0:
- if (chr == 0x1b) return 1; // escape = "\x1b"
+ if (chr == 0x1b) return; // escape = "\x1b"
break;
case 1:
is_num_msk = 0x00; // reset 'is number' bit mask
- if (chr == '[') return 1; // escape = "\x1b["
+ if (chr == '[') return; // escape = "\x1b["
break;
case 2:
switch (chr)
{
- case '2': return 1; // escape = "\x1b[2"
- case '?': return 1; // escape = "\x1b[?"
+ case '2': return; // escape = "\x1b[2"
+ case '?': return; // escape = "\x1b[?"
default:
- if (chr_is_num) return 1; // escape = "\x1b[%1d"
+ if (chr_is_num) return; // escape = "\x1b[%1d"
}
break;
case 3:
switch (lcd_escape[2])
{
case '?': // escape = "\x1b[?"
- if (chr == '2') return 1; // escape = "\x1b[?2"
+ if (chr == '2') return; // escape = "\x1b[?2"
break;
case '2':
if (chr == 'J') // escape = "\x1b[2J"
@@ -438,20 +408,20 @@ uint8_t lcd_escape_write(uint8_t chr)
if (e_2_is_num && // escape = "\x1b[%1d"
((chr == ';') || // escape = "\x1b[%1d;"
chr_is_num)) // escape = "\x1b[%2d"
- return 1;
+ return;
}
break;
case 4:
switch (lcd_escape[2])
{
case '?': // "\x1b[?"
- if ((lcd_escape[3] == '2') && (chr == '5')) return 1; // escape = "\x1b[?25"
+ if ((lcd_escape[3] == '2') && (chr == '5')) return; // escape = "\x1b[?25"
break;
default:
if (e_2_is_num) // escape = "\x1b[%1d"
{
- if ((lcd_escape[3] == ';') && chr_is_num) return 1; // escape = "\x1b[%1d;%1d"
- else if (e_3_is_num && (chr == ';')) return 1; // escape = "\x1b[%2d;"
+ if ((lcd_escape[3] == ';') && chr_is_num) return; // escape = "\x1b[%1d;%1d"
+ else if (e_3_is_num && (chr == ';')) return; // escape = "\x1b[%2d;"
}
}
break;
@@ -478,10 +448,10 @@ uint8_t lcd_escape_write(uint8_t chr)
if (chr == 'H') // escape = "\x1b%1d;%1dH"
lcd_set_cursor(e4_num, e2_num); // CursorHome
else if (chr_is_num)
- return 1; // escape = "\x1b%1d;%2d"
+ return; // escape = "\x1b%1d;%2d"
}
else if (e_3_is_num && (lcd_escape[4] == ';') && chr_is_num)
- return 1; // escape = "\x1b%2d;%1d"
+ return; // escape = "\x1b%2d;%1d"
}
}
break;
@@ -495,7 +465,7 @@ uint8_t lcd_escape_write(uint8_t chr)
if (chr == 'H') // escape = "\x1b%2d;%1dH"
lcd_set_cursor(e5_num, e23_num); // CursorHome
else if (chr_is_num) // "\x1b%2d;%2d"
- return 1;
+ return;
}
}
break;
@@ -506,10 +476,9 @@ uint8_t lcd_escape_write(uint8_t chr)
break;
}
escape_cnt = 0; // reset escape
- return 1; // assume sucess
}
-
+#endif //VT100
int lcd_putc(int c)
@@ -648,16 +617,6 @@ void lcd_printFloat(double number, uint8_t digits)
}
-
-
-
-
-
-
-
-
-
-
uint8_t lcd_draw_update = 2;
int32_t lcd_encoder = 0;
uint8_t lcd_encoder_bits = 0;
@@ -710,7 +669,7 @@ Sound_MakeSound(e_SOUND_TYPE_ButtonEcho);
for(int8_t i = 0; i < 10; i++)
{
Sound_MakeCustom(100,0,false);
- delayMicroseconds(100);
+ _delay_us(100);
}
*/
}
@@ -722,13 +681,6 @@ void lcd_quick_feedback(void)
lcd_beeper_quick_feedback();
}
-
-
-
-
-
-
-
void lcd_update(uint8_t lcdDrawUpdateOverride)
{
if (lcd_draw_update < lcdDrawUpdateOverride)
diff --git a/Firmware/lcd.h b/Firmware/lcd.h
index 9f3eb5c13..307e9486c 100644
--- a/Firmware/lcd.h
+++ b/Firmware/lcd.h
@@ -11,8 +11,7 @@
extern FILE _lcdout;
#define lcdout (&_lcdout)
-extern int lcd_putchar(char c, FILE *stream);
-
+extern void lcd_putchar(char c, FILE *stream);
extern void lcd_init(void);
@@ -20,13 +19,10 @@ extern void lcd_refresh(void);
extern void lcd_refresh_noclear(void);
-
-
extern void lcd_clear(void);
extern void lcd_home(void);
-
/*extern void lcd_no_display(void);
extern void lcd_display(void);
extern void lcd_no_blink(void);
@@ -45,7 +41,6 @@ extern void lcd_set_cursor(uint8_t col, uint8_t row);
extern void lcd_createChar_P(uint8_t, const uint8_t*);
-
extern int lcd_putc(int c);
extern int lcd_puts_P(const char* str);
extern int lcd_puts_at_P(uint8_t c, uint8_t r, const char* str);
@@ -66,7 +61,9 @@ extern void lcd_print(double, int = 2);
//! @brief Clear screen
#define ESC_2J "\x1b[2J"
+//! @brief Show cursor
#define ESC_25h "\x1b[?25h"
+//! @brief Hide cursor
#define ESC_25l "\x1b[?25l"
//! @brief Set cursor to
//! @param c column
@@ -118,9 +115,6 @@ extern lcd_lcdupdate_func_t lcd_lcdupdate_func;
-
-
-
extern uint8_t lcd_clicked(void);
extern void lcd_beeper_quick_feedback(void);
@@ -128,13 +122,6 @@ extern void lcd_beeper_quick_feedback(void);
//Cause an LCD refresh, and give the user visual or audible feedback that something has happened
extern void lcd_quick_feedback(void);
-
-
-
-
-
-
-
extern void lcd_update(uint8_t lcdDrawUpdateOverride);
extern void lcd_update_enable(uint8_t enabled);
@@ -165,29 +152,6 @@ private:
};
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-/**
-* Implementation of the LCD display routines for a Hitachi HD44780 display. These are common LCD character displays.
-* When selecting the Russian language, a slightly different LCD implementation is used to handle UTF8 characters.
-**/
-
-
////////////////////////////////////
// Setup button and encode mappings for each panel (into 'lcd_buttons' variable
//
@@ -223,8 +187,6 @@ private:
#define encrot3 1
-
-
//Custom characters defined in the first 8 characters of the LCD
#define LCD_STR_BEDTEMP "\x00"
#define LCD_STR_DEGREE "\x01"
diff --git a/Firmware/messages.c b/Firmware/messages.c
index 0a7506121..1c36e43c5 100644
--- a/Firmware/messages.c
+++ b/Firmware/messages.c
@@ -84,6 +84,7 @@ const char MSG_SELFTEST_MOTOR[] PROGMEM_I1 = ISTR("Motor"); ////
const char MSG_SELFTEST_FILAMENT_SENSOR[] PROGMEM_I1 = ISTR("Filament sensor"); ////c=17
const char MSG_SELFTEST_WIRINGERROR[] PROGMEM_I1 = ISTR("Wiring error"); ////
const char MSG_SETTINGS[] PROGMEM_I1 = ISTR("Settings"); ////
+const char MSG_HW_SETUP[] PROGMEM_I1 = ISTR("HW Setup"); ////
const char MSG_SILENT_MODE_OFF[] PROGMEM_I1 = ISTR("Mode [high power]"); ////
const char MSG_SILENT_MODE_ON[] PROGMEM_I1 = ISTR("Mode [silent]"); ////
const char MSG_STEALTH_MODE_OFF[] PROGMEM_I1 = ISTR("Mode [Normal]"); ////
@@ -128,3 +129,4 @@ const char MSG_ENDSTOP_OPEN[] PROGMEM_N1 = "open"; ////
const char MSG_POWERUP[] PROGMEM_N1 = "PowerUp"; ////
const char MSG_ERR_STOPPED[] PROGMEM_N1 = "Printer stopped due to errors. Fix the error and use M999 to restart. (Temperature is reset. Set it after restarting)"; ////
const char MSG_ENDSTOP_HIT[] PROGMEM_N1 = "TRIGGERED"; ////
+const char MSG_OCTOPRINT_PAUSE[] PROGMEM_N1 = "// action:pause"; ////
diff --git a/Firmware/messages.h b/Firmware/messages.h
index 6260e0d30..b48337efd 100644
--- a/Firmware/messages.h
+++ b/Firmware/messages.h
@@ -84,6 +84,7 @@ extern const char MSG_SELFTEST_MOTOR[];
extern const char MSG_SELFTEST_FILAMENT_SENSOR[];
extern const char MSG_SELFTEST_WIRINGERROR[];
extern const char MSG_SETTINGS[];
+extern const char MSG_HW_SETUP[];
extern const char MSG_SILENT_MODE_OFF[];
extern const char MSG_SILENT_MODE_ON[];
extern const char MSG_STEALTH_MODE_OFF[];
@@ -129,6 +130,7 @@ extern const char MSG_ERR_STOPPED[];
extern const char MSG_ENDSTOP_HIT[];
extern const char MSG_EJECT_FILAMENT[];
extern const char MSG_CUT_FILAMENT[];
+extern const char MSG_OCTOPRINT_PAUSE[];
#if defined(__cplusplus)
}
diff --git a/Firmware/sound.cpp b/Firmware/sound.cpp
index 7b965a2d2..b01285a5f 100644
--- a/Firmware/sound.cpp
+++ b/Firmware/sound.cpp
@@ -61,17 +61,18 @@ switch(eSoundMode)
Sound_SaveMode();
}
+//if critical is true then silend and once mode is ignored
void Sound_MakeCustom(uint16_t ms,uint16_t tone_,bool critical){
if (!critical){
if (eSoundMode != e_SOUND_MODE_SILENT){
if(!tone_){
WRITE(BEEPER, HIGH);
- delayMicroseconds(ms);
+ _delay(ms);
WRITE(BEEPER, LOW);
}
else{
_tone(BEEPER, tone_);
- delayMicroseconds(ms);
+ _delay(ms);
_noTone(BEEPER);
}
}
@@ -79,13 +80,13 @@ void Sound_MakeCustom(uint16_t ms,uint16_t tone_,bool critical){
else{
if(!tone_){
WRITE(BEEPER, HIGH);
- delayMicroseconds(ms);
+ _delay(ms);
WRITE(BEEPER, LOW);
- delayMicroseconds(100);
+ _delay(ms);
}
else{
_tone(BEEPER, tone_);
- delayMicroseconds(ms);
+ _delay(ms);
_noTone(BEEPER);
}
}
@@ -134,10 +135,10 @@ switch(eSoundMode)
static void Sound_DoSound_Blind_Alert(void)
{
- _tone(BEEPER,100);
- delayMicroseconds(50);
+ _tone(BEEPER,300);
+ _delay_ms(75);
_noTone(BEEPER);
- delayMicroseconds(200);
+ _delay_ms(75);
}
static void Sound_DoSound_Encoder_Move(void)
@@ -169,7 +170,7 @@ for(nI=0;nI<10;nI++)
static void Sound_DoSound_Prompt(void)
{
WRITE(BEEPER,HIGH);
-delayMicroseconds(500);
+_delay_ms(500);
WRITE(BEEPER,LOW);
}
diff --git a/Firmware/sound.h b/Firmware/sound.h
index 2c14dfee6..bdd32ec83 100644
--- a/Firmware/sound.h
+++ b/Firmware/sound.h
@@ -6,7 +6,7 @@
#define MSG_SOUND_MODE_LOUD "Sound [loud]"
#define MSG_SOUND_MODE_ONCE "Sound [once]"
#define MSG_SOUND_MODE_SILENT "Sound [silent]"
-#define MSG_SOUND_MODE_BLIND "Sound [blind]"
+#define MSG_SOUND_MODE_BLIND "Sound [blind]"
#define e_SOUND_MODE_NULL 0xFF
diff --git a/Firmware/stepper.cpp b/Firmware/stepper.cpp
index 74d25777c..860d761cf 100644
--- a/Firmware/stepper.cpp
+++ b/Firmware/stepper.cpp
@@ -1122,7 +1122,7 @@ void clear_current_adv_vars() {
}
#endif // LIN_ADVANCE
-
+
void st_init()
{
#ifdef TMC2130
@@ -1306,6 +1306,9 @@ void st_init()
SET_OUTPUT(Z2_STEP_PIN);
WRITE(Z2_STEP_PIN,INVERT_Z_STEP_PIN);
#endif
+ #ifdef PSU_Delta
+ init_force_z();
+ #endif // PSU_Delta
disable_z();
#endif
#if defined(E0_STEP_PIN) && (E0_STEP_PIN > -1)
diff --git a/Firmware/temperature.cpp b/Firmware/temperature.cpp
index 779bee32c..42d294c43 100755
--- a/Firmware/temperature.cpp
+++ b/Firmware/temperature.cpp
@@ -40,7 +40,7 @@
#include
#include "adc.h"
#include "ConfigurationStore.h"
-
+#include "messages.h"
#include "Timer.h"
#include "Configuration_prusa.h"
@@ -498,8 +498,9 @@ void checkFanSpeed()
max_print_fan_errors = 15; //15 seconds
max_extruder_fan_errors = 5; //5 seconds
#endif //FAN_SOFT_PWM
-
- fans_check_enabled = (eeprom_read_byte((uint8_t*)EEPROM_FAN_CHECK_ENABLED) > 0);
+
+ if(fans_check_enabled != false)
+ fans_check_enabled = (eeprom_read_byte((uint8_t*)EEPROM_FAN_CHECK_ENABLED) > 0);
static unsigned char fan_speed_errors[2] = { 0,0 };
#if (defined(FANCHECK) && defined(TACH_0) && (TACH_0 >-1))
if ((fan_speed[0] == 0) && (current_temperature[0] > EXTRUDER_AUTO_FAN_TEMPERATURE)) fan_speed_errors[0]++;
@@ -524,6 +525,8 @@ void checkFanSpeed()
fan_speed_errors[1] = 0;
fanSpeedError(1); //print fan
}
+
+ SERIAL_PROTOCOLLNRPGM(MSG_OK); //for octoprint
}
//! Prints serialMsg to serial port, displays lcdMsg onto the LCD and beeps.
@@ -541,18 +544,19 @@ static void fanSpeedErrorBeep(const char *serialMsg, const char *lcdMsg){
void fanSpeedError(unsigned char _fan) {
if (get_message_level() != 0 && isPrintPaused) return;
//to ensure that target temp. is not set to zero in case taht we are resuming print
- if (card.sdprinting) {
+ if (card.sdprinting || is_usb_printing) {
if (heating_status != 0) {
lcd_print_stop();
}
else {
fan_check_error = EFCE_DETECTED;
-
}
}
else {
+ SERIAL_PROTOCOLLNRPGM(MSG_OCTOPRINT_PAUSE); //for octoprint
setTargetHotend0(0);
- SERIAL_ECHOLNPGM("// action:pause"); //for octoprint
+ heating_status = 0;
+ fan_check_error = EFCE_REPORTED;
}
switch (_fan) {
case 0: // extracting the same code from case 0 and case 1 into a function saves 72B
@@ -562,6 +566,7 @@ void fanSpeedError(unsigned char _fan) {
fanSpeedErrorBeep(PSTR("Print fan speed is lower than expected"), PSTR("Err: PRINT FAN ERROR") );
break;
}
+ SERIAL_PROTOCOLLNRPGM(MSG_OK);
}
#endif //(defined(TACH_0) && TACH_0 >-1) || (defined(TACH_1) && TACH_1 > -1)
diff --git a/Firmware/temperature.h b/Firmware/temperature.h
index 27a7e713d..e9ba11b47 100755
--- a/Firmware/temperature.h
+++ b/Firmware/temperature.h
@@ -122,6 +122,7 @@ inline void babystepsTodoZsubtract(int n)
//inline so that there is no performance decrease.
//deg=degreeCelsius
+// Doesn't save FLASH when FORCE_INLINE removed.
FORCE_INLINE float degHotend(uint8_t extruder) {
return current_temperature[extruder];
};
@@ -140,6 +141,7 @@ FORCE_INLINE float degBed() {
return current_temperature_bed;
};
+// Doesn't save FLASH when FORCE_INLINE removed.
FORCE_INLINE float degTargetHotend(uint8_t extruder) {
return target_temperature[extruder];
};
@@ -148,11 +150,13 @@ FORCE_INLINE float degTargetBed() {
return target_temperature_bed;
};
+// Doesn't save FLASH when FORCE_INLINE removed.
FORCE_INLINE void setTargetHotend(const float &celsius, uint8_t extruder) {
target_temperature[extruder] = celsius;
resetPID(extruder);
};
+// Doesn't save FLASH when not inlined.
static inline void setTargetHotendSafe(const float &celsius, uint8_t extruder)
{
if (extruder>>>>>> upstream/MK3
#endif
}
@@ -6945,7 +6954,6 @@ void lcd_print_stop()
if(!card.sdprinting)
{
SERIAL_ECHOLNPGM("// action:cancel"); // for Octoprint
- return;
}
saved_printing = false;
cancel_heatup = true;
diff --git a/Firmware/ultralcd.h b/Firmware/ultralcd.h
index cb2aad106..2c57c9443 100755
--- a/Firmware/ultralcd.h
+++ b/Firmware/ultralcd.h
@@ -7,9 +7,6 @@
#include "menu.h"
#include "mesh_bed_calibration.h"
-extern int lcd_puts_P(const char* str);
-extern int lcd_printf_P(const char* format, ...);
-
extern void menu_lcd_longpress_func(void);
extern void menu_lcd_charsetup_func(void);
extern void menu_lcd_lcdupdate_func(void);
@@ -143,7 +140,8 @@ void lcd_ignore_click(bool b=true);
void lcd_commands();
-extern bool bSettings; // flag (i.e. 'fake parameter') for 'lcd_checkink_menu()' function
+extern bool bSettings; // flag (i.e. 'fake parameter') for 'lcd_hw_setup_menu()' function
+void lcd_hw_setup_menu(void); // NOT static due to using inside "util" module ("nozzle_diameter_check()")
void change_extr(int extr);
diff --git a/Firmware/util.cpp b/Firmware/util.cpp
index b2105e929..05cbf994c 100644
--- a/Firmware/util.cpp
+++ b/Firmware/util.cpp
@@ -324,7 +324,7 @@ void update_current_firmware_version_to_eeprom()
//-//
-void lcd_checking_menu(void);
+#define MSG_PRINT_CHECKING_FAILED_TIMEOUT 30
ClNozzleDiameter oNozzleDiameter=ClNozzleDiameter::_Diameter_400;
ClCheckMode oCheckMode=ClCheckMode::_None;
@@ -379,7 +379,7 @@ nDiameter_um=eeprom_read_word((uint16_t*)EEPROM_NOZZLE_DIAMETER_uM);
if(nDiameter==nDiameter_um)
return;
//SERIAL_ECHO_START;
-//SERIAL_ECHOLNPGM("Nozzle diameter doesn't match ...");
+//SERIAL_ECHOLNPGM("Printer nozzle diameter differs from the G-code ...");
//SERIAL_ECHOPGM("actual : ");
//SERIAL_ECHOLN((float)(nDiameter_um/1000.0));
//SERIAL_ECHOPGM("expected: ");
@@ -387,15 +387,22 @@ if(nDiameter==nDiameter_um)
switch(oCheckMode)
{
case ClCheckMode::_Warn:
- lcd_show_fullscreen_message_and_wait_P(_i("Nozzle diameter doesn't match! Press the knob to continue."));
+// lcd_show_fullscreen_message_and_wait_P(_i("Printer nozzle diameter differs from the G-code. Continue?"));
+lcd_display_message_fullscreen_P(_i("Printer nozzle diameter differs from the G-code. Continue?"));
+lcd_wait_for_click_delay(MSG_PRINT_CHECKING_FAILED_TIMEOUT);
+//???custom_message_type=CUSTOM_MSG_TYPE_STATUS; // display / status-line recovery
+lcd_update_enable(true); // display / status-line recovery
break;
case ClCheckMode::_Strict:
- lcd_show_fullscreen_message_and_wait_P(_i("Nozzle diameter doesn't match! Print is aborted, press the knob."));
+ lcd_show_fullscreen_message_and_wait_P(_i("Printer nozzle diameter differs from the G-code. Please check the value in settings. Print cancelled."));
lcd_print_stop();
break;
+ case ClCheckMode::_None:
+ case ClCheckMode::_Undef:
+ break;
}
-bSettings=false; // flag ('fake parameter') for 'lcd_checking_menu()' function
-menu_submenu(lcd_checking_menu);
+bSettings=false; // flag ('fake parameter') for 'lcd_hw_setup_menu()' function
+menu_submenu(lcd_hw_setup_menu);
}
void printer_model_check(uint16_t nPrinterModel)
@@ -405,7 +412,7 @@ if(oCheckModel==ClCheckModel::_None)
if(nPrinterModel==nPrinterType)
return;
//SERIAL_ECHO_START;
-//SERIAL_ECHOLNPGM("Printer model doesn't match ...");
+//SERIAL_ECHOLNPGM("Printer model differs from the G-code ...");
//SERIAL_ECHOPGM("actual : ");
//SERIAL_ECHOLN(nPrinterType);
//SERIAL_ECHOPGM("expected: ");
@@ -413,12 +420,19 @@ if(nPrinterModel==nPrinterType)
switch(oCheckModel)
{
case ClCheckModel::_Warn:
- lcd_show_fullscreen_message_and_wait_P(_i("Printer model doesn't match! Press the knob to continue."));
+// lcd_show_fullscreen_message_and_wait_P(_i("Printer model differs from the G-code. Continue?"));
+lcd_display_message_fullscreen_P(_i("Printer model differs from the G-code. Continue?"));
+lcd_wait_for_click_delay(MSG_PRINT_CHECKING_FAILED_TIMEOUT);
+//???custom_message_type=CUSTOM_MSG_TYPE_STATUS; // display / status-line recovery
+lcd_update_enable(true); // display / status-line recovery
break;
case ClCheckModel::_Strict:
- lcd_show_fullscreen_message_and_wait_P(_i("Printer model doesn't match! Print is aborted, press the knob."));
+ lcd_show_fullscreen_message_and_wait_P(_i("Printer model differs from the G-code. Please check the value in settings. Print cancelled."));
lcd_print_stop();
break;
+ case ClCheckModel::_None:
+ case ClCheckModel::_Undef:
+ break;
}
}
@@ -448,7 +462,7 @@ if(nCompareValueResult==COMPARE_VALUE_EQUAL)
if((nCompareValueResultCancel"
diff --git a/lang/lang_en_cz.txt b/lang/lang_en_cz.txt
index 027d04097..d4606d566 100755
--- a/lang/lang_en_cz.txt
+++ b/lang/lang_en_cz.txt
@@ -11,12 +11,12 @@
"[0;0] odsazeni bodu"
#MSG_CRASH_DET_ONLY_IN_NORMAL c=20 r=4
-"\x1b[2JCrash detection can\x1b[1;0Hbe turned on only in\x1b[2;0HNormal mode"
-"\x1b[2JCrash detekce muze\x1b[1;0Hbyt zapnuta pouze v\x1b[2;0HNormal modu"
+"Crash detection can\rbe turned on only in\rNormal mode"
+"Crash detekce muze\rbyt zapnuta pouze v\rNormal modu"
#MSG_CRASH_DET_STEALTH_FORCE_OFF c=20 r=4
-"\x1b[2JWARNING:\x1b[1;0HCrash detection\x1b[2;0Hdisabled in\x1b[3;0HStealth mode"
-"\x1b[2JPOZOR:\x1b[1;0HCrash detekce\x1b[2;0Hdeaktivovana ve\x1b[3;0HStealth modu"
+"WARNING:\rCrash detection\rdisabled in\rStealth mode"
+"POZOR:\rCrash detekce\rdeaktivovana ve\rStealth modu"
#
">Cancel"
@@ -828,7 +828,7 @@
#
"Press the knob"
-"Stisknete hl. tlacitko"
+"Stisknete tlacitko"
#MSG_PRINT_PAUSED c=20 r=1
"Print paused"
diff --git a/lang/lang_en_de.txt b/lang/lang_en_de.txt
index c4c80d937..3c2c8a14f 100755
--- a/lang/lang_en_de.txt
+++ b/lang/lang_en_de.txt
@@ -11,12 +11,12 @@
"[0;0] Punktversatz"
#MSG_CRASH_DET_ONLY_IN_NORMAL c=20 r=4
-"\x1b[2JCrash detection can\x1b[1;0Hbe turned on only in\x1b[2;0HNormal mode"
-"\x1b[2JCrash Erkennung kann\x1b[1;0Hnur im Modus Normal\x1b[2;0Hgenutzt werden"
+"Crash detection can\rbe turned on only in\rNormal mode"
+"Crash Erkennung kann\rnur im Modus Normal\rgenutzt werden"
#MSG_CRASH_DET_STEALTH_FORCE_OFF c=20 r=4
-"\x1b[2JWARNING:\x1b[1;0HCrash detection\x1b[2;0Hdisabled in\x1b[3;0HStealth mode"
-"\x1b[2JWARNUNG:\x1b[1;0HCrash Erkennung\x1b[2;0Hdeaktiviert im\x1b[3;0HStealth Modus"
+"WARNING:\rCrash detection\rdisabled in\rStealth mode"
+"WARNUNG:\rCrash Erkennung\rdeaktiviert im\rStealth Modus"
#
">Cancel"
diff --git a/lang/lang_en_es.txt b/lang/lang_en_es.txt
index 2f4dc2516..3f4629e97 100755
--- a/lang/lang_en_es.txt
+++ b/lang/lang_en_es.txt
@@ -11,12 +11,12 @@
"[0;0] punto offset"
#MSG_CRASH_DET_ONLY_IN_NORMAL c=20 r=4
-"\x1b[2JCrash detection can\x1b[1;0Hbe turned on only in\x1b[2;0HNormal mode"
-"\x1b[2JDec. choque\x1b[1;0Hpuede ser activada solo en\x1b[2;0HModo normal"
+"Crash detection can\rbe turned on only in\rNormal mode"
+"Dec. choque\rpuede ser activada solo en\rModo normal"
#MSG_CRASH_DET_STEALTH_FORCE_OFF c=20 r=4
-"\x1b[2JWARNING:\x1b[1;0HCrash detection\x1b[2;0Hdisabled in\x1b[3;0HStealth mode"
-"\x1b[2JATENCION:\x1b[1;0HDec. choque\x1b[2;0Hdesactivada en\x1b[3;0HModo silencio"
+"WARNING:\rCrash detection\rdisabled in\rStealth mode"
+"ATENCION:\rDec. choque\rdesactivada en\rModo silencio"
#
">Cancel"
diff --git a/lang/lang_en_fr.txt b/lang/lang_en_fr.txt
index dfb0dd851..2919f11fa 100755
--- a/lang/lang_en_fr.txt
+++ b/lang/lang_en_fr.txt
@@ -11,12 +11,12 @@
"Offset point [0;0]"
#MSG_CRASH_DET_ONLY_IN_NORMAL c=20 r=4
-"\x1b[2JCrash detection can\x1b[1;0Hbe turned on only in\x1b[2;0HNormal mode"
-"\x1b[2JLa detection de crash peut etre\x1b[1;0Hactive seulement\x1b[2;0Hen mode Normal"
+"Crash detection can\rbe turned on only in\rNormal mode"
+"La detection de crash peut etre\ractive seulement\ren mode Normal"
#MSG_CRASH_DET_STEALTH_FORCE_OFF c=20 r=4
-"\x1b[2JWARNING:\x1b[1;0HCrash detection\x1b[2;0Hdisabled in\x1b[3;0HStealth mode"
-"\x1b[2JATTENTION :\x1b[1;0HDetection de crash\x1b[2;0H desactivee en\x1b[3;0Hmode Furtif"
+"WARNING:\rCrash detection\rdisabled in\rStealth mode"
+"ATTENTION :\rDetection de crash\r desactivee en\rmode Furtif"
#
">Cancel"
diff --git a/lang/lang_en_it.txt b/lang/lang_en_it.txt
index 9637777f0..0726fef2c 100755
--- a/lang/lang_en_it.txt
+++ b/lang/lang_en_it.txt
@@ -11,12 +11,12 @@
"[0;0] punto offset"
#MSG_CRASH_DET_ONLY_IN_NORMAL c=20 r=4
-"\x1b[2JCrash detection can\x1b[1;0Hbe turned on only in\x1b[2;0HNormal mode"
-"\x1b[2JRilev. impatto\x1b[1;0Hattivabile solo\x1b[2;0Hin Modalita normale"
+"Crash detection can\rbe turned on only in\rNormal mode"
+"Rilev. impatto\rattivabile solo\rin Modalita normale"
#MSG_CRASH_DET_STEALTH_FORCE_OFF c=20 r=4
-"\x1b[2JWARNING:\x1b[1;0HCrash detection\x1b[2;0Hdisabled in\x1b[3;0HStealth mode"
-"\x1b[2JATTENZIONE:\x1b[1;0HRilev. impatto\x1b[2;0Hdisattivato in\x1b[3;0HModalita silenziosa"
+"WARNING:\rCrash detection\rdisabled in\rStealth mode"
+"ATTENZIONE:\rRilev. impatto\rdisattivato in\rModalita silenziosa"
#
">Cancel"
diff --git a/lang/lang_en_pl.txt b/lang/lang_en_pl.txt
index fe422cc37..6919d0570 100755
--- a/lang/lang_en_pl.txt
+++ b/lang/lang_en_pl.txt
@@ -11,12 +11,12 @@
"[0;0] przesuniecie punktu"
#MSG_CRASH_DET_ONLY_IN_NORMAL c=20 r=4
-"\x1b[2JCrash detection can\x1b[1;0Hbe turned on only in\x1b[2;0HNormal mode"
-"\x1b[2JWykrywanie zderzen moze\x1b[1;0Hbyc wlaczone tylko w\x1b[2;0Htrybie Normalnym"
+"Crash detection can\rbe turned on only in\rNormal mode"
+"Wykrywanie zderzen moze\rbyc wlaczone tylko w\rtrybie Normalnym"
#MSG_CRASH_DET_STEALTH_FORCE_OFF c=20 r=4
-"\x1b[2JWARNING:\x1b[1;0HCrash detection\x1b[2;0Hdisabled in\x1b[3;0HStealth mode"
-"\x1b[2JUWAGA:\x1b[1;0HWykrywanie zderzen\x1b[2;0Hwylaczone w\x1b[3;0Htrybie Stealth"
+"WARNING:\rCrash detection\rdisabled in\rStealth mode"
+"UWAGA:\rWykrywanie zderzen\rwylaczone w\rtrybie Stealth"
#
">Cancel"