@@ -145,32 +145,19 @@ void updateEmergency() {
145
145
emergency_latch = true ;
146
146
ROS_running = false ;
147
147
}
148
- uint8_t last_emergency = status_message.emergency_bitmask & 1 ;
149
-
150
- // Mask the emergency bits. 2x Lift sensor, 2x Emergency Button
151
- bool emergency1 = !gpio_get (PIN_EMERGENCY_1) | (stock_ui_emergency_state & Emergency_state::Emergency_lift1);
152
- bool emergency2 = !gpio_get (PIN_EMERGENCY_2) | (stock_ui_emergency_state & Emergency_state::Emergency_lift2);
153
- bool emergency3 = !gpio_get (PIN_EMERGENCY_3) | (stock_ui_emergency_state & Emergency_state::Emergency_stop1);
154
- bool emergency4 = !gpio_get (PIN_EMERGENCY_4) | (stock_ui_emergency_state & Emergency_state::Emergency_stop2);
155
-
148
+ uint8_t last_emergency = status_message.emergency_bitmask & LL_EMERGENCY_BIT_LATCH ;
149
+
150
+ // Read & assign emergencies in the same manner as in ll_status.emergency_bitmask
151
+ uint8_t emergency_read = !gpio_get (PIN_EMERGENCY_3) << 1 | // Stop1
152
+ !gpio_get (PIN_EMERGENCY_4) << 2 | // Stop2
153
+ !gpio_get (PIN_EMERGENCY_1) << 3 | // Lift1
154
+ !gpio_get (PIN_EMERGENCY_2) << 4 | // Lift2
155
+ stock_ui_emergency_state; // OR with StockUI emergency
156
156
uint8_t emergency_state = 0 ;
157
157
158
- bool is_tilted = emergency1 || emergency2;
159
- bool is_lifted = emergency1 && emergency2;
160
- bool stop_pressed = emergency3 || emergency4;
161
-
162
- if (is_lifted) {
163
- // We just lifted, store the timestamp
164
- if (lift_emergency_started == 0 ) {
165
- lift_emergency_started = millis ();
166
- }
167
- } else {
168
- // Not lifted, reset the time
169
- lift_emergency_started = 0 ;
170
- }
171
-
172
- if (stop_pressed) {
173
- // We just pressed, store the timestamp
158
+ // Handle emergency "Stop" buttons
159
+ if (emergency_read && LL_EMERGENCY_BITS_STOP) {
160
+ // If we just pressed, store the timestamp
174
161
if (button_emergency_started == 0 ) {
175
162
button_emergency_started = millis ();
176
163
}
@@ -179,17 +166,25 @@ void updateEmergency() {
179
166
button_emergency_started = 0 ;
180
167
}
181
168
182
- if (LIFT_EMERGENCY_MILLIS > 0 && lift_emergency_started > 0 && (millis () - lift_emergency_started) >= LIFT_EMERGENCY_MILLIS) {
183
- // Emergency bit 2 (lift wheel 1)set?
184
- if (emergency1)
185
- emergency_state |= 0b01000 ;
186
- // Emergency bit 1 (lift wheel 2)set?
187
- if (emergency2)
188
- emergency_state |= 0b10000 ;
169
+ if (button_emergency_started > 0 && (millis () - button_emergency_started) >= BUTTON_EMERGENCY_MILLIS)
170
+ {
171
+ emergency_state |= (emergency_read & LL_EMERGENCY_BITS_STOP);
189
172
}
190
173
191
- if (is_tilted) {
192
- // We just tilted, store the timestamp
174
+ // Handle lifted (both wheels are lifted)
175
+ if ((emergency_read & LL_EMERGENCY_BITS_LIFT) == LL_EMERGENCY_BITS_LIFT) {
176
+ // If we just lifted, store the timestamp
177
+ if (lift_emergency_started == 0 ) {
178
+ lift_emergency_started = millis ();
179
+ }
180
+ } else {
181
+ // Not lifted, reset the time
182
+ lift_emergency_started = 0 ;
183
+ }
184
+
185
+ // Handle tilted (one wheel is lifted)
186
+ if (emergency_read & LL_EMERGENCY_BITS_LIFT) {
187
+ // If we just tilted, store the timestamp
193
188
if (tilt_emergency_started == 0 ) {
194
189
tilt_emergency_started = millis ();
195
190
}
@@ -198,32 +193,20 @@ void updateEmergency() {
198
193
tilt_emergency_started = 0 ;
199
194
}
200
195
201
- if (TILT_EMERGENCY_MILLIS > 0 && tilt_emergency_started > 0 && (millis () - tilt_emergency_started) >= TILT_EMERGENCY_MILLIS) {
202
- // Emergency bit 2 (lift wheel 1)set?
203
- if (emergency1)
204
- emergency_state |= 0b01000 ;
205
- // Emergency bit 1 (lift wheel 2)set?
206
- if (emergency2)
207
- emergency_state |= 0b10000 ;
208
- }
209
- if (button_emergency_started > 0 && (millis () - button_emergency_started) >= BUTTON_EMERGENCY_MILLIS) {
210
- // Emergency bit 2 (stop button) set?
211
- if (emergency3)
212
- emergency_state |= 0b00010 ;
213
- // Emergency bit 1 (stop button)set?
214
- if (emergency4)
215
- emergency_state |= 0b00100 ;
196
+ if ((LIFT_EMERGENCY_MILLIS > 0 && lift_emergency_started > 0 && (millis () - lift_emergency_started) >= LIFT_EMERGENCY_MILLIS) ||
197
+ (TILT_EMERGENCY_MILLIS > 0 && tilt_emergency_started > 0 && (millis () - tilt_emergency_started) >= TILT_EMERGENCY_MILLIS)) {
198
+ emergency_state |= (emergency_read & LL_EMERGENCY_BITS_LIFT);
216
199
}
217
200
218
201
if (emergency_state || emergency_latch) {
219
- emergency_latch |= 1 ;
220
- emergency_state |= 1 ;
202
+ emergency_latch = true ;
203
+ emergency_state |= LL_EMERGENCY_BIT_LATCH ;
221
204
}
222
205
223
206
status_message.emergency_bitmask = emergency_state;
224
207
225
208
// If it's a new emergency, instantly send the message. This is to not spam the channel during emergencies.
226
- if (last_emergency != (emergency_state & 1 )) {
209
+ if (last_emergency != (emergency_state & LL_EMERGENCY_BIT_LATCH )) {
227
210
sendMessage (&status_message, sizeof (struct ll_status ));
228
211
229
212
// Update UI instantly
@@ -307,11 +290,11 @@ void manageUILEDS() {
307
290
}
308
291
309
292
// Show Info mower lifted or stop button pressed
310
- if (status_message.emergency_bitmask & 0b00110 ) {
293
+ if (status_message.emergency_bitmask & LL_EMERGENCY_BITS_STOP ) {
311
294
setLed (leds_message, LED_MOWER_LIFTED, LED_blink_fast);
312
- } else if (status_message.emergency_bitmask & 0b11000 ) {
295
+ } else if (status_message.emergency_bitmask & LL_EMERGENCY_BITS_LIFT ) {
313
296
setLed (leds_message, LED_MOWER_LIFTED, LED_blink_slow);
314
- } else if (status_message.emergency_bitmask & 0b0000001 ) {
297
+ } else if (status_message.emergency_bitmask & LL_EMERGENCY_BIT_LATCH ) {
315
298
setLed (leds_message, LED_MOWER_LIFTED, LED_on);
316
299
} else {
317
300
setLed (leds_message, LED_MOWER_LIFTED, LED_off);
0 commit comments