kll_core/converters/
layer.rs

1// Copyright 2021 Jacob Alexander
2//
3// Licensed under the Apache License, Version 2.0, <LICENSE-APACHE or
4// http://apache.org/licenses/LICENSE-2.0> or the MIT license <LICENSE-MIT or
5// http://opensource.org/licenses/MIT>, at your option. This file may not be
6// copied, modified, or distributed except according to those terms.
7
8use crate::layer::State;
9use crate::trigger::LayerState;
10use crate::{error, warn};
11use crate::{CapabilityEvent, CapabilityRun, TriggerEvent};
12
13/// Converts the passed `TriggerEvent` into a `CapabilityRun::LayerState`
14///
15/// # Arguments
16///
17/// * `event`: The TriggerEvent to convert.  This should always be `TriggerEvent::Layer`,
18/// if it is anything else a CapabilityRun::NoOp will be returned
19///
20/// returns: CapabilityRun::LayerState
21pub(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}