-Bottom: 8e78a1676c97946f40c2ebb968bada04f6bac87a
-Top: 8e78a1676c97946f40c2ebb968bada04f6bac87a
+Bottom: eb35f0d7db096a862ee737a5537019f96d6e6f16
+Top: 380e228cc8d44c90824ca19a55702fc1c536ad59
Author: Ian Jackson <ijackson@chiark.greenend.org.uk>
Date: 2012-08-01 21:12:14 +0100
---
-
+diff --git a/Marlin/Marlin.h b/Marlin/Marlin.h
+index 4123634..c8115af 100644
+--- a/Marlin/Marlin.h
++++ b/Marlin/Marlin.h
+@@ -183,6 +183,7 @@ extern float homing_feedrate[];
+ extern bool axis_relative_modes[];
+ extern float current_position[NUM_AXIS] ;
+ extern float add_homeing[3];
++extern float min_pos[3];
+ extern unsigned char FanSpeed;
+
+ // Handling multiple extruders pins
+diff --git a/Marlin/Marlin.pde b/Marlin/Marlin.pde
+index f38920b..8248132 100644
+--- a/Marlin/Marlin.pde
++++ b/Marlin/Marlin.pde
+@@ -143,6 +143,7 @@ volatile bool feedmultiplychanged=false;
+ 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 };
+ uint8_t active_extruder = 0;
+ unsigned char FanSpeed=0;
+
+@@ -543,6 +544,15 @@ bool code_seen(char code)
+ return (strchr_pointer != NULL); //Return True if a character was found
+ }
+
++static const float base_min_pos[3] = { X_MIN_POS, Y_MIN_POS, Z_MIN_POS };
++static const float base_home_pos[3] = { X_HOME_POS, Y_HOME_POS, Z_HOME_POS };
++
++static void axis_is_at_home(int axis) {
++ current_position[axis] = base_home_pos[axis] + add_homeing[axis];
++ min_pos[axis] = base_min_pos[axis];
++ if (add_homeing[axis] < 0) min_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))\
+ { \
+@@ -564,8 +574,8 @@ bool code_seen(char code)
+ 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();\
+ }
+@@ -678,8 +688,8 @@ void process_commands()
+ 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];
+@@ -1544,15 +1554,15 @@ void get_arc_coordinates()
+ void prepare_move()
+ {
+ 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[0]) destination[X_AXIS] = min_pos[0];
++ if (destination[Y_AXIS] < min_pos[1]) destination[Y_AXIS] = min_pos[1];
++ if (destination[Z_AXIS] < min_pos[2]) destination[Z_AXIS] = min_pos[2];
+ }
+
+ 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[0]) destination[X_AXIS] = max_pos[0];
++ if (destination[Y_AXIS] > max_pos[1]) destination[Y_AXIS] = max_pos[1];
++ if (destination[Z_AXIS] > max_pos[2]) destination[Z_AXIS] = max_pos[2];
+ }
+ previous_millis_cmd = millis();
+ plan_buffer_line(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS], destination[E_AXIS], feedrate*feedmultiply/60/100.0, active_extruder);
+diff --git a/Marlin/motion_control.cpp b/Marlin/motion_control.cpp
+index f11d8c8..450924a 100644
+--- a/Marlin/motion_control.cpp
++++ b/Marlin/motion_control.cpp
+@@ -126,9 +126,9 @@ void mc_arc(float *position, float *target, float *offset, uint8_t axis_0, uint8
+ arc_target[E_AXIS] += extruder_per_segment;
+
+ if (min_software_endstops) {
+- if (arc_target[X_AXIS] < X_HOME_POS) arc_target[X_AXIS] = X_HOME_POS;
+- if (arc_target[Y_AXIS] < Y_HOME_POS) arc_target[Y_AXIS] = Y_HOME_POS;
+- if (arc_target[Z_AXIS] < Z_HOME_POS) arc_target[Z_AXIS] = Z_HOME_POS;
++ if (arc_target[X_AXIS] < min_pos[0]) arc_target[X_AXIS] = min_pos[0];
++ if (arc_target[Y_AXIS] < min_pos[1]) arc_target[Y_AXIS] = min_pos[1];
++ if (arc_target[Z_AXIS] < min_pos[2]) arc_target[Z_AXIS] = min_pos[2];
+ }
+
+ if (max_software_endstops) {
+diff --git a/README.md b/README.md
+index 86dd93d..fb2c189 100644
+--- a/README.md
++++ b/README.md
+@@ -152,6 +152,7 @@ Movement variables:
+ * 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.