Browse Source

Standardize LCD interface code for UBL a little

Scott Lahteine 7 years ago
parent
commit
c846388a65

+ 108
- 95
Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp View File

24
 
24
 
25
 #if ENABLED(AUTO_BED_LEVELING_UBL)
25
 #if ENABLED(AUTO_BED_LEVELING_UBL)
26
 
26
 
27
+  //#define UBL_DEVEL_DEBUGGING
28
+
27
   #include "ubl.h"
29
   #include "ubl.h"
28
 
30
 
29
   #include "../../../Marlin.h"
31
   #include "../../../Marlin.h"
728
           z_values[x][y] += g29_constant;
730
           z_values[x][y] += g29_constant;
729
   }
731
   }
730
 
732
 
731
-  #if HAS_BED_PROBE
733
+  #if ENABLED(NEWPANEL)
734
+
735
+    typedef void (*clickFunc_t)();
736
+
737
+    bool click_and_hold(const clickFunc_t func=NULL) {
738
+      if (is_lcd_clicked()) {
739
+        lcd_quick_feedback();
740
+        const millis_t nxt = millis() + 1500UL;
741
+        while (is_lcd_clicked()) {                // Loop while the encoder is pressed. Uses hardware flag!
742
+          idle();                                 // idle, of course
743
+          if (ELAPSED(millis(), nxt)) {           // After 1.5 seconds
744
+            lcd_quick_feedback();
745
+            if (func) (*func)();
746
+            wait_for_release();
747
+            safe_delay(50);                       // Debounce the Encoder wheel
748
+            return true;
749
+          }
750
+        }
751
+      }
752
+      return false;
753
+    }
732
 
754
 
755
+  #endif // NEWPANEL
756
+
757
+  #if HAS_BED_PROBE
733
     /**
758
     /**
734
      * Probe all invalidated locations of the mesh that can be reached by the probe.
759
      * Probe all invalidated locations of the mesh that can be reached by the probe.
735
      * This attempts to fill in locations closest to the nozzle's start location first.
760
      * This attempts to fill in locations closest to the nozzle's start location first.
754
             SERIAL_PROTOCOLLNPGM("\nMesh only partially populated.\n");
779
             SERIAL_PROTOCOLLNPGM("\nMesh only partially populated.\n");
755
             lcd_quick_feedback();
780
             lcd_quick_feedback();
756
             STOW_PROBE();
781
             STOW_PROBE();
757
-            while (is_lcd_clicked()) idle();
782
+            wait_for_release();
758
             lcd_external_control = false;
783
             lcd_external_control = false;
759
             restore_ubl_active_state_and_leave();
784
             restore_ubl_active_state_and_leave();
760
-            safe_delay(50);  // Debounce the Encoder wheel
761
             return;
785
             return;
762
           }
786
           }
763
         #endif
787
         #endif
894
 
918
 
895
   #if ENABLED(NEWPANEL)
919
   #if ENABLED(NEWPANEL)
896
 
920
 
897
-    float unified_bed_leveling::measure_point_with_encoder() {
898
-
899
-      while (is_lcd_clicked()) delay(50);  // wait for user to release encoder wheel
900
-      delay(50);  // debounce
901
-
902
-      KEEPALIVE_STATE(PAUSED_FOR_USER);
903
-      while (!is_lcd_clicked()) {     // we need the loop to move the nozzle based on the encoder wheel here!
921
+    void unified_bed_leveling::move_z_with_encoder(const float &multiplier) {
922
+      wait_for_release();
923
+      while (!is_lcd_clicked()) {
904
         idle();
924
         idle();
905
         if (encoder_diff) {
925
         if (encoder_diff) {
906
-          do_blocking_move_to_z(current_position[Z_AXIS] + 0.01 * float(encoder_diff));
926
+          do_blocking_move_to_z(current_position[Z_AXIS] + float(encoder_diff) * multiplier);
907
           encoder_diff = 0;
927
           encoder_diff = 0;
908
         }
928
         }
909
       }
929
       }
930
+    }
931
+
932
+    float unified_bed_leveling::measure_point_with_encoder() {
933
+      KEEPALIVE_STATE(PAUSED_FOR_USER);
934
+      move_z_with_encoder(0.01);
910
       KEEPALIVE_STATE(IN_HANDLER);
935
       KEEPALIVE_STATE(IN_HANDLER);
911
       return current_position[Z_AXIS];
936
       return current_position[Z_AXIS];
912
     }
937
     }
953
       return thickness;
978
       return thickness;
954
     }
979
     }
955
 
980
 
981
+    void abort_manual_probe_remaining_mesh() {
982
+      SERIAL_PROTOCOLLNPGM("\nMesh only partially populated.");
983
+      do_blocking_move_to_z(Z_CLEARANCE_DEPLOY_PROBE);
984
+      lcd_external_control = false;
985
+      KEEPALIVE_STATE(IN_HANDLER);
986
+      ubl.restore_ubl_active_state_and_leave();
987
+    }
988
+
956
     void unified_bed_leveling::manually_probe_remaining_mesh(const float &rx, const float &ry, const float &z_clearance, const float &thick, const bool do_ubl_mesh_map) {
989
     void unified_bed_leveling::manually_probe_remaining_mesh(const float &rx, const float &ry, const float &z_clearance, const float &thick, const bool do_ubl_mesh_map) {
957
 
990
 
958
       lcd_external_control = true;
991
       lcd_external_control = true;
959
 
992
 
960
       save_ubl_active_state_and_disable();   // we don't do bed level correction because we want the raw data when we probe
993
       save_ubl_active_state_and_disable();   // we don't do bed level correction because we want the raw data when we probe
961
-
962
       do_blocking_move_to(rx, ry, Z_CLEARANCE_BETWEEN_PROBES);
994
       do_blocking_move_to(rx, ry, Z_CLEARANCE_BETWEEN_PROBES);
963
 
995
 
964
       lcd_return_to_status();
996
       lcd_return_to_status();
989
         const float z_step = 0.01;                                        // existing behavior: 0.01mm per click, occasionally step
1021
         const float z_step = 0.01;                                        // existing behavior: 0.01mm per click, occasionally step
990
         //const float z_step = 1.0 / planner.axis_steps_per_mm[Z_AXIS];   // approx one step each click
1022
         //const float z_step = 1.0 / planner.axis_steps_per_mm[Z_AXIS];   // approx one step each click
991
 
1023
 
992
-        while (is_lcd_clicked()) delay(50);             // wait for user to release encoder wheel
993
-        delay(50);                                       // debounce
994
-        while (!is_lcd_clicked()) {                     // we need the loop to move the nozzle based on the encoder wheel here!
995
-          idle();
996
-          if (encoder_diff) {
997
-            do_blocking_move_to_z(current_position[Z_AXIS] + float(encoder_diff) * z_step);
998
-            encoder_diff = 0;
999
-          }
1000
-        }
1001
-
1002
-        // this sequence to detect an is_lcd_clicked() debounce it and leave if it is
1003
-        // a Press and Hold is repeated in a lot of places (including G26_Mesh_Validation.cpp).   This
1004
-        // should be redone and compressed.
1005
-        const millis_t nxt = millis() + 1500L;
1006
-        while (is_lcd_clicked()) {     // debounce and watch for abort
1007
-          idle();
1008
-          if (ELAPSED(millis(), nxt)) {
1009
-            SERIAL_PROTOCOLLNPGM("\nMesh only partially populated.");
1010
-            do_blocking_move_to_z(Z_CLEARANCE_DEPLOY_PROBE);
1011
-
1012
-            lcd_quick_feedback();
1013
-            while (is_lcd_clicked()) idle();
1014
-            lcd_external_control = false;
1024
+        move_z_with_encoder(z_step);
1015
 
1025
 
1016
-            KEEPALIVE_STATE(IN_HANDLER);
1017
-            restore_ubl_active_state_and_leave();
1018
-            return;
1019
-          }
1026
+        if (click_and_hold()) {
1027
+          SERIAL_PROTOCOLLNPGM("\nMesh only partially populated.");
1028
+          do_blocking_move_to_z(Z_CLEARANCE_DEPLOY_PROBE);
1029
+          lcd_external_control = false;
1030
+          KEEPALIVE_STATE(IN_HANDLER);
1031
+          restore_ubl_active_state_and_leave();
1032
+          return;
1020
         }
1033
         }
1021
 
1034
 
1022
         z_values[location.x_index][location.y_index] = current_position[Z_AXIS] - thick;
1035
         z_values[location.x_index][location.y_index] = current_position[Z_AXIS] - thick;
1150
     return UBL_OK;
1163
     return UBL_OK;
1151
   }
1164
   }
1152
 
1165
 
1153
-  static int ubl_state_at_invocation = 0,
1154
-             ubl_state_recursion_chk = 0;
1155
-
1156
-  void unified_bed_leveling::save_ubl_active_state_and_disable() {
1157
-    ubl_state_recursion_chk++;
1158
-    if (ubl_state_recursion_chk != 1) {
1159
-      SERIAL_ECHOLNPGM("save_ubl_active_state_and_disabled() called multiple times in a row.");
1166
+  static uint8_t ubl_state_at_invocation = 0;
1160
 
1167
 
1161
-      #if ENABLED(NEWPANEL)
1162
-        LCD_MESSAGEPGM(MSG_UBL_SAVE_ERROR);
1163
-        lcd_quick_feedback();
1164
-      #endif
1168
+  #ifdef UBL_DEVEL_DEBUGGING
1169
+    static uint8_t ubl_state_recursion_chk = 0;
1170
+  #endif
1165
 
1171
 
1166
-      return;
1167
-    }
1172
+  void unified_bed_leveling::save_ubl_active_state_and_disable() {
1173
+    #ifdef UBL_DEVEL_DEBUGGING
1174
+      ubl_state_recursion_chk++;
1175
+      if (ubl_state_recursion_chk != 1) {
1176
+        SERIAL_ECHOLNPGM("save_ubl_active_state_and_disabled() called multiple times in a row.");
1177
+        #if ENABLED(NEWPANEL)
1178
+          LCD_MESSAGEPGM(MSG_UBL_SAVE_ERROR);
1179
+          lcd_quick_feedback();
1180
+        #endif
1181
+        return;
1182
+      }
1183
+    #endif
1168
     ubl_state_at_invocation = planner.leveling_active;
1184
     ubl_state_at_invocation = planner.leveling_active;
1169
     set_bed_leveling_enabled(false);
1185
     set_bed_leveling_enabled(false);
1170
   }
1186
   }
1171
 
1187
 
1172
   void unified_bed_leveling::restore_ubl_active_state_and_leave() {
1188
   void unified_bed_leveling::restore_ubl_active_state_and_leave() {
1173
-    if (--ubl_state_recursion_chk) {
1174
-      SERIAL_ECHOLNPGM("restore_ubl_active_state_and_leave() called too many times.");
1175
-
1176
-      #if ENABLED(NEWPANEL)
1177
-        LCD_MESSAGEPGM(MSG_UBL_RESTORE_ERROR);
1178
-        lcd_quick_feedback();
1179
-      #endif
1180
-
1181
-      return;
1182
-    }
1189
+    #ifdef UBL_DEVEL_DEBUGGING
1190
+      if (--ubl_state_recursion_chk) {
1191
+        SERIAL_ECHOLNPGM("restore_ubl_active_state_and_leave() called too many times.");
1192
+        #if ENABLED(NEWPANEL)
1193
+          LCD_MESSAGEPGM(MSG_UBL_RESTORE_ERROR);
1194
+          lcd_quick_feedback();
1195
+        #endif
1196
+        return;
1197
+      }
1198
+    #endif
1183
     set_bed_leveling_enabled(ubl_state_at_invocation);
1199
     set_bed_leveling_enabled(ubl_state_at_invocation);
1184
   }
1200
   }
1185
 
1201
 
1249
     SERIAL_EOL();
1265
     SERIAL_EOL();
1250
     safe_delay(50);
1266
     safe_delay(50);
1251
 
1267
 
1252
-    SERIAL_PROTOCOLLNPAIR("ubl_state_at_invocation :", ubl_state_at_invocation);
1253
-    SERIAL_EOL();
1254
-    SERIAL_PROTOCOLLNPAIR("ubl_state_recursion_chk :", ubl_state_recursion_chk);
1255
-    SERIAL_EOL();
1256
-    safe_delay(50);
1268
+    #ifdef UBL_DEVEL_DEBUGGING
1269
+      SERIAL_PROTOCOLLNPAIR("ubl_state_at_invocation :", ubl_state_at_invocation);
1270
+      SERIAL_EOL();
1271
+      SERIAL_PROTOCOLLNPAIR("ubl_state_recursion_chk :", ubl_state_recursion_chk);
1272
+      SERIAL_EOL();
1273
+      safe_delay(50);
1257
 
1274
 
1258
-    SERIAL_PROTOCOLPAIR("Meshes go from ", hex_address((void*)settings.get_start_of_meshes()));
1259
-    SERIAL_PROTOCOLLNPAIR(" to ", hex_address((void*)settings.get_end_of_meshes()));
1260
-    safe_delay(50);
1275
+      SERIAL_PROTOCOLPAIR("Meshes go from ", hex_address((void*)settings.get_start_of_meshes()));
1276
+      SERIAL_PROTOCOLLNPAIR(" to ", hex_address((void*)settings.get_end_of_meshes()));
1277
+      safe_delay(50);
1261
 
1278
 
1262
-    SERIAL_PROTOCOLLNPAIR("sizeof(ubl) :  ", (int)sizeof(ubl));
1263
-    SERIAL_EOL();
1264
-    SERIAL_PROTOCOLLNPAIR("z_value[][] size: ", (int)sizeof(z_values));
1265
-    SERIAL_EOL();
1266
-    safe_delay(25);
1279
+      SERIAL_PROTOCOLLNPAIR("sizeof(ubl) :  ", (int)sizeof(ubl));
1280
+      SERIAL_EOL();
1281
+      SERIAL_PROTOCOLLNPAIR("z_value[][] size: ", (int)sizeof(z_values));
1282
+      SERIAL_EOL();
1283
+      safe_delay(25);
1267
 
1284
 
1268
-    SERIAL_PROTOCOLLNPAIR("EEPROM free for UBL: ", hex_address((void*)(settings.get_end_of_meshes() - settings.get_start_of_meshes())));
1269
-    safe_delay(50);
1285
+      SERIAL_PROTOCOLLNPAIR("EEPROM free for UBL: ", hex_address((void*)(settings.get_end_of_meshes() - settings.get_start_of_meshes())));
1286
+      safe_delay(50);
1270
 
1287
 
1271
-    SERIAL_PROTOCOLPAIR("EEPROM can hold ", settings.calc_num_meshes());
1272
-    SERIAL_PROTOCOLLNPGM(" meshes.\n");
1273
-    safe_delay(25);
1288
+      SERIAL_PROTOCOLPAIR("EEPROM can hold ", settings.calc_num_meshes());
1289
+      SERIAL_PROTOCOLLNPGM(" meshes.\n");
1290
+      safe_delay(25);
1291
+    #endif // UBL_DEVEL_DEBUGGING
1274
 
1292
 
1275
     if (!sanity_check()) {
1293
     if (!sanity_check()) {
1276
       echo_name();
1294
       echo_name();
1456
 
1474
 
1457
   #if ENABLED(NEWPANEL)
1475
   #if ENABLED(NEWPANEL)
1458
 
1476
 
1477
+    void abort_fine_tune() {
1478
+      lcd_return_to_status();
1479
+      do_blocking_move_to_z(Z_CLEARANCE_BETWEEN_PROBES);
1480
+      LCD_MESSAGEPGM(MSG_EDITING_STOPPED);
1481
+    }
1482
+
1459
     void unified_bed_leveling::fine_tune_mesh(const float &rx, const float &ry, const bool do_ubl_mesh_map) {
1483
     void unified_bed_leveling::fine_tune_mesh(const float &rx, const float &ry, const bool do_ubl_mesh_map) {
1460
       if (!parser.seen('R'))    // fine_tune_mesh() is special. If no repetition count flag is specified
1484
       if (!parser.seen('R'))    // fine_tune_mesh() is special. If no repetition count flag is specified
1461
         g29_repetition_cnt = 1;   // do exactly one mesh location. Otherwise use what the parser decided.
1485
         g29_repetition_cnt = 1;   // do exactly one mesh location. Otherwise use what the parser decided.
1513
 
1537
 
1514
         lcd_mesh_edit_setup(new_z);
1538
         lcd_mesh_edit_setup(new_z);
1515
 
1539
 
1516
-        do {
1540
+        while (!is_lcd_clicked()) {
1517
           new_z = lcd_mesh_edit();
1541
           new_z = lcd_mesh_edit();
1518
           #if ENABLED(UBL_MESH_EDIT_MOVES_Z)
1542
           #if ENABLED(UBL_MESH_EDIT_MOVES_Z)
1519
             do_blocking_move_to_z(h_offset + new_z); // Move the nozzle as the point is edited
1543
             do_blocking_move_to_z(h_offset + new_z); // Move the nozzle as the point is edited
1520
           #endif
1544
           #endif
1521
           idle();
1545
           idle();
1522
-        } while (!is_lcd_clicked());
1546
+        }
1523
 
1547
 
1524
         if (!lcd_map_control) lcd_return_to_status();
1548
         if (!lcd_map_control) lcd_return_to_status();
1525
 
1549
 
1531
         // this sequence to detect an is_lcd_clicked() debounce it and leave if it is
1555
         // this sequence to detect an is_lcd_clicked() debounce it and leave if it is
1532
         // a Press and Hold is repeated in a lot of places (including G26_Mesh_Validation.cpp).   This
1556
         // a Press and Hold is repeated in a lot of places (including G26_Mesh_Validation.cpp).   This
1533
         // should be redone and compressed.
1557
         // should be redone and compressed.
1534
-        const millis_t nxt = millis() + 1500UL;
1535
-        while (is_lcd_clicked()) { // debounce and watch for abort
1536
-          idle();
1537
-          if (ELAPSED(millis(), nxt)) {
1538
-            lcd_return_to_status();
1539
-            do_blocking_move_to_z(Z_CLEARANCE_BETWEEN_PROBES);
1540
-            LCD_MESSAGEPGM(MSG_EDITING_STOPPED);
1541
-
1542
-            while (is_lcd_clicked()) idle();
1543
-
1544
-            goto FINE_TUNE_EXIT;
1545
-          }
1546
-        }
1558
+        if (click_and_hold(abort_fine_tune))
1559
+          goto FINE_TUNE_EXIT;
1547
 
1560
 
1548
         safe_delay(20);                       // We don't want any switch noise.
1561
         safe_delay(20);                       // We don't want any switch noise.
1549
 
1562
 

+ 6
- 7
Marlin/src/gcode/bedlevel/G26.cpp View File

162
    * Detect is_lcd_clicked, debounce it, and return true for cancel
162
    * Detect is_lcd_clicked, debounce it, and return true for cancel
163
    */
163
    */
164
   bool user_canceled() {
164
   bool user_canceled() {
165
-    if (!is_lcd_clicked()) return false;
166
-    safe_delay(10);                       // Wait for click to settle
165
+    if (!is_lcd_clicked()) return false; // Return if the button isn't pressed
167
 
166
 
168
     #if ENABLED(ULTRA_LCD)
167
     #if ENABLED(ULTRA_LCD)
169
       lcd_setstatusPGM(PSTR("Mesh Validation Stopped."), 99);
168
       lcd_setstatusPGM(PSTR("Mesh Validation Stopped."), 99);
170
       lcd_quick_feedback();
169
       lcd_quick_feedback();
171
     #endif
170
     #endif
172
 
171
 
173
-    while (!is_lcd_clicked()) idle();    // Wait for button release
172
+    safe_delay(10);                      // Wait for click to settle
173
+    while (!is_lcd_clicked()) idle();    // Wait for button press again?
174
 
174
 
175
     // If the button is suddenly pressed again,
175
     // If the button is suddenly pressed again,
176
     // ask the user to resolve the issue
176
     // ask the user to resolve the issue
177
     lcd_setstatusPGM(PSTR("Release button"), 99); // will never appear...
177
     lcd_setstatusPGM(PSTR("Release button"), 99); // will never appear...
178
-    while (is_lcd_clicked()) idle();             // unless this loop happens
178
+    wait_for_release();
179
     lcd_reset_status();
179
     lcd_reset_status();
180
-
181
     return true;
180
     return true;
182
   }
181
   }
183
 
182
 
184
   bool exit_from_g26() {
183
   bool exit_from_g26() {
185
     lcd_setstatusPGM(PSTR("Leaving G26"), -1);
184
     lcd_setstatusPGM(PSTR("Leaving G26"), -1);
186
-    while (is_lcd_clicked()) idle();
185
+    wait_for_release();
187
     return G26_ERR;
186
     return G26_ERR;
188
   }
187
   }
189
 
188
 
514
         idle();
513
         idle();
515
       }
514
       }
516
 
515
 
517
-      while (is_lcd_clicked()) idle();           // Debounce Encoder Wheel
516
+      wait_for_release();
518
 
517
 
519
       strcpy_P(lcd_status_message, PSTR("Done Priming")); // We can't do lcd_setstatusPGM() without having it continue;
518
       strcpy_P(lcd_status_message, PSTR("Done Priming")); // We can't do lcd_setstatusPGM() without having it continue;
520
                                                           // So... We cheat to get a message up.
519
                                                           // So... We cheat to get a message up.

+ 4
- 0
Marlin/src/lcd/ultralcd.cpp View File

5105
 
5105
 
5106
   #if ENABLED(AUTO_BED_LEVELING_UBL) || ENABLED(G26_MESH_VALIDATION)
5106
   #if ENABLED(AUTO_BED_LEVELING_UBL) || ENABLED(G26_MESH_VALIDATION)
5107
     bool is_lcd_clicked() { return LCD_CLICKED; }
5107
     bool is_lcd_clicked() { return LCD_CLICKED; }
5108
+    void wait_for_release() {
5109
+      while (is_lcd_clicked()) safe_delay(50);
5110
+      safe_delay(50);
5111
+    }
5108
   #endif
5112
   #endif
5109
 
5113
 
5110
 #endif // ULTIPANEL
5114
 #endif // ULTIPANEL

+ 1
- 0
Marlin/src/lcd/ultralcd.h View File

222
 
222
 
223
   #if ENABLED(AUTO_BED_LEVELING_UBL) || ENABLED(G26_MESH_VALIDATION)
223
   #if ENABLED(AUTO_BED_LEVELING_UBL) || ENABLED(G26_MESH_VALIDATION)
224
     bool is_lcd_clicked();
224
     bool is_lcd_clicked();
225
+    void wait_for_release();
225
   #endif
226
   #endif
226
 
227
 
227
 #else // no LCD
228
 #else // no LCD

Loading…
Cancel
Save