From 918c4c122eb7b94c9e156a0db23c64a23ca6bbe0 Mon Sep 17 00:00:00 2001 From: Hexa Dust Date: Fri, 18 Jul 2025 20:31:23 +0100 Subject: [PATCH] factored out display file --- src/display.rs | 239 +++++++++++++++++++++++++++++++++++++++++++++ src/main.rs | 258 +++---------------------------------------------- 2 files changed, 254 insertions(+), 243 deletions(-) create mode 100644 src/display.rs diff --git a/src/display.rs b/src/display.rs new file mode 100644 index 0000000..ac8d871 --- /dev/null +++ b/src/display.rs @@ -0,0 +1,239 @@ +use core::ops::{Index, IndexMut}; + +use arduino_hal::{ + hal::port::{PB0, PB1, PB2, PC0, PC4, PC5, PD5, PD6}, + port::{mode::Output, Pin}, +}; + +pub struct SegmentPins { + kd_seg_a: Pin, + kd_seg_b: Pin, + kd_seg_c: Pin, + kd_seg_d: Pin, + kd_seg_e: Pin, + kd_seg_f: Pin, + kd_seg_g: Pin, + kd_seg_dp: Pin, +} + +impl SegmentPins { + pub fn new( + kd_seg_a: Pin, + kd_seg_b: Pin, + kd_seg_c: Pin, + kd_seg_d: Pin, + kd_seg_e: Pin, + kd_seg_f: Pin, + kd_seg_g: Pin, + kd_seg_dp: Pin, + ) -> SegmentPins { + let mut out = SegmentPins { + kd_seg_a, + kd_seg_b, + kd_seg_c, + kd_seg_d, + kd_seg_e, + kd_seg_f, + kd_seg_g, + kd_seg_dp, + }; + + out.set_off(); + out + } + + pub fn set_off(&mut self) { + self.kd_seg_a.set_high(); + self.kd_seg_b.set_high(); + self.kd_seg_c.set_high(); + self.kd_seg_d.set_high(); + self.kd_seg_e.set_high(); + self.kd_seg_f.set_high(); + self.kd_seg_g.set_high(); + self.kd_seg_dp.set_high(); + } + + pub fn set_a(&mut self) { + self.kd_seg_a.set_low(); + } + pub fn set_b(&mut self) { + self.kd_seg_b.set_low(); + } + pub fn set_c(&mut self) { + self.kd_seg_c.set_low(); + } + pub fn set_d(&mut self) { + self.kd_seg_d.set_low(); + } + pub fn set_e(&mut self) { + self.kd_seg_e.set_low(); + } + pub fn set_f(&mut self) { + self.kd_seg_f.set_low(); + } + pub fn set_g(&mut self) { + self.kd_seg_g.set_low(); + } + pub fn set_dp(&mut self) { + self.kd_seg_dp.set_low(); + } +} + +#[derive(Clone, Copy, PartialEq, Eq)] +pub enum SegmentState { + Num(u8, bool), + Minus, + Dot, + Off, +} + +impl SegmentState { + pub fn apply(&self, seg: &mut SegmentPins) { + seg.set_off(); + match self { + SegmentState::Num(no, dp) => { + match no { + 0 => { + seg.set_a(); + seg.set_b(); + seg.set_c(); + seg.set_d(); + seg.set_e(); + seg.set_f(); + } + 1 => { + seg.set_b(); + seg.set_c(); + } + 2 => { + seg.set_a(); + seg.set_b(); + seg.set_g(); + seg.set_e(); + seg.set_d(); + } + 3 => { + seg.set_a(); + seg.set_b(); + seg.set_g(); + seg.set_c(); + seg.set_d(); + } + 4 => { + seg.set_f(); + seg.set_g(); + seg.set_b(); + seg.set_c(); + } + 5 => { + seg.set_a(); + seg.set_f(); + seg.set_g(); + seg.set_c(); + seg.set_d(); + } + 6 => { + seg.set_a(); + seg.set_f(); + seg.set_g(); + seg.set_c(); + seg.set_d(); + seg.set_e(); + } + 7 => { + seg.set_a(); + seg.set_b(); + seg.set_c(); + } + 8 => { + seg.set_a(); + seg.set_b(); + seg.set_c(); + seg.set_d(); + seg.set_e(); + seg.set_f(); + seg.set_g(); + } + 9 => { + seg.set_a(); + seg.set_b(); + seg.set_c(); + seg.set_d(); + seg.set_f(); + seg.set_g(); + } + _ => panic!("Can't dispaly {}", no), + } + if *dp { + seg.set_dp() + } + } + SegmentState::Minus => seg.set_g(), + SegmentState::Dot => seg.set_dp(), + SegmentState::Off => (), + } + } +} + +pub struct DispalyState([SegmentState; 9]); + +impl Default for DispalyState { + fn default() -> DispalyState { + DispalyState([ + SegmentState::Off, + SegmentState::Off, + SegmentState::Off, + SegmentState::Off, + SegmentState::Off, + SegmentState::Off, + SegmentState::Off, + SegmentState::Off, + SegmentState::Off, + ]) + } +} + +impl Index for DispalyState { + type Output = SegmentState; + + fn index(&self, index: usize) -> &Self::Output { + &self.0[index] + } +} + +impl IndexMut for DispalyState { + fn index_mut(&mut self, index: usize) -> &mut Self::Output { + &mut self.0[index] + } +} + +impl DispalyState { + pub fn iter_segments(&self) -> impl Iterator { + self.0.iter() + } +} + +impl DispalyState { + fn set(&mut self, seg: [SegmentState; 9]) { + self.0 = seg; + } + + fn busy(&mut self) { + self.set([ + SegmentState::Off, + SegmentState::Dot, + SegmentState::Off, + SegmentState::Off, + SegmentState::Off, + SegmentState::Off, + SegmentState::Off, + SegmentState::Off, + SegmentState::Off, + ]) + } +} + +// Show data on segment display +pub trait Show { + fn show(&self, display: &mut DispalyState); +} diff --git a/src/main.rs b/src/main.rs index f699061..5a473fc 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,18 +1,16 @@ #![no_std] #![no_main] +mod display; mod keyboard; -use calc_math::calc::StackCalc; -use calc_math::Decimal; -use core::ops::{Index, IndexMut}; +use calc_math::{calc::StackCalc, Decimal}; +use display::{DispalyState, SegmentPins, SegmentState, Show}; use keyboard::{Debounce, KeyPress, KeyReadout, Keyboard}; use arduino_hal::{ adc::channel::{ADC6, ADC7}, - hal::port::{ - PB0, PB1, PB2, PB3, PB4, PC0, PC1, PC2, PC3, PC4, PC5, PD2, PD3, PD4, PD5, PD6, PD7, - }, + hal::port::{PB3, PB4, PC1, PC2, PC3, PD2, PD3, PD4, PD7}, port::{mode::Output, Pin}, prelude::*, Adc, @@ -57,80 +55,6 @@ fn panic(info: &core::panic::PanicInfo) -> ! { } } -struct SegmentPins { - kd_seg_a: Pin, - kd_seg_b: Pin, - kd_seg_c: Pin, - kd_seg_d: Pin, - kd_seg_e: Pin, - kd_seg_f: Pin, - kd_seg_g: Pin, - kd_seg_dp: Pin, -} - -impl SegmentPins { - fn new( - kd_seg_a: Pin, - kd_seg_b: Pin, - kd_seg_c: Pin, - kd_seg_d: Pin, - kd_seg_e: Pin, - kd_seg_f: Pin, - kd_seg_g: Pin, - kd_seg_dp: Pin, - ) -> SegmentPins { - let mut out = SegmentPins { - kd_seg_a, - kd_seg_b, - kd_seg_c, - kd_seg_d, - kd_seg_e, - kd_seg_f, - kd_seg_g, - kd_seg_dp, - }; - - out.set_off(); - out - } - - fn set_off(&mut self) { - self.kd_seg_a.set_high(); - self.kd_seg_b.set_high(); - self.kd_seg_c.set_high(); - self.kd_seg_d.set_high(); - self.kd_seg_e.set_high(); - self.kd_seg_f.set_high(); - self.kd_seg_g.set_high(); - self.kd_seg_dp.set_high(); - } - - fn set_a(&mut self) { - self.kd_seg_a.set_low(); - } - fn set_b(&mut self) { - self.kd_seg_b.set_low(); - } - fn set_c(&mut self) { - self.kd_seg_c.set_low(); - } - fn set_d(&mut self) { - self.kd_seg_d.set_low(); - } - fn set_e(&mut self) { - self.kd_seg_e.set_low(); - } - fn set_f(&mut self) { - self.kd_seg_f.set_low(); - } - fn set_g(&mut self) { - self.kd_seg_g.set_low(); - } - fn set_dp(&mut self) { - self.kd_seg_dp.set_low(); - } -} - struct IOSelect<'p> { display_no: usize, pin: &'p mut Pin, @@ -184,156 +108,8 @@ impl IOPins { } } -#[derive(Clone, Copy, PartialEq, Eq)] -enum SegmentState { - Num(u8, bool), - Minus, - Dot, - Off, -} - -impl SegmentState { - fn apply(&self, seg: &mut SegmentPins) { - seg.set_off(); - match self { - SegmentState::Num(no, dp) => { - match no { - 0 => { - seg.set_a(); - seg.set_b(); - seg.set_c(); - seg.set_d(); - seg.set_e(); - seg.set_f(); - } - 1 => { - seg.set_b(); - seg.set_c(); - } - 2 => { - seg.set_a(); - seg.set_b(); - seg.set_g(); - seg.set_e(); - seg.set_d(); - } - 3 => { - seg.set_a(); - seg.set_b(); - seg.set_g(); - seg.set_c(); - seg.set_d(); - } - 4 => { - seg.set_f(); - seg.set_g(); - seg.set_b(); - seg.set_c(); - } - 5 => { - seg.set_a(); - seg.set_f(); - seg.set_g(); - seg.set_c(); - seg.set_d(); - } - 6 => { - seg.set_a(); - seg.set_f(); - seg.set_g(); - seg.set_c(); - seg.set_d(); - seg.set_e(); - } - 7 => { - seg.set_a(); - seg.set_b(); - seg.set_c(); - } - 8 => { - seg.set_a(); - seg.set_b(); - seg.set_c(); - seg.set_d(); - seg.set_e(); - seg.set_f(); - seg.set_g(); - } - 9 => { - seg.set_a(); - seg.set_b(); - seg.set_c(); - seg.set_d(); - seg.set_f(); - seg.set_g(); - } - _ => panic!("Can't dispaly {}", no), - } - if *dp { - seg.set_dp() - } - } - SegmentState::Minus => seg.set_g(), - SegmentState::Dot => seg.set_dp(), - SegmentState::Off => (), - } - } -} - -struct DispalyState([SegmentState; 9]); - -impl Default for DispalyState { - fn default() -> DispalyState { - DispalyState([ - SegmentState::Off, - SegmentState::Off, - SegmentState::Off, - SegmentState::Off, - SegmentState::Off, - SegmentState::Off, - SegmentState::Off, - SegmentState::Off, - SegmentState::Off, - ]) - } -} - -impl Index for DispalyState { - type Output = SegmentState; - - fn index(&self, index: usize) -> &Self::Output { - &self.0[index] - } -} - -impl IndexMut for DispalyState { - fn index_mut(&mut self, index: usize) -> &mut Self::Output { - &mut self.0[index] - } -} - -impl DispalyState { - fn set(&mut self, seg: [SegmentState; 9]) { - self.0 = seg; - } - - fn busy(&mut self) { - self.set([ - SegmentState::Off, - SegmentState::Dot, - SegmentState::Off, - SegmentState::Off, - SegmentState::Off, - SegmentState::Off, - SegmentState::Off, - SegmentState::Off, - SegmentState::Off, - ]) - } -} - #[derive(Default)] -struct NumberInput { +pub struct NumberInput { minus: bool, significant: [u8; 5], minus_exponent: bool, @@ -344,10 +120,11 @@ struct NumberInput { } impl NumberInput { - fn reset(&mut self) { + pub fn reset(&mut self) { *self = Self::default(); } - fn input_significant(&mut self, val: u8) -> Result<(), ()> { + + pub fn input_significant(&mut self, val: u8) -> Result<(), ()> { if val > 9 { panic!("Bad significatn val"); } @@ -359,7 +136,7 @@ impl NumberInput { return Ok(()); } - fn input_exponent(&mut self, val: u8) -> Result<(), ()> { + pub fn input_exponent(&mut self, val: u8) -> Result<(), ()> { if val > 9 { panic!("Bad exponent val"); } @@ -371,7 +148,7 @@ impl NumberInput { Ok(()) } - fn input(&mut self, val: u8) -> Result<(), ()> { + pub fn input(&mut self, val: u8) -> Result<(), ()> { if self.enter_exponent { self.input_exponent(val) } else { @@ -379,13 +156,13 @@ impl NumberInput { } } - fn toggle_enter_exponent(&mut self) { + pub fn toggle_enter_exponent(&mut self) { self.significant_pos = 0; self.exponent_pos = 0; self.enter_exponent = !self.enter_exponent; } - fn toggle_minus(&mut self) { + pub fn toggle_minus(&mut self) { if self.enter_exponent { self.minus_exponent = !self.minus_exponent; } else { @@ -393,7 +170,7 @@ impl NumberInput { } } - fn to_decimal(&self) -> Decimal<5, u8> { + pub fn to_decimal(&self) -> Decimal<5, u8> { Decimal::new( self.minus, self.significant, @@ -402,7 +179,7 @@ impl NumberInput { ) } - fn set_decimal(&mut self, dec: Decimal<5, u8>) { + pub fn set_decimal(&mut self, dec: Decimal<5, u8>) { let (minus, significant, minus_exponent, exponent) = dec.into_parts(); self.minus = minus; self.significant = significant; @@ -412,11 +189,6 @@ impl NumberInput { } } -// Show data on segment display -trait Show { - fn show(&self, display: &mut DispalyState); -} - impl Show for NumberInput { fn show(&self, display: &mut DispalyState) { display[0] = if self.minus { @@ -492,7 +264,7 @@ fn main() -> ! { loop { let mut last_key_readout: Option = None; - for (mut io_select, ss) in io.iter_mut().zip(display.0.iter()) { + for (mut io_select, ss) in io.iter_mut().zip(display.iter_segments()) { ss.apply(&mut seg); io_select.set_on(); arduino_hal::delay_ms(1);