ascii_osd_hud/
aoa.rs

1use core::fmt::Write;
2
3use heapless::consts::U4;
4use heapless::String;
5
6use crate::drawable::{Align, Drawable, NumOfLine};
7use crate::symbol::{to_number_with_dot, Symbol, SymbolIndex, SymbolTable};
8use crate::telemetry::Telemetry;
9
10pub struct AOA {
11    alpha: SymbolIndex,
12    zero_dot: SymbolIndex,
13}
14
15impl AOA {
16    pub fn new(symbols: &SymbolTable) -> Self {
17        Self {
18            alpha: symbols[Symbol::Alpha],
19            zero_dot: symbols[Symbol::ZeroWithTraillingDot],
20        }
21    }
22}
23
24impl<T: AsMut<[u8]>> Drawable<T> for AOA {
25    fn align(&self) -> Align {
26        Align::Left
27    }
28
29    fn draw(&self, telemetry: &Telemetry, output: &mut [T]) -> NumOfLine {
30        let buffer = output[0].as_mut();
31        buffer[0] = self.alpha;
32        let mut string: String<U4> = String::new();
33        write!(string, "{:4}", telemetry.aoa).ok();
34        let bytes = string.as_bytes();
35        buffer[1..5].copy_from_slice(bytes);
36        if -10 < telemetry.aoa && telemetry.aoa < 0 {
37            buffer[2] = b'-';
38        }
39        buffer[3] = to_number_with_dot(buffer[3], self.zero_dot);
40        1
41    }
42}
43
44#[cfg(test)]
45mod test {
46    use crate::drawable::Drawable;
47    use crate::symbol::default_symbol_table;
48    use crate::telemetry::Telemetry;
49    use crate::test_utils::to_utf8_string;
50
51    use super::AOA;
52
53    #[test]
54    fn test_aoa() {
55        let mut buffer = [[0u8; 6]];
56        let aoa = AOA::new(&default_symbol_table());
57        let mut telemetry = Telemetry::default();
58        telemetry.aoa = 31;
59        aoa.draw(&telemetry, &mut buffer);
60        assert_eq!("⍺  ⒊1 ", to_utf8_string(&buffer));
61
62        buffer[0].iter_mut().for_each(|x| *x = 0);
63        telemetry.aoa = -1;
64        aoa.draw(&telemetry, &mut buffer);
65        assert_eq!("⍺ -₀1 ", to_utf8_string(&buffer));
66    }
67}