From 9b3462f73f5e0e3cadefd2f64eff55c758dd96d5 Mon Sep 17 00:00:00 2001
From: Josef Larsson <josla972@student.liu.se>
Date: Sun, 22 Mar 2015 00:32:22 +0100
Subject: [PATCH 1/8] Refactor SCARA calibration. Save some lines of code and
 possibly ROM.

---
 Marlin/Marlin_main.cpp | 76 +++++++++---------------------------------
 1 file changed, 15 insertions(+), 61 deletions(-)

diff --git a/Marlin/Marlin_main.cpp b/Marlin/Marlin_main.cpp
index 4ef5d59f11..cb7434ef41 100644
--- a/Marlin/Marlin_main.cpp
+++ b/Marlin/Marlin_main.cpp
@@ -3967,18 +3967,16 @@ inline void gcode_M303() {
 }
 
 #ifdef SCARA
-
   /**
    * M360: SCARA calibration: Move to cal-position ThetaA (0 deg calibration)
    */
-  inline bool gcode_M360() {
-    SERIAL_ECHOLN(" Cal: Theta 0 ");
+  bool SCARA_move_to_cal(uint8_t delta_x, uint8_t delta_y) {
     //SoftEndsEnabled = false;              // Ignore soft endstops during calibration
     //SERIAL_ECHOLN(" Soft endstops disabled ");
     if (! Stopped) {
       //get_coordinates(); // For X Y Z E F
-      delta[X_AXIS] = 0;
-      delta[Y_AXIS] = 120;
+      delta[X_AXIS] = delta_x;
+      delta[Y_AXIS] = delta_y;
       calculate_SCARA_forward_Transform(delta);
       destination[X_AXIS] = delta[X_AXIS]/axis_scaling[X_AXIS];
       destination[Y_AXIS] = delta[Y_AXIS]/axis_scaling[Y_AXIS];
@@ -3989,25 +3987,20 @@ inline void gcode_M303() {
     return false;
   }
 
+  /**
+   * M360: SCARA calibration: Move to cal-position ThetaA (0 deg calibration)
+   */
+  inline bool gcode_M360() {
+    SERIAL_ECHOLN(" Cal: Theta 0 ");
+    return SCARA_move_to_cal(0, 120);
+  }
+
   /**
    * M361: SCARA calibration: Move to cal-position ThetaB (90 deg calibration - steps per degree)
    */
   inline bool gcode_M361() {
     SERIAL_ECHOLN(" Cal: Theta 90 ");
-    //SoftEndsEnabled = false;              // Ignore soft endstops during calibration
-    //SERIAL_ECHOLN(" Soft endstops disabled ");
-    if (! Stopped) {
-      //get_coordinates(); // For X Y Z E F
-      delta[X_AXIS] = 90;
-      delta[Y_AXIS] = 130;
-      calculate_SCARA_forward_Transform(delta);
-      destination[X_AXIS] = delta[X_AXIS]/axis_scaling[X_AXIS];
-      destination[Y_AXIS] = delta[Y_AXIS]/axis_scaling[Y_AXIS];
-      prepare_move();
-      //ClearToSend();
-      return true;
-    }
-    return false;
+    return SCARA_move_to_cal(90, 130);
   }
 
   /**
@@ -4015,20 +4008,7 @@ inline void gcode_M303() {
    */
   inline bool gcode_M362() {
     SERIAL_ECHOLN(" Cal: Psi 0 ");
-    //SoftEndsEnabled = false;              // Ignore soft endstops during calibration
-    //SERIAL_ECHOLN(" Soft endstops disabled ");
-    if (! Stopped) {
-      //get_coordinates(); // For X Y Z E F
-      delta[X_AXIS] = 60;
-      delta[Y_AXIS] = 180;
-      calculate_SCARA_forward_Transform(delta);
-      destination[X_AXIS] = delta[X_AXIS]/axis_scaling[X_AXIS];
-      destination[Y_AXIS] = delta[Y_AXIS]/axis_scaling[Y_AXIS];
-      prepare_move();
-      //ClearToSend();
-      return true;
-    }
-    return false;
+    return SCARA_move_to_cal(60, 180);
   }
 
   /**
@@ -4036,20 +4016,7 @@ inline void gcode_M303() {
    */
   inline bool gcode_M363() {
     SERIAL_ECHOLN(" Cal: Psi 90 ");
-    //SoftEndsEnabled = false;              // Ignore soft endstops during calibration
-    //SERIAL_ECHOLN(" Soft endstops disabled ");
-    if (! Stopped) {
-      //get_coordinates(); // For X Y Z E F
-      delta[X_AXIS] = 50;
-      delta[Y_AXIS] = 90;
-      calculate_SCARA_forward_Transform(delta);
-      destination[X_AXIS] = delta[X_AXIS]/axis_scaling[X_AXIS];
-      destination[Y_AXIS] = delta[Y_AXIS]/axis_scaling[Y_AXIS];
-      prepare_move();
-      //ClearToSend();
-      return true;
-    }
-    return false;
+    return SCARA_move_to_cal(50, 90);
   }
 
   /**
@@ -4057,20 +4024,7 @@ inline void gcode_M303() {
    */
   inline bool gcode_M364() {
     SERIAL_ECHOLN(" Cal: Theta-Psi 90 ");
-   // SoftEndsEnabled = false;              // Ignore soft endstops during calibration
-    //SERIAL_ECHOLN(" Soft endstops disabled ");
-    if (! Stopped) {
-      //get_coordinates(); // For X Y Z E F
-      delta[X_AXIS] = 45;
-      delta[Y_AXIS] = 135;
-      calculate_SCARA_forward_Transform(delta);
-      destination[X_AXIS] = delta[X_AXIS] / axis_scaling[X_AXIS];
-      destination[Y_AXIS] = delta[Y_AXIS] / axis_scaling[Y_AXIS];
-      prepare_move();
-      //ClearToSend();
-      return true;
-    }
-    return false;
+    return SCARA_move_to_cal(45, 135);
   }
 
   /**

From 379348487e423bfb67a1aba1c49c5acdb54d5e43 Mon Sep 17 00:00:00 2001
From: Josef Larsson <josla972@student.liu.se>
Date: Sun, 22 Mar 2015 12:21:31 +0100
Subject: [PATCH 2/8] Removed malplaced comment.

---
 Marlin/Marlin_main.cpp | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/Marlin/Marlin_main.cpp b/Marlin/Marlin_main.cpp
index cb7434ef41..5c1e463121 100644
--- a/Marlin/Marlin_main.cpp
+++ b/Marlin/Marlin_main.cpp
@@ -3967,9 +3967,6 @@ inline void gcode_M303() {
 }
 
 #ifdef SCARA
-  /**
-   * M360: SCARA calibration: Move to cal-position ThetaA (0 deg calibration)
-   */
   bool SCARA_move_to_cal(uint8_t delta_x, uint8_t delta_y) {
     //SoftEndsEnabled = false;              // Ignore soft endstops during calibration
     //SERIAL_ECHOLN(" Soft endstops disabled ");

From 6bdee87be3525d9219301bdb90d7256d92dd9f3b Mon Sep 17 00:00:00 2001
From: Scott Lahteine <sourcetree@thinkyhead.com>
Date: Mon, 23 Mar 2015 00:27:29 -0700
Subject: [PATCH 3/8] Cleanup temperature code

- Get rid of unused temp states in the ISR, resulting in more frequent
temperature reading with fewer sensors
- Shrink code slightly in min/max testing
---
 Marlin/temperature.cpp | 215 +++++++++++++++++++++++++----------------
 1 file changed, 132 insertions(+), 83 deletions(-)

diff --git a/Marlin/temperature.cpp b/Marlin/temperature.cpp
index 26360a5144..50fc0e3813 100644
--- a/Marlin/temperature.cpp
+++ b/Marlin/temperature.cpp
@@ -1240,16 +1240,26 @@ void disable_heater() {
 enum TempState {
   PrepareTemp_0,
   MeasureTemp_0,
-  PrepareTemp_BED,
-  MeasureTemp_BED,
-  PrepareTemp_1,
-  MeasureTemp_1,
-  PrepareTemp_2,
-  MeasureTemp_2,
-  PrepareTemp_3,
-  MeasureTemp_3,
-  Prepare_FILWIDTH,
-  Measure_FILWIDTH,
+  #if HAS_TEMP_BED
+    PrepareTemp_BED,
+    MeasureTemp_BED,
+  #endif
+  #if HAS_TEMP_1
+    PrepareTemp_1,
+    MeasureTemp_1,
+  #endif
+  #if HAS_TEMP_2
+    PrepareTemp_2,
+    MeasureTemp_2,
+  #endif
+  #if HAS_TEMP_3
+    PrepareTemp_3,
+    MeasureTemp_3,
+  #endif
+  #if HAS_FILAMENT_SENSOR
+    Prepare_FILWIDTH,
+    Measure_FILWIDTH,
+  #endif
   StartupDelay // Startup, delay initial temp reading a tiny bit so the hardware can settle
 };
 
@@ -1473,78 +1483,124 @@ ISR(TIMER0_COMPB_vect) {
       #if HAS_TEMP_0
         raw_temp_value[0] += ADC;
       #endif
-      temp_state = PrepareTemp_BED;
+      temp_state =
+        #if HAS_TEMP_BED
+          PrepareTemp_BED
+        #elif HAS_TEMP_1
+          PrepareTemp_1
+        #elif HAS_TEMP_2
+          PrepareTemp_2
+        #elif HAS_TEMP_3
+          PrepareTemp_3
+        #elif HAS_FILAMENT_SENSOR
+          Prepare_FILWIDTH
+        #else
+          PrepareTemp_0
+        #endif
+      ;
       break;
-    case PrepareTemp_BED:
-      #if HAS_TEMP_BED
+
+    #if HAS_TEMP_BED
+      case PrepareTemp_BED:
         START_ADC(TEMP_BED_PIN);
-      #endif
-      lcd_buttons_update();
-      temp_state = MeasureTemp_BED;
-      break;
-    case MeasureTemp_BED:
-      #if HAS_TEMP_BED
+        lcd_buttons_update();
+        temp_state = MeasureTemp_BED;
+        break;
+      case MeasureTemp_BED:
         raw_temp_bed_value += ADC;
-      #endif
-      temp_state = PrepareTemp_1;
-      break;
-    case PrepareTemp_1:
-      #if HAS_TEMP_1
+        temp_state =
+          #if HAS_TEMP_1
+            PrepareTemp_1
+          #elif HAS_TEMP_2
+            PrepareTemp_2
+          #elif HAS_TEMP_3
+            PrepareTemp_3
+          #elif HAS_FILAMENT_SENSOR
+            Prepare_FILWIDTH
+          #else
+            PrepareTemp_0
+          #endif
+        ;
+        break;
+    #endif
+
+    #if HAS_TEMP_1
+      case PrepareTemp_1:
         START_ADC(TEMP_1_PIN);
-      #endif
-      lcd_buttons_update();
-      temp_state = MeasureTemp_1;
-      break;
-    case MeasureTemp_1:
-      #if HAS_TEMP_1
+        lcd_buttons_update();
+        temp_state = MeasureTemp_1;
+        break;
+      case MeasureTemp_1:
         raw_temp_value[1] += ADC;
-      #endif
-      temp_state = PrepareTemp_2;
-      break;
-    case PrepareTemp_2:
-      #if HAS_TEMP_2
+        temp_state =
+          #if HAS_TEMP_2
+            PrepareTemp_2
+          #elif HAS_TEMP_3
+            PrepareTemp_3
+          #elif HAS_FILAMENT_SENSOR
+            Prepare_FILWIDTH
+          #else
+            PrepareTemp_0
+          #endif
+        ;
+        break;
+    #endif
+
+    #if HAS_TEMP_2
+      case PrepareTemp_2:
         START_ADC(TEMP_2_PIN);
-      #endif
-      lcd_buttons_update();
-      temp_state = MeasureTemp_2;
-      break;
-    case MeasureTemp_2:
-      #if HAS_TEMP_2
+        lcd_buttons_update();
+        temp_state = MeasureTemp_2;
+        break;
+      case MeasureTemp_2:
         raw_temp_value[2] += ADC;
-      #endif
-      temp_state = PrepareTemp_3;
-      break;
-    case PrepareTemp_3:
-      #if HAS_TEMP_3
+        temp_state =
+          #if HAS_TEMP_3
+            PrepareTemp_3
+          #elif HAS_FILAMENT_SENSOR
+            Prepare_FILWIDTH
+          #else
+            PrepareTemp_0
+          #endif
+        ;
+        break;
+    #endif
+
+    #if HAS_TEMP_3
+      case PrepareTemp_3:
         START_ADC(TEMP_3_PIN);
-      #endif
-      lcd_buttons_update();
-      temp_state = MeasureTemp_3;
-      break;
-    case MeasureTemp_3:
-      #if HAS_TEMP_3
+        lcd_buttons_update();
+        temp_state = MeasureTemp_3;
+        break;
+      case MeasureTemp_3:
         raw_temp_value[3] += ADC;
-      #endif
-      temp_state = Prepare_FILWIDTH;
-      break;
-    case Prepare_FILWIDTH:
-      #if HAS_FILAMENT_SENSOR
+        temp_state =
+          #if HAS_FILAMENT_SENSOR
+            Prepare_FILWIDTH
+          #else
+            PrepareTemp_0
+          #endif
+        ;
+        break;
+    #endif
+
+    #if HAS_FILAMENT_SENSOR
+      case Prepare_FILWIDTH:
         START_ADC(FILWIDTH_PIN);
-      #endif
-      lcd_buttons_update();
-      temp_state = Measure_FILWIDTH;
-      break;
-    case Measure_FILWIDTH:
-      #if HAS_FILAMENT_SENSOR
+        lcd_buttons_update();
+        temp_state = Measure_FILWIDTH;
+        break;
+      case Measure_FILWIDTH:
         // raw_filwidth_value += ADC;  //remove to use an IIR filter approach
         if (ADC > 102) { //check that ADC is reading a voltage > 0.5 volts, otherwise don't take in the data.
           raw_filwidth_value -= (raw_filwidth_value>>7);  //multiply raw_filwidth_value by 127/128
           raw_filwidth_value += ((unsigned long)ADC<<7);  //add new ADC reading
         }
-      #endif
-      temp_state = PrepareTemp_0;
-      temp_count++;
-      break;
+        temp_state = PrepareTemp_0;
+        temp_count++;
+        break;
+    #endif
+
     case StartupDelay:
       temp_state = PrepareTemp_0;
       break;
@@ -1554,7 +1610,7 @@ ISR(TIMER0_COMPB_vect) {
     //   SERIAL_ERRORLNPGM("Temp measurement error!");
     //   break;
   } // switch(temp_state)
-    
+
   if (temp_count >= OVERSAMPLENR) { // 10 * 16 * 1/(16000000/64/256)  = 164ms.
     if (!temp_meas_ready) { //Only update the raw values if they have been read. Else we could be updating them during reading.
       #ifndef HEATER_0_USES_MAX6675
@@ -1579,7 +1635,7 @@ ISR(TIMER0_COMPB_vect) {
     #if HAS_FILAMENT_SENSOR
       current_raw_filwidth = raw_filwidth_value >> 10;  // Divide to get to 0-16384 range since we used 1/128 IIR filter approach
     #endif
-    
+
     temp_meas_ready = true;
     temp_count = 0;
     for (int i = 0; i < EXTRUDERS; i++) raw_temp_value[i] = 0;
@@ -1587,44 +1643,39 @@ ISR(TIMER0_COMPB_vect) {
 
     #if HEATER_0_RAW_LO_TEMP > HEATER_0_RAW_HI_TEMP
       #define GE0 <=
-      #define LE0 >=
     #else
       #define GE0 >=
-      #define LE0 <=
     #endif
     if (current_temperature_raw[0] GE0 maxttemp_raw[0]) max_temp_error(0);
-    if (current_temperature_raw[0] LE0 minttemp_raw[0]) min_temp_error(0);
+    if (minttemp_raw[0] GE0 current_temperature_raw[0]) min_temp_error(0);
 
     #if EXTRUDERS > 1
       #if HEATER_1_RAW_LO_TEMP > HEATER_1_RAW_HI_TEMP
         #define GE1 <=
-        #define LE1 >=
       #else
         #define GE1 >=
-        #define LE1 <=
       #endif
       if (current_temperature_raw[1] GE1 maxttemp_raw[1]) max_temp_error(1);
-      if (current_temperature_raw[1] LE1 minttemp_raw[1]) min_temp_error(1);
+      if (minttemp_raw[1] GE0 current_temperature_raw[1]) min_temp_error(1);
+
       #if EXTRUDERS > 2
         #if HEATER_2_RAW_LO_TEMP > HEATER_2_RAW_HI_TEMP
           #define GE2 <=
-          #define LE2 >=
         #else
           #define GE2 >=
-          #define LE2 <=
         #endif
         if (current_temperature_raw[2] GE2 maxttemp_raw[2]) max_temp_error(2);
-        if (current_temperature_raw[2] LE2 minttemp_raw[2]) min_temp_error(2);
+        if (minttemp_raw[2] GE0 current_temperature_raw[2]) min_temp_error(2);
+
         #if EXTRUDERS > 3
           #if HEATER_3_RAW_LO_TEMP > HEATER_3_RAW_HI_TEMP
             #define GE3 <=
-            #define LE3 >=
           #else
             #define GE3 >=
-            #define LE3 <=
           #endif
           if (current_temperature_raw[3] GE3 maxttemp_raw[3]) max_temp_error(3);
-          if (current_temperature_raw[3] LE3 minttemp_raw[3]) min_temp_error(3);
+          if (minttemp_raw[3] GE0 current_temperature_raw[3]) min_temp_error(3);
+
         #endif // EXTRUDERS > 3
       #endif // EXTRUDERS > 2
     #endif // EXTRUDERS > 1
@@ -1632,10 +1683,8 @@ ISR(TIMER0_COMPB_vect) {
     #if defined(BED_MAXTEMP) && (TEMP_SENSOR_BED != 0)
       #if HEATER_BED_RAW_LO_TEMP > HEATER_BED_RAW_HI_TEMP
         #define GEBED <=
-        #define LEBED >=
       #else
         #define GEBED >=
-        #define LEBED <=
       #endif
       if (current_temperature_bed_raw GEBED bed_maxttemp_raw) {
         target_temperature_bed = 0;

From e6f6c6e3a1793fb58d25b8dbe14598dfd2abba4d Mon Sep 17 00:00:00 2001
From: wurstnase <tonnhofer@gmail.com>
Date: Mon, 23 Mar 2015 08:32:48 +0100
Subject: [PATCH 4/8] fix bad insertion config again

---
 Marlin/example_configurations/Felix/Configuration.h      | 1 -
 Marlin/example_configurations/Felix/Configuration_DUAL.h | 1 -
 2 files changed, 2 deletions(-)

diff --git a/Marlin/example_configurations/Felix/Configuration.h b/Marlin/example_configurations/Felix/Configuration.h
index 973fb63540..b03e871ed3 100644
--- a/Marlin/example_configurations/Felix/Configuration.h
+++ b/Marlin/example_configurations/Felix/Configuration.h
@@ -386,7 +386,6 @@ const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of
   // Note: this feature occupies 10'206 byte
   #ifdef AUTO_BED_LEVELING_GRID
 
-home_offset    // set the rectangle in which to probe
     #define LEFT_PROBE_BED_POSITION 15
     #define RIGHT_PROBE_BED_POSITION 170
     #define BACK_PROBE_BED_POSITION 180
diff --git a/Marlin/example_configurations/Felix/Configuration_DUAL.h b/Marlin/example_configurations/Felix/Configuration_DUAL.h
index 42dcd38278..be59d340fe 100644
--- a/Marlin/example_configurations/Felix/Configuration_DUAL.h
+++ b/Marlin/example_configurations/Felix/Configuration_DUAL.h
@@ -386,7 +386,6 @@ const bool Z_MAX_ENDSTOP_INVERTING = true; // set to true to invert the logic of
   // Note: this feature occupies 10'206 byte
   #ifdef AUTO_BED_LEVELING_GRID
 
-home_offset    // set the rectangle in which to probe
     #define LEFT_PROBE_BED_POSITION 15
     #define RIGHT_PROBE_BED_POSITION 170
     #define BACK_PROBE_BED_POSITION 180

From 37cde8a19170921774fd95bc4450263966e6c7bb Mon Sep 17 00:00:00 2001
From: nicolas-rambaud <n.rambaud@moodmedia.com>
Date: Mon, 23 Mar 2015 12:29:12 +0100
Subject: [PATCH 5/8] Report changes from previous PR from old code base
 including : I've updated the minimum values from the LCD. It has been a while
 that i want to at least fix this. I have an inductive probe and often i need
 to set my zOffset to something lower than 0.5. With the current
 implementation, the default LCD value is set to 0.5 for some reason. On my
 case i need to be able to set it down to 0.0 as my inductive probe can be
 lower than 0.5. Before with the LCD we couldn't change this value below 0.5.
 We had to flash the firmware every time which was painful. Now we are able to
 change this value down to 0.0 if needed. I've also changed the minimum value
 for Z min acceleration. In the default configuration it's set to 25 but on
 the LCD the minimum was 100 which is not coherent. I've changes the minimum
 to 10. On this axis, depending on the mechanics/motor drivers we might
 require very low acceleration, so i guess 10 is somehow realistic.

---
 Marlin/ultralcd.cpp | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/Marlin/ultralcd.cpp b/Marlin/ultralcd.cpp
index 29b3ca118a..19e3d0c504 100644
--- a/Marlin/ultralcd.cpp
+++ b/Marlin/ultralcd.cpp
@@ -912,9 +912,9 @@ static void lcd_control_motion_menu() {
   START_MENU();
   MENU_ITEM(back, MSG_CONTROL, lcd_control_menu);
   #ifdef ENABLE_AUTO_BED_LEVELING
-    MENU_ITEM_EDIT(float32, MSG_ZPROBE_ZOFFSET, &zprobe_zoffset, 0.5, 50);
+    MENU_ITEM_EDIT(float32, MSG_ZPROBE_ZOFFSET, &zprobe_zoffset, 0.0, 50);
   #endif
-  MENU_ITEM_EDIT(float5, MSG_ACC, &acceleration, 500, 99000);
+  MENU_ITEM_EDIT(float5, MSG_ACC, &acceleration, 10, 99000);
   MENU_ITEM_EDIT(float3, MSG_VXY_JERK, &max_xy_jerk, 1, 990);
   MENU_ITEM_EDIT(float52, MSG_VZ_JERK, &max_z_jerk, 0.1, 990);
   MENU_ITEM_EDIT(float3, MSG_VE_JERK, &max_e_jerk, 1, 990);
@@ -926,7 +926,7 @@ static void lcd_control_motion_menu() {
   MENU_ITEM_EDIT(float3, MSG_VTRAV_MIN, &mintravelfeedrate, 0, 999);
   MENU_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_X, &max_acceleration_units_per_sq_second[X_AXIS], 100, 99000, reset_acceleration_rates);
   MENU_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_Y, &max_acceleration_units_per_sq_second[Y_AXIS], 100, 99000, reset_acceleration_rates);
-  MENU_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_Z, &max_acceleration_units_per_sq_second[Z_AXIS], 100, 99000, reset_acceleration_rates);
+  MENU_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_Z, &max_acceleration_units_per_sq_second[Z_AXIS], 10, 99000, reset_acceleration_rates);
   MENU_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_E, &max_acceleration_units_per_sq_second[E_AXIS], 100, 99000, reset_acceleration_rates);
   MENU_ITEM_EDIT(float5, MSG_A_RETRACT, &retract_acceleration, 100, 99000);
   MENU_ITEM_EDIT(float5, MSG_A_TRAVEL, &travel_acceleration, 100, 99000);

From 1fac3886640ac4aa372d7958435f3bef42c51424 Mon Sep 17 00:00:00 2001
From: Scott Lahteine <sourcetree@thinkyhead.com>
Date: Mon, 23 Mar 2015 15:18:22 -0700
Subject: [PATCH 6/8] Revert measurement loop

---
 Marlin/temperature.cpp | 204 ++++++++++++++++-------------------------
 1 file changed, 77 insertions(+), 127 deletions(-)

diff --git a/Marlin/temperature.cpp b/Marlin/temperature.cpp
index 50fc0e3813..1582c437a2 100644
--- a/Marlin/temperature.cpp
+++ b/Marlin/temperature.cpp
@@ -1145,28 +1145,28 @@ void disable_heater() {
   for (int i=0; i<EXTRUDERS; i++) setTargetHotend(0, i);
   setTargetBed(0);
 
+  #define DISABLE_HEATER(NR) { \
+    target_temperature[NR] = 0; \
+    soft_pwm[NR] = 0; \
+    WRITE_HEATER_ ## NR (LOW); \
+  }
+
   #if HAS_TEMP_0
     target_temperature[0] = 0;
     soft_pwm[0] = 0;
-    WRITE_HEATER_0P(LOW); // If HEATERS_PARALLEL should apply, change to WRITE_HEATER_0
+    WRITE_HEATER_0P(LOW); // Should HEATERS_PARALLEL apply here? Then change to DISABLE_HEATER(0)
   #endif
 
   #if EXTRUDERS > 1 && HAS_TEMP_1
-    target_temperature[1] = 0;
-    soft_pwm[1] = 0;
-    WRITE_HEATER_1(LOW);
+    DISABLE_HEATER(1);
   #endif
 
   #if EXTRUDERS > 2 && HAS_TEMP_2
-    target_temperature[2] = 0;
-    soft_pwm[2] = 0;
-    WRITE_HEATER_2(LOW);
+    DISABLE_HEATER(2);
   #endif
 
   #if EXTRUDERS > 3 && HAS_TEMP_3
-    target_temperature[3] = 0;
-    soft_pwm[3] = 0;
-    WRITE_HEATER_3(LOW);
+    DISABLE_HEATER(3);
   #endif
 
   #if HAS_TEMP_BED
@@ -1240,26 +1240,16 @@ void disable_heater() {
 enum TempState {
   PrepareTemp_0,
   MeasureTemp_0,
-  #if HAS_TEMP_BED
-    PrepareTemp_BED,
-    MeasureTemp_BED,
-  #endif
-  #if HAS_TEMP_1
-    PrepareTemp_1,
-    MeasureTemp_1,
-  #endif
-  #if HAS_TEMP_2
-    PrepareTemp_2,
-    MeasureTemp_2,
-  #endif
-  #if HAS_TEMP_3
-    PrepareTemp_3,
-    MeasureTemp_3,
-  #endif
-  #if HAS_FILAMENT_SENSOR
-    Prepare_FILWIDTH,
-    Measure_FILWIDTH,
-  #endif
+  PrepareTemp_BED,
+  MeasureTemp_BED,
+  PrepareTemp_1,
+  MeasureTemp_1,
+  PrepareTemp_2,
+  MeasureTemp_2,
+  PrepareTemp_3,
+  MeasureTemp_3,
+  Prepare_FILWIDTH,
+  Measure_FILWIDTH,
   StartupDelay // Startup, delay initial temp reading a tiny bit so the hardware can settle
 };
 
@@ -1483,123 +1473,83 @@ ISR(TIMER0_COMPB_vect) {
       #if HAS_TEMP_0
         raw_temp_value[0] += ADC;
       #endif
-      temp_state =
-        #if HAS_TEMP_BED
-          PrepareTemp_BED
-        #elif HAS_TEMP_1
-          PrepareTemp_1
-        #elif HAS_TEMP_2
-          PrepareTemp_2
-        #elif HAS_TEMP_3
-          PrepareTemp_3
-        #elif HAS_FILAMENT_SENSOR
-          Prepare_FILWIDTH
-        #else
-          PrepareTemp_0
-        #endif
-      ;
+      temp_state = PrepareTemp_BED;
       break;
 
-    #if HAS_TEMP_BED
-      case PrepareTemp_BED:
+    case PrepareTemp_BED:
+      #if HAS_TEMP_BED
         START_ADC(TEMP_BED_PIN);
-        lcd_buttons_update();
-        temp_state = MeasureTemp_BED;
-        break;
-      case MeasureTemp_BED:
+      #endif
+      lcd_buttons_update();
+      temp_state = MeasureTemp_BED;
+      break;
+    case MeasureTemp_BED:
+      #if HAS_TEMP_BED
         raw_temp_bed_value += ADC;
-        temp_state =
-          #if HAS_TEMP_1
-            PrepareTemp_1
-          #elif HAS_TEMP_2
-            PrepareTemp_2
-          #elif HAS_TEMP_3
-            PrepareTemp_3
-          #elif HAS_FILAMENT_SENSOR
-            Prepare_FILWIDTH
-          #else
-            PrepareTemp_0
-          #endif
-        ;
-        break;
-    #endif
+      #endif
+      temp_state = PrepareTemp_1;
+      break;
 
-    #if HAS_TEMP_1
-      case PrepareTemp_1:
+    case PrepareTemp_1:
+      #if HAS_TEMP_1
         START_ADC(TEMP_1_PIN);
-        lcd_buttons_update();
-        temp_state = MeasureTemp_1;
-        break;
-      case MeasureTemp_1:
+      #endif
+      lcd_buttons_update();
+      temp_state = MeasureTemp_1;
+      break;
+    case MeasureTemp_1:
+      #if HAS_TEMP_1
         raw_temp_value[1] += ADC;
-        temp_state =
-          #if HAS_TEMP_2
-            PrepareTemp_2
-          #elif HAS_TEMP_3
-            PrepareTemp_3
-          #elif HAS_FILAMENT_SENSOR
-            Prepare_FILWIDTH
-          #else
-            PrepareTemp_0
-          #endif
-        ;
-        break;
-    #endif
+      #endif
+      temp_state = PrepareTemp_2;
+      break;
 
-    #if HAS_TEMP_2
-      case PrepareTemp_2:
+    case PrepareTemp_2:
+      #if HAS_TEMP_2
         START_ADC(TEMP_2_PIN);
-        lcd_buttons_update();
-        temp_state = MeasureTemp_2;
-        break;
-      case MeasureTemp_2:
+      #endif
+      lcd_buttons_update();
+      temp_state = MeasureTemp_2;
+      break;
+    case MeasureTemp_2:
+      #if HAS_TEMP_2
         raw_temp_value[2] += ADC;
-        temp_state =
-          #if HAS_TEMP_3
-            PrepareTemp_3
-          #elif HAS_FILAMENT_SENSOR
-            Prepare_FILWIDTH
-          #else
-            PrepareTemp_0
-          #endif
-        ;
-        break;
-    #endif
+      #endif
+      temp_state = PrepareTemp_3;
+      break;
 
-    #if HAS_TEMP_3
-      case PrepareTemp_3:
+    case PrepareTemp_3:
+      #if HAS_TEMP_3
         START_ADC(TEMP_3_PIN);
-        lcd_buttons_update();
-        temp_state = MeasureTemp_3;
-        break;
-      case MeasureTemp_3:
+      #endif
+      lcd_buttons_update();
+      temp_state = MeasureTemp_3;
+      break;
+    case MeasureTemp_3:
+      #if HAS_TEMP_3
         raw_temp_value[3] += ADC;
-        temp_state =
-          #if HAS_FILAMENT_SENSOR
-            Prepare_FILWIDTH
-          #else
-            PrepareTemp_0
-          #endif
-        ;
-        break;
-    #endif
+      #endif
+      temp_state = Prepare_FILWIDTH;
+      break;
 
-    #if HAS_FILAMENT_SENSOR
-      case Prepare_FILWIDTH:
+    case Prepare_FILWIDTH:
+      #if HAS_FILAMENT_SENSOR
         START_ADC(FILWIDTH_PIN);
-        lcd_buttons_update();
-        temp_state = Measure_FILWIDTH;
-        break;
-      case Measure_FILWIDTH:
+      #endif
+      lcd_buttons_update();
+      temp_state = Measure_FILWIDTH;
+      break;
+    case Measure_FILWIDTH:
+      #if HAS_FILAMENT_SENSOR
         // raw_filwidth_value += ADC;  //remove to use an IIR filter approach
         if (ADC > 102) { //check that ADC is reading a voltage > 0.5 volts, otherwise don't take in the data.
           raw_filwidth_value -= (raw_filwidth_value>>7);  //multiply raw_filwidth_value by 127/128
           raw_filwidth_value += ((unsigned long)ADC<<7);  //add new ADC reading
         }
-        temp_state = PrepareTemp_0;
-        temp_count++;
-        break;
-    #endif
+      #endif
+      temp_state = PrepareTemp_0;
+      temp_count++;
+      break;
 
     case StartupDelay:
       temp_state = PrepareTemp_0;

From b1a7f74ee4cef4e5e40c76318078cb13fc076a8c Mon Sep 17 00:00:00 2001
From: Scott Lahteine <sourcetree@thinkyhead.com>
Date: Mon, 23 Mar 2015 18:25:31 -0700
Subject: [PATCH 7/8] A logo for the Marlin wiki

---
 Documentation/Logo/marlinwiki.png | Bin 0 -> 6871 bytes
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100755 Documentation/Logo/marlinwiki.png

diff --git a/Documentation/Logo/marlinwiki.png b/Documentation/Logo/marlinwiki.png
new file mode 100755
index 0000000000000000000000000000000000000000..23588b24833d781e433d2ba3212af3c56de7ba8a
GIT binary patch
literal 6871
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

literal 0
HcmV?d00001


From fc53e43de6e849be2001c70d604fd2a56948a491 Mon Sep 17 00:00:00 2001
From: Scott Lahteine <sourcetree@thinkyhead.com>
Date: Mon, 23 Mar 2015 20:55:48 -0700
Subject: [PATCH 8/8] Don't test raw temp for MAX6675

- Remove test of raw temp for thermistor 0 when using MAX6675
- Longer `raw_temp_value` array for `TEMP_SENSOR_1_AS_REDUNDANT`
---
 Marlin/temperature.cpp | 38 ++++++++++++++++++++++----------------
 1 file changed, 22 insertions(+), 16 deletions(-)

diff --git a/Marlin/temperature.cpp b/Marlin/temperature.cpp
index 1582c437a2..cf431cc6f4 100644
--- a/Marlin/temperature.cpp
+++ b/Marlin/temperature.cpp
@@ -177,7 +177,7 @@ static volatile bool temp_meas_ready = false;
 // Init min and max temp with extreme values to prevent false errors during startup
 static int minttemp_raw[EXTRUDERS] = ARRAY_BY_EXTRUDERS( HEATER_0_RAW_LO_TEMP , HEATER_1_RAW_LO_TEMP , HEATER_2_RAW_LO_TEMP, HEATER_3_RAW_LO_TEMP);
 static int maxttemp_raw[EXTRUDERS] = ARRAY_BY_EXTRUDERS( HEATER_0_RAW_HI_TEMP , HEATER_1_RAW_HI_TEMP , HEATER_2_RAW_HI_TEMP, HEATER_3_RAW_HI_TEMP);
-static int minttemp[EXTRUDERS] = ARRAY_BY_EXTRUDERS( 0, 0, 0, 0 );
+static int minttemp[EXTRUDERS] = { 0 };
 static int maxttemp[EXTRUDERS] = ARRAY_BY_EXTRUDERS( 16383, 16383, 16383, 16383 );
 //static int bed_minttemp_raw = HEATER_BED_RAW_LO_TEMP; /* No bed mintemp error implemented?!? */
 #ifdef BED_MAXTEMP
@@ -197,8 +197,8 @@ static float analog2tempBed(int raw);
 static void updateTemperaturesFromRawValues();
 
 #ifdef WATCH_TEMP_PERIOD
-  int watch_start_temp[EXTRUDERS] = ARRAY_BY_EXTRUDERS(0,0,0,0);
-  unsigned long watchmillis[EXTRUDERS] = ARRAY_BY_EXTRUDERS(0,0,0,0);
+  int watch_start_temp[EXTRUDERS] = { 0 };
+  unsigned long watchmillis[EXTRUDERS] = { 0 };
 #endif //WATCH_TEMP_PERIOD
 
 #ifndef SOFT_PWM_SCALE
@@ -661,12 +661,6 @@ void manage_heater() {
 
   updateTemperaturesFromRawValues();
 
-  #ifdef HEATER_0_USES_MAX6675
-    float ct = current_temperature[0];
-    if (ct > min(HEATER_0_MAXTEMP, 1023)) max_temp_error(0);
-    if (ct < max(HEATER_0_MINTEMP, 0.01)) min_temp_error(0);
-  #endif //HEATER_0_USES_MAX6675
-
   unsigned long ms = millis();
 
   // Loop through all extruders
@@ -1257,9 +1251,15 @@ enum TempState {
 // Timer 0 is shared with millies
 //
 ISR(TIMER0_COMPB_vect) {
+  #ifdef TEMP_SENSOR_1_AS_REDUNDANT
+    #define TEMP_SENSOR_COUNT 2
+  #else 
+    #define TEMP_SENSOR_COUNT EXTRUDERS
+  #endif
+
   //these variables are only accesible from the ISR, but static, so they don't lose their value
   static unsigned char temp_count = 0;
-  static unsigned long raw_temp_value[EXTRUDERS] = { 0 };
+  static unsigned long raw_temp_value[TEMP_SENSOR_COUNT] = { 0 };
   static unsigned long raw_temp_bed_value = 0;
   static TempState temp_state = StartupDelay;
   static unsigned char pwm_count = BIT(SOFT_PWM_SCALE);
@@ -1588,16 +1588,22 @@ ISR(TIMER0_COMPB_vect) {
 
     temp_meas_ready = true;
     temp_count = 0;
-    for (int i = 0; i < EXTRUDERS; i++) raw_temp_value[i] = 0;
+    for (int i = 0; i < TEMP_SENSOR_COUNT; i++) raw_temp_value[i] = 0;
     raw_temp_bed_value = 0;
 
-    #if HEATER_0_RAW_LO_TEMP > HEATER_0_RAW_HI_TEMP
-      #define GE0 <=
+    #ifdef HEATER_0_USES_MAX6675
+      float ct = current_temperature[0];
+      if (ct > min(HEATER_0_MAXTEMP, 1023)) max_temp_error(0);
+      if (ct < max(HEATER_0_MINTEMP, 0.01)) min_temp_error(0);
     #else
-      #define GE0 >=
+      #if HEATER_0_RAW_LO_TEMP > HEATER_0_RAW_HI_TEMP
+        #define GE0 <=
+      #else
+        #define GE0 >=
+      #endif
+      if (current_temperature_raw[0] GE0 maxttemp_raw[0]) max_temp_error(0);
+      if (minttemp_raw[0] GE0 current_temperature_raw[0]) min_temp_error(0);
     #endif
-    if (current_temperature_raw[0] GE0 maxttemp_raw[0]) max_temp_error(0);
-    if (minttemp_raw[0] GE0 current_temperature_raw[0]) min_temp_error(0);
 
     #if EXTRUDERS > 1
       #if HEATER_1_RAW_LO_TEMP > HEATER_1_RAW_HI_TEMP