Browse Source

Merge remote-tracking branch 'MarlinFirmware/Development' into Merge_cleanup

Conflicts:
	Marlin/Marlin_main.cpp
Chris Roadfeldt 9 years ago
parent
commit
745d9fe1a4
5 changed files with 383 additions and 317 deletions
  1. 5
    1
      Marlin/Conditionals.h
  2. 2
    0
      Marlin/Marlin.h
  3. 304
    314
      Marlin/Marlin_main.cpp
  4. 70
    1
      Marlin/Sd2PinMap.h
  5. 2
    1
      Marlin/ultralcd.h

+ 5
- 1
Marlin/Conditionals.h View File

4
  */
4
  */
5
 #ifndef CONDITIONALS_H
5
 #ifndef CONDITIONALS_H
6
 
6
 
7
+#ifndef M_PI
8
+  #define M_PI 3.1415926536
9
+#endif
10
+
7
 #ifndef CONFIGURATION_LCD // Get the LCD defines which are needed first
11
 #ifndef CONFIGURATION_LCD // Get the LCD defines which are needed first
8
 
12
 
9
   #define CONFIGURATION_LCD
13
   #define CONFIGURATION_LCD
255
    * Advance calculated values
259
    * Advance calculated values
256
    */
260
    */
257
   #ifdef ADVANCE
261
   #ifdef ADVANCE
258
-    #define EXTRUSION_AREA (0.25 * D_FILAMENT * D_FILAMENT * 3.14159)
262
+    #define EXTRUSION_AREA (0.25 * D_FILAMENT * D_FILAMENT * M_PI)
259
     #define STEPS_PER_CUBIC_MM_E (axis_steps_per_unit[E_AXIS] / EXTRUSION_AREA)
263
     #define STEPS_PER_CUBIC_MM_E (axis_steps_per_unit[E_AXIS] / EXTRUSION_AREA)
260
   #endif
264
   #endif
261
 
265
 

+ 2
- 0
Marlin/Marlin.h View File

29
 
29
 
30
 #define BIT(b) (1<<(b))
30
 #define BIT(b) (1<<(b))
31
 #define TEST(n,b) (((n)&BIT(b))!=0)
31
 #define TEST(n,b) (((n)&BIT(b))!=0)
32
+#define RADIANS(d) ((d)*M_PI/180.0)
33
+#define DEGREES(r) ((d)*180.0/M_PI)
32
 
34
 
33
 // Arduino < 1.0.0 does not define this, so we need to do it ourselves
35
 // Arduino < 1.0.0 does not define this, so we need to do it ourselves
34
 #ifndef analogInputToDigitalPin
36
 #ifndef analogInputToDigitalPin

+ 304
- 314
Marlin/Marlin_main.cpp View File

1034
 inline void sync_plan_position() {
1034
 inline void sync_plan_position() {
1035
   plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]);
1035
   plan_set_position(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS]);
1036
 }
1036
 }
1037
+#if defined(DELTA) || defined(SCARA)
1038
+  inline void sync_plan_position_delta() {
1039
+    calculate_delta(current_position);
1040
+    plan_set_position(delta[X_AXIS], delta[Y_AXIS], delta[Z_AXIS], current_position[E_AXIS]);
1041
+  }
1042
+#endif
1037
 
1043
 
1038
 #ifdef ENABLE_AUTO_BED_LEVELING
1044
 #ifdef ENABLE_AUTO_BED_LEVELING
1039
 
1045
 
1103
       destination[Z_AXIS] = -10;
1109
       destination[Z_AXIS] = -10;
1104
       prepare_move_raw();
1110
       prepare_move_raw();
1105
       st_synchronize();
1111
       st_synchronize();
1106
-      endstops_hit_on_purpose();
1107
-
1112
+      endstops_hit_on_purpose(); // clear endstop hit flags
1113
+      
1108
       // we have to let the planner know where we are right now as it is not where we said to go.
1114
       // we have to let the planner know where we are right now as it is not where we said to go.
1109
       long stop_steps = st_get_position(Z_AXIS);
1115
       long stop_steps = st_get_position(Z_AXIS);
1110
       float mm = start_z - float(start_steps - stop_steps) / axis_steps_per_unit[Z_AXIS];
1116
       float mm = start_z - float(start_steps - stop_steps) / axis_steps_per_unit[Z_AXIS];
1111
       current_position[Z_AXIS] = mm;
1117
       current_position[Z_AXIS] = mm;
1112
-      calculate_delta(current_position);
1113
-      plan_set_position(delta[X_AXIS], delta[Y_AXIS], delta[Z_AXIS], current_position[E_AXIS]);
1114
-
1118
+      sync_plan_position_delta();
1119
+      
1115
     #else // !DELTA
1120
     #else // !DELTA
1116
 
1121
 
1117
       plan_bed_level_matrix.set_to_identity();
1122
       plan_bed_level_matrix.set_to_identity();
1130
       zPosition += home_retract_mm(Z_AXIS);
1135
       zPosition += home_retract_mm(Z_AXIS);
1131
       line_to_z(zPosition);
1136
       line_to_z(zPosition);
1132
       st_synchronize();
1137
       st_synchronize();
1133
-      endstops_hit_on_purpose();
1138
+      endstops_hit_on_purpose(); // clear endstop hit flags
1134
 
1139
 
1135
       // move back down slowly to find bed
1140
       // move back down slowly to find bed
1136
       if (homing_bump_divisor[Z_AXIS] >= 1)
1141
       if (homing_bump_divisor[Z_AXIS] >= 1)
1143
       zPosition -= home_retract_mm(Z_AXIS) * 2;
1148
       zPosition -= home_retract_mm(Z_AXIS) * 2;
1144
       line_to_z(zPosition);
1149
       line_to_z(zPosition);
1145
       st_synchronize();
1150
       st_synchronize();
1146
-      endstops_hit_on_purpose();
1151
+      endstops_hit_on_purpose(); // clear endstop hit flags
1147
 
1152
 
1148
       current_position[Z_AXIS] = st_get_position_mm(Z_AXIS);
1153
       current_position[Z_AXIS] = st_get_position_mm(Z_AXIS);
1149
       // make sure the planner knows where we are as it may be a bit different than we last said to move to
1154
       // make sure the planner knows where we are as it may be a bit different than we last said to move to
1267
       if (servo_endstops[Z_AXIS] >= 0) {
1272
       if (servo_endstops[Z_AXIS] >= 0) {
1268
 
1273
 
1269
         #if Z_RAISE_AFTER_PROBING > 0
1274
         #if Z_RAISE_AFTER_PROBING > 0
1270
-          do_blocking_move_to(current_position[X_AXIS], current_position[Y_AXIS], Z_RAISE_AFTER_PROBING);
1275
+          do_blocking_move_to(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS] + Z_RAISE_AFTER_PROBING);
1271
           st_synchronize();
1276
           st_synchronize();
1272
         #endif
1277
         #endif
1273
 
1278
 
1355
 
1360
 
1356
     #if Z_RAISE_BETWEEN_PROBINGS > 0
1361
     #if Z_RAISE_BETWEEN_PROBINGS > 0
1357
       if (retract_action == ProbeStay) {
1362
       if (retract_action == ProbeStay) {
1358
-        do_blocking_move_to(current_position[X_AXIS], current_position[Y_AXIS], Z_RAISE_BETWEEN_PROBINGS);
1363
+        do_blocking_move_to(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS] + Z_RAISE_BETWEEN_PROBINGS);
1359
         st_synchronize();
1364
         st_synchronize();
1360
       }
1365
       }
1361
     #endif
1366
     #endif
1440
 
1445
 
1441
 #endif // ENABLE_AUTO_BED_LEVELING
1446
 #endif // ENABLE_AUTO_BED_LEVELING
1442
 
1447
 
1448
+/**
1449
+ * Home an individual axis
1450
+ */
1451
+
1452
+#define HOMEAXIS(LETTER) homeaxis(LETTER##_AXIS)
1453
+
1443
 static void homeaxis(int axis) {
1454
 static void homeaxis(int axis) {
1444
   #define HOMEAXIS_DO(LETTER) \
1455
   #define HOMEAXIS_DO(LETTER) \
1445
     ((LETTER##_MIN_PIN > -1 && LETTER##_HOME_DIR==-1) || (LETTER##_MAX_PIN > -1 && LETTER##_HOME_DIR==1))
1456
     ((LETTER##_MIN_PIN > -1 && LETTER##_HOME_DIR==-1) || (LETTER##_MAX_PIN > -1 && LETTER##_HOME_DIR==1))
1446
 
1457
 
1447
-  if (axis == X_AXIS ? HOMEAXIS_DO(X) :
1448
-      axis == Y_AXIS ? HOMEAXIS_DO(Y) :
1449
-      axis == Z_AXIS ? HOMEAXIS_DO(Z) : 0) {
1458
+  if (axis == X_AXIS ? HOMEAXIS_DO(X) : axis == Y_AXIS ? HOMEAXIS_DO(Y) : axis == Z_AXIS ? HOMEAXIS_DO(Z) : 0) {
1450
 
1459
 
1451
     int axis_home_dir;
1460
     int axis_home_dir;
1452
 
1461
 
1456
       axis_home_dir = home_dir(axis);
1465
       axis_home_dir = home_dir(axis);
1457
     #endif
1466
     #endif
1458
 
1467
 
1468
+    // Set the axis position as setup for the move
1459
     current_position[axis] = 0;
1469
     current_position[axis] = 0;
1460
     sync_plan_position();
1470
     sync_plan_position();
1461
 
1471
 
1462
-    #ifndef Z_PROBE_SLED
1463
-      // Engage Servo endstop if enabled
1464
-      #ifdef SERVO_ENDSTOPS
1465
-        #if SERVO_LEVELING
1466
-          if (axis == Z_AXIS) {
1467
-            engage_z_probe();
1468
-          }
1469
-          else
1470
-        #endif // SERVO_LEVELING
1471
-
1472
-        if (servo_endstops[axis] > -1)
1473
-          servos[servo_endstops[axis]].write(servo_endstop_angles[axis * 2]);
1472
+    // Engage Servo endstop if enabled
1473
+    #ifdef SERVO_ENDSTOPS && !defined(Z_PROBE_SLED)
1474
 
1474
 
1475
-      #endif // SERVO_ENDSTOPS
1475
+      #if SERVO_LEVELING
1476
+        if (axis == Z_AXIS) engage_z_probe(); else
1477
+      #endif
1478
+        {
1479
+          if (servo_endstops[axis] > -1)
1480
+            servos[servo_endstops[axis]].write(servo_endstop_angles[axis * 2]);
1481
+        }
1476
 
1482
 
1477
-    #endif // Z_PROBE_SLED
1483
+    #endif // SERVO_ENDSTOPS && !Z_PROBE_SLED
1478
 
1484
 
1479
     #ifdef Z_DUAL_ENDSTOPS
1485
     #ifdef Z_DUAL_ENDSTOPS
1480
       if (axis == Z_AXIS) In_Homing_Process(true);
1486
       if (axis == Z_AXIS) In_Homing_Process(true);
1481
     #endif
1487
     #endif
1482
 
1488
 
1489
+    // Move towards the endstop until an endstop is triggered
1483
     destination[axis] = 1.5 * max_length(axis) * axis_home_dir;
1490
     destination[axis] = 1.5 * max_length(axis) * axis_home_dir;
1484
     feedrate = homing_feedrate[axis];
1491
     feedrate = homing_feedrate[axis];
1485
     line_to_destination();
1492
     line_to_destination();
1486
     st_synchronize();
1493
     st_synchronize();
1487
 
1494
 
1495
+    // Set the axis position as setup for the move
1488
     current_position[axis] = 0;
1496
     current_position[axis] = 0;
1489
     sync_plan_position();
1497
     sync_plan_position();
1498
+
1499
+    // Move away from the endstop by the axis HOME_RETRACT_MM
1490
     destination[axis] = -home_retract_mm(axis) * axis_home_dir;
1500
     destination[axis] = -home_retract_mm(axis) * axis_home_dir;
1491
     line_to_destination();
1501
     line_to_destination();
1492
     st_synchronize();
1502
     st_synchronize();
1493
 
1503
 
1494
-    destination[axis] = 2 * home_retract_mm(axis) * axis_home_dir;
1495
-
1504
+    // Slow down the feedrate for the next move
1496
     if (homing_bump_divisor[axis] >= 1)
1505
     if (homing_bump_divisor[axis] >= 1)
1497
       feedrate = homing_feedrate[axis] / homing_bump_divisor[axis];
1506
       feedrate = homing_feedrate[axis] / homing_bump_divisor[axis];
1498
     else {
1507
     else {
1499
       feedrate = homing_feedrate[axis] / 10;
1508
       feedrate = homing_feedrate[axis] / 10;
1500
-      SERIAL_ECHOLN("Warning: The Homing Bump Feedrate Divisor cannot be less than 1");
1509
+      SERIAL_ECHOLNPGM("Warning: The Homing Bump Feedrate Divisor cannot be less than 1");
1501
     }
1510
     }
1502
 
1511
 
1512
+    // Move slowly towards the endstop until triggered
1513
+    destination[axis] = 2 * home_retract_mm(axis) * axis_home_dir;
1503
     line_to_destination();
1514
     line_to_destination();
1504
     st_synchronize();
1515
     st_synchronize();
1516
+
1505
     #ifdef Z_DUAL_ENDSTOPS
1517
     #ifdef Z_DUAL_ENDSTOPS
1506
-      if (axis==Z_AXIS)
1507
-      {
1508
-        feedrate = homing_feedrate[axis];
1509
-        sync_plan_position();
1510
-        if (axis_home_dir > 0)
1511
-        {
1512
-          destination[axis] = (-1) * fabs(z_endstop_adj);
1513
-          if (z_endstop_adj > 0) Lock_z_motor(true); else Lock_z2_motor(true);
1514
-        } else {
1515
-          destination[axis] = fabs(z_endstop_adj);
1516
-          if (z_endstop_adj < 0) Lock_z_motor(true); else Lock_z2_motor(true);        
1518
+      if (axis == Z_AXIS) {
1519
+        float adj = fabs(z_endstop_adj);
1520
+        bool lockZ1;
1521
+        if (axis_home_dir > 0) {
1522
+          adj = -adj;
1523
+          lockZ1 = (z_endstop_adj > 0);
1517
         }
1524
         }
1525
+        else
1526
+          lockZ1 = (z_endstop_adj < 0);
1527
+
1528
+        if (lockZ1) Lock_z_motor(true); else Lock_z2_motor(true);
1529
+        sync_plan_position();
1530
+
1531
+        // Move to the adjusted endstop height
1532
+        feedrate = homing_feedrate[axis];
1533
+        destination[Z_AXIS] = adj;
1518
         line_to_destination();
1534
         line_to_destination();
1519
         st_synchronize();
1535
         st_synchronize();
1520
-        Lock_z_motor(false);
1521
-        Lock_z2_motor(false);
1536
+
1537
+        if (lockZ1) Lock_z_motor(false); else Lock_z2_motor(false);
1522
         In_Homing_Process(false);
1538
         In_Homing_Process(false);
1539
+      } // Z_AXIS
1540
+    #endif
1541
+
1542
+    #ifdef DELTA
1543
+      // retrace by the amount specified in endstop_adj
1544
+      if (endstop_adj[axis] * axis_home_dir < 0) {
1545
+        sync_plan_position();
1546
+        destination[axis] = endstop_adj[axis];
1547
+        line_to_destination();
1548
+        st_synchronize();
1523
       }
1549
       }
1524
     #endif
1550
     #endif
1525
 
1551
 
1526
-#ifdef DELTA
1527
-    // retrace by the amount specified in endstop_adj
1528
-    if (endstop_adj[axis] * axis_home_dir < 0) {
1529
-      sync_plan_position();
1530
-      destination[axis] = endstop_adj[axis];
1531
-      line_to_destination();
1532
-      st_synchronize();
1533
-    }
1534
-#endif
1552
+    // Set the axis position to its home position (plus home offsets)
1535
     axis_is_at_home(axis);
1553
     axis_is_at_home(axis);
1554
+
1536
     destination[axis] = current_position[axis];
1555
     destination[axis] = current_position[axis];
1537
     feedrate = 0.0;
1556
     feedrate = 0.0;
1538
-    endstops_hit_on_purpose();
1557
+    endstops_hit_on_purpose(); // clear endstop hit flags
1539
     axis_known_position[axis] = true;
1558
     axis_known_position[axis] = true;
1540
 
1559
 
1541
     // Retract Servo endstop if enabled
1560
     // Retract Servo endstop if enabled
1542
     #ifdef SERVO_ENDSTOPS
1561
     #ifdef SERVO_ENDSTOPS
1543
-      if (servo_endstops[axis] > -1) {
1562
+      if (servo_endstops[axis] > -1)
1544
         servos[servo_endstops[axis]].write(servo_endstop_angles[axis * 2 + 1]);
1563
         servos[servo_endstops[axis]].write(servo_endstop_angles[axis * 2 + 1]);
1545
-      }
1546
     #endif
1564
     #endif
1547
-#if SERVO_LEVELING
1548
-  #ifndef Z_PROBE_SLED
1549
-    if (axis==Z_AXIS) retract_z_probe();
1550
-  #endif
1551
-#endif
1565
+
1566
+    #if SERVO_LEVELING && !defined(Z_PROBE_SLED)
1567
+      if (axis == Z_AXIS) retract_z_probe();
1568
+    #endif
1552
 
1569
 
1553
   }
1570
   }
1554
 }
1571
 }
1555
-#define HOMEAXIS(LETTER) homeaxis(LETTER##_AXIS)
1556
 
1572
 
1557
-void refresh_cmd_timeout(void)
1558
-{
1559
-  previous_millis_cmd = millis();
1560
-}
1573
+void refresh_cmd_timeout(void) { previous_millis_cmd = millis(); }
1561
 
1574
 
1562
 #ifdef FWRETRACT
1575
 #ifdef FWRETRACT
1576
+
1563
   void retract(bool retracting, bool swapretract = false) {
1577
   void retract(bool retracting, bool swapretract = false) {
1564
-    if(retracting && !retracted[active_extruder]) {
1565
-      destination[X_AXIS]=current_position[X_AXIS];
1566
-      destination[Y_AXIS]=current_position[Y_AXIS];
1567
-      destination[Z_AXIS]=current_position[Z_AXIS];
1568
-      destination[E_AXIS]=current_position[E_AXIS];
1569
-      if (swapretract) {
1570
-        current_position[E_AXIS]+=retract_length_swap/volumetric_multiplier[active_extruder];
1571
-      } else {
1572
-        current_position[E_AXIS]+=retract_length/volumetric_multiplier[active_extruder];
1573
-      }
1574
-      plan_set_e_position(current_position[E_AXIS]);
1575
-      float oldFeedrate = feedrate;
1578
+
1579
+    if (retracting == retracted[active_extruder]) return;
1580
+
1581
+    float oldFeedrate = feedrate;
1582
+
1583
+    for (int i = 0; i < NUM_AXIS; i++) destination[i] = current_position[i];
1584
+
1585
+    if (retracting) {
1586
+
1576
       feedrate = retract_feedrate * 60;
1587
       feedrate = retract_feedrate * 60;
1577
-      retracted[active_extruder]=true;
1588
+      current_position[E_AXIS] += (swapretract ? retract_length_swap : retract_length) / volumetric_multiplier[active_extruder];
1589
+      plan_set_e_position(current_position[E_AXIS]);
1578
       prepare_move();
1590
       prepare_move();
1579
-      if(retract_zlift > 0.01) {
1580
-         current_position[Z_AXIS]-=retract_zlift;
1581
-#ifdef DELTA
1582
-         calculate_delta(current_position); // change cartesian kinematic to  delta kinematic;
1583
-         plan_set_position(delta[X_AXIS], delta[Y_AXIS], delta[Z_AXIS], current_position[E_AXIS]);
1584
-#else
1585
-         sync_plan_position();
1586
-#endif
1587
-         prepare_move();
1588
-      }
1589
-      feedrate = oldFeedrate;
1590
-    } else if(!retracting && retracted[active_extruder]) {
1591
-      destination[X_AXIS]=current_position[X_AXIS];
1592
-      destination[Y_AXIS]=current_position[Y_AXIS];
1593
-      destination[Z_AXIS]=current_position[Z_AXIS];
1594
-      destination[E_AXIS]=current_position[E_AXIS];
1595
-      if(retract_zlift > 0.01) {
1596
-         current_position[Z_AXIS]+=retract_zlift;
1597
-#ifdef DELTA
1598
-         calculate_delta(current_position); // change cartesian kinematic  to  delta kinematic;
1599
-         plan_set_position(delta[X_AXIS], delta[Y_AXIS], delta[Z_AXIS], current_position[E_AXIS]);
1600
-#else
1601
-         sync_plan_position();
1602
-#endif
1603
-         //prepare_move();
1591
+
1592
+      if (retract_zlift > 0.01) {
1593
+        current_position[Z_AXIS] -= retract_zlift;
1594
+        #ifdef DELTA
1595
+          sync_plan_position_delta();
1596
+        #else
1597
+          sync_plan_position();
1598
+        #endif
1599
+        prepare_move();
1604
       }
1600
       }
1605
-      if (swapretract) {
1606
-        current_position[E_AXIS]-=(retract_length_swap+retract_recover_length_swap)/volumetric_multiplier[active_extruder]; 
1607
-      } else {
1608
-        current_position[E_AXIS]-=(retract_length+retract_recover_length)/volumetric_multiplier[active_extruder]; 
1601
+    }
1602
+    else {
1603
+
1604
+      if (retract_zlift > 0.01) {
1605
+        current_position[Z_AXIS] + =retract_zlift;
1606
+        #ifdef DELTA
1607
+          sync_plan_position_delta();
1608
+        #else
1609
+          sync_plan_position();
1610
+        #endif
1611
+        //prepare_move();
1609
       }
1612
       }
1610
-      plan_set_e_position(current_position[E_AXIS]);
1611
-      float oldFeedrate = feedrate;
1613
+
1612
       feedrate = retract_recover_feedrate * 60;
1614
       feedrate = retract_recover_feedrate * 60;
1613
-      retracted[active_extruder] = false;
1615
+      float move_e = swapretract ? retract_length_swap + retract_recover_length_swap : retract_length + retract_recover_length;
1616
+      current_position[E_AXIS] -= move_e / volumetric_multiplier[active_extruder];
1617
+      plan_set_e_position(current_position[E_AXIS]);
1614
       prepare_move();
1618
       prepare_move();
1615
-      feedrate = oldFeedrate;
1616
     }
1619
     }
1617
-  } //retract
1618
-#endif //FWRETRACT
1620
+
1621
+    feedrate = oldFeedrate;
1622
+    retracted[active_extruder] = retract;
1623
+
1624
+  } // retract()
1625
+
1626
+#endif // FWRETRACT
1619
 
1627
 
1620
 #ifdef Z_PROBE_SLED
1628
 #ifdef Z_PROBE_SLED
1621
 
1629
 
1623
     #define SLED_DOCKING_OFFSET 0
1631
     #define SLED_DOCKING_OFFSET 0
1624
   #endif
1632
   #endif
1625
 
1633
 
1626
-//
1627
-// Method to dock/undock a sled designed by Charles Bell.
1628
-//
1629
-// dock[in]     If true, move to MAX_X and engage the electromagnet
1630
-// offset[in]   The additional distance to move to adjust docking location
1631
-//
1632
-static void dock_sled(bool dock, int offset=0) {
1633
- int z_loc;
1634
- 
1635
- if (!((axis_known_position[X_AXIS]) && (axis_known_position[Y_AXIS]))) {
1636
-   LCD_MESSAGEPGM(MSG_POSITION_UNKNOWN);
1637
-   SERIAL_ECHO_START;
1638
-   SERIAL_ECHOLNPGM(MSG_POSITION_UNKNOWN);
1639
-   return;
1640
- }
1641
-
1642
- if (dock) {
1643
-   do_blocking_move_to(X_MAX_POS + SLED_DOCKING_OFFSET + offset,
1644
-                       current_position[Y_AXIS],
1645
-                       current_position[Z_AXIS]);
1646
-   // turn off magnet
1647
-   digitalWrite(SERVO0_PIN, LOW);
1648
- } else {
1649
-   if (current_position[Z_AXIS] < (Z_RAISE_BEFORE_PROBING + 5))
1650
-     z_loc = Z_RAISE_BEFORE_PROBING;
1651
-   else
1652
-     z_loc = current_position[Z_AXIS];
1653
-   do_blocking_move_to(X_MAX_POS + SLED_DOCKING_OFFSET + offset,
1654
-                       Y_PROBE_OFFSET_FROM_EXTRUDER, z_loc);
1655
-   // turn on magnet
1656
-   digitalWrite(SERVO0_PIN, HIGH);
1657
- }
1658
-}
1659
-#endif
1634
+  //
1635
+  // Method to dock/undock a sled designed by Charles Bell.
1636
+  //
1637
+  // dock[in]     If true, move to MAX_X and engage the electromagnet
1638
+  // offset[in]   The additional distance to move to adjust docking location
1639
+  //
1640
+  static void dock_sled(bool dock, int offset=0) {
1641
+    if (!axis_known_position[X_AXIS] || !axis_known_position[Y_AXIS]) {
1642
+      LCD_MESSAGEPGM(MSG_POSITION_UNKNOWN);
1643
+      SERIAL_ECHO_START;
1644
+      SERIAL_ECHOLNPGM(MSG_POSITION_UNKNOWN);
1645
+      return;
1646
+    }
1647
+
1648
+    if (dock) {
1649
+      do_blocking_move_to(X_MAX_POS + SLED_DOCKING_OFFSET + offset, current_position[Y_AXIS], current_position[Z_AXIS]);
1650
+      digitalWrite(SERVO0_PIN, LOW); // turn off magnet
1651
+    } else {
1652
+      float z_loc = current_position[Z_AXIS];
1653
+      if (z_loc < Z_RAISE_BEFORE_PROBING + 5) z_loc = Z_RAISE_BEFORE_PROBING;
1654
+      do_blocking_move_to(X_MAX_POS + SLED_DOCKING_OFFSET + offset, Y_PROBE_OFFSET_FROM_EXTRUDER, z_loc);
1655
+      digitalWrite(SERVO0_PIN, HIGH); // turn on magnet
1656
+    }
1657
+  }
1658
+
1659
+#endif // Z_PROBE_SLED
1660
 
1660
 
1661
 /**
1661
 /**
1662
  *
1662
  *
1798
     feedrate = 1.732 * homing_feedrate[X_AXIS];
1798
     feedrate = 1.732 * homing_feedrate[X_AXIS];
1799
     line_to_destination();
1799
     line_to_destination();
1800
     st_synchronize();
1800
     st_synchronize();
1801
-    endstops_hit_on_purpose();
1801
+    endstops_hit_on_purpose(); // clear endstop hit flags
1802
 
1802
 
1803
     // Destination reached
1803
     // Destination reached
1804
     for (int i = X_AXIS; i <= Z_AXIS; i++) current_position[i] = destination[i];
1804
     for (int i = X_AXIS; i <= Z_AXIS; i++) current_position[i] = destination[i];
1808
     HOMEAXIS(Y);
1808
     HOMEAXIS(Y);
1809
     HOMEAXIS(Z);
1809
     HOMEAXIS(Z);
1810
 
1810
 
1811
-    calculate_delta(current_position);
1812
-    plan_set_position(delta[X_AXIS], delta[Y_AXIS], delta[Z_AXIS], current_position[E_AXIS]);
1811
+    sync_plan_position_delta();
1813
 
1812
 
1814
   #else // NOT DELTA
1813
   #else // NOT DELTA
1815
 
1814
 
1817
           homeY = code_seen(axis_codes[Y_AXIS]),
1816
           homeY = code_seen(axis_codes[Y_AXIS]),
1818
           homeZ = code_seen(axis_codes[Z_AXIS]);
1817
           homeZ = code_seen(axis_codes[Z_AXIS]);
1819
 
1818
 
1820
-    home_all_axis = !homeX && !homeY && !homeZ; // No parameters means home all axes
1819
+    home_all_axis = !(homeX || homeY || homeZ) || (homeX && homeY && homeZ);
1821
 
1820
 
1822
     #if Z_HOME_DIR > 0                      // If homing away from BED do Z first
1821
     #if Z_HOME_DIR > 0                      // If homing away from BED do Z first
1823
 
1822
 
1836
     #endif
1835
     #endif
1837
 
1836
 
1838
     #ifdef QUICK_HOME
1837
     #ifdef QUICK_HOME
1839
-      if (home_all_axis || (homeX && homeY)) {  //first diagonal move
1838
+
1839
+      if (home_all_axis || (homeX && homeY)) {  // First diagonal move
1840
+
1840
         current_position[X_AXIS] = current_position[Y_AXIS] = 0;
1841
         current_position[X_AXIS] = current_position[Y_AXIS] = 0;
1841
 
1842
 
1842
         #ifdef DUAL_X_CARRIAGE
1843
         #ifdef DUAL_X_CARRIAGE
1847
         #endif
1848
         #endif
1848
 
1849
 
1849
         sync_plan_position();
1850
         sync_plan_position();
1850
-        destination[X_AXIS] = 1.5 * max_length(X_AXIS) * x_axis_home_dir;
1851
-        destination[Y_AXIS] = 1.5 * max_length(Y_AXIS) * home_dir(Y_AXIS);
1852
-        feedrate = homing_feedrate[X_AXIS];
1853
-        if (homing_feedrate[Y_AXIS] < feedrate) feedrate = homing_feedrate[Y_AXIS];
1854
-        if (max_length(X_AXIS) > max_length(Y_AXIS)) {
1855
-          feedrate *= sqrt(pow(max_length(Y_AXIS) / max_length(X_AXIS), 2) + 1);
1856
-        } else {
1857
-          feedrate *= sqrt(pow(max_length(X_AXIS) / max_length(Y_AXIS), 2) + 1);
1858
-        }
1851
+
1852
+        float mlx = max_length(X_AXIS), mly = max_length(Y_AXIS),
1853
+              mlratio = mlx>mly ? mly/mlx : mlx/mly;
1854
+
1855
+        destination[X_AXIS] = 1.5 * mlx * x_axis_home_dir;
1856
+        destination[Y_AXIS] = 1.5 * mly * home_dir(Y_AXIS);
1857
+        feedrate = min(homing_feedrate[X_AXIS], homing_feedrate[Y_AXIS]) * sqrt(mlratio * mlratio + 1);
1859
         line_to_destination();
1858
         line_to_destination();
1860
         st_synchronize();
1859
         st_synchronize();
1861
 
1860
 
1862
         axis_is_at_home(X_AXIS);
1861
         axis_is_at_home(X_AXIS);
1863
         axis_is_at_home(Y_AXIS);
1862
         axis_is_at_home(Y_AXIS);
1864
         sync_plan_position();
1863
         sync_plan_position();
1864
+
1865
         destination[X_AXIS] = current_position[X_AXIS];
1865
         destination[X_AXIS] = current_position[X_AXIS];
1866
         destination[Y_AXIS] = current_position[Y_AXIS];
1866
         destination[Y_AXIS] = current_position[Y_AXIS];
1867
         line_to_destination();
1867
         line_to_destination();
1868
         feedrate = 0.0;
1868
         feedrate = 0.0;
1869
         st_synchronize();
1869
         st_synchronize();
1870
-        endstops_hit_on_purpose();
1870
+        endstops_hit_on_purpose(); // clear endstop hit flags
1871
 
1871
 
1872
         current_position[X_AXIS] = destination[X_AXIS];
1872
         current_position[X_AXIS] = destination[X_AXIS];
1873
         current_position[Y_AXIS] = destination[Y_AXIS];
1873
         current_position[Y_AXIS] = destination[Y_AXIS];
1875
           current_position[Z_AXIS] = destination[Z_AXIS];
1875
           current_position[Z_AXIS] = destination[Z_AXIS];
1876
         #endif
1876
         #endif
1877
       }
1877
       }
1878
-    #endif //QUICK_HOME
1878
+
1879
+    #endif // QUICK_HOME
1879
 
1880
 
1880
     // Home X
1881
     // Home X
1881
     if (home_all_axis || homeX) {
1882
     if (home_all_axis || homeX) {
1957
                 && cpy >= Y_MIN_POS - Y_PROBE_OFFSET_FROM_EXTRUDER
1958
                 && cpy >= Y_MIN_POS - Y_PROBE_OFFSET_FROM_EXTRUDER
1958
                 && cpy <= Y_MAX_POS - Y_PROBE_OFFSET_FROM_EXTRUDER) {
1959
                 && cpy <= Y_MAX_POS - Y_PROBE_OFFSET_FROM_EXTRUDER) {
1959
               current_position[Z_AXIS] = 0;
1960
               current_position[Z_AXIS] = 0;
1960
-              plan_set_position(cpx, cpy, current_position[Z_AXIS], current_position[E_AXIS]);
1961
+              plan_set_position(cpx, cpy, 0, current_position[E_AXIS]);
1961
               destination[Z_AXIS] = -Z_RAISE_BEFORE_HOMING * home_dir(Z_AXIS);    // Set destination away from bed
1962
               destination[Z_AXIS] = -Z_RAISE_BEFORE_HOMING * home_dir(Z_AXIS);    // Set destination away from bed
1962
               feedrate = max_feedrate[Z_AXIS];
1963
               feedrate = max_feedrate[Z_AXIS];
1963
               line_to_destination();
1964
               line_to_destination();
1996
   #endif // else DELTA
1997
   #endif // else DELTA
1997
 
1998
 
1998
   #ifdef SCARA
1999
   #ifdef SCARA
1999
-    calculate_delta(current_position);
2000
-    plan_set_position(delta[X_AXIS], delta[Y_AXIS], delta[Z_AXIS], current_position[E_AXIS]);
2000
+    sync_plan_position_delta();
2001
   #endif
2001
   #endif
2002
 
2002
 
2003
   #ifdef ENDSTOPS_ONLY_FOR_HOMING
2003
   #ifdef ENDSTOPS_ONLY_FOR_HOMING
2024
   feedrate = saved_feedrate;
2024
   feedrate = saved_feedrate;
2025
   feedmultiply = saved_feedmultiply;
2025
   feedmultiply = saved_feedmultiply;
2026
   previous_millis_cmd = millis();
2026
   previous_millis_cmd = millis();
2027
-  endstops_hit_on_purpose();
2027
+  endstops_hit_on_purpose(); // clear endstop hit flags
2028
 }
2028
 }
2029
 
2029
 
2030
 #if defined(MESH_BED_LEVELING) || defined(ENABLE_AUTO_BED_LEVELING)
2030
 #if defined(MESH_BED_LEVELING) || defined(ENABLE_AUTO_BED_LEVELING)
2196
         bool do_topography_map = verbose_level > 2 || code_seen('T') || code_seen('t');
2196
         bool do_topography_map = verbose_level > 2 || code_seen('T') || code_seen('t');
2197
       #endif
2197
       #endif
2198
 
2198
 
2199
-      if (verbose_level > 0)
2200
-      {
2199
+      if (verbose_level > 0) {
2201
         SERIAL_PROTOCOLPGM("G29 Auto Bed Leveling\n");
2200
         SERIAL_PROTOCOLPGM("G29 Auto Bed Leveling\n");
2202
         if (dryrun) SERIAL_ECHOLN("Running in DRY-RUN mode");
2201
         if (dryrun) SERIAL_ECHOLN("Running in DRY-RUN mode");
2203
       }
2202
       }
2272
         current_position[Y_AXIS] = uncorrected_position.y;
2271
         current_position[Y_AXIS] = uncorrected_position.y;
2273
         current_position[Z_AXIS] = uncorrected_position.z;
2272
         current_position[Z_AXIS] = uncorrected_position.z;
2274
         sync_plan_position();
2273
         sync_plan_position();
2275
-
2276
       #endif // !DELTA
2274
       #endif // !DELTA
2277
     }
2275
     }
2278
-    
2276
+
2279
     setup_for_endstop_move();
2277
     setup_for_endstop_move();
2280
 
2278
 
2281
     feedrate = homing_feedrate[Z_AXIS];
2279
     feedrate = homing_feedrate[Z_AXIS];
2283
     #ifdef AUTO_BED_LEVELING_GRID
2281
     #ifdef AUTO_BED_LEVELING_GRID
2284
 
2282
 
2285
       // probe at the points of a lattice grid
2283
       // probe at the points of a lattice grid
2286
-      const int xGridSpacing = (right_probe_bed_position - left_probe_bed_position) / (auto_bed_leveling_grid_points-1);
2287
-      const int yGridSpacing = (back_probe_bed_position - front_probe_bed_position) / (auto_bed_leveling_grid_points-1);
2284
+      const int xGridSpacing = (right_probe_bed_position - left_probe_bed_position) / (auto_bed_leveling_grid_points - 1),
2285
+                yGridSpacing = (back_probe_bed_position - front_probe_bed_position) / (auto_bed_leveling_grid_points - 1);
2288
 
2286
 
2289
       #ifdef DELTA
2287
       #ifdef DELTA
2290
         delta_grid_spacing[0] = xGridSpacing;
2288
         delta_grid_spacing[0] = xGridSpacing;
2842
   inline void gcode_M48() {
2840
   inline void gcode_M48() {
2843
 
2841
 
2844
     double sum = 0.0, mean = 0.0, sigma = 0.0, sample_set[50];
2842
     double sum = 0.0, mean = 0.0, sigma = 0.0, sample_set[50];
2845
-    int verbose_level = 1, n = 0, j, n_samples = 10, n_legs = 0, engage_probe_for_each_reading = 0;
2846
-    double X_current, Y_current, Z_current;
2847
-    double X_probe_location, Y_probe_location, Z_start_location, ext_position;
2843
+    int verbose_level = 1, n_samples = 10, n_legs = 0;
2848
     
2844
     
2849
     if (code_seen('V') || code_seen('v')) {
2845
     if (code_seen('V') || code_seen('v')) {
2850
       verbose_level = code_value();
2846
       verbose_level = code_value();
2865
       }
2861
       }
2866
     }
2862
     }
2867
 
2863
 
2868
-    X_current = X_probe_location = st_get_position_mm(X_AXIS);
2869
-    Y_current = Y_probe_location = st_get_position_mm(Y_AXIS);
2870
-    Z_current = st_get_position_mm(Z_AXIS);
2871
-    Z_start_location = st_get_position_mm(Z_AXIS) + Z_RAISE_BEFORE_PROBING;
2872
-    ext_position = st_get_position_mm(E_AXIS);
2864
+    double X_probe_location, Y_probe_location,
2865
+           X_current = X_probe_location = st_get_position_mm(X_AXIS),
2866
+           Y_current = Y_probe_location = st_get_position_mm(Y_AXIS),
2867
+           Z_current = st_get_position_mm(Z_AXIS),
2868
+           Z_start_location = Z_current + Z_RAISE_BEFORE_PROBING,
2869
+           ext_position = st_get_position_mm(E_AXIS);
2873
 
2870
 
2874
-    if (code_seen('E') || code_seen('e'))
2875
-      engage_probe_for_each_reading++;
2871
+    bool engage_probe_for_each_reading = code_seen('E') || code_seen('e');
2876
 
2872
 
2877
     if (code_seen('X') || code_seen('x')) {
2873
     if (code_seen('X') || code_seen('x')) {
2878
       X_probe_location = code_value() - X_PROBE_OFFSET_FROM_EXTRUDER;
2874
       X_probe_location = code_value() - X_PROBE_OFFSET_FROM_EXTRUDER;
2952
 
2948
 
2953
     if (engage_probe_for_each_reading) retract_z_probe();
2949
     if (engage_probe_for_each_reading) retract_z_probe();
2954
 
2950
 
2955
-    for (n=0; n < n_samples; n++) {
2951
+    for (uint16_t n=0; n < n_samples; n++) {
2956
 
2952
 
2957
-      do_blocking_move_to( X_probe_location, Y_probe_location, Z_start_location); // Make sure we are at the probe location
2953
+      do_blocking_move_to(X_probe_location, Y_probe_location, Z_start_location); // Make sure we are at the probe location
2958
 
2954
 
2959
       if (n_legs) {
2955
       if (n_legs) {
2960
-        double radius=0.0, theta=0.0;
2961
-        int l;
2962
-        int rotational_direction = (unsigned long) millis() & 0x0001;     // clockwise or counter clockwise
2963
-        radius = (unsigned long)millis() % (long)(X_MAX_LENGTH / 4);      // limit how far out to go
2964
-        theta = (float)((unsigned long)millis() % 360L) / (360. / (2 * 3.1415926)); // turn into radians
2956
+        unsigned long ms = millis();
2957
+        double radius = ms % (X_MAX_LENGTH / 4),       // limit how far out to go
2958
+               theta = RADIANS(ms % 360L);
2959
+        float dir = (ms & 0x0001) ? 1 : -1;            // clockwise or counter clockwise
2965
 
2960
 
2966
         //SERIAL_ECHOPAIR("starting radius: ",radius);
2961
         //SERIAL_ECHOPAIR("starting radius: ",radius);
2967
         //SERIAL_ECHOPAIR("   theta: ",theta);
2962
         //SERIAL_ECHOPAIR("   theta: ",theta);
2968
-        //SERIAL_ECHOPAIR("   direction: ",rotational_direction);
2963
+        //SERIAL_ECHOPAIR("   direction: ",dir);
2969
         //SERIAL_EOL;
2964
         //SERIAL_EOL;
2970
 
2965
 
2971
-        float dir = rotational_direction ? 1 : -1;
2972
-        for (l = 0; l < n_legs - 1; l++) {
2973
-          theta += dir * (float)((unsigned long)millis() % 20L) / (360.0/(2*3.1415926)); // turn into radians
2974
-
2975
-          radius += (float)(((long)((unsigned long) millis() % 10L)) - 5L);
2966
+        for (int l = 0; l < n_legs - 1; l++) {
2967
+          ms = millis();
2968
+          theta += RADIANS(dir * (ms % 20L));
2969
+          radius += (ms % 10L) - 5L;
2976
           if (radius < 0.0) radius = -radius;
2970
           if (radius < 0.0) radius = -radius;
2977
 
2971
 
2978
           X_current = X_probe_location + cos(theta) * radius;
2972
           X_current = X_probe_location + cos(theta) * radius;
2979
           Y_current = Y_probe_location + sin(theta) * radius;
2973
           Y_current = Y_probe_location + sin(theta) * radius;
2980
-
2981
-          // Make sure our X & Y are sane
2982
           X_current = constrain(X_current, X_MIN_POS, X_MAX_POS);
2974
           X_current = constrain(X_current, X_MIN_POS, X_MAX_POS);
2983
           Y_current = constrain(Y_current, Y_MIN_POS, Y_MAX_POS);
2975
           Y_current = constrain(Y_current, Y_MIN_POS, Y_MAX_POS);
2984
 
2976
 
2988
             SERIAL_EOL;
2980
             SERIAL_EOL;
2989
           }
2981
           }
2990
 
2982
 
2991
-          do_blocking_move_to( X_current, Y_current, Z_current );
2992
-        }
2993
-        do_blocking_move_to( X_probe_location, Y_probe_location, Z_start_location); // Go back to the probe location
2994
-      }
2983
+          do_blocking_move_to(X_current, Y_current, Z_current);
2984
+
2985
+        } // n_legs loop
2986
+
2987
+        do_blocking_move_to(X_probe_location, Y_probe_location, Z_start_location); // Go back to the probe location
2988
+
2989
+      } // n_legs
2995
 
2990
 
2996
       if (engage_probe_for_each_reading)  {
2991
       if (engage_probe_for_each_reading)  {
2997
         engage_z_probe(); 
2992
         engage_z_probe(); 
3007
       // Get the current mean for the data points we have so far
3002
       // Get the current mean for the data points we have so far
3008
       //
3003
       //
3009
       sum = 0.0;
3004
       sum = 0.0;
3010
-      for (j=0; j<=n; j++) sum += sample_set[j];
3011
-      mean = sum / (double (n+1));
3005
+      for (int j = 0; j <= n; j++) sum += sample_set[j];
3006
+      mean = sum / (n + 1);
3012
 
3007
 
3013
       //
3008
       //
3014
       // Now, use that mean to calculate the standard deviation for the
3009
       // Now, use that mean to calculate the standard deviation for the
3015
       // data points we have so far
3010
       // data points we have so far
3016
       //
3011
       //
3017
       sum = 0.0;
3012
       sum = 0.0;
3018
-      for (j=0; j<=n; j++) sum += (sample_set[j]-mean) * (sample_set[j]-mean);
3019
-      sigma = sqrt( sum / (double (n+1)) );
3013
+      for (int j = 0; j <= n; j++) {
3014
+        float ss = sample_set[j] - mean;
3015
+        sum += ss * ss;
3016
+      }
3017
+      sigma = sqrt(sum / (n + 1));
3020
 
3018
 
3021
       if (verbose_level > 1) {
3019
       if (verbose_level > 1) {
3022
         SERIAL_PROTOCOL(n+1);
3020
         SERIAL_PROTOCOL(n+1);
3023
-        SERIAL_PROTOCOL(" of ");
3021
+        SERIAL_PROTOCOLPGM(" of ");
3024
         SERIAL_PROTOCOL(n_samples);
3022
         SERIAL_PROTOCOL(n_samples);
3025
         SERIAL_PROTOCOLPGM("   z: ");
3023
         SERIAL_PROTOCOLPGM("   z: ");
3026
         SERIAL_PROTOCOL_F(current_position[Z_AXIS], 6);
3024
         SERIAL_PROTOCOL_F(current_position[Z_AXIS], 6);
3027
-      }
3028
-
3029
-      if (verbose_level > 2) {
3030
-        SERIAL_PROTOCOL(" mean: ");
3031
-        SERIAL_PROTOCOL_F(mean,6);
3032
-        SERIAL_PROTOCOL("   sigma: ");
3033
-        SERIAL_PROTOCOL_F(sigma,6);
3025
+        if (verbose_level > 2) {
3026
+          SERIAL_PROTOCOLPGM(" mean: ");
3027
+          SERIAL_PROTOCOL_F(mean,6);
3028
+          SERIAL_PROTOCOLPGM("   sigma: ");
3029
+          SERIAL_PROTOCOL_F(sigma,6);
3030
+        }
3034
       }
3031
       }
3035
 
3032
 
3036
       if (verbose_level > 0) SERIAL_EOL;
3033
       if (verbose_level > 0) SERIAL_EOL;
3037
 
3034
 
3038
-      plan_buffer_line(X_probe_location, Y_probe_location, Z_start_location,
3039
-          current_position[E_AXIS], homing_feedrate[Z_AXIS]/60, active_extruder);
3035
+      plan_buffer_line(X_probe_location, Y_probe_location, Z_start_location, current_position[E_AXIS], homing_feedrate[Z_AXIS]/60, active_extruder);
3040
       st_synchronize();
3036
       st_synchronize();
3041
 
3037
 
3042
       if (engage_probe_for_each_reading) {
3038
       if (engage_probe_for_each_reading) {
3043
-        retract_z_probe();  
3039
+        retract_z_probe();
3044
         delay(1000);
3040
         delay(1000);
3045
       }
3041
       }
3046
     }
3042
     }
3047
 
3043
 
3048
-    retract_z_probe();
3049
-    delay(1000);
3044
+    if (!engage_probe_for_each_reading) {
3045
+      retract_z_probe();
3046
+      delay(1000);
3047
+    }
3050
 
3048
 
3051
     clean_up_after_endstop_move();
3049
     clean_up_after_endstop_move();
3052
 
3050
 
4688
           active_extruder = tmp_extruder;
4686
           active_extruder = tmp_extruder;
4689
         #endif // !DUAL_X_CARRIAGE
4687
         #endif // !DUAL_X_CARRIAGE
4690
         #ifdef DELTA
4688
         #ifdef DELTA
4691
-          calculate_delta(current_position); // change cartesian kinematic  to  delta kinematic;
4692
-          //sent position to plan_set_position();
4693
-          plan_set_position(delta[X_AXIS], delta[Y_AXIS], delta[Z_AXIS],current_position[E_AXIS]);
4689
+          sync_plan_position_delta();
4694
         #else
4690
         #else
4695
           sync_plan_position();
4691
           sync_plan_position();
4696
         #endif
4692
         #endif
5279
 }
5275
 }
5280
 
5276
 
5281
 #ifdef DELTA
5277
 #ifdef DELTA
5282
-void recalc_delta_settings(float radius, float diagonal_rod)
5283
-{
5284
-   delta_tower1_x= -SIN_60*radius; // front left tower
5285
-   delta_tower1_y= -COS_60*radius;     
5286
-   delta_tower2_x=  SIN_60*radius; // front right tower
5287
-   delta_tower2_y= -COS_60*radius;     
5288
-   delta_tower3_x= 0.0;                  // back middle tower
5289
-   delta_tower3_y= radius;
5290
-   delta_diagonal_rod_2= sq(diagonal_rod);
5291
-}
5292
 
5278
 
5293
-void calculate_delta(float cartesian[3])
5294
-{
5295
-  delta[X_AXIS] = sqrt(delta_diagonal_rod_2
5296
-                       - sq(delta_tower1_x-cartesian[X_AXIS])
5297
-                       - sq(delta_tower1_y-cartesian[Y_AXIS])
5298
-                       ) + cartesian[Z_AXIS];
5299
-  delta[Y_AXIS] = sqrt(delta_diagonal_rod_2
5300
-                       - sq(delta_tower2_x-cartesian[X_AXIS])
5301
-                       - sq(delta_tower2_y-cartesian[Y_AXIS])
5302
-                       ) + cartesian[Z_AXIS];
5303
-  delta[Z_AXIS] = sqrt(delta_diagonal_rod_2
5304
-                       - sq(delta_tower3_x-cartesian[X_AXIS])
5305
-                       - sq(delta_tower3_y-cartesian[Y_AXIS])
5306
-                       ) + cartesian[Z_AXIS];
5307
-  /*
5308
-  SERIAL_ECHOPGM("cartesian x="); SERIAL_ECHO(cartesian[X_AXIS]);
5309
-  SERIAL_ECHOPGM(" y="); SERIAL_ECHO(cartesian[Y_AXIS]);
5310
-  SERIAL_ECHOPGM(" z="); SERIAL_ECHOLN(cartesian[Z_AXIS]);
5279
+  void recalc_delta_settings(float radius, float diagonal_rod) {
5280
+    delta_tower1_x = -SIN_60 * radius;  // front left tower
5281
+    delta_tower1_y = -COS_60 * radius;
5282
+    delta_tower2_x =  SIN_60 * radius;  // front right tower
5283
+    delta_tower2_y = -COS_60 * radius;
5284
+    delta_tower3_x = 0.0;               // back middle tower
5285
+    delta_tower3_y = radius;
5286
+    delta_diagonal_rod_2 = sq(diagonal_rod);
5287
+  }
5311
 
5288
 
5312
-  SERIAL_ECHOPGM("delta x="); SERIAL_ECHO(delta[X_AXIS]);
5313
-  SERIAL_ECHOPGM(" y="); SERIAL_ECHO(delta[Y_AXIS]);
5314
-  SERIAL_ECHOPGM(" z="); SERIAL_ECHOLN(delta[Z_AXIS]);
5315
-  */
5316
-}
5289
+  void calculate_delta(float cartesian[3]) {
5290
+    delta[X_AXIS] = sqrt(delta_diagonal_rod_2
5291
+                         - sq(delta_tower1_x-cartesian[X_AXIS])
5292
+                         - sq(delta_tower1_y-cartesian[Y_AXIS])
5293
+                         ) + cartesian[Z_AXIS];
5294
+    delta[Y_AXIS] = sqrt(delta_diagonal_rod_2
5295
+                         - sq(delta_tower2_x-cartesian[X_AXIS])
5296
+                         - sq(delta_tower2_y-cartesian[Y_AXIS])
5297
+                         ) + cartesian[Z_AXIS];
5298
+    delta[Z_AXIS] = sqrt(delta_diagonal_rod_2
5299
+                         - sq(delta_tower3_x-cartesian[X_AXIS])
5300
+                         - sq(delta_tower3_y-cartesian[Y_AXIS])
5301
+                         ) + cartesian[Z_AXIS];
5302
+    /*
5303
+    SERIAL_ECHOPGM("cartesian x="); SERIAL_ECHO(cartesian[X_AXIS]);
5304
+    SERIAL_ECHOPGM(" y="); SERIAL_ECHO(cartesian[Y_AXIS]);
5305
+    SERIAL_ECHOPGM(" z="); SERIAL_ECHOLN(cartesian[Z_AXIS]);
5306
+
5307
+    SERIAL_ECHOPGM("delta x="); SERIAL_ECHO(delta[X_AXIS]);
5308
+    SERIAL_ECHOPGM(" y="); SERIAL_ECHO(delta[Y_AXIS]);
5309
+    SERIAL_ECHOPGM(" z="); SERIAL_ECHOLN(delta[Z_AXIS]);
5310
+    */
5311
+  }
5317
 
5312
 
5318
-#ifdef ENABLE_AUTO_BED_LEVELING
5319
-// Adjust print surface height by linear interpolation over the bed_level array.
5320
-int delta_grid_spacing[2] = { 0, 0 };
5321
-void adjust_delta(float cartesian[3])
5322
-{
5323
-  if (delta_grid_spacing[0] == 0 || delta_grid_spacing[1] == 0)
5324
-    return; // G29 not done
5325
-
5326
-  int half = (AUTO_BED_LEVELING_GRID_POINTS - 1) / 2;
5327
-  float grid_x = max(0.001-half, min(half-0.001, cartesian[X_AXIS] / delta_grid_spacing[0]));
5328
-  float grid_y = max(0.001-half, min(half-0.001, cartesian[Y_AXIS] / delta_grid_spacing[1]));
5329
-  int floor_x = floor(grid_x);
5330
-  int floor_y = floor(grid_y);
5331
-  float ratio_x = grid_x - floor_x;
5332
-  float ratio_y = grid_y - floor_y;
5333
-  float z1 = bed_level[floor_x+half][floor_y+half];
5334
-  float z2 = bed_level[floor_x+half][floor_y+half+1];
5335
-  float z3 = bed_level[floor_x+half+1][floor_y+half];
5336
-  float z4 = bed_level[floor_x+half+1][floor_y+half+1];
5337
-  float left = (1-ratio_y)*z1 + ratio_y*z2;
5338
-  float right = (1-ratio_y)*z3 + ratio_y*z4;
5339
-  float offset = (1-ratio_x)*left + ratio_x*right;
5340
-
5341
-  delta[X_AXIS] += offset;
5342
-  delta[Y_AXIS] += offset;
5343
-  delta[Z_AXIS] += offset;
5313
+  #ifdef ENABLE_AUTO_BED_LEVELING
5344
 
5314
 
5345
-  /*
5346
-  SERIAL_ECHOPGM("grid_x="); SERIAL_ECHO(grid_x);
5347
-  SERIAL_ECHOPGM(" grid_y="); SERIAL_ECHO(grid_y);
5348
-  SERIAL_ECHOPGM(" floor_x="); SERIAL_ECHO(floor_x);
5349
-  SERIAL_ECHOPGM(" floor_y="); SERIAL_ECHO(floor_y);
5350
-  SERIAL_ECHOPGM(" ratio_x="); SERIAL_ECHO(ratio_x);
5351
-  SERIAL_ECHOPGM(" ratio_y="); SERIAL_ECHO(ratio_y);
5352
-  SERIAL_ECHOPGM(" z1="); SERIAL_ECHO(z1);
5353
-  SERIAL_ECHOPGM(" z2="); SERIAL_ECHO(z2);
5354
-  SERIAL_ECHOPGM(" z3="); SERIAL_ECHO(z3);
5355
-  SERIAL_ECHOPGM(" z4="); SERIAL_ECHO(z4);
5356
-  SERIAL_ECHOPGM(" left="); SERIAL_ECHO(left);
5357
-  SERIAL_ECHOPGM(" right="); SERIAL_ECHO(right);
5358
-  SERIAL_ECHOPGM(" offset="); SERIAL_ECHOLN(offset);
5359
-  */
5360
-}
5361
-#endif //ENABLE_AUTO_BED_LEVELING
5315
+    // Adjust print surface height by linear interpolation over the bed_level array.
5316
+    int delta_grid_spacing[2] = { 0, 0 };
5317
+    void adjust_delta(float cartesian[3]) {
5318
+      if (delta_grid_spacing[0] == 0 || delta_grid_spacing[1] == 0) return; // G29 not done!
5319
+
5320
+      int half = (AUTO_BED_LEVELING_GRID_POINTS - 1) / 2;
5321
+      float h1 = 0.001 - half, h2 = half - 0.001,
5322
+            grid_x = max(h1, min(h2, cartesian[X_AXIS] / delta_grid_spacing[0])),
5323
+            grid_y = max(h1, min(h2, cartesian[Y_AXIS] / delta_grid_spacing[1]));
5324
+      int floor_x = floor(grid_x), floor_y = floor(grid_y);
5325
+      float ratio_x = grid_x - floor_x, ratio_y = grid_y - floor_y,
5326
+            z1 = bed_level[floor_x + half][floor_y + half],
5327
+            z2 = bed_level[floor_x + half][floor_y + half + 1],
5328
+            z3 = bed_level[floor_x + half + 1][floor_y + half],
5329
+            z4 = bed_level[floor_x + half + 1][floor_y + half + 1],
5330
+            left = (1 - ratio_y) * z1 + ratio_y * z2,
5331
+            right = (1 - ratio_y) * z3 + ratio_y * z4,
5332
+            offset = (1 - ratio_x) * left + ratio_x * right;
5333
+
5334
+      delta[X_AXIS] += offset;
5335
+      delta[Y_AXIS] += offset;
5336
+      delta[Z_AXIS] += offset;
5337
+
5338
+      /*
5339
+      SERIAL_ECHOPGM("grid_x="); SERIAL_ECHO(grid_x);
5340
+      SERIAL_ECHOPGM(" grid_y="); SERIAL_ECHO(grid_y);
5341
+      SERIAL_ECHOPGM(" floor_x="); SERIAL_ECHO(floor_x);
5342
+      SERIAL_ECHOPGM(" floor_y="); SERIAL_ECHO(floor_y);
5343
+      SERIAL_ECHOPGM(" ratio_x="); SERIAL_ECHO(ratio_x);
5344
+      SERIAL_ECHOPGM(" ratio_y="); SERIAL_ECHO(ratio_y);
5345
+      SERIAL_ECHOPGM(" z1="); SERIAL_ECHO(z1);
5346
+      SERIAL_ECHOPGM(" z2="); SERIAL_ECHO(z2);
5347
+      SERIAL_ECHOPGM(" z3="); SERIAL_ECHO(z3);
5348
+      SERIAL_ECHOPGM(" z4="); SERIAL_ECHO(z4);
5349
+      SERIAL_ECHOPGM(" left="); SERIAL_ECHO(left);
5350
+      SERIAL_ECHOPGM(" right="); SERIAL_ECHO(right);
5351
+      SERIAL_ECHOPGM(" offset="); SERIAL_ECHOLN(offset);
5352
+      */
5353
+    }
5354
+  #endif // ENABLE_AUTO_BED_LEVELING
5362
 
5355
 
5363
-void prepare_move_raw()
5364
-{
5365
-  previous_millis_cmd = millis();
5366
-  calculate_delta(destination);
5367
-  plan_buffer_line(delta[X_AXIS], delta[Y_AXIS], delta[Z_AXIS],
5368
-                   destination[E_AXIS], feedrate*feedmultiply/60/100.0,
5369
-                   active_extruder);
5370
-  for(int8_t i=0; i < NUM_AXIS; i++) {
5371
-    current_position[i] = destination[i];
5356
+  void prepare_move_raw() {
5357
+    previous_millis_cmd = millis();
5358
+    calculate_delta(destination);
5359
+    plan_buffer_line(delta[X_AXIS], delta[Y_AXIS], delta[Z_AXIS], destination[E_AXIS], (feedrate/60)*(feedmultiply/100.0), active_extruder);
5360
+    for (int i = 0; i < NUM_AXIS; i++) current_position[i] = destination[i];
5372
   }
5361
   }
5373
-}
5374
-#endif //DELTA
5362
+
5363
+#endif // DELTA
5375
 
5364
 
5376
 #if defined(MESH_BED_LEVELING)
5365
 #if defined(MESH_BED_LEVELING)
5377
-#if !defined(MIN)
5378
-#define MIN(_v1, _v2) (((_v1) < (_v2)) ? (_v1) : (_v2))
5379
-#endif  // ! MIN
5366
+
5367
+  #if !defined(MIN)
5368
+    #define MIN(_v1, _v2) (((_v1) < (_v2)) ? (_v1) : (_v2))
5369
+  #endif  // ! MIN
5370
+
5380
 // This function is used to split lines on mesh borders so each segment is only part of one mesh area
5371
 // This function is used to split lines on mesh borders so each segment is only part of one mesh area
5381
 void mesh_plan_buffer_line(float x, float y, float z, const float e, float feed_rate, const uint8_t &extruder, uint8_t x_splits=0xff, uint8_t y_splits=0xff)
5372
 void mesh_plan_buffer_line(float x, float y, float z, const float e, float feed_rate, const uint8_t &extruder, uint8_t x_splits=0xff, uint8_t y_splits=0xff)
5382
 {
5373
 {
5448
 }
5439
 }
5449
 #endif  // MESH_BED_LEVELING
5440
 #endif  // MESH_BED_LEVELING
5450
 
5441
 
5451
-void prepare_move()
5452
-{
5442
+void prepare_move() {
5453
   clamp_to_software_endstops(destination);
5443
   clamp_to_software_endstops(destination);
5454
   previous_millis_cmd = millis();
5444
   previous_millis_cmd = millis();
5455
   
5445
   
5563
   }
5553
   }
5564
 #endif //DUAL_X_CARRIAGE
5554
 #endif //DUAL_X_CARRIAGE
5565
 
5555
 
5566
-#if ! (defined DELTA || defined SCARA)
5556
+#if !defined(DELTA) && !defined(SCARA)
5567
   // Do not use feedmultiply for E or Z only moves
5557
   // Do not use feedmultiply for E or Z only moves
5568
   if( (current_position[X_AXIS] == destination [X_AXIS]) && (current_position[Y_AXIS] == destination [Y_AXIS])) {
5558
   if( (current_position[X_AXIS] == destination [X_AXIS]) && (current_position[Y_AXIS] == destination [Y_AXIS])) {
5569
     line_to_destination();
5559
     line_to_destination();

+ 70
- 1
Marlin/Sd2PinMap.h View File

312
   {&DDRC, &PINC, &PORTC, 4},  // C4 18
312
   {&DDRC, &PINC, &PORTC, 4},  // C4 18
313
   {&DDRC, &PINC, &PORTC, 5}   // C5 19
313
   {&DDRC, &PINC, &PORTC, 5}   // C5 19
314
 };
314
 };
315
+#elif defined(__AVR_ATmega1281__)
316
+// Waspmote
317
+ 
318
+// Two Wire (aka I2C) ports
319
+uint8_t const SDA_PIN = 41;
320
+uint8_t const SCL_PIN = 40;
321
+ 
322
+ 
323
+#undef MOSI_PIN
324
+#undef MISO_PIN
325
+// SPI port
326
+uint8_t const SS_PIN = 16;    // B0
327
+uint8_t const MOSI_PIN = 11;  // B2
328
+uint8_t const MISO_PIN = 12;  // B3
329
+uint8_t const SCK_PIN = 10;   // B1
330
+ 
331
+static const pin_map_t digitalPinMap[] = {
332
+    {&DDRE, &PINE, &PORTE, 0}, // E0 0
333
+    {&DDRE, &PINE, &PORTE, 1}, // E1 1
334
+    {&DDRE, &PINE, &PORTE, 3}, // E3 2
335
+    {&DDRE, &PINE, &PORTE, 4}, // E4 3
336
+    {&DDRC, &PINC, &PORTC, 4}, // C4 4
337
+    {&DDRC, &PINC, &PORTC, 5}, // C5 5
338
+    {&DDRC, &PINC, &PORTC, 6}, // C6 6
339
+    {&DDRC, &PINC, &PORTC, 7}, // C7 7
340
+    {&DDRA, &PINA, &PORTA, 2}, // A2 8
341
+    {&DDRA, &PINA, &PORTA, 3}, // A3 9
342
+    {&DDRA, &PINA, &PORTA, 4}, // A4 10
343
+    {&DDRD, &PIND, &PORTD, 5}, // D5 11
344
+    {&DDRD, &PIND, &PORTD, 6}, // D6 12
345
+    {&DDRC, &PINC, &PORTC, 1}, // C1 13
346
+    {&DDRF, &PINF, &PORTF, 1}, // F1 14
347
+    {&DDRF, &PINF, &PORTF, 2}, // F2 15
348
+    {&DDRF, &PINF, &PORTF, 3}, // F3 16
349
+    {&DDRF, &PINF, &PORTF, 4}, // F4 17
350
+    {&DDRF, &PINF, &PORTF, 5}, // F5 18
351
+    {&DDRF, &PINF, &PORTF, 6}, // F6 19
352
+    {&DDRF, &PINF, &PORTF, 7}, // F7 20
353
+    {&DDRF, &PINF, &PORTF, 0}, // F0 21
354
+    {&DDRA, &PINA, &PORTA, 1}, // A1 22
355
+    {&DDRD, &PIND, &PORTD, 7}, // D7 23
356
+    {&DDRE, &PINE, &PORTE, 5}, // E5 24
357
+    {&DDRA, &PINA, &PORTA, 6}, // A6 25
358
+    {&DDRE, &PINE, &PORTE, 2}, // E2 26
359
+    {&DDRA, &PINA, &PORTA, 5}, // A5 27
360
+    {&DDRC, &PINC, &PORTC, 0}, // C0 28
361
+    {&DDRB, &PINB, &PORTB, 0}, // B0 29
362
+    {&DDRB, &PINB, &PORTB, 1}, // B1 30
363
+    {&DDRB, &PINB, &PORTB, 2}, // B2 31
364
+    {&DDRB, &PINB, &PORTB, 3}, // B3 32
365
+    {&DDRB, &PINB, &PORTB, 4}, // B4 33
366
+    {&DDRB, &PINB, &PORTB, 5}, // B5 34
367
+    {&DDRA, &PINA, &PORTA, 0}, // A0 35
368
+    {&DDRB, &PINB, &PORTB, 6}, // B6 36
369
+    {&DDRB, &PINB, &PORTB, 7}, // B7 37
370
+    {&DDRE, &PINE, &PORTE, 6}, // E6 38
371
+    {&DDRE, &PINE, &PORTE, 7}, // E7 39
372
+    {&DDRD, &PIND, &PORTD, 0}, // D0 40
373
+    {&DDRD, &PIND, &PORTD, 1}, // D1 41
374
+    {&DDRC, &PINC, &PORTC, 3}, // C3 42
375
+    {&DDRD, &PIND, &PORTD, 2}, // D2 43
376
+    {&DDRD, &PIND, &PORTD, 3}, // D3 44
377
+    {&DDRA, &PINA, &PORTA, 7}, // A7 45
378
+    {&DDRC, &PINC, &PORTC, 2}, // C2 46
379
+    {&DDRD, &PIND, &PORTD, 4}, // D4 47
380
+    {&DDRG, &PING, &PORTG, 2}, // G2 48
381
+    {&DDRG, &PING, &PORTG, 1}, // G1 49
382
+    {&DDRG, &PING, &PORTG, 0}, // G0 50
383
+};
315
 #else  // defined(__AVR_ATmega1280__)
384
 #else  // defined(__AVR_ATmega1280__)
316
 #error unknown chip
385
 #error unknown chip
317
 #endif  // defined(__AVR_ATmega1280__)
386
 #endif  // defined(__AVR_ATmega1280__)
364
 #endif  // Sd2PinMap_h
433
 #endif  // Sd2PinMap_h
365
 
434
 
366
 
435
 
367
-#endif
436
+#endif

+ 2
- 1
Marlin/ultralcd.h View File

99
 #else //no LCD
99
 #else //no LCD
100
   FORCE_INLINE void lcd_update() {}
100
   FORCE_INLINE void lcd_update() {}
101
   FORCE_INLINE void lcd_init() {}
101
   FORCE_INLINE void lcd_init() {}
102
-  FORCE_INLINE void lcd_setstatus(const char* message) {}
102
+  FORCE_INLINE void lcd_setstatus(const char* message, const bool persist=false) {}
103
+  FORCE_INLINE void lcd_setstatuspgm(const char* message, const uint8_t level=0) {}
103
   FORCE_INLINE void lcd_buttons_update() {}
104
   FORCE_INLINE void lcd_buttons_update() {}
104
   FORCE_INLINE void lcd_reset_alert_level() {}
105
   FORCE_INLINE void lcd_reset_alert_level() {}
105
   FORCE_INLINE void lcd_buzz(long duration,uint16_t freq) {}
106
   FORCE_INLINE void lcd_buzz(long duration,uint16_t freq) {}

Loading…
Cancel
Save