new segment state

This commit is contained in:
2025-07-18 20:31:23 +01:00
parent ca52fa9b14
commit 59a001b94c
2 changed files with 198 additions and 173 deletions

View File

@@ -82,136 +82,183 @@ impl SegmentPins {
} }
#[derive(Clone, Copy, PartialEq, Eq)] #[derive(Clone, Copy, PartialEq, Eq)]
pub enum SegmentState { pub struct Segment {
Off, a: bool,
Num(u8, bool), b: bool,
Minus, c: bool,
Prompt(bool), d: bool,
Dot, e: bool,
E, f: bool,
g: bool,
dp: bool,
}
impl Segment {
pub fn new() -> Segment {
Segment {
a: false,
b: false,
c: false,
d: false,
e: false,
f: false,
g: false,
dp: false,
}
} }
impl SegmentState {
pub fn apply(&self, seg: &mut SegmentPins) { pub fn apply(&self, seg: &mut SegmentPins) {
seg.set_off(); seg.set_off();
match self { if self.a {
SegmentState::Off => (), seg.set_a();
SegmentState::Num(no, dp) => { }
if self.b {
seg.set_b();
}
if self.c {
seg.set_c();
}
if self.d {
seg.set_d();
}
if self.e {
seg.set_e();
}
if self.f {
seg.set_f();
}
if self.g {
seg.set_g();
}
if self.dp {
seg.set_dp();
}
}
pub fn off(&mut self) -> &mut Self {
self.a = false;
self.b = false;
self.c = false;
self.d = false;
self.e = false;
self.f = false;
self.g = false;
self.dp = false;
self
}
pub fn num(&mut self, no: u8) -> &mut Self {
match no { match no {
0 => { 0 => {
seg.set_a(); self.a = true;
seg.set_b(); self.b = true;
seg.set_c(); self.c = true;
seg.set_d(); self.d = true;
seg.set_e(); self.e = true;
seg.set_f(); self.f = true;
} }
1 => { 1 => {
seg.set_b(); self.b = true;
seg.set_c(); self.c = true;
} }
2 => { 2 => {
seg.set_a(); self.a = true;
seg.set_b(); self.b = true;
seg.set_g(); self.g = true;
seg.set_e(); self.e = true;
seg.set_d(); self.d = true;
} }
3 => { 3 => {
seg.set_a(); self.a = true;
seg.set_b(); self.b = true;
seg.set_g(); self.g = true;
seg.set_c(); self.c = true;
seg.set_d(); self.d = true;
} }
4 => { 4 => {
seg.set_f(); self.f = true;
seg.set_g(); self.g = true;
seg.set_b(); self.b = true;
seg.set_c(); self.c = true;
} }
5 => { 5 => {
seg.set_a(); self.a = true;
seg.set_f(); self.f = true;
seg.set_g(); self.g = true;
seg.set_c(); self.c = true;
seg.set_d(); self.d = true;
} }
6 => { 6 => {
seg.set_a(); self.a = true;
seg.set_f(); self.f = true;
seg.set_g(); self.g = true;
seg.set_c(); self.c = true;
seg.set_d(); self.d = true;
seg.set_e(); self.e = true;
} }
7 => { 7 => {
seg.set_a(); self.a = true;
seg.set_b(); self.b = true;
seg.set_c(); self.c = true;
} }
8 => { 8 => {
seg.set_a(); self.a = true;
seg.set_b(); self.b = true;
seg.set_c(); self.c = true;
seg.set_d(); self.d = true;
seg.set_e(); self.e = true;
seg.set_f(); self.f = true;
seg.set_g(); self.g = true;
} }
9 => { 9 => {
seg.set_a(); self.a = true;
seg.set_b(); self.b = true;
seg.set_c(); self.c = true;
seg.set_d(); self.d = true;
seg.set_f(); self.f = true;
seg.set_g(); self.g = true;
} }
_ => panic!("SegmentState::Num out of range"), _ => panic!("Num out of range"),
} }
if *dp { self
seg.set_dp()
} }
pub fn dp(&mut self) -> &mut Self {
self.dp = true;
self
} }
SegmentState::Minus => seg.set_g(),
SegmentState::Dot => seg.set_dp(), pub fn minus(&mut self) -> &mut Self {
SegmentState::Prompt(dot) => { self.g = true;
seg.set_d(); self
if *dot {
seg.set_dp()
}
}
SegmentState::E => {
seg.set_a();
seg.set_d();
seg.set_e();
seg.set_f();
seg.set_g();
} }
pub fn prompt(&mut self) -> &mut Self {
self.d = true;
self
} }
pub fn e(&mut self) -> &mut Self {
self.a = true;
self.d = true;
self.e = true;
self.f = true;
self.g = true;
self
} }
} }
pub struct DispalyState([SegmentState; DISPLAY_SEGMENTS]); impl Default for Segment {
fn default() -> Self {
Segment::new()
}
}
impl Default for DispalyState { #[derive(Default)]
fn default() -> DispalyState { pub struct DispalyState([Segment; DISPLAY_SEGMENTS]);
DispalyState([
SegmentState::Off,
SegmentState::Off,
SegmentState::Off,
SegmentState::Off,
SegmentState::Off,
SegmentState::Off,
SegmentState::Off,
SegmentState::Off,
SegmentState::Off,
])
}
}
impl Index<usize> for DispalyState { impl Index<usize> for DispalyState {
type Output = SegmentState; type Output = Segment;
fn index(&self, index: usize) -> &Self::Output { fn index(&self, index: usize) -> &Self::Output {
&self.0[index] &self.0[index]
@@ -225,50 +272,32 @@ impl IndexMut<usize> for DispalyState {
} }
impl DispalyState { impl DispalyState {
pub fn iter_segments(&self) -> impl Iterator<Item = &SegmentState> { pub fn iter_segments(&self) -> impl Iterator<Item = &Segment> {
self.0.iter() self.0.iter()
} }
pub fn iter_segments_mut(&mut self) -> impl Iterator<Item = &mut Segment> {
self.0.iter_mut()
}
} }
impl DispalyState { impl DispalyState {
fn set(&mut self, seg: [SegmentState; DISPLAY_SEGMENTS]) { pub fn off(&mut self) {
self.0 = seg; for seg in self.iter_segments_mut() {
seg.off();
} }
pub fn empty(&mut self) {
self.set([
SegmentState::Off,
SegmentState::Dot,
SegmentState::Off,
SegmentState::Off,
SegmentState::Off,
SegmentState::Off,
SegmentState::Off,
SegmentState::Off,
SegmentState::Off,
])
}
pub fn prompt(&mut self, segment: usize) {
self[segment] = if segment == 1 {
SegmentState::Prompt(true)
} else {
SegmentState::Prompt(false)
};
} }
pub fn error(&mut self) { pub fn error(&mut self) {
self.set([ self[0].off();
SegmentState::Off, self[1].off();
SegmentState::Off, self[2].off();
SegmentState::Off, self[3].off().minus();
SegmentState::Minus, self[4].off().e();
SegmentState::E, self[5].off().minus();
SegmentState::Minus, self[6].off();
SegmentState::Off, self[7].off();
SegmentState::Off, self[8].off();
SegmentState::Off,
])
} }
} }

View File

@@ -9,7 +9,7 @@ use calc_math::{
calc::{StackCalc, StackCalcError}, calc::{StackCalc, StackCalcError},
Decimal, Decimal,
}; };
use display::{DispalyState, SegmentPins, SegmentState, Show}; use display::{DispalyState, SegmentPins, Show};
use keyboard::{Debounce, KeyPress, KeyReadout, Keyboard}; use keyboard::{Debounce, KeyPress, KeyReadout, Keyboard};
use arduino_hal::{ use arduino_hal::{
@@ -190,28 +190,24 @@ impl NumberInput {
impl Show for NumberInput { impl Show for NumberInput {
fn show(&self, display: &mut DispalyState) { fn show(&self, display: &mut DispalyState) {
display.empty(); display.off();
display[1].dp();
if !self.enter_exponent && self.significant_pos < DISPLAY_SEGMENTS_SIG { if !self.enter_exponent && self.significant_pos < DISPLAY_SEGMENTS_SIG {
display.prompt(self.significant_pos + 1); display[self.significant_pos + 1].prompt();
} else if self.enter_exponent && self.exponent_pos < DISPLAY_SEGMENTS_EXP { } else if self.enter_exponent && self.exponent_pos < DISPLAY_SEGMENTS_EXP {
display.prompt(DISPLAY_SEGMENTS_SIG + 2 + self.exponent_pos); display[DISPLAY_SEGMENTS_SIG + 2 + self.exponent_pos].prompt();
}
if self.minus {
display[DISPLAY_SEGMENT_SIG_MINUS].minus();
} }
display[DISPLAY_SEGMENT_SIG_MINUS] = if self.minus {
SegmentState::Minus
} else {
SegmentState::Off
};
for i in 0..self.significant_pos { for i in 0..self.significant_pos {
display[DISPLAY_SEGMENT_SIG_MINUS + 1 + i] = display[DISPLAY_SEGMENT_SIG_MINUS + 1 + i].num(self.significant[i]);
SegmentState::Num(self.significant[i], i == 0); }
if self.minus_exponent {
display[DISPLAY_SEGMENT_EXP_MINUS].minus();
} }
display[DISPLAY_SEGMENT_EXP_MINUS] = if self.minus_exponent {
SegmentState::Minus
} else {
SegmentState::Off
};
for i in 0..self.exponent_pos { for i in 0..self.exponent_pos {
display[DISPLAY_SEGMENT_EXP_MINUS + 1 + i] = SegmentState::Num(self.exponent[i], false); display[DISPLAY_SEGMENT_EXP_MINUS + 1 + i].num(self.exponent[i]);
} }
} }
} }