1use crate::layer::State;
9use crate::trigger::LayerState;
10use crate::{error, warn};
11use crate::{CapabilityEvent, CapabilityRun, TriggerEvent};
12
13pub(super) fn convert(event: TriggerEvent) -> CapabilityRun {
22 if let TriggerEvent::Layer { state, layer, .. } = event {
23 match state {
24 LayerState::ShiftActivate => CapabilityRun::LayerState {
25 state: CapabilityEvent::Initial,
26 layer,
27 layer_state: State::Shift,
28 },
29 LayerState::LatchActivate => CapabilityRun::LayerState {
30 state: CapabilityEvent::Initial,
31 layer,
32 layer_state: State::Latch,
33 },
34 LayerState::ShiftLatchActivate => CapabilityRun::LayerState {
35 state: CapabilityEvent::Initial,
36 layer,
37 layer_state: State::ShiftLatch,
38 },
39 LayerState::LockActivate => CapabilityRun::LayerState {
40 state: CapabilityEvent::Initial,
41 layer,
42 layer_state: State::Lock,
43 },
44 LayerState::ShiftLockActivate => CapabilityRun::LayerState {
45 state: CapabilityEvent::Initial,
46 layer,
47 layer_state: State::ShiftLock,
48 },
49 LayerState::LatchLockActivate => CapabilityRun::LayerState {
50 state: CapabilityEvent::Initial,
51 layer,
52 layer_state: State::LatchLock,
53 },
54 LayerState::ShiftLatchLockActivate => CapabilityRun::LayerState {
55 state: CapabilityEvent::Initial,
56 layer,
57 layer_state: State::ShiftLatchLock,
58 },
59 LayerState::ShiftOn => CapabilityRun::LayerState {
60 state: CapabilityEvent::Any,
61 layer,
62 layer_state: State::Shift,
63 },
64 LayerState::LatchOn => CapabilityRun::LayerState {
65 state: CapabilityEvent::Any,
66 layer,
67 layer_state: State::Latch,
68 },
69 LayerState::ShiftLatchOn => CapabilityRun::LayerState {
70 state: CapabilityEvent::Any,
71 layer,
72 layer_state: State::ShiftLatch,
73 },
74 LayerState::LockOn => CapabilityRun::LayerState {
75 state: CapabilityEvent::Any,
76 layer,
77 layer_state: State::Lock,
78 },
79 LayerState::ShiftLockOn => CapabilityRun::LayerState {
80 state: CapabilityEvent::Any,
81 layer,
82 layer_state: State::ShiftLock,
83 },
84 LayerState::LatchLockOn => CapabilityRun::LayerState {
85 state: CapabilityEvent::Any,
86 layer,
87 layer_state: State::LatchLock,
88 },
89 LayerState::ShiftLatchLockOn => CapabilityRun::LayerState {
90 state: CapabilityEvent::Any,
91 layer,
92 layer_state: State::ShiftLatchLock,
93 },
94 LayerState::ShiftDeactivate => CapabilityRun::LayerState {
95 state: CapabilityEvent::Last,
96 layer,
97 layer_state: State::Shift,
98 },
99 LayerState::LatchDeactivate => CapabilityRun::LayerState {
100 state: CapabilityEvent::Last,
101 layer,
102 layer_state: State::Latch,
103 },
104 LayerState::ShiftLatchDeactivate => CapabilityRun::LayerState {
105 state: CapabilityEvent::Last,
106 layer,
107 layer_state: State::ShiftLatch,
108 },
109 LayerState::LockDeactivate => CapabilityRun::LayerState {
110 state: CapabilityEvent::Last,
111 layer,
112 layer_state: State::Lock,
113 },
114 LayerState::ShiftLockDeactivate => CapabilityRun::LayerState {
115 state: CapabilityEvent::Last,
116 layer,
117 layer_state: State::ShiftLock,
118 },
119 LayerState::LatchLockDeactivate => CapabilityRun::LayerState {
120 state: CapabilityEvent::Last,
121 layer,
122 layer_state: State::LatchLock,
123 },
124 LayerState::ShiftLatchLockDeactivate => CapabilityRun::LayerState {
125 state: CapabilityEvent::Last,
126 layer,
127 layer_state: State::ShiftLatchLock,
128 },
129 LayerState::ShiftOff => CapabilityRun::LayerState {
130 state: CapabilityEvent::None,
131 layer,
132 layer_state: State::Shift,
133 },
134 LayerState::LatchOff => CapabilityRun::LayerState {
135 state: CapabilityEvent::None,
136 layer,
137 layer_state: State::Latch,
138 },
139 LayerState::ShiftLatchOff => CapabilityRun::LayerState {
140 state: CapabilityEvent::None,
141 layer,
142 layer_state: State::ShiftLatch,
143 },
144 LayerState::LockOff => CapabilityRun::LayerState {
145 state: CapabilityEvent::None,
146 layer,
147 layer_state: State::Lock,
148 },
149 LayerState::ShiftLockOff => CapabilityRun::LayerState {
150 state: CapabilityEvent::None,
151 layer,
152 layer_state: State::ShiftLock,
153 },
154 LayerState::LatchLockOff => CapabilityRun::LayerState {
155 state: CapabilityEvent::None,
156 layer,
157 layer_state: State::LatchLock,
158 },
159 LayerState::ShiftLatchLockOff => CapabilityRun::LayerState {
160 state: CapabilityEvent::None,
161 layer,
162 layer_state: State::ShiftLatchLock,
163 },
164 _ => {
165 warn!("Unexpected state {:?}", state);
166 CapabilityRun::NoOp {
167 state: CapabilityEvent::None,
168 }
169 }
170 }
171 } else {
172 error!("Unexpected event {:?}", event);
173 CapabilityRun::NoOp {
174 state: CapabilityEvent::None,
175 }
176 }
177}
178
179#[cfg(test)]
180mod tests {
181 use crate::converters::layer::convert;
182 use crate::layer::State;
183 use crate::trigger::{Aodo, LayerState};
184 use crate::{CapabilityEvent, CapabilityRun, TriggerEvent};
185
186 #[test]
187 fn convert_shift_activate_to_initial_shift_layer_state() {
188 let a = TriggerEvent::Layer {
189 state: LayerState::ShiftActivate,
190 layer: 1,
191 last_state: 0,
192 };
193 check_results(convert(a), CapabilityEvent::Initial, 1, State::Shift)
194 }
195
196 #[test]
197 fn convert_latch_activate_to_initial_latch_layer_state() {
198 let a = TriggerEvent::Layer {
199 state: LayerState::LatchActivate,
200 layer: 1,
201 last_state: 0,
202 };
203 check_results(convert(a), CapabilityEvent::Initial, 1, State::Latch)
204 }
205
206 #[test]
207 fn convert_shift_latch_activate_to_initial_shift_latch_layer_state() {
208 let a = TriggerEvent::Layer {
209 state: LayerState::ShiftLatchActivate,
210 layer: 1,
211 last_state: 0,
212 };
213 check_results(convert(a), CapabilityEvent::Initial, 1, State::ShiftLatch)
214 }
215
216 #[test]
217 fn convert_lock_activate_to_initial_lock_layer_state() {
218 let a = TriggerEvent::Layer {
219 state: LayerState::LockActivate,
220 layer: 1,
221 last_state: 0,
222 };
223 check_results(convert(a), CapabilityEvent::Initial, 1, State::Lock)
224 }
225
226 #[test]
227 fn convert_shift_lock_activate_to_initial_shift_lock_layer_state() {
228 let a = TriggerEvent::Layer {
229 state: LayerState::ShiftLockActivate,
230 layer: 1,
231 last_state: 0,
232 };
233 check_results(convert(a), CapabilityEvent::Initial, 1, State::ShiftLock)
234 }
235
236 #[test]
237 fn convert_latch_lock_activate_to_initial_latch_lock_layer_state() {
238 let a = TriggerEvent::Layer {
239 state: LayerState::LatchLockActivate,
240 layer: 1,
241 last_state: 0,
242 };
243 check_results(convert(a), CapabilityEvent::Initial, 1, State::LatchLock)
244 }
245
246 #[test]
247 fn convert_shift_latch_lock_activate_to_initial_shift_latch_lock_layer_state() {
248 let a = TriggerEvent::Layer {
249 state: LayerState::ShiftLatchLockActivate,
250 layer: 1,
251 last_state: 0,
252 };
253 check_results(
254 convert(a),
255 CapabilityEvent::Initial,
256 1,
257 State::ShiftLatchLock,
258 )
259 }
260
261 #[test]
262 fn convert_shift_on_to_any_shift_layer_state() {
263 let a = TriggerEvent::Layer {
264 state: LayerState::ShiftOn,
265 layer: 1,
266 last_state: 0,
267 };
268 check_results(convert(a), CapabilityEvent::Any, 1, State::Shift)
269 }
270
271 #[test]
272 fn convert_latch_on_to_any_latch_layer_state() {
273 let a = TriggerEvent::Layer {
274 state: LayerState::LatchOn,
275 layer: 1,
276 last_state: 0,
277 };
278 check_results(convert(a), CapabilityEvent::Any, 1, State::Latch)
279 }
280
281 #[test]
282 fn convert_shift_latch_on_to_any_shift_latch_layer_state() {
283 let a = TriggerEvent::Layer {
284 state: LayerState::ShiftLatchOn,
285 layer: 1,
286 last_state: 0,
287 };
288 check_results(convert(a), CapabilityEvent::Any, 1, State::ShiftLatch)
289 }
290
291 #[test]
292 fn convert_lock_on_to_any_lock_layer_state() {
293 let a = TriggerEvent::Layer {
294 state: LayerState::LockOn,
295 layer: 1,
296 last_state: 0,
297 };
298 check_results(convert(a), CapabilityEvent::Any, 1, State::Lock)
299 }
300
301 #[test]
302 fn convert_shift_lock_on_to_any_shift_lock_layer_state() {
303 let a = TriggerEvent::Layer {
304 state: LayerState::ShiftLockOn,
305 layer: 1,
306 last_state: 0,
307 };
308 check_results(convert(a), CapabilityEvent::Any, 1, State::ShiftLock)
309 }
310
311 #[test]
312 fn convert_latch_lock_on_to_any_latch_lock_layer_state() {
313 let a = TriggerEvent::Layer {
314 state: LayerState::LatchLockOn,
315 layer: 1,
316 last_state: 0,
317 };
318 check_results(convert(a), CapabilityEvent::Any, 1, State::LatchLock)
319 }
320
321 #[test]
322 fn convert_shift_latch_lock_on_to_any_shift_latch_lock_layer_state() {
323 let a = TriggerEvent::Layer {
324 state: LayerState::ShiftLatchLockOn,
325 layer: 1,
326 last_state: 0,
327 };
328 check_results(convert(a), CapabilityEvent::Any, 1, State::ShiftLatchLock)
329 }
330
331 #[test]
332 fn convert_shift_deactivate_to_last_shift_layer_state() {
333 let a = TriggerEvent::Layer {
334 state: LayerState::ShiftDeactivate,
335 layer: 1,
336 last_state: 0,
337 };
338 check_results(convert(a), CapabilityEvent::Last, 1, State::Shift)
339 }
340
341 #[test]
342 fn convert_latch_deactivate_to_last_latch_layer_state() {
343 let a = TriggerEvent::Layer {
344 state: LayerState::LatchDeactivate,
345 layer: 1,
346 last_state: 0,
347 };
348 check_results(convert(a), CapabilityEvent::Last, 1, State::Latch)
349 }
350
351 #[test]
352 fn convert_shift_latch_deactivate_to_last_shift_latch_layer_state() {
353 let a = TriggerEvent::Layer {
354 state: LayerState::ShiftLatchDeactivate,
355 layer: 1,
356 last_state: 0,
357 };
358 check_results(convert(a), CapabilityEvent::Last, 1, State::ShiftLatch)
359 }
360
361 #[test]
362 fn convert_lock_deactivate_to_last_lock_layer_state() {
363 let a = TriggerEvent::Layer {
364 state: LayerState::LockDeactivate,
365 layer: 1,
366 last_state: 0,
367 };
368 check_results(convert(a), CapabilityEvent::Last, 1, State::Lock)
369 }
370
371 #[test]
372 fn convert_shift_lock_deactivate_to_last_shift_lock_layer_state() {
373 let a = TriggerEvent::Layer {
374 state: LayerState::ShiftLockDeactivate,
375 layer: 1,
376 last_state: 0,
377 };
378 check_results(convert(a), CapabilityEvent::Last, 1, State::ShiftLock)
379 }
380
381 #[test]
382 fn convert_latch_lock_deactivate_to_last_latch_lock_layer_state() {
383 let a = TriggerEvent::Layer {
384 state: LayerState::LatchLockDeactivate,
385 layer: 1,
386 last_state: 0,
387 };
388 check_results(convert(a), CapabilityEvent::Last, 1, State::LatchLock)
389 }
390
391 #[test]
392 fn convert_shift_latch_lock_deactivate_to_last_shift_latch_lock_layer_state() {
393 let a = TriggerEvent::Layer {
394 state: LayerState::ShiftLatchLockDeactivate,
395 layer: 1,
396 last_state: 0,
397 };
398 check_results(convert(a), CapabilityEvent::Last, 1, State::ShiftLatchLock)
399 }
400
401 #[test]
402 fn convert_shift_off_to_none_shift_layer_state() {
403 let a = TriggerEvent::Layer {
404 state: LayerState::ShiftOff,
405 layer: 1,
406 last_state: 0,
407 };
408 check_results(convert(a), CapabilityEvent::None, 1, State::Shift)
409 }
410
411 #[test]
412 fn convert_latch_off_to_none_latch_layer_state() {
413 let a = TriggerEvent::Layer {
414 state: LayerState::LatchOff,
415 layer: 1,
416 last_state: 0,
417 };
418 check_results(convert(a), CapabilityEvent::None, 1, State::Latch)
419 }
420
421 #[test]
422 fn convert_shift_latch_off_to_none_shift_latch_layer_state() {
423 let a = TriggerEvent::Layer {
424 state: LayerState::ShiftLatchOff,
425 layer: 1,
426 last_state: 0,
427 };
428 check_results(convert(a), CapabilityEvent::None, 1, State::ShiftLatch)
429 }
430
431 #[test]
432 fn convert_lock_off_to_none_lock_layer_state() {
433 let a = TriggerEvent::Layer {
434 state: LayerState::LockOff,
435 layer: 1,
436 last_state: 0,
437 };
438 check_results(convert(a), CapabilityEvent::None, 1, State::Lock)
439 }
440
441 #[test]
442 fn convert_shift_lock_off_to_none_shift_lock_layer_state() {
443 let a = TriggerEvent::Layer {
444 state: LayerState::ShiftLockOff,
445 layer: 1,
446 last_state: 0,
447 };
448 check_results(convert(a), CapabilityEvent::None, 1, State::ShiftLock)
449 }
450
451 #[test]
452 fn convert_latch_lock_off_to_none_latch_lock_layer_state() {
453 let a = TriggerEvent::Layer {
454 state: LayerState::LatchLockOff,
455 layer: 1,
456 last_state: 0,
457 };
458 check_results(convert(a), CapabilityEvent::None, 1, State::LatchLock)
459 }
460
461 #[test]
462 fn convert_shift_latch_lock_off_to_none_shift_latch_lock_layer_state() {
463 let a = TriggerEvent::Layer {
464 state: LayerState::ShiftLatchLockOff,
465 layer: 1,
466 last_state: 0,
467 };
468 check_results(convert(a), CapabilityEvent::None, 1, State::ShiftLatchLock)
469 }
470
471 #[test]
472 fn convert_unexpected_state_type_returns_noop() {
473 let a = TriggerEvent::Layer {
474 state: LayerState::Passthrough,
475 layer: 2,
476 last_state: 0,
477 };
478 let result = convert(a);
479
480 assert_eq!(
481 result,
482 CapabilityRun::NoOp {
483 state: CapabilityEvent::None
484 }
485 )
486 }
487
488 #[test]
489 fn convert_unexpected_trigger_event_type_returns_noop() {
490 let a = TriggerEvent::Sleep {
491 state: Aodo::Activate,
492 last_state: 0,
493 };
494 let result = convert(a);
495
496 assert_eq!(
497 result,
498 CapabilityRun::NoOp {
499 state: CapabilityEvent::None
500 }
501 )
502 }
503
504 fn check_results(
505 event: CapabilityRun,
506 expected_event: CapabilityEvent,
507 expected_layer: u8,
508 expected_layer_state: State,
509 ) {
510 if let CapabilityRun::LayerState {
511 state,
512 layer,
513 layer_state,
514 } = event
515 {
516 assert_eq!(state, expected_event);
517 assert_eq!(layer, expected_layer);
518 assert_eq!(layer_state, expected_layer_state);
519 } else {
520 panic!("process_state failed to return a LayerState")
521 }
522 }
523}