volatile int extrudemultiply=100; //100->1 200->2
float current_position[NUM_AXIS] = { 0.0, 0.0, 0.0, 0.0 };
float add_homeing[3]={0,0,0};
+float min_pos[3] = { X_MIN_POS, Y_MIN_POS, Z_MIN_POS };
+float max_pos[3] = { X_MAX_POS, Y_MAX_POS, Z_MAX_POS };
uint8_t active_extruder = 0;
unsigned char FanSpeed=0;
return (strchr_pointer != NULL); //Return True if a character was found
}
+#define XYZ_CONFIG(type,array,axis) (pgm_read_##type##_near(&array##_P[(axis)]))
+#define XYZ_CONSTS_FROM_CONFIG(type, array, CONFIG) \
+static const PROGMEM type array##_P[3] = { X_##CONFIG, Y_##CONFIG, Z_##CONFIG };
+
+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);
+
+static void axis_is_at_home(int axis) {
+ current_position[axis] = XYZ_CONFIG(float, base_home_pos,axis) + add_homeing[axis];
+ min_pos[axis] = XYZ_CONFIG(float, base_min_pos, axis) + add_homeing[axis];
+ max_pos[axis] = XYZ_CONFIG(float, 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))\
{ \
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] = LETTER##_HOME_POS;\
- destination[LETTER##_AXIS] = current_position[LETTER##_AXIS];\
+ axis_is_at_home(LETTER##_AXIS); \
+ destination[LETTER##_AXIS] = current_position[LETTER##_AXIS]; \
feedrate = 0.0;\
endstops_hit_on_purpose();\
}
plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feedrate/60, active_extruder);
st_synchronize();
- current_position[X_AXIS] = X_HOME_POS;
- current_position[Y_AXIS] = Y_HOME_POS;
+ axis_is_at_home(X_AXIS);
+ axis_is_at_home(Y_AXIS);
plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]);
destination[X_AXIS] = current_position[X_AXIS];
destination[Y_AXIS] = current_position[Y_AXIS];
void clamp_to_software_endstops(float target[3])
{
if (min_software_endstops) {
- if (destination[X_AXIS] < X_MIN_POS) destination[X_AXIS] = X_MIN_POS;
- if (destination[Y_AXIS] < Y_MIN_POS) destination[Y_AXIS] = Y_MIN_POS;
- if (destination[Z_AXIS] < Z_MIN_POS) destination[Z_AXIS] = Z_MIN_POS;
+ if (destination[X_AXIS] < min_pos[X_AXIS]) destination[X_AXIS] = min_pos[X_AXIS];
+ if (destination[Y_AXIS] < min_pos[Y_AXIS]) destination[Y_AXIS] = min_pos[Y_AXIS];
+ if (destination[Z_AXIS] < min_pos[Z_AXIS]) destination[Z_AXIS] = min_pos[Z_AXIS];
}
if (max_software_endstops) {
- if (destination[X_AXIS] > X_MAX_POS) destination[X_AXIS] = X_MAX_POS;
- if (destination[Y_AXIS] > Y_MAX_POS) destination[Y_AXIS] = Y_MAX_POS;
- if (destination[Z_AXIS] > Z_MAX_POS) destination[Z_AXIS] = Z_MAX_POS;
+ if (destination[X_AXIS] > max_pos[X_AXIS]) destination[X_AXIS] = max_pos[X_AXIS];
+ if (destination[Y_AXIS] > max_pos[Y_AXIS]) destination[Y_AXIS] = max_pos[Y_AXIS];
+ if (destination[Z_AXIS] > max_pos[Z_AXIS]) destination[Z_AXIS] = max_pos[Z_AXIS];
}
}
* M202 - Set max acceleration in units/s^2 for travel moves (M202 X1000 Y1000) Unused in Marlin!!\r
* M203 - Set maximum feedrate that your machine can sustain (M203 X200 Y200 Z300 E10000) in mm/sec\r
* M204 - Set default acceleration: S normal moves T filament only moves (M204 S3000 T7000) im mm/sec^2 also sets minimum segment time in ms (B20000) to prevent buffer underruns and M20 minimum feedrate\r
+* M206 - set home offsets. This sets the X,Y,Z coordinates of the endstops (and is added to the {X,Y,Z}_HOME_POS configuration options (and is also added to the coordinates, if any, provided to G82, as with earlier firmware)\r
* M220 - set build speed mulitplying S:factor in percent ; aka "realtime tuneing in the gcode". So you can slow down if you have islands in one height-range, and speed up otherwise.\r
* M221 - set the extrude multiplying S:factor in percent\r
* M400 - Finish all buffered moves.\r