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 let clear_number =
51 Text::with_alignment("8888888888", number_pos, clear_text_style, Alignment::Right);
52 clear_number.draw(display).unwrap();
53 let number = Text::with_alignment(value, number_pos, number_style, Alignment::Right);
55 number.draw(display).unwrap();
56
57 if render_field_name {
59 let text_style = MonoTextStyle::new(&CAN_FONT, Rgb666::WHITE);
60
61 let text = Text::with_alignment(field, text_pos, text_style, Alignment::Right);
63 text.draw(display).unwrap();
64
65 let text = Text::with_alignment(":", text_pos, text_style, Alignment::Left);
67 text.draw(display).unwrap();
68 }
69 *row += 1;
71}
72
73pub async fn render_standby_gui(display: &mut DisplayDevice, render_field_name: bool) {
77 let mock_value = 0;
78
79 render_can_value("relay_state", mock_value, render_field_name, display).await;
81
82 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 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 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 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 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 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 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 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 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 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 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 let mut row = CURRENT_ROW.lock().await;
140 *row = 0;
141}