chiark / gitweb /
update from for-upstream (merge -s theirs)
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Wed, 8 Aug 2012 17:33:26 +0000 (18:33 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Wed, 8 Aug 2012 17:33:26 +0000 (18:33 +0100)
Marlin/.gitignore
Marlin/EEPROMwrite.h
Marlin/Marlin.h
Marlin/Marlin.pde
Marlin/motion_control.cpp

index 37a3c9b84d0356a5f579813e05d846711259f35f..4f6f90695552d13260ab4efb388d8de03301422f 100644 (file)
@@ -1,2 +1,3 @@
 *.o
 applet/
+*~
index f81a428e81622f47e9f8801294b0f37823675c6d..f07716085d3e8839d2f6a9b3e32c4dbf5a3acdf1 100644 (file)
@@ -125,7 +125,7 @@ inline void EEPROM_printSettings()
       SERIAL_ECHO_START;
       SERIAL_ECHOPAIR("  M206 X",add_homeing[0] );
       SERIAL_ECHOPAIR(" Y" ,add_homeing[1] );
-      SERIAL_ECHOPAIR(" Z" ,add_homeing[1] );
+      SERIAL_ECHOPAIR(" Z" ,add_homeing[2] );
       SERIAL_ECHOLN("");
     #ifdef PIDTEMP
       SERIAL_ECHO_START;
index 7645830fdfae863c27be199af391445855ca282b..a78d2ee847494a13de129f8519c1f9e9ec1eeb3a 100644 (file)
@@ -84,7 +84,11 @@ const char echomagic[] PROGMEM ="echo:";
 #define SERIAL_ECHOLN(x) SERIAL_PROTOCOLLN(x)
 #define SERIAL_ECHOLNPGM(x) SERIAL_PROTOCOLLNPGM(x)
 
-#define SERIAL_ECHOPAIR(name,value) {SERIAL_ECHOPGM(name);SERIAL_ECHO(value);}
+#define SERIAL_ECHOPAIR(name,value) (serial_echopair(PSTR(name),(value)))
+
+void serial_echopair(const PROGMEM char *s, float v);
+void serial_echopair(const PROGMEM char *s, double v);
+void serial_echopair(const PROGMEM char *s, unsigned long v);
 
 
 //things to write to serial from Programmemory. saves 400 to 2k of RAM.
@@ -157,10 +161,6 @@ void manage_inactivity(byte debug);
 enum AxisEnum {X_AXIS=0, Y_AXIS=1, Z_AXIS=2, E_AXIS=3};
 
 
-#define X_HOME_POS_A (X_HOME_POS + add_homeing[X_AXIS])
-#define Y_HOME_POS_A (Y_HOME_POS + add_homeing[Y_AXIS])
-#define Z_HOME_POS_A (Z_HOME_POS + add_homeing[Z_AXIS])
-
 void FlushSerialRequestResend();
 void ClearToSend();
 
@@ -187,6 +187,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
index dd40cdf76dc0d1fac55048ee5b6a2c9e80000db3..1dec2b8fea328f80e8c512819ac317aa1ae607ad 100644 (file)
@@ -1,3 +1,5 @@
+/* -*- c++ -*- */
+
 /*
     Reprap firmware based on Sprinter and grbl.
  Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm
@@ -141,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;
 
@@ -199,6 +202,13 @@ bool Stopped=false;
 
 void get_arc_coordinates();
 
+void serial_echopair(const PROGMEM char *s, float v)
+    { serialprintPGM(s); SERIAL_ECHO(v); }
+void serial_echopair(const PROGMEM char *s, double v)
+    { serialprintPGM(s); SERIAL_ECHO(v); }
+void serial_echopair(const PROGMEM char *s, unsigned long v)
+    { serialprintPGM(s); SERIAL_ECHO(v); }
+
 extern "C"{
   extern unsigned int __bss_end;
   extern unsigned int __heap_start;
@@ -541,6 +551,14 @@ 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] + add_homeing[axis];
+}
+
 #define HOMEAXIS(LETTER) \
   if ((LETTER##_MIN_PIN > -1 && LETTER##_HOME_DIR==-1) || (LETTER##_MAX_PIN > -1 && LETTER##_HOME_DIR==1))\
     { \
@@ -562,8 +580,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_A;\
-    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();\
   }
@@ -676,8 +694,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_A;
-        current_position[Y_AXIS] = Y_HOME_POS_A;
+        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];
@@ -1542,9 +1560,9 @@ 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) {
index 6bcea4137293ddef6e022a02282bfccead466232..450924a8ea595cb89cdf5e35fc8887c252a3a08d 100644 (file)
@@ -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_A) arc_target[X_AXIS] = X_HOME_POS_A;
-      if (arc_target[Y_AXIS] < Y_HOME_POS_A) arc_target[Y_AXIS] = Y_HOME_POS_A;
-      if (arc_target[Z_AXIS] < Z_HOME_POS_A) arc_target[Z_AXIS] = Z_HOME_POS_A;
+      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) {