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}