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

View File

@@ -9,7 +9,7 @@ use calc_math::{
calc::{StackCalc, StackCalcError},
Decimal,
};
use display::{DispalyState, SegmentPins, SegmentState, Show};
use display::{DispalyState, SegmentPins, Show};
use keyboard::{Debounce, KeyPress, KeyReadout, Keyboard};
use arduino_hal::{
@@ -190,28 +190,24 @@ impl NumberInput {
impl Show for NumberInput {
fn show(&self, display: &mut DispalyState) {
display.empty();
display.off();
display[1].dp();
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 {
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 {
display[DISPLAY_SEGMENT_SIG_MINUS + 1 + i] =
SegmentState::Num(self.significant[i], i == 0);
display[DISPLAY_SEGMENT_SIG_MINUS + 1 + i].num(self.significant[i]);
}
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 {
display[DISPLAY_SEGMENT_EXP_MINUS + 1 + i] = SegmentState::Num(self.exponent[i], false);
display[DISPLAY_SEGMENT_EXP_MINUS + 1 + i].num(self.exponent[i]);
}
}
}