diff --git a/.travis.yml b/.travis.yml
index a7c220d067..a2e58f2289 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,12 +1,13 @@
---
language: c
-
+ #
before_install:
# Travis runs a detached head. We need to find the current branch
- git checkout `git branch --contains HEAD | grep -v '*'`
# Also tags for the root(s) of the minor version(s)
- git fetch origin --tags
- mkdir ~/bin
+ #
install:
# Install arduino 1.6.4
- wget http://downloads-02.arduino.cc/arduino-1.6.4-linux64.tar.xz
@@ -26,144 +27,215 @@ install:
- mv LiquidCrystal_I2C/LiquidCrystal_I2C /usr/local/share/arduino/libraries/LiquidCrystal_I2C
- git clone https://github.com/lincomatic/LiquidTWI2.git
- mv LiquidTWI2 /usr/local/share/arduino/libraries/LiquidTWI2
+ #
before_script:
# arduino requires an X server even with command line
# https://github.com/arduino/Arduino/issues/1981
- Xvfb :1 -screen 0 1024x768x16 &> xvfb.log &
# change back to home directory for compiling
- cd $TRAVIS_BUILD_DIR
+ #
script:
- # build default config
- - build_marlin
+ #
# Backup Configuration.h, Configuration_adv.h, and pins_RAMPS_14.h
+ #
- cp Marlin/Configuration.h Marlin/Configuration.h.backup
- cp Marlin/Configuration_adv.h Marlin/Configuration_adv.h.backup
- cp Marlin/pins_RAMPS_14.h Marlin/pins_RAMPS_14.h.backup
- # add sensor for bed
+ #
+ # Build with the default configurations
+ #
+ - build_marlin
+ #
+ # Test heated bed temperature sensor
+ #
- opt_set TEMP_SENSOR_BED 1
- build_marlin
- # change extruder numbers from 1 to 2
+ #
+ # Test 2 extruders on basic RAMPS 1.4
+ #
- opt_set MOTHERBOARD BOARD_RAMPS_14_EEB
- opt_set EXTRUDERS 2
- opt_set TEMP_SENSOR_1 1
- #- cat Marlin/Configuration.h
- build_marlin
- # change extruder numbers from 2 to 3, needs to be a board with 3 extruders defined in pins.h
+ #
+ # Test 3 extruders on RUMBA (can use any board with >=3 extruders defined)
+ #
- opt_set MOTHERBOARD BOARD_RUMBA
- opt_set EXTRUDERS 3
- opt_set TEMP_SENSOR_2 1
- build_marlin
- # enable PIDTEMPBED
+ #
+ # Test PIDTEMPBED
+ #
- restore_configs
- opt_enable PIDTEMPBED
- build_marlin
- # enable AUTO_BED_LEVELING
+ #
+ # Test AUTO_BED_LEVELING & DEBUG_LEVELING_FEATURE
+ #
- restore_configs
- - opt_enable ENABLE_AUTO_BED_LEVELING
+ - opt_enable ENABLE_AUTO_BED_LEVELING DEBUG_LEVELING_FEATURE
- build_marlin
- # enable AUTO_BED_LEVELING with servos
- - restore_configs
- - opt_enable ENABLE_AUTO_BED_LEVELING NUM_SERVOS Z_ENDSTOP_SERVO_NR SERVO_ENDSTOP_ANGLES DEACTIVATE_SERVOS_AFTER_MOVE
+ #
+ # Test AUTO_BED_LEVELING & DEBUG_LEVELING_FEATURE with Servos
+ #
+ - opt_enable NUM_SERVOS Z_ENDSTOP_SERVO_NR SERVO_ENDSTOP_ANGLES DEACTIVATE_SERVOS_AFTER_MOVE
- build_marlin
- # enable EEPROM_SETTINGS & EEPROM_CHITCHAT
+ #
+ # Test EEPROM_SETTINGS & EEPROM_CHITCHAT
+ #
- restore_configs
- opt_enable EEPROM_SETTINGS EEPROM_CHITCHAT
- build_marlin
+ #
### LCDS ###
+ #
+ #
# ULTIMAKERCONTROLLER
+ #
- restore_configs
- opt_enable ULTIMAKERCONTROLLER
- build_marlin
+ #
# MAKRPANEL
- # Needs to use melzi and sanguino hardware
+ # Needs to use Melzi and Sanguino hardware
+ #
#- restore_configs
#- opt_enable MAKRPANEL
#- build_marlin
+ #
# REPRAP_DISCOUNT_SMART_CONTROLLER
+ #
- restore_configs
- opt_enable REPRAP_DISCOUNT_SMART_CONTROLLER SDSUPPORT
- build_marlin
+ #
# G3D_PANEL
+ #
- restore_configs
- opt_enable G3D_PANEL SDSUPPORT
- build_marlin
+ #
# REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER
+ #
- restore_configs
- - opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER
+ - opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER SDSUPPORT
- build_marlin
+ #
# REPRAPWORLD_KEYPAD
+ #
# Cant find configuration details to get it to compile
#- restore_configs
#- opt_enable ULTRA_LCD REPRAPWORLD_KEYPAD REPRAPWORLD_KEYPAD_MOVE_STEP
#- build_marlin
+ #
# RA_CONTROL_PANEL
+ #
- restore_configs
- opt_enable RA_CONTROL_PANEL
- build_marlin
+ #
### I2C PANELS ###
+ #
# LCD_I2C_SAINSMART_YWROBOT
# Failing at the moment needs different library
#- restore_configs
#- opt_enable LCD_I2C_SAINSMART_YWROBOT
#- build_marlin
+ #
# LCD_I2C_PANELOLU2
+ #
- restore_configs
- opt_enable LCD_I2C_PANELOLU2
- build_marlin
+ #
# LCD_I2C_VIKI
+ #
- restore_configs
- opt_enable LCD_I2C_VIKI
- build_marlin
+ #
# LCM1602
+ #
- restore_configs
- opt_enable LCM1602
- build_marlin
+ #
# Enable FILAMENTCHANGEENABLE
+ #
- restore_configs
- - opt_enable FILAMENTCHANGEENABLE
+ - opt_enable FILAMENTCHANGEENABLE ULTIMAKERCONTROLLER
- build_marlin
+ #
# Enable filament sensor
+ #
- restore_configs
- opt_enable FILAMENT_WIDTH_SENSOR
- build_marlin
+ #
# Enable filament sensor with LCD display
- - restore_configs
- - opt_enable ULTIMAKERCONTROLLER FILAMENT_WIDTH_SENSOR FILAMENT_LCD_DISPLAY
+ #
+ - opt_enable ULTIMAKERCONTROLLER FILAMENT_LCD_DISPLAY
- build_marlin
+ #
# Enable COREXY
+ #
- restore_configs
- opt_enable COREXY
- build_marlin
+ #
# Enable COREXZ
+ #
- restore_configs
- opt_enable COREXZ
- build_marlin
+ #
# Enable Z_DUAL_STEPPER_DRIVERS, Z_DUAL_ENDSTOPS
+ #
- restore_configs
- opt_enable_adv Z_DUAL_STEPPER_DRIVERS Z_DUAL_ENDSTOPS
- pins_set RAMPS_14 X_MAX_PIN -1
- opt_set_adv Z2_MAX_PIN 2
- build_marlin
- - restore_configs
+ #
+ #
######## Example Configurations ##############
+ #
# Delta Config (generic)
+ - restore_configs
- use_example_configs delta/generic
- build_marlin
+ #
# Delta Config (generic) + ABL + ALLEN_KEY
+ #
- use_example_configs delta/generic
- opt_disable DISABLE_MIN_ENDSTOPS
- opt_enable AUTO_BED_LEVELING_FEATURE Z_PROBE_ALLEN_KEY
- build_marlin
+ #
# Delta Config (Mini Kossel)
+ #
- use_example_configs delta/kossel_mini
- build_marlin
+ #
# Makibox Config need to check board type for Teensy++ 2.0
+ #
#- use_example_configs makibox
#- build_marlin
+ #
# SCARA Config
+ #
- use_example_configs SCARA
- build_marlin
+ #
# tvrrug Config need to check board type for sanguino atmega644p
+ #
#- use_example_configs tvrrug/Round2
#- build_marlin
+ #
+ #
######## Board Types #############
+ #
+ # To be added in nightly test branch
+ #
diff --git a/Marlin/Conditionals.h b/Marlin/Conditionals.h
index 91760045d7..b9809793b7 100644
--- a/Marlin/Conditionals.h
+++ b/Marlin/Conditionals.h
@@ -275,20 +275,28 @@
#include "Arduino.h"
/**
- * ENDSTOPPULLUPS
+ * Set ENDSTOPPULLUPS for unused endstop switches
*/
#if ENABLED(ENDSTOPPULLUPS)
- #if DISABLED(DISABLE_MAX_ENDSTOPS)
+ #if ENABLED(USE_XMAX_PLUG)
#define ENDSTOPPULLUP_XMAX
+ #endif
+ #if ENABLED(USE_YMAX_PLUG)
#define ENDSTOPPULLUP_YMAX
+ #endif
+ #if ENABLED(USE_ZMAX_PLUG)
#define ENDSTOPPULLUP_ZMAX
#endif
- #if DISABLED(DISABLE_MIN_ENDSTOPS)
+ #if ENABLED(USE_XMIN_PLUG)
#define ENDSTOPPULLUP_XMIN
+ #endif
+ #if ENABLED(USE_YMIN_PLUG)
#define ENDSTOPPULLUP_YMIN
+ #endif
+ #if ENABLED(USE_ZMIN_PLUG)
#define ENDSTOPPULLUP_ZMIN
#endif
- #if DISABLED(DISABLE_Z_MIN_PROBE_ENDSTOP)
+ #if ENABLED(DISABLE_Z_MIN_PROBE_ENDSTOP)
#define ENDSTOPPULLUP_ZMIN_PROBE
#endif
#endif
@@ -440,7 +448,9 @@
#define HEATER_0_USES_THERMISTOR
#endif
- #if TEMP_SENSOR_1 == -1
+ #if TEMP_SENSOR_1 <= -2
+ #error MAX6675 / MAX31855 Thermocouples not supported for TEMP_SENSOR_1
+ #elif TEMP_SENSOR_1 == -1
#define HEATER_1_USES_AD595
#elif TEMP_SENSOR_1 == 0
#undef HEATER_1_MINTEMP
@@ -450,7 +460,9 @@
#define HEATER_1_USES_THERMISTOR
#endif
- #if TEMP_SENSOR_2 == -1
+ #if TEMP_SENSOR_2 <= -2
+ #error MAX6675 / MAX31855 Thermocouples not supported for TEMP_SENSOR_2
+ #elif TEMP_SENSOR_2 == -1
#define HEATER_2_USES_AD595
#elif TEMP_SENSOR_2 == 0
#undef HEATER_2_MINTEMP
@@ -460,7 +472,9 @@
#define HEATER_2_USES_THERMISTOR
#endif
- #if TEMP_SENSOR_3 == -1
+ #if TEMP_SENSOR_3 <= -2
+ #error MAX6675 / MAX31855 Thermocouples not supported for TEMP_SENSOR_3
+ #elif TEMP_SENSOR_3 == -1
#define HEATER_3_USES_AD595
#elif TEMP_SENSOR_3 == 0
#undef HEATER_3_MINTEMP
@@ -470,7 +484,9 @@
#define HEATER_3_USES_THERMISTOR
#endif
- #if TEMP_SENSOR_BED == -1
+ #if TEMP_SENSOR_BED <= -2
+ #error MAX6675 / MAX31855 Thermocouples not supported for TEMP_SENSOR_BED
+ #elif TEMP_SENSOR_BED == -1
#define BED_USES_AD595
#elif TEMP_SENSOR_BED == 0
#undef BED_MINTEMP
@@ -495,14 +511,55 @@
#define ARRAY_BY_EXTRUDERS1(v1) ARRAY_BY_EXTRUDERS(v1, v1, v1, v1)
+ /**
+ * Z_DUAL_ENDSTOPS endstop reassignment
+ */
+ #if ENABLED(Z_DUAL_ENDSTOPS)
+ #define _XMIN_ 100
+ #define _YMIN_ 200
+ #define _ZMIN_ 300
+ #define _XMAX_ 101
+ #define _YMAX_ 201
+ #define _ZMAX_ 301
+ const bool Z2_MAX_ENDSTOP_INVERTING =
+ #if Z2_USE_ENDSTOP == _XMAX_
+ X_MAX_ENDSTOP_INVERTING
+ #define Z2_MAX_PIN X_MAX_PIN
+ #undef USE_XMAX_PLUG
+ #elif Z2_USE_ENDSTOP == _YMAX_
+ Y_MAX_ENDSTOP_INVERTING
+ #define Z2_MAX_PIN Y_MAX_PIN
+ #undef USE_YMAX_PLUG
+ #elif Z2_USE_ENDSTOP == _ZMAX_
+ Z_MAX_ENDSTOP_INVERTING
+ #define Z2_MAX_PIN Z_MAX_PIN
+ #undef USE_ZMAX_PLUG
+ #elif Z2_USE_ENDSTOP == _XMIN_
+ X_MIN_ENDSTOP_INVERTING
+ #define Z2_MAX_PIN X_MIN_PIN
+ #undef USE_XMIN_PLUG
+ #elif Z2_USE_ENDSTOP == _YMIN_
+ Y_MIN_ENDSTOP_INVERTING
+ #define Z2_MAX_PIN Y_MIN_PIN
+ #undef USE_YMIN_PLUG
+ #elif Z2_USE_ENDSTOP == _ZMIN_
+ Z_MIN_ENDSTOP_INVERTING
+ #define Z2_MAX_PIN Z_MIN_PIN
+ #undef USE_ZMIN_PLUG
+ #else
+ 0
+ #endif
+ ;
+ #endif
+
/**
* Shorthand for pin tests, used wherever needed
*/
- #define HAS_TEMP_0 (PIN_EXISTS(TEMP_0) && TEMP_SENSOR_0 != 0 && TEMP_SENSOR_0 != -2)
- #define HAS_TEMP_1 (PIN_EXISTS(TEMP_1) && TEMP_SENSOR_1 != 0)
- #define HAS_TEMP_2 (PIN_EXISTS(TEMP_2) && TEMP_SENSOR_2 != 0)
- #define HAS_TEMP_3 (PIN_EXISTS(TEMP_3) && TEMP_SENSOR_3 != 0)
- #define HAS_TEMP_BED (PIN_EXISTS(TEMP_BED) && TEMP_SENSOR_BED != 0)
+ #define HAS_TEMP_0 (PIN_EXISTS(TEMP_0) && TEMP_SENSOR_0 != 0 && TEMP_SENSOR_0 > -2)
+ #define HAS_TEMP_1 (PIN_EXISTS(TEMP_1) && TEMP_SENSOR_1 != 0 && TEMP_SENSOR_1 > -2)
+ #define HAS_TEMP_2 (PIN_EXISTS(TEMP_2) && TEMP_SENSOR_2 != 0 && TEMP_SENSOR_2 > -2)
+ #define HAS_TEMP_3 (PIN_EXISTS(TEMP_3) && TEMP_SENSOR_3 != 0 && TEMP_SENSOR_3 > -2)
+ #define HAS_TEMP_BED (PIN_EXISTS(TEMP_BED) && TEMP_SENSOR_BED != 0 && TEMP_SENSOR_BED > -2)
#define HAS_HEATER_0 (PIN_EXISTS(HEATER_0))
#define HAS_HEATER_1 (PIN_EXISTS(HEATER_1))
#define HAS_HEATER_2 (PIN_EXISTS(HEATER_2))
@@ -581,6 +638,8 @@
#define HAS_MOTOR_CURRENT_PWM (PIN_EXISTS(MOTOR_CURRENT_PWM_XY) || PIN_EXISTS(MOTOR_CURRENT_PWM_Z) || PIN_EXISTS(MOTOR_CURRENT_PWM_E))
+ #define HAS_TEMP_HOTEND (HAS_TEMP_0 || ENABLED(HEATER_0_USES_MAX6675))
+
/**
* Helper Macros for heaters and extruder fan
*/
diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h
index 8debc70bd7..d0a49aade3 100644
--- a/Marlin/Configuration.h
+++ b/Marlin/Configuration.h
@@ -346,8 +346,22 @@
// Enable this option for Toshiba steppers
//#define CONFIG_STEPPERS_TOSHIBA
+//===========================================================================
+//============================== Endstop Settings ===========================
+//===========================================================================
+
// @section homing
+// Specify here all the endstop connectors that are connected to any endstop or probe.
+// Almost all printers will be using one per axis. Probes will use one or more of the
+// extra connectors. Leave undefined any used for non-endstop and non-probe purposes.
+#define USE_XMIN_PLUG
+#define USE_YMIN_PLUG
+#define USE_ZMIN_PLUG
+//#define USE_XMAX_PLUG
+//#define USE_YMAX_PLUG
+//#define USE_ZMAX_PLUG
+
// coarse Endstop Settings
#define ENDSTOPPULLUPS // Comment this out (using // at the start of the line) to disable the endstop pullup resistors
@@ -370,8 +384,6 @@ const bool X_MAX_ENDSTOP_INVERTING = false; // set to true to invert the logic o
const bool Y_MAX_ENDSTOP_INVERTING = false; // set to true to invert the logic of the endstop.
const bool Z_MAX_ENDSTOP_INVERTING = false; // set to true to invert the logic of the endstop.
const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the logic of the endstop.
-//#define DISABLE_MAX_ENDSTOPS
-//#define DISABLE_MIN_ENDSTOPS
//===========================================================================
//============================= Z Probe Options =============================
@@ -709,9 +721,12 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l
// Host Keepalive
//
// By default Marlin will send a busy status message to the host
-// every 10 seconds when it can't accept commands.
+// every couple of seconds when it can't accept commands.
//
//#define DISABLE_HOST_KEEPALIVE // Enable this option if your host doesn't like keepalive messages.
+#if DISABLED(DISABLE_HOST_KEEPALIVE)
+ #define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113.
+#endif
//
// M100 Free Memory Watcher
diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h
index 84f001fb81..3b26237386 100644
--- a/Marlin/Configuration_adv.h
+++ b/Marlin/Configuration_adv.h
@@ -201,9 +201,7 @@
//#define Z_DUAL_ENDSTOPS
#if ENABLED(Z_DUAL_ENDSTOPS)
- #define Z2_MAX_PIN 36 //Endstop used for Z2 axis. In this case I'm using XMAX in a Rumba Board (pin 36)
- const bool Z2_MAX_ENDSTOP_INVERTING = false;
- #define DISABLE_XMAX_ENDSTOP //Better to disable the XMAX to avoid conflict. Just rename "XMAX_ENDSTOP" by the endstop you are using for Z2 axis.
+ #define Z2_USE_ENDSTOP _XMAX_
#endif
#endif // Z_DUAL_STEPPER_DRIVERS
@@ -655,6 +653,38 @@ const unsigned int dropsegments = 5; //everything with less than this number of
#endif
+/**
+ * TWI/I2C BUS
+ *
+ * This feature is an EXPERIMENTAL feature so it shall not be used on production
+ * machines. Enabling this will allow you to send and receive I2C data from slave
+ * devices on the bus.
+ *
+ * ; Example #1
+ * ; This macro send the string "Marlin" to the slave device with address 0x63
+ * ; It uses multiple M155 commands with one B arg
+ * M155 A63 ; Target slave address
+ * M155 B77 ; M
+ * M155 B97 ; a
+ * M155 B114 ; r
+ * M155 B108 ; l
+ * M155 B105 ; i
+ * M155 B110 ; n
+ * M155 S1 ; Send the current buffer
+ *
+ * ; Example #2
+ * ; Request 6 bytes from slave device with address 0x63
+ * M156 A63 B5
+ *
+ * ; Example #3
+ * ; Example serial output of a M156 request
+ * echo:i2c-reply: from:63 bytes:5 data:hello
+ */
+
+// @section i2cbus
+
+//#define EXPERIMENTAL_I2CBUS
+
#include "Conditionals.h"
#include "SanityCheck.h"
diff --git a/Marlin/M100_Free_Mem_Chk.cpp b/Marlin/M100_Free_Mem_Chk.cpp
index f7900a0f35..276df98eb1 100644
--- a/Marlin/M100_Free_Mem_Chk.cpp
+++ b/Marlin/M100_Free_Mem_Chk.cpp
@@ -137,8 +137,10 @@ void gcode_M100() {
// other vital statistics that define the memory pool.
//
if (code_seen('F')) {
- int max_addr = (int) __brkval;
- int max_cnt = 0;
+ #if 0
+ int max_addr = (int) __brkval;
+ int max_cnt = 0;
+ #endif
int block_cnt = 0;
ptr = (unsigned char*) __brkval;
sp = top_of_stack();
@@ -155,10 +157,12 @@ void gcode_M100() {
i += j;
block_cnt++;
}
- if (j > max_cnt) { // We don't do anything with this information yet
- max_cnt = j; // but we do know where the biggest free memory block is.
- max_addr = (int) ptr + i;
- }
+ #if 0
+ if (j > max_cnt) { // We don't do anything with this information yet
+ max_cnt = j; // but we do know where the biggest free memory block is.
+ max_addr = (int) ptr + i;
+ }
+ #endif
}
}
if (block_cnt > 1)
@@ -176,10 +180,10 @@ void gcode_M100() {
x = code_value();
SERIAL_ECHOLNPGM("Corrupting free memory block.\n");
ptr = (unsigned char*) __brkval;
- SERIAL_ECHOPAIR("\n__brkval : ", (long) ptr);
+ SERIAL_ECHOPAIR("\n__brkval : ", ptr);
ptr += 8;
sp = top_of_stack();
- SERIAL_ECHOPAIR("\nStack Pointer : ", (long) sp);
+ SERIAL_ECHOPAIR("\nStack Pointer : ", sp);
SERIAL_ECHOLNPGM("\n");
n = sp - ptr - 64; // -64 just to keep us from finding interrupt activity that
// has altered the stack.
@@ -200,10 +204,10 @@ void gcode_M100() {
if (m100_not_initialized || code_seen('I')) { // If no sub-command is specified, the first time
SERIAL_ECHOLNPGM("Initializing free memory block.\n"); // this happens, it will Initialize.
ptr = (unsigned char*) __brkval; // Repeated M100 with no sub-command will not destroy the
- SERIAL_ECHOPAIR("\n__brkval : ", (long) ptr); // state of the initialized free memory pool.
+ SERIAL_ECHOPAIR("\n__brkval : ", ptr); // state of the initialized free memory pool.
ptr += 8;
sp = top_of_stack();
- SERIAL_ECHOPAIR("\nStack Pointer : ", (long) sp);
+ SERIAL_ECHOPAIR("\nStack Pointer : ", sp);
SERIAL_ECHOLNPGM("\n");
n = sp - ptr - 64; // -64 just to keep us from finding interrupt activity that
// has altered the stack.
@@ -213,7 +217,7 @@ void gcode_M100() {
*(ptr + i) = (unsigned char) 0xe5;
for (i = 0; i < n; i++) {
if (*(ptr + i) != (unsigned char) 0xe5) {
- SERIAL_ECHOPAIR("? address : ", (unsigned long) ptr + i);
+ SERIAL_ECHOPAIR("? address : ", ptr + i);
SERIAL_ECHOPAIR("=", *(ptr + i));
SERIAL_ECHOLNPGM("\n");
}
diff --git a/Marlin/Marlin.h b/Marlin/Marlin.h
index c425a3b049..aa3d54de77 100644
--- a/Marlin/Marlin.h
+++ b/Marlin/Marlin.h
@@ -65,6 +65,8 @@ typedef unsigned long millis_t;
#include "WString.h"
+#include "stopwatch.h"
+
#ifdef USBCON
#if ENABLED(BLUETOOTH)
#define MYSERIAL bluetoothSerial
@@ -101,13 +103,15 @@ extern const char echomagic[] PROGMEM;
#define SERIAL_ECHOLN(x) SERIAL_PROTOCOLLN(x)
#define SERIAL_ECHOLNPGM(x) SERIAL_PROTOCOLLNPGM(x)
-#define SERIAL_ECHOPAIR(name,value) do{ serial_echopair_P(PSTR(name),(value)); }while(0)
+#define SERIAL_ECHOPAIR(name,value) (serial_echopair_P(PSTR(name),(value)))
void serial_echopair_P(const char* s_P, int v);
void serial_echopair_P(const char* s_P, long v);
void serial_echopair_P(const char* s_P, float v);
void serial_echopair_P(const char* s_P, double v);
void serial_echopair_P(const char* s_P, unsigned long v);
+FORCE_INLINE void serial_echopair_P(const char* s_P, bool v) { serial_echopair_P(s_P, (int)v); }
+FORCE_INLINE void serial_echopair_P(const char* s_P, void *v) { serial_echopair_P(s_P, (unsigned long)v); }
// Things to write to serial from Program memory. Saves 400 to 2k of RAM.
FORCE_INLINE void serialprintPGM(const char* str) {
@@ -323,6 +327,10 @@ extern bool axis_homed[3]; // axis[n].is_homed
extern float zprobe_zoffset;
#endif
+#if ENABLED(HOST_KEEPALIVE_FEATURE)
+ extern uint8_t host_keepalive_interval;
+#endif
+
#if ENABLED(PREVENT_DANGEROUS_EXTRUDE)
extern float extrude_min_temp;
#endif
@@ -341,8 +349,7 @@ extern bool axis_homed[3]; // axis[n].is_homed
extern bool filament_sensor; //indicates that filament sensor readings should control extrusion
extern float filament_width_meas; //holds the filament diameter as accurately measured
extern int8_t measurement_delay[]; //ring buffer to delay measurement
- extern int delay_index1, delay_index2; //ring buffer index. used by planner, temperature, and main code
- extern float delay_dist; //delay distance counter
+ extern int filwidth_delay_index1, filwidth_delay_index2; //ring buffer index. used by planner, temperature, and main code
extern int meas_delay_cm; //delay distance
#endif
@@ -357,8 +364,8 @@ extern bool axis_homed[3]; // axis[n].is_homed
extern float retract_recover_length, retract_recover_length_swap, retract_recover_feedrate;
#endif
-extern millis_t print_job_start_ms;
-extern millis_t print_job_stop_ms;
+// Print job timer
+extern Stopwatch print_job_timer;
// Handling multiple extruders pins
extern uint8_t active_extruder;
@@ -368,15 +375,10 @@ extern uint8_t active_extruder;
extern void digipot_i2c_init();
#endif
-#if HAS_TEMP_0 || HAS_TEMP_BED || ENABLED(HEATER_0_USES_MAX6675)
+#if HAS_TEMP_HOTEND || HAS_TEMP_BED
void print_heaterstates();
#endif
extern void calculate_volumetric_multipliers();
-// Print job timer related functions
-millis_t print_job_timer();
-bool print_job_start(millis_t t = 0);
-bool print_job_stop(bool force = false);
-
#endif //MARLIN_H
diff --git a/Marlin/Marlin_main.cpp b/Marlin/Marlin_main.cpp
index 968555ca4a..3759a07b70 100644
--- a/Marlin/Marlin_main.cpp
+++ b/Marlin/Marlin_main.cpp
@@ -77,6 +77,10 @@
#include "stepper_dac.h"
#endif
+#if ENABLED(EXPERIMENTAL_I2CBUS)
+ #include "twibus.h"
+#endif
+
/**
* Look here for descriptions of G-codes:
* - http://linuxcnc.org/handbook/gcode/g-code.html
@@ -151,6 +155,7 @@
* M110 - Set the current line number
* M111 - Set debug flags with S. See flag bits defined in Marlin.h.
* M112 - Emergency stop
+ * M113 - Get or set the timeout interval for Host Keepalive "busy" messages
* M114 - Output current position to serial port
* M115 - Capabilities string
* M117 - Display a message on the controller screen
@@ -248,6 +253,10 @@
CardReader card;
#endif
+#if ENABLED(EXPERIMENTAL_I2CBUS)
+ TWIBus i2c;
+#endif
+
bool Running = true;
uint8_t marlin_debug_flags = DEBUG_NONE;
@@ -298,8 +307,7 @@ const int sensitive_pins[] = SENSITIVE_PINS; ///< Sensitive pin list for M42
millis_t previous_cmd_ms = 0;
static millis_t max_inactive_time = 0;
static millis_t stepper_inactive_time = (DEFAULT_STEPPER_DEACTIVE_TIME) * 1000L;
-millis_t print_job_start_ms = 0; ///< Print job start time
-millis_t print_job_stop_ms = 0; ///< Print job stop time
+Stopwatch print_job_timer = Stopwatch();
static uint8_t target_extruder;
#if ENABLED(AUTO_BED_LEVELING_FEATURE)
@@ -411,9 +419,8 @@ static uint8_t target_extruder;
bool filament_sensor = false; //M405 turns on filament_sensor control, M406 turns it off
float filament_width_meas = DEFAULT_MEASURED_FILAMENT_DIA; //Stores the measured filament diameter
int8_t measurement_delay[MAX_MEASUREMENT_DELAY + 1]; //ring buffer to delay measurement store extruder factor after subtracting 100
- int delay_index1 = 0; //index into ring buffer
- int delay_index2 = -1; //index into ring buffer - set to -1 on startup to indicate ring buffer needs to be initialized
- float delay_dist = 0; //delay distance counter
+ int filwidth_delay_index1 = 0; //index into ring buffer
+ int filwidth_delay_index2 = -1; //index into ring buffer - set to -1 on startup to indicate ring buffer needs to be initialized
int meas_delay_cm = MEASUREMENT_DELAY_CM; //distance delay setting
#endif
@@ -449,7 +456,8 @@ static bool send_ok[BUFSIZE];
};
static MarlinBusyState busy_state = NOT_BUSY;
- static millis_t next_busy_signal_ms = -1;
+ static millis_t prev_busy_signal_ms = -1;
+ uint8_t host_keepalive_interval = DEFAULT_KEEPALIVE_INTERVAL;
#define KEEPALIVE_STATE(n) do{ busy_state = n; }while(0)
#else
#define host_keepalive() ;
@@ -1012,9 +1020,9 @@ inline void get_serial_commands() {
) {
if (card_eof) {
SERIAL_PROTOCOLLNPGM(MSG_FILE_PRINTED);
- print_job_stop(true);
+ print_job_timer.stop();
char time[30];
- millis_t t = print_job_timer();
+ millis_t t = print_job_timer.duration();
int hours = t / 60 / 60, minutes = (t / 60) % 60;
sprintf_P(time, PSTR("%i " MSG_END_HOUR " %i " MSG_END_MINUTE), hours, minutes);
SERIAL_ECHO_START;
@@ -1164,9 +1172,16 @@ XYZ_CONSTS_FROM_CONFIG(signed char, home_dir, HOME_DIR);
void print_xyz(const char* prefix, const float xyz[]) {
print_xyz(prefix, xyz[X_AXIS], xyz[Y_AXIS], xyz[Z_AXIS]);
}
+ #define DEBUG_POS(PREFIX,VAR) do{ SERIAL_ECHOPGM(PREFIX); print_xyz(" > " STRINGIFY(VAR), VAR); }while(0)
#endif
static void set_axis_is_at_home(AxisEnum axis) {
+ #if ENABLED(DEBUG_LEVELING_FEATURE)
+ if (DEBUGGING(LEVELING)) {
+ SERIAL_ECHOPAIR("set_axis_is_at_home(", axis);
+ SERIAL_ECHOLNPGM(") >>>");
+ }
+ #endif
#if ENABLED(DUAL_X_CARRIAGE)
if (axis == X_AXIS) {
@@ -1234,17 +1249,30 @@ static void set_axis_is_at_home(AxisEnum axis) {
max_pos[axis] = base_max_pos(axis) + home_offset[axis];
#if ENABLED(AUTO_BED_LEVELING_FEATURE) && Z_HOME_DIR < 0
- if (axis == Z_AXIS) current_position[Z_AXIS] -= zprobe_zoffset;
+ if (axis == Z_AXIS) {
+ current_position[Z_AXIS] -= zprobe_zoffset;
+ #if ENABLED(DEBUG_LEVELING_FEATURE)
+ if (DEBUGGING(LEVELING)) {
+ SERIAL_ECHOPAIR("> zprobe_zoffset==", zprobe_zoffset);
+ SERIAL_EOL;
+ }
+ #endif
+ }
#endif
#if ENABLED(DEBUG_LEVELING_FEATURE)
if (DEBUGGING(LEVELING)) {
- SERIAL_ECHOPAIR("set_axis_is_at_home ", (unsigned long)axis);
- SERIAL_ECHOPAIR(" > (home_offset[axis]==", home_offset[axis]);
- print_xyz(") > current_position", current_position);
+ SERIAL_ECHOPAIR("> home_offset[axis]==", home_offset[axis]);
+ DEBUG_POS("", current_position);
}
#endif
}
+ #if ENABLED(DEBUG_LEVELING_FEATURE)
+ if (DEBUGGING(LEVELING)) {
+ SERIAL_ECHOPAIR("<<< set_axis_is_at_home(", axis);
+ SERIAL_ECHOLNPGM(")");
+ }
+ #endif
}
/**
@@ -1273,10 +1301,16 @@ inline void line_to_destination() {
line_to_destination(feedrate);
}
inline void sync_plan_position() {
+ #if ENABLED(DEBUG_LEVELING_FEATURE)
+ if (DEBUGGING(LEVELING)) DEBUG_POS("sync_plan_position", current_position);
+ #endif
plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]);
}
#if ENABLED(DELTA) || ENABLED(SCARA)
inline void sync_plan_position_delta() {
+ #if ENABLED(DEBUG_LEVELING_FEATURE)
+ if (DEBUGGING(LEVELING)) DEBUG_POS("sync_plan_position_delta", current_position);
+ #endif
calculate_delta(current_position);
plan_set_position(delta[X_AXIS], delta[Y_AXIS], delta[Z_AXIS], current_position[E_AXIS]);
}
@@ -1290,9 +1324,7 @@ static void setup_for_endstop_move() {
feedrate_multiplier = 100;
refresh_cmd_timeout();
#if ENABLED(DEBUG_LEVELING_FEATURE)
- if (DEBUGGING(LEVELING)) {
- SERIAL_ECHOLNPGM("setup_for_endstop_move > enable_endstops(true)");
- }
+ if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("setup_for_endstop_move > enable_endstops(true)");
#endif
enable_endstops(true);
}
@@ -1305,9 +1337,7 @@ static void setup_for_endstop_move() {
*/
void prepare_move_raw() {
#if ENABLED(DEBUG_LEVELING_FEATURE)
- if (DEBUGGING(LEVELING)) {
- print_xyz("prepare_move_raw > destination", destination);
- }
+ if (DEBUGGING(LEVELING)) DEBUG_POS("prepare_move_raw", destination);
#endif
refresh_cmd_timeout();
calculate_delta(destination);
@@ -1321,13 +1351,17 @@ static void setup_for_endstop_move() {
#if DISABLED(DELTA)
static void set_bed_level_equation_lsq(double* plane_equation_coefficients) {
+ #if ENABLED(DEBUG_LEVELING_FEATURE)
+ if (DEBUGGING(LEVELING)) DEBUG_POS("BEFORE set_bed_level_equation_lsq", current_position);
+ #endif
+
vector_3 planeNormal = vector_3(-plane_equation_coefficients[0], -plane_equation_coefficients[1], 1);
- planeNormal.debug("planeNormal");
+ // planeNormal.debug("planeNormal");
plan_bed_level_matrix = matrix_3x3::create_look_at(planeNormal);
//bedLevel.debug("bedLevel");
//plan_bed_level_matrix.debug("bed level before");
- //vector_3 uncorrected_position = plan_get_position_mm();
+ //vector_3 uncorrected_position = plan_get_position();
//uncorrected_position.debug("position before");
vector_3 corrected_position = plan_get_position();
@@ -1337,9 +1371,7 @@ static void setup_for_endstop_move() {
current_position[Z_AXIS] = corrected_position.z;
#if ENABLED(DEBUG_LEVELING_FEATURE)
- if (DEBUGGING(LEVELING)) {
- print_xyz("set_bed_level_equation_lsq > current_position", current_position);
- }
+ if (DEBUGGING(LEVELING)) DEBUG_POS("AFTER set_bed_level_equation_lsq", current_position);
#endif
sync_plan_position();
@@ -1372,9 +1404,7 @@ static void setup_for_endstop_move() {
current_position[Z_AXIS] = corrected_position.z;
#if ENABLED(DEBUG_LEVELING_FEATURE)
- if (DEBUGGING(LEVELING)) {
- print_xyz("set_bed_level_equation_3pts > current_position", current_position);
- }
+ if (DEBUGGING(LEVELING)) DEBUG_POS("set_bed_level_equation_3pts", current_position);
#endif
sync_plan_position();
@@ -1396,9 +1426,7 @@ static void setup_for_endstop_move() {
long start_steps = st_get_position(Z_AXIS);
#if ENABLED(DEBUG_LEVELING_FEATURE)
- if (DEBUGGING(LEVELING)) {
- SERIAL_ECHOLNPGM("run_z_probe (DELTA) 1");
- }
+ if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("run_z_probe (DELTA) 1");
#endif
// move down slowly until you find the bed
@@ -1417,9 +1445,7 @@ static void setup_for_endstop_move() {
current_position[Z_AXIS] = mm;
#if ENABLED(DEBUG_LEVELING_FEATURE)
- if (DEBUGGING(LEVELING)) {
- print_xyz("run_z_probe (DELTA) 2 > current_position", current_position);
- }
+ if (DEBUGGING(LEVELING)) DEBUG_POS("run_z_probe (DELTA) 2", current_position);
#endif
sync_plan_position_delta();
@@ -1460,9 +1486,7 @@ static void setup_for_endstop_move() {
sync_plan_position();
#if ENABLED(DEBUG_LEVELING_FEATURE)
- if (DEBUGGING(LEVELING)) {
- print_xyz("run_z_probe > current_position", current_position);
- }
+ if (DEBUGGING(LEVELING)) DEBUG_POS("run_z_probe", current_position);
#endif
#endif // !DELTA
@@ -1476,9 +1500,7 @@ static void setup_for_endstop_move() {
float oldFeedRate = feedrate;
#if ENABLED(DEBUG_LEVELING_FEATURE)
- if (DEBUGGING(LEVELING)) {
- print_xyz("do_blocking_move_to", x, y, z);
- }
+ if (DEBUGGING(LEVELING)) print_xyz("do_blocking_move_to", x, y, z);
#endif
#if ENABLED(DELTA)
@@ -1529,9 +1551,7 @@ static void setup_for_endstop_move() {
static void clean_up_after_endstop_move() {
#if ENABLED(DEBUG_LEVELING_FEATURE)
- if (DEBUGGING(LEVELING)) {
- SERIAL_ECHOLNPGM("clean_up_after_endstop_move > ENDSTOPS_ONLY_FOR_HOMING > endstops_not_homing()");
- }
+ if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("clean_up_after_endstop_move > ENDSTOPS_ONLY_FOR_HOMING > endstops_not_homing()");
#endif
endstops_not_homing();
feedrate = saved_feedrate;
@@ -1544,9 +1564,7 @@ static void setup_for_endstop_move() {
static void deploy_z_probe() {
#if ENABLED(DEBUG_LEVELING_FEATURE)
- if (DEBUGGING(LEVELING)) {
- print_xyz("deploy_z_probe > current_position", current_position);
- }
+ if (DEBUGGING(LEVELING)) DEBUG_POS("deploy_z_probe", current_position);
#endif
if (z_probe_is_active) return;
@@ -1638,10 +1656,11 @@ static void setup_for_endstop_move() {
}
static void stow_z_probe(bool doRaise = true) {
+ #if !(HAS_SERVO_ENDSTOPS && (Z_RAISE_AFTER_PROBING > 0))
+ UNUSED(doRaise);
+ #endif
#if ENABLED(DEBUG_LEVELING_FEATURE)
- if (DEBUGGING(LEVELING)) {
- print_xyz("stow_z_probe > current_position", current_position);
- }
+ if (DEBUGGING(LEVELING)) DEBUG_POS("stow_z_probe", current_position);
#endif
if (!z_probe_is_active) return;
@@ -1655,7 +1674,7 @@ static void setup_for_endstop_move() {
if (doRaise) {
#if ENABLED(DEBUG_LEVELING_FEATURE)
if (DEBUGGING(LEVELING)) {
- SERIAL_ECHOPAIR("Raise Z (after) by ", (float)Z_RAISE_AFTER_PROBING);
+ SERIAL_ECHOPAIR("Raise Z (after) by ", Z_RAISE_AFTER_PROBING);
SERIAL_EOL;
SERIAL_ECHO("> SERVO_ENDSTOPS > raise_z_after_probing()");
SERIAL_EOL;
@@ -1751,9 +1770,9 @@ static void setup_for_endstop_move() {
#if ENABLED(DEBUG_LEVELING_FEATURE)
if (DEBUGGING(LEVELING)) {
SERIAL_ECHOLNPGM("probe_pt >>>");
- SERIAL_ECHOPAIR("> ProbeAction:", (unsigned long)probe_action);
+ SERIAL_ECHOPAIR("> ProbeAction:", probe_action);
SERIAL_EOL;
- print_xyz("> current_position", current_position);
+ DEBUG_POS("", current_position);
}
#endif
@@ -1783,9 +1802,7 @@ static void setup_for_endstop_move() {
#if DISABLED(Z_PROBE_SLED) && DISABLED(Z_PROBE_ALLEN_KEY)
if (probe_action & ProbeDeploy) {
#if ENABLED(DEBUG_LEVELING_FEATURE)
- if (DEBUGGING(LEVELING)) {
- SERIAL_ECHOLNPGM("> ProbeDeploy");
- }
+ if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("> ProbeDeploy");
#endif
deploy_z_probe();
}
@@ -1797,9 +1814,7 @@ static void setup_for_endstop_move() {
#if DISABLED(Z_PROBE_SLED) && DISABLED(Z_PROBE_ALLEN_KEY)
if (probe_action & ProbeStow) {
#if ENABLED(DEBUG_LEVELING_FEATURE)
- if (DEBUGGING(LEVELING)) {
- SERIAL_ECHOLNPGM("> ProbeStow (stow_z_probe will do Z Raise)");
- }
+ if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("> ProbeStow (stow_z_probe will do Z Raise)");
#endif
stow_z_probe();
}
@@ -1816,9 +1831,7 @@ static void setup_for_endstop_move() {
}
#if ENABLED(DEBUG_LEVELING_FEATURE)
- if (DEBUGGING(LEVELING)) {
- SERIAL_ECHOLNPGM("<<< probe_pt");
- }
+ if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("<<< probe_pt");
#endif
return measured_z;
@@ -1883,9 +1896,7 @@ static void setup_for_endstop_move() {
*/
void reset_bed_level() {
#if ENABLED(DEBUG_LEVELING_FEATURE)
- if (DEBUGGING(LEVELING)) {
- SERIAL_ECHOLNPGM("reset_bed_level");
- }
+ if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("reset_bed_level");
#endif
for (int y = 0; y < AUTO_BED_LEVELING_GRID_POINTS; y++) {
for (int x = 0; x < AUTO_BED_LEVELING_GRID_POINTS; x++) {
@@ -1912,11 +1923,13 @@ static void setup_for_endstop_move() {
#endif // AUTO_BED_LEVELING_FEATURE
-static void axis_unhomed_error() {
- LCD_MESSAGEPGM(MSG_YX_UNHOMED);
- SERIAL_ECHO_START;
- SERIAL_ECHOLNPGM(MSG_YX_UNHOMED);
-}
+#if ENABLED(Z_PROBE_SLED) || ENABLED(Z_SAFE_HOMING) || ENABLED(AUTO_BED_LEVELING_FEATURE)
+ static void axis_unhomed_error() {
+ LCD_MESSAGEPGM(MSG_YX_UNHOMED);
+ SERIAL_ECHO_START;
+ SERIAL_ECHOLNPGM(MSG_YX_UNHOMED);
+ }
+#endif
#if ENABLED(Z_PROBE_SLED)
@@ -1933,8 +1946,8 @@ static void axis_unhomed_error() {
static void dock_sled(bool dock, int offset = 0) {
#if ENABLED(DEBUG_LEVELING_FEATURE)
if (DEBUGGING(LEVELING)) {
- SERIAL_ECHOPAIR("dock_sled", dock);
- SERIAL_EOL;
+ SERIAL_ECHOPAIR("dock_sled(", dock);
+ SERIAL_ECHOLNPGM(")");
}
#endif
@@ -1978,9 +1991,8 @@ static void axis_unhomed_error() {
static void homeaxis(AxisEnum axis) {
#if ENABLED(DEBUG_LEVELING_FEATURE)
if (DEBUGGING(LEVELING)) {
- SERIAL_ECHOPAIR(">>> homeaxis(", (unsigned long)axis);
- SERIAL_CHAR(')');
- SERIAL_EOL;
+ SERIAL_ECHOPAIR(">>> homeaxis(", axis);
+ SERIAL_ECHOLNPGM(")");
}
#endif
#define HOMEAXIS_DO(LETTER) \
@@ -2045,9 +2057,7 @@ static void homeaxis(AxisEnum axis) {
sync_plan_position();
#if ENABLED(DEBUG_LEVELING_FEATURE)
- if (DEBUGGING(LEVELING)) {
- SERIAL_ECHOLNPGM("> enable_endstops(false)");
- }
+ if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("> enable_endstops(false)");
#endif
enable_endstops(false); // Disable endstops while moving away
@@ -2057,9 +2067,7 @@ static void homeaxis(AxisEnum axis) {
st_synchronize();
#if ENABLED(DEBUG_LEVELING_FEATURE)
- if (DEBUGGING(LEVELING)) {
- SERIAL_ECHOLNPGM("> enable_endstops(true)");
- }
+ if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("> enable_endstops(true)");
#endif
enable_endstops(true); // Enable endstops for next homing move
@@ -2072,9 +2080,7 @@ static void homeaxis(AxisEnum axis) {
st_synchronize();
#if ENABLED(DEBUG_LEVELING_FEATURE)
- if (DEBUGGING(LEVELING)) {
- print_xyz("> TRIGGER ENDSTOP > current_position", current_position);
- }
+ if (DEBUGGING(LEVELING)) DEBUG_POS("> TRIGGER ENDSTOP", current_position);
#endif
#if ENABLED(Z_DUAL_ENDSTOPS)
@@ -2106,9 +2112,7 @@ static void homeaxis(AxisEnum axis) {
// retrace by the amount specified in endstop_adj
if (endstop_adj[axis] * axis_home_dir < 0) {
#if ENABLED(DEBUG_LEVELING_FEATURE)
- if (DEBUGGING(LEVELING)) {
- SERIAL_ECHOLNPGM("> enable_endstops(false)");
- }
+ if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("> enable_endstops(false)");
#endif
enable_endstops(false); // Disable endstops while moving away
sync_plan_position();
@@ -2116,15 +2120,13 @@ static void homeaxis(AxisEnum axis) {
#if ENABLED(DEBUG_LEVELING_FEATURE)
if (DEBUGGING(LEVELING)) {
SERIAL_ECHOPAIR("> endstop_adj = ", endstop_adj[axis]);
- print_xyz(" > destination", destination);
+ DEBUG_POS("", destination);
}
#endif
line_to_destination();
st_synchronize();
#if ENABLED(DEBUG_LEVELING_FEATURE)
- if (DEBUGGING(LEVELING)) {
- SERIAL_ECHOLNPGM("> enable_endstops(true)");
- }
+ if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("> enable_endstops(true)");
#endif
enable_endstops(true); // Enable endstops for next homing move
}
@@ -2143,9 +2145,7 @@ static void homeaxis(AxisEnum axis) {
sync_plan_position();
#if ENABLED(DEBUG_LEVELING_FEATURE)
- if (DEBUGGING(LEVELING)) {
- print_xyz("> AFTER set_axis_is_at_home > current_position", current_position);
- }
+ if (DEBUGGING(LEVELING)) DEBUG_POS("> AFTER set_axis_is_at_home", current_position);
#endif
destination[axis] = current_position[axis];
@@ -2158,9 +2158,7 @@ static void homeaxis(AxisEnum axis) {
#if ENABLED(Z_PROBE_SLED) || SERVO_LEVELING || ENABLED(FIX_MOUNTED_PROBE)
if (axis == Z_AXIS && axis_home_dir < 0) {
#if ENABLED(DEBUG_LEVELING_FEATURE)
- if (DEBUGGING(LEVELING)) {
- SERIAL_ECHOLNPGM("> SERVO_LEVELING > " STRINGIFY(_Z_STOW));
- }
+ if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("> SERVO_LEVELING > " STRINGIFY(_Z_STOW));
#endif
_Z_STOW;
}
@@ -2170,9 +2168,7 @@ static void homeaxis(AxisEnum axis) {
#if HAS_SERVO_ENDSTOPS
if (_Z_SERVO_TEST && servo_endstop_id[axis] >= 0) {
#if ENABLED(DEBUG_LEVELING_FEATURE)
- if (DEBUGGING(LEVELING)) {
- SERIAL_ECHOLNPGM("> SERVO_ENDSTOPS > Stow with servo.move()");
- }
+ if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("> SERVO_ENDSTOPS > Stow with servo.move()");
#endif
servo[servo_endstop_id[axis]].move(servo_endstop_angle[axis][1]);
if (_Z_PROBE_SUBTEST) z_probe_is_active = false;
@@ -2183,9 +2179,8 @@ static void homeaxis(AxisEnum axis) {
#if ENABLED(DEBUG_LEVELING_FEATURE)
if (DEBUGGING(LEVELING)) {
- SERIAL_ECHOPAIR("<<< homeaxis(", (unsigned long)axis);
- SERIAL_CHAR(')');
- SERIAL_EOL;
+ SERIAL_ECHOPAIR("<<< homeaxis(", axis);
+ SERIAL_ECHOLNPGM(")");
}
#endif
}
@@ -2284,8 +2279,8 @@ void unknown_command_error() {
*/
void host_keepalive() {
millis_t ms = millis();
- if (busy_state != NOT_BUSY) {
- if (ms < next_busy_signal_ms) return;
+ if (host_keepalive_interval && busy_state != NOT_BUSY) {
+ if (ms - prev_busy_signal_ms < 1000UL * host_keepalive_interval) return;
switch (busy_state) {
case IN_HANDLER:
case IN_PROCESS:
@@ -2300,9 +2295,11 @@ void unknown_command_error() {
SERIAL_ECHO_START;
SERIAL_ECHOLNPGM(MSG_BUSY_PAUSED_FOR_INPUT);
break;
+ default:
+ break;
}
}
- next_busy_signal_ms = ms + 10000UL; // "busy: ..." message every 10s
+ prev_busy_signal_ms = ms;
}
#endif //HOST_KEEPALIVE_FEATURE
@@ -2421,9 +2418,7 @@ inline void gcode_G4() {
inline void gcode_G28() {
#if ENABLED(DEBUG_LEVELING_FEATURE)
- if (DEBUGGING(LEVELING)) {
- SERIAL_ECHOLNPGM("gcode_G28 >>>");
- }
+ if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("gcode_G28 >>>");
#endif
// Wait for planner moves to finish!
@@ -2484,9 +2479,7 @@ inline void gcode_G28() {
sync_plan_position_delta();
#if ENABLED(DEBUG_LEVELING_FEATURE)
- if (DEBUGGING(LEVELING)) {
- print_xyz("(DELTA) > current_position", current_position);
- }
+ if (DEBUGGING(LEVELING)) DEBUG_POS("(DELTA)", current_position);
#endif
#else // NOT DELTA
@@ -2502,9 +2495,7 @@ inline void gcode_G28() {
if (home_all_axis || homeZ) {
HOMEAXIS(Z);
#if ENABLED(DEBUG_LEVELING_FEATURE)
- if (DEBUGGING(LEVELING)) {
- print_xyz("> HOMEAXIS(Z) > current_position", current_position);
- }
+ if (DEBUGGING(LEVELING)) DEBUG_POS("> HOMEAXIS(Z)", current_position);
#endif
}
@@ -2516,10 +2507,10 @@ inline void gcode_G28() {
feedrate = max_feedrate[Z_AXIS] * 60; // feedrate (mm/m) = max_feedrate (mm/s)
#if ENABLED(DEBUG_LEVELING_FEATURE)
if (DEBUGGING(LEVELING)) {
- SERIAL_ECHOPAIR("Raise Z (before homing) to ", (float)(MIN_Z_HEIGHT_FOR_HOMING));
+ SERIAL_ECHOPAIR("Raise Z (before homing) to ", (MIN_Z_HEIGHT_FOR_HOMING));
SERIAL_EOL;
- print_xyz("> (home_all_axis || homeZ) > current_position", current_position);
- print_xyz("> (home_all_axis || homeZ) > destination", destination);
+ DEBUG_POS("> (home_all_axis || homeZ)", current_position);
+ DEBUG_POS("> (home_all_axis || homeZ)", destination);
}
#endif
line_to_destination();
@@ -2563,9 +2554,7 @@ inline void gcode_G28() {
sync_plan_position();
#if ENABLED(DEBUG_LEVELING_FEATURE)
- if (DEBUGGING(LEVELING)) {
- print_xyz("> QUICK_HOME > current_position 1", current_position);
- }
+ if (DEBUGGING(LEVELING)) DEBUG_POS("> QUICK_HOME 1", current_position);
#endif
destination[X_AXIS] = current_position[X_AXIS];
@@ -2582,9 +2571,7 @@ inline void gcode_G28() {
#endif
#if ENABLED(DEBUG_LEVELING_FEATURE)
- if (DEBUGGING(LEVELING)) {
- print_xyz("> QUICK_HOME > current_position 2", current_position);
- }
+ if (DEBUGGING(LEVELING)) DEBUG_POS("> QUICK_HOME 2", current_position);
#endif
}
@@ -2613,9 +2600,7 @@ inline void gcode_G28() {
HOMEAXIS(X);
#endif
#if ENABLED(DEBUG_LEVELING_FEATURE)
- if (DEBUGGING(LEVELING)) {
- print_xyz("> homeX", current_position);
- }
+ if (DEBUGGING(LEVELING)) DEBUG_POS("> homeX", current_position);
#endif
}
@@ -2624,9 +2609,7 @@ inline void gcode_G28() {
if (home_all_axis || homeY) {
HOMEAXIS(Y);
#if ENABLED(DEBUG_LEVELING_FEATURE)
- if (DEBUGGING(LEVELING)) {
- print_xyz("> homeY", current_position);
- }
+ if (DEBUGGING(LEVELING)) DEBUG_POS("> homeY", current_position);
#endif
}
#endif
@@ -2665,8 +2648,8 @@ inline void gcode_G28() {
#if ENABLED(DEBUG_LEVELING_FEATURE)
if (DEBUGGING(LEVELING)) {
- print_xyz("> Z_SAFE_HOMING > home_all_axis > current_position", current_position);
- print_xyz("> Z_SAFE_HOMING > home_all_axis > destination", destination);
+ DEBUG_POS("> Z_SAFE_HOMING > home_all_axis", current_position);
+ DEBUG_POS("> Z_SAFE_HOMING > home_all_axis", destination);
}
#endif
@@ -2729,9 +2712,7 @@ inline void gcode_G28() {
#endif // !Z_SAFE_HOMING
#if ENABLED(DEBUG_LEVELING_FEATURE)
- if (DEBUGGING(LEVELING)) {
- print_xyz("> (home_all_axis || homeZ) > final", current_position);
- }
+ if (DEBUGGING(LEVELING)) DEBUG_POS("> (home_all_axis || homeZ) > final", current_position);
#endif
} // home_all_axis || homeZ
@@ -2747,12 +2728,12 @@ inline void gcode_G28() {
#endif
#if ENABLED(ENDSTOPS_ONLY_FOR_HOMING)
+ enable_endstops(false);
#if ENABLED(DEBUG_LEVELING_FEATURE)
if (DEBUGGING(LEVELING)) {
SERIAL_ECHOLNPGM("ENDSTOPS_ONLY_FOR_HOMING enable_endstops(false)");
}
#endif
- enable_endstops(false);
#endif
// For mesh leveling move back to Z=0
@@ -2767,9 +2748,7 @@ inline void gcode_G28() {
line_to_destination();
st_synchronize();
#if ENABLED(DEBUG_LEVELING_FEATURE)
- if (DEBUGGING(LEVELING)) {
- print_xyz("mbl_was_active > current_position", current_position);
- }
+ if (DEBUGGING(LEVELING)) DEBUG_POS("mbl_was_active", current_position);
#endif
}
#endif
@@ -2992,6 +2971,7 @@ inline void gcode_G28() {
#if ENABLED(DEBUG_LEVELING_FEATURE)
if (DEBUGGING(LEVELING)) {
SERIAL_ECHOLNPGM("gcode_G29 >>>");
+ DEBUG_POS("", current_position);
}
#endif
@@ -3069,22 +3049,20 @@ inline void gcode_G28() {
#endif // AUTO_BED_LEVELING_GRID
- #if ENABLED(Z_PROBE_SLED)
- dock_sled(false); // engage (un-dock) the Z probe
- #elif ENABLED(Z_PROBE_ALLEN_KEY) || (ENABLED(DELTA) && SERVO_LEVELING)
- deploy_z_probe();
- #endif
-
- st_synchronize();
-
if (!dryrun) {
+
// make sure the bed_level_rotation_matrix is identity or the planner will get it wrong
plan_bed_level_matrix.set_to_identity();
#if ENABLED(DELTA)
reset_bed_level();
#else //!DELTA
- //vector_3 corrected_position = plan_get_position_mm();
+
+ #if ENABLED(DEBUG_LEVELING_FEATURE)
+ if (DEBUGGING(LEVELING)) DEBUG_POS("BEFORE matrix.set_to_identity", current_position);
+ #endif
+
+ //vector_3 corrected_position = plan_get_position();
//corrected_position.debug("position before G29");
vector_3 uncorrected_position = plan_get_position();
//uncorrected_position.debug("position during G29");
@@ -3092,9 +3070,22 @@ inline void gcode_G28() {
current_position[Y_AXIS] = uncorrected_position.y;
current_position[Z_AXIS] = uncorrected_position.z;
sync_plan_position();
+
+ #if ENABLED(DEBUG_LEVELING_FEATURE)
+ if (DEBUGGING(LEVELING)) DEBUG_POS("AFTER matrix.set_to_identity", current_position);
+ #endif
+
#endif // !DELTA
}
+ #if ENABLED(Z_PROBE_SLED)
+ dock_sled(false); // engage (un-dock) the Z probe
+ #elif ENABLED(Z_PROBE_ALLEN_KEY) || (ENABLED(DELTA) && SERVO_LEVELING)
+ deploy_z_probe();
+ #endif
+
+ st_synchronize();
+
setup_for_endstop_move();
feedrate = homing_feedrate[Z_AXIS];
@@ -3158,7 +3149,7 @@ inline void gcode_G28() {
if (probePointCounter) {
#if ENABLED(DEBUG_LEVELING_FEATURE)
if (DEBUGGING(LEVELING)) {
- SERIAL_ECHOPAIR("z_before = (between) ", (float)(Z_RAISE_BETWEEN_PROBINGS + current_position[Z_AXIS]));
+ SERIAL_ECHOPAIR("z_before = (between) ", (Z_RAISE_BETWEEN_PROBINGS + current_position[Z_AXIS]));
SERIAL_EOL;
}
#endif
@@ -3166,7 +3157,7 @@ inline void gcode_G28() {
else {
#if ENABLED(DEBUG_LEVELING_FEATURE)
if (DEBUGGING(LEVELING)) {
- SERIAL_ECHOPAIR("z_before = (before) ", (float)Z_RAISE_BEFORE_PROBING);
+ SERIAL_ECHOPAIR("z_before = (before) ", Z_RAISE_BEFORE_PROBING);
SERIAL_EOL;
}
#endif
@@ -3210,9 +3201,7 @@ inline void gcode_G28() {
} //yProbe
#if ENABLED(DEBUG_LEVELING_FEATURE)
- if (DEBUGGING(LEVELING)) {
- print_xyz("> probing complete > current_position", current_position);
- }
+ if (DEBUGGING(LEVELING)) DEBUG_POS("> probing complete", current_position);
#endif
clean_up_after_endstop_move();
@@ -3409,9 +3398,7 @@ inline void gcode_G28() {
sync_plan_position();
#if ENABLED(DEBUG_LEVELING_FEATURE)
- if (DEBUGGING(LEVELING)) {
- print_xyz("> corrected Z in G29", current_position);
- }
+ if (DEBUGGING(LEVELING)) DEBUG_POS("> corrected Z in G29", current_position);
#endif
}
@@ -3472,9 +3459,9 @@ inline void gcode_G28() {
run_z_probe();
SERIAL_PROTOCOLPGM("Bed X: ");
- SERIAL_PROTOCOL(current_position[X_AXIS] + 0.0001);
+ SERIAL_PROTOCOL(current_position[X_AXIS] + X_PROBE_OFFSET_FROM_EXTRUDER + 0.0001);
SERIAL_PROTOCOLPGM(" Y: ");
- SERIAL_PROTOCOL(current_position[Y_AXIS] + 0.0001);
+ SERIAL_PROTOCOL(current_position[Y_AXIS] + Y_PROBE_OFFSET_FROM_EXTRUDER + 0.0001);
SERIAL_PROTOCOLPGM(" Z: ");
SERIAL_PROTOCOL(current_position[Z_AXIS] + 0.0001);
SERIAL_EOL;
@@ -3528,6 +3515,9 @@ inline void gcode_G92() {
inline void gcode_M0_M1() {
char* args = current_command_args;
+ uint8_t test_value = 12;
+ SERIAL_ECHOPAIR("TEST", test_value);
+
millis_t codenum = 0;
bool hasP = false, hasS = false;
if (code_seen('P')) {
@@ -3617,7 +3607,7 @@ inline void gcode_M17() {
*/
inline void gcode_M24() {
card.startFileprint();
- print_job_start();
+ print_job_timer.start();
}
/**
@@ -3673,7 +3663,7 @@ inline void gcode_M17() {
* M31: Get the time since the start of SD Print (or last M109)
*/
inline void gcode_M31() {
- millis_t t = print_job_timer();
+ millis_t t = print_job_timer.duration();
int min = t / 60, sec = t % 60;
char time[30];
sprintf_P(time, PSTR("%i min, %i sec"), min, sec);
@@ -3709,7 +3699,7 @@ inline void gcode_M31() {
card.startFileprint();
// Procedure calls count as normal print time.
- if (!call_procedure) print_job_start();
+ if (!call_procedure) print_job_timer.start();
}
}
@@ -3820,7 +3810,7 @@ inline void gcode_M42() {
}
double sum = 0.0, mean = 0.0, sigma = 0.0, sample_set[50];
- uint8_t verbose_level = 1, n_samples = 10, n_legs = 0, schizoid_flag = 0;
+ int8_t verbose_level = 1, n_samples = 10, n_legs = 0, schizoid_flag = 0;
if (code_seen('V')) {
verbose_level = code_value_short();
@@ -4076,6 +4066,27 @@ inline void gcode_M42() {
#endif // AUTO_BED_LEVELING_FEATURE && Z_MIN_PROBE_REPEATABILITY_TEST
+/**
+ * M75: Start print timer
+ */
+inline void gcode_M75() {
+ print_job_timer.start();
+}
+
+/**
+ * M76: Pause print timer
+ */
+inline void gcode_M76() {
+ print_job_timer.pause();
+}
+
+/**
+ * M77: Stop print timer
+ */
+inline void gcode_M77() {
+ print_job_timer.stop();
+}
+
/**
* M104: Set hot end temperature
*/
@@ -4083,9 +4094,6 @@ inline void gcode_M104() {
if (setTargetedHotend(104)) return;
if (DEBUGGING(DRYRUN)) return;
- // Start hook must happen before setTargetHotend()
- print_job_start();
-
if (code_seen('S')) {
float temp = code_value();
setTargetHotend(temp, target_extruder);
@@ -4094,16 +4102,30 @@ inline void gcode_M104() {
setTargetHotend1(temp == 0.0 ? 0.0 : temp + duplicate_extruder_temp_offset);
#endif
+ /**
+ * We use half EXTRUDE_MINTEMP here to allow nozzles to be put into hot
+ * stand by mode, for instance in a dual extruder setup, without affecting
+ * the running print timer.
+ */
+ if (temp <= (EXTRUDE_MINTEMP)/2) {
+ print_job_timer.stop();
+ LCD_MESSAGEPGM(WELCOME_MSG);
+ }
+ /**
+ * We do not check if the timer is already running because this check will
+ * be done for us inside the Stopwatch::start() method thus a running timer
+ * will not restart.
+ */
+ else print_job_timer.start();
+
if (temp > degHotend(target_extruder)) LCD_MESSAGEPGM(MSG_HEATING);
}
-
- if (print_job_stop()) LCD_MESSAGEPGM(WELCOME_MSG);
}
-#if HAS_TEMP_0 || HAS_TEMP_BED || ENABLED(HEATER_0_USES_MAX6675)
+#if HAS_TEMP_HOTEND || HAS_TEMP_BED
void print_heaterstates() {
- #if HAS_TEMP_0 || ENABLED(HEATER_0_USES_MAX6675)
+ #if HAS_TEMP_HOTEND
SERIAL_PROTOCOLPGM(" T:");
SERIAL_PROTOCOL_F(degHotend(target_extruder), 1);
SERIAL_PROTOCOLPGM(" /");
@@ -4179,10 +4201,10 @@ inline void gcode_M104() {
inline void gcode_M105() {
if (setTargetedHotend(105)) return;
- #if HAS_TEMP_0 || HAS_TEMP_BED || ENABLED(HEATER_0_USES_MAX6675)
+ #if HAS_TEMP_HOTEND || HAS_TEMP_BED
SERIAL_PROTOCOLPGM(MSG_OK);
print_heaterstates();
- #else // !HAS_TEMP_0 && !HAS_TEMP_BED
+ #else // !HAS_TEMP_HOTEND && !HAS_TEMP_BED
SERIAL_ERROR_START;
SERIAL_ERRORLNPGM(MSG_ERR_NO_THERMISTORS);
#endif
@@ -4225,9 +4247,6 @@ inline void gcode_M109() {
if (setTargetedHotend(109)) return;
if (DEBUGGING(DRYRUN)) return;
- // Start hook must happen before setTargetHotend()
- print_job_start();
-
no_wait_for_cooling = code_seen('S');
if (no_wait_for_cooling || code_seen('R')) {
float temp = code_value();
@@ -4237,11 +4256,25 @@ inline void gcode_M109() {
setTargetHotend1(temp == 0.0 ? 0.0 : temp + duplicate_extruder_temp_offset);
#endif
+ /**
+ * We use half EXTRUDE_MINTEMP here to allow nozzles to be put into hot
+ * stand by mode, for instance in a dual extruder setup, without affecting
+ * the running print timer.
+ */
+ if (temp <= (EXTRUDE_MINTEMP)/2) {
+ print_job_timer.stop();
+ LCD_MESSAGEPGM(WELCOME_MSG);
+ }
+ /**
+ * We do not check if the timer is already running because this check will
+ * be done for us inside the Stopwatch::start() method thus a running timer
+ * will not restart.
+ */
+ else print_job_timer.start();
+
if (temp > degHotend(target_extruder)) LCD_MESSAGEPGM(MSG_HEATING);
}
- if (print_job_stop()) LCD_MESSAGEPGM(WELCOME_MSG);
-
#if ENABLED(AUTOTEMP)
autotemp_enabled = code_seen('F');
if (autotemp_enabled) autotemp_factor = code_value();
@@ -4254,12 +4287,12 @@ inline void gcode_M109() {
// Prevents a wait-forever situation if R is misused i.e. M109 R0
// Try to calculate a ballpark safe margin by halving EXTRUDE_MINTEMP
- if (degTargetHotend(target_extruder) < (EXTRUDE_MINTEMP/2)) return;
+ if (degTargetHotend(target_extruder) < (EXTRUDE_MINTEMP)/2) return;
#ifdef TEMP_RESIDENCY_TIME
long residency_start_ms = -1;
// Loop until the temperature has stabilized
- #define TEMP_CONDITIONS (residency_start_ms < 0 || now < residency_start_ms + (TEMP_RESIDENCY_TIME) * 1000UL)
+ #define TEMP_CONDITIONS (residency_start_ms == -1 || now < residency_start_ms + (TEMP_RESIDENCY_TIME) * 1000UL)
#else
// Loop until the temperature is very close target
#define TEMP_CONDITIONS (isHeatingHotend(target_extruder))
@@ -4271,12 +4304,12 @@ inline void gcode_M109() {
now = millis();
if (now > next_temp_ms) { //Print temp & remaining time every 1s while waiting
next_temp_ms = now + 1000UL;
- #if HAS_TEMP_0 || HAS_TEMP_BED || ENABLED(HEATER_0_USES_MAX6675)
+ #if HAS_TEMP_HOTEND || HAS_TEMP_BED
print_heaterstates();
#endif
#ifdef TEMP_RESIDENCY_TIME
SERIAL_PROTOCOLPGM(" W:");
- if (residency_start_ms >= 0) {
+ if (residency_start_ms != -1) {
long rem = (((TEMP_RESIDENCY_TIME) * 1000UL) - (now - residency_start_ms)) / 1000UL;
SERIAL_PROTOCOLLN(rem);
}
@@ -4292,10 +4325,18 @@ inline void gcode_M109() {
refresh_cmd_timeout(); // to prevent stepper_inactive_time from running out
#ifdef TEMP_RESIDENCY_TIME
- // Start the TEMP_RESIDENCY_TIME timer when we reach target temp for the first time.
- // Restart the timer whenever the temperature falls outside the hysteresis.
- if (labs(degHotend(target_extruder) - degTargetHotend(target_extruder)) > ((residency_start_ms < 0) ? TEMP_WINDOW : TEMP_HYSTERESIS))
+
+ float temp_diff = labs(degHotend(target_extruder) - degTargetHotend(target_extruder));
+
+ if (residency_start_ms == -1) {
+ // Start the TEMP_RESIDENCY_TIME timer when we reach target temp for the first time.
+ if (temp_diff < TEMP_WINDOW) residency_start_ms = millis();
+ }
+ else if (temp_diff > TEMP_HYSTERESIS) {
+ // Restart the timer whenever the temperature falls outside the hysteresis.
residency_start_ms = millis();
+ }
+
#endif //TEMP_RESIDENCY_TIME
} // while(!cancel_heatup && TEMP_CONDITIONS)
@@ -4350,16 +4391,16 @@ inline void gcode_M110() {
inline void gcode_M111() {
marlin_debug_flags = code_seen('S') ? code_value_short() : DEBUG_NONE;
- const char str_debug_1[] PROGMEM = MSG_DEBUG_ECHO;
- const char str_debug_2[] PROGMEM = MSG_DEBUG_INFO;
- const char str_debug_4[] PROGMEM = MSG_DEBUG_ERRORS;
- const char str_debug_8[] PROGMEM = MSG_DEBUG_DRYRUN;
- const char str_debug_16[] PROGMEM = MSG_DEBUG_COMMUNICATION;
+ const static char str_debug_1[] PROGMEM = MSG_DEBUG_ECHO;
+ const static char str_debug_2[] PROGMEM = MSG_DEBUG_INFO;
+ const static char str_debug_4[] PROGMEM = MSG_DEBUG_ERRORS;
+ const static char str_debug_8[] PROGMEM = MSG_DEBUG_DRYRUN;
+ const static char str_debug_16[] PROGMEM = MSG_DEBUG_COMMUNICATION;
#if ENABLED(DEBUG_LEVELING_FEATURE)
- const char str_debug_32[] PROGMEM = MSG_DEBUG_LEVELING;
+ const static char str_debug_32[] PROGMEM = MSG_DEBUG_LEVELING;
#endif
- const char* const debug_strings[] PROGMEM = {
+ const static char* const debug_strings[] PROGMEM = {
str_debug_1, str_debug_2, str_debug_4, str_debug_8, str_debug_16,
#if ENABLED(DEBUG_LEVELING_FEATURE)
str_debug_32
@@ -4372,8 +4413,8 @@ inline void gcode_M111() {
uint8_t comma = 0;
for (uint8_t i = 0; i < COUNT(debug_strings); i++) {
if (TEST(marlin_debug_flags, i)) {
- if (comma++) SERIAL_CHAR('|');
- serialprintPGM(debug_strings[i]);
+ if (comma++) SERIAL_CHAR(',');
+ serialprintPGM((char*)pgm_read_word(&(debug_strings[i])));
}
}
}
@@ -4388,6 +4429,27 @@ inline void gcode_M111() {
*/
inline void gcode_M112() { kill(PSTR(MSG_KILLED)); }
+#if ENABLED(HOST_KEEPALIVE_FEATURE)
+
+ /**
+ * M113: Get or set Host Keepalive interval (0 to disable)
+ *
+ * S Optional. Set the keepalive interval.
+ */
+ inline void gcode_M113() {
+ if (code_seen('S')) {
+ host_keepalive_interval = (uint8_t)code_value_short();
+ NOMORE(host_keepalive_interval, 60);
+ }
+ else {
+ SERIAL_ECHO_START;
+ SERIAL_ECHOPAIR("M113 S", (unsigned long)host_keepalive_interval);
+ SERIAL_EOL;
+ }
+ }
+
+#endif
+
#if ENABLED(BARICUDA)
#if HAS_HEATER_1
@@ -4748,6 +4810,57 @@ inline void gcode_M121() { enable_endstops_globally(false); }
#endif // BLINKM
+#if ENABLED(EXPERIMENTAL_I2CBUS)
+
+ /**
+ * M155: Send data to a I2C slave device
+ *
+ * This is a PoC, the formating and arguments for the GCODE will
+ * change to be more compatible, the current proposal is:
+ *
+ * M155 A ; Sets the I2C slave address the data will be sent to
+ *
+ * M155 B
+ * M155 B
+ * M155 B
+ *
+ * M155 S1 ; Send the buffered data and reset the buffer
+ * M155 R1 ; Reset the buffer without sending data
+ *
+ */
+ inline void gcode_M155() {
+ // Set the target address
+ if (code_seen('A'))
+ i2c.address((uint8_t) code_value_short());
+
+ // Add a new byte to the buffer
+ else if (code_seen('B'))
+ i2c.addbyte((int) code_value_short());
+
+ // Flush the buffer to the bus
+ else if (code_seen('S')) i2c.send();
+
+ // Reset and rewind the buffer
+ else if (code_seen('R')) i2c.reset();
+ }
+
+ /**
+ * M156: Request X bytes from I2C slave device
+ *
+ * Usage: M156 A B
+ */
+ inline void gcode_M156() {
+ uint8_t addr = code_seen('A') ? code_value_short() : 0;
+ int bytes = code_seen('B') ? code_value_short() : 0;
+
+ if (addr && bytes) {
+ i2c.address(addr);
+ i2c.reqbytes(bytes);
+ }
+ }
+
+#endif //EXPERIMENTAL_I2CBUS
+
/**
* M200: Set filament diameter and set E axis units to cubic millimeters
*
@@ -5473,13 +5586,13 @@ inline void gcode_M400() { st_synchronize(); }
if (code_seen('D')) meas_delay_cm = code_value();
NOMORE(meas_delay_cm, MAX_MEASUREMENT_DELAY);
- if (delay_index2 == -1) { //initialize the ring buffer if it has not been done since startup
+ if (filwidth_delay_index2 == -1) { // Initialize the ring buffer if not done since startup
int temp_ratio = widthFil_to_size_ratio();
- for (delay_index1 = 0; delay_index1 < COUNT(measurement_delay); ++delay_index1)
- measurement_delay[delay_index1] = temp_ratio - 100; //subtract 100 to scale within a signed byte
+ for (uint8_t i = 0; i < COUNT(measurement_delay); ++i)
+ measurement_delay[i] = temp_ratio - 100; // Subtract 100 to scale within a signed byte
- delay_index1 = delay_index2 = 0;
+ filwidth_delay_index1 = filwidth_delay_index2 = 0;
}
filament_sensor = true;
@@ -5525,7 +5638,7 @@ inline void gcode_M410() { quickStop(); }
* M421: Set a single Mesh Bed Leveling Z coordinate
*/
inline void gcode_M421() {
- float x, y, z;
+ float x = 0, y = 0, z = 0;
bool err = false, hasX, hasY, hasZ;
if ((hasX = code_seen('X'))) x = code_value();
if ((hasY = code_seen('Y'))) y = code_value();
@@ -5688,7 +5801,10 @@ inline void gcode_M503() {
return;
}
- float lastpos[NUM_AXIS], fr60 = feedrate / 60;
+ float lastpos[NUM_AXIS];
+ #if ENABLED(DELTA)
+ float fr60 = feedrate / 60;
+ #endif
for (int i = 0; i < NUM_AXIS; i++)
lastpos[i] = destination[i] = current_position[i];
@@ -5745,7 +5861,9 @@ inline void gcode_M503() {
disable_e3();
delay(100);
LCD_ALERTMESSAGEPGM(MSG_FILAMENTCHANGE);
- millis_t next_tick = 0;
+ #if DISABLED(AUTO_FILAMENT_CHANGE)
+ millis_t next_tick = 0;
+ #endif
KEEPALIVE_STATE(PAUSED_FOR_USER);
while (!lcd_clicked()) {
#if DISABLED(AUTO_FILAMENT_CHANGE)
@@ -6264,6 +6382,18 @@ void process_next_command() {
break;
#endif // AUTO_BED_LEVELING_FEATURE && Z_MIN_PROBE_REPEATABILITY_TEST
+ case 75: // Start print timer
+ gcode_M75();
+ break;
+
+ case 76: // Pause print timer
+ gcode_M76();
+ break;
+
+ case 77: // Stop print timer
+ gcode_M77();
+ break;
+
#if ENABLED(M100_FREE_MEMORY_WATCHER)
case 100:
gcode_M100();
@@ -6399,6 +6529,18 @@ void process_next_command() {
#endif //BLINKM
+ #if ENABLED(EXPERIMENTAL_I2CBUS)
+
+ case 155:
+ gcode_M155();
+ break;
+
+ case 156:
+ gcode_M156();
+ break;
+
+ #endif //EXPERIMENTAL_I2CBUS
+
case 200: // M200 D set filament diameter and set E axis units to cubic millimeters (use S0 to set back to millimeters).
gcode_M200();
break;
@@ -7680,50 +7822,3 @@ void calculate_volumetric_multipliers() {
for (int i = 0; i < EXTRUDERS; i++)
volumetric_multiplier[i] = calculate_volumetric_multiplier(filament_size[i]);
}
-
-/**
- * Start the print job timer
- *
- * The print job is only started if all extruders have their target temp at zero
- * otherwise the print job timew would be reset everytime a M109 is received.
- *
- * @param t start timer timestamp
- *
- * @return true if the timer was started at function call
- */
-bool print_job_start(millis_t t /* = 0 */) {
- for (int i = 0; i < EXTRUDERS; i++) if (degTargetHotend(i) > 0) return false;
- print_job_start_ms = (t) ? t : millis();
- print_job_stop_ms = 0;
- return true;
-}
-
-/**
- * Check if the running print job has finished and stop the timer
- *
- * When the target temperature for all extruders is zero then we assume that the
- * print job has finished printing. There are some special conditions under which
- * this assumption may not be valid: If during a print job for some reason the
- * user decides to bring a nozzle temp down and only then heat the other afterwards.
- *
- * @param force stops the timer ignoring all pre-checks
- *
- * @return boolean true if the print job has finished printing
- */
-bool print_job_stop(bool force /* = false */) {
- if (!print_job_start_ms) return false;
- if (!force) for (int i = 0; i < EXTRUDERS; i++) if (degTargetHotend(i) > 0) return false;
- print_job_stop_ms = millis();
- return true;
-}
-
-/**
- * Output the print job timer in seconds
- *
- * @return the number of seconds
- */
-millis_t print_job_timer() {
- if (!print_job_start_ms) return 0;
- return (((print_job_stop_ms > print_job_start_ms)
- ? print_job_stop_ms : millis()) - print_job_start_ms) / 1000;
-}
diff --git a/Marlin/SanityCheck.h b/Marlin/SanityCheck.h
index fb45e77b9f..b1a9c7b777 100644
--- a/Marlin/SanityCheck.h
+++ b/Marlin/SanityCheck.h
@@ -368,27 +368,29 @@
* Test Heater, Temp Sensor, and Extruder Pins; Sensor Type must also be set.
*/
#if EXTRUDERS > 3
- #if !HAS_HEATER_3
+ #if TEMP_SENSOR_3 == 0
+ #error TEMP_SENSOR_3 is required with 4 EXTRUDERS.
+ #elif !HAS_HEATER_3
#error HEATER_3_PIN not defined for this board.
#elif !PIN_EXISTS(TEMP_3)
#error TEMP_3_PIN not defined for this board.
#elif !PIN_EXISTS(E3_STEP) || !PIN_EXISTS(E3_DIR) || !PIN_EXISTS(E3_ENABLE)
#error E3_STEP_PIN, E3_DIR_PIN, or E3_ENABLE_PIN not defined for this board.
- #elif TEMP_SENSOR_3 == 0
- #error TEMP_SENSOR_3 is required with 4 EXTRUDERS.
#endif
#elif EXTRUDERS > 2
- #if !HAS_HEATER_2
+ #if TEMP_SENSOR_2 == 0
+ #error TEMP_SENSOR_2 is required with 3 or more EXTRUDERS.
+ #elif !HAS_HEATER_2
#error HEATER_2_PIN not defined for this board.
#elif !PIN_EXISTS(TEMP_2)
#error TEMP_2_PIN not defined for this board.
#elif !PIN_EXISTS(E2_STEP) || !PIN_EXISTS(E2_DIR) || !PIN_EXISTS(E2_ENABLE)
#error E2_STEP_PIN, E2_DIR_PIN, or E2_ENABLE_PIN not defined for this board.
- #elif TEMP_SENSOR_2 == 0
- #error TEMP_SENSOR_2 is required with 3 or more EXTRUDERS.
#endif
#elif EXTRUDERS > 1
- #if !PIN_EXISTS(TEMP_1)
+ #if TEMP_SENSOR_1 == 0
+ #error TEMP_SENSOR_1 is required with 2 or more EXTRUDERS.
+ #elif !PIN_EXISTS(TEMP_1)
#error TEMP_1_PIN not defined for this board.
#elif !PIN_EXISTS(E1_STEP) || !PIN_EXISTS(E1_DIR) || !PIN_EXISTS(E1_ENABLE)
#error E1_STEP_PIN, E1_DIR_PIN, or E1_ENABLE_PIN not defined for this board.
@@ -401,12 +403,8 @@
#endif
#endif
-#if TEMP_SENSOR_1 == 0
- #if EXTRUDERS > 1
- #error TEMP_SENSOR_1 is required with 2 or more EXTRUDERS.
- #elif ENABLED(TEMP_SENSOR_1_AS_REDUNDANT)
- #error TEMP_SENSOR_1 is required with TEMP_SENSOR_1_AS_REDUNDANT.
- #endif
+#if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) && TEMP_SENSOR_1 == 0
+ #error TEMP_SENSOR_1 is required with TEMP_SENSOR_1_AS_REDUNDANT.
#endif
#if !HAS_HEATER_0
@@ -419,6 +417,19 @@
#error TEMP_SENSOR_0 is required.
#endif
+/**
+ * Endstops
+ */
+#if DISABLED(USE_XMIN_PLUG) && DISABLED(USE_XMAX_PLUG) && !(ENABLED(Z_DUAL_ENDSTOPS) && Z2_USE_ENDSTOP >= _XMAX_ && Z2_USE_ENDSTOP <= _XMIN_)
+ #error You must enable USE_XMIN_PLUG or USE_XMAX_PLUG
+#elif DISABLED(USE_YMIN_PLUG) && DISABLED(USE_YMAX_PLUG) && !(ENABLED(Z_DUAL_ENDSTOPS) && Z2_USE_ENDSTOP >= _YMAX_ && Z2_USE_ENDSTOP <= _YMIN_)
+ #error You must enable USE_YMIN_PLUG or USE_YMAX_PLUG
+#elif DISABLED(USE_ZMIN_PLUG) && DISABLED(USE_ZMAX_PLUG) && !(ENABLED(Z_DUAL_ENDSTOPS) && Z2_USE_ENDSTOP >= _ZMAX_ && Z2_USE_ENDSTOP <= _ZMIN_)
+ #error You must enable USE_ZMIN_PLUG or USE_ZMAX_PLUG
+#elif ENABLED(Z_DUAL_ENDSTOPS) && !Z2_USE_ENDSTOP
+ #error You must set Z2_USE_ENDSTOP with Z_DUAL_ENDSTOPS
+#endif
+
/**
* Warnings for old configurations
*/
@@ -445,17 +456,21 @@
#elif defined(CUSTOM_MENDEL_NAME)
#error CUSTOM_MENDEL_NAME is now CUSTOM_MACHINE_NAME. Please update your configuration.
#elif defined(HAS_AUTOMATIC_VERSIONING)
- #error HAS_AUTOMATIC_VERSIONING deprecated - use USE_AUTOMATIC_VERSIONING instead
+ #error HAS_AUTOMATIC_VERSIONING is now USE_AUTOMATIC_VERSIONING. Please update your configuration.
#elif defined(ENABLE_AUTO_BED_LEVELING)
- #error ENABLE_AUTO_BED_LEVELING deprecated - use AUTO_BED_LEVELING_FEATURE instead
+ #error ENABLE_AUTO_BED_LEVELING is now AUTO_BED_LEVELING_FEATURE. Please update your configuration.
#elif defined(SDSLOW)
- #error SDSLOW deprecated - set SPI_SPEED to SPI_HALF_SPEED instead
+ #error SDSLOW deprecated. Set SPI_SPEED to SPI_HALF_SPEED instead.
#elif defined(SDEXTRASLOW)
- #error SDEXTRASLOW deprecated - set SPI_SPEED to SPI_QUARTER_SPEED instead
+ #error SDEXTRASLOW deprecated. Set SPI_SPEED to SPI_QUARTER_SPEED instead.
#elif defined(Z_RAISE_BEFORE_HOMING)
#error Z_RAISE_BEFORE_HOMING is deprecated. Use MIN_Z_HEIGHT_FOR_HOMING instead.
#elif defined(FILAMENT_SENSOR)
#error FILAMENT_SENSOR is deprecated. Use FILAMENT_WIDTH_SENSOR instead.
+#elif defined(DISABLE_MAX_ENDSTOPS) || defined(DISABLE_MIN_ENDSTOPS)
+ #error DISABLE_MAX_ENDSTOPS and DISABLE_MIN_ENDSTOPS deprecated. Use individual USE_*_PLUG options instead.
+#elif ENABLED(Z_DUAL_ENDSTOPS) && !defined(Z2_USE_ENDSTOP)
+ #error Z_DUAL_ENDSTOPS settings are simplified. Just set Z2_USE_ENDSTOP to the endstop you want to repurpose for Z2
#endif
#endif //SANITYCHECK_H
diff --git a/Marlin/Sd2Card.cpp b/Marlin/Sd2Card.cpp
index 53935feb10..62416b0684 100644
--- a/Marlin/Sd2Card.cpp
+++ b/Marlin/Sd2Card.cpp
@@ -365,6 +365,7 @@ bool Sd2Card::init(uint8_t sckRateID, uint8_t chipSelectPin) {
#if DISABLED(SOFTWARE_SPI)
return setSckRate(sckRateID);
#else // SOFTWARE_SPI
+ UNUSED(sckRateID);
return true;
#endif // SOFTWARE_SPI
diff --git a/Marlin/cardreader.cpp b/Marlin/cardreader.cpp
index c122a45cee..eabf7b08b9 100644
--- a/Marlin/cardreader.cpp
+++ b/Marlin/cardreader.cpp
@@ -348,11 +348,11 @@ void CardReader::openFile(char* name, bool read, bool push_current/*=false*/) {
char *dirname_start, *dirname_end;
if (name[0] == '/') {
dirname_start = &name[1];
- while (dirname_start > 0) {
+ while (dirname_start != NULL) {
dirname_end = strchr(dirname_start, '/');
//SERIAL_ECHO("start:");SERIAL_ECHOLN((int)(dirname_start - name));
//SERIAL_ECHO("end :");SERIAL_ECHOLN((int)(dirname_end - name));
- if (dirname_end > 0 && dirname_end > dirname_start) {
+ if (dirname_end != NULL && dirname_end > dirname_start) {
char subdirname[FILENAME_LENGTH];
strncpy(subdirname, dirname_start, dirname_end - dirname_start);
subdirname[dirname_end - dirname_start] = 0;
@@ -429,11 +429,11 @@ void CardReader::removeFile(char* name) {
char *dirname_start, *dirname_end;
if (name[0] == '/') {
dirname_start = strchr(name, '/') + 1;
- while (dirname_start > 0) {
+ while (dirname_start != NULL) {
dirname_end = strchr(dirname_start, '/');
//SERIAL_ECHO("start:");SERIAL_ECHOLN((int)(dirname_start - name));
//SERIAL_ECHO("end :");SERIAL_ECHOLN((int)(dirname_end - name));
- if (dirname_end > 0 && dirname_end > dirname_start) {
+ if (dirname_end != NULL && dirname_end > dirname_start) {
char subdirname[FILENAME_LENGTH];
strncpy(subdirname, dirname_start, dirname_end - dirname_start);
subdirname[dirname_end - dirname_start] = 0;
diff --git a/Marlin/configuration_store.cpp b/Marlin/configuration_store.cpp
index 83bd8450bd..3f22b2f8c6 100644
--- a/Marlin/configuration_store.cpp
+++ b/Marlin/configuration_store.cpp
@@ -328,7 +328,7 @@ void Config_StoreSettings() {
// Report storage size
SERIAL_ECHO_START;
- SERIAL_ECHOPAIR("Settings Stored (", (unsigned long)i);
+ SERIAL_ECHOPAIR("Settings Stored (", i);
SERIAL_ECHOLNPGM(" bytes)");
}
@@ -507,7 +507,7 @@ void Config_RetrieveSettings() {
// Report settings retrieved and length
SERIAL_ECHO_START;
SERIAL_ECHO(ver);
- SERIAL_ECHOPAIR(" stored settings retrieved (", (unsigned long)i);
+ SERIAL_ECHOPAIR(" stored settings retrieved (", i);
SERIAL_ECHOLNPGM(" bytes)");
}
@@ -730,9 +730,9 @@ void Config_PrintSettings(bool forReplay) {
SERIAL_ECHOLNPGM("Mesh bed leveling:");
CONFIG_ECHO_START;
}
- SERIAL_ECHOPAIR(" M420 S", (unsigned long)mbl.active);
- SERIAL_ECHOPAIR(" X", (unsigned long)MESH_NUM_X_POINTS);
- SERIAL_ECHOPAIR(" Y", (unsigned long)MESH_NUM_Y_POINTS);
+ SERIAL_ECHOPAIR(" M420 S", mbl.active);
+ SERIAL_ECHOPAIR(" X", MESH_NUM_X_POINTS);
+ SERIAL_ECHOPAIR(" Y", MESH_NUM_Y_POINTS);
SERIAL_EOL;
for (uint8_t y = 0; y < MESH_NUM_Y_POINTS; y++) {
for (uint8_t x = 0; x < MESH_NUM_X_POINTS; x++) {
@@ -783,14 +783,14 @@ void Config_PrintSettings(bool forReplay) {
SERIAL_ECHOLNPGM("Material heatup parameters:");
CONFIG_ECHO_START;
}
- SERIAL_ECHOPAIR(" M145 S0 H", (unsigned long)plaPreheatHotendTemp);
- SERIAL_ECHOPAIR(" B", (unsigned long)plaPreheatHPBTemp);
- SERIAL_ECHOPAIR(" F", (unsigned long)plaPreheatFanSpeed);
+ SERIAL_ECHOPAIR(" M145 S0 H", plaPreheatHotendTemp);
+ SERIAL_ECHOPAIR(" B", plaPreheatHPBTemp);
+ SERIAL_ECHOPAIR(" F", plaPreheatFanSpeed);
SERIAL_EOL;
CONFIG_ECHO_START;
- SERIAL_ECHOPAIR(" M145 S1 H", (unsigned long)absPreheatHotendTemp);
- SERIAL_ECHOPAIR(" B", (unsigned long)absPreheatHPBTemp);
- SERIAL_ECHOPAIR(" F", (unsigned long)absPreheatFanSpeed);
+ SERIAL_ECHOPAIR(" M145 S1 H", absPreheatHotendTemp);
+ SERIAL_ECHOPAIR(" B", absPreheatHPBTemp);
+ SERIAL_ECHOPAIR(" F", absPreheatFanSpeed);
SERIAL_EOL;
#endif // ULTIPANEL
@@ -805,7 +805,7 @@ void Config_PrintSettings(bool forReplay) {
if (forReplay) {
for (uint8_t i = 0; i < EXTRUDERS; i++) {
CONFIG_ECHO_START;
- SERIAL_ECHOPAIR(" M301 E", (unsigned long)i);
+ SERIAL_ECHOPAIR(" M301 E", i);
SERIAL_ECHOPAIR(" P", PID_PARAM(Kp, i));
SERIAL_ECHOPAIR(" I", unscalePID_i(PID_PARAM(Ki, i)));
SERIAL_ECHOPAIR(" D", unscalePID_d(PID_PARAM(Kd, i)));
@@ -848,7 +848,7 @@ void Config_PrintSettings(bool forReplay) {
SERIAL_ECHOLNPGM("LCD Contrast:");
CONFIG_ECHO_START;
}
- SERIAL_ECHOPAIR(" M250 C", (unsigned long)lcd_contrast);
+ SERIAL_ECHOPAIR(" M250 C", lcd_contrast);
SERIAL_EOL;
#endif
@@ -882,7 +882,7 @@ void Config_PrintSettings(bool forReplay) {
SERIAL_ECHOLNPGM("Auto-Retract: S=0 to disable, 1 to interpret extrude-only moves as retracts or recoveries");
CONFIG_ECHO_START;
}
- SERIAL_ECHOPAIR(" M209 S", (unsigned long)(autoretract_enabled ? 1 : 0));
+ SERIAL_ECHOPAIR(" M209 S", (autoretract_enabled ? 1 : 0));
SERIAL_EOL;
#endif // FWRETRACT
diff --git a/Marlin/dogm_lcd_implementation.h b/Marlin/dogm_lcd_implementation.h
index 669fd431e6..4da13cd297 100644
--- a/Marlin/dogm_lcd_implementation.h
+++ b/Marlin/dogm_lcd_implementation.h
@@ -334,9 +334,8 @@ static void lcd_implementation_status_screen() {
}
u8g.setPrintPos(80,48);
- if (print_job_start_ms != 0) {
- uint16_t time = (((print_job_stop_ms > print_job_start_ms)
- ? print_job_stop_ms : millis()) - print_job_start_ms) / 60000;
+ uint16_t time = print_job_timer.duration() / 60;
+ if (time != 0) {
lcd_print(itostr2(time/60));
lcd_print(':');
lcd_print(itostr2(time%60));
@@ -599,7 +598,7 @@ void lcd_implementation_drawedit(const char* pstr, const char* value) {
#endif //SDSUPPORT
-#define lcd_implementation_drawmenu_back(sel, row, pstr, data) lcd_implementation_drawmenu_generic(sel, row, pstr, LCD_STR_UPLEVEL[0], LCD_STR_UPLEVEL[0])
+#define lcd_implementation_drawmenu_back(sel, row, pstr) lcd_implementation_drawmenu_generic(sel, row, pstr, LCD_STR_UPLEVEL[0], LCD_STR_UPLEVEL[0])
#define lcd_implementation_drawmenu_submenu(sel, row, pstr, data) lcd_implementation_drawmenu_generic(sel, row, pstr, '>', LCD_STR_ARROW_RIGHT[0])
#define lcd_implementation_drawmenu_gcode(sel, row, pstr, gcode) lcd_implementation_drawmenu_generic(sel, row, pstr, '>', ' ')
#define lcd_implementation_drawmenu_function(sel, row, pstr, data) lcd_implementation_drawmenu_generic(sel, row, pstr, '>', ' ')
diff --git a/Marlin/example_configurations/Felix/Configuration.h b/Marlin/example_configurations/Felix/Configuration.h
index 3fd1646da8..2da7f04f6d 100644
--- a/Marlin/example_configurations/Felix/Configuration.h
+++ b/Marlin/example_configurations/Felix/Configuration.h
@@ -328,8 +328,22 @@
// Enable this option for Toshiba steppers
//#define CONFIG_STEPPERS_TOSHIBA
+//===========================================================================
+//============================== Endstop Settings ===========================
+//===========================================================================
+
// @section homing
+// Specify here all the endstop connectors that are connected to any endstop or probe.
+// Almost all printers will be using one per axis. Probes will use one or more of the
+// extra connectors. Leave undefined any used for non-endstop and non-probe purposes.
+#define USE_XMIN_PLUG
+#define USE_YMIN_PLUG
+#define USE_ZMIN_PLUG
+//#define USE_XMAX_PLUG
+//#define USE_YMAX_PLUG
+//#define USE_ZMAX_PLUG
+
// coarse Endstop Settings
#define ENDSTOPPULLUPS // Comment this out (using // at the start of the line) to disable the endstop pullup resistors
@@ -352,8 +366,6 @@ const bool X_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of
const bool Y_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop.
const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop.
const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the logic of the endstop.
-#define DISABLE_MAX_ENDSTOPS
-//#define DISABLE_MIN_ENDSTOPS
//===========================================================================
//============================= Z Probe Options =============================
@@ -692,9 +704,12 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l
// Host Keepalive
//
// By default Marlin will send a busy status message to the host
-// every 10 seconds when it can't accept commands.
+// every couple of seconds when it can't accept commands.
//
//#define DISABLE_HOST_KEEPALIVE // Enable this option if your host doesn't like keepalive messages.
+#if DISABLED(DISABLE_HOST_KEEPALIVE)
+ #define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113.
+#endif
//
// M100 Free Memory Watcher
diff --git a/Marlin/example_configurations/Felix/Configuration_DUAL.h b/Marlin/example_configurations/Felix/Configuration_DUAL.h
index 553c2dc60e..60697ed0e8 100644
--- a/Marlin/example_configurations/Felix/Configuration_DUAL.h
+++ b/Marlin/example_configurations/Felix/Configuration_DUAL.h
@@ -325,8 +325,22 @@
// Enable this option for Toshiba steppers
//#define CONFIG_STEPPERS_TOSHIBA
+//===========================================================================
+//============================== Endstop Settings ===========================
+//===========================================================================
+
// @section homing
+// Specify here all the endstop connectors that are connected to any endstop or probe.
+// Almost all printers will be using one per axis. Probes will use one or more of the
+// extra connectors. Leave undefined any used for non-endstop and non-probe purposes.
+#define USE_XMIN_PLUG
+#define USE_YMIN_PLUG
+#define USE_ZMIN_PLUG
+//#define USE_XMAX_PLUG
+//#define USE_YMAX_PLUG
+//#define USE_ZMAX_PLUG
+
// coarse Endstop Settings
#define ENDSTOPPULLUPS // Comment this out (using // at the start of the line) to disable the endstop pullup resistors
@@ -349,8 +363,6 @@ const bool X_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of
const bool Y_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop.
const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop.
const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the logic of the endstop.
-#define DISABLE_MAX_ENDSTOPS
-//#define DISABLE_MIN_ENDSTOPS
//===========================================================================
//============================= Z Probe Options =============================
@@ -689,9 +701,12 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l
// Host Keepalive
//
// By default Marlin will send a busy status message to the host
-// every 10 seconds when it can't accept commands.
+// every couple of seconds when it can't accept commands.
//
//#define DISABLE_HOST_KEEPALIVE // Enable this option if your host doesn't like keepalive messages.
+#if DISABLED(DISABLE_HOST_KEEPALIVE)
+ #define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113.
+#endif
//
// M100 Free Memory Watcher
diff --git a/Marlin/example_configurations/Felix/Configuration_adv.h b/Marlin/example_configurations/Felix/Configuration_adv.h
index 5608d4b393..e8e2c1876c 100644
--- a/Marlin/example_configurations/Felix/Configuration_adv.h
+++ b/Marlin/example_configurations/Felix/Configuration_adv.h
@@ -201,9 +201,7 @@
//#define Z_DUAL_ENDSTOPS
#if ENABLED(Z_DUAL_ENDSTOPS)
- #define Z2_MAX_PIN 36 //Endstop used for Z2 axis. In this case I'm using XMAX in a Rumba Board (pin 36)
- const bool Z2_MAX_ENDSTOP_INVERTING = false;
- #define DISABLE_XMAX_ENDSTOP //Better to disable the XMAX to avoid conflict. Just rename "XMAX_ENDSTOP" by the endstop you are using for Z2 axis.
+ #define Z2_USE_ENDSTOP _XMAX_
#endif
#endif // Z_DUAL_STEPPER_DRIVERS
@@ -655,6 +653,38 @@ const unsigned int dropsegments = 5; //everything with less than this number of
#endif
+/**
+ * TWI/I2C BUS
+ *
+ * This feature is an EXPERIMENTAL feature so it shall not be used on production
+ * machines. Enabling this will allow you to send and receive I2C data from slave
+ * devices on the bus.
+ *
+ * ; Example #1
+ * ; This macro send the string "Marlin" to the slave device with address 0x63
+ * ; It uses multiple M155 commands with one B arg
+ * M155 A63 ; Target slave address
+ * M155 B77 ; M
+ * M155 B97 ; a
+ * M155 B114 ; r
+ * M155 B108 ; l
+ * M155 B105 ; i
+ * M155 B110 ; n
+ * M155 S1 ; Send the current buffer
+ *
+ * ; Example #2
+ * ; Request 6 bytes from slave device with address 0x63
+ * M156 A63 B5
+ *
+ * ; Example #3
+ * ; Example serial output of a M156 request
+ * echo:i2c-reply: from:63 bytes:5 data:hello
+ */
+
+// @section i2cbus
+
+//#define EXPERIMENTAL_I2CBUS
+
#include "Conditionals.h"
#include "SanityCheck.h"
diff --git a/Marlin/example_configurations/Hephestos/Configuration.h b/Marlin/example_configurations/Hephestos/Configuration.h
index 1d6faab46d..9e0af0a329 100644
--- a/Marlin/example_configurations/Hephestos/Configuration.h
+++ b/Marlin/example_configurations/Hephestos/Configuration.h
@@ -338,8 +338,22 @@
// Enable this option for Toshiba steppers
//#define CONFIG_STEPPERS_TOSHIBA
+//===========================================================================
+//============================== Endstop Settings ===========================
+//===========================================================================
+
// @section homing
+// Specify here all the endstop connectors that are connected to any endstop or probe.
+// Almost all printers will be using one per axis. Probes will use one or more of the
+// extra connectors. Leave undefined any used for non-endstop and non-probe purposes.
+#define USE_XMIN_PLUG
+#define USE_YMIN_PLUG
+#define USE_ZMIN_PLUG
+//#define USE_XMAX_PLUG
+//#define USE_YMAX_PLUG
+//#define USE_ZMAX_PLUG
+
// coarse Endstop Settings
#define ENDSTOPPULLUPS // Comment this out (using // at the start of the line) to disable the endstop pullup resistors
@@ -362,8 +376,6 @@ const bool X_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of
const bool Y_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop.
const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop.
const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop.
-#define DISABLE_MAX_ENDSTOPS
-//#define DISABLE_MIN_ENDSTOPS
//===========================================================================
//============================= Z Probe Options =============================
@@ -701,9 +713,12 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo
// Host Keepalive
//
// By default Marlin will send a busy status message to the host
-// every 10 seconds when it can't accept commands.
+// every couple of seconds when it can't accept commands.
//
//#define DISABLE_HOST_KEEPALIVE // Enable this option if your host doesn't like keepalive messages.
+#if DISABLED(DISABLE_HOST_KEEPALIVE)
+ #define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113.
+#endif
//
// M100 Free Memory Watcher
diff --git a/Marlin/example_configurations/Hephestos/Configuration_adv.h b/Marlin/example_configurations/Hephestos/Configuration_adv.h
index fcdee236a9..ab8000a88b 100644
--- a/Marlin/example_configurations/Hephestos/Configuration_adv.h
+++ b/Marlin/example_configurations/Hephestos/Configuration_adv.h
@@ -201,9 +201,7 @@
//#define Z_DUAL_ENDSTOPS
#if ENABLED(Z_DUAL_ENDSTOPS)
- #define Z2_MAX_PIN 36 //Endstop used for Z2 axis. In this case I'm using XMAX in a Rumba Board (pin 36)
- const bool Z2_MAX_ENDSTOP_INVERTING = false;
- #define DISABLE_XMAX_ENDSTOP //Better to disable the XMAX to avoid conflict. Just rename "XMAX_ENDSTOP" by the endstop you are using for Z2 axis.
+ #define Z2_USE_ENDSTOP _XMAX_
#endif
#endif // Z_DUAL_STEPPER_DRIVERS
@@ -655,6 +653,38 @@ const unsigned int dropsegments = 5; //everything with less than this number of
#endif
+/**
+ * TWI/I2C BUS
+ *
+ * This feature is an EXPERIMENTAL feature so it shall not be used on production
+ * machines. Enabling this will allow you to send and receive I2C data from slave
+ * devices on the bus.
+ *
+ * ; Example #1
+ * ; This macro send the string "Marlin" to the slave device with address 0x63
+ * ; It uses multiple M155 commands with one B arg
+ * M155 A63 ; Target slave address
+ * M155 B77 ; M
+ * M155 B97 ; a
+ * M155 B114 ; r
+ * M155 B108 ; l
+ * M155 B105 ; i
+ * M155 B110 ; n
+ * M155 S1 ; Send the current buffer
+ *
+ * ; Example #2
+ * ; Request 6 bytes from slave device with address 0x63
+ * M156 A63 B5
+ *
+ * ; Example #3
+ * ; Example serial output of a M156 request
+ * echo:i2c-reply: from:63 bytes:5 data:hello
+ */
+
+// @section i2cbus
+
+//#define EXPERIMENTAL_I2CBUS
+
#include "Conditionals.h"
#include "SanityCheck.h"
diff --git a/Marlin/example_configurations/Hephestos_2/Configuration.h b/Marlin/example_configurations/Hephestos_2/Configuration.h
index e348a6ecb7..a1a89e3715 100644
--- a/Marlin/example_configurations/Hephestos_2/Configuration.h
+++ b/Marlin/example_configurations/Hephestos_2/Configuration.h
@@ -340,8 +340,22 @@
// Enable this option for Toshiba steppers
//#define CONFIG_STEPPERS_TOSHIBA
+//===========================================================================
+//============================== Endstop Settings ===========================
+//===========================================================================
+
// @section homing
+// Specify here all the endstop connectors that are connected to any endstop or probe.
+// Almost all printers will be using one per axis. Probes will use one or more of the
+// extra connectors. Leave undefined any used for non-endstop and non-probe purposes.
+#define USE_XMIN_PLUG
+#define USE_YMIN_PLUG
+#define USE_ZMIN_PLUG
+//#define USE_XMAX_PLUG
+//#define USE_YMAX_PLUG
+//#define USE_ZMAX_PLUG
+
// coarse Endstop Settings
#define ENDSTOPPULLUPS // Comment this out (using // at the start of the line) to disable the endstop pullup resistors
@@ -364,8 +378,6 @@ const bool X_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic o
const bool Y_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop.
const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop.
const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the logic of the endstop.
-#define DISABLE_MAX_ENDSTOPS
-//#define DISABLE_MIN_ENDSTOPS
//===========================================================================
//============================= Z Probe Options =============================
@@ -703,9 +715,12 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l
// Host Keepalive
//
// By default Marlin will send a busy status message to the host
-// every 10 seconds when it can't accept commands.
+// every couple of seconds when it can't accept commands.
//
//#define DISABLE_HOST_KEEPALIVE // Enable this option if your host doesn't like keepalive messages.
+#if DISABLED(DISABLE_HOST_KEEPALIVE)
+ #define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113.
+#endif
//
// M100 Free Memory Watcher
diff --git a/Marlin/example_configurations/Hephestos_2/Configuration_adv.h b/Marlin/example_configurations/Hephestos_2/Configuration_adv.h
index 3131e10b24..be87d38ff4 100644
--- a/Marlin/example_configurations/Hephestos_2/Configuration_adv.h
+++ b/Marlin/example_configurations/Hephestos_2/Configuration_adv.h
@@ -201,9 +201,7 @@
//#define Z_DUAL_ENDSTOPS
#if ENABLED(Z_DUAL_ENDSTOPS)
- #define Z2_MAX_PIN 36 //Endstop used for Z2 axis. In this case I'm using XMAX in a Rumba Board (pin 36)
- const bool Z2_MAX_ENDSTOP_INVERTING = false;
- #define DISABLE_XMAX_ENDSTOP //Better to disable the XMAX to avoid conflict. Just rename "XMAX_ENDSTOP" by the endstop you are using for Z2 axis.
+ #define Z2_USE_ENDSTOP _XMAX_
#endif
#endif // Z_DUAL_STEPPER_DRIVERS
@@ -655,6 +653,38 @@ const unsigned int dropsegments = 5; //everything with less than this number of
#endif
+/**
+ * TWI/I2C BUS
+ *
+ * This feature is an EXPERIMENTAL feature so it shall not be used on production
+ * machines. Enabling this will allow you to send and receive I2C data from slave
+ * devices on the bus.
+ *
+ * ; Example #1
+ * ; This macro send the string "Marlin" to the slave device with address 0x63
+ * ; It uses multiple M155 commands with one B arg
+ * M155 A63 ; Target slave address
+ * M155 B77 ; M
+ * M155 B97 ; a
+ * M155 B114 ; r
+ * M155 B108 ; l
+ * M155 B105 ; i
+ * M155 B110 ; n
+ * M155 S1 ; Send the current buffer
+ *
+ * ; Example #2
+ * ; Request 6 bytes from slave device with address 0x63
+ * M156 A63 B5
+ *
+ * ; Example #3
+ * ; Example serial output of a M156 request
+ * echo:i2c-reply: from:63 bytes:5 data:hello
+ */
+
+// @section i2cbus
+
+//#define EXPERIMENTAL_I2CBUS
+
#include "Conditionals.h"
#include "SanityCheck.h"
diff --git a/Marlin/example_configurations/K8200/Configuration.h b/Marlin/example_configurations/K8200/Configuration.h
index e803d3e2b0..74c5531772 100644
--- a/Marlin/example_configurations/K8200/Configuration.h
+++ b/Marlin/example_configurations/K8200/Configuration.h
@@ -363,8 +363,22 @@
// Enable this option for Toshiba steppers
//#define CONFIG_STEPPERS_TOSHIBA
+//===========================================================================
+//============================== Endstop Settings ===========================
+//===========================================================================
+
// @section homing
+// Specify here all the endstop connectors that are connected to any endstop or probe.
+// Almost all printers will be using one per axis. Probes will use one or more of the
+// extra connectors. Leave undefined any used for non-endstop and non-probe purposes.
+#define USE_XMIN_PLUG
+#define USE_YMIN_PLUG
+#define USE_ZMIN_PLUG
+//#define USE_XMAX_PLUG
+//#define USE_YMAX_PLUG
+//#define USE_ZMAX_PLUG
+
// coarse Endstop Settings
#define ENDSTOPPULLUPS // Comment this out (using // at the start of the line) to disable the endstop pullup resistors
@@ -387,8 +401,6 @@ const bool X_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of
const bool Y_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop.
const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop.
const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the logic of the endstop.
-#define DISABLE_MAX_ENDSTOPS
-//#define DISABLE_MIN_ENDSTOPS
//===========================================================================
//============================= Z Probe Options =============================
@@ -726,9 +738,12 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l
// Host Keepalive
//
// By default Marlin will send a busy status message to the host
-// every 10 seconds when it can't accept commands.
+// every couple of seconds when it can't accept commands.
//
//#define DISABLE_HOST_KEEPALIVE // Enable this option if your host doesn't like keepalive messages.
+#if DISABLED(DISABLE_HOST_KEEPALIVE)
+ #define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113.
+#endif
//
// M100 Free Memory Watcher
diff --git a/Marlin/example_configurations/K8200/Configuration_adv.h b/Marlin/example_configurations/K8200/Configuration_adv.h
index f5b6e70ea6..429a1ad7b5 100644
--- a/Marlin/example_configurations/K8200/Configuration_adv.h
+++ b/Marlin/example_configurations/K8200/Configuration_adv.h
@@ -207,9 +207,7 @@
//#define Z_DUAL_ENDSTOPS
#if ENABLED(Z_DUAL_ENDSTOPS)
- #define Z2_MAX_PIN 36 //Endstop used for Z2 axis. In this case I'm using XMAX in a Rumba Board (pin 36)
- const bool Z2_MAX_ENDSTOP_INVERTING = false;
- #define DISABLE_XMAX_ENDSTOP //Better to disable the XMAX to avoid conflict. Just rename "XMAX_ENDSTOP" by the endstop you are using for Z2 axis.
+ #define Z2_USE_ENDSTOP _XMAX_
#endif
#endif // Z_DUAL_STEPPER_DRIVERS
@@ -661,6 +659,38 @@ const unsigned int dropsegments = 2; //everything with less than this number of
#endif
+/**
+ * TWI/I2C BUS
+ *
+ * This feature is an EXPERIMENTAL feature so it shall not be used on production
+ * machines. Enabling this will allow you to send and receive I2C data from slave
+ * devices on the bus.
+ *
+ * ; Example #1
+ * ; This macro send the string "Marlin" to the slave device with address 0x63
+ * ; It uses multiple M155 commands with one B arg
+ * M155 A63 ; Target slave address
+ * M155 B77 ; M
+ * M155 B97 ; a
+ * M155 B114 ; r
+ * M155 B108 ; l
+ * M155 B105 ; i
+ * M155 B110 ; n
+ * M155 S1 ; Send the current buffer
+ *
+ * ; Example #2
+ * ; Request 6 bytes from slave device with address 0x63
+ * M156 A63 B5
+ *
+ * ; Example #3
+ * ; Example serial output of a M156 request
+ * echo:i2c-reply: from:63 bytes:5 data:hello
+ */
+
+// @section i2cbus
+
+//#define EXPERIMENTAL_I2CBUS
+
#include "Conditionals.h"
#include "SanityCheck.h"
diff --git a/Marlin/example_configurations/RepRapWorld/Megatronics/Configuration.h b/Marlin/example_configurations/RepRapWorld/Megatronics/Configuration.h
index 80e9d35190..553c07afa5 100644
--- a/Marlin/example_configurations/RepRapWorld/Megatronics/Configuration.h
+++ b/Marlin/example_configurations/RepRapWorld/Megatronics/Configuration.h
@@ -346,8 +346,22 @@
// Enable this option for Toshiba steppers
//#define CONFIG_STEPPERS_TOSHIBA
+//===========================================================================
+//============================== Endstop Settings ===========================
+//===========================================================================
+
// @section homing
+// Specify here all the endstop connectors that are connected to any endstop or probe.
+// Almost all printers will be using one per axis. Probes will use one or more of the
+// extra connectors. Leave undefined any used for non-endstop and non-probe purposes.
+#define USE_XMIN_PLUG
+#define USE_YMIN_PLUG
+#define USE_ZMIN_PLUG
+//#define USE_XMAX_PLUG
+//#define USE_YMAX_PLUG
+//#define USE_ZMAX_PLUG
+
// coarse Endstop Settings
#define ENDSTOPPULLUPS // Comment this out (using // at the start of the line) to disable the endstop pullup resistors
@@ -370,8 +384,6 @@ const bool X_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of
const bool Y_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop.
const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop.
const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the logic of the endstop.
-//#define DISABLE_MAX_ENDSTOPS
-//#define DISABLE_MIN_ENDSTOPS
//===========================================================================
//============================= Z Probe Options =============================
@@ -709,9 +721,12 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l
// Host Keepalive
//
// By default Marlin will send a busy status message to the host
-// every 10 seconds when it can't accept commands.
+// every couple of seconds when it can't accept commands.
//
//#define DISABLE_HOST_KEEPALIVE // Enable this option if your host doesn't like keepalive messages.
+#if DISABLED(DISABLE_HOST_KEEPALIVE)
+ #define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113.
+#endif
//
// M100 Free Memory Watcher
diff --git a/Marlin/example_configurations/RigidBot/Configuration.h b/Marlin/example_configurations/RigidBot/Configuration.h
index 3147bb0e0c..733b377cd4 100644
--- a/Marlin/example_configurations/RigidBot/Configuration.h
+++ b/Marlin/example_configurations/RigidBot/Configuration.h
@@ -340,8 +340,22 @@
// Enable this option for Toshiba steppers
//#define CONFIG_STEPPERS_TOSHIBA
+//===========================================================================
+//============================== Endstop Settings ===========================
+//===========================================================================
+
// @section homing
+// Specify here all the endstop connectors that are connected to any endstop or probe.
+// Almost all printers will be using one per axis. Probes will use one or more of the
+// extra connectors. Leave undefined any used for non-endstop and non-probe purposes.
+#define USE_XMIN_PLUG
+#define USE_YMIN_PLUG
+#define USE_ZMIN_PLUG
+//#define USE_XMAX_PLUG
+//#define USE_YMAX_PLUG
+//#define USE_ZMAX_PLUG
+
// coarse Endstop Settings
#define ENDSTOPPULLUPS // Comment this out (using // at the start of the line) to disable the endstop pullup resistors
@@ -364,8 +378,6 @@ const bool X_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of
const bool Y_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop.
const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop.
const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the logic of the endstop.
-//#define DISABLE_MAX_ENDSTOPS
-//#define DISABLE_MIN_ENDSTOPS
//===========================================================================
//============================= Z Probe Options =============================
@@ -704,9 +716,12 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l
// Host Keepalive
//
// By default Marlin will send a busy status message to the host
-// every 10 seconds when it can't accept commands.
+// every couple of seconds when it can't accept commands.
//
//#define DISABLE_HOST_KEEPALIVE // Enable this option if your host doesn't like keepalive messages.
+#if DISABLED(DISABLE_HOST_KEEPALIVE)
+ #define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113.
+#endif
//
// M100 Free Memory Watcher
diff --git a/Marlin/example_configurations/RigidBot/Configuration_adv.h b/Marlin/example_configurations/RigidBot/Configuration_adv.h
index c93dde2814..6985ddbe4f 100644
--- a/Marlin/example_configurations/RigidBot/Configuration_adv.h
+++ b/Marlin/example_configurations/RigidBot/Configuration_adv.h
@@ -201,9 +201,7 @@
//#define Z_DUAL_ENDSTOPS
#if ENABLED(Z_DUAL_ENDSTOPS)
- #define Z2_MAX_PIN 36 //Endstop used for Z2 axis. In this case I'm using XMAX in a Rumba Board (pin 36)
- const bool Z2_MAX_ENDSTOP_INVERTING = false;
- #define DISABLE_XMAX_ENDSTOP //Better to disable the XMAX to avoid conflict. Just rename "XMAX_ENDSTOP" by the endstop you are using for Z2 axis.
+ #define Z2_USE_ENDSTOP _XMAX_
#endif
#endif // Z_DUAL_STEPPER_DRIVERS
@@ -655,6 +653,38 @@ const unsigned int dropsegments = 5; //everything with less than this number of
#endif
+/**
+ * TWI/I2C BUS
+ *
+ * This feature is an EXPERIMENTAL feature so it shall not be used on production
+ * machines. Enabling this will allow you to send and receive I2C data from slave
+ * devices on the bus.
+ *
+ * ; Example #1
+ * ; This macro send the string "Marlin" to the slave device with address 0x63
+ * ; It uses multiple M155 commands with one B arg
+ * M155 A63 ; Target slave address
+ * M155 B77 ; M
+ * M155 B97 ; a
+ * M155 B114 ; r
+ * M155 B108 ; l
+ * M155 B105 ; i
+ * M155 B110 ; n
+ * M155 S1 ; Send the current buffer
+ *
+ * ; Example #2
+ * ; Request 6 bytes from slave device with address 0x63
+ * M156 A63 B5
+ *
+ * ; Example #3
+ * ; Example serial output of a M156 request
+ * echo:i2c-reply: from:63 bytes:5 data:hello
+ */
+
+// @section i2cbus
+
+//#define EXPERIMENTAL_I2CBUS
+
#include "Conditionals.h"
#include "SanityCheck.h"
diff --git a/Marlin/example_configurations/SCARA/Configuration.h b/Marlin/example_configurations/SCARA/Configuration.h
index 2320abc067..436bf22909 100644
--- a/Marlin/example_configurations/SCARA/Configuration.h
+++ b/Marlin/example_configurations/SCARA/Configuration.h
@@ -354,8 +354,22 @@
// Enable this option for Toshiba steppers
//#define CONFIG_STEPPERS_TOSHIBA
+//===========================================================================
+//============================== Endstop Settings ===========================
+//===========================================================================
+
// @section homing
+// Specify here all the endstop connectors that are connected to any endstop or probe.
+// Almost all printers will be using one per axis. Probes will use one or more of the
+// extra connectors. Leave undefined any used for non-endstop and non-probe purposes.
+#define USE_XMIN_PLUG
+#define USE_YMIN_PLUG
+//#define USE_ZMIN_PLUG
+//#define USE_XMAX_PLUG
+//#define USE_YMAX_PLUG
+#define USE_ZMAX_PLUG
+
// coarse Endstop Settings
//#define ENDSTOPPULLUPS // Comment this out (using // at the start of the line) to disable the endstop pullup resistors
@@ -378,8 +392,6 @@ const bool X_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of
const bool Y_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop.
const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop.
const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the logic of the endstop.
-//#define DISABLE_MAX_ENDSTOPS
-//#define DISABLE_MIN_ENDSTOPS
//===========================================================================
//============================= Z Probe Options =============================
@@ -717,9 +729,12 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l
// Host Keepalive
//
// By default Marlin will send a busy status message to the host
-// every 10 seconds when it can't accept commands.
+// every couple of seconds when it can't accept commands.
//
//#define DISABLE_HOST_KEEPALIVE // Enable this option if your host doesn't like keepalive messages.
+#if DISABLED(DISABLE_HOST_KEEPALIVE)
+ #define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113.
+#endif
//
// M100 Free Memory Watcher
diff --git a/Marlin/example_configurations/SCARA/Configuration_adv.h b/Marlin/example_configurations/SCARA/Configuration_adv.h
index 627067d775..7af0110991 100644
--- a/Marlin/example_configurations/SCARA/Configuration_adv.h
+++ b/Marlin/example_configurations/SCARA/Configuration_adv.h
@@ -201,9 +201,7 @@
//#define Z_DUAL_ENDSTOPS
#if ENABLED(Z_DUAL_ENDSTOPS)
- #define Z2_MAX_PIN 36 //Endstop used for Z2 axis. In this case I'm using XMAX in a Rumba Board (pin 36)
- const bool Z2_MAX_ENDSTOP_INVERTING = false;
- #define DISABLE_XMAX_ENDSTOP //Better to disable the XMAX to avoid conflict. Just rename "XMAX_ENDSTOP" by the endstop you are using for Z2 axis.
+ #define Z2_USE_ENDSTOP _XMAX_
#endif
#endif // Z_DUAL_STEPPER_DRIVERS
@@ -655,6 +653,38 @@ const unsigned int dropsegments = 5; //everything with less than this number of
#endif
+/**
+ * TWI/I2C BUS
+ *
+ * This feature is an EXPERIMENTAL feature so it shall not be used on production
+ * machines. Enabling this will allow you to send and receive I2C data from slave
+ * devices on the bus.
+ *
+ * ; Example #1
+ * ; This macro send the string "Marlin" to the slave device with address 0x63
+ * ; It uses multiple M155 commands with one B arg
+ * M155 A63 ; Target slave address
+ * M155 B77 ; M
+ * M155 B97 ; a
+ * M155 B114 ; r
+ * M155 B108 ; l
+ * M155 B105 ; i
+ * M155 B110 ; n
+ * M155 S1 ; Send the current buffer
+ *
+ * ; Example #2
+ * ; Request 6 bytes from slave device with address 0x63
+ * M156 A63 B5
+ *
+ * ; Example #3
+ * ; Example serial output of a M156 request
+ * echo:i2c-reply: from:63 bytes:5 data:hello
+ */
+
+// @section i2cbus
+
+//#define EXPERIMENTAL_I2CBUS
+
#include "Conditionals.h"
#include "SanityCheck.h"
diff --git a/Marlin/example_configurations/TAZ4/Configuration.h b/Marlin/example_configurations/TAZ4/Configuration.h
index 8c7fb0388c..38e7e20cf2 100644
--- a/Marlin/example_configurations/TAZ4/Configuration.h
+++ b/Marlin/example_configurations/TAZ4/Configuration.h
@@ -367,8 +367,22 @@
// Enable this option for Toshiba steppers
//#define CONFIG_STEPPERS_TOSHIBA
+//===========================================================================
+//============================== Endstop Settings ===========================
+//===========================================================================
+
// @section homing
+// Specify here all the endstop connectors that are connected to any endstop or probe.
+// Almost all printers will be using one per axis. Probes will use one or more of the
+// extra connectors. Leave undefined any used for non-endstop and non-probe purposes.
+#define USE_XMIN_PLUG
+#define USE_YMIN_PLUG
+#define USE_ZMIN_PLUG
+//#define USE_XMAX_PLUG
+//#define USE_YMAX_PLUG
+//#define USE_ZMAX_PLUG
+
// coarse Endstop Settings
#define ENDSTOPPULLUPS // Comment this out (using // at the start of the line) to disable the endstop pullup resistors
@@ -391,8 +405,6 @@ const bool X_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of
const bool Y_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop.
const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop.
const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the logic of the endstop.
-#define DISABLE_MAX_ENDSTOPS
-//#define DISABLE_MIN_ENDSTOPS
//===========================================================================
//============================= Z Probe Options =============================
@@ -730,9 +742,12 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l
// Host Keepalive
//
// By default Marlin will send a busy status message to the host
-// every 10 seconds when it can't accept commands.
+// every couple of seconds when it can't accept commands.
//
//#define DISABLE_HOST_KEEPALIVE // Enable this option if your host doesn't like keepalive messages.
+#if DISABLED(DISABLE_HOST_KEEPALIVE)
+ #define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113.
+#endif
//
// M100 Free Memory Watcher
diff --git a/Marlin/example_configurations/TAZ4/Configuration_adv.h b/Marlin/example_configurations/TAZ4/Configuration_adv.h
index c052253a10..f96f20236b 100644
--- a/Marlin/example_configurations/TAZ4/Configuration_adv.h
+++ b/Marlin/example_configurations/TAZ4/Configuration_adv.h
@@ -209,9 +209,7 @@
//#define Z_DUAL_ENDSTOPS
#if ENABLED(Z_DUAL_ENDSTOPS)
- #define Z2_MAX_PIN 36 //Endstop used for Z2 axis. In this case I'm using XMAX in a Rumba Board (pin 36)
- const bool Z2_MAX_ENDSTOP_INVERTING = false;
- #define DISABLE_XMAX_ENDSTOP //Better to disable the XMAX to avoid conflict. Just rename "XMAX_ENDSTOP" by the endstop you are using for Z2 axis.
+ #define Z2_USE_ENDSTOP _XMAX_
#endif
#endif // Z_DUAL_STEPPER_DRIVERS
@@ -663,6 +661,38 @@ const unsigned int dropsegments = 5; //everything with less than this number of
#endif
+/**
+ * TWI/I2C BUS
+ *
+ * This feature is an EXPERIMENTAL feature so it shall not be used on production
+ * machines. Enabling this will allow you to send and receive I2C data from slave
+ * devices on the bus.
+ *
+ * ; Example #1
+ * ; This macro send the string "Marlin" to the slave device with address 0x63
+ * ; It uses multiple M155 commands with one B arg
+ * M155 A63 ; Target slave address
+ * M155 B77 ; M
+ * M155 B97 ; a
+ * M155 B114 ; r
+ * M155 B108 ; l
+ * M155 B105 ; i
+ * M155 B110 ; n
+ * M155 S1 ; Send the current buffer
+ *
+ * ; Example #2
+ * ; Request 6 bytes from slave device with address 0x63
+ * M156 A63 B5
+ *
+ * ; Example #3
+ * ; Example serial output of a M156 request
+ * echo:i2c-reply: from:63 bytes:5 data:hello
+ */
+
+// @section i2cbus
+
+//#define EXPERIMENTAL_I2CBUS
+
#include "Conditionals.h"
#include "SanityCheck.h"
diff --git a/Marlin/example_configurations/WITBOX/Configuration.h b/Marlin/example_configurations/WITBOX/Configuration.h
index 9d6c5b7f2d..fd3fa38d09 100644
--- a/Marlin/example_configurations/WITBOX/Configuration.h
+++ b/Marlin/example_configurations/WITBOX/Configuration.h
@@ -338,8 +338,22 @@
// Enable this option for Toshiba steppers
//#define CONFIG_STEPPERS_TOSHIBA
+//===========================================================================
+//============================== Endstop Settings ===========================
+//===========================================================================
+
// @section homing
+// Specify here all the endstop connectors that are connected to any endstop or probe.
+// Almost all printers will be using one per axis. Probes will use one or more of the
+// extra connectors. Leave undefined any used for non-endstop and non-probe purposes.
+#define USE_XMIN_PLUG
+#define USE_YMIN_PLUG
+#define USE_ZMIN_PLUG
+//#define USE_XMAX_PLUG
+//#define USE_YMAX_PLUG
+//#define USE_ZMAX_PLUG
+
// coarse Endstop Settings
#define ENDSTOPPULLUPS // Comment this out (using // at the start of the line) to disable the endstop pullup resistors
@@ -362,8 +376,6 @@ const bool X_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of
const bool Y_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop.
const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop.
const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop.
-//#define DISABLE_MAX_ENDSTOPS
-//#define DISABLE_MIN_ENDSTOPS
//===========================================================================
//============================= Z Probe Options =============================
@@ -701,9 +713,12 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo
// Host Keepalive
//
// By default Marlin will send a busy status message to the host
-// every 10 seconds when it can't accept commands.
+// every couple of seconds when it can't accept commands.
//
//#define DISABLE_HOST_KEEPALIVE // Enable this option if your host doesn't like keepalive messages.
+#if DISABLED(DISABLE_HOST_KEEPALIVE)
+ #define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113.
+#endif
//
// M100 Free Memory Watcher
diff --git a/Marlin/example_configurations/WITBOX/Configuration_adv.h b/Marlin/example_configurations/WITBOX/Configuration_adv.h
index fcdee236a9..ab8000a88b 100644
--- a/Marlin/example_configurations/WITBOX/Configuration_adv.h
+++ b/Marlin/example_configurations/WITBOX/Configuration_adv.h
@@ -201,9 +201,7 @@
//#define Z_DUAL_ENDSTOPS
#if ENABLED(Z_DUAL_ENDSTOPS)
- #define Z2_MAX_PIN 36 //Endstop used for Z2 axis. In this case I'm using XMAX in a Rumba Board (pin 36)
- const bool Z2_MAX_ENDSTOP_INVERTING = false;
- #define DISABLE_XMAX_ENDSTOP //Better to disable the XMAX to avoid conflict. Just rename "XMAX_ENDSTOP" by the endstop you are using for Z2 axis.
+ #define Z2_USE_ENDSTOP _XMAX_
#endif
#endif // Z_DUAL_STEPPER_DRIVERS
@@ -655,6 +653,38 @@ const unsigned int dropsegments = 5; //everything with less than this number of
#endif
+/**
+ * TWI/I2C BUS
+ *
+ * This feature is an EXPERIMENTAL feature so it shall not be used on production
+ * machines. Enabling this will allow you to send and receive I2C data from slave
+ * devices on the bus.
+ *
+ * ; Example #1
+ * ; This macro send the string "Marlin" to the slave device with address 0x63
+ * ; It uses multiple M155 commands with one B arg
+ * M155 A63 ; Target slave address
+ * M155 B77 ; M
+ * M155 B97 ; a
+ * M155 B114 ; r
+ * M155 B108 ; l
+ * M155 B105 ; i
+ * M155 B110 ; n
+ * M155 S1 ; Send the current buffer
+ *
+ * ; Example #2
+ * ; Request 6 bytes from slave device with address 0x63
+ * M156 A63 B5
+ *
+ * ; Example #3
+ * ; Example serial output of a M156 request
+ * echo:i2c-reply: from:63 bytes:5 data:hello
+ */
+
+// @section i2cbus
+
+//#define EXPERIMENTAL_I2CBUS
+
#include "Conditionals.h"
#include "SanityCheck.h"
diff --git a/Marlin/example_configurations/adafruit/ST7565/Configuration.h b/Marlin/example_configurations/adafruit/ST7565/Configuration.h
index 8effe9d891..052008aa58 100644
--- a/Marlin/example_configurations/adafruit/ST7565/Configuration.h
+++ b/Marlin/example_configurations/adafruit/ST7565/Configuration.h
@@ -346,8 +346,22 @@
// Enable this option for Toshiba steppers
//#define CONFIG_STEPPERS_TOSHIBA
+//===========================================================================
+//============================== Endstop Settings ===========================
+//===========================================================================
+
// @section homing
+// Specify here all the endstop connectors that are connected to any endstop or probe.
+// Almost all printers will be using one per axis. Probes will use one or more of the
+// extra connectors. Leave undefined any used for non-endstop and non-probe purposes.
+#define USE_XMIN_PLUG
+#define USE_YMIN_PLUG
+#define USE_ZMIN_PLUG
+//#define USE_XMAX_PLUG
+//#define USE_YMAX_PLUG
+//#define USE_ZMAX_PLUG
+
// coarse Endstop Settings
#define ENDSTOPPULLUPS // Comment this out (using // at the start of the line) to disable the endstop pullup resistors
@@ -370,8 +384,6 @@ const bool X_MAX_ENDSTOP_INVERTING = false; // set to true to invert the logic o
const bool Y_MAX_ENDSTOP_INVERTING = false; // set to true to invert the logic of the endstop.
const bool Z_MAX_ENDSTOP_INVERTING = false; // set to true to invert the logic of the endstop.
const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the logic of the endstop.
-//#define DISABLE_MAX_ENDSTOPS
-//#define DISABLE_MIN_ENDSTOPS
//===========================================================================
//============================= Z Probe Options =============================
@@ -709,9 +721,12 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l
// Host Keepalive
//
// By default Marlin will send a busy status message to the host
-// every 10 seconds when it can't accept commands.
+// every couple of seconds when it can't accept commands.
//
//#define DISABLE_HOST_KEEPALIVE // Enable this option if your host doesn't like keepalive messages.
+#if DISABLED(DISABLE_HOST_KEEPALIVE)
+ #define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113.
+#endif
//
// M100 Free Memory Watcher
diff --git a/Marlin/example_configurations/delta/biv2.5/Configuration.h b/Marlin/example_configurations/delta/biv2.5/Configuration.h
index feff6f4b74..ce1bbf5cc3 100644
--- a/Marlin/example_configurations/delta/biv2.5/Configuration.h
+++ b/Marlin/example_configurations/delta/biv2.5/Configuration.h
@@ -381,8 +381,22 @@
// Enable this option for Toshiba steppers
//#define CONFIG_STEPPERS_TOSHIBA
+//===========================================================================
+//============================== Endstop Settings ===========================
+//===========================================================================
+
// @section homing
+// Specify here all the endstop connectors that are connected to any endstop or probe.
+// Almost all printers will be using one per axis. Probes will use one or more of the
+// extra connectors. Leave undefined any used for non-endstop and non-probe purposes.
+//#define USE_XMIN_PLUG
+//#define USE_YMIN_PLUG
+//#define USE_ZMIN_PLUG
+#define USE_XMAX_PLUG
+#define USE_YMAX_PLUG
+#define USE_ZMAX_PLUG
+
// coarse Endstop Settings
#define ENDSTOPPULLUPS // Comment this out (using // at the start of the line) to disable the endstop pullup resistors
@@ -405,8 +419,6 @@ const bool X_MAX_ENDSTOP_INVERTING = false; // set to true to invert the logic o
const bool Y_MAX_ENDSTOP_INVERTING = false; // set to true to invert the logic of the endstop.
const bool Z_MAX_ENDSTOP_INVERTING = false; // set to true to invert the logic of the endstop.
const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop.
-//#define DISABLE_MAX_ENDSTOPS
-#define DISABLE_MIN_ENDSTOPS // Deltas only use min endstops for probing.
//===========================================================================
//============================= Z Probe Options =============================
@@ -831,9 +843,12 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo
// Host Keepalive
//
// By default Marlin will send a busy status message to the host
-// every 10 seconds when it can't accept commands.
+// every couple of seconds when it can't accept commands.
//
//#define DISABLE_HOST_KEEPALIVE // Enable this option if your host doesn't like keepalive messages.
+#if DISABLED(DISABLE_HOST_KEEPALIVE)
+ #define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113.
+#endif
//
// M100 Free Memory Watcher
diff --git a/Marlin/example_configurations/delta/biv2.5/Configuration_adv.h b/Marlin/example_configurations/delta/biv2.5/Configuration_adv.h
index 85734dc416..da192eb81a 100644
--- a/Marlin/example_configurations/delta/biv2.5/Configuration_adv.h
+++ b/Marlin/example_configurations/delta/biv2.5/Configuration_adv.h
@@ -201,9 +201,7 @@
//#define Z_DUAL_ENDSTOPS
#if ENABLED(Z_DUAL_ENDSTOPS)
- #define Z2_MAX_PIN 36 //Endstop used for Z2 axis. In this case I'm using XMAX in a Rumba Board (pin 36)
- const bool Z2_MAX_ENDSTOP_INVERTING = false;
- #define DISABLE_XMAX_ENDSTOP //Better to disable the XMAX to avoid conflict. Just rename "XMAX_ENDSTOP" by the endstop you are using for Z2 axis.
+ #define Z2_USE_ENDSTOP _XMAX_
#endif
#endif // Z_DUAL_STEPPER_DRIVERS
@@ -657,6 +655,38 @@ const unsigned int dropsegments = 5; //everything with less than this number of
#endif
+/**
+ * TWI/I2C BUS
+ *
+ * This feature is an EXPERIMENTAL feature so it shall not be used on production
+ * machines. Enabling this will allow you to send and receive I2C data from slave
+ * devices on the bus.
+ *
+ * ; Example #1
+ * ; This macro send the string "Marlin" to the slave device with address 0x63
+ * ; It uses multiple M155 commands with one B arg
+ * M155 A63 ; Target slave address
+ * M155 B77 ; M
+ * M155 B97 ; a
+ * M155 B114 ; r
+ * M155 B108 ; l
+ * M155 B105 ; i
+ * M155 B110 ; n
+ * M155 S1 ; Send the current buffer
+ *
+ * ; Example #2
+ * ; Request 6 bytes from slave device with address 0x63
+ * M156 A63 B5
+ *
+ * ; Example #3
+ * ; Example serial output of a M156 request
+ * echo:i2c-reply: from:63 bytes:5 data:hello
+ */
+
+// @section i2cbus
+
+//#define EXPERIMENTAL_I2CBUS
+
#include "Conditionals.h"
#include "SanityCheck.h"
diff --git a/Marlin/example_configurations/delta/generic/Configuration.h b/Marlin/example_configurations/delta/generic/Configuration.h
index 93d7f8ad7d..bc323fd5a5 100644
--- a/Marlin/example_configurations/delta/generic/Configuration.h
+++ b/Marlin/example_configurations/delta/generic/Configuration.h
@@ -381,8 +381,22 @@
// Enable this option for Toshiba steppers
//#define CONFIG_STEPPERS_TOSHIBA
+//===========================================================================
+//============================== Endstop Settings ===========================
+//===========================================================================
+
// @section homing
+// Specify here all the endstop connectors that are connected to any endstop or probe.
+// Almost all printers will be using one per axis. Probes will use one or more of the
+// extra connectors. Leave undefined any used for non-endstop and non-probe purposes.
+//#define USE_XMIN_PLUG
+//#define USE_YMIN_PLUG
+#define USE_ZMIN_PLUG // a Z probe
+#define USE_XMAX_PLUG
+#define USE_YMAX_PLUG
+#define USE_ZMAX_PLUG
+
// coarse Endstop Settings
#define ENDSTOPPULLUPS // Comment this out (using // at the start of the line) to disable the endstop pullup resistors
@@ -405,8 +419,6 @@ const bool X_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of
const bool Y_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop.
const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop.
const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop.
-//#define DISABLE_MAX_ENDSTOPS
-#define DISABLE_MIN_ENDSTOPS // Deltas only use min endstops for probing.
//===========================================================================
//============================= Z Probe Options =============================
@@ -831,9 +843,12 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo
// Host Keepalive
//
// By default Marlin will send a busy status message to the host
-// every 10 seconds when it can't accept commands.
+// every couple of seconds when it can't accept commands.
//
//#define DISABLE_HOST_KEEPALIVE // Enable this option if your host doesn't like keepalive messages.
+#if DISABLED(DISABLE_HOST_KEEPALIVE)
+ #define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113.
+#endif
//
// M100 Free Memory Watcher
diff --git a/Marlin/example_configurations/delta/generic/Configuration_adv.h b/Marlin/example_configurations/delta/generic/Configuration_adv.h
index 006502e7a5..b2bf328571 100644
--- a/Marlin/example_configurations/delta/generic/Configuration_adv.h
+++ b/Marlin/example_configurations/delta/generic/Configuration_adv.h
@@ -201,9 +201,7 @@
//#define Z_DUAL_ENDSTOPS
#if ENABLED(Z_DUAL_ENDSTOPS)
- #define Z2_MAX_PIN 36 //Endstop used for Z2 axis. In this case I'm using XMAX in a Rumba Board (pin 36)
- const bool Z2_MAX_ENDSTOP_INVERTING = false;
- #define DISABLE_XMAX_ENDSTOP //Better to disable the XMAX to avoid conflict. Just rename "XMAX_ENDSTOP" by the endstop you are using for Z2 axis.
+ #define Z2_USE_ENDSTOP _XMAX_
#endif
#endif // Z_DUAL_STEPPER_DRIVERS
@@ -657,6 +655,38 @@ const unsigned int dropsegments = 5; //everything with less than this number of
#endif
+/**
+ * TWI/I2C BUS
+ *
+ * This feature is an EXPERIMENTAL feature so it shall not be used on production
+ * machines. Enabling this will allow you to send and receive I2C data from slave
+ * devices on the bus.
+ *
+ * ; Example #1
+ * ; This macro send the string "Marlin" to the slave device with address 0x63
+ * ; It uses multiple M155 commands with one B arg
+ * M155 A63 ; Target slave address
+ * M155 B77 ; M
+ * M155 B97 ; a
+ * M155 B114 ; r
+ * M155 B108 ; l
+ * M155 B105 ; i
+ * M155 B110 ; n
+ * M155 S1 ; Send the current buffer
+ *
+ * ; Example #2
+ * ; Request 6 bytes from slave device with address 0x63
+ * M156 A63 B5
+ *
+ * ; Example #3
+ * ; Example serial output of a M156 request
+ * echo:i2c-reply: from:63 bytes:5 data:hello
+ */
+
+// @section i2cbus
+
+//#define EXPERIMENTAL_I2CBUS
+
#include "Conditionals.h"
#include "SanityCheck.h"
diff --git a/Marlin/example_configurations/delta/kossel_mini/Configuration.h b/Marlin/example_configurations/delta/kossel_mini/Configuration.h
index cde4707f30..fbaa538e96 100644
--- a/Marlin/example_configurations/delta/kossel_mini/Configuration.h
+++ b/Marlin/example_configurations/delta/kossel_mini/Configuration.h
@@ -381,8 +381,22 @@
// Enable this option for Toshiba steppers
//#define CONFIG_STEPPERS_TOSHIBA
+//===========================================================================
+//============================== Endstop Settings ===========================
+//===========================================================================
+
// @section homing
+// Specify here all the endstop connectors that are connected to any endstop or probe.
+// Almost all printers will be using one per axis. Probes will use one or more of the
+// extra connectors. Leave undefined any used for non-endstop and non-probe purposes.
+//#define USE_XMIN_PLUG
+//#define USE_YMIN_PLUG
+//#define USE_ZMIN_PLUG
+#define USE_XMAX_PLUG
+#define USE_YMAX_PLUG
+#define USE_ZMAX_PLUG
+
// coarse Endstop Settings
#define ENDSTOPPULLUPS // Comment this out (using // at the start of the line) to disable the endstop pullup resistors
@@ -405,8 +419,6 @@ const bool X_MAX_ENDSTOP_INVERTING = false; // set to true to invert the logic o
const bool Y_MAX_ENDSTOP_INVERTING = false; // set to true to invert the logic of the endstop.
const bool Z_MAX_ENDSTOP_INVERTING = false; // set to true to invert the logic of the endstop.
const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the logic of the endstop.
-//#define DISABLE_MAX_ENDSTOPS
-//#define DISABLE_MIN_ENDSTOPS // Deltas only use min endstops for probing.
//===========================================================================
//============================= Z Probe Options =============================
@@ -835,9 +847,12 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l
// Host Keepalive
//
// By default Marlin will send a busy status message to the host
-// every 10 seconds when it can't accept commands.
+// every couple of seconds when it can't accept commands.
//
//#define DISABLE_HOST_KEEPALIVE // Enable this option if your host doesn't like keepalive messages.
+#if DISABLED(DISABLE_HOST_KEEPALIVE)
+ #define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113.
+#endif
//
// M100 Free Memory Watcher
diff --git a/Marlin/example_configurations/delta/kossel_mini/Configuration_adv.h b/Marlin/example_configurations/delta/kossel_mini/Configuration_adv.h
index 4b93e46474..fa0da7cdd3 100644
--- a/Marlin/example_configurations/delta/kossel_mini/Configuration_adv.h
+++ b/Marlin/example_configurations/delta/kossel_mini/Configuration_adv.h
@@ -201,9 +201,7 @@
//#define Z_DUAL_ENDSTOPS
#if ENABLED(Z_DUAL_ENDSTOPS)
- #define Z2_MAX_PIN 36 //Endstop used for Z2 axis. In this case I'm using XMAX in a Rumba Board (pin 36)
- const bool Z2_MAX_ENDSTOP_INVERTING = false;
- #define DISABLE_XMAX_ENDSTOP //Better to disable the XMAX to avoid conflict. Just rename "XMAX_ENDSTOP" by the endstop you are using for Z2 axis.
+ #define Z2_USE_ENDSTOP _XMAX_
#endif
#endif // Z_DUAL_STEPPER_DRIVERS
@@ -656,6 +654,38 @@ const unsigned int dropsegments = 5; //everything with less than this number of
#endif
+/**
+ * TWI/I2C BUS
+ *
+ * This feature is an EXPERIMENTAL feature so it shall not be used on production
+ * machines. Enabling this will allow you to send and receive I2C data from slave
+ * devices on the bus.
+ *
+ * ; Example #1
+ * ; This macro send the string "Marlin" to the slave device with address 0x63
+ * ; It uses multiple M155 commands with one B arg
+ * M155 A63 ; Target slave address
+ * M155 B77 ; M
+ * M155 B97 ; a
+ * M155 B114 ; r
+ * M155 B108 ; l
+ * M155 B105 ; i
+ * M155 B110 ; n
+ * M155 S1 ; Send the current buffer
+ *
+ * ; Example #2
+ * ; Request 6 bytes from slave device with address 0x63
+ * M156 A63 B5
+ *
+ * ; Example #3
+ * ; Example serial output of a M156 request
+ * echo:i2c-reply: from:63 bytes:5 data:hello
+ */
+
+// @section i2cbus
+
+//#define EXPERIMENTAL_I2CBUS
+
#include "Conditionals.h"
#include "SanityCheck.h"
diff --git a/Marlin/example_configurations/delta/kossel_pro/Configuration.h b/Marlin/example_configurations/delta/kossel_pro/Configuration.h
index 5255b7accc..aedcf72af2 100644
--- a/Marlin/example_configurations/delta/kossel_pro/Configuration.h
+++ b/Marlin/example_configurations/delta/kossel_pro/Configuration.h
@@ -370,8 +370,22 @@
// Enable this option for Toshiba steppers
//#define CONFIG_STEPPERS_TOSHIBA
+//===========================================================================
+//============================== Endstop Settings ===========================
+//===========================================================================
+
// @section homing
+// Specify here all the endstop connectors that are connected to any endstop or probe.
+// Almost all printers will be using one per axis. Probes will use one or more of the
+// extra connectors. Leave undefined any used for non-endstop and non-probe purposes.
+//#define USE_XMIN_PLUG
+//#define USE_YMIN_PLUG
+#define USE_ZMIN_PLUG // a Z probe
+#define USE_XMAX_PLUG
+#define USE_YMAX_PLUG
+#define USE_ZMAX_PLUG
+
// coarse Endstop Settings
#define ENDSTOPPULLUPS // Comment this out (using // at the start of the line) to disable the endstop pullup resistors
@@ -394,8 +408,6 @@ const bool X_MAX_ENDSTOP_INVERTING = false; // set to true to invert the logic o
const bool Y_MAX_ENDSTOP_INVERTING = false; // set to true to invert the logic of the endstop.
const bool Z_MAX_ENDSTOP_INVERTING = false; // set to true to invert the logic of the endstop.
const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the logic of the endstop.
-//#define DISABLE_MAX_ENDSTOPS
-//#define DISABLE_MIN_ENDSTOPS // Deltas only use min endstops for probing.
//===========================================================================
//============================= Z Probe Options =============================
@@ -828,9 +840,12 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l
// Host Keepalive
//
// By default Marlin will send a busy status message to the host
-// every 10 seconds when it can't accept commands.
+// every couple of seconds when it can't accept commands.
//
//#define DISABLE_HOST_KEEPALIVE // Enable this option if your host doesn't like keepalive messages.
+#if DISABLED(DISABLE_HOST_KEEPALIVE)
+ #define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113.
+#endif
//
// M100 Free Memory Watcher
diff --git a/Marlin/example_configurations/delta/kossel_pro/Configuration_adv.h b/Marlin/example_configurations/delta/kossel_pro/Configuration_adv.h
index b3fec75c5a..6ace77f421 100644
--- a/Marlin/example_configurations/delta/kossel_pro/Configuration_adv.h
+++ b/Marlin/example_configurations/delta/kossel_pro/Configuration_adv.h
@@ -206,9 +206,7 @@
//#define Z_DUAL_ENDSTOPS
#if ENABLED(Z_DUAL_ENDSTOPS)
- #define Z2_MAX_PIN 36 //Endstop used for Z2 axis. In this case I'm using XMAX in a Rumba Board (pin 36)
- const bool Z2_MAX_ENDSTOP_INVERTING = false;
- #define DISABLE_XMAX_ENDSTOP //Better to disable the XMAX to avoid conflict. Just rename "XMAX_ENDSTOP" by the endstop you are using for Z2 axis.
+ #define Z2_USE_ENDSTOP _XMAX_
#endif
#endif // Z_DUAL_STEPPER_DRIVERS
@@ -661,6 +659,38 @@ const unsigned int dropsegments = 5; //everything with less than this number of
#endif
+/**
+ * TWI/I2C BUS
+ *
+ * This feature is an EXPERIMENTAL feature so it shall not be used on production
+ * machines. Enabling this will allow you to send and receive I2C data from slave
+ * devices on the bus.
+ *
+ * ; Example #1
+ * ; This macro send the string "Marlin" to the slave device with address 0x63
+ * ; It uses multiple M155 commands with one B arg
+ * M155 A63 ; Target slave address
+ * M155 B77 ; M
+ * M155 B97 ; a
+ * M155 B114 ; r
+ * M155 B108 ; l
+ * M155 B105 ; i
+ * M155 B110 ; n
+ * M155 S1 ; Send the current buffer
+ *
+ * ; Example #2
+ * ; Request 6 bytes from slave device with address 0x63
+ * M156 A63 B5
+ *
+ * ; Example #3
+ * ; Example serial output of a M156 request
+ * echo:i2c-reply: from:63 bytes:5 data:hello
+ */
+
+// @section i2cbus
+
+//#define EXPERIMENTAL_I2CBUS
+
#include "Conditionals.h"
#include "SanityCheck.h"
diff --git a/Marlin/example_configurations/delta/kossel_xl/Configuration.h b/Marlin/example_configurations/delta/kossel_xl/Configuration.h
index f7ee5404cc..cba52bf4af 100644
--- a/Marlin/example_configurations/delta/kossel_xl/Configuration.h
+++ b/Marlin/example_configurations/delta/kossel_xl/Configuration.h
@@ -374,8 +374,22 @@
// Enable this option for Toshiba steppers
//#define CONFIG_STEPPERS_TOSHIBA
+//===========================================================================
+//============================== Endstop Settings ===========================
+//===========================================================================
+
// @section homing
+// Specify here all the endstop connectors that are connected to any endstop or probe.
+// Almost all printers will be using one per axis. Probes will use one or more of the
+// extra connectors. Leave undefined any used for non-endstop and non-probe purposes.
+//#define USE_XMIN_PLUG
+//#define USE_YMIN_PLUG
+#define USE_ZMIN_PLUG // a Z probe
+#define USE_XMAX_PLUG
+#define USE_YMAX_PLUG
+#define USE_ZMAX_PLUG
+
// coarse Endstop Settings
//#define ENDSTOPPULLUPS // Comment this out (using // at the start of the line) to disable the endstop pullup resistors
@@ -398,8 +412,6 @@ const bool X_MAX_ENDSTOP_INVERTING = false; // set to true to invert the logic o
const bool Y_MAX_ENDSTOP_INVERTING = false; // set to true to invert the logic of the endstop.
const bool Z_MAX_ENDSTOP_INVERTING = false; // set to true to invert the logic of the endstop.
const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the logic of the endstop.
-//#define DISABLE_MAX_ENDSTOPS
-//#define DISABLE_MIN_ENDSTOPS
//===========================================================================
//============================= Z Probe Options =============================
@@ -745,9 +757,12 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l
// Host Keepalive
//
// By default Marlin will send a busy status message to the host
-// every 10 seconds when it can't accept commands.
+// every couple of seconds when it can't accept commands.
//
//#define DISABLE_HOST_KEEPALIVE // Enable this option if your host doesn't like keepalive messages.
+#if DISABLED(DISABLE_HOST_KEEPALIVE)
+ #define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113.
+#endif
//
// M100 Free Memory Watcher
diff --git a/Marlin/example_configurations/delta/kossel_xl/Configuration_adv.h b/Marlin/example_configurations/delta/kossel_xl/Configuration_adv.h
index 44e7942eb2..f42f877014 100644
--- a/Marlin/example_configurations/delta/kossel_xl/Configuration_adv.h
+++ b/Marlin/example_configurations/delta/kossel_xl/Configuration_adv.h
@@ -201,9 +201,7 @@
//#define Z_DUAL_ENDSTOPS
#if ENABLED(Z_DUAL_ENDSTOPS)
- #define Z2_MAX_PIN 36 //Endstop used for Z2 axis. In this case I'm using XMAX in a Rumba Board (pin 36)
- const bool Z2_MAX_ENDSTOP_INVERTING = false;
- #define DISABLE_XMAX_ENDSTOP //Better to disable the XMAX to avoid conflict. Just rename "XMAX_ENDSTOP" by the endstop you are using for Z2 axis.
+ #define Z2_USE_ENDSTOP _XMAX_
#endif
#endif // Z_DUAL_STEPPER_DRIVERS
@@ -655,6 +653,38 @@ const unsigned int dropsegments = 5; //everything with less than this number of
#endif
+/**
+ * TWI/I2C BUS
+ *
+ * This feature is an EXPERIMENTAL feature so it shall not be used on production
+ * machines. Enabling this will allow you to send and receive I2C data from slave
+ * devices on the bus.
+ *
+ * ; Example #1
+ * ; This macro send the string "Marlin" to the slave device with address 0x63
+ * ; It uses multiple M155 commands with one B arg
+ * M155 A63 ; Target slave address
+ * M155 B77 ; M
+ * M155 B97 ; a
+ * M155 B114 ; r
+ * M155 B108 ; l
+ * M155 B105 ; i
+ * M155 B110 ; n
+ * M155 S1 ; Send the current buffer
+ *
+ * ; Example #2
+ * ; Request 6 bytes from slave device with address 0x63
+ * M156 A63 B5
+ *
+ * ; Example #3
+ * ; Example serial output of a M156 request
+ * echo:i2c-reply: from:63 bytes:5 data:hello
+ */
+
+// @section i2cbus
+
+//#define EXPERIMENTAL_I2CBUS
+
#include "Conditionals.h"
#include "SanityCheck.h"
diff --git a/Marlin/example_configurations/makibox/Configuration.h b/Marlin/example_configurations/makibox/Configuration.h
index bd550066c7..301c7d9b6f 100644
--- a/Marlin/example_configurations/makibox/Configuration.h
+++ b/Marlin/example_configurations/makibox/Configuration.h
@@ -349,8 +349,22 @@
// Enable this option for Toshiba steppers
//#define CONFIG_STEPPERS_TOSHIBA
+//===========================================================================
+//============================== Endstop Settings ===========================
+//===========================================================================
+
// @section homing
+// Specify here all the endstop connectors that are connected to any endstop or probe.
+// Almost all printers will be using one per axis. Probes will use one or more of the
+// extra connectors. Leave undefined any used for non-endstop and non-probe purposes.
+#define USE_XMIN_PLUG
+#define USE_YMIN_PLUG
+#define USE_ZMIN_PLUG
+//#define USE_XMAX_PLUG
+//#define USE_YMAX_PLUG
+//#define USE_ZMAX_PLUG
+
// coarse Endstop Settings
#define ENDSTOPPULLUPS // Comment this out (using // at the start of the line) to disable the endstop pullup resistors
@@ -373,8 +387,6 @@ const bool X_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of
const bool Y_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop.
const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop.
const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the logic of the endstop.
-//#define DISABLE_MAX_ENDSTOPS
-//#define DISABLE_MIN_ENDSTOPS
//===========================================================================
//============================= Z Probe Options =============================
@@ -712,9 +724,12 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = false; // set to true to invert the l
// Host Keepalive
//
// By default Marlin will send a busy status message to the host
-// every 10 seconds when it can't accept commands.
+// every couple of seconds when it can't accept commands.
//
//#define DISABLE_HOST_KEEPALIVE // Enable this option if your host doesn't like keepalive messages.
+#if DISABLED(DISABLE_HOST_KEEPALIVE)
+ #define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113.
+#endif
//
// M100 Free Memory Watcher
diff --git a/Marlin/example_configurations/makibox/Configuration_adv.h b/Marlin/example_configurations/makibox/Configuration_adv.h
index 9b131b3298..16f00bbf9b 100644
--- a/Marlin/example_configurations/makibox/Configuration_adv.h
+++ b/Marlin/example_configurations/makibox/Configuration_adv.h
@@ -201,9 +201,7 @@
//#define Z_DUAL_ENDSTOPS
#if ENABLED(Z_DUAL_ENDSTOPS)
- #define Z2_MAX_PIN 36 //Endstop used for Z2 axis. In this case I'm using XMAX in a Rumba Board (pin 36)
- const bool Z2_MAX_ENDSTOP_INVERTING = false;
- #define DISABLE_XMAX_ENDSTOP //Better to disable the XMAX to avoid conflict. Just rename "XMAX_ENDSTOP" by the endstop you are using for Z2 axis.
+ #define Z2_USE_ENDSTOP _XMAX_
#endif
#endif // Z_DUAL_STEPPER_DRIVERS
@@ -655,6 +653,38 @@ const unsigned int dropsegments = 5; //everything with less than this number of
#endif
+/**
+ * TWI/I2C BUS
+ *
+ * This feature is an EXPERIMENTAL feature so it shall not be used on production
+ * machines. Enabling this will allow you to send and receive I2C data from slave
+ * devices on the bus.
+ *
+ * ; Example #1
+ * ; This macro send the string "Marlin" to the slave device with address 0x63
+ * ; It uses multiple M155 commands with one B arg
+ * M155 A63 ; Target slave address
+ * M155 B77 ; M
+ * M155 B97 ; a
+ * M155 B114 ; r
+ * M155 B108 ; l
+ * M155 B105 ; i
+ * M155 B110 ; n
+ * M155 S1 ; Send the current buffer
+ *
+ * ; Example #2
+ * ; Request 6 bytes from slave device with address 0x63
+ * M156 A63 B5
+ *
+ * ; Example #3
+ * ; Example serial output of a M156 request
+ * echo:i2c-reply: from:63 bytes:5 data:hello
+ */
+
+// @section i2cbus
+
+//#define EXPERIMENTAL_I2CBUS
+
#include "Conditionals.h"
#include "SanityCheck.h"
diff --git a/Marlin/example_configurations/tvrrug/Round2/Configuration.h b/Marlin/example_configurations/tvrrug/Round2/Configuration.h
index b7431e9d25..f162ff7b60 100644
--- a/Marlin/example_configurations/tvrrug/Round2/Configuration.h
+++ b/Marlin/example_configurations/tvrrug/Round2/Configuration.h
@@ -336,8 +336,22 @@
// Enable this option for Toshiba steppers
#define CONFIG_STEPPERS_TOSHIBA
+//===========================================================================
+//============================== Endstop Settings ===========================
+//===========================================================================
+
// @section homing
+// Specify here all the endstop connectors that are connected to any endstop or probe.
+// Almost all printers will be using one per axis. Probes will use one or more of the
+// extra connectors. Leave undefined any used for non-endstop and non-probe purposes.
+#define USE_XMIN_PLUG
+#define USE_YMIN_PLUG
+#define USE_ZMIN_PLUG
+//#define USE_XMAX_PLUG
+//#define USE_YMAX_PLUG
+//#define USE_ZMAX_PLUG
+
// coarse Endstop Settings
#define ENDSTOPPULLUPS // Comment this out (using // at the start of the line) to disable the endstop pullup resistors
@@ -360,8 +374,6 @@ const bool X_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of
const bool Y_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop.
const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop.
const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the logic of the endstop.
-//#define DISABLE_MAX_ENDSTOPS
-//#define DISABLE_MIN_ENDSTOPS
//===========================================================================
//============================= Z Probe Options =============================
@@ -703,9 +715,12 @@ const bool Z_MIN_PROBE_ENDSTOP_INVERTING = true; // set to true to invert the lo
// Host Keepalive
//
// By default Marlin will send a busy status message to the host
-// every 10 seconds when it can't accept commands.
+// every couple of seconds when it can't accept commands.
//
//#define DISABLE_HOST_KEEPALIVE // Enable this option if your host doesn't like keepalive messages.
+#if DISABLED(DISABLE_HOST_KEEPALIVE)
+ #define DEFAULT_KEEPALIVE_INTERVAL 2 // Number of seconds between "busy" messages. Set with M113.
+#endif
//
// M100 Free Memory Watcher
diff --git a/Marlin/example_configurations/tvrrug/Round2/Configuration_adv.h b/Marlin/example_configurations/tvrrug/Round2/Configuration_adv.h
index 37d3bd81e2..c8ddbd603c 100644
--- a/Marlin/example_configurations/tvrrug/Round2/Configuration_adv.h
+++ b/Marlin/example_configurations/tvrrug/Round2/Configuration_adv.h
@@ -201,9 +201,7 @@
//#define Z_DUAL_ENDSTOPS
#if ENABLED(Z_DUAL_ENDSTOPS)
- #define Z2_MAX_PIN 36 //Endstop used for Z2 axis. In this case I'm using XMAX in a Rumba Board (pin 36)
- const bool Z2_MAX_ENDSTOP_INVERTING = false;
- #define DISABLE_XMAX_ENDSTOP //Better to disable the XMAX to avoid conflict. Just rename "XMAX_ENDSTOP" by the endstop you are using for Z2 axis.
+ #define Z2_USE_ENDSTOP _XMAX_
#endif
#endif // Z_DUAL_STEPPER_DRIVERS
@@ -655,6 +653,38 @@ const unsigned int dropsegments = 5; //everything with less than this number of
#endif
+/**
+ * TWI/I2C BUS
+ *
+ * This feature is an EXPERIMENTAL feature so it shall not be used on production
+ * machines. Enabling this will allow you to send and receive I2C data from slave
+ * devices on the bus.
+ *
+ * ; Example #1
+ * ; This macro send the string "Marlin" to the slave device with address 0x63
+ * ; It uses multiple M155 commands with one B arg
+ * M155 A63 ; Target slave address
+ * M155 B77 ; M
+ * M155 B97 ; a
+ * M155 B114 ; r
+ * M155 B108 ; l
+ * M155 B105 ; i
+ * M155 B110 ; n
+ * M155 S1 ; Send the current buffer
+ *
+ * ; Example #2
+ * ; Request 6 bytes from slave device with address 0x63
+ * M156 A63 B5
+ *
+ * ; Example #3
+ * ; Example serial output of a M156 request
+ * echo:i2c-reply: from:63 bytes:5 data:hello
+ */
+
+// @section i2cbus
+
+//#define EXPERIMENTAL_I2CBUS
+
#include "Conditionals.h"
#include "SanityCheck.h"
diff --git a/Marlin/fonts/README.fonts b/Marlin/fonts/README.fonts
index 1d1cda4ce4..971275d187 100644
--- a/Marlin/fonts/README.fonts
+++ b/Marlin/fonts/README.fonts
@@ -21,6 +21,3 @@ For the second half of the font we now support up to 11x11 pixel.
#else // fall-back
* Add your font to the list of permitted fonts in 'language_en.h'
... || ENABLED(DISPLAY_CHARSET_YOUR_NEW_FONT) ... )
-
-
-Especially the Kana font should be revised by someone who knows what he/she does. I am only a west-European with very little knowledge about this script.
diff --git a/Marlin/language.h b/Marlin/language.h
index 5d8033e363..9085a6a85f 100644
--- a/Marlin/language.h
+++ b/Marlin/language.h
@@ -82,6 +82,12 @@
#endif
#ifndef DEFAULT_SOURCE_URL
+ /**
+ * The SOURCE_CODE_URL is the location where users will find the Marlin Source
+ * Code which is installed on the device. In most cases —unless the manufacturer
+ * has a distinct Github fork— the Source Code URL should just be the main
+ * Marlin repository.
+ */
#define DEFAULT_SOURCE_URL "https://github.com/MarlinFirmware/Marlin"
#endif
@@ -225,7 +231,7 @@
#define MSG_T_MINTEMP "MINTEMP triggered"
// Debug
-#define MSG_DEBUG_PREFIX "DEBUG: "
+#define MSG_DEBUG_PREFIX "DEBUG:"
#define MSG_DEBUG_OFF "off"
#define MSG_DEBUG_ECHO "ECHO"
#define MSG_DEBUG_INFO "INFO"
diff --git a/Marlin/language_an.h b/Marlin/language_an.h
index 8170698dbe..17e32ef8da 100644
--- a/Marlin/language_an.h
+++ b/Marlin/language_an.h
@@ -45,6 +45,7 @@
#define MSG_LEVEL_BED_HOMING "Homing XYZ"
#define MSG_LEVEL_BED_WAITING "Click to Begin"
#define MSG_LEVEL_BED_DONE "Leveling Done!"
+#define MSG_LEVEL_BED_CANCEL "Cancel"
#define MSG_SET_HOME_OFFSETS "Set home offsets"
#define MSG_HOME_OFFSETS_APPLIED "Offsets applied"
#define MSG_SET_ORIGIN "Establir zero"
diff --git a/Marlin/language_bg.h b/Marlin/language_bg.h
index 784dbd0b07..062deb0dea 100644
--- a/Marlin/language_bg.h
+++ b/Marlin/language_bg.h
@@ -45,6 +45,7 @@
#define MSG_LEVEL_BED_HOMING "Homing XYZ"
#define MSG_LEVEL_BED_WAITING "Click to Begin"
#define MSG_LEVEL_BED_DONE "Leveling Done!"
+#define MSG_LEVEL_BED_CANCEL "Cancel"
#define MSG_SET_HOME_OFFSETS "Задай Начало"
#define MSG_HOME_OFFSETS_APPLIED "Offsets applied"
#define MSG_SET_ORIGIN "Изходна точка"
diff --git a/Marlin/language_ca.h b/Marlin/language_ca.h
index b79c8e2fca..77fab60d8a 100644
--- a/Marlin/language_ca.h
+++ b/Marlin/language_ca.h
@@ -46,6 +46,7 @@
#define MSG_LEVEL_BED_HOMING "Homing XYZ"
#define MSG_LEVEL_BED_WAITING "Click to Begin"
#define MSG_LEVEL_BED_DONE "Leveling Done!"
+#define MSG_LEVEL_BED_CANCEL "Cancel"
#define MSG_SET_HOME_OFFSETS "Set home offsets"
#define MSG_HOME_OFFSETS_APPLIED "Offsets applied"
#define MSG_SET_ORIGIN "Establir origen"
diff --git a/Marlin/language_cn.h b/Marlin/language_cn.h
index 8e0bf08245..3473d73ab0 100644
--- a/Marlin/language_cn.h
+++ b/Marlin/language_cn.h
@@ -43,6 +43,7 @@
#define MSG_LEVEL_BED_HOMING "Homing XYZ"
#define MSG_LEVEL_BED_WAITING "Click to Begin"
#define MSG_LEVEL_BED_DONE "Leveling Done!"
+#define MSG_LEVEL_BED_CANCEL "Cancel"
#define MSG_SET_HOME_OFFSETS "\xbe\xbf\xbb\xbc\xbd\xc0\xc1"
#define MSG_HOME_OFFSETS_APPLIED "Offsets applied"
#define MSG_SET_ORIGIN "\xbe\xbf\xbc\xbd"
diff --git a/Marlin/language_cz.h b/Marlin/language_cz.h
index 2e71d1f011..2cc2d2549f 100644
--- a/Marlin/language_cz.h
+++ b/Marlin/language_cz.h
@@ -47,10 +47,11 @@
#define MSG_DISABLE_STEPPERS "Uvolnit motory"
#define MSG_AUTO_HOME "Domovska pozice"
#define MSG_LEVEL_BED_HOMING "Mereni podlozky"
-#define MSG_LEVEL_BED_WAITING "Click to Begin"
-#define MSG_LEVEL_BED_DONE "Leveling Done!"
+#define MSG_LEVEL_BED_WAITING "Kliknutim spustte"
+#define MSG_LEVEL_BED_DONE "Mereni hotovo!"
+#define MSG_LEVEL_BED_CANCEL "Storno"
#define MSG_SET_HOME_OFFSETS "Nastavit ofsety"
-#define MSG_HOME_OFFSETS_APPLIED "Offsets applied"
+#define MSG_HOME_OFFSETS_APPLIED "Ofsety nastaveny"
#define MSG_SET_ORIGIN "Nastavit pocatek"
#define MSG_PREHEAT_PLA "Zahrat PLA"
#define MSG_PREHEAT_PLA_N MSG_PREHEAT_PLA " "
@@ -77,6 +78,7 @@
#define MSG_MOVE_1MM "Posunout o 1mm"
#define MSG_MOVE_10MM "Posunout o 10mm"
#define MSG_SPEED "Rychlost"
+#define MSG_BED_Z "Vyska podl."
#define MSG_NOZZLE "Tryska"
#define MSG_BED "Podlozka"
#define MSG_FAN_SPEED "Rychlost vent."
diff --git a/Marlin/language_da.h b/Marlin/language_da.h
index b7e4025911..2031d4e588 100644
--- a/Marlin/language_da.h
+++ b/Marlin/language_da.h
@@ -44,10 +44,11 @@
#define MSG_COOLDOWN "Afkøl"
#define MSG_DISABLE_STEPPERS "Slå stepper fra"
#define MSG_LEVEL_BED_HOMING "Homing XYZ"
-#define MSG_LEVEL_BED_WAITING "Click to Begin"
-#define MSG_LEVEL_BED_DONE "Leveling Done!"
-#define MSG_SET_HOME_OFFSETS "Sæt home offsets"
-#define MSG_HOME_OFFSETS_APPLIED "Offsets applied"
+#define MSG_LEVEL_BED_WAITING "Tryk for at starte"
+#define MSG_LEVEL_BED_DONE "Justering er færdig!"
+#define MSG_LEVEL_BED_CANCEL "Annuller"
+#define MSG_SET_HOME_OFFSETS "Sæt forskyding til udgangsposition"
+#define MSG_HOME_OFFSETS_APPLIED "Forskydninger er tilføjet"
#define MSG_SET_ORIGIN "Sæt origin"
#define MSG_SWITCH_PS_ON "Slå strøm til"
#define MSG_SWITCH_PS_OFF "Slå strøm fra"
@@ -83,8 +84,8 @@
#define MSG_MAX " \002 Max"
#define MSG_FACTOR " \002 Fact"
#define MSG_AUTOTEMP "Autotemp"
-#define MSG_ON "On "
-#define MSG_OFF "Off"
+#define MSG_ON "Til "
+#define MSG_OFF "Fra"
#define MSG_PID_P "PID-P"
#define MSG_PID_I "PID-I"
#define MSG_PID_D "PID-D"
@@ -127,10 +128,10 @@
#define MSG_DWELL "Dvale..."
#define MSG_USERWAIT "Venter på bruger..."
#define MSG_RESUMING "Forsætter printet"
-#define MSG_PRINT_ABORTED "Print annuleret"
-#define MSG_NO_MOVE "No move."
-#define MSG_KILLED "KILLED. "
-#define MSG_STOPPED "STOPPED. "
+#define MSG_PRINT_ABORTED "Print annulleret"
+#define MSG_NO_MOVE "Ingen bevægelse."
+#define MSG_KILLED "DRÆBT. "
+#define MSG_STOPPED "STOPPET. "
#define MSG_CONTROL_RETRACT "Tilbagetraek mm"
#define MSG_CONTROL_RETRACT_SWAP "Skift Re.mm"
#define MSG_CONTROL_RETRACTF "Tilbagetræk V"
diff --git a/Marlin/language_de.h b/Marlin/language_de.h
index 2274928e90..ccdec82f42 100644
--- a/Marlin/language_de.h
+++ b/Marlin/language_de.h
@@ -43,10 +43,11 @@
#define MSG_DISABLE_STEPPERS "Motoren Aus" // M84
#define MSG_AUTO_HOME "Home" // G28
#define MSG_LEVEL_BED_HOMING "Homing XYZ"
-#define MSG_LEVEL_BED_WAITING "Click to Begin"
-#define MSG_LEVEL_BED_DONE "Leveling Done!"
+#define MSG_LEVEL_BED_WAITING "Klick für Start"
+#define MSG_LEVEL_BED_DONE "Fertig"
+#define MSG_LEVEL_BED_CANCEL "Abbruch"
#define MSG_SET_HOME_OFFSETS "Setze Home hier"
-#define MSG_HOME_OFFSETS_APPLIED "Offsets applied"
+#define MSG_HOME_OFFSETS_APPLIED "Offsets aktiv"
#define MSG_SET_ORIGIN "Setze Null hier" //"G92 X0 Y0 Z0" commented out in ultralcd.cpp
#define MSG_PREHEAT_PLA "Vorwärmen PLA"
#define MSG_PREHEAT_PLA_N "Vorwärmen PLA "
@@ -61,8 +62,10 @@
#define MSG_COOLDOWN "Abkühlen"
#define MSG_SWITCH_PS_ON "Netzteil Ein"
#define MSG_SWITCH_PS_OFF "Netzteil Aus"
+#define MSG_EXTRUDE "Extrude"
#define MSG_RETRACT "Retract"
#define MSG_MOVE_AXIS "Bewegen"
+#define MSG_LEVEL_BED "Bett Korrektur"
#define MSG_MOVE_X "X"
#define MSG_MOVE_Y "Y"
#define MSG_MOVE_Z "Z"
@@ -71,6 +74,7 @@
#define MSG_MOVE_1MM " 1.0 mm"
#define MSG_MOVE_10MM "10.0 mm"
#define MSG_SPEED "Geschw."
+#define MSG_BED_Z "Bett Z"
#define MSG_NOZZLE "Düse"
#define MSG_BED "Bett"
#define MSG_FAN_SPEED "Lüftergeschw."
@@ -99,6 +103,7 @@
#define MSG_VTRAV_MIN "VTrav min"
#define MSG_AMAX "A max " // space by purpose
#define MSG_A_RETRACT "A Retract"
+#define MSG_A_TRAVEL "A Travel"
#define MSG_XSTEPS "X steps/mm"
#define MSG_YSTEPS "Y steps/mm"
#define MSG_ZSTEPS "Z steps/mm"
@@ -146,6 +151,13 @@
#define MSG_BABYSTEP_Y "Babystep Y"
#define MSG_BABYSTEP_Z "Babystep Z"
#define MSG_ENDSTOP_ABORT "Endstop Abbr. Ein"
+#define MSG_HEATING_FAILED_LCD "Err: Heizt langsam"
+#define MSG_ERR_REDUNDANT_TEMP "Err: Temp. Redundanz"
+#define MSG_THERMAL_RUNAWAY "Err: Temp. Messung"
+#define MSG_ERR_MAXTEMP "Err: Max-Temp."
+#define MSG_ERR_MINTEMP "Err: Min-Temp."
+#define MSG_ERR_MAXTEMP_BED "Err: Max-Temp. Bett"
+#define MSG_ERR_MINTEMP_BED "Err: Min-Temp. Bett"
#define MSG_END_HOUR "Stunden"
#define MSG_END_MINUTE "Minuten"
#define MSG_HEATING "Aufheizen..."
@@ -163,12 +175,10 @@
#define MSG_ERR_MAXTEMP_BED "Temp. Bett ueberschr."
#define MSG_ERR_MAXTEMP_BED "Temp. Bett unterschr."
-#if ENABLED(DELTA_CALIBRATION_MENU)
- #define MSG_DELTA_CALIBRATE "Delta kalibrieren"
- #define MSG_DELTA_CALIBRATE_X "Kalibriere X"
- #define MSG_DELTA_CALIBRATE_Y "Kalibriere Y"
- #define MSG_DELTA_CALIBRATE_Z "Kalibriere Z"
- #define MSG_DELTA_CALIBRATE_CENTER "Kalibriere Mitte"
-#endif // DELTA_CALIBRATION_MENU
+#define MSG_DELTA_CALIBRATE "Delta kalibrieren"
+#define MSG_DELTA_CALIBRATE_X "Kalibriere X"
+#define MSG_DELTA_CALIBRATE_Y "Kalibriere Y"
+#define MSG_DELTA_CALIBRATE_Z "Kalibriere Z"
+#define MSG_DELTA_CALIBRATE_CENTER "Kalibriere Mitte"
#endif // LANGUAGE_DE_H
diff --git a/Marlin/language_en.h b/Marlin/language_en.h
index de47f11cd8..dae6ea21b8 100644
--- a/Marlin/language_en.h
+++ b/Marlin/language_en.h
@@ -70,6 +70,9 @@
#ifndef MSG_LEVEL_BED_DONE
#define MSG_LEVEL_BED_DONE "Leveling Done!"
#endif
+#ifndef MSG_LEVEL_BED_CANCEL
+ #define MSG_LEVEL_BED_CANCEL "Cancel"
+#endif
#ifndef MSG_SET_HOME_OFFSETS
#define MSG_SET_HOME_OFFSETS "Set home offsets"
#endif
diff --git a/Marlin/language_es.h b/Marlin/language_es.h
index c3167c3d9f..e91418c3fa 100644
--- a/Marlin/language_es.h
+++ b/Marlin/language_es.h
@@ -39,32 +39,33 @@
#define MSG_SD_INSERTED "Tarjeta colocada"
#define MSG_SD_REMOVED "Tarjeta retirada"
#define MSG_MAIN "Menu principal"
-#define MSG_AUTOSTART "Autostart"
+#define MSG_AUTOSTART "Inicio automatico"
#define MSG_DISABLE_STEPPERS "Apagar motores"
#define MSG_AUTO_HOME "Llevar al origen"
-#define MSG_LEVEL_BED_HOMING "Homing XYZ"
+#define MSG_LEVEL_BED_HOMING "Origen XYZ"
#define MSG_LEVEL_BED_WAITING "Click to Begin"
#define MSG_LEVEL_BED_DONE "Leveling Done!"
-#define MSG_SET_HOME_OFFSETS "Ajustar offsets"
+#define MSG_LEVEL_BED_CANCEL "Cancel"
+#define MSG_SET_HOME_OFFSETS "Ajustar desfases"
#define MSG_HOME_OFFSETS_APPLIED "Offsets applied"
-#define MSG_SET_ORIGIN "Establecer cero"
+#define MSG_SET_ORIGIN "Establecer origen"
#define MSG_PREHEAT_PLA "Precalentar PLA"
-#define MSG_PREHEAT_PLA_N "Precalentar PLA "
-#define MSG_PREHEAT_PLA_ALL "Precal. PLA Todo"
-#define MSG_PREHEAT_PLA_BEDONLY "Precal. PLA Base"
-#define MSG_PREHEAT_PLA_SETTINGS "Ajustar temp. PLA"
+#define MSG_PREHEAT_PLA_N MSG_PREHEAT_PLA " "
+#define MSG_PREHEAT_PLA_ALL MSG_PREHEAT_PLA "Todo"
+#define MSG_PREHEAT_PLA_BEDONLY MSG_PREHEAT_PLA"Plataforma"
+#define MSG_PREHEAT_PLA_SETTINGS MSG_PREHEAT_PLA "Config"
#define MSG_PREHEAT_ABS "Precalentar ABS"
-#define MSG_PREHEAT_ABS_N "Precalentar ABS "
-#define MSG_PREHEAT_ABS_ALL "Precal. ABS Todo"
-#define MSG_PREHEAT_ABS_BEDONLY "Precal. ABS Base"
-#define MSG_PREHEAT_ABS_SETTINGS "Ajustar temp. ABS"
+#define MSG_PREHEAT_ABS_N MSG_PREHEAT_ABS " "
+#define MSG_PREHEAT_ABS_ALL MSG_PREHEAT_ABS "Todo"
+#define MSG_PREHEAT_ABS_BEDONLY MSG_PREHEAT_ABS "Plataforma"
+#define MSG_PREHEAT_ABS_SETTINGS MSG_PREHEAT_ABS "Config"
#define MSG_COOLDOWN "Enfriar"
#define MSG_SWITCH_PS_ON "Encender"
#define MSG_SWITCH_PS_OFF "Apagar"
#define MSG_EXTRUDE "Extruir"
#define MSG_RETRACT "Retraer"
#define MSG_MOVE_AXIS "Mover ejes"
-#define MSG_LEVEL_BED "Nivelar cama"
+#define MSG_LEVEL_BED "Nivelar plataforma"
#define MSG_MOVE_X "Mover X"
#define MSG_MOVE_Y "Mover Y"
#define MSG_MOVE_Z "Mover Z"
@@ -73,22 +74,22 @@
#define MSG_MOVE_1MM "Mover 1mm"
#define MSG_MOVE_10MM "Mover 10mm"
#define MSG_SPEED "Velocidad"
-#define MSG_NOZZLE "Fusor"
-#define MSG_BED "Base"
+#define MSG_NOZZLE "Boquilla"
+#define MSG_BED "Plataforma"
#define MSG_FAN_SPEED "Ventilador"
#define MSG_FLOW "Flujo"
#define MSG_CONTROL "Control"
#define MSG_MIN LCD_STR_THERMOMETER " Min"
#define MSG_MAX LCD_STR_THERMOMETER " Max"
#define MSG_FACTOR LCD_STR_THERMOMETER " Fact"
-#define MSG_AUTOTEMP "Autotemp"
-#define MSG_ON "On"
-#define MSG_OFF "Off"
+#define MSG_AUTOTEMP "Temperatura Automatica"
+#define MSG_ON "Encender"
+#define MSG_OFF "Apagar"
#define MSG_PID_P "PID-P"
#define MSG_PID_I "PID-I"
#define MSG_PID_D "PID-D"
#define MSG_PID_C "PID-C"
-#define MSG_ACC "Acel"
+#define MSG_ACC "Aceleracion"
#define MSG_VXY_JERK "Vxy-jerk"
#define MSG_VZ_JERK "Vz-jerk"
#define MSG_VE_JERK "Ve-jerk"
@@ -98,9 +99,9 @@
#define MSG_Z "z"
#define MSG_E "e"
#define MSG_VMIN "Vmin"
-#define MSG_VTRAV_MIN "Vvacio min"
-#define MSG_AMAX "Amax"
-#define MSG_A_RETRACT "A-retrac."
+#define MSG_VTRAV_MIN "Vel. viaje min"
+#define MSG_AMAX "Acel. max"
+#define MSG_A_RETRACT "Acel. retrac."
#define MSG_XSTEPS "X pasos/mm"
#define MSG_YSTEPS "Y pasos/mm"
#define MSG_ZSTEPS "Z pasos/mm"
@@ -113,23 +114,23 @@
#define MSG_CONTRAST "Contraste"
#define MSG_STORE_EPROM "Guardar memoria"
#define MSG_LOAD_EPROM "Cargar memoria"
-#define MSG_RESTORE_FAILSAFE "Rest. de emergen."
+#define MSG_RESTORE_FAILSAFE "Restaurar memoria."
#define MSG_REFRESH "Volver a cargar"
#define MSG_WATCH "Monitorizar"
#define MSG_PREPARE "Preparar"
#define MSG_TUNE "Ajustar"
#define MSG_PAUSE_PRINT "Pausar impresion"
-#define MSG_RESUME_PRINT "Reanudar impres."
+#define MSG_RESUME_PRINT "Reanudar impresion"
#define MSG_STOP_PRINT "Detener impresion"
#define MSG_CARD_MENU "Menu de SD"
#define MSG_NO_CARD "No hay tarjeta SD"
#define MSG_DWELL "Reposo..."
#define MSG_USERWAIT "Esperando ordenes"
#define MSG_RESUMING "Resumiendo impre."
-#define MSG_PRINT_ABORTED "Print aborted"
+#define MSG_PRINT_ABORTED "Impresion cancelada"
#define MSG_NO_MOVE "Sin movimiento"
-#define MSG_KILLED "PARADA DE EMERG."
-#define MSG_STOPPED "PARADA"
+#define MSG_KILLED "Parada de emergencia."
+#define MSG_STOPPED "Detenida"
#define MSG_CONTROL_RETRACT "Retraer mm"
#define MSG_CONTROL_RETRACT_SWAP "Interc. Retraer mm"
#define MSG_CONTROL_RETRACTF "Retraer V"
@@ -137,19 +138,32 @@
#define MSG_CONTROL_RETRACT_RECOVER "DesRet +mm"
#define MSG_CONTROL_RETRACT_RECOVER_SWAP "Interc. DesRet +mm"
#define MSG_CONTROL_RETRACT_RECOVERF "DesRet V"
-#define MSG_AUTORETRACT "AutoRetr."
+#define MSG_AUTORETRACT "Retraccion Auto."
#define MSG_FILAMENTCHANGE "Cambiar filamento"
#define MSG_INIT_SDCARD "Iniciando tarjeta"
#define MSG_CNG_SDCARD "Cambiar tarjeta"
#define MSG_ZPROBE_OUT "Sonda Z fuera"
#define MSG_YX_UNHOMED "Reiniciar X/Y y Z"
-#define MSG_ZPROBE_ZOFFSET "Offset Z"
+#define MSG_ZPROBE_ZOFFSET "Desfase Z"
#define MSG_BABYSTEP_X "Micropaso X"
#define MSG_BABYSTEP_Y "Micropaso Y"
#define MSG_BABYSTEP_Z "Micropaso Z"
#define MSG_ENDSTOP_ABORT "Endstop abort"
#define MSG_END_HOUR "horas"
#define MSG_END_MINUTE "minutos"
+#define MSG_BED_Z "Plataforma Z"
+#define MSG_A_TRAVEL "Acel. Viaje"
+#define MSG_HEATING_FAILED_LCD "Error: al calentar"
+#define MSG_ERR_REDUNDANT_TEMP "Error: temperatura redundante"
+#define MSG_THERMAL_RUNAWAY "Error de temperatura"
+#define MSG_ERR_MAXTEMP "Error: Temp Maxima"
+#define MSG_ERR_MINTEMP "Error: Temp Minima"
+#define MSG_ERR_MAXTEMP_BED "Error: Temp Max Plataforma"
+#define MSG_ERR_MINTEMP_BED "Error: Temp Min Plataforma"
+#define MSG_HEATING "Calentando..."
+#define MSG_HEATING_COMPLETE "Calentamiento Completo"
+#define MSG_BED_HEATING "Calentando plataforma ..."
+#define MSG_BED_DONE "Plataforma Caliente"
#if ENABLED(DELTA_CALIBRATION_MENU)
#define MSG_DELTA_CALIBRATE "Calibracion Delta"
diff --git a/Marlin/language_eu.h b/Marlin/language_eu.h
index 8806ca19da..bc775ec105 100644
--- a/Marlin/language_eu.h
+++ b/Marlin/language_eu.h
@@ -45,6 +45,7 @@
#define MSG_LEVEL_BED_HOMING "Homing XYZ"
#define MSG_LEVEL_BED_WAITING "Click to Begin"
#define MSG_LEVEL_BED_DONE "Leveling Done!"
+#define MSG_LEVEL_BED_CANCEL "Cancel"
#define MSG_SET_HOME_OFFSETS "Set home offsets"
#define MSG_HOME_OFFSETS_APPLIED "Offsets applied"
#define MSG_SET_ORIGIN "Hasiera ipini"
diff --git a/Marlin/language_fi.h b/Marlin/language_fi.h
index 3b673562c1..9d550c498e 100644
--- a/Marlin/language_fi.h
+++ b/Marlin/language_fi.h
@@ -45,6 +45,7 @@
#define MSG_LEVEL_BED_HOMING "Homing XYZ"
#define MSG_LEVEL_BED_WAITING "Click to Begin"
#define MSG_LEVEL_BED_DONE "Leveling Done!"
+#define MSG_LEVEL_BED_CANCEL "Cancel"
#define MSG_SET_HOME_OFFSETS "Set home offsets"
#define MSG_HOME_OFFSETS_APPLIED "Offsets applied"
#define MSG_SET_ORIGIN "Aseta origo"
diff --git a/Marlin/language_fr.h b/Marlin/language_fr.h
index b4bc6545c6..3145f78a6f 100644
--- a/Marlin/language_fr.h
+++ b/Marlin/language_fr.h
@@ -42,12 +42,13 @@
#define MSG_MAIN "Menu principal"
#define MSG_AUTOSTART "Demarrage auto"
#define MSG_DISABLE_STEPPERS "Arreter moteurs"
-#define MSG_AUTO_HOME "Home auto."
-#define MSG_LEVEL_BED_HOMING "Homing XYZ"
-#define MSG_LEVEL_BED_WAITING "Click to Begin"
-#define MSG_LEVEL_BED_DONE "Leveling Done!"
-#define MSG_SET_HOME_OFFSETS "Set home offsets"
-#define MSG_HOME_OFFSETS_APPLIED "Offsets applied"
+#define MSG_AUTO_HOME "Origine auto."
+#define MSG_LEVEL_BED_HOMING "Origine XYZ"
+#define MSG_LEVEL_BED_WAITING "Cliquer pour commencer"
+#define MSG_LEVEL_BED_DONE "Mise a niveau OK!"
+#define MSG_LEVEL_BED_CANCEL "Annuler"
+#define MSG_SET_HOME_OFFSETS "Regler decal. origine"
+#define MSG_HOME_OFFSETS_APPLIED "Decalages appliques"
#define MSG_SET_ORIGIN "Regler origine"
#define MSG_PREHEAT_PLA "Prechauffage PLA"
#define MSG_PREHEAT_PLA_N "Prechauff. PLA "
@@ -109,8 +110,8 @@
#define MSG_TEMPERATURE "Temperature"
#define MSG_MOTION "Mouvement"
#define MSG_VOLUMETRIC "Filament"
-#define MSG_VOLUMETRIC_ENABLED "E in mm3"
-#define MSG_FILAMENT_DIAM "Fil. Dia."
+#define MSG_VOLUMETRIC_ENABLED "E en mm3"
+#define MSG_FILAMENT_DIAM "Diam. Fil."
#define MSG_CONTRAST "Contraste LCD"
#define MSG_STORE_EPROM "Sauver config"
#define MSG_LOAD_EPROM "Lire config"
@@ -144,20 +145,34 @@
#define MSG_CNG_SDCARD "Changer de carte"
#define MSG_ZPROBE_OUT "Z sonde exte. lit"
#define MSG_YX_UNHOMED "Rev. dans XY av.Z"
-#define MSG_ZPROBE_ZOFFSET "Offset Z"
+#define MSG_ZPROBE_ZOFFSET "Decalage Z"
#define MSG_BABYSTEP_X "Babystep X"
#define MSG_BABYSTEP_Y "Babystep Y"
#define MSG_BABYSTEP_Z "Babystep Z"
#define MSG_ENDSTOP_ABORT "Butee abandon"
#define MSG_END_HOUR "heures"
#define MSG_END_MINUTE "minutes"
+#define MSG_BED_Z "Plateau Z"
+#define MSG_A_TRAVEL "A-Depl."
+#define MSG_HEATING_FAILED_LCD "Erreur de chauffe"
+#define MSG_ERR_REDUNDANT_TEMP "Err: ERREUR TEMP. REDONDANTE"
+#define MSG_THERMAL_RUNAWAY "EMBALLEMENT THERMIQUE"
+#define MSG_ERR_MAXTEMP "Err: TEMP. MAX"
+#define MSG_ERR_MINTEMP "Err: TEMP. MIN"
+#define MSG_ERR_MAXTEMP_BED "Err: TEMP. MAX PLATEAU"
+#define MSG_ERR_MINTEMP_BED "Err: TEMP. MIN PLATEAU"
+#define MSG_HEATING "En chauffe..."
+#define MSG_HEATING_COMPLETE "Chauffe terminee"
+#define MSG_BED_HEATING "Plateau en chauffe..."
+#define MSG_BED_DONE "Chauffe plateau terminee"
+
#if ENABLED(DELTA_CALIBRATION_MENU)
- #define MSG_DELTA_CALIBRATE "Delta Calibration"
- #define MSG_DELTA_CALIBRATE_X "Calibrate X"
- #define MSG_DELTA_CALIBRATE_Y "Calibrate Y"
- #define MSG_DELTA_CALIBRATE_Z "Calibrate Z"
- #define MSG_DELTA_CALIBRATE_CENTER "Calibrate Center"
+ #define MSG_DELTA_CALIBRATE "Calibration Delta"
+ #define MSG_DELTA_CALIBRATE_X "Calibrer X"
+ #define MSG_DELTA_CALIBRATE_Y "Calibrer Y"
+ #define MSG_DELTA_CALIBRATE_Z "Calibrer Z"
+ #define MSG_DELTA_CALIBRATE_CENTER "Calibrer centre"
#endif // DELTA_CALIBRATION_MENU
#endif // LANGUAGE_FR_H
diff --git a/Marlin/language_it.h b/Marlin/language_it.h
index f88a68be66..0c849d0db9 100644
--- a/Marlin/language_it.h
+++ b/Marlin/language_it.h
@@ -42,29 +42,30 @@
#define MSG_AUTOSTART "Autostart"
#define MSG_DISABLE_STEPPERS "Disabilita Motori"
#define MSG_AUTO_HOME "Auto Home"
-#define MSG_LEVEL_BED_HOMING "Homing XYZ"
-#define MSG_LEVEL_BED_WAITING "Click to Begin"
-#define MSG_LEVEL_BED_DONE "Leveling Done!"
-#define MSG_SET_HOME_OFFSETS "Setta offset home"
-#define MSG_HOME_OFFSETS_APPLIED "Offsets applied"
+#define MSG_LEVEL_BED_HOMING "Home assi XYZ"
+#define MSG_LEVEL_BED_WAITING "Premi per Iniziare"
+#define MSG_LEVEL_BED_DONE "Livel. terminato!"
+#define MSG_LEVEL_BED_CANCEL "Annulla"
+#define MSG_SET_HOME_OFFSETS "Imp. offset home"
+#define MSG_HOME_OFFSETS_APPLIED "Offset applicato"
#define MSG_SET_ORIGIN "Imposta Origine"
#define MSG_PREHEAT_PLA "Preriscalda PLA"
-#define MSG_PREHEAT_PLA_N "Preriscalda PLA "
-#define MSG_PREHEAT_PLA_ALL "Prer. PLA Tutto"
-#define MSG_PREHEAT_PLA_BEDONLY "Prer. PLA Piatto"
-#define MSG_PREHEAT_PLA_SETTINGS "Config. prer. PLA"
+#define MSG_PREHEAT_PLA_N MSG_PREHEAT_PLA " "
+#define MSG_PREHEAT_PLA_ALL MSG_PREHEAT_PLA " Tutto"
+#define MSG_PREHEAT_PLA_BEDONLY MSG_PREHEAT_PLA " Piatto"
+#define MSG_PREHEAT_PLA_SETTINGS MSG_PREHEAT_PLA " conf"
#define MSG_PREHEAT_ABS "Preriscalda ABS"
-#define MSG_PREHEAT_ABS_N "Preriscalda ABS "
-#define MSG_PREHEAT_ABS_ALL "Prer. ABS Tutto"
-#define MSG_PREHEAT_ABS_BEDONLY "Prer. ABS Piatto"
-#define MSG_PREHEAT_ABS_SETTINGS "Config. prer. ABS"
+#define MSG_PREHEAT_ABS_N MSG_PREHEAT_ABS " "
+#define MSG_PREHEAT_ABS_ALL MSG_PREHEAT_ABS " Tutto"
+#define MSG_PREHEAT_ABS_BEDONLY MSG_PREHEAT_ABS " Piatto"
+#define MSG_PREHEAT_ABS_SETTINGS MSG_PREHEAT_ABS " conf"
#define MSG_COOLDOWN "Raffredda"
#define MSG_SWITCH_PS_ON "Accendi aliment."
#define MSG_SWITCH_PS_OFF "Spegni aliment."
#define MSG_EXTRUDE "Estrudi"
#define MSG_RETRACT "Ritrai"
#define MSG_MOVE_AXIS "Muovi Asse"
-#define MSG_LEVEL_BED "Livellamento piano"
+#define MSG_LEVEL_BED "Livella piano"
#define MSG_MOVE_X "Muovi X"
#define MSG_MOVE_Y "Muovi Y"
#define MSG_MOVE_Z "Muovi Z"
@@ -72,34 +73,34 @@
#define MSG_MOVE_01MM "Muovi di 0.1mm"
#define MSG_MOVE_1MM "Muovi di 1mm"
#define MSG_MOVE_10MM "Muovi di 10mm"
-#define MSG_SPEED "Velcità"
+#define MSG_SPEED "Velocità"
#define MSG_NOZZLE "Ugello"
#define MSG_BED "Piatto"
-#define MSG_FAN_SPEED "Ventola"
+#define MSG_FAN_SPEED "Velocità ventola"
#define MSG_FLOW "Flusso"
#define MSG_CONTROL "Controllo"
#define MSG_MIN LCD_STR_THERMOMETER " Min"
#define MSG_MAX LCD_STR_THERMOMETER " Max"
#define MSG_FACTOR LCD_STR_THERMOMETER " Fact"
#define MSG_AUTOTEMP "Autotemp"
-#define MSG_ON "ON "
-#define MSG_OFF "OFF"
+#define MSG_ON "On "
+#define MSG_OFF "Off"
#define MSG_PID_P "PID-P"
#define MSG_PID_I "PID-I"
#define MSG_PID_D "PID-D"
#define MSG_PID_C "PID-C"
-#define MSG_ACC "Accel."
+#define MSG_ACC "Accel"
#define MSG_VXY_JERK "Vxy-jerk"
#define MSG_VZ_JERK "Vz-jerk"
#define MSG_VE_JERK "Ve-jerk"
-#define MSG_VMAX "Vmax"
+#define MSG_VMAX "Vmax "
#define MSG_X "x"
#define MSG_Y "y"
#define MSG_Z "z"
#define MSG_E "e"
#define MSG_VMIN "Vmin"
#define MSG_VTRAV_MIN "VTrav min"
-#define MSG_AMAX "Amax"
+#define MSG_AMAX "Amax "
#define MSG_A_RETRACT "A-retract"
#define MSG_XSTEPS "Xpassi/mm"
#define MSG_YSTEPS "Ypassi/mm"
@@ -107,42 +108,42 @@
#define MSG_ESTEPS "Epassi/mm"
#define MSG_TEMPERATURE "Temperatura"
#define MSG_MOTION "Movimento"
-#define MSG_VOLUMETRIC "Filament"
-#define MSG_VOLUMETRIC_ENABLED "E in mm³"
+#define MSG_VOLUMETRIC "Filamento"
+#define MSG_VOLUMETRIC_ENABLED "E in mm3"
#define MSG_FILAMENT_DIAM "Diam. filo"
#define MSG_CONTRAST "Contrasto LCD"
-#define MSG_STORE_EPROM "Salva in EEPROM"
-#define MSG_LOAD_EPROM "Carica da EEPROM"
-#define MSG_RESTORE_FAILSAFE "Impostaz. default"
+#define MSG_STORE_EPROM "Salva in memoria"
+#define MSG_LOAD_EPROM "Carica da memoria"
+#define MSG_RESTORE_FAILSAFE "Ripristina imp."
#define MSG_REFRESH "Aggiorna"
#define MSG_WATCH "Guarda"
#define MSG_PREPARE "Prepara"
-#define MSG_TUNE "Adatta"
+#define MSG_TUNE "Regola"
#define MSG_PAUSE_PRINT "Pausa"
#define MSG_RESUME_PRINT "Riprendi stampa"
#define MSG_STOP_PRINT "Arresta stampa"
-#define MSG_CARD_MENU "SD Card Menu"
-#define MSG_NO_CARD "No SD Card"
+#define MSG_CARD_MENU "Stampa da SD"
+#define MSG_NO_CARD "SD non presente"
#define MSG_DWELL "Sospensione..."
-#define MSG_USERWAIT "Attendi Utente..."
+#define MSG_USERWAIT "Attendi Utente.."
#define MSG_RESUMING "Riprendi Stampa"
-#define MSG_PRINT_ABORTED "Stampa abortita"
+#define MSG_PRINT_ABORTED "Stampa annullata"
#define MSG_NO_MOVE "Nessun Movimento"
-#define MSG_KILLED "UCCISO "
-#define MSG_STOPPED "ARRESTATO "
+#define MSG_KILLED "UCCISO. "
+#define MSG_STOPPED "ARRESTATO. "
#define MSG_CONTROL_RETRACT "Ritrai mm"
#define MSG_CONTROL_RETRACT_SWAP "Scamb. Ritrai mm"
#define MSG_CONTROL_RETRACTF "Ritrai V"
#define MSG_CONTROL_RETRACT_ZLIFT "Salta mm"
#define MSG_CONTROL_RETRACT_RECOVER "UnRet +mm"
-#define MSG_CONTROL_RETRACT_RECOVER_SWAP "Scamb. UnRet +mm"
+#define MSG_CONTROL_RETRACT_RECOVER_SWAP "Scamb. UnRet+mm"
#define MSG_CONTROL_RETRACT_RECOVERF "UnRet V"
-#define MSG_AUTORETRACT "AutoArretramento"
+#define MSG_AUTORETRACT "AutoRitrai"
#define MSG_FILAMENTCHANGE "Cambia filamento"
#define MSG_INIT_SDCARD "Iniz. SD-Card"
#define MSG_CNG_SDCARD "Cambia SD-Card"
#define MSG_ZPROBE_OUT "Z probe out. bed"
-#define MSG_YX_UNHOMED "Home X/Y before Z"
+#define MSG_YX_UNHOMED "Home X/Y prima di Z"
#define MSG_ZPROBE_ZOFFSET "Z Offset"
#define MSG_BABYSTEP_X "Babystep X"
#define MSG_BABYSTEP_Y "Babystep Y"
@@ -150,6 +151,20 @@
#define MSG_ENDSTOP_ABORT "Finecorsa abort"
#define MSG_END_HOUR "ore"
#define MSG_END_MINUTE "minuti"
+#define MSG_BED_Z "piatto Z"
+#define MSG_A_TRAVEL "A-Spostamento"
+#define MSG_HEATING_FAILED_LCD "Riscald. Fallito"
+#define MSG_ERR_REDUNDANT_TEMP "Err: TEMP RIDONDANTI"
+#define MSG_THERMAL_RUNAWAY "TEMP FUORI CONTROLLO"
+#define MSG_ERR_MAXTEMP "Err: TEMP MASSIMA"
+#define MSG_ERR_MINTEMP "Err: TEMP MINIMA"
+#define MSG_ERR_MAXTEMP_BED "Err: TEMP MASSIMA PIATTO"
+#define MSG_ERR_MINTEMP_BED "Err: TEMP MINIMA PIATTO"
+#define MSG_HEATING "Riscaldamento.."
+#define MSG_HEATING_COMPLETE "Risc. completato"
+#define MSG_BED_HEATING "Risc. Piatto.."
+#define MSG_BED_DONE "Piatto Pronto"
+
#if ENABLED(DELTA_CALIBRATION_MENU)
#define MSG_DELTA_CALIBRATE "Calibraz. Delta"
diff --git a/Marlin/language_kana.h b/Marlin/language_kana.h
index 7866864265..6c810195ad 100644
--- a/Marlin/language_kana.h
+++ b/Marlin/language_kana.h
@@ -45,10 +45,11 @@
#define MSG_DISABLE_STEPPERS "\xd3\xb0\xc0\xb0\xc3\xde\xdd\xb9\xde\xdd\x20\xb5\xcc" // "Disable steppers"
#define MSG_AUTO_HOME "\xb9\xde\xdd\xc3\xdd\xc6\xb2\xc4\xde\xb3" // "Auto home"
#define MSG_LEVEL_BED_HOMING "\xb9\xde\xdd\xc3\xdd\xc6\xb2\xc4\xde\xb3" // "Homing XYZ"
-#define MSG_LEVEL_BED_WAITING "Click to Begin"
-#define MSG_LEVEL_BED_DONE "Leveling Done!"
+#define MSG_LEVEL_BED_WAITING "\xda\xcd\xde\xd8\xdd\xb8\xde\xb6\xb2\xbc" //"Click to Begin"
+#define MSG_LEVEL_BED_DONE "\xda\xcd\xde\xd8\xdd\xb8\xde\xb6\xdd\xd8\xae\xb3" //"Leveling Done!"
+#define MSG_LEVEL_BED_CANCEL "\xc4\xd8\xd4\xd2" //"Cancel"
#define MSG_SET_HOME_OFFSETS "\xb7\xbc\xde\xad\xdd\xb5\xcc\xbe\xaf\xc4\xbe\xaf\xc3\xb2" // "Set home offsets"
-#define MSG_HOME_OFFSETS_APPLIED "Offsets applied"
+#define MSG_HOME_OFFSETS_APPLIED "\xb5\xcc\xbe\xaf\xc4\x20\xc3\xb7\xd6\xb3\xbb\xda\xcf\xbc\xc0" //"Offsets applied"
#define MSG_SET_ORIGIN "\xb7\xbc\xde\xad\xdd\xbe\xaf\xc4" // "Set origin"
#define MSG_PREHEAT_PLA "PLA \xd6\xc8\xc2" // "Preheat PLA"
#define MSG_PREHEAT_PLA_N MSG_PREHEAT_PLA " "
diff --git a/Marlin/language_kana_utf8.h b/Marlin/language_kana_utf8.h
index 59347a8735..da420a5bdb 100644
--- a/Marlin/language_kana_utf8.h
+++ b/Marlin/language_kana_utf8.h
@@ -49,10 +49,11 @@
#define MSG_DISABLE_STEPPERS "モーターデンゲン オフ" // "Disable steppers"
#define MSG_AUTO_HOME "ゲンテンニイドウ" // "Auto home"
#define MSG_LEVEL_BED_HOMING "ゲンテンニイドウ" // "Homing XYZ"
-#define MSG_LEVEL_BED_WAITING "Click to Begin"
-#define MSG_LEVEL_BED_DONE "Leveling Done!"
+#define MSG_LEVEL_BED_WAITING "レベリングカイシ" //"Click to Begin"
+#define MSG_LEVEL_BED_DONE "レベリングカンリョウ" //"Leveling Done!"
+#define MSG_LEVEL_BED_CANCEL "トリヤメ" //"Cancel"
#define MSG_SET_HOME_OFFSETS "キジュンオフセットセッテイ" // "Set home offsets"
-#define MSG_HOME_OFFSETS_APPLIED "Offsets applied"
+#define MSG_HOME_OFFSETS_APPLIED "オフセット テキヨウサレマシタ" //"Offsets applied"
#define MSG_SET_ORIGIN "キジュンセット" // "Set origin"
#define MSG_PREHEAT_PLA "PLA ヨネツ" // "Preheat PLA"
#define MSG_PREHEAT_PLA_N MSG_PREHEAT_PLA " "
diff --git a/Marlin/language_nl.h b/Marlin/language_nl.h
index a0c20aaef2..4ccc7f094f 100644
--- a/Marlin/language_nl.h
+++ b/Marlin/language_nl.h
@@ -38,14 +38,15 @@
#define WELCOME_MSG MACHINE_NAME " gereed."
#define MSG_SD_INSERTED "Kaart ingestoken"
#define MSG_SD_REMOVED "Kaart verwijderd"
-#define MSG_MAIN "Main"
+#define MSG_MAIN "Hoofdmenu"
#define MSG_AUTOSTART "Autostart"
#define MSG_DISABLE_STEPPERS "Motoren uit"
#define MSG_AUTO_HOME "Auto home"
#define MSG_LEVEL_BED_HOMING "Homing XYZ"
#define MSG_LEVEL_BED_WAITING "Click to Begin"
#define MSG_LEVEL_BED_DONE "Leveling Done!"
-#define MSG_SET_HOME_OFFSETS "Set home offsets"
+#define MSG_LEVEL_BED_CANCEL "Cancel"
+#define MSG_SET_HOME_OFFSETS "Zet home offsets"
#define MSG_HOME_OFFSETS_APPLIED "Offsets applied"
#define MSG_SET_ORIGIN "Nulpunt instellen"
#define MSG_PREHEAT_PLA "PLA voorverwarmen"
@@ -127,8 +128,8 @@
#define MSG_RESUMING "Print hervatten"
#define MSG_PRINT_ABORTED "Print afgebroken"
#define MSG_NO_MOVE "Geen beweging."
-#define MSG_KILLED "AFGEBROKEN. "
-#define MSG_STOPPED "GESTOPT. "
+#define MSG_KILLED "Afgebroken. "
+#define MSG_STOPPED "Gestopt. "
#define MSG_CONTROL_RETRACT "Retract mm"
#define MSG_CONTROL_RETRACT_SWAP "Ruil Retract mm"
#define MSG_CONTROL_RETRACTF "Retract F"
@@ -139,7 +140,7 @@
#define MSG_AUTORETRACT "AutoRetr."
#define MSG_FILAMENTCHANGE "Verv. Filament"
#define MSG_INIT_SDCARD "Init. SD kaart"
-#define MSG_CNG_SDCARD "Verv. SD card"
+#define MSG_CNG_SDCARD "Verv. SD Kaart"
#define MSG_ZPROBE_OUT "Z probe uit. bed"
#define MSG_YX_UNHOMED "Home X/Y voor Z"
#define MSG_ZPROBE_ZOFFSET "Z Offset"
@@ -149,6 +150,24 @@
#define MSG_ENDSTOP_ABORT "Endstop afbr."
#define MSG_END_HOUR "uur"
#define MSG_END_MINUTE "minuten"
+#define MSG_BED_Z "Bed Z"
+#define MSG_A_TRAVEL "A-travel"
+#define MSG_HEATING_FAILED_LCD "voorverw. fout"
+#define MSG_ERR_REDUNDANT_TEMP "Redun. temp fout"
+#define MSG_THERMAL_RUNAWAY "Therm. wegloop"
+#define MSG_ERR_MAXTEMP "Err: Max. temp"
+#define MSG_ERR_MINTEMP "Err: Min. temp"
+#define MSG_ERR_MAXTEMP_BED "Err: Max.tmp bed"
+#define MSG_ERR_MINTEMP_BED "Err: Min.tmp bed"
+#define MSG_HEATING "Voorwarmen..."
+#define MSG_HEATING_COMPLETE "Voorverw. kompl."
+#define MSG_BED_HEATING "Bed voorverw."
+#define MSG_BED_DONE "Bed is voorverw."
+#define MSG_LEVEL_BED_HOMING "Homing XYZ"
+#define MSG_LEVEL_BED_WAITING "Klik voor begin"
+#define MSG_LEVEL_BED_DONE "Bed level kompl."
+#define MSG_LEVEL_BED_CANCEL "Bed level afbr."
+#define MSG_HOME_OFFSETS_APPLIED "H offset toegep."
#if ENABLED(DELTA_CALIBRATION_MENU)
#define MSG_DELTA_CALIBRATE "Delta Calibratie"
diff --git a/Marlin/language_pl.h b/Marlin/language_pl.h
index 720e1b2803..5417748508 100644
--- a/Marlin/language_pl.h
+++ b/Marlin/language_pl.h
@@ -45,6 +45,7 @@
#define MSG_LEVEL_BED_HOMING "Homing XYZ"
#define MSG_LEVEL_BED_WAITING "Click to Begin"
#define MSG_LEVEL_BED_DONE "Leveling Done!"
+#define MSG_LEVEL_BED_CANCEL "Cancel"
#define MSG_SET_HOME_OFFSETS "Set home offsets"
#define MSG_HOME_OFFSETS_APPLIED "Offsets applied"
#define MSG_SET_ORIGIN "Ustaw punkt zero"
diff --git a/Marlin/language_pt-br.h b/Marlin/language_pt-br.h
index b8c24baaf7..38f23d0da6 100644
--- a/Marlin/language_pt-br.h
+++ b/Marlin/language_pt-br.h
@@ -45,6 +45,7 @@
#define MSG_LEVEL_BED_HOMING "Homing XYZ"
#define MSG_LEVEL_BED_WAITING "Click to Begin"
#define MSG_LEVEL_BED_DONE "Leveling Done!"
+#define MSG_LEVEL_BED_CANCEL "Cancel"
#define MSG_SET_HOME_OFFSETS "Ajustar Jogo"
#define MSG_HOME_OFFSETS_APPLIED "Offsets applied"
#define MSG_SET_ORIGIN "Ajustar orig."
diff --git a/Marlin/language_pt-br_utf8.h b/Marlin/language_pt-br_utf8.h
index b104b76408..ea92ab15a9 100644
--- a/Marlin/language_pt-br_utf8.h
+++ b/Marlin/language_pt-br_utf8.h
@@ -45,6 +45,7 @@
#define MSG_LEVEL_BED_HOMING "Indo para origem"
#define MSG_LEVEL_BED_WAITING "Click to Begin"
#define MSG_LEVEL_BED_DONE "Leveling Done!"
+#define MSG_LEVEL_BED_CANCEL "Cancel"
#define MSG_SET_HOME_OFFSETS "Ajustar Jogo"
#define MSG_HOME_OFFSETS_APPLIED "Offsets applied"
#define MSG_SET_ORIGIN "Ajustar orig."
diff --git a/Marlin/language_pt.h b/Marlin/language_pt.h
index 367d0b7647..07bbd9dbb8 100644
--- a/Marlin/language_pt.h
+++ b/Marlin/language_pt.h
@@ -45,6 +45,7 @@
#define MSG_LEVEL_BED_HOMING "Indo para origem"
#define MSG_LEVEL_BED_WAITING "Click to Begin"
#define MSG_LEVEL_BED_DONE "Leveling Done!"
+#define MSG_LEVEL_BED_CANCEL "Cancel"
#define MSG_SET_HOME_OFFSETS "Definir desvio"
#define MSG_HOME_OFFSETS_APPLIED "Offsets applied"
#define MSG_SET_ORIGIN "Definir origem"
@@ -72,6 +73,7 @@
#define MSG_MOVE_1MM "Mover 1mm"
#define MSG_MOVE_10MM "Mover 10mm"
#define MSG_SPEED "Velocidade"
+#define MSG_BED_Z "Base Z"
#define MSG_NOZZLE LCD_STR_THERMOMETER " Bico"
#define MSG_BED LCD_STR_THERMOMETER " Base"
#define MSG_FAN_SPEED "Vel. ventoinha"
@@ -103,7 +105,8 @@
#define MSG_VMIN "Vmin"
#define MSG_VTRAV_MIN "VTrav min"
#define MSG_AMAX "Amax "
-#define MSG_A_RETRACT "A-retract"
+#define MSG_A_RETRACT "A-retraccao"
+#define MSG_A_TRAVEL "A-movimento"
#define MSG_XSTEPS "X passo/mm"
#define MSG_YSTEPS "Y passo/mm"
#define MSG_ZSTEPS "Z passo/mm"
@@ -151,8 +154,19 @@
#define MSG_BABYSTEP_Y "Babystep Y"
#define MSG_BABYSTEP_Z "Babystep Z"
#define MSG_ENDSTOP_ABORT "Fim de curso"
+#define MSG_HEATING_FAILED_LCD "Aquecimento falhou"
+#define MSG_ERR_REDUNDANT_TEMP "Err: REDUNDANT TEMP ERROR"
+#define MSG_THERMAL_RUNAWAY "THERMAL RUNAWAY"
+#define MSG_ERR_MAXTEMP "Err: T Maxima"
+#define MSG_ERR_MINTEMP "Err: T Minima"
+#define MSG_ERR_MAXTEMP_BED "Err: T Base Maxima"
+#define MSG_ERR_MINTEMP_BED "Err: T Base Minima"
#define MSG_END_HOUR "horas"
#define MSG_END_MINUTE "minutos"
+#define MSG_HEATING "Aquecendo..."
+#define MSG_HEATING_COMPLETE "Aquecida."
+#define MSG_BED_HEATING "Aquecendo base.."
+#define MSG_BED_DONE "Base aquecida."
#if ENABLED(DELTA_CALIBRATION_MENU)
#define MSG_DELTA_CALIBRATE "Calibracao Delta"
diff --git a/Marlin/language_pt_utf8.h b/Marlin/language_pt_utf8.h
index 0df5744147..c20069cf39 100644
--- a/Marlin/language_pt_utf8.h
+++ b/Marlin/language_pt_utf8.h
@@ -45,6 +45,7 @@
#define MSG_LEVEL_BED_HOMING "Indo para origem"
#define MSG_LEVEL_BED_WAITING "Click to Begin"
#define MSG_LEVEL_BED_DONE "Leveling Done!"
+#define MSG_LEVEL_BED_CANCEL "Cancel"
#define MSG_SET_HOME_OFFSETS "Definir desvio"
#define MSG_HOME_OFFSETS_APPLIED "Offsets applied"
#define MSG_SET_ORIGIN "Definir origem"
@@ -72,6 +73,7 @@
#define MSG_MOVE_1MM "Mover 1mm"
#define MSG_MOVE_10MM "Mover 10mm"
#define MSG_SPEED "Velocidade"
+#define MSG_BED_Z "Base Z"
#define MSG_NOZZLE LCD_STR_THERMOMETER " Bico"
#define MSG_BED LCD_STR_THERMOMETER " Base"
#define MSG_FAN_SPEED "Vel. ventoinha"
@@ -103,7 +105,8 @@
#define MSG_VMIN "Vmin"
#define MSG_VTRAV_MIN "VTrav min"
#define MSG_AMAX "Amax "
-#define MSG_A_RETRACT "A-retract"
+#define MSG_A_RETRACT "A-retracção"
+#define MSG_A_TRAVEL "A-movimento"
#define MSG_XSTEPS "X passo/mm"
#define MSG_YSTEPS "Y passo/mm"
#define MSG_ZSTEPS "Z passo/mm"
@@ -127,7 +130,7 @@
#define MSG_CARD_MENU "Imprimir do SD"
#define MSG_NO_CARD "Sem cartão SD"
#define MSG_DWELL "Em espera..."
-#define MSG_USERWAIT "A espera de ordem"
+#define MSG_USERWAIT "Á espera de ordem"
#define MSG_RESUMING "Retomando impressão"
#define MSG_PRINT_ABORTED "Impressão cancelada"
#define MSG_NO_MOVE "Sem movimento"
@@ -151,8 +154,19 @@
#define MSG_BABYSTEP_Y "Babystep Y"
#define MSG_BABYSTEP_Z "Babystep Z"
#define MSG_ENDSTOP_ABORT "Fim de curso"
+#define MSG_HEATING_FAILED_LCD "Aquecimento falhou"
+#define MSG_ERR_REDUNDANT_TEMP "Err: REDUNDANT TEMP ERROR"
+#define MSG_THERMAL_RUNAWAY "THERMAL RUNAWAY"
+#define MSG_ERR_MAXTEMP "Err: T Máxima"
+#define MSG_ERR_MINTEMP "Err: T Mínima"
+#define MSG_ERR_MAXTEMP_BED "Err: T Base Máxima"
+#define MSG_ERR_MINTEMP_BED "Err: T Base Mínima"
#define MSG_END_HOUR "horas"
#define MSG_END_MINUTE "minutos"
+#define MSG_HEATING "Aquecendo..."
+#define MSG_HEATING_COMPLETE "Aquecida."
+#define MSG_BED_HEATING "Aquecendo base.."
+#define MSG_BED_DONE "Base aquecida."
#if ENABLED(DELTA_CALIBRATION_MENU)
#define MSG_DELTA_CALIBRATE "Calibração Delta"
diff --git a/Marlin/language_ru.h b/Marlin/language_ru.h
index b5f004908e..c23de9b82c 100644
--- a/Marlin/language_ru.h
+++ b/Marlin/language_ru.h
@@ -45,6 +45,7 @@
#define MSG_LEVEL_BED_HOMING "Homing XYZ"
#define MSG_LEVEL_BED_WAITING "Click to Begin"
#define MSG_LEVEL_BED_DONE "Leveling Done!"
+#define MSG_LEVEL_BED_CANCEL "Cancel"
#define MSG_SET_HOME_OFFSETS "Запомнить парковку"
#define MSG_HOME_OFFSETS_APPLIED "Offsets applied"
#define MSG_SET_ORIGIN "Запомнить ноль"
diff --git a/Marlin/macros.h b/Marlin/macros.h
index 4fce8eb539..be5e8cf2cf 100644
--- a/Marlin/macros.h
+++ b/Marlin/macros.h
@@ -24,8 +24,8 @@
#define MACROS_H
// Macros to make a string from a macro
-#define STRINGIFY_(n) #n
-#define STRINGIFY(n) STRINGIFY_(n)
+#define STRINGIFY_(M) #M
+#define STRINGIFY(M) STRINGIFY_(M)
// Macros for bit masks
#define TEST(n,b) (((n)&_BV(b))!=0)
diff --git a/Marlin/pins.h b/Marlin/pins.h
index 4afa2b6160..eb37f87af9 100644
--- a/Marlin/pins.h
+++ b/Marlin/pins.h
@@ -209,55 +209,37 @@
#endif
#endif
-#if ENABLED(DISABLE_MAX_ENDSTOPS)
- #undef X_MAX_PIN
- #undef Y_MAX_PIN
- #undef Z_MAX_PIN
- #define X_MAX_PIN -1
- #define Y_MAX_PIN -1
- #define Z_MAX_PIN -1
-#endif
-
-#if ENABLED(DISABLE_MIN_ENDSTOPS)
- #undef X_MIN_PIN
- #undef Y_MIN_PIN
- #undef Z_MIN_PIN
- #define X_MIN_PIN -1
- #define Y_MIN_PIN -1
- #define Z_MIN_PIN -1
-#endif
-
#if ENABLED(DISABLE_Z_MIN_PROBE_ENDSTOP) || DISABLED(Z_MIN_PROBE_ENDSTOP) // Allow code to compile regardless of Z_MIN_PROBE_ENDSTOP setting.
#undef Z_MIN_PROBE_PIN
#define Z_MIN_PROBE_PIN -1
#endif
-#if ENABLED(DISABLE_XMAX_ENDSTOP)
+#if DISABLED(USE_XMAX_PLUG)
#undef X_MAX_PIN
#define X_MAX_PIN -1
#endif
-#if ENABLED(DISABLE_XMIN_ENDSTOP)
- #undef X_MIN_PIN
- #define X_MIN_PIN -1
-#endif
-
-#if ENABLED(DISABLE_YMAX_ENDSTOP)
+#if DISABLED(USE_YMAX_PLUG)
#undef Y_MAX_PIN
#define Y_MAX_PIN -1
#endif
-#if ENABLED(DISABLE_YMIN_ENDSTOP)
- #undef Y_MIN_PIN
- #define Y_MIN_PIN -1
-#endif
-
-#if ENABLED(DISABLE_ZMAX_ENDSTOP)
+#if DISABLED(USE_ZMAX_PLUG)
#undef Z_MAX_PIN
#define Z_MAX_PIN -1
#endif
-#if ENABLED(DISABLE_ZMIN_ENDSTOP)
+#if DISABLED(USE_XMIN_PLUG)
+ #undef X_MIN_PIN
+ #define X_MIN_PIN -1
+#endif
+
+#if DISABLED(USE_YMIN_PLUG)
+ #undef Y_MIN_PIN
+ #define Y_MIN_PIN -1
+#endif
+
+#if DISABLED(USE_ZMIN_PLUG)
#undef Z_MIN_PIN
#define Z_MIN_PIN -1
#endif
diff --git a/Marlin/pins_FELIX2.h b/Marlin/pins_FELIX2.h
index 79d8332ada..e5aa87922b 100644
--- a/Marlin/pins_FELIX2.h
+++ b/Marlin/pins_FELIX2.h
@@ -29,8 +29,6 @@
#undef HEATER_1_PIN
#define HEATER_1_PIN 7 // EXTRUDER 2
-#define DISABLE_MAX_ENDSTOPS
-
#undef SDPOWER
#define SDPOWER 1
diff --git a/Marlin/pins_MEGATRONICS_3.h b/Marlin/pins_MEGATRONICS_3.h
index c60f3c6339..46f98807b2 100644
--- a/Marlin/pins_MEGATRONICS_3.h
+++ b/Marlin/pins_MEGATRONICS_3.h
@@ -39,7 +39,7 @@
#define SERVO0_PIN 46 //AUX3-6
#define SERVO1_PIN 47 //AUX3-5
#define SERVO2_PIN 48 //AUX3-4
-#define SERVO2_PIN 49 //AUX3-3
+#define SERVO3_PIN 49 //AUX3-3
#define X_STEP_PIN 58
#define X_DIR_PIN 57
diff --git a/Marlin/planner.cpp b/Marlin/planner.cpp
index ed3aa78a93..318b5bdb28 100644
--- a/Marlin/planner.cpp
+++ b/Marlin/planner.cpp
@@ -852,25 +852,34 @@ float junction_deviation = 0.1;
block->nominal_rate = ceil(block->step_event_count * inverse_second); // (step/sec) Always > 0
#if ENABLED(FILAMENT_WIDTH_SENSOR)
+ static float filwidth_e_count = 0, filwidth_delay_dist = 0;
+
//FMM update ring buffer used for delay with filament measurements
- if (extruder == FILAMENT_SENSOR_EXTRUDER_NUM && delay_index2 > -1) { //only for extruder with filament sensor and if ring buffer is initialized
+ if (extruder == FILAMENT_SENSOR_EXTRUDER_NUM && filwidth_delay_index2 >= 0) { //only for extruder with filament sensor and if ring buffer is initialized
- const int MMD = MAX_MEASUREMENT_DELAY + 1, MMD10 = MMD * 10;
+ const int MMD_CM = MAX_MEASUREMENT_DELAY + 1, MMD_MM = MMD_CM * 10;
- delay_dist += delta_mm[E_AXIS]; // increment counter with next move in e axis
- while (delay_dist >= MMD10) delay_dist -= MMD10; // loop around the buffer
- while (delay_dist < 0) delay_dist += MMD10;
+ // increment counters with next move in e axis
+ filwidth_e_count += delta_mm[E_AXIS];
+ filwidth_delay_dist += delta_mm[E_AXIS];
- delay_index1 = delay_dist / 10.0; // calculate index
- delay_index1 = constrain(delay_index1, 0, MAX_MEASUREMENT_DELAY); // (already constrained above)
+ // Only get new measurements on forward E movement
+ if (filwidth_e_count > 0.0001) {
- if (delay_index1 != delay_index2) { // moved index
- int8_t meas_sample = widthFil_to_size_ratio() - 100; // Subtract 100 to reduce magnitude - to store in a signed char
- while (delay_index1 != delay_index2) {
- // Increment and loop around buffer
- if (++delay_index2 >= MMD) delay_index2 -= MMD;
- delay_index2 = constrain(delay_index2, 0, MAX_MEASUREMENT_DELAY);
- measurement_delay[delay_index2] = meas_sample;
+ // Loop the delay distance counter (modulus by the mm length)
+ while (filwidth_delay_dist >= MMD_MM) filwidth_delay_dist -= MMD_MM;
+
+ // Convert into an index into the measurement array
+ filwidth_delay_index1 = (int)(filwidth_delay_dist / 10.0 + 0.0001);
+
+ // If the index has changed (must have gone forward)...
+ if (filwidth_delay_index1 != filwidth_delay_index2) {
+ filwidth_e_count = 0; // Reset the E movement counter
+ int8_t meas_sample = widthFil_to_size_ratio() - 100; // Subtract 100 to reduce magnitude - to store in a signed char
+ do {
+ filwidth_delay_index2 = (filwidth_delay_index2 + 1) % MMD_CM; // The next unused slot
+ measurement_delay[filwidth_delay_index2] = meas_sample; // Store the measurement
+ } while (filwidth_delay_index1 != filwidth_delay_index2); // More slots to fill?
}
}
}
diff --git a/Marlin/scripts/findMissingTranslations.sh b/Marlin/scripts/findMissingTranslations.sh
new file mode 100644
index 0000000000..b31c09d1df
--- /dev/null
+++ b/Marlin/scripts/findMissingTranslations.sh
@@ -0,0 +1,14 @@
+#!/bin/bash
+IGNORE_DEFINES="LANGUAGE_EN_H MAPPER_NON SIMULATE_ROMFONT DISPLAY_CHARSET_ISO10646_1 MSG_H1 MSG_H2 MSG_H3 MSG_H4 MSG_MOVE_E1 MSG_MOVE_E2 MSG_MOVE_E3 MSG_MOVE_E4 MSG_N1 MSG_N2 MSG_N3 MSG_N4 MSG_DIAM_E1 MSG_DIAM_E2 MSG_DIAM_E3 MSG_DIAM_E4 MSG_E1 MSG_E2 MSG_E3 MSG_E4"
+
+for i in `awk '/#define/{print $2}' language_en.h`; do
+ for j in `ls language_*.h | grep -v language_en.h`; do
+ t=$(grep -c "${i}" ${j})
+ if [ "$t" -eq 0 ]; then
+ for k in ${IGNORE_DEFINES}; do
+ [ "${k}" == "${i}" ] && continue 2;
+ done
+ echo "${j},${i}"
+ fi
+ done
+done
diff --git a/Marlin/stepper.cpp b/Marlin/stepper.cpp
index 5d2761f1fd..a371361c28 100644
--- a/Marlin/stepper.cpp
+++ b/Marlin/stepper.cpp
@@ -294,20 +294,20 @@ void checkHitEndstops() {
SERIAL_ECHO_START;
SERIAL_ECHOPGM(MSG_ENDSTOPS_HIT);
if (TEST(endstop_hit_bits, X_MIN)) {
- SERIAL_ECHOPAIR(" X:", (float)endstops_trigsteps[X_AXIS] / axis_steps_per_unit[X_AXIS]);
+ SERIAL_ECHOPAIR(" X:", endstops_trigsteps[X_AXIS] / axis_steps_per_unit[X_AXIS]);
LCD_MESSAGEPGM(MSG_ENDSTOPS_HIT "X");
}
if (TEST(endstop_hit_bits, Y_MIN)) {
- SERIAL_ECHOPAIR(" Y:", (float)endstops_trigsteps[Y_AXIS] / axis_steps_per_unit[Y_AXIS]);
+ SERIAL_ECHOPAIR(" Y:", endstops_trigsteps[Y_AXIS] / axis_steps_per_unit[Y_AXIS]);
LCD_MESSAGEPGM(MSG_ENDSTOPS_HIT "Y");
}
if (TEST(endstop_hit_bits, Z_MIN)) {
- SERIAL_ECHOPAIR(" Z:", (float)endstops_trigsteps[Z_AXIS] / axis_steps_per_unit[Z_AXIS]);
+ SERIAL_ECHOPAIR(" Z:", endstops_trigsteps[Z_AXIS] / axis_steps_per_unit[Z_AXIS]);
LCD_MESSAGEPGM(MSG_ENDSTOPS_HIT "Z");
}
#if ENABLED(Z_MIN_PROBE_ENDSTOP)
if (TEST(endstop_hit_bits, Z_MIN_PROBE)) {
- SERIAL_ECHOPAIR(" Z_MIN_PROBE:", (float)endstops_trigsteps[Z_AXIS] / axis_steps_per_unit[Z_AXIS]);
+ SERIAL_ECHOPAIR(" Z_MIN_PROBE:", endstops_trigsteps[Z_AXIS] / axis_steps_per_unit[Z_AXIS]);
LCD_MESSAGEPGM(MSG_ENDSTOPS_HIT "ZP");
}
#endif
diff --git a/Marlin/stopwatch.cpp b/Marlin/stopwatch.cpp
new file mode 100644
index 0000000000..5bc0a280fd
--- /dev/null
+++ b/Marlin/stopwatch.cpp
@@ -0,0 +1,77 @@
+/*
+ * Marlin 3D Printer Firmware
+ * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+#include "Marlin.h"
+#include "stopwatch.h"
+
+Stopwatch::Stopwatch() {
+ this->reset();
+ }
+
+void Stopwatch::stop() {
+ if (DEBUGGING(INFO)) SERIAL_ECHOLNPGM("Stopwatch::stop()");
+ if (!this->isRunning()) return;
+
+ this->status = STPWTCH_STOPPED;
+ this->stopTimestamp = millis();
+}
+
+void Stopwatch::pause() {
+ if (DEBUGGING(INFO)) SERIAL_ECHOLNPGM("Stopwatch::pause()");
+ if (!this->isRunning()) return;
+
+ this->status = STPWTCH_PAUSED;
+ this->stopTimestamp = millis();
+}
+
+void Stopwatch::start() {
+ if (DEBUGGING(INFO)) SERIAL_ECHOLNPGM("Stopwatch::start()");
+ if (this->isRunning()) return;
+
+ if (this->isPaused()) this->accumulator = this->duration();
+ else this->reset();
+
+ this->status = STPWTCH_RUNNING;
+ this->startTimestamp = millis();
+}
+
+void Stopwatch::reset() {
+ if (DEBUGGING(INFO)) SERIAL_ECHOLNPGM("Stopwatch::reset()");
+
+ this->status = STPWTCH_STOPPED;
+ this->startTimestamp = 0;
+ this->stopTimestamp = 0;
+ this->accumulator = 0;
+}
+
+bool Stopwatch::isRunning() {
+ return (this->status == STPWTCH_RUNNING) ? true : false;
+}
+
+bool Stopwatch::isPaused() {
+ return (this->status == STPWTCH_PAUSED) ? true : false;
+}
+
+uint16_t Stopwatch::duration() {
+ return (((this->isRunning()) ? millis() : this->stopTimestamp)
+ - this->startTimestamp) / 1000 + this->accumulator;
+}
diff --git a/Marlin/stopwatch.h b/Marlin/stopwatch.h
new file mode 100644
index 0000000000..d6ef8a7444
--- /dev/null
+++ b/Marlin/stopwatch.h
@@ -0,0 +1,99 @@
+/*
+ * Marlin 3D Printer Firmware
+ * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+#ifndef STOPWATCH_H
+#define STOPWATCH_H
+
+enum StopwatchStatus {
+ STPWTCH_STOPPED = 0x0,
+ STPWTCH_RUNNING = 0x1,
+ STPWTCH_PAUSED = 0x2
+};
+
+/**
+ * @brief Stopwatch class
+ * @details This class acts as a timer proving stopwatch functionality including
+ * the ability to pause the running time counter.
+ */
+class Stopwatch {
+ private:
+ StopwatchStatus status;
+ uint16_t accumulator;
+ uint32_t startTimestamp;
+ uint32_t stopTimestamp;
+
+ public:
+ /**
+ * @brief Class constructor
+ */
+ Stopwatch();
+
+ /**
+ * @brief Stops the stopwatch
+ * @details Stops the running timer, it will silently ignore the request if
+ * no timer is currently running.
+ */
+ void stop();
+
+ /**
+ * @brief Pauses the stopwatch
+ * @details Pauses the running timer, it will silently ignore the request if
+ * no timer is currently running.
+ */
+ void pause();
+
+ /**
+ * @brief Starts the stopwatch
+ * @details Starts the timer, it will silently ignore the request if the
+ * timer is already running.
+ */
+ void start();
+
+ /**
+ * @brief Resets the stopwatch
+ * @details Resets all settings to their default values.
+ */
+ void reset();
+
+ /**
+ * @brief Checks if the timer is running
+ * @details Returns true if the timer is currently running, false otherwise.
+ * @return bool
+ */
+ bool isRunning();
+
+ /**
+ * @brief Checks if the timer is paused
+ * @details Returns true if the timer is currently paused, false otherwise.
+ * @return bool
+ */
+ bool isPaused();
+
+ /**
+ * @brief Gets the running time
+ * @details Returns the total number of seconds the timer has been running.
+ * @return uint16_t
+ */
+ uint16_t duration();
+};
+
+#endif //STOPWATCH_H
diff --git a/Marlin/temperature.cpp b/Marlin/temperature.cpp
index d20b6e7054..d9a5895f44 100644
--- a/Marlin/temperature.cpp
+++ b/Marlin/temperature.cpp
@@ -350,7 +350,7 @@ void PID_autotune(float temp, int extruder, int ncycles, bool set_result/*=false
}
// Every 2 seconds...
if (ms > temp_ms + 2000) {
- #if HAS_TEMP_0 || HAS_TEMP_BED || ENABLED(HEATER_0_USES_MAX6675)
+ #if HAS_TEMP_HOTEND || HAS_TEMP_BED
print_heaterstates();
SERIAL_EOL;
#endif
@@ -705,7 +705,7 @@ void manage_heater() {
// Control the extruder rate based on the width sensor
#if ENABLED(FILAMENT_WIDTH_SENSOR)
if (filament_sensor) {
- meas_shift_index = delay_index1 - meas_delay_cm;
+ meas_shift_index = filwidth_delay_index1 - meas_delay_cm;
if (meas_shift_index < 0) meas_shift_index += MAX_MEASUREMENT_DELAY + 1; //loop around buffer if needed
// Get the delayed info and add 100 to reconstitute to a percent of
@@ -1175,7 +1175,7 @@ void disable_all_heaters() {
setTargetBed(0);
// If all heaters go down then for sure our print job has stopped
- print_job_stop(true);
+ print_job_timer.stop();
#define DISABLE_HEATER(NR) { \
setTargetHotend(NR, 0); \
@@ -1183,7 +1183,7 @@ void disable_all_heaters() {
WRITE_HEATER_ ## NR (LOW); \
}
- #if HAS_TEMP_0 || ENABLED(HEATER_0_USES_MAX6675)
+ #if HAS_TEMP_HOTEND
setTargetHotend(0, 0);
soft_pwm[0] = 0;
WRITE_HEATER_0P(LOW); // Should HEATERS_PARALLEL apply here? Then change to DISABLE_HEATER(0)
diff --git a/Marlin/temperature.h b/Marlin/temperature.h
index d6674b5a7c..edccdfc5d0 100644
--- a/Marlin/temperature.h
+++ b/Marlin/temperature.h
@@ -83,7 +83,7 @@ extern float current_temperature_bed;
#if ENABLED(PID_PARAMS_PER_EXTRUDER)
extern float Kp[EXTRUDERS], Ki[EXTRUDERS], Kd[EXTRUDERS], Kc[EXTRUDERS]; // one param per extruder
- #define PID_PARAM(param,e) param[e] // use macro to point to array value
+ #define PID_PARAM(param, e) param[e] // use macro to point to array value
#else
extern float Kp, Ki, Kd, Kc; // one param per extruder - saves 20 or 36 bytes of ram (inc array pointer)
#define PID_PARAM(param, e) param // use macro to point directly to value
diff --git a/Marlin/twibus.cpp b/Marlin/twibus.cpp
new file mode 100644
index 0000000000..3131060848
--- /dev/null
+++ b/Marlin/twibus.cpp
@@ -0,0 +1,104 @@
+/*
+ * Marlin 3D Printer Firmware
+ * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+#include "Marlin.h"
+
+#if ENABLED(EXPERIMENTAL_I2CBUS)
+
+#include "twibus.h"
+
+#include
+
+TWIBus::twibus() {
+ Wire.begin(); // We use no address so we will join the BUS as the master
+ this->reset();
+}
+
+void TWIBus::reset() {
+ this->addr = 0;
+ this->buffer_s = 0;
+ this->buffer[0] = 0x00;
+}
+
+void TWIBus::address(uint8_t addr) {
+ this->addr = addr;
+
+ if (DEBUGGING(INFO)) {
+ SERIAL_ECHOPAIR("TWIBus::sendto: ", this->addr);
+ SERIAL_EOL;
+ }
+}
+
+void TWIBus::addbyte(char c) {
+ if (buffer_s >= sizeof(this->buffer)) return;
+ this->buffer[this->buffer_s++] = c;
+
+ if (DEBUGGING(INFO)) {
+ SERIAL_ECHOPAIR("TWIBus::addbyte: ", this->buffer[this->buffer_s -1]);
+ SERIAL_EOL;
+ }
+}
+
+void TWIBus::send() {
+ if (!this->addr) return;
+ if (DEBUGGING(INFO)) SERIAL_ECHOLNPGM("TWIBus::send()");
+
+ Wire.beginTransmission(this->addr);
+ Wire.write(this->buffer, this->buffer_s);
+ Wire.endTransmission();
+
+ // Reset the buffer after sending the data
+ this->reset();
+}
+
+void TWIBus::reqbytes(uint8_t bytes) {
+ if (!this->addr) return;
+ if (DEBUGGING(INFO)) {
+ SERIAL_ECHOPAIR("TWIBus::reqbytes(): ", bytes);
+ SERIAL_EOL;
+ }
+
+ millis_t t = millis();
+ Wire.requestFrom(this->addr, bytes);
+
+ // requestFrom() is a blocking function
+ while (Wire.available() < bytes) {
+ if (millis() - t >= this->timeout) break;
+ else continue;
+ }
+
+ SERIAL_ECHO_START;
+ SERIAL_ECHOPAIR("i2c-reply: from:", this->addr);
+ SERIAL_ECHOPAIR(" bytes:", Wire.available());
+ SERIAL_ECHOPGM (" data:");
+
+ // Protect against buffer overflows if the number of received bytes
+ // is less than the number of requested bytes
+ uint8_t wba = Wire.available();
+ for (int i = 0; i < wba; i++) SERIAL_CHAR(Wire.read());
+ SERIAL_EOL;
+
+ // Reset the buffer after sending the data
+ this->reset();
+}
+
+#endif //EXPERIMENTAL_I2CBUS
diff --git a/Marlin/twibus.h b/Marlin/twibus.h
new file mode 100644
index 0000000000..5ab725777b
--- /dev/null
+++ b/Marlin/twibus.h
@@ -0,0 +1,122 @@
+/*
+ * Marlin 3D Printer Firmware
+ * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+#ifndef TWIBUS_H
+#define TWIBUS_H
+
+/**
+ * TWIBUS class
+ *
+ * This class implements a wrapper around the two wire (I2C) bus, it allows
+ * Marlin to send and request data from any slave device on the bus. This is
+ * an experimental feature and it's inner workings as well as public facing
+ * interface are prune to change in the future.
+ *
+ * The two main consumers of this class are M155 and M156, where M155 allows
+ * Marlin to send a I2C packet to a device (please be aware that no repeated
+ * starts are possible), this can be done in caching method by calling multiple
+ * times M155 B or a one liner M155, have a look at
+ * the gcode_M155() function for more information. M156 allows Marlin to
+ * request data from a device, the received data is then relayed into the serial
+ * line for host interpretation.
+ *
+ */
+class TWIBus {
+ private:
+ /**
+ * @brief Timeout value in milliseconds
+ * @details For blocking operations this constant value will set the max
+ * amount of time Marlin will keep waiting for a reply. Useful is something
+ * goes wrong on the bus and the SDA/SCL lines are held up by another device.
+ */
+ const int timeout = 5;
+
+ /**
+ * @brief Target device address
+ * @description This stores, until the buffer is flushed, the target device
+ * address, take not we do follow Arduino 7bit addressing.
+ */
+ uint8_t addr = 0;
+
+ /**
+ * @brief Number of bytes on buffer
+ * @description This var holds the total number of bytes on our buffer
+ * waiting to be flushed to the bus.
+ */
+ uint8_t buffer_s = 0;
+
+ /**
+ * @brief Internal buffer
+ * @details This is a fixed buffer, TWI command cannot be longer than this
+ */
+ char buffer[30];
+
+
+ public:
+ /**
+ * @brief Class constructor
+ * @details Initialized the TWI bus and clears the buffer
+ */
+ TWIBus();
+
+ /**
+ * @brief Reset the buffer
+ * @details Brings the internal buffer to a known-empty state
+ */
+ void reset();
+
+ /**
+ * @brief Send the buffer data to the bus
+ * @details Flushed the buffer into the bus targeting the cached slave device
+ * address.
+ */
+ void send();
+
+ /**
+ * @brief Add one byte to the buffer
+ * @details Adds the byte to the buffer in a sequential way, if buffer is full
+ * the request is silently ignored.
+ *
+ * @param c a data byte
+ */
+ void addbyte(char c);
+
+ /**
+ * @brief Sets the target slave address
+ * @details The target slave address is stored so it can be later used when
+ * the complete packet needs to be sent over the bus.
+ *
+ * @param addr 7-bit integer address
+ */
+ void address(uint8_t addr);
+
+ /**
+ * @brief Request data from slave device
+ * @details Requests data from a slave device, when the data is received it will
+ * be relayed to the serial line using a parser-friendly formatting.
+ *
+ * @param bytes the number of bytes to request
+ */
+ void reqbytes(uint8_t bytes);
+};
+
+#endif //TWIBUS_H
diff --git a/Marlin/ultralcd.cpp b/Marlin/ultralcd.cpp
index 28ce54194d..4169311d1c 100644
--- a/Marlin/ultralcd.cpp
+++ b/Marlin/ultralcd.cpp
@@ -111,13 +111,10 @@ static void lcd_status_screen();
#if ENABLED(MANUAL_BED_LEVELING)
#include "mesh_bed_leveling.h"
- static void _lcd_level_bed();
- static void _lcd_level_bed_homing();
- static void lcd_level_bed();
#endif
/* Different types of actions that can be used in menu items. */
- static void menu_action_back(menuFunc_t data);
+ static void menu_action_back();
static void menu_action_submenu(menuFunc_t data);
static void menu_action_gcode(const char* pgcode);
static void menu_action_function(menuFunc_t data);
@@ -188,9 +185,9 @@ static void lcd_status_screen();
* menu_action_[type](arg3...)
*
* Examples:
- * MENU_ITEM(back, MSG_WATCH, lcd_status_screen)
- * lcd_implementation_drawmenu_back(sel, row, PSTR(MSG_WATCH), lcd_status_screen)
- * menu_action_back(lcd_status_screen)
+ * MENU_ITEM(back, MSG_WATCH)
+ * lcd_implementation_drawmenu_back(sel, row, PSTR(MSG_WATCH))
+ * menu_action_back()
*
* MENU_ITEM(function, MSG_PAUSE_PRINT, lcd_sdcard_pause)
* lcd_implementation_drawmenu_function(sel, row, PSTR(MSG_PAUSE_PRINT), lcd_sdcard_pause)
@@ -267,14 +264,25 @@ static void lcd_status_screen();
uint8_t currentMenuViewOffset; /* scroll offset in the current menu */
millis_t next_button_update_ms;
uint8_t lastEncoderBits;
- uint32_t encoderPosition, prevEncoderPosition;
+ uint32_t encoderPosition;
#if PIN_EXISTS(SD_DETECT)
uint8_t lcd_sd_status;
#endif
#endif // ULTIPANEL
-menuFunc_t currentMenu = lcd_status_screen; /* function pointer to the currently active menu */
+typedef struct {
+ menuFunc_t menu_function;
+ #if ENABLED(ULTIPANEL)
+ uint32_t encoder_position;
+ #endif
+} menuPosition;
+
+menuFunc_t currentMenu = lcd_status_screen; // pointer to the currently active menu handler
+
+menuPosition menu_history[10];
+uint8_t menu_history_depth = 0;
+
millis_t next_lcd_update_ms;
uint8_t lcd_status_update_delay;
bool ignore_click = false;
@@ -285,7 +293,7 @@ enum LCDHandlerAction {
LCD_DRAW_UPDATE_NONE,
LCD_DRAW_UPDATE_CALL_REDRAW,
LCD_DRAW_UPDATE_CLEAR_CALL_REDRAW,
- LCD_DRAW_UPDATE_CALL_NO_REDRAW,
+ LCD_DRAW_UPDATE_CALL_NO_REDRAW
};
uint8_t lcdDrawUpdate = LCD_DRAW_UPDATE_CLEAR_CALL_REDRAW; // Set 1 or 2 when the LCD needs to draw, decrements after every draw. Set to 2 in LCD routines so the LCD gets at least 1 full redraw (first redraw is partial)
@@ -294,7 +302,6 @@ uint8_t lcdDrawUpdate = LCD_DRAW_UPDATE_CLEAR_CALL_REDRAW; // Set 1 or 2 when th
const char* editLabel;
void* editValue;
int32_t minEditValue, maxEditValue;
-menuFunc_t prevMenu = NULL; // return here after editing (also prevEncoderPosition)
menuFunc_t callbackFunc; // call this after editing
// place-holders for Ki and Kd edits
@@ -302,6 +309,7 @@ float raw_Ki, raw_Kd;
/**
* General function to go directly to a menu
+ * Remembers the previous position
*/
static void lcd_goto_menu(menuFunc_t menu, const bool feedback = false, const uint32_t encoder = 0) {
if (currentMenu != menu) {
@@ -311,26 +319,40 @@ static void lcd_goto_menu(menuFunc_t menu, const bool feedback = false, const ui
encoderPosition = encoder;
if (feedback) lcd_quick_feedback();
#endif
- // For LCD_PROGRESS_BAR re-initialize the custom characters
+ if (menu == lcd_status_screen) {
+ defer_return_to_status = false;
+ menu_history_depth = 0;
+ }
#if ENABLED(LCD_PROGRESS_BAR)
+ // For LCD_PROGRESS_BAR re-initialize custom characters
lcd_set_custom_characters(menu == lcd_status_screen);
#endif
}
}
+static void lcd_return_to_status() { lcd_goto_menu(lcd_status_screen); }
+
inline void lcd_save_previous_menu() {
- prevMenu = currentMenu;
- #if ENABLED(ULTIPANEL)
- prevEncoderPosition = encoderPosition;
- #endif
+ if (menu_history_depth < COUNT(menu_history)) {
+ menu_history[menu_history_depth].menu_function = currentMenu;
+ #if ENABLED(ULTIPANEL)
+ menu_history[menu_history_depth].encoder_position = encoderPosition;
+ #endif
+ ++menu_history_depth;
+ }
}
-static void lcd_goto_previous_menu() {
- lcd_goto_menu(prevMenu, true
- #if ENABLED(ULTIPANEL)
- , prevEncoderPosition
- #endif
- );
+static void lcd_goto_previous_menu(bool feedback=false) {
+ if (menu_history_depth > 0) {
+ --menu_history_depth;
+ lcd_goto_menu(menu_history[menu_history_depth].menu_function, feedback
+ #if ENABLED(ULTIPANEL)
+ , menu_history[menu_history_depth].encoder_position
+ #endif
+ );
+ }
+ else
+ lcd_return_to_status();
}
/**
@@ -410,13 +432,13 @@ static void lcd_status_screen() {
}
#if ENABLED(ULTIPANEL_FEEDMULTIPLY)
+ int new_frm = feedrate_multiplier + int(encoderPosition);
// Dead zone at 100% feedrate
- if ((feedrate_multiplier < 100 && (feedrate_multiplier + int(encoderPosition)) > 100) ||
- (feedrate_multiplier > 100 && (feedrate_multiplier + int(encoderPosition)) < 100)) {
- encoderPosition = 0;
+ if ((feedrate_multiplier < 100 && new_frm > 100) || (feedrate_multiplier > 100 && new_frm < 100)) {
feedrate_multiplier = 100;
+ encoderPosition = 0;
}
- if (feedrate_multiplier == 100) {
+ else if (feedrate_multiplier == 100) {
if (int(encoderPosition) > ENCODER_FEEDRATE_DEADZONE) {
feedrate_multiplier += int(encoderPosition) - (ENCODER_FEEDRATE_DEADZONE);
encoderPosition = 0;
@@ -427,7 +449,7 @@ static void lcd_status_screen() {
}
}
else {
- feedrate_multiplier += int(encoderPosition);
+ feedrate_multiplier = new_frm;
encoderPosition = 0;
}
#endif // ULTIPANEL_FEEDMULTIPLY
@@ -439,9 +461,13 @@ static void lcd_status_screen() {
#if ENABLED(ULTIPANEL)
-static void lcd_return_to_status() {
- defer_return_to_status = false;
- lcd_goto_menu(lcd_status_screen);
+inline void line_to_current(AxisEnum axis) {
+ #if ENABLED(DELTA)
+ calculate_delta(current_position);
+ plan_buffer_line(delta[X_AXIS], delta[Y_AXIS], delta[Z_AXIS], current_position[E_AXIS], manual_feedrate[axis]/60, active_extruder);
+ #else
+ plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], manual_feedrate[axis]/60, active_extruder);
+ #endif
}
#if ENABLED(SDSUPPORT)
@@ -469,7 +495,7 @@ static void lcd_return_to_status() {
static void lcd_main_menu() {
START_MENU();
- MENU_ITEM(back, MSG_WATCH, lcd_status_screen);
+ MENU_ITEM(back, MSG_WATCH);
if (movesplanned() || IS_SD_PRINTING) {
MENU_ITEM(submenu, MSG_TUNE, lcd_tune_menu);
}
@@ -508,13 +534,11 @@ static void lcd_main_menu() {
END_MENU();
}
-#if ENABLED(SDSUPPORT) && ENABLED(MENU_ADDAUTOSTART)
- static void lcd_autostart_sd() {
- card.autostart_index = 0;
- card.setroot();
- card.checkautostart(true);
- }
-#endif
+/**
+ *
+ * "Tune" submenu items
+ *
+ */
/**
* Set the home offset based on the current_position
@@ -529,7 +553,7 @@ void lcd_set_home_offsets() {
static void _lcd_babystep(const int axis, const char* msg) {
ENCODER_DIRECTION_NORMAL();
- if (encoderPosition != 0) {
+ if (encoderPosition) {
int distance = (int)encoderPosition * BABYSTEP_MULTIPLICATOR;
encoderPosition = 0;
lcdDrawUpdate = LCD_DRAW_UPDATE_CALL_REDRAW;
@@ -559,7 +583,7 @@ void lcd_set_home_offsets() {
#endif
}
if (lcdDrawUpdate) lcd_implementation_drawedit(msg, NULL);
- if (LCD_CLICKED) lcd_goto_previous_menu();
+ if (LCD_CLICKED) lcd_goto_previous_menu(true);
}
#if ENABLED(BABYSTEP_XY)
@@ -612,7 +636,7 @@ static void lcd_tune_menu() {
//
// ^ Main
//
- MENU_ITEM(back, MSG_MAIN, lcd_main_menu);
+ MENU_ITEM(back, MSG_MAIN);
//
// Speed:
@@ -722,10 +746,17 @@ static void lcd_tune_menu() {
END_MENU();
}
+/**
+ *
+ * "Prepare" submenu items
+ *
+ */
void _lcd_preheat(int endnum, const float temph, const float tempb, const int fan) {
if (temph > 0) setTargetHotend(temph, endnum);
#if TEMP_SENSOR_BED != 0
setTargetBed(tempb);
+ #else
+ UNUSED(tempb);
#endif
#if FAN_COUNT > 0
#if FAN_COUNT > 1
@@ -733,6 +764,8 @@ void _lcd_preheat(int endnum, const float temph, const float tempb, const int fa
#else
fanSpeeds[0] = fan;
#endif
+ #else
+ UNUSED(fan);
#endif
lcd_return_to_status();
}
@@ -778,7 +811,7 @@ void _lcd_preheat(int endnum, const float temph, const float tempb, const int fa
static void lcd_preheat_pla_menu() {
START_MENU();
- MENU_ITEM(back, MSG_PREPARE, lcd_prepare_menu);
+ MENU_ITEM(back, MSG_PREPARE);
#if EXTRUDERS == 1
MENU_ITEM(function, MSG_PREHEAT_PLA, lcd_preheat_pla0);
#else
@@ -800,7 +833,7 @@ void _lcd_preheat(int endnum, const float temph, const float tempb, const int fa
static void lcd_preheat_abs_menu() {
START_MENU();
- MENU_ITEM(back, MSG_PREPARE, lcd_prepare_menu);
+ MENU_ITEM(back, MSG_PREPARE);
#if EXTRUDERS == 1
MENU_ITEM(function, MSG_PREHEAT_ABS, lcd_preheat_abs0);
#else
@@ -830,6 +863,158 @@ void lcd_cooldown() {
lcd_return_to_status();
}
+#if ENABLED(SDSUPPORT) && ENABLED(MENU_ADDAUTOSTART)
+
+ static void lcd_autostart_sd() {
+ card.autostart_index = 0;
+ card.setroot();
+ card.checkautostart(true);
+ }
+
+#endif
+
+#if ENABLED(MANUAL_BED_LEVELING)
+
+ /**
+ *
+ * "Prepare" > "Bed Leveling" handlers
+ *
+ */
+
+ static int _lcd_level_bed_position;
+
+ /**
+ * MBL Wait for controller movement and clicks:
+ * - Movement adjusts the Z axis
+ * - Click saves the Z and goes to the next mesh point
+ */
+ static void _lcd_level_bed_procedure() {
+ static bool mbl_wait_for_move = false;
+ // Menu handlers may be called in a re-entrant fashion
+ // if they call st_synchronize or plan_buffer_line. So
+ // while waiting for a move we just ignore new input.
+ if (mbl_wait_for_move) {
+ lcdDrawUpdate = LCD_DRAW_UPDATE_CALL_NO_REDRAW;
+ return;
+ }
+
+ ENCODER_DIRECTION_NORMAL();
+
+ // Encoder wheel adjusts the Z position
+ if (encoderPosition && movesplanned() <= 3) {
+ refresh_cmd_timeout();
+ current_position[Z_AXIS] += float((int)encoderPosition) * (MBL_Z_STEP);
+ if (min_software_endstops) NOLESS(current_position[Z_AXIS], Z_MIN_POS);
+ if (max_software_endstops) NOMORE(current_position[Z_AXIS], Z_MAX_POS);
+ encoderPosition = 0;
+ line_to_current(Z_AXIS);
+ lcdDrawUpdate = LCD_DRAW_UPDATE_CALL_NO_REDRAW;
+ }
+
+ // Update on first display, then only on updates to Z position
+ if (lcdDrawUpdate) {
+ float v = current_position[Z_AXIS] - MESH_HOME_SEARCH_Z;
+ lcd_implementation_drawedit(PSTR(MSG_MOVE_Z), ftostr43(v + (v < 0 ? -0.0001 : 0.0001), '+'));
+ }
+
+ // We want subsequent calls, but don't force redraw
+ // Set here so it can be overridden by lcd_return_to_status below
+ lcdDrawUpdate = LCD_DRAW_UPDATE_CALL_NO_REDRAW;
+
+ // Click sets the current Z and moves to the next position
+ static bool debounce_click = false;
+ if (LCD_CLICKED) {
+ if (!debounce_click) {
+ debounce_click = true; // ignore multiple "clicks" in a row
+ int ix = _lcd_level_bed_position % (MESH_NUM_X_POINTS),
+ iy = _lcd_level_bed_position / (MESH_NUM_X_POINTS);
+ if (iy & 1) ix = (MESH_NUM_X_POINTS - 1) - ix; // Zig zag
+ mbl.set_z(ix, iy, current_position[Z_AXIS]);
+ _lcd_level_bed_position++;
+ if (_lcd_level_bed_position == (MESH_NUM_X_POINTS) * (MESH_NUM_Y_POINTS)) {
+ lcd_return_to_status();
+ LCD_ALERTMESSAGEPGM(MSG_LEVEL_BED_DONE);
+ #if HAS_BUZZER
+ buzz(200, 659);
+ buzz(200, 698);
+ #endif
+ current_position[Z_AXIS] = MESH_HOME_SEARCH_Z;
+ line_to_current(Z_AXIS);
+ st_synchronize();
+ mbl.active = 1;
+ enqueue_and_echo_commands_P(PSTR("G28"));
+ }
+ else {
+ #if ENABLED(NEWPANEL)
+ lcd_quick_feedback();
+ #endif
+ mbl_wait_for_move = true;
+ current_position[Z_AXIS] = MESH_HOME_SEARCH_Z;
+ line_to_current(Z_AXIS);
+ ix = _lcd_level_bed_position % (MESH_NUM_X_POINTS);
+ iy = _lcd_level_bed_position / (MESH_NUM_X_POINTS);
+ if (iy & 1) ix = (MESH_NUM_X_POINTS - 1) - ix; // Zig zag
+ current_position[X_AXIS] = mbl.get_x(ix);
+ current_position[Y_AXIS] = mbl.get_y(iy);
+ line_to_current(manual_feedrate[X_AXIS] <= manual_feedrate[Y_AXIS] ? X_AXIS : Y_AXIS);
+ st_synchronize();
+ mbl_wait_for_move = false;
+ encoderPosition = 0;
+ }
+ }
+ }
+ else {
+ debounce_click = false;
+ }
+ }
+
+ static void _lcd_level_bed_homing_done() {
+ if (lcdDrawUpdate) lcd_implementation_drawedit(PSTR(MSG_LEVEL_BED_WAITING), NULL);
+ lcdDrawUpdate = LCD_DRAW_UPDATE_CALL_NO_REDRAW;
+ if (LCD_CLICKED) {
+ current_position[Z_AXIS] = MESH_HOME_SEARCH_Z;
+ plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]);
+ current_position[X_AXIS] = MESH_MIN_X;
+ current_position[Y_AXIS] = MESH_MIN_Y;
+ line_to_current(manual_feedrate[X_AXIS] <= manual_feedrate[Y_AXIS] ? X_AXIS : Y_AXIS);
+ _lcd_level_bed_position = 0;
+ lcd_goto_menu(_lcd_level_bed_procedure, true);
+ }
+ }
+
+ /**
+ * MBL Move to mesh starting point
+ */
+ static void _lcd_level_bed_homing() {
+ if (lcdDrawUpdate) lcd_implementation_drawedit(PSTR(MSG_LEVEL_BED_HOMING), NULL);
+ lcdDrawUpdate = LCD_DRAW_UPDATE_CALL_NO_REDRAW;
+ if (axis_known_position[X_AXIS] && axis_known_position[Y_AXIS] && axis_known_position[Z_AXIS])
+ lcd_goto_menu(_lcd_level_bed_homing_done);
+ }
+
+ /**
+ * MBL Continue Bed Leveling...
+ */
+ static void _lcd_level_bed_continue() {
+ defer_return_to_status = true;
+ axis_known_position[X_AXIS] = axis_known_position[Y_AXIS] = axis_known_position[Z_AXIS] = false;
+ mbl.reset();
+ enqueue_and_echo_commands_P(PSTR("G28"));
+ lcd_goto_menu(_lcd_level_bed_homing);
+ }
+
+ /**
+ * MBL entry-point
+ */
+ static void lcd_level_bed() {
+ START_MENU();
+ MENU_ITEM(back, MSG_LEVEL_BED_CANCEL);
+ MENU_ITEM(submenu, MSG_LEVEL_BED, _lcd_level_bed_continue);
+ END_MENU();
+ }
+
+#endif // MANUAL_BED_LEVELING
+
/**
*
* "Prepare" submenu
@@ -842,7 +1027,7 @@ static void lcd_prepare_menu() {
//
// ^ Main
//
- MENU_ITEM(back, MSG_MAIN, lcd_main_menu);
+ MENU_ITEM(back, MSG_MAIN);
//
// Auto Home
@@ -918,7 +1103,7 @@ static void lcd_prepare_menu() {
static void lcd_delta_calibrate_menu() {
START_MENU();
- MENU_ITEM(back, MSG_MAIN, lcd_main_menu);
+ MENU_ITEM(back, MSG_MAIN);
MENU_ITEM(gcode, MSG_AUTO_HOME, PSTR("G28"));
MENU_ITEM(gcode, MSG_DELTA_CALIBRATE_X, PSTR("G0 F8000 X-77.94 Y-45 Z0"));
MENU_ITEM(gcode, MSG_DELTA_CALIBRATE_Y, PSTR("G0 F8000 X77.94 Y-45 Z0"));
@@ -929,15 +1114,6 @@ static void lcd_prepare_menu() {
#endif // DELTA_CALIBRATION_MENU
-inline void line_to_current(AxisEnum axis) {
- #if ENABLED(DELTA)
- calculate_delta(current_position);
- plan_buffer_line(delta[X_AXIS], delta[Y_AXIS], delta[Z_AXIS], current_position[E_AXIS], manual_feedrate[axis]/60, active_extruder);
- #else
- plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], manual_feedrate[axis]/60, active_extruder);
- #endif
-}
-
/**
*
* "Prepare" > "Move Axis" submenu
@@ -945,11 +1121,10 @@ inline void line_to_current(AxisEnum axis) {
*/
float move_menu_scale;
-static void lcd_move_menu_axis();
-static void _lcd_move(const char* name, AxisEnum axis, int min, int max) {
+static void _lcd_move(const char* name, AxisEnum axis, float min, float max) {
ENCODER_DIRECTION_NORMAL();
- if ((encoderPosition != 0) && (movesplanned() <= 3)) {
+ if (encoderPosition && movesplanned() <= 3) {
refresh_cmd_timeout();
current_position[axis] += float((int)encoderPosition) * move_menu_scale;
if (min_software_endstops) NOLESS(current_position[axis], min);
@@ -959,18 +1134,18 @@ static void _lcd_move(const char* name, AxisEnum axis, int min, int max) {
lcdDrawUpdate = LCD_DRAW_UPDATE_CALL_REDRAW;
}
if (lcdDrawUpdate) lcd_implementation_drawedit(name, ftostr31(current_position[axis]));
- if (LCD_CLICKED) lcd_goto_previous_menu();
+ if (LCD_CLICKED) lcd_goto_previous_menu(true);
}
#if ENABLED(DELTA)
static float delta_clip_radius_2 = (DELTA_PRINTABLE_RADIUS) * (DELTA_PRINTABLE_RADIUS);
static int delta_clip( float a ) { return sqrt(delta_clip_radius_2 - a*a); }
- static void lcd_move_x() { int clip = delta_clip(current_position[Y_AXIS]); _lcd_move(PSTR(MSG_MOVE_X), X_AXIS, max(X_MIN_POS, -clip), min(X_MAX_POS, clip)); }
- static void lcd_move_y() { int clip = delta_clip(current_position[X_AXIS]); _lcd_move(PSTR(MSG_MOVE_Y), Y_AXIS, max(Y_MIN_POS, -clip), min(Y_MAX_POS, clip)); }
+ static void lcd_move_x() { int clip = delta_clip(current_position[Y_AXIS]); _lcd_move(PSTR(MSG_MOVE_X), X_AXIS, max(min_pos[X_AXIS], -clip), min(max_pos[X_AXIS], clip)); }
+ static void lcd_move_y() { int clip = delta_clip(current_position[X_AXIS]); _lcd_move(PSTR(MSG_MOVE_Y), Y_AXIS, max(min_pos[Y_AXIS], -clip), min(max_pos[Y_AXIS], clip)); }
#else
- static void lcd_move_x() { _lcd_move(PSTR(MSG_MOVE_X), X_AXIS, X_MIN_POS, X_MAX_POS); }
- static void lcd_move_y() { _lcd_move(PSTR(MSG_MOVE_Y), Y_AXIS, Y_MIN_POS, Y_MAX_POS); }
+ static void lcd_move_x() { _lcd_move(PSTR(MSG_MOVE_X), X_AXIS, min_pos[X_AXIS], max_pos[X_AXIS]); }
+ static void lcd_move_y() { _lcd_move(PSTR(MSG_MOVE_Y), Y_AXIS, min_pos[Y_AXIS], max_pos[Y_AXIS]); }
#endif
-static void lcd_move_z() { _lcd_move(PSTR(MSG_MOVE_Z), Z_AXIS, Z_MIN_POS, Z_MAX_POS); }
+static void lcd_move_z() { _lcd_move(PSTR(MSG_MOVE_Z), Z_AXIS, min_pos[Z_AXIS], max_pos[Z_AXIS]); }
static void lcd_move_e(
#if EXTRUDERS > 1
uint8_t e
@@ -981,7 +1156,7 @@ static void lcd_move_e(
unsigned short original_active_extruder = active_extruder;
active_extruder = e;
#endif
- if ((encoderPosition != 0) && (movesplanned() <= 3)) {
+ if (encoderPosition && movesplanned() <= 3) {
current_position[E_AXIS] += float((int)encoderPosition) * move_menu_scale;
encoderPosition = 0;
line_to_current(E_AXIS);
@@ -1005,7 +1180,7 @@ static void lcd_move_e(
#endif //EXTRUDERS > 1
lcd_implementation_drawedit(pos_label, ftostr31(current_position[E_AXIS]));
}
- if (LCD_CLICKED) lcd_goto_previous_menu();
+ if (LCD_CLICKED) lcd_goto_previous_menu(true);
#if EXTRUDERS > 1
active_extruder = original_active_extruder;
#endif
@@ -1028,13 +1203,22 @@ static void lcd_move_e(
*
*/
-static void lcd_move_menu_axis() {
+#if ENABLED(DELTA) || ENABLED(SCARA)
+ #define _MOVE_XYZ_ALLOWED (axis_homed[X_AXIS] && axis_homed[Y_AXIS] && axis_homed[Z_AXIS])
+#else
+ #define _MOVE_XYZ_ALLOWED true
+#endif
+
+static void _lcd_move_menu_axis() {
START_MENU();
- MENU_ITEM(back, MSG_MOVE_AXIS, lcd_move_menu);
- MENU_ITEM(submenu, MSG_MOVE_X, lcd_move_x);
- MENU_ITEM(submenu, MSG_MOVE_Y, lcd_move_y);
+ MENU_ITEM(back, MSG_MOVE_AXIS);
+
+ if (_MOVE_XYZ_ALLOWED) {
+ MENU_ITEM(submenu, MSG_MOVE_X, lcd_move_x);
+ MENU_ITEM(submenu, MSG_MOVE_Y, lcd_move_y);
+ }
if (move_menu_scale < 10.0) {
- MENU_ITEM(submenu, MSG_MOVE_Z, lcd_move_z);
+ if (_MOVE_XYZ_ALLOWED) MENU_ITEM(submenu, MSG_MOVE_Z, lcd_move_z);
#if EXTRUDERS == 1
MENU_ITEM(submenu, MSG_MOVE_E, lcd_move_e);
#else
@@ -1053,15 +1237,15 @@ static void lcd_move_menu_axis() {
static void lcd_move_menu_10mm() {
move_menu_scale = 10.0;
- lcd_move_menu_axis();
+ _lcd_move_menu_axis();
}
static void lcd_move_menu_1mm() {
move_menu_scale = 1.0;
- lcd_move_menu_axis();
+ _lcd_move_menu_axis();
}
static void lcd_move_menu_01mm() {
move_menu_scale = 0.1;
- lcd_move_menu_axis();
+ _lcd_move_menu_axis();
}
/**
@@ -1072,8 +1256,11 @@ static void lcd_move_menu_01mm() {
static void lcd_move_menu() {
START_MENU();
- MENU_ITEM(back, MSG_PREPARE, lcd_prepare_menu);
- MENU_ITEM(submenu, MSG_MOVE_10MM, lcd_move_menu_10mm);
+ MENU_ITEM(back, MSG_PREPARE);
+
+ if (_MOVE_XYZ_ALLOWED)
+ MENU_ITEM(submenu, MSG_MOVE_10MM, lcd_move_menu_10mm);
+
MENU_ITEM(submenu, MSG_MOVE_1MM, lcd_move_menu_1mm);
MENU_ITEM(submenu, MSG_MOVE_01MM, lcd_move_menu_01mm);
//TODO:X,Y,Z,E
@@ -1088,7 +1275,7 @@ static void lcd_move_menu() {
static void lcd_control_menu() {
START_MENU();
- MENU_ITEM(back, MSG_MAIN, lcd_main_menu);
+ MENU_ITEM(back, MSG_MAIN);
MENU_ITEM(submenu, MSG_TEMPERATURE, lcd_control_temperature_menu);
MENU_ITEM(submenu, MSG_MOTION, lcd_control_motion_menu);
MENU_ITEM(submenu, MSG_VOLUMETRIC, lcd_control_volumetric_menu);
@@ -1146,10 +1333,16 @@ static void lcd_control_menu() {
// Helpers for editing PID Ki & Kd values
// grab the PID value out of the temp variable; scale it; then update the PID driver
void copy_and_scalePID_i(int e) {
+ #if DISABLED(PID_PARAMS_PER_EXTRUDER)
+ UNUSED(e);
+ #endif
PID_PARAM(Ki, e) = scalePID_i(raw_Ki);
updatePID();
}
void copy_and_scalePID_d(int e) {
+ #if DISABLED(PID_PARAMS_PER_EXTRUDER)
+ UNUSED(e);
+ #endif
PID_PARAM(Kd, e) = scalePID_d(raw_Kd);
updatePID();
}
@@ -1191,7 +1384,7 @@ static void lcd_control_temperature_menu() {
//
// ^ Control
//
- MENU_ITEM(back, MSG_CONTROL, lcd_control_menu);
+ MENU_ITEM(back, MSG_CONTROL);
//
// Nozzle:
@@ -1323,7 +1516,7 @@ static void lcd_control_temperature_menu() {
*/
static void lcd_control_temperature_preheat_pla_settings_menu() {
START_MENU();
- MENU_ITEM(back, MSG_TEMPERATURE, lcd_control_temperature_menu);
+ MENU_ITEM(back, MSG_TEMPERATURE);
MENU_ITEM_EDIT(int3, MSG_FAN_SPEED, &plaPreheatFanSpeed, 0, 255);
#if TEMP_SENSOR_0 != 0
MENU_ITEM_EDIT(int3, MSG_NOZZLE, &plaPreheatHotendTemp, HEATER_0_MINTEMP, HEATER_0_MAXTEMP - 15);
@@ -1344,7 +1537,7 @@ static void lcd_control_temperature_preheat_pla_settings_menu() {
*/
static void lcd_control_temperature_preheat_abs_settings_menu() {
START_MENU();
- MENU_ITEM(back, MSG_TEMPERATURE, lcd_control_temperature_menu);
+ MENU_ITEM(back, MSG_TEMPERATURE);
MENU_ITEM_EDIT(int3, MSG_FAN_SPEED, &absPreheatFanSpeed, 0, 255);
#if TEMP_SENSOR_0 != 0
MENU_ITEM_EDIT(int3, MSG_NOZZLE, &absPreheatHotendTemp, HEATER_0_MINTEMP, HEATER_0_MAXTEMP - 15);
@@ -1365,7 +1558,7 @@ static void lcd_control_temperature_preheat_abs_settings_menu() {
*/
static void lcd_control_motion_menu() {
START_MENU();
- MENU_ITEM(back, MSG_CONTROL, lcd_control_menu);
+ MENU_ITEM(back, MSG_CONTROL);
#if ENABLED(AUTO_BED_LEVELING_FEATURE)
MENU_ITEM_EDIT(float32, MSG_ZPROBE_ZOFFSET, &zprobe_zoffset, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX);
#endif
@@ -1418,7 +1611,7 @@ static void lcd_control_motion_menu() {
*/
static void lcd_control_volumetric_menu() {
START_MENU();
- MENU_ITEM(back, MSG_CONTROL, lcd_control_menu);
+ MENU_ITEM(back, MSG_CONTROL);
MENU_ITEM_EDIT_CALLBACK(bool, MSG_VOLUMETRIC_ENABLED, &volumetric_enabled, calculate_volumetric_multipliers);
@@ -1448,7 +1641,7 @@ static void lcd_control_volumetric_menu() {
#if ENABLED(HAS_LCD_CONTRAST)
static void lcd_set_contrast() {
ENCODER_DIRECTION_NORMAL();
- if (encoderPosition != 0) {
+ if (encoderPosition) {
#if ENABLED(U8GLIB_LM6059_AF)
lcd_contrast += encoderPosition;
lcd_contrast &= 0xFF;
@@ -1467,7 +1660,7 @@ static void lcd_control_volumetric_menu() {
lcd_implementation_drawedit(PSTR(MSG_CONTRAST), itostr2(lcd_contrast));
#endif
}
- if (LCD_CLICKED) lcd_goto_previous_menu();
+ if (LCD_CLICKED) lcd_goto_previous_menu(true);
}
#endif // HAS_LCD_CONTRAST
@@ -1479,7 +1672,7 @@ static void lcd_control_volumetric_menu() {
#if ENABLED(FWRETRACT)
static void lcd_control_retract_menu() {
START_MENU();
- MENU_ITEM(back, MSG_CONTROL, lcd_control_menu);
+ MENU_ITEM(back, MSG_CONTROL);
MENU_ITEM_EDIT(bool, MSG_AUTORETRACT, &autoretract_enabled);
MENU_ITEM_EDIT(float52, MSG_CONTROL_RETRACT, &retract_length, 0, 100);
#if EXTRUDERS > 1
@@ -1520,7 +1713,7 @@ static void lcd_control_volumetric_menu() {
if (lcdDrawUpdate == 0 && LCD_CLICKED == 0) return; // nothing to do (so don't thrash the SD card)
uint16_t fileCnt = card.getnrfilenames();
START_MENU();
- MENU_ITEM(back, MSG_MAIN, lcd_main_menu);
+ MENU_ITEM(back, MSG_MAIN);
card.getWorkDirName();
if (card.filename[0] == '/') {
#if !PIN_EXISTS(SD_DETECT)
@@ -1589,7 +1782,7 @@ static void lcd_control_volumetric_menu() {
lcd_implementation_drawedit(editLabel, _strFunc(((_type)((int32_t)encoderPosition + minEditValue)) / scale)); \
if (isClicked) { \
*((_type*)editValue) = ((_type)((int32_t)encoderPosition + minEditValue)) / scale; \
- lcd_goto_previous_menu(); \
+ lcd_goto_previous_menu(true); \
} \
return isClicked; \
} \
@@ -1599,7 +1792,6 @@ static void lcd_control_volumetric_menu() {
lcd_save_previous_menu(); \
\
lcdDrawUpdate = LCD_DRAW_UPDATE_CLEAR_CALL_REDRAW; \
- currentMenu = menu_edit_ ## _name; \
\
editLabel = pstr; \
editValue = ptr; \
@@ -1616,14 +1808,14 @@ static void lcd_control_volumetric_menu() {
currentMenu = menu_edit_callback_ ## _name; \
callbackFunc = callback; \
}
-menu_edit_type(int, int3, itostr3, 1)
-menu_edit_type(float, float3, ftostr3, 1)
-menu_edit_type(float, float32, ftostr32, 100)
-menu_edit_type(float, float43, ftostr43, 1000)
-menu_edit_type(float, float5, ftostr5, 0.01)
-menu_edit_type(float, float51, ftostr51, 10)
-menu_edit_type(float, float52, ftostr52, 100)
-menu_edit_type(unsigned long, long5, ftostr5, 0.01)
+menu_edit_type(int, int3, itostr3, 1);
+menu_edit_type(float, float3, ftostr3, 1);
+menu_edit_type(float, float32, ftostr32, 100);
+menu_edit_type(float, float43, ftostr43, 1000);
+menu_edit_type(float, float5, ftostr5, 0.01);
+menu_edit_type(float, float51, ftostr51, 10);
+menu_edit_type(float, float52, ftostr52, 100);
+menu_edit_type(unsigned long, long5, ftostr5, 0.01);
/**
*
@@ -1662,7 +1854,7 @@ menu_edit_type(unsigned long, long5, ftostr5, 0.01)
lcd_move_y();
}
static void reprapworld_keypad_move_home() {
- enqueue_and_echo_commands_P((PSTR("G28"))); // move all axis home
+ enqueue_and_echo_commands_P(PSTR("G28")); // move all axes home
}
#endif // REPRAPWORLD_KEYPAD
@@ -1712,7 +1904,7 @@ void lcd_quick_feedback() {
* Menu actions
*
*/
-static void menu_action_back(menuFunc_t func) { lcd_goto_menu(func); }
+static void menu_action_back() { lcd_goto_previous_menu(); }
static void menu_action_submenu(menuFunc_t func) { lcd_save_previous_menu(); lcd_goto_menu(func); }
static void menu_action_gcode(const char* pgcode) { enqueue_and_echo_commands_P(pgcode); }
static void menu_action_function(menuFunc_t func) { (*func)(); }
@@ -1720,18 +1912,20 @@ static void menu_action_function(menuFunc_t func) { (*func)(); }
#if ENABLED(SDSUPPORT)
static void menu_action_sdfile(const char* filename, char* longFilename) {
+ UNUSED(longFilename);
card.openAndPrintFile(filename);
lcd_return_to_status();
}
static void menu_action_sddirectory(const char* filename, char* longFilename) {
+ UNUSED(longFilename);
card.chdir(filename);
encoderPosition = 0;
}
#endif //SDSUPPORT
-static void menu_action_setting_edit_bool(const char* pstr, bool* ptr) { *ptr = !(*ptr); }
+static void menu_action_setting_edit_bool(const char* pstr, bool* ptr) {UNUSED(pstr); *ptr = !(*ptr); }
static void menu_action_setting_edit_callback_bool(const char* pstr, bool* ptr, menuFunc_t callback) {
menu_action_setting_edit_bool(pstr, ptr);
(*callback)();
@@ -1909,13 +2103,22 @@ void lcd_update() {
#if ENABLED(ULTIPANEL)
#if ENABLED(REPRAPWORLD_KEYPAD)
- if (REPRAPWORLD_KEYPAD_MOVE_Z_UP) reprapworld_keypad_move_z_up();
- if (REPRAPWORLD_KEYPAD_MOVE_Z_DOWN) reprapworld_keypad_move_z_down();
- if (REPRAPWORLD_KEYPAD_MOVE_X_LEFT) reprapworld_keypad_move_x_left();
- if (REPRAPWORLD_KEYPAD_MOVE_X_RIGHT) reprapworld_keypad_move_x_right();
- if (REPRAPWORLD_KEYPAD_MOVE_Y_DOWN) reprapworld_keypad_move_y_down();
- if (REPRAPWORLD_KEYPAD_MOVE_Y_UP) reprapworld_keypad_move_y_up();
- if (REPRAPWORLD_KEYPAD_MOVE_HOME) reprapworld_keypad_move_home();
+
+ #if ENABLED(DELTA) || ENABLED(SCARA)
+ #define _KEYPAD_MOVE_ALLOWED (axis_homed[X_AXIS] && axis_homed[Y_AXIS] && axis_homed[Z_AXIS])
+ #else
+ #define _KEYPAD_MOVE_ALLOWED true
+ #endif
+
+ if (REPRAPWORLD_KEYPAD_MOVE_HOME) reprapworld_keypad_move_home();
+ if (_KEYPAD_MOVE_ALLOWED) {
+ if (REPRAPWORLD_KEYPAD_MOVE_Z_UP) reprapworld_keypad_move_z_up();
+ if (REPRAPWORLD_KEYPAD_MOVE_Z_DOWN) reprapworld_keypad_move_z_down();
+ if (REPRAPWORLD_KEYPAD_MOVE_X_LEFT) reprapworld_keypad_move_x_left();
+ if (REPRAPWORLD_KEYPAD_MOVE_X_RIGHT) reprapworld_keypad_move_x_right();
+ if (REPRAPWORLD_KEYPAD_MOVE_Y_DOWN) reprapworld_keypad_move_y_down();
+ if (REPRAPWORLD_KEYPAD_MOVE_Y_UP) reprapworld_keypad_move_y_up();
+ }
#endif
bool encoderPastThreshold = (abs(encoderDiff) >= ENCODER_PULSES_PER_STEP);
@@ -2000,7 +2203,7 @@ void lcd_update() {
// Return to Status Screen after a timeout
if (defer_return_to_status)
return_to_status_ms = ms + LCD_TIMEOUT_TO_STATUS;
- else if (currentMenu != lcd_status_screen && millis() > return_to_status_ms) {
+ else if (currentMenu != lcd_status_screen && ms > return_to_status_ms) {
lcd_return_to_status();
}
@@ -2031,6 +2234,10 @@ void lcd_ignore_click(bool b) {
}
void lcd_finishstatus(bool persist=false) {
+ #if !(ENABLED(LCD_PROGRESS_BAR) && (PROGRESS_MSG_EXPIRE > 0))
+ UNUSED(persist);
+ #endif
+
#if ENABLED(LCD_PROGRESS_BAR)
progress_bar_ms = millis();
#if PROGRESS_MSG_EXPIRE > 0
@@ -2473,138 +2680,4 @@ char* ftostr52(const float& x) {
return conv;
}
-#if ENABLED(MANUAL_BED_LEVELING)
-
- static int _lcd_level_bed_position;
-
- /**
- * MBL Wait for controller movement and clicks:
- * - Movement adjusts the Z axis
- * - Click saves the Z and goes to the next mesh point
- */
- static void _lcd_level_bed_procedure() {
- static bool mbl_wait_for_move = false;
- // Menu handlers may be called in a re-entrant fashion
- // if they call st_synchronize or plan_buffer_line. So
- // while waiting for a move we just ignore new input.
- if (mbl_wait_for_move) {
- lcdDrawUpdate = LCD_DRAW_UPDATE_CALL_NO_REDRAW;
- return;
- }
-
- ENCODER_DIRECTION_NORMAL();
-
- // Encoder wheel adjusts the Z position
- if (encoderPosition != 0 && movesplanned() <= 3) {
- refresh_cmd_timeout();
- current_position[Z_AXIS] += float((int)encoderPosition) * (MBL_Z_STEP);
- if (min_software_endstops) NOLESS(current_position[Z_AXIS], Z_MIN_POS);
- if (max_software_endstops) NOMORE(current_position[Z_AXIS], Z_MAX_POS);
- encoderPosition = 0;
- line_to_current(Z_AXIS);
- lcdDrawUpdate = LCD_DRAW_UPDATE_CALL_NO_REDRAW;
- }
-
- // Update on first display, then only on updates to Z position
- if (lcdDrawUpdate) {
- float v = current_position[Z_AXIS] - MESH_HOME_SEARCH_Z;
- lcd_implementation_drawedit(PSTR(MSG_MOVE_Z), ftostr43(v + (v < 0 ? -0.0001 : 0.0001), '+'));
- }
-
- // We want subsequent calls, but don't force redraw
- // Set here so it can be overridden by lcd_return_to_status below
- lcdDrawUpdate = LCD_DRAW_UPDATE_CALL_NO_REDRAW;
-
- // Click sets the current Z and moves to the next position
- static bool debounce_click = false;
- if (LCD_CLICKED) {
- if (!debounce_click) {
- debounce_click = true; // ignore multiple "clicks" in a row
- int ix = _lcd_level_bed_position % (MESH_NUM_X_POINTS),
- iy = _lcd_level_bed_position / (MESH_NUM_X_POINTS);
- if (iy & 1) ix = (MESH_NUM_X_POINTS - 1) - ix; // Zig zag
- mbl.set_z(ix, iy, current_position[Z_AXIS]);
- _lcd_level_bed_position++;
- if (_lcd_level_bed_position == (MESH_NUM_X_POINTS) * (MESH_NUM_Y_POINTS)) {
- current_position[Z_AXIS] = MESH_HOME_SEARCH_Z;
- mbl_wait_for_move = true;
- line_to_current(Z_AXIS);
- st_synchronize();
- mbl.active = 1;
- enqueue_and_echo_commands_P(PSTR("G28"));
- mbl_wait_for_move = false;
- lcd_return_to_status();
- #if ENABLED(NEWPANEL)
- lcd_quick_feedback();
- #endif
- LCD_ALERTMESSAGEPGM(MSG_LEVEL_BED_DONE);
- #if HAS_BUZZER
- buzz(200, 659);
- buzz(200, 698);
- #endif
- }
- else {
- current_position[Z_AXIS] = MESH_HOME_SEARCH_Z;
- line_to_current(Z_AXIS);
- ix = _lcd_level_bed_position % (MESH_NUM_X_POINTS);
- iy = _lcd_level_bed_position / (MESH_NUM_X_POINTS);
- if (iy & 1) ix = (MESH_NUM_X_POINTS - 1) - ix; // Zig zag
- current_position[X_AXIS] = mbl.get_x(ix);
- current_position[Y_AXIS] = mbl.get_y(iy);
- line_to_current(manual_feedrate[X_AXIS] <= manual_feedrate[Y_AXIS] ? X_AXIS : Y_AXIS);
- }
- }
- }
- else {
- debounce_click = false;
- }
- }
-
- static void _lcd_level_bed_homing_done() {
- if (lcdDrawUpdate) lcd_implementation_drawedit(PSTR(MSG_LEVEL_BED_WAITING), NULL);
- lcdDrawUpdate = LCD_DRAW_UPDATE_CALL_NO_REDRAW;
- if (LCD_CLICKED) {
- current_position[Z_AXIS] = MESH_HOME_SEARCH_Z;
- plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]);
- current_position[X_AXIS] = MESH_MIN_X;
- current_position[Y_AXIS] = MESH_MIN_Y;
- line_to_current(manual_feedrate[X_AXIS] <= manual_feedrate[Y_AXIS] ? X_AXIS : Y_AXIS);
- _lcd_level_bed_position = 0;
- lcd_goto_menu(_lcd_level_bed_procedure, true);
- }
- }
-
- /**
- * MBL Move to mesh starting point
- */
- static void _lcd_level_bed_homing() {
- if (lcdDrawUpdate) lcd_implementation_drawedit(PSTR(MSG_LEVEL_BED_HOMING), NULL);
- lcdDrawUpdate = LCD_DRAW_UPDATE_CALL_NO_REDRAW;
- if (axis_known_position[X_AXIS] && axis_known_position[Y_AXIS] && axis_known_position[Z_AXIS])
- lcd_goto_menu(_lcd_level_bed_homing_done);
- }
-
- /**
- * MBL Continue Bed Leveling...
- */
- static void _lcd_level_bed_continue() {
- defer_return_to_status = true;
- axis_known_position[X_AXIS] = axis_known_position[Y_AXIS] = axis_known_position[Z_AXIS] = false;
- mbl.reset();
- enqueue_and_echo_commands_P(PSTR("G28"));
- lcd_goto_menu(_lcd_level_bed_homing, true);
- }
-
- /**
- * MBL entry-point
- */
- static void lcd_level_bed() {
- START_MENU();
- MENU_ITEM(back, "Cancel", lcd_prepare_menu);
- MENU_ITEM(submenu, MSG_LEVEL_BED, _lcd_level_bed_continue);
- END_MENU();
- }
-
-#endif // MANUAL_BED_LEVELING
-
#endif // ULTRA_LCD
diff --git a/Marlin/ultralcd.h b/Marlin/ultralcd.h
index cbc5e05c46..61abf9cede 100644
--- a/Marlin/ultralcd.h
+++ b/Marlin/ultralcd.h
@@ -65,9 +65,6 @@
#if ENABLED(ULTIPANEL)
void lcd_buttons_update();
extern volatile uint8_t buttons; //the last checked buttons in a bit array.
- #if ENABLED(REPRAPWORLD_KEYPAD)
- extern volatile uint8_t buttons_reprapworld_keypad; // to store the keypad shift register values
- #endif
#else
FORCE_INLINE void lcd_buttons_update() {}
#endif
@@ -89,33 +86,52 @@
void lcd_ignore_click(bool b=true);
bool lcd_blink();
+ #if ENABLED(ULTIPANEL) && ENABLED(REPRAPWORLD_KEYPAD)
+
+ #define REPRAPWORLD_BTN_OFFSET 0 // bit offset into buttons for shift register values
+
+ #define BLEN_REPRAPWORLD_KEYPAD_F3 0
+ #define BLEN_REPRAPWORLD_KEYPAD_F2 1
+ #define BLEN_REPRAPWORLD_KEYPAD_F1 2
+ #define BLEN_REPRAPWORLD_KEYPAD_DOWN 3
+ #define BLEN_REPRAPWORLD_KEYPAD_RIGHT 4
+ #define BLEN_REPRAPWORLD_KEYPAD_MIDDLE 5
+ #define BLEN_REPRAPWORLD_KEYPAD_UP 6
+ #define BLEN_REPRAPWORLD_KEYPAD_LEFT 7
+
+ #define EN_REPRAPWORLD_KEYPAD_F3 (_BV(REPRAPWORLD_BTN_OFFSET + BLEN_REPRAPWORLD_KEYPAD_F3))
+ #define EN_REPRAPWORLD_KEYPAD_F2 (_BV(REPRAPWORLD_BTN_OFFSET + BLEN_REPRAPWORLD_KEYPAD_F2))
+ #define EN_REPRAPWORLD_KEYPAD_F1 (_BV(REPRAPWORLD_BTN_OFFSET + BLEN_REPRAPWORLD_KEYPAD_F1))
+ #define EN_REPRAPWORLD_KEYPAD_DOWN (_BV(REPRAPWORLD_BTN_OFFSET + BLEN_REPRAPWORLD_KEYPAD_DOWN))
+ #define EN_REPRAPWORLD_KEYPAD_RIGHT (_BV(REPRAPWORLD_BTN_OFFSET + BLEN_REPRAPWORLD_KEYPAD_RIGHT))
+ #define EN_REPRAPWORLD_KEYPAD_MIDDLE (_BV(REPRAPWORLD_BTN_OFFSET + BLEN_REPRAPWORLD_KEYPAD_MIDDLE))
+ #define EN_REPRAPWORLD_KEYPAD_UP (_BV(REPRAPWORLD_BTN_OFFSET + BLEN_REPRAPWORLD_KEYPAD_UP))
+ #define EN_REPRAPWORLD_KEYPAD_LEFT (_BV(REPRAPWORLD_BTN_OFFSET + BLEN_REPRAPWORLD_KEYPAD_LEFT))
+
+ #define REPRAPWORLD_KEYPAD_MOVE_Z_DOWN (buttons_reprapworld_keypad & EN_REPRAPWORLD_KEYPAD_F3)
+ #define REPRAPWORLD_KEYPAD_MOVE_Z_UP (buttons_reprapworld_keypad & EN_REPRAPWORLD_KEYPAD_F2)
+ #define REPRAPWORLD_KEYPAD_MOVE_Y_DOWN (buttons_reprapworld_keypad & EN_REPRAPWORLD_KEYPAD_DOWN)
+ #define REPRAPWORLD_KEYPAD_MOVE_X_RIGHT (buttons_reprapworld_keypad & EN_REPRAPWORLD_KEYPAD_RIGHT)
+ #define REPRAPWORLD_KEYPAD_MOVE_HOME (buttons_reprapworld_keypad & EN_REPRAPWORLD_KEYPAD_MIDDLE)
+ #define REPRAPWORLD_KEYPAD_MOVE_Y_UP (buttons_reprapworld_keypad & EN_REPRAPWORLD_KEYPAD_UP)
+ #define REPRAPWORLD_KEYPAD_MOVE_X_LEFT (buttons_reprapworld_keypad & EN_REPRAPWORLD_KEYPAD_LEFT)
+
+ #endif //ULTIPANEL && REPRAPWORLD_KEYPAD
+
#if ENABLED(NEWPANEL)
+
#define EN_C (_BV(BLEN_C))
#define EN_B (_BV(BLEN_B))
#define EN_A (_BV(BLEN_A))
#if ENABLED(REPRAPWORLD_KEYPAD)
- #define EN_REPRAPWORLD_KEYPAD_F3 (_BV(BLEN_REPRAPWORLD_KEYPAD_F3))
- #define EN_REPRAPWORLD_KEYPAD_F2 (_BV(BLEN_REPRAPWORLD_KEYPAD_F2))
- #define EN_REPRAPWORLD_KEYPAD_F1 (_BV(BLEN_REPRAPWORLD_KEYPAD_F1))
- #define EN_REPRAPWORLD_KEYPAD_UP (_BV(BLEN_REPRAPWORLD_KEYPAD_UP))
- #define EN_REPRAPWORLD_KEYPAD_RIGHT (_BV(BLEN_REPRAPWORLD_KEYPAD_RIGHT))
- #define EN_REPRAPWORLD_KEYPAD_MIDDLE (_BV(BLEN_REPRAPWORLD_KEYPAD_MIDDLE))
- #define EN_REPRAPWORLD_KEYPAD_DOWN (_BV(BLEN_REPRAPWORLD_KEYPAD_DOWN))
- #define EN_REPRAPWORLD_KEYPAD_LEFT (_BV(BLEN_REPRAPWORLD_KEYPAD_LEFT))
-
#define LCD_CLICKED ((buttons&EN_C) || (buttons_reprapworld_keypad&EN_REPRAPWORLD_KEYPAD_F1))
- #define REPRAPWORLD_KEYPAD_MOVE_Z_UP (buttons_reprapworld_keypad&EN_REPRAPWORLD_KEYPAD_F2)
- #define REPRAPWORLD_KEYPAD_MOVE_Z_DOWN (buttons_reprapworld_keypad&EN_REPRAPWORLD_KEYPAD_F3)
- #define REPRAPWORLD_KEYPAD_MOVE_X_LEFT (buttons_reprapworld_keypad&EN_REPRAPWORLD_KEYPAD_LEFT)
- #define REPRAPWORLD_KEYPAD_MOVE_X_RIGHT (buttons_reprapworld_keypad&EN_REPRAPWORLD_KEYPAD_RIGHT)
- #define REPRAPWORLD_KEYPAD_MOVE_Y_DOWN (buttons_reprapworld_keypad&EN_REPRAPWORLD_KEYPAD_DOWN)
- #define REPRAPWORLD_KEYPAD_MOVE_Y_UP (buttons_reprapworld_keypad&EN_REPRAPWORLD_KEYPAD_UP)
- #define REPRAPWORLD_KEYPAD_MOVE_HOME (buttons_reprapworld_keypad&EN_REPRAPWORLD_KEYPAD_MIDDLE)
#else
#define LCD_CLICKED (buttons&EN_C)
- #endif //REPRAPWORLD_KEYPAD
- #else
+ #endif
+
+ #else //!NEWPANEL
+
//atomic, do not change
#define B_LE (_BV(BL_LE))
#define B_UP (_BV(BL_UP))
@@ -127,7 +143,8 @@
#define EN_A (_BV(BLEN_A))
#define LCD_CLICKED ((buttons&B_MI)||(buttons&B_ST))
- #endif//NEWPANEL
+
+ #endif //!NEWPANEL
#else //no LCD
FORCE_INLINE void lcd_update() {}
diff --git a/Marlin/ultralcd_implementation_hitachi_HD44780.h b/Marlin/ultralcd_implementation_hitachi_HD44780.h
index 9d10bce995..26399fbad4 100644
--- a/Marlin/ultralcd_implementation_hitachi_HD44780.h
+++ b/Marlin/ultralcd_implementation_hitachi_HD44780.h
@@ -98,31 +98,8 @@ extern volatile uint8_t buttons; //an extended version of the last checked butt
#endif
#elif ENABLED(REPRAPWORLD_KEYPAD)
- // define register bit values, don't change it
- #define BLEN_REPRAPWORLD_KEYPAD_F3 0
- #define BLEN_REPRAPWORLD_KEYPAD_F2 1
- #define BLEN_REPRAPWORLD_KEYPAD_F1 2
- #define BLEN_REPRAPWORLD_KEYPAD_UP 6
- #define BLEN_REPRAPWORLD_KEYPAD_RIGHT 4
- #define BLEN_REPRAPWORLD_KEYPAD_MIDDLE 5
- #define BLEN_REPRAPWORLD_KEYPAD_DOWN 3
- #define BLEN_REPRAPWORLD_KEYPAD_LEFT 7
- #define REPRAPWORLD_BTN_OFFSET 0 // bit offset into buttons for shift register values
-
- #define EN_REPRAPWORLD_KEYPAD_F3 (_BV(BLEN_REPRAPWORLD_KEYPAD_F3+REPRAPWORLD_BTN_OFFSET))
- #define EN_REPRAPWORLD_KEYPAD_F2 (_BV(BLEN_REPRAPWORLD_KEYPAD_F2+REPRAPWORLD_BTN_OFFSET))
- #define EN_REPRAPWORLD_KEYPAD_F1 (_BV(BLEN_REPRAPWORLD_KEYPAD_F1+REPRAPWORLD_BTN_OFFSET))
- #define EN_REPRAPWORLD_KEYPAD_UP (_BV(BLEN_REPRAPWORLD_KEYPAD_UP+REPRAPWORLD_BTN_OFFSET))
- #define EN_REPRAPWORLD_KEYPAD_RIGHT (_BV(BLEN_REPRAPWORLD_KEYPAD_RIGHT+REPRAPWORLD_BTN_OFFSET))
- #define EN_REPRAPWORLD_KEYPAD_MIDDLE (_BV(BLEN_REPRAPWORLD_KEYPAD_MIDDLE+REPRAPWORLD_BTN_OFFSET))
- #define EN_REPRAPWORLD_KEYPAD_DOWN (_BV(BLEN_REPRAPWORLD_KEYPAD_DOWN+REPRAPWORLD_BTN_OFFSET))
- #define EN_REPRAPWORLD_KEYPAD_LEFT (_BV(BLEN_REPRAPWORLD_KEYPAD_LEFT+REPRAPWORLD_BTN_OFFSET))
-
- //#define LCD_CLICKED ((buttons&EN_C) || (buttons&EN_REPRAPWORLD_KEYPAD_F1))
- //#define REPRAPWORLD_KEYPAD_MOVE_Y_DOWN (buttons&EN_REPRAPWORLD_KEYPAD_DOWN)
- //#define REPRAPWORLD_KEYPAD_MOVE_Y_UP (buttons&EN_REPRAPWORLD_KEYPAD_UP)
- //#define REPRAPWORLD_KEYPAD_MOVE_HOME (buttons&EN_REPRAPWORLD_KEYPAD_MIDDLE)
+ // REPRAPWORLD_KEYPAD defined in ultralcd.h
#elif ENABLED(NEWPANEL)
#define LCD_CLICKED (buttons&EN_C)
@@ -739,9 +716,9 @@ static void lcd_implementation_status_screen() {
lcd.setCursor(LCD_WIDTH - 6, 2);
lcd.print(LCD_STR_CLOCK[0]);
- if (print_job_start_ms != 0) {
- uint16_t time = (((print_job_stop_ms > print_job_start_ms)
- ? print_job_stop_ms : millis()) - print_job_start_ms) / 60000;
+
+ uint16_t time = print_job_timer.duration() / 60;
+ if (time != 0) {
lcd.print(itostr2(time / 60));
lcd.print(':');
lcd.print(itostr2(time % 60));
@@ -873,6 +850,7 @@ void lcd_implementation_drawedit(const char* pstr, const char* value) {
#if ENABLED(SDSUPPORT)
static void lcd_implementation_drawmenu_sd(bool sel, uint8_t row, const char* pstr, const char* filename, char* longFilename, uint8_t concat, char post_char) {
+ UNUSED(pstr);
char c;
uint8_t n = LCD_WIDTH - concat;
lcd.setCursor(0, row);
@@ -899,7 +877,7 @@ void lcd_implementation_drawedit(const char* pstr, const char* value) {
#endif //SDSUPPORT
-#define lcd_implementation_drawmenu_back(sel, row, pstr, data) lcd_implementation_drawmenu_generic(sel, row, pstr, LCD_STR_UPLEVEL[0], LCD_STR_UPLEVEL[0])
+#define lcd_implementation_drawmenu_back(sel, row, pstr) lcd_implementation_drawmenu_generic(sel, row, pstr, LCD_STR_UPLEVEL[0], LCD_STR_UPLEVEL[0])
#define lcd_implementation_drawmenu_submenu(sel, row, pstr, data) lcd_implementation_drawmenu_generic(sel, row, pstr, '>', LCD_STR_ARROW_RIGHT[0])
#define lcd_implementation_drawmenu_gcode(sel, row, pstr, gcode) lcd_implementation_drawmenu_generic(sel, row, pstr, '>', ' ')
#define lcd_implementation_drawmenu_function(sel, row, pstr, data) lcd_implementation_drawmenu_generic(sel, row, pstr, '>', ' ')