diff --git a/examples/meshcore/__pycache__/meshcore_rx.cpython-312.pyc b/examples/meshcore/__pycache__/meshcore_rx.cpython-312.pyc new file mode 100644 index 00000000..82e2a618 Binary files /dev/null and b/examples/meshcore/__pycache__/meshcore_rx.cpython-312.pyc differ diff --git a/src/display/render.rs b/src/display/render.rs index a724a9eb..04da0321 100644 --- a/src/display/render.rs +++ b/src/display/render.rs @@ -27,27 +27,33 @@ const RSSI_MIN: i16 = -120; const RSSI_MAX: i16 = 0; /// Render the boot splash screen. -pub fn splash( - target: &mut impl DrawTarget, - board_name: &str, - version: &str, -) { +pub fn splash(target: &mut impl DrawTarget, board_name: &str, version: &str) { let _ = target.clear(BinaryColor::Off); let title_style = MonoTextStyle::new(&FONT_9X15_BOLD, BinaryColor::On); let sub_style = MonoTextStyle::new(&FONT_6X10, BinaryColor::On); - Text::with_alignment("DongLoRa", Point::new(W / 2, 24), title_style, Alignment::Center) - .draw(target) - .ok(); + Text::with_alignment( + "DongLoRa", + Point::new(W / 2, 24), + title_style, + Alignment::Center, + ) + .draw(target) + .ok(); Text::with_alignment(version, Point::new(W / 2, 42), sub_style, Alignment::Center) .draw(target) .ok(); - Text::with_alignment(board_name, Point::new(W / 2, 54), sub_style, Alignment::Center) - .draw(target) - .ok(); + Text::with_alignment( + board_name, + Point::new(W / 2, 54), + sub_style, + Alignment::Center, + ) + .draw(target) + .ok(); } /// Render the main status dashboard. @@ -64,30 +70,48 @@ pub fn dashboard( Some(cfg) => { // Row 0: state + frequency (full precision) let mut buf: String<32> = String::new(); - let state_str = match status.state { - RadioState::Idle => "IDLE", - RadioState::Receiving => "RX", - RadioState::Transmitting => "TX", - }; let freq_mhz = cfg.freq_hz / 1_000_000; let freq_khz = (cfg.freq_hz % 1_000_000) / 1_000; - let _ = write!(buf, "{:<4} {}.{:03}MHz", state_str, freq_mhz, freq_khz); + let _ = write!(buf, " {}.{:03}MHz", freq_mhz, freq_khz); Text::new(&buf, Point::new(0, FONT_H - 1), style) .draw(target) .ok(); - // Inverted state indicator when active - if status.state != RadioState::Idle { - let state_w = state_str.len() as i32 * 6; - let mut inv_style = MonoTextStyle::new(&FONT_6X10, BinaryColor::Off); - inv_style.set_background_color(Some(BinaryColor::On)); - Rectangle::new(Point::new(0, 0), Size::new(state_w as u32, FONT_H as u32)) - .into_styled(PrimitiveStyle::with_fill(BinaryColor::On)) - .draw(target) - .ok(); - Text::new(state_str, Point::new(0, FONT_H - 1), inv_style) - .draw(target) - .ok(); + // State indicator: inverted "RX" or "TX", plain "IDLE" + match status.state { + RadioState::Idle => { + Text::new("IDLE", Point::new(0, FONT_H - 1), style) + .draw(target) + .ok(); + } + RadioState::Receiving => { + let x = 0; + let char_w = 6; + let text_w = 2 * char_w; // "RX" = 2 chars + let mut inv_style = MonoTextStyle::new(&FONT_6X10, BinaryColor::Off); + inv_style.set_background_color(Some(BinaryColor::On)); + Rectangle::new(Point::new(x, 0), Size::new(text_w as u32, FONT_H as u32)) + .into_styled(PrimitiveStyle::with_fill(BinaryColor::On)) + .draw(target) + .ok(); + Text::new("RX", Point::new(x, FONT_H - 1), inv_style) + .draw(target) + .ok(); + } + RadioState::Transmitting => { + let char_w = 6; + let x = 2 * char_w; // start at column 2 (third character position) + let text_w = 2 * char_w; // "TX" = 2 chars + let mut inv_style = MonoTextStyle::new(&FONT_6X10, BinaryColor::Off); + inv_style.set_background_color(Some(BinaryColor::On)); + Rectangle::new(Point::new(x, 0), Size::new(text_w as u32, FONT_H as u32)) + .into_styled(PrimitiveStyle::with_fill(BinaryColor::On)) + .draw(target) + .ok(); + Text::new("TX", Point::new(x, FONT_H - 1), inv_style) + .draw(target) + .ok(); + } } // Row 1: BW (full) SF CR