static const PROGMEM type array##_P[3] = { X_##CONFIG, Y_##CONFIG, Z_##CONFIG };
DEFINE_PGM_READ_ANY(float, float);
+DEFINE_PGM_READ_ANY(signed char, byte);
XYZ_CONSTS_FROM_CONFIG(float, base_min_pos, MIN_POS);
XYZ_CONSTS_FROM_CONFIG(float, base_max_pos, MAX_POS);
XYZ_CONSTS_FROM_CONFIG(float, base_home_pos, HOME_POS);
+XYZ_CONSTS_FROM_CONFIG(float, max_length, MAX_LENGTH);
+XYZ_CONSTS_FROM_CONFIG(float, home_retract_mm, HOME_RETRACT_MM);
+XYZ_CONSTS_FROM_CONFIG(signed char, home_dir, HOME_DIR);
static void axis_is_at_home(int axis) {
current_position[axis] = XYZ_CONFIG(base_home_pos, axis) + add_homeing[axis];
max_pos[axis] = XYZ_CONFIG(base_max_pos, axis) + add_homeing[axis];
}
-#define HOMEAXIS(LETTER) \
- if ((LETTER##_MIN_PIN > -1 && LETTER##_HOME_DIR==-1) || (LETTER##_MAX_PIN > -1 && LETTER##_HOME_DIR==1))\
- { \
- current_position[LETTER##_AXIS] = 0; \
- plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]); \
- destination[LETTER##_AXIS] = 1.5 * LETTER##_MAX_LENGTH * LETTER##_HOME_DIR; \
- feedrate = homing_feedrate[LETTER##_AXIS]; \
- plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feedrate/60, active_extruder); \
- st_synchronize();\
- \
- current_position[LETTER##_AXIS] = 0;\
- plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]);\
- destination[LETTER##_AXIS] = -LETTER##_HOME_RETRACT_MM * LETTER##_HOME_DIR;\
- plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feedrate/60, active_extruder); \
- st_synchronize();\
- \
- destination[LETTER##_AXIS] = 2*LETTER##_HOME_RETRACT_MM * LETTER##_HOME_DIR;\
- feedrate = homing_feedrate[LETTER##_AXIS]/2 ; \
- plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feedrate/60, active_extruder); \
- st_synchronize();\
- \
- axis_is_at_home(LETTER##_AXIS); \
- destination[LETTER##_AXIS] = current_position[LETTER##_AXIS]; \
- feedrate = 0.0;\
- endstops_hit_on_purpose();\
+static void homeaxis(int axis) {
+#define HOMEAXIS_DO_BIT(LETTER) \
+ ((LETTER##_MIN_PIN > -1 && LETTER##_HOME_DIR==-1) || (LETTER##_MAX_PIN > -1 && LETTER##_HOME_DIR==1) ? 1 << LETTER##_AXIS : 0)
+
+ static PROGMEM const unsigned char doaxis =
+ HOMEAXIS_DO_BIT(X) |
+ HOMEAXIS_DO_BIT(Y) |
+ HOMEAXIS_DO_BIT(Z);
+
+ if (doaxis & (1<<axis)) {
+ current_position[axis] = 0;
+ plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]);
+ destination[axis] = 1.5 * XYZ_CONFIG(max_length,axis) * XYZ_CONFIG(home_dir,axis);
+ feedrate = homing_feedrate[axis];
+ plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feedrate/60, active_extruder);
+ st_synchronize();
+
+ current_position[axis] = 0;
+ plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]);
+ destination[axis] = -XYZ_CONFIG(home_retract_mm,axis) * XYZ_CONFIG(home_dir,axis);
+ plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feedrate/60, active_extruder);
+ st_synchronize();
+
+ destination[axis] = 2*home_retract_mm[axis] * home_dir[axis];
+ feedrate = homing_feedrate[axis]/2 ;
+ plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feedrate/60, active_extruder);
+ st_synchronize();
+
+ axis_is_at_home(axis);
+ destination[axis] = current_position[axis];
+ feedrate = 0.0;
+ endstops_hit_on_purpose();
}
+}
+#define HOMEAXIS(LETTER) homeaxis(LETTER##_AXIS)
void process_commands()
{