Browse Source

Allow servo features in combination (#16960)

Scott Lahteine 5 years ago
parent
commit
0a7e7a6fa5
No account linked to committer's email address

+ 0
- 3
Marlin/src/feature/bltouch.h View File

105
   static void mode_conv_proc(const bool M5V);
105
   static void mode_conv_proc(const bool M5V);
106
 };
106
 };
107
 
107
 
108
-// Deploy/stow angles for use by servo.cpp / servo.h
109
-#define BLTOUCH_ANGLES { BLTOUCH_DEPLOY, BLTOUCH_STOW }
110
-
111
 extern BLTouch bltouch;
108
 extern BLTouch bltouch;

+ 6
- 0
Marlin/src/gcode/config/M281.cpp View File

30
   if (!parser.seenval('P')) return;
30
   if (!parser.seenval('P')) return;
31
   const int servo_index = parser.value_int();
31
   const int servo_index = parser.value_int();
32
   if (WITHIN(servo_index, 0, NUM_SERVOS - 1)) {
32
   if (WITHIN(servo_index, 0, NUM_SERVOS - 1)) {
33
+    #if ENABLED(BLTOUCH)
34
+      if (servo_index == Z_PROBE_SERVO_NR) {
35
+        SERIAL_ERROR_MSG("BLTouch angles can't be changed.");
36
+        return;
37
+      }
38
+    #endif
33
     bool angle_change = false;
39
     bool angle_change = false;
34
     if (parser.seen('L')) {
40
     if (parser.seen('L')) {
35
       servo_angles[servo_index][0] = parser.value_int();
41
       servo_angles[servo_index][0] = parser.value_int();

+ 4
- 0
Marlin/src/inc/Conditionals_LCD.h View File

502
  * Set a flag for a servo probe (or BLTouch)
502
  * Set a flag for a servo probe (or BLTouch)
503
  */
503
  */
504
 #define HAS_Z_SERVO_PROBE (defined(Z_PROBE_SERVO_NR) && Z_PROBE_SERVO_NR >= 0)
504
 #define HAS_Z_SERVO_PROBE (defined(Z_PROBE_SERVO_NR) && Z_PROBE_SERVO_NR >= 0)
505
+#define HAS_SERVO_ANGLES (HAS_Z_SERVO_PROBE || EITHER(SWITCHING_EXTRUDER, SWITCHING_NOZZLE))
506
+#if !HAS_SERVO_ANGLES
507
+  #undef EDITABLE_SERVO_ANGLES
508
+#endif
505
 
509
 
506
 /**
510
 /**
507
  * Set flags for enabled probes
511
  * Set flags for enabled probes

+ 0
- 10
Marlin/src/inc/Conditionals_post.h View File

1546
 #define HAS_SERVO_3 (PIN_EXISTS(SERVO3) && NUM_SERVOS > 3)
1546
 #define HAS_SERVO_3 (PIN_EXISTS(SERVO3) && NUM_SERVOS > 3)
1547
 #define HAS_SERVOS  (NUM_SERVOS > 0)
1547
 #define HAS_SERVOS  (NUM_SERVOS > 0)
1548
 
1548
 
1549
-#if HAS_SERVOS && !defined(Z_PROBE_SERVO_NR)
1550
-  #define Z_PROBE_SERVO_NR -1
1551
-#endif
1552
-
1553
-#define HAS_SERVO_ANGLES (EITHER(SWITCHING_EXTRUDER, SWITCHING_NOZZLE) || (HAS_Z_SERVO_PROBE && defined(Z_PROBE_SERVO_NR)))
1554
-
1555
-#if !HAS_SERVO_ANGLES || ENABLED(BLTOUCH)
1556
-  #undef EDITABLE_SERVO_ANGLES
1557
-#endif
1558
-
1559
 // Sensors
1549
 // Sensors
1560
 #define HAS_FILAMENT_WIDTH_SENSOR (PIN_EXISTS(FILWIDTH))
1550
 #define HAS_FILAMENT_WIDTH_SENSOR (PIN_EXISTS(FILWIDTH))
1561
 
1551
 

+ 2
- 2
Marlin/src/module/configuration_store.cpp View File

2541
   //
2541
   //
2542
 
2542
 
2543
   #if ENABLED(EDITABLE_SERVO_ANGLES)
2543
   #if ENABLED(EDITABLE_SERVO_ANGLES)
2544
-    COPY(servo_angles, base_servo_angles);
2544
+    COPY(servo_angles, base_servo_angles);  // When not editable only one copy of servo angles exists
2545
   #endif
2545
   #endif
2546
 
2546
 
2547
   //
2547
   //
3091
             #endif
3091
             #endif
3092
           #elif ENABLED(SWITCHING_NOZZLE)
3092
           #elif ENABLED(SWITCHING_NOZZLE)
3093
             case SWITCHING_NOZZLE_SERVO_NR:
3093
             case SWITCHING_NOZZLE_SERVO_NR:
3094
-          #elif (ENABLED(BLTOUCH) && defined(BLTOUCH_ANGLES)) || (defined(Z_SERVO_ANGLES) && defined(Z_PROBE_SERVO_NR))
3094
+          #elif ENABLED(BLTOUCH) || (HAS_Z_SERVO_PROBE && defined(Z_SERVO_ANGLES))
3095
             case Z_PROBE_SERVO_NR:
3095
             case Z_PROBE_SERVO_NR:
3096
           #endif
3096
           #endif
3097
             CONFIG_ECHO_START();
3097
             CONFIG_ECHO_START();

+ 44
- 25
Marlin/src/module/servo.h View File

31
 #if HAS_SERVO_ANGLES
31
 #if HAS_SERVO_ANGLES
32
 
32
 
33
   #if ENABLED(SWITCHING_EXTRUDER)
33
   #if ENABLED(SWITCHING_EXTRUDER)
34
-    #ifndef SWITCHING_EXTRUDER_E23_SERVO_NR
35
-      #define SWITCHING_EXTRUDER_E23_SERVO_NR -1
36
-    #endif
34
+    // Switching extruder can have 2 or 4 angles
37
     #if EXTRUDERS > 3
35
     #if EXTRUDERS > 3
38
       #define REQ_ANGLES 4
36
       #define REQ_ANGLES 4
39
     #else
37
     #else
40
       #define REQ_ANGLES 2
38
       #define REQ_ANGLES 2
41
     #endif
39
     #endif
42
-    #define SADATA    SWITCHING_EXTRUDER_SERVO_ANGLES
43
-    #define ASRC(N,E) (SWITCHING_EXTRUDER_SERVO_NR == N ? asrc[E] : SWITCHING_EXTRUDER_E23_SERVO_NR == N ? asrc[E+2] : 0)
44
-  #elif ENABLED(SWITCHING_NOZZLE)
45
-    #define SADATA    SWITCHING_NOZZLE_SERVO_ANGLES
46
-    #define ASRC(N,E) (SWITCHING_NOZZLE_SERVO_NR == N ? asrc[E] : 0)
47
-  #elif defined(Z_PROBE_SERVO_NR)
48
-    #define ASRC(N,E) (Z_PROBE_SERVO_NR == N ? asrc[E] : 0)
40
+    constexpr uint16_t sase[] = SWITCHING_EXTRUDER_SERVO_ANGLES;
41
+    static_assert(COUNT(sase) == REQ_ANGLES, "SWITCHING_EXTRUDER_SERVO_ANGLES needs " STRINGIFY(REQ_ANGLES) " angles.");
42
+  #else
43
+    constexpr uint16_t sase[4] = { 0 };
44
+  #endif
45
+
46
+  #if ENABLED(SWITCHING_NOZZLE)
47
+    constexpr uint16_t sasn[] = SWITCHING_NOZZLE_SERVO_ANGLES;
48
+    static_assert(COUNT(sasn) == 2, "SWITCHING_NOZZLE_SERVO_ANGLES needs 2 angles.");
49
+  #else
50
+    constexpr uint16_t sasn[2] = { 0 };
51
+  #endif
52
+
53
+  #ifdef Z_PROBE_SERVO_NR
49
     #if ENABLED(BLTOUCH)
54
     #if ENABLED(BLTOUCH)
50
       #include "../feature/bltouch.h"
55
       #include "../feature/bltouch.h"
56
+      #undef Z_SERVO_ANGLES
57
+      #define Z_SERVO_ANGLES { BLTOUCH_DEPLOY, BLTOUCH_STOW }
51
     #endif
58
     #endif
52
-    #ifdef BLTOUCH_ANGLES
53
-      #define SADATA  BLTOUCH_ANGLES
54
-    #elif defined(Z_SERVO_ANGLES)
55
-      #define SADATA  Z_SERVO_ANGLES
56
-    #else
57
-      #error "Servo angles are needed!"
58
-    #endif
59
+    constexpr uint16_t sazp[] = Z_SERVO_ANGLES;
60
+    static_assert(COUNT(sazp) == 2, "Z_SERVO_ANGLES needs 2 angles.");
61
+  #else
62
+    constexpr uint16_t sazp[2] = { 0 };
59
   #endif
63
   #endif
60
 
64
 
65
+  #ifndef SWITCHING_EXTRUDER_SERVO_NR
66
+    #define SWITCHING_EXTRUDER_SERVO_NR -1
67
+  #endif
68
+  #ifndef SWITCHING_EXTRUDER_E23_SERVO_NR
69
+    #define SWITCHING_EXTRUDER_E23_SERVO_NR -1
70
+  #endif
71
+  #ifndef SWITCHING_NOZZLE_SERVO_NR
72
+    #define SWITCHING_NOZZLE_SERVO_NR -1
73
+  #endif
74
+  #ifndef Z_PROBE_SERVO_NR
75
+    #define Z_PROBE_SERVO_NR -1
76
+  #endif
77
+
78
+  #define ASRC(N,I) (                                  \
79
+      N == SWITCHING_EXTRUDER_SERVO_NR     ? sase[I]   \
80
+    : N == SWITCHING_EXTRUDER_E23_SERVO_NR ? sase[I+2] \
81
+    : N == SWITCHING_NOZZLE_SERVO_NR       ? sasn[I]   \
82
+    : N == Z_PROBE_SERVO_NR                ? sazp[I]   \
83
+    : 0                                                )
84
+
61
   #if ENABLED(EDITABLE_SERVO_ANGLES)
85
   #if ENABLED(EDITABLE_SERVO_ANGLES)
62
     extern uint16_t servo_angles[NUM_SERVOS][2];
86
     extern uint16_t servo_angles[NUM_SERVOS][2];
63
-    #define BASE_SERVO_ANGLES base_servo_angles
87
+    #define CONST_SERVO_ANGLES base_servo_angles
64
   #else
88
   #else
65
-    #define BASE_SERVO_ANGLES servo_angles
66
-  #endif
67
-
68
-  constexpr uint16_t asrc[] = SADATA;
69
-  #if REQ_ANGLES
70
-    static_assert(COUNT(asrc) == REQ_ANGLES, "SWITCHING_EXTRUDER_SERVO_ANGLES needs " STRINGIFY(REQ_ANGLES) " angles.");
89
+    #define CONST_SERVO_ANGLES servo_angles
71
   #endif
90
   #endif
72
 
91
 
73
-  constexpr uint16_t BASE_SERVO_ANGLES [NUM_SERVOS][2] = {
92
+  constexpr uint16_t CONST_SERVO_ANGLES [NUM_SERVOS][2] = {
74
       { ASRC(0,0), ASRC(0,1) }
93
       { ASRC(0,0), ASRC(0,1) }
75
     #if NUM_SERVOS > 1
94
     #if NUM_SERVOS > 1
76
       , { ASRC(1,0), ASRC(1,1) }
95
       , { ASRC(1,0), ASRC(1,1) }

Loading…
Cancel
Save