|
@@ -735,7 +735,7 @@ void crashdet_detected(uint8_t mask)
|
|
lcd_update_enable(true);
|
|
lcd_update_enable(true);
|
|
lcd_update(2);
|
|
lcd_update(2);
|
|
lcd_setstatuspgm(_T(MSG_CRASH_DETECTED));
|
|
lcd_setstatuspgm(_T(MSG_CRASH_DETECTED));
|
|
- gcode_G28(true, true, false, false); //home X and Y
|
|
|
|
|
|
+ gcode_G28(true, true, false); //home X and Y
|
|
st_synchronize();
|
|
st_synchronize();
|
|
|
|
|
|
if (automatic_recovery_after_crash) {
|
|
if (automatic_recovery_after_crash) {
|
|
@@ -1153,10 +1153,6 @@ void list_sec_lang_from_external_flash()
|
|
// are initialized by the main() routine provided by the Arduino framework.
|
|
// are initialized by the main() routine provided by the Arduino framework.
|
|
void setup()
|
|
void setup()
|
|
{
|
|
{
|
|
-#ifdef W25X20CL
|
|
|
|
- // Enter an STK500 compatible Optiboot boot loader waiting for flashing the languages to an external flash memory.
|
|
|
|
- optiboot_w25x20cl_enter();
|
|
|
|
-#endif
|
|
|
|
lcd_init();
|
|
lcd_init();
|
|
fdev_setup_stream(lcdout, lcd_putchar, NULL, _FDEV_SETUP_WRITE); //setup lcdout stream
|
|
fdev_setup_stream(lcdout, lcd_putchar, NULL, _FDEV_SETUP_WRITE); //setup lcdout stream
|
|
|
|
|
|
@@ -1164,6 +1160,11 @@ void setup()
|
|
|
|
|
|
lcd_splash();
|
|
lcd_splash();
|
|
|
|
|
|
|
|
+ #ifdef W25X20CL
|
|
|
|
+ // Enter an STK500 compatible Optiboot boot loader waiting for flashing the languages to an external flash memory.
|
|
|
|
+ optiboot_w25x20cl_enter();
|
|
|
|
+ #endif
|
|
|
|
+
|
|
#if (LANG_MODE != 0) //secondary language support
|
|
#if (LANG_MODE != 0) //secondary language support
|
|
#ifdef W25X20CL
|
|
#ifdef W25X20CL
|
|
if (w25x20cl_init())
|
|
if (w25x20cl_init())
|
|
@@ -2616,7 +2617,11 @@ void force_high_power_mode(bool start_high_power_section) {
|
|
}
|
|
}
|
|
#endif //TMC2130
|
|
#endif //TMC2130
|
|
|
|
|
|
-void gcode_G28(bool home_x, bool home_y, bool home_z, bool calib) {
|
|
|
|
|
|
+void gcode_G28(bool home_x_axis, bool home_y_axis, bool home_z_axis) {
|
|
|
|
+ gcode_G28(home_x_axis, 0, home_y_axis, 0, home_z_axis, 0, false, true);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void gcode_G28(bool home_x_axis, long home_x_value, bool home_y_axis, long home_y_value, bool home_z_axis, long home_z_value, bool calib, bool without_mbl) {
|
|
st_synchronize();
|
|
st_synchronize();
|
|
|
|
|
|
#if 0
|
|
#if 0
|
|
@@ -2627,6 +2632,11 @@ void gcode_G28(bool home_x, bool home_y, bool home_z, bool calib) {
|
|
// Flag for the display update routine and to disable the print cancelation during homing.
|
|
// Flag for the display update routine and to disable the print cancelation during homing.
|
|
homing_flag = true;
|
|
homing_flag = true;
|
|
|
|
|
|
|
|
+ // Which axes should be homed?
|
|
|
|
+ bool home_x = home_x_axis;
|
|
|
|
+ bool home_y = home_y_axis;
|
|
|
|
+ bool home_z = home_z_axis;
|
|
|
|
+
|
|
// Either all X,Y,Z codes are present, or none of them.
|
|
// Either all X,Y,Z codes are present, or none of them.
|
|
bool home_all_axes = home_x == home_y && home_x == home_z;
|
|
bool home_all_axes = home_x == home_y && home_x == home_z;
|
|
if (home_all_axes)
|
|
if (home_all_axes)
|
|
@@ -2735,11 +2745,11 @@ void gcode_G28(bool home_x, bool home_y, bool home_z, bool calib) {
|
|
#endif //TMC2130
|
|
#endif //TMC2130
|
|
|
|
|
|
|
|
|
|
- if(code_seen(axis_codes[X_AXIS]) && code_value_long() != 0)
|
|
|
|
- current_position[X_AXIS]=code_value()+add_homing[X_AXIS];
|
|
|
|
|
|
+ if(home_x_axis && home_x_value != 0)
|
|
|
|
+ current_position[X_AXIS]=home_x_value+add_homing[X_AXIS];
|
|
|
|
|
|
- if(code_seen(axis_codes[Y_AXIS]) && code_value_long() != 0)
|
|
|
|
- current_position[Y_AXIS]=code_value()+add_homing[Y_AXIS];
|
|
|
|
|
|
+ if(home_y_axis && home_y_value != 0)
|
|
|
|
+ current_position[Y_AXIS]=home_y_value+add_homing[Y_AXIS];
|
|
|
|
|
|
#if Z_HOME_DIR < 0 // If homing towards BED do Z last
|
|
#if Z_HOME_DIR < 0 // If homing towards BED do Z last
|
|
#ifndef Z_SAFE_HOMING
|
|
#ifndef Z_SAFE_HOMING
|
|
@@ -2834,8 +2844,8 @@ void gcode_G28(bool home_x, bool home_y, bool home_z, bool calib) {
|
|
#endif // Z_SAFE_HOMING
|
|
#endif // Z_SAFE_HOMING
|
|
#endif // Z_HOME_DIR < 0
|
|
#endif // Z_HOME_DIR < 0
|
|
|
|
|
|
- if(code_seen(axis_codes[Z_AXIS]) && code_value_long() != 0)
|
|
|
|
- current_position[Z_AXIS]=code_value()+add_homing[Z_AXIS];
|
|
|
|
|
|
+ if(home_z_axis && home_z_value != 0)
|
|
|
|
+ current_position[Z_AXIS]=home_z_value+add_homing[Z_AXIS];
|
|
#ifdef ENABLE_AUTO_BED_LEVELING
|
|
#ifdef ENABLE_AUTO_BED_LEVELING
|
|
if(home_z)
|
|
if(home_z)
|
|
current_position[Z_AXIS] += zprobe_zoffset; //Add Z_Probe offset (the distance is negative)
|
|
current_position[Z_AXIS] += zprobe_zoffset; //Add Z_Probe offset (the distance is negative)
|
|
@@ -2867,7 +2877,7 @@ void gcode_G28(bool home_x, bool home_y, bool home_z, bool calib) {
|
|
world2machine_update_current();
|
|
world2machine_update_current();
|
|
|
|
|
|
#if (defined(MESH_BED_LEVELING) && !defined(MK1BP))
|
|
#if (defined(MESH_BED_LEVELING) && !defined(MK1BP))
|
|
- if (code_seen(axis_codes[X_AXIS]) || code_seen(axis_codes[Y_AXIS]) || code_seen('W') || code_seen(axis_codes[Z_AXIS]))
|
|
|
|
|
|
+ if (home_x_axis || home_y_axis || without_mbl || home_z_axis)
|
|
{
|
|
{
|
|
if (! home_z && mbl_was_active) {
|
|
if (! home_z && mbl_was_active) {
|
|
// Re-enable the mesh bed leveling if only the X and Y axes were re-homed.
|
|
// Re-enable the mesh bed leveling if only the X and Y axes were re-homed.
|
|
@@ -2880,10 +2890,6 @@ void gcode_G28(bool home_x, bool home_y, bool home_z, bool calib) {
|
|
{
|
|
{
|
|
st_synchronize();
|
|
st_synchronize();
|
|
homing_flag = false;
|
|
homing_flag = false;
|
|
- // Push the commands to the front of the message queue in the reverse order!
|
|
|
|
- // There shall be always enough space reserved for these commands.
|
|
|
|
- enquecommand_front_P((PSTR("G80")));
|
|
|
|
- //goto case_G80;
|
|
|
|
}
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
|
|
@@ -3116,10 +3122,17 @@ void gcode_M701()
|
|
custom_message = true;
|
|
custom_message = true;
|
|
custom_message_type = 2;
|
|
custom_message_type = 2;
|
|
|
|
|
|
|
|
+
|
|
|
|
+
|
|
lcd_setstatuspgm(_T(MSG_LOADING_FILAMENT));
|
|
lcd_setstatuspgm(_T(MSG_LOADING_FILAMENT));
|
|
- current_position[E_AXIS] += 70;
|
|
|
|
|
|
+ current_position[E_AXIS] += 40;
|
|
plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 400 / 60, active_extruder); //fast sequence
|
|
plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 400 / 60, active_extruder); //fast sequence
|
|
|
|
+ st_synchronize();
|
|
|
|
|
|
|
|
+ if (current_position[Z_AXIS] < 20) current_position[Z_AXIS] += 30;
|
|
|
|
+ current_position[E_AXIS] += 30;
|
|
|
|
+ plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 400 / 60, active_extruder); //fast sequence
|
|
|
|
+ st_synchronize();
|
|
current_position[E_AXIS] += 25;
|
|
current_position[E_AXIS] += 25;
|
|
plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 100 / 60, active_extruder); //slow sequence
|
|
plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 100 / 60, active_extruder); //slow sequence
|
|
st_synchronize();
|
|
st_synchronize();
|
|
@@ -3653,16 +3666,26 @@ void process_commands()
|
|
#endif //FWRETRACT
|
|
#endif //FWRETRACT
|
|
case 28: //G28 Home all Axis one at a time
|
|
case 28: //G28 Home all Axis one at a time
|
|
{
|
|
{
|
|
|
|
+ long home_x_value = 0;
|
|
|
|
+ long home_y_value = 0;
|
|
|
|
+ long home_z_value = 0;
|
|
// Which axes should be homed?
|
|
// Which axes should be homed?
|
|
bool home_x = code_seen(axis_codes[X_AXIS]);
|
|
bool home_x = code_seen(axis_codes[X_AXIS]);
|
|
|
|
+ home_x_value = code_value_long();
|
|
bool home_y = code_seen(axis_codes[Y_AXIS]);
|
|
bool home_y = code_seen(axis_codes[Y_AXIS]);
|
|
|
|
+ home_y_value = code_value_long();
|
|
bool home_z = code_seen(axis_codes[Z_AXIS]);
|
|
bool home_z = code_seen(axis_codes[Z_AXIS]);
|
|
|
|
+ home_z_value = code_value_long();
|
|
|
|
+ bool without_mbl = code_seen('W');
|
|
// calibrate?
|
|
// calibrate?
|
|
bool calib = code_seen('C');
|
|
bool calib = code_seen('C');
|
|
-
|
|
|
|
- gcode_G28(home_x, home_y, home_z, calib);
|
|
|
|
-
|
|
|
|
- break;
|
|
|
|
|
|
+ gcode_G28(home_x, home_x_value, home_y, home_y_value, home_z, home_z_value, calib, without_mbl);
|
|
|
|
+ if ((home_x || home_y || without_mbl || home_z) == false) {
|
|
|
|
+ // Push the commands to the front of the message queue in the reverse order!
|
|
|
|
+ // There shall be always enough space reserved for these commands.
|
|
|
|
+ goto case_G80;
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
}
|
|
}
|
|
#ifdef ENABLE_AUTO_BED_LEVELING
|
|
#ifdef ENABLE_AUTO_BED_LEVELING
|
|
case 29: // G29 Detailed Z-Probe, probes the bed at 3 or more points.
|
|
case 29: // G29 Detailed Z-Probe, probes the bed at 3 or more points.
|
|
@@ -3902,7 +3925,7 @@ void process_commands()
|
|
current_position[X_AXIS] = pgm_read_float(bed_ref_points_4);
|
|
current_position[X_AXIS] = pgm_read_float(bed_ref_points_4);
|
|
plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 3000 / 60, active_extruder);
|
|
plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 3000 / 60, active_extruder);
|
|
st_synchronize();
|
|
st_synchronize();
|
|
- gcode_G28(false, false, true, false);
|
|
|
|
|
|
+ gcode_G28(false, false, true);
|
|
|
|
|
|
}
|
|
}
|
|
if ((current_temperature_pinda > 35) && (farm_mode == false)) {
|
|
if ((current_temperature_pinda > 35) && (farm_mode == false)) {
|