Merge pull request #2526 from leptun/MK3_decouple_XYZE_relative_mode

Mk3 decouple XYZE relative modes
This commit is contained in:
DRracer 2020-03-26 18:58:20 +01:00 committed by GitHub
commit 5106831ba2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 22 additions and 24 deletions

View File

@ -152,7 +152,6 @@
#define Z_HOME_RETRACT_MM 2 #define Z_HOME_RETRACT_MM 2
//#define QUICK_HOME //if this is defined, if both x and y are to be homed, a diagonal move will be performed initially. //#define QUICK_HOME //if this is defined, if both x and y are to be homed, a diagonal move will be performed initially.
#define AXIS_RELATIVE_MODES {0, 0, 0, 0}
#define MAX_STEP_FREQUENCY 40000 // Max step frequency for Ultimaker (5000 pps / half step). Toshiba steppers are 4x slower, but Prusa3D does not use those. #define MAX_STEP_FREQUENCY 40000 // Max step frequency for Ultimaker (5000 pps / half step). Toshiba steppers are 4x slower, but Prusa3D does not use those.
//By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step. //By default pololu step drivers require an active high signal. However, some high power drivers require an active low signal as step.
#define INVERT_X_STEP_PIN 0 #define INVERT_X_STEP_PIN 0

View File

@ -294,7 +294,7 @@ void setPwmFrequency(uint8_t pin, int val);
extern bool fans_check_enabled; extern bool fans_check_enabled;
extern float homing_feedrate[]; extern float homing_feedrate[];
extern bool axis_relative_modes[]; extern uint8_t axis_relative_modes;
extern float feedrate; extern float feedrate;
extern int feedmultiply; extern int feedmultiply;
extern int extrudemultiply; // Sets extrude multiply factor (in percent) for all extruders extern int extrudemultiply; // Sets extrude multiply factor (in percent) for all extruders

View File

@ -179,9 +179,13 @@ float default_retraction = DEFAULT_RETRACTION;
float homing_feedrate[] = HOMING_FEEDRATE; float homing_feedrate[] = HOMING_FEEDRATE;
// Currently only the extruder axis may be switched to a relative mode.
// Other axes are always absolute or relative based on the common relative_mode flag. //Although this flag and many others like this could be represented with a struct/bitfield for each axis (more readable and efficient code), the implementation
bool axis_relative_modes[] = AXIS_RELATIVE_MODES; //would not be standard across all platforms. That being said, the code will continue to use bitmasks for independent axis.
//Moreover, according to C/C++ standard, the ordering of bits is platform/compiler dependent and the compiler is allowed to align the bits arbitrarily,
//thus bit operations like shifting and masking may stop working and will be very hard to fix.
uint8_t axis_relative_modes = 0;
int feedmultiply=100; //100->1 200->2 int feedmultiply=100; //100->1 200->2
int extrudemultiply=100; //100->1 200->2 int extrudemultiply=100; //100->1 200->2
int extruder_multiply[EXTRUDERS] = {100 int extruder_multiply[EXTRUDERS] = {100
@ -5376,21 +5380,19 @@ if(eSoundMode!=e_SOUND_MODE_SILENT)
/*! /*!
### G90 - Switch off relative mode <a href="https://reprap.org/wiki/G-code#G90:_Set_to_Absolute_Positioning">G90: Set to Absolute Positioning</a> ### G90 - Switch off relative mode <a href="https://reprap.org/wiki/G-code#G90:_Set_to_Absolute_Positioning">G90: Set to Absolute Positioning</a>
All coordinates from now on are absolute relative to the origin of the machine. E axis is also switched to absolute mode. All coordinates from now on are absolute relative to the origin of the machine. E axis is left intact.
*/ */
case 90: { case 90: {
for(uint8_t i = 0; i != NUM_AXIS; ++i) axis_relative_modes &= ~(X_AXIS_MASK | Y_AXIS_MASK | Z_AXIS_MASK);
axis_relative_modes[i] = false;
} }
break; break;
/*! /*!
### G91 - Switch on relative mode <a href="https://reprap.org/wiki/G-code#G91:_Set_to_Relative_Positioning">G91: Set to Relative Positioning</a> ### G91 - Switch on relative mode <a href="https://reprap.org/wiki/G-code#G91:_Set_to_Relative_Positioning">G91: Set to Relative Positioning</a>
All coordinates from now on are relative to the last position. E axis is also switched to relative mode. All coordinates from now on are relative to the last position. E axis is left intact.
*/ */
case 91: { case 91: {
for(uint8_t i = 0; i != NUM_AXIS; ++i) axis_relative_modes |= X_AXIS_MASK | Y_AXIS_MASK | Z_AXIS_MASK;
axis_relative_modes[i] = true;
} }
break; break;
@ -6567,7 +6569,7 @@ Sigma_Exit:
Makes the extruder interpret extrusion as absolute positions. Makes the extruder interpret extrusion as absolute positions.
*/ */
case 82: case 82:
axis_relative_modes[E_AXIS] = false; axis_relative_modes &= ~E_AXIS_MASK;
break; break;
/*! /*!
@ -6575,7 +6577,7 @@ Sigma_Exit:
Makes the extruder interpret extrusion values as relative positions. Makes the extruder interpret extrusion values as relative positions.
*/ */
case 83: case 83:
axis_relative_modes[E_AXIS] = true; axis_relative_modes |= E_AXIS_MASK;
break; break;
/*! /*!
@ -9216,7 +9218,7 @@ void get_coordinates()
for(int8_t i=0; i < NUM_AXIS; i++) { for(int8_t i=0; i < NUM_AXIS; i++) {
if(code_seen(axis_codes[i])) if(code_seen(axis_codes[i]))
{ {
bool relative = axis_relative_modes[i]; bool relative = axis_relative_modes & (1 << i);
destination[i] = (float)code_value(); destination[i] = (float)code_value();
if (i == E_AXIS) { if (i == E_AXIS) {
float emult = extruder_multiplier[active_extruder]; float emult = extruder_multiplier[active_extruder];
@ -10644,7 +10646,7 @@ void uvlo_()
// Store the print E position before we lose track // Store the print E position before we lose track
eeprom_update_float((float*)(EEPROM_UVLO_CURRENT_POSITION_E), current_position[E_AXIS]); eeprom_update_float((float*)(EEPROM_UVLO_CURRENT_POSITION_E), current_position[E_AXIS]);
eeprom_update_byte((uint8_t*)EEPROM_UVLO_E_ABS, axis_relative_modes[3]?0:1); eeprom_update_byte((uint8_t*)EEPROM_UVLO_E_ABS, (axis_relative_modes & E_AXIS_MASK)?0:1);
// Clean the input command queue, inhibit serial processing using saved_printing // Clean the input command queue, inhibit serial processing using saved_printing
cmdqueue_reset(); cmdqueue_reset();
@ -11233,7 +11235,7 @@ void stop_and_save_print_to_ram(float z_move, float e_move)
saved_feedmultiply2 = feedmultiply; //save feedmultiply saved_feedmultiply2 = feedmultiply; //save feedmultiply
saved_active_extruder = active_extruder; //save active_extruder saved_active_extruder = active_extruder; //save active_extruder
saved_extruder_temperature = degTargetHotend(active_extruder); saved_extruder_temperature = degTargetHotend(active_extruder);
saved_extruder_relative_mode = axis_relative_modes[E_AXIS]; saved_extruder_relative_mode = axis_relative_modes & E_AXIS_MASK;
saved_fanSpeed = fanSpeed; saved_fanSpeed = fanSpeed;
cmdqueue_reset(); //empty cmdqueue cmdqueue_reset(); //empty cmdqueue
card.sdprinting = false; card.sdprinting = false;
@ -11315,7 +11317,7 @@ void restore_print_from_ram_and_continue(float e_move)
wait_for_heater(_millis(), saved_active_extruder); wait_for_heater(_millis(), saved_active_extruder);
heating_status = 2; heating_status = 2;
} }
axis_relative_modes[E_AXIS] = saved_extruder_relative_mode; axis_relative_modes ^= (-saved_extruder_relative_mode ^ axis_relative_modes) & E_AXIS_MASK;
float e = saved_pos[E_AXIS] - e_move; float e = saved_pos[E_AXIS] - e_move;
plan_set_e_position(e); plan_set_e_position(e);

View File

@ -796,8 +796,8 @@ void mmu_load_to_nozzle()
{ {
st_synchronize(); st_synchronize();
bool saved_e_relative_mode = axis_relative_modes[E_AXIS]; const bool saved_e_relative_mode = axis_relative_modes & E_AXIS_MASK;
if (!saved_e_relative_mode) axis_relative_modes[E_AXIS] = true; if (!saved_e_relative_mode) axis_relative_modes |= E_AXIS_MASK;
if (ir_sensor_detected) if (ir_sensor_detected)
{ {
current_position[E_AXIS] += 3.0f; current_position[E_AXIS] += 3.0f;
@ -821,7 +821,7 @@ void mmu_load_to_nozzle()
feedrate = 871; feedrate = 871;
plan_buffer_line_curposXYZE(feedrate / 60, active_extruder); plan_buffer_line_curposXYZE(feedrate / 60, active_extruder);
st_synchronize(); st_synchronize();
if (!saved_e_relative_mode) axis_relative_modes[E_AXIS] = false; if (!saved_e_relative_mode) axis_relative_modes &= ~E_AXIS_MASK;
} }
void mmu_M600_wait_and_beep() { void mmu_M600_wait_and_beep() {

View File

@ -7369,10 +7369,7 @@ void lcd_print_stop()
planner_abort_hard(); //needs to be done since plan_buffer_line resets waiting_inside_plan_buffer_line_print_aborted to false. Also copies current to destination. planner_abort_hard(); //needs to be done since plan_buffer_line resets waiting_inside_plan_buffer_line_print_aborted to false. Also copies current to destination.
axis_relative_modes[X_AXIS] = false; axis_relative_modes = E_AXIS_MASK; //XYZ absolute, E relative
axis_relative_modes[Y_AXIS] = false;
axis_relative_modes[Z_AXIS] = false;
axis_relative_modes[E_AXIS] = true;
isPrintPaused = false; //clear isPrintPaused flag to allow starting next print after pause->stop scenario. isPrintPaused = false; //clear isPrintPaused flag to allow starting next print after pause->stop scenario.
} }