Browse Source

Implement LCD_BED_LEVELING for PROBE_MANUALLY

Scott Lahteine 8 years ago
parent
commit
73e193da1d
3 changed files with 175 additions and 67 deletions
  1. 2
    2
      .travis.yml
  2. 1
    1
      Marlin/Marlin_main.cpp
  3. 172
    64
      Marlin/ultralcd.cpp

+ 2
- 2
.travis.yml View File

145
   - opt_enable MESH_BED_LEVELING MESH_G28_REST_ORIGIN LCD_BED_LEVELING ULTIMAKERCONTROLLER
145
   - opt_enable MESH_BED_LEVELING MESH_G28_REST_ORIGIN LCD_BED_LEVELING ULTIMAKERCONTROLLER
146
   - build_marlin
146
   - build_marlin
147
   #
147
   #
148
-  # Test PROBE_MANUALLY feature
148
+  # Test PROBE_MANUALLY feature, with LCD support
149
   #
149
   #
150
   - restore_configs
150
   - restore_configs
151
-  - opt_enable PROBE_MANUALLY AUTO_BED_LEVELING_BILINEAR
151
+  - opt_enable PROBE_MANUALLY AUTO_BED_LEVELING_BILINEAR LCD_BED_LEVELING ULTIMAKERCONTROLLER
152
   - build_marlin
152
   - build_marlin
153
   #
153
   #
154
   # Test EEPROM_SETTINGS, EEPROM_CHITCHAT, M100_FREE_MEMORY_WATCHER,
154
   # Test EEPROM_SETTINGS, EEPROM_CHITCHAT, M100_FREE_MEMORY_WATCHER,

+ 1
- 1
Marlin/Marlin_main.cpp View File

3503
 #endif // Z_SAFE_HOMING
3503
 #endif // Z_SAFE_HOMING
3504
 
3504
 
3505
 #if ENABLED(PROBE_MANUALLY)
3505
 #if ENABLED(PROBE_MANUALLY)
3506
-  static bool g29_in_progress = false;
3506
+  bool g29_in_progress = false;
3507
 #else
3507
 #else
3508
   constexpr bool g29_in_progress = false;
3508
   constexpr bool g29_in_progress = false;
3509
 #endif
3509
 #endif

+ 172
- 64
Marlin/ultralcd.cpp View File

457
    * Synchronize safely while holding the current screen
457
    * Synchronize safely while holding the current screen
458
    * This blocks all further screen or stripe updates once called
458
    * This blocks all further screen or stripe updates once called
459
    */
459
    */
460
+  extern uint8_t commands_in_queue;
461
+
460
   inline void lcd_synchronize() {
462
   inline void lcd_synchronize() {
461
     lcd_implementation_drawmenu_static(LCD_HEIGHT >= 4 ? 1 : 0, PSTR(MSG_MOVING));
463
     lcd_implementation_drawmenu_static(LCD_HEIGHT >= 4 ? 1 : 0, PSTR(MSG_MOVING));
462
     if (no_reentrance) return;
464
     if (no_reentrance) return;
463
     no_reentrance = true;
465
     no_reentrance = true;
464
     screenFunc_t old_screen = currentScreen;
466
     screenFunc_t old_screen = currentScreen;
465
     lcd_goto_screen(lcd_synchronize);
467
     lcd_goto_screen(lcd_synchronize);
466
-    stepper.synchronize();
468
+    while (commands_in_queue) {
469
+      idle();
470
+      stepper.synchronize();
471
+    }
467
     no_reentrance = false;
472
     no_reentrance = false;
468
     lcd_goto_screen(old_screen);
473
     lcd_goto_screen(old_screen);
469
   }
474
   }
982
     MENU_ITEM_EDIT(int3, MSG_SPEED, &feedrate_percentage, 10, 999);
987
     MENU_ITEM_EDIT(int3, MSG_SPEED, &feedrate_percentage, 10, 999);
983
 
988
 
984
     // Manual bed leveling, Bed Z:
989
     // Manual bed leveling, Bed Z:
985
-    #if ENABLED(LCD_BED_LEVELING)
990
+    #if ENABLED(MESH_BED_LEVELING) && ENABLED(LCD_BED_LEVELING)
986
       MENU_ITEM_EDIT(float43, MSG_BED_Z, &mbl.z_offset, -1, 1);
991
       MENU_ITEM_EDIT(float43, MSG_BED_Z, &mbl.z_offset, -1, 1);
987
     #endif
992
     #endif
988
 
993
 
1325
 
1330
 
1326
     /**
1331
     /**
1327
      *
1332
      *
1328
-     * "Prepare" > "Bed Leveling" handlers
1333
+     * "Prepare" > "Level Bed" handlers
1329
      *
1334
      *
1330
      */
1335
      */
1331
 
1336
 
1332
     static uint8_t manual_probe_index;
1337
     static uint8_t manual_probe_index;
1333
 
1338
 
1334
-    // Utility to go to the next mesh point
1335
-    inline void _manual_probe_xy(float x, float y) {
1336
-      if (no_reentrance) return;
1337
-      #if MANUAL_PROBE_HEIGHT > 0
1338
-        current_position[Z_AXIS] = LOGICAL_Z_POSITION(Z_MIN_POS) + MANUAL_PROBE_HEIGHT;
1339
-        line_to_current(Z_AXIS);
1340
-      #endif
1341
-      current_position[X_AXIS] = LOGICAL_X_POSITION(x);
1342
-      current_position[Y_AXIS] = LOGICAL_Y_POSITION(y);
1343
-      planner.buffer_line_kinematic(current_position, MMM_TO_MMS(XY_PROBE_SPEED), active_extruder);
1344
-      #if MANUAL_PROBE_HEIGHT > 0
1345
-        current_position[Z_AXIS] = LOGICAL_Z_POSITION(Z_MIN_POS) + 0.2;
1346
-        line_to_current(Z_AXIS);
1339
+    #if ENABLED(PROBE_MANUALLY)
1340
+      extern bool g29_in_progress;
1341
+    #endif
1342
+
1343
+    // LCD probed points are from defaults
1344
+    constexpr uint8_t total_probe_points =
1345
+      #if ABL_GRID
1346
+        (ABL_GRID_MAX_POINTS_X) * (ABL_GRID_MAX_POINTS_Y)
1347
+      #elif ENABLED(AUTO_BED_LEVELING_3POINT)
1348
+        int(3)
1349
+      #elif ENABLED(AUTO_BED_LEVELING_UBL)
1350
+        (UBL_MESH_NUM_X_POINTS) * (UBL_MESH_NUM_Y_POINTS)
1351
+      #elif ENABLED(MESH_BED_LEVELING)
1352
+        (MESH_NUM_X_POINTS) * (MESH_NUM_Y_POINTS)
1347
       #endif
1353
       #endif
1348
-      lcd_synchronize();
1349
-    }
1354
+    ;
1350
 
1355
 
1351
-    void _lcd_level_goto_next_point();
1356
+    #if ENABLED(MESH_BED_LEVELING)
1357
+
1358
+      // Utility to go to the next mesh point
1359
+      inline void _manual_probe_goto_xy(float x, float y) {
1360
+        if (no_reentrance) return;
1361
+        #if MANUAL_PROBE_HEIGHT > 0
1362
+          current_position[Z_AXIS] = LOGICAL_Z_POSITION(Z_MIN_POS) + MANUAL_PROBE_HEIGHT;
1363
+          line_to_current(Z_AXIS);
1364
+        #endif
1365
+        current_position[X_AXIS] = LOGICAL_X_POSITION(x);
1366
+        current_position[Y_AXIS] = LOGICAL_Y_POSITION(y);
1367
+        planner.buffer_line_kinematic(current_position, MMM_TO_MMS(XY_PROBE_SPEED), active_extruder);
1368
+        #if MANUAL_PROBE_HEIGHT > 0
1369
+          current_position[Z_AXIS] = LOGICAL_Z_POSITION(Z_MIN_POS) + 0.2;
1370
+          line_to_current(Z_AXIS);
1371
+        #endif
1372
+        lcd_synchronize();
1373
+      }
1374
+
1375
+    #endif // MESH_BED_LEVELING
1376
+
1377
+    #if ENABLED(MESH_BED_LEVELING) || ENABLED(PROBE_MANUALLY)
1378
+      void _lcd_level_goto_next_point();
1379
+    #endif
1352
 
1380
 
1353
     void _lcd_level_bed_done() {
1381
     void _lcd_level_bed_done() {
1354
       if (lcdDrawUpdate) lcd_implementation_drawedit(PSTR(MSG_LEVEL_BED_DONE));
1382
       if (lcdDrawUpdate) lcd_implementation_drawedit(PSTR(MSG_LEVEL_BED_DONE));
1356
     }
1384
     }
1357
 
1385
 
1358
     /**
1386
     /**
1359
-     * Step 7: Get the Z coordinate, then goto next point or exit
1387
+     * Step 6: Display "Next point: 1 / 9" while waiting for move to finish
1388
+     */
1389
+    void _lcd_level_bed_moving() {
1390
+      if (lcdDrawUpdate) {
1391
+        char msg[10];
1392
+        sprintf_P(msg, PSTR("%i / %u"), (int)(manual_probe_index + 1), total_probe_points);
1393
+        lcd_implementation_drawedit(PSTR(MSG_LEVEL_BED_NEXT_POINT), msg);
1394
+      }
1395
+      lcdDrawUpdate = LCDVIEW_KEEP_REDRAWING;
1396
+    }
1397
+
1398
+    /**
1399
+     * Step 7: Get the Z coordinate, click goes to the next point or exits
1360
      */
1400
      */
1361
     void _lcd_level_bed_get_z() {
1401
     void _lcd_level_bed_get_z() {
1362
       ENCODER_DIRECTION_NORMAL();
1402
       ENCODER_DIRECTION_NORMAL();
1368
         refresh_cmd_timeout();
1408
         refresh_cmd_timeout();
1369
         current_position[Z_AXIS] += float((int32_t)encoderPosition) * (MBL_Z_STEP);
1409
         current_position[Z_AXIS] += float((int32_t)encoderPosition) * (MBL_Z_STEP);
1370
         NOLESS(current_position[Z_AXIS], -(LCD_PROBE_Z_RANGE) * 0.5);
1410
         NOLESS(current_position[Z_AXIS], -(LCD_PROBE_Z_RANGE) * 0.5);
1371
-        NOMORE(current_position[Z_AXIS], (LCD_PROBE_Z_RANGE) * 0.5);
1411
+        NOMORE(current_position[Z_AXIS],  (LCD_PROBE_Z_RANGE) * 0.5);
1372
         line_to_current(Z_AXIS);
1412
         line_to_current(Z_AXIS);
1373
         lcdDrawUpdate = LCDVIEW_KEEP_REDRAWING;
1413
         lcdDrawUpdate = LCDVIEW_KEEP_REDRAWING;
1374
         encoderPosition = 0;
1414
         encoderPosition = 0;
1375
       }
1415
       }
1376
 
1416
 
1377
       if (lcd_clicked) {
1417
       if (lcd_clicked) {
1378
-        mbl.set_zigzag_z(manual_probe_index++, current_position[Z_AXIS]);
1379
-        if (manual_probe_index == (MESH_NUM_X_POINTS) * (MESH_NUM_Y_POINTS)) {
1418
+
1419
+        // Use a hook to set the probe point z
1420
+        // (zigzag arranges in XY order)
1421
+        #if ENABLED(AUTO_BED_LEVELING_UBL)
1422
+
1423
+          // UBL set-z handling goes here
1424
+
1425
+        #elif ENABLED(PROBE_MANUALLY)
1426
+
1427
+          // G29 helpfully records Z and goes to the next
1428
+          // point (or beeps if done)
1429
+          enqueue_and_echo_commands_P(PSTR("G29"));
1430
+          manual_probe_index++;
1431
+
1432
+        #elif ENABLED(MESH_BED_LEVELING)
1433
+
1434
+          mbl.set_zigzag_z(manual_probe_index++, current_position[Z_AXIS]);
1435
+
1436
+        #endif
1437
+
1438
+        // If done...
1439
+        if (manual_probe_index == total_probe_points) {
1440
+
1441
+          // Say "Done!"
1380
           lcd_goto_screen(_lcd_level_bed_done);
1442
           lcd_goto_screen(_lcd_level_bed_done);
1381
 
1443
 
1444
+          // Raise Z to the "manual probe height"
1382
           #if MANUAL_PROBE_HEIGHT > 0
1445
           #if MANUAL_PROBE_HEIGHT > 0
1383
             current_position[Z_AXIS] = LOGICAL_Z_POSITION(Z_MIN_POS) + MANUAL_PROBE_HEIGHT;
1446
             current_position[Z_AXIS] = LOGICAL_Z_POSITION(Z_MIN_POS) + MANUAL_PROBE_HEIGHT;
1384
             line_to_current(Z_AXIS);
1447
             line_to_current(Z_AXIS);
1385
             lcd_synchronize();
1448
             lcd_synchronize();
1386
           #endif
1449
           #endif
1387
 
1450
 
1388
-          mbl.set_has_mesh(true);
1389
-          mbl.set_reactivate(true);
1390
-          enqueue_and_echo_commands_P(PSTR("G28"));
1451
+          // Enable leveling, if needed
1452
+          #if ENABLED(MESH_BED_LEVELING)
1453
+
1454
+            mbl.set_has_mesh(true);
1455
+            mbl.set_reactivate(true);
1456
+            enqueue_and_echo_commands_P(PSTR("G28"));
1457
+
1458
+          #elif ENABLED(AUTO_BED_LEVELING_UBL)
1459
+
1460
+            // UBL enable goes here
1461
+
1462
+          #elif ENABLED(PROBE_MANUALLY)
1463
+
1464
+            // ABL will be enabled due to "G29".
1465
+
1466
+          #endif
1467
+
1391
           lcd_return_to_status();
1468
           lcd_return_to_status();
1392
           //LCD_MESSAGEPGM(MSG_LEVEL_BED_DONE);
1469
           //LCD_MESSAGEPGM(MSG_LEVEL_BED_DONE);
1393
           lcd_completion_feedback();
1470
           lcd_completion_feedback();
1394
         }
1471
         }
1395
         else {
1472
         else {
1396
-          lcd_goto_screen(_lcd_level_goto_next_point);
1473
+
1474
+          // Move to the next probe point, if needed
1475
+          #if ENABLED(MESH_BED_LEVELING) || ENABLED(PROBE_MANUALLY)
1476
+
1477
+            _lcd_level_goto_next_point();
1478
+
1479
+          #elif ENABLED(AUTO_BED_LEVELING_UBL)
1480
+
1481
+            // UBL goto-next-point goes here
1482
+
1483
+          #endif
1397
         }
1484
         }
1398
       }
1485
       }
1399
 
1486
 
1400
-KeepDrawing:
1487
+      KeepDrawing:
1488
+
1401
       // Update on first display, then only on updates to Z position
1489
       // Update on first display, then only on updates to Z position
1402
       // Show message above on clicks instead
1490
       // Show message above on clicks instead
1403
       if (lcdDrawUpdate) {
1491
       if (lcdDrawUpdate) {
1404
         const float v = current_position[Z_AXIS];
1492
         const float v = current_position[Z_AXIS];
1405
         lcd_implementation_drawedit(PSTR(MSG_MOVE_Z), ftostr43sign(v + (v < 0 ? -0.0001 : 0.0001), '+'));
1493
         lcd_implementation_drawedit(PSTR(MSG_MOVE_Z), ftostr43sign(v + (v < 0 ? -0.0001 : 0.0001), '+'));
1406
       }
1494
       }
1407
-
1408
     }
1495
     }
1409
 
1496
 
1410
-    /**
1411
-     * Step 6: Display "Next point: 1 / 9" while waiting for move to finish
1412
-     */
1413
-    void _lcd_level_bed_moving() {
1414
-      if (lcdDrawUpdate) {
1415
-        char msg[10];
1497
+    #if ENABLED(MESH_BED_LEVELING) || ENABLED(PROBE_MANUALLY)
1498
+
1499
+      /**
1500
+       * Step 5: Initiate a move to the next point
1501
+       */
1502
+      void _lcd_level_goto_next_point() {
1503
+
1504
+        // Set the menu to display ahead of blocking call
1505
+        lcd_goto_screen(_lcd_level_bed_moving);
1506
+
1416
         #if ENABLED(MESH_BED_LEVELING)
1507
         #if ENABLED(MESH_BED_LEVELING)
1417
-          sprintf_P(msg, PSTR("%i / %u"), (int)(manual_probe_index + 1), (MESH_NUM_X_POINTS) * (MESH_NUM_Y_POINTS));
1508
+
1509
+          int8_t px, py;
1510
+          mbl.zigzag(manual_probe_index, px, py);
1511
+
1512
+          // Controls the loop until the move is done
1513
+          _manual_probe_goto_xy(
1514
+            LOGICAL_X_POSITION(mbl.index_to_xpos[px]),
1515
+            LOGICAL_Y_POSITION(mbl.index_to_ypos[py])
1516
+          );
1517
+
1418
         #elif ENABLED(AUTO_BED_LEVELING_UBL)
1518
         #elif ENABLED(AUTO_BED_LEVELING_UBL)
1419
-          sprintf_P(msg, PSTR("%i / %u"), (int)(manual_probe_index + 1), (UBL_MESH_NUM_X_POINTS) * (UBL_MESH_NUM_Y_POINTS));
1420
-        #endif
1421
-        lcd_implementation_drawedit(PSTR(MSG_LEVEL_BED_NEXT_POINT), msg);
1422
-      }
1423
 
1519
 
1424
-      lcdDrawUpdate = LCDVIEW_KEEP_REDRAWING;
1425
-    }
1520
+          // UBL may have its own methodology
1426
 
1521
 
1427
-    /**
1428
-     * Step 5: Initiate a move to the next point
1429
-     */
1430
-    void _lcd_level_goto_next_point() {
1431
-      // Set the menu to display ahead of blocking call
1432
-      lcd_goto_screen(_lcd_level_bed_moving);
1522
+        #elif ENABLED(PROBE_MANUALLY)
1523
+
1524
+          // Just wait for the G29 move to complete
1525
+          lcd_synchronize();
1433
 
1526
 
1434
-      // _manual_probe_xy runs the menu loop until the move is done
1435
-      int8_t px, py;
1436
-      mbl.zigzag(manual_probe_index, px, py);
1437
-      _manual_probe_xy(mbl.index_to_xpos[px], mbl.index_to_ypos[py]);
1527
+        #endif
1438
 
1528
 
1439
-      // After the blocking function returns, change menus
1440
-      lcd_goto_screen(_lcd_level_bed_get_z);
1441
-    }
1529
+        // After the blocking function returns, change menus
1530
+        lcd_goto_screen(_lcd_level_bed_get_z);
1531
+      }
1532
+
1533
+    #endif // MESH_BED_LEVELING
1442
 
1534
 
1443
     /**
1535
     /**
1444
      * Step 4: Display "Click to Begin", wait for click
1536
      * Step 4: Display "Click to Begin", wait for click
1448
       if (lcdDrawUpdate) lcd_implementation_drawedit(PSTR(MSG_LEVEL_BED_WAITING));
1540
       if (lcdDrawUpdate) lcd_implementation_drawedit(PSTR(MSG_LEVEL_BED_WAITING));
1449
       if (lcd_clicked) {
1541
       if (lcd_clicked) {
1450
         manual_probe_index = 0;
1542
         manual_probe_index = 0;
1451
-        lcd_goto_screen(_lcd_level_goto_next_point);
1543
+        #if ENABLED(MESH_BED_LEVELING)
1544
+          _lcd_level_goto_next_point();
1545
+        #elif ENABLED(AUTO_BED_LEVELING_UBL)
1546
+          // UBL click handling should go here
1547
+        #elif ENABLED(PROBE_MANUALLY)
1548
+          enqueue_and_echo_commands_P(PSTR("G29"));
1549
+          _lcd_level_goto_next_point();
1550
+        #endif
1452
       }
1551
       }
1453
     }
1552
     }
1454
 
1553
 
1466
      * Step 2: Continue Bed Leveling...
1565
      * Step 2: Continue Bed Leveling...
1467
      */
1566
      */
1468
     void _lcd_level_bed_continue() {
1567
     void _lcd_level_bed_continue() {
1568
+      #if PLANNER_LEVELING && DISABLED(AUTO_BED_LEVELING_UBL)
1569
+        reset_bed_level();
1570
+      #endif
1469
       defer_return_to_status = true;
1571
       defer_return_to_status = true;
1470
       axis_homed[X_AXIS] = axis_homed[Y_AXIS] = axis_homed[Z_AXIS] = false;
1572
       axis_homed[X_AXIS] = axis_homed[Y_AXIS] = axis_homed[Z_AXIS] = false;
1471
-      mbl.reset();
1472
-      enqueue_and_echo_commands_P(PSTR("G28"));
1473
       lcd_goto_screen(_lcd_level_bed_homing);
1573
       lcd_goto_screen(_lcd_level_bed_homing);
1574
+      enqueue_and_echo_commands_P(PSTR("G28"));
1474
     }
1575
     }
1475
 
1576
 
1476
     /**
1577
     /**
1477
-     * Step 1: MBL entry-point: "Cancel" or "Level Bed"
1578
+     * Step 1: Bed Level entry-point: "Cancel" or "Level Bed"
1478
      */
1579
      */
1479
     void lcd_level_bed() {
1580
     void lcd_level_bed() {
1480
       START_MENU();
1581
       START_MENU();
1483
       END_MENU();
1584
       END_MENU();
1484
     }
1585
     }
1485
 
1586
 
1486
-  #endif  // LCD_BED_LEVELING
1587
+  #endif // LCD_BED_LEVELING
1487
 
1588
 
1488
   /**
1589
   /**
1489
    *
1590
    *
1520
     //
1621
     //
1521
     // Level Bed
1622
     // Level Bed
1522
     //
1623
     //
1523
-    #if HAS_ABL
1624
+    #if ENABLED(LCD_BED_LEVELING)
1625
+
1626
+      #if ENABLED(PROBE_MANUALLY)
1627
+        if (!g29_in_progress)
1628
+      #endif
1629
+          MENU_ITEM(submenu, MSG_LEVEL_BED, lcd_level_bed);
1630
+
1631
+    #elif HAS_ABL
1632
+
1524
       MENU_ITEM(gcode, MSG_LEVEL_BED,
1633
       MENU_ITEM(gcode, MSG_LEVEL_BED,
1525
         axis_homed[X_AXIS] && axis_homed[Y_AXIS] ? PSTR("G29") : PSTR("G28\nG29")
1634
         axis_homed[X_AXIS] && axis_homed[Y_AXIS] ? PSTR("G29") : PSTR("G28\nG29")
1526
       );
1635
       );
1527
-    #elif ENABLED(LCD_BED_LEVELING)
1528
-      MENU_ITEM(submenu, MSG_LEVEL_BED, lcd_level_bed);
1636
+
1529
     #endif
1637
     #endif
1530
 
1638
 
1531
     #if DISABLED(NO_WORKSPACE_OFFSETS)
1639
     #if DISABLED(NO_WORKSPACE_OFFSETS)
2253
       MENU_ITEM_EDIT(float32, MSG_ZPROBE_ZOFFSET, &zprobe_zoffset, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX);
2361
       MENU_ITEM_EDIT(float32, MSG_ZPROBE_ZOFFSET, &zprobe_zoffset, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX);
2254
     #endif
2362
     #endif
2255
     // Manual bed leveling, Bed Z:
2363
     // Manual bed leveling, Bed Z:
2256
-    #if ENABLED(LCD_BED_LEVELING)
2364
+    #if ENABLED(MESH_BED_LEVELING) && ENABLED(LCD_BED_LEVELING)
2257
       MENU_ITEM_EDIT(float43, MSG_BED_Z, &mbl.z_offset, -1, 1);
2365
       MENU_ITEM_EDIT(float43, MSG_BED_Z, &mbl.z_offset, -1, 1);
2258
     #endif
2366
     #endif
2259
     MENU_ITEM_EDIT(float5, MSG_ACC, &planner.acceleration, 10, 99000);
2367
     MENU_ITEM_EDIT(float5, MSG_ACC, &planner.acceleration, 10, 99000);

Loading…
Cancel
Save