dashboard/mode/
standby.rs

1use crate::display_mod::{CENTER_POINT, DisplayDevice};
2use eg_seven_segment::SevenSegmentStyleBuilder;
3use embassy_sync::{blocking_mutex::raw::ThreadModeRawMutex, mutex::Mutex};
4use embedded_graphics::mono_font::iso_8859_1::FONT_9X15;
5use embedded_graphics::mono_font::{MonoFont, MonoTextStyle};
6use embedded_graphics::text::renderer::CharacterStyle;
7use embedded_graphics::{
8    Drawable,
9    pixelcolor::Rgb666,
10    prelude::*,
11    text::{Alignment, Text},
12};
13const MAX_ROWS_PER_COLUMN: i32 = 16;
14
15pub static CURRENT_ROW: Mutex<ThreadModeRawMutex, i32> = Mutex::new(0);
16
17async fn render_can_value(
18    field: &str,
19    value: u32,
20    render_field_name: bool,
21    display: &mut DisplayDevice,
22) {
23    let mut str_buffer = itoa::Buffer::new();
24    let value = str_buffer.format(value);
25
26    const CAN_FONT: MonoFont<'static> = FONT_9X15;
27    const FONT_WIDTH: u32 = CAN_FONT.character_size.width;
28    const FONT_HEIGHT: u32 = CAN_FONT.character_size.height;
29
30    let number_style = SevenSegmentStyleBuilder::new()
31        .digit_size(Size::new(FONT_WIDTH, FONT_HEIGHT))
32        .digit_spacing(2)
33        .segment_width(1)
34        .segment_color(Rgb666::WHITE)
35        .inactive_segment_color(Rgb666::BLACK)
36        .build();
37    let mut clear_text_style = number_style.clone();
38    clear_text_style.set_text_color(Some(Rgb666::BLACK));
39
40    let mut row = CURRENT_ROW.lock().await;
41    let col = if *row >= MAX_ROWS_PER_COLUMN { 1 } else { 0 };
42
43    let text_pos = Point::new(
44        FONT_WIDTH as i32 * 12 + col * CENTER_POINT.x,
45        20 + (FONT_HEIGHT as i32 + 4) * (*row - col * MAX_ROWS_PER_COLUMN),
46    );
47    let number_pos = text_pos + Point::new(13 * FONT_WIDTH as i32, 0);
48
49    // Clear previous value
50    let clear_number =
51        Text::with_alignment("8888888888", number_pos, clear_text_style, Alignment::Right);
52    clear_number.draw(display).unwrap();
53    // Render Field Value
54    let number = Text::with_alignment(value, number_pos, number_style, Alignment::Right);
55    number.draw(display).unwrap();
56
57    // Render Field Name
58    if render_field_name {
59        let text_style = MonoTextStyle::new(&CAN_FONT, Rgb666::WHITE);
60
61        // render field name
62        let text = Text::with_alignment(field, text_pos, text_style, Alignment::Right);
63        text.draw(display).unwrap();
64
65        // render colon
66        let text = Text::with_alignment(":", text_pos, text_style, Alignment::Left);
67        text.draw(display).unwrap();
68    }
69    // Increment Row number by one
70    *row += 1;
71}
72
73/// Renders the display in Standby Mode
74///
75/// `render_field_name` - If true then render the field name of each canbus value
76pub async fn render_standby_gui(display: &mut DisplayDevice, render_field_name: bool) {
77    let mock_value = 0;
78
79    // RELAY_STATE
80    render_can_value("relay_state", mock_value, render_field_name, display).await;
81
82    // FET_DATA
83    render_can_value("fet_config", mock_value, render_field_name, display).await;
84    render_can_value("input_volt", mock_value, render_field_name, display).await;
85    render_can_value("cap_volt", mock_value, render_field_name, display).await;
86    render_can_value("cap_curr", mock_value, render_field_name, display).await;
87    render_can_value("res_curr", mock_value, render_field_name, display).await;
88    render_can_value("out_curr", mock_value, render_field_name, display).await;
89
90    // FCC_PACK1_DATA
91    render_can_value("fc_press", mock_value, render_field_name, display).await;
92    render_can_value("fc_temp", mock_value, render_field_name, display).await;
93
94    // FCC_PACK2_DATA
95    render_can_value("fan_rpm1", mock_value, render_field_name, display).await;
96    render_can_value("fan_rpm2", mock_value, render_field_name, display).await;
97
98    // // FCC_PACK3_DATA
99    // render_can_value("bme_temp", mock_value, render_field_name,display).await;
100    // render_can_value("bme_humid", mock_value, render_field_name,display).await;
101
102    // H2_PACK1_DATA
103    render_can_value("h2_sense_1", mock_value, render_field_name, display).await;
104    render_can_value("h2_sense_2", mock_value, render_field_name, display).await;
105    render_can_value("h2_sense_3", mock_value, render_field_name, display).await;
106    render_can_value("h2_sense_4", mock_value, render_field_name, display).await;
107
108    // H2_PACK2_DATA
109    render_can_value("bme_temp", mock_value, render_field_name, display).await;
110    render_can_value("bme_humid", mock_value, render_field_name, display).await;
111    render_can_value("imon_7v", mock_value, render_field_name, display).await;
112    render_can_value("imon_12v", mock_value, render_field_name, display).await;
113
114    // BOOST_PACK1_DATA
115    render_can_value("in_curr", mock_value, render_field_name, display).await;
116    render_can_value("in_volt", mock_value, render_field_name, display).await;
117
118    // BOOST_PACK2_DATA
119    render_can_value("out_curr", mock_value, render_field_name, display).await;
120    render_can_value("out_volt", mock_value, render_field_name, display).await;
121
122    // BOOST_PACK3_DATA
123    render_can_value("efficiency", mock_value, render_field_name, display).await;
124    render_can_value("joules", mock_value, render_field_name, display).await;
125
126    // REL_FC_PACK
127    render_can_value("fc_volt", mock_value, render_field_name, display).await;
128    render_can_value("fc_curr", mock_value, render_field_name, display).await;
129
130    // REL_CAP_PACK
131    render_can_value("cap_volt", mock_value, render_field_name, display).await;
132    render_can_value("cap_curr", mock_value, render_field_name, display).await;
133
134    // REL_MOTOR_PACK
135    render_can_value("mtr_volt", mock_value, render_field_name, display).await;
136    render_can_value("mtr_curr", mock_value, render_field_name, display).await;
137
138    // Reset Row number after each frame
139    let mut row = CURRENT_ROW.lock().await;
140    *row = 0;
141}