Commit df9b8615 authored by Simone Primarosa's avatar Simone Primarosa

Merge pull request #6 from MagoKimbra/master

Update from origin
parents b80e6f43 428a5e3e
### Version 4.1.5 RC ### Version 4.1.5
* Critical stepper motor frequency bugfix * Critical stepper motor frequency bugfix
* Introduced more intuitive menu tree. * Introduced more intuitive menu tree.
* Added a menu option to fix loose steps from LCD * Added a menu option to fix loose steps from LCD
* Improved italian translation * Improved italian translation
* G28 gcode now support the "B" flag that enable you to come back to the last position of the axis before the homing command. (Used for fix loose steps) * G28 gcode now support the "B" flag that enable you to come back to the last position of the axis before the homing command. (Used for fix loose steps)
### Version 4.1.5
* Implemented FAST_PWM_FAN and FAN_SOFT_PWM also for other fan that can be added in configuration_adv file. * Implemented FAST_PWM_FAN and FAN_SOFT_PWM also for other fan that can be added in configuration_adv file.
* Added the ability to set a min speed to the fan that can be added in configuration_adv file. * Added the ability to set a min speed to the fan that can be added in configuration_adv file.
* General bugfix * General bugfix
......
...@@ -417,7 +417,7 @@ const unsigned int dropsegments = 5; // everything with less than this number of ...@@ -417,7 +417,7 @@ const unsigned int dropsegments = 5; // everything with less than this number of
// Add support for filament exchange support M600; requires display // Add support for filament exchange support M600; requires display
#if ENABLED(ULTIPANEL) #if ENABLED(ULTIPANEL)
//#define FILAMENTCHANGEENABLE //#define FILAMENTCHANGEENABLE
#endif
#if ENABLED(FILAMENTCHANGEENABLE) #if ENABLED(FILAMENTCHANGEENABLE)
#define FILAMENTCHANGE_XPOS 3 #define FILAMENTCHANGE_XPOS 3
#define FILAMENTCHANGE_YPOS 3 #define FILAMENTCHANGE_YPOS 3
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
// #error "You must specify the following parameters related to your distribution" // #error "You must specify the following parameters related to your distribution"
#if true #if true
#define SHORT_BUILD_VERSION "4.1.5 RC" #define SHORT_BUILD_VERSION "4.1.5 dev"
#define STRING_DISTRIBUTION_DATE __DATE__ " " __TIME__ // build date and time #define STRING_DISTRIBUTION_DATE __DATE__ " " __TIME__ // build date and time
// It might also be appropriate to define a location where additional information can be found // It might also be appropriate to define a location where additional information can be found
#define SOURCE_CODE_URL "https://github.com/MagoKimbra/MarlinKimbra" #define SOURCE_CODE_URL "https://github.com/MagoKimbra/MarlinKimbra"
......
...@@ -3002,22 +3002,20 @@ inline void gcode_G28() { ...@@ -3002,22 +3002,20 @@ inline void gcode_G28() {
set_destination_to_current(); set_destination_to_current();
bool come_back = code_seen('B'); bool come_back = code_seen('B');
float lastpos[NUM_AXIS-1]; float lastpos[NUM_AXIS];
float oldfeedrate; float oldfeedrate;
if(come_back) { if(come_back) {
oldfeedrate = feedrate; oldfeedrate = feedrate;
for (int i = 0; i <= NUM_AXIS-1; i++) { memcpy(lastpos, current_position, sizeof(lastpos));
lastpos[i] = current_position[i];
}
} }
feedrate = 0.0; feedrate = 0.0;
bool homeX = code_seen(axis_codes[X_AXIS]), bool homeX = code_seen(axis_codes[X_AXIS]),
homeY = code_seen(axis_codes[Y_AXIS]), homeY = code_seen(axis_codes[Y_AXIS]),
homeZ = code_seen(axis_codes[Z_AXIS]), homeZ = code_seen(axis_codes[Z_AXIS]),
homeE = code_seen(axis_codes[E_AXIS]); homeE = code_seen(axis_codes[E_AXIS]);
home_all_axis = (!homeX && !homeY && !homeZ && !homeE) || (homeX && homeY && homeZ); home_all_axis = (!homeX && !homeY && !homeZ && !homeE) || (homeX && homeY && homeZ);
#ifdef NPR2 #ifdef NPR2
...@@ -3408,9 +3406,7 @@ inline void gcode_G28() { ...@@ -3408,9 +3406,7 @@ inline void gcode_G28() {
if(come_back) { if(come_back) {
#if ENABLED(DELTA) #if ENABLED(DELTA)
feedrate = 1.732 * homing_feedrate[X_AXIS]; feedrate = 1.732 * homing_feedrate[X_AXIS];
if(homeX) destination[X_AXIS] = lastpos[X_AXIS]; memcpy(destination, lastpos, sizeof(destination));
if(homeY) destination[X_AXIS] = lastpos[X_AXIS];
if(homeZ) destination[X_AXIS] = lastpos[X_AXIS];
prepare_move(); prepare_move();
feedrate = oldfeedrate; feedrate = oldfeedrate;
#else #else
...@@ -7092,7 +7088,7 @@ void clamp_to_software_endstops(float target[3]) { ...@@ -7092,7 +7088,7 @@ void clamp_to_software_endstops(float target[3]) {
} }
} }
#ifdef PREVENT_DANGEROUS_EXTRUDE #if ENABLED(PREVENT_DANGEROUS_EXTRUDE)
FORCE_INLINE void prevent_dangerous_extrude(float &curr_e, float &dest_e) { FORCE_INLINE void prevent_dangerous_extrude(float &curr_e, float &dest_e) {
float de = dest_e - curr_e; float de = dest_e - curr_e;
...@@ -7113,7 +7109,7 @@ void clamp_to_software_endstops(float target[3]) { ...@@ -7113,7 +7109,7 @@ void clamp_to_software_endstops(float target[3]) {
#endif // PREVENT_DANGEROUS_EXTRUDE #endif // PREVENT_DANGEROUS_EXTRUDE
#if defined(DELTA) || defined(SCARA) #if ENABLED(DELTA) || ENABLED(SCARA)
inline bool prepare_move_delta(float target[NUM_AXIS]) { inline bool prepare_move_delta(float target[NUM_AXIS]) {
...@@ -7173,11 +7169,11 @@ void clamp_to_software_endstops(float target[3]) { ...@@ -7173,11 +7169,11 @@ void clamp_to_software_endstops(float target[3]) {
#endif // DELTA || SCARA #endif // DELTA || SCARA
#ifdef SCARA #if ENABLED(SCARA)
inline bool prepare_move_scara(float target[NUM_AXIS]) { return prepare_move_delta(target); } inline bool prepare_move_scara(float target[NUM_AXIS]) { return prepare_move_delta(target); }
#endif #endif
#ifdef DUAL_X_CARRIAGE #if ENABLED(DUAL_X_CARRIAGE)
inline bool prepare_move_dual_x_carriage() { inline bool prepare_move_dual_x_carriage() {
if (active_extruder_parked) { if (active_extruder_parked) {
...@@ -7215,7 +7211,7 @@ void clamp_to_software_endstops(float target[3]) { ...@@ -7215,7 +7211,7 @@ void clamp_to_software_endstops(float target[3]) {
#endif // DUAL_X_CARRIAGE #endif // DUAL_X_CARRIAGE
#if defined(CARTESIAN) || defined(COREXY) || defined(COREXZ) #if ENABLED(CARTESIAN) || ENABLED(COREXY) || ENABLED(COREXZ)
inline bool prepare_move_cartesian() { inline bool prepare_move_cartesian() {
// Do not use feedrate_multiplier for E or Z only moves // Do not use feedrate_multiplier for E or Z only moves
...@@ -7240,21 +7236,21 @@ void prepare_move() { ...@@ -7240,21 +7236,21 @@ void prepare_move() {
clamp_to_software_endstops(destination); clamp_to_software_endstops(destination);
refresh_cmd_timeout(); refresh_cmd_timeout();
#ifdef PREVENT_DANGEROUS_EXTRUDE #if ENABLED(PREVENT_DANGEROUS_EXTRUDE)
prevent_dangerous_extrude(current_position[E_AXIS], destination[E_AXIS]); prevent_dangerous_extrude(current_position[E_AXIS], destination[E_AXIS]);
#endif #endif
#ifdef SCARA #if ENABLED(SCARA)
if (!prepare_move_scara(destination)) return; if (!prepare_move_scara(destination)) return;
#elif defined(DELTA) #elif ENABLED(DELTA)
if (!prepare_move_delta(destination)) return; if (!prepare_move_delta(destination)) return;
#endif #endif
#ifdef DUAL_X_CARRIAGE #if ENABLED(DUAL_X_CARRIAGE)
if (!prepare_move_dual_x_carriage()) return; if (!prepare_move_dual_x_carriage()) return;
#endif #endif
#if defined(CARTESIAN) || defined(COREXY) || defined(COREXZ) #if ENABLED(CARTESIAN) || ENABLED(COREXY) || ENABLED(COREXZ)
if (!prepare_move_cartesian()) return; if (!prepare_move_cartesian()) return;
#endif #endif
...@@ -7374,7 +7370,7 @@ void plan_arc( ...@@ -7374,7 +7370,7 @@ void plan_arc(
arc_target[E_AXIS] += extruder_per_segment; arc_target[E_AXIS] += extruder_per_segment;
clamp_to_software_endstops(arc_target); clamp_to_software_endstops(arc_target);
#if defined(DELTA) || defined(SCARA) #if ENABLED(DELTA) || ENABLED(SCARA)
calculate_delta(arc_target); calculate_delta(arc_target);
adjust_delta(arc_target); adjust_delta(arc_target);
plan_buffer_line(delta[X_AXIS], delta[Y_AXIS], delta[Z_AXIS], arc_target[E_AXIS], feed_rate, active_extruder, active_driver); plan_buffer_line(delta[X_AXIS], delta[Y_AXIS], delta[Z_AXIS], arc_target[E_AXIS], feed_rate, active_extruder, active_driver);
...@@ -7384,7 +7380,7 @@ void plan_arc( ...@@ -7384,7 +7380,7 @@ void plan_arc(
} }
// Ensure last segment arrives at target location. // Ensure last segment arrives at target location.
#if defined(DELTA) || defined(SCARA) #if ENABLED(DELTA) || ENABLED(SCARA)
calculate_delta(target); calculate_delta(target);
adjust_delta(arc_target); adjust_delta(arc_target);
plan_buffer_line(delta[X_AXIS], delta[Y_AXIS], delta[Z_AXIS], target[E_AXIS], feed_rate, active_extruder, active_driver); plan_buffer_line(delta[X_AXIS], delta[Y_AXIS], delta[Z_AXIS], target[E_AXIS], feed_rate, active_extruder, active_driver);
...@@ -7442,7 +7438,7 @@ void plan_arc( ...@@ -7442,7 +7438,7 @@ void plan_arc(
#endif // HAS_CONTROLLERFAN #endif // HAS_CONTROLLERFAN
#ifdef SCARA #if ENABLED(SCARA)
void calculate_SCARA_forward_Transform(float f_scara[3]) { void calculate_SCARA_forward_Transform(float f_scara[3]) {
// Perform forward kinematics, and place results in delta[3] // Perform forward kinematics, and place results in delta[3]
......
...@@ -385,18 +385,17 @@ ...@@ -385,18 +385,17 @@
#endif #endif
/** /**
* Babystepping and M600 * Babystepping
*/ */
#if ENABLED(CARTESIAN) #if ENABLED(CARTESIAN)
#define BABYSTEPPING // On Cartesian printer this can be enabled as default as fully working #define BABYSTEPPING // On Cartesian printer this can be enabled as default as fully working
#define FILAMENTCHANGEENABLE // On Cartesian printer this can be enabled as default as fully working
#endif #endif
/** /**
* MAX_STEP_FREQUENCY differs for TOSHIBA OR ARDUINO DUE OR ARDUINO MEGA * MAX_STEP_FREQUENCY differs for TOSHIBA OR ARDUINO DUE OR ARDUINO MEGA
*/ */
#ifdef __SAM3X8E__ #ifdef __SAM3X8E__
#if defined(CONFIG_STEPPERS_TOSHIBA) #if ENABLED(CONFIG_STEPPERS_TOSHIBA) || DISABLED(ENABLE_HIGH_SPEED_STEPPING)
#define MAX_STEP_FREQUENCY 150000 // Max step frequency for Toshiba Stepper Controllers #define MAX_STEP_FREQUENCY 150000 // Max step frequency for Toshiba Stepper Controllers
#define DOUBLE_STEP_FREQUENCY MAX_STEP_FREQUENCY #define DOUBLE_STEP_FREQUENCY MAX_STEP_FREQUENCY
#else #else
...@@ -404,7 +403,7 @@ ...@@ -404,7 +403,7 @@
#define DOUBLE_STEP_FREQUENCY 100000 //96kHz is close to maximum for an Arduino Due #define DOUBLE_STEP_FREQUENCY 100000 //96kHz is close to maximum for an Arduino Due
#endif #endif
#else #else
#if defined(CONFIG_STEPPERS_TOSHIBA) #if ENABLED(CONFIG_STEPPERS_TOSHIBA)
#define MAX_STEP_FREQUENCY 10000 // Max step frequency for Toshiba Stepper Controllers #define MAX_STEP_FREQUENCY 10000 // Max step frequency for Toshiba Stepper Controllers
#define DOUBLE_STEP_FREQUENCY MAX_STEP_FREQUENCY #define DOUBLE_STEP_FREQUENCY MAX_STEP_FREQUENCY
#else #else
......
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
#define DISPLAY_CHARSET_ISO10646_1 // use the better font on full graphic displays. #define DISPLAY_CHARSET_ISO10646_1 // use the better font on full graphic displays.
#endif #endif
#define WELCOME_MSG MACHfINE_NAME " ready." #define WELCOME_MSG MACHINE_NAME " ready."
#define MSG_SD_INSERTED "Card inserted" #define MSG_SD_INSERTED "Card inserted"
#define MSG_SD_REMOVED "Card removed" #define MSG_SD_REMOVED "Card removed"
#define MSG_MAIN "Main" #define MSG_MAIN "Main"
...@@ -142,10 +142,10 @@ ...@@ -142,10 +142,10 @@
#define MSG_ZPROBE_OUT "Z probe out. bed" #define MSG_ZPROBE_OUT "Z probe out. bed"
#define MSG_POSITION_UNKNOWN "Home X/Y before Z" #define MSG_POSITION_UNKNOWN "Home X/Y before Z"
#define MSG_ZPROBE_ZOFFSET "Z Offset" #define MSG_ZPROBE_ZOFFSET "Z Offset"
#define MSG_BABYSTEP_X "Babystep X"
#define MSG_BABYSTEP_Y "Babystep Y"
#define MSG_BABYSTEP_Z "Babystep Z"
#define MSG_BABYSTEP "Babystep" #define MSG_BABYSTEP "Babystep"
#define MSG_BABYSTEP_X MSG_BABYSTEP " " MSG_X
#define MSG_BABYSTEP_Y MSG_BABYSTEP " " MSG_Y
#define MSG_BABYSTEP_Z MSG_BABYSTEP " " MSG_Z
#define MSG_ENDSTOP_ABORT "Endstop abort" #define MSG_ENDSTOP_ABORT "Endstop abort"
#define MSG_HEATING_FAILED_LCD "Heating failed" #define MSG_HEATING_FAILED_LCD "Heating failed"
#define MSG_ERR_REDUNDANT_TEMP "Err: REDUNDANT TEMP ERROR" #define MSG_ERR_REDUNDANT_TEMP "Err: REDUNDANT TEMP ERROR"
......
...@@ -137,10 +137,10 @@ ...@@ -137,10 +137,10 @@
#define MSG_ZPROBE_OUT "Z probe out. bed" #define MSG_ZPROBE_OUT "Z probe out. bed"
#define MSG_POSITION_UNKNOWN "Home X/Y before Z" #define MSG_POSITION_UNKNOWN "Home X/Y before Z"
#define MSG_ZPROBE_ZOFFSET "Z Offset" #define MSG_ZPROBE_ZOFFSET "Z Offset"
#define MSG_BABYSTEP_X "Babystep X"
#define MSG_BABYSTEP_Y "Babystep Y"
#define MSG_BABYSTEP_Z "Babystep Z"
#define MSG_BABYSTEP "Babystep" #define MSG_BABYSTEP "Babystep"
#define MSG_BABYSTEP_X MSG_BABYSTEP " " MSG_X
#define MSG_BABYSTEP_Y MSG_BABYSTEP " " MSG_Y
#define MSG_BABYSTEP_Z MSG_BABYSTEP " " MSG_Z
#define MSG_ENDSTOP_ABORT "Finecorsa abort." #define MSG_ENDSTOP_ABORT "Finecorsa abort."
#define MSG_HEATING_FAILED_LCD "Riscaldamento fallito" #define MSG_HEATING_FAILED_LCD "Riscaldamento fallito"
#define MSG_ERR_REDUNDANT_TEMP "Err: REDUNDANT TEMP ERROR" #define MSG_ERR_REDUNDANT_TEMP "Err: REDUNDANT TEMP ERROR"
......
...@@ -512,7 +512,7 @@ void lcd_set_home_offsets() { ...@@ -512,7 +512,7 @@ void lcd_set_home_offsets() {
static void lcd_prepare_babystep_x() { _lcd_babystep(lcd_prepare_motion_babystep, X_AXIS, PSTR(MSG_BABYSTEPPING_X)); } static void lcd_prepare_babystep_x() { _lcd_babystep(lcd_prepare_motion_babystep, X_AXIS, PSTR(MSG_BABYSTEPPING_X)); }
static void lcd_prepare_babystep_y() { _lcd_babystep(lcd_prepare_motion_babystep, Y_AXIS, PSTR(MSG_BABYSTEPPING_Y)); } static void lcd_prepare_babystep_y() { _lcd_babystep(lcd_prepare_motion_babystep, Y_AXIS, PSTR(MSG_BABYSTEPPING_Y)); }
static void lcd_prepare_babystep_z() { _lcd_babystep(lcd_prepare_motion_babystep, Z_AXIS, PSTR(MSG_BABYSTEPPING_Z)); } static void lcd_prepare_babystep_z() { _lcd_babystep(lcd_prepare_motion_babystep, Z_AXIS, PSTR(MSG_BABYSTEPPING_Z)); }
static void lcd_prepare_motion_babystep() { static void lcd_prepare_motion_babystep() {
START_MENU(lcd_main_menu); START_MENU(lcd_main_menu);
MENU_ITEM(back, MSG_MOTION, lcd_prepare_motion_menu); MENU_ITEM(back, MSG_MOTION, lcd_prepare_motion_menu);
...@@ -523,11 +523,11 @@ void lcd_set_home_offsets() { ...@@ -523,11 +523,11 @@ void lcd_set_home_offsets() {
MENU_ITEM(submenu, MSG_BABYSTEP_Z, lcd_prepare_babystep_z); MENU_ITEM(submenu, MSG_BABYSTEP_Z, lcd_prepare_babystep_z);
END_MENU(); END_MENU();
} }
#endif //BABYSTEPPING #endif // BABYSTEPPING
static void lcd_tune_fixstep() { static void lcd_tune_fixstep() {
#if ENABLED(DELTA) #if ENABLED(DELTA)
enqueuecommands_P(PSTR("G28 X Y Z B")); enqueuecommands_P(PSTR("G28 B"));
#else #else
enqueuecommands_P(PSTR("G28 X Y B")); enqueuecommands_P(PSTR("G28 X Y B"));
#endif #endif
...@@ -577,9 +577,9 @@ static void lcd_tune_menu() { ...@@ -577,9 +577,9 @@ static void lcd_tune_menu() {
#endif //BABYSTEP_XY #endif //BABYSTEP_XY
MENU_ITEM(submenu, MSG_BABYSTEP_Z, lcd_tune_babystep_z); MENU_ITEM(submenu, MSG_BABYSTEP_Z, lcd_tune_babystep_z);
#endif #endif
MENU_ITEM(function, MSG_FIX_LOSE_STEPS, lcd_tune_fixstep); MENU_ITEM(function, MSG_FIX_LOSE_STEPS, lcd_tune_fixstep);
#if ENABLED(FILAMENTCHANGEENABLE) #if ENABLED(FILAMENTCHANGEENABLE)
MENU_ITEM(gcode, MSG_FILAMENTCHANGE, PSTR("M600")); MENU_ITEM(gcode, MSG_FILAMENTCHANGE, PSTR("M600"));
#endif #endif
...@@ -796,7 +796,7 @@ static void lcd_prepare_motion_menu() { ...@@ -796,7 +796,7 @@ static void lcd_prepare_motion_menu() {
// Move Axis // Move Axis
// //
MENU_ITEM(submenu, MSG_MOVE_AXIS, lcd_move_menu); MENU_ITEM(submenu, MSG_MOVE_AXIS, lcd_move_menu);
// //
// Easy Load // Easy Load
// //
...@@ -806,16 +806,16 @@ static void lcd_prepare_motion_menu() { ...@@ -806,16 +806,16 @@ static void lcd_prepare_motion_menu() {
MENU_ITEM(function, MSG_PURGE_XMM, lcd_purge); MENU_ITEM(function, MSG_PURGE_XMM, lcd_purge);
MENU_ITEM(function, MSG_RETRACT_XMM, lcd_retract); MENU_ITEM(function, MSG_RETRACT_XMM, lcd_retract);
#endif // EASY_LOAD #endif // EASY_LOAD
// //
// Babystepping // Babystepping
// //
#if ENABLED(BABYSTEPPING) #if ENABLED(BABYSTEPPING)
MENU_ITEM(submenu, MSG_BABYSTEP, lcd_prepare_motion_babystep); MENU_ITEM(submenu, MSG_BABYSTEP, lcd_prepare_motion_babystep);
#endif #endif
MENU_ITEM(function, MSG_FIX_LOSE_STEPS, lcd_tune_fixstep); MENU_ITEM(function, MSG_FIX_LOSE_STEPS, lcd_tune_fixstep);
// //
// Disable Steppers // Disable Steppers
// //
...@@ -863,7 +863,7 @@ static void lcd_prepare_temperature_menu() { ...@@ -863,7 +863,7 @@ static void lcd_prepare_temperature_menu() {
// Fan Speed // Fan Speed
// //
MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_FAN_SPEED, &fanSpeed, 0, 255); MENU_MULTIPLIER_ITEM_EDIT(int3, MSG_FAN_SPEED, &fanSpeed, 0, 255);
// //
// Preheat PLA // Preheat PLA
// Preheat ABS // Preheat ABS
...@@ -885,7 +885,7 @@ static void lcd_prepare_temperature_menu() { ...@@ -885,7 +885,7 @@ static void lcd_prepare_temperature_menu() {
// Cooldown // Cooldown
// //
MENU_ITEM(function, MSG_COOLDOWN, lcd_cooldown); MENU_ITEM(function, MSG_COOLDOWN, lcd_cooldown);
END_MENU(); END_MENU();
} }
...@@ -1019,7 +1019,7 @@ static void lcd_control_menu() { ...@@ -1019,7 +1019,7 @@ static void lcd_control_menu() {
#if ENABLED(FWRETRACT) #if ENABLED(FWRETRACT)
MENU_ITEM(submenu, MSG_RETRACT, lcd_control_retract_menu); MENU_ITEM(submenu, MSG_RETRACT, lcd_control_retract_menu);
#endif #endif
// //
// Switch power on/off // Switch power on/off
// //
...@@ -1036,7 +1036,7 @@ static void lcd_control_menu() { ...@@ -1036,7 +1036,7 @@ static void lcd_control_menu() {
#if ENABLED(SDSUPPORT) && ENABLED(MENU_ADDAUTOSTART) #if ENABLED(SDSUPPORT) && ENABLED(MENU_ADDAUTOSTART)
MENU_ITEM(function, MSG_AUTOSTART, lcd_autostart_sd); MENU_ITEM(function, MSG_AUTOSTART, lcd_autostart_sd);
#endif #endif
#if ENABLED(EEPROM_SETTINGS) #if ENABLED(EEPROM_SETTINGS)
MENU_ITEM(function, MSG_STORE_EPROM, Config_StoreSettings); MENU_ITEM(function, MSG_STORE_EPROM, Config_StoreSettings);
MENU_ITEM(function, MSG_LOAD_EPROM, Config_RetrieveSettings); MENU_ITEM(function, MSG_LOAD_EPROM, Config_RetrieveSettings);
...@@ -1142,7 +1142,7 @@ static void lcd_control_temperature_menu() { ...@@ -1142,7 +1142,7 @@ static void lcd_control_temperature_menu() {
#endif // HOTENDS > 2 #endif // HOTENDS > 2
#endif // HOTENDS > 1 #endif // HOTENDS > 1
#endif // PIDTEMP #endif // PIDTEMP
// //
// Idle oozing // Idle oozing
// //
......
<img align="right" src="Documentation/Logo/MarlinKimbra%20Logo%20GitHub.png" /> <img align="right" src="Documentation/Logo/MarlinKimbra%20Logo%20GitHub.png" />
# MarlinKimbra 3D Printer Firmware # MarlinKimbra 3D Printer Firmware
## Version 4.1.5 RC (Release Candidate) ## Version 4.1.5 dev
* [Configuration & Compilation](/Documentation/Compilation.md) * [Configuration & Compilation](/Documentation/Compilation.md)
* Supported * Supported
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment