1#![no_std]
2
3extern crate embedded_hal;
4
5use embedded_hal::digital::OutputPin;
6
7pub struct EightSegment<'a> {
55 pub high_on: bool,
56 pub seg_a: &'a mut OutputPin,
57 pub seg_b: &'a mut OutputPin,
58 pub seg_c: &'a mut OutputPin,
59 pub seg_d: &'a mut OutputPin,
60 pub seg_e: &'a mut OutputPin,
61 pub seg_f: &'a mut OutputPin,
62 pub seg_g: &'a mut OutputPin,
63 pub seg_p: &'a mut OutputPin,
64}
65
66impl<'a> EightSegment<'a> {
67 pub fn blank(&mut self) {
68 if self.high_on {self.seg_a.set_low()} else {self.seg_a.set_high()};
69 if self.high_on {self.seg_b.set_low()} else {self.seg_b.set_high()};
70 if self.high_on {self.seg_c.set_low()} else {self.seg_c.set_high()};
71 if self.high_on {self.seg_d.set_low()} else {self.seg_d.set_high()};
72 if self.high_on {self.seg_e.set_low()} else {self.seg_e.set_high()};
73 if self.high_on {self.seg_f.set_low()} else {self.seg_f.set_high()};
74 if self.high_on {self.seg_g.set_low()} else {self.seg_g.set_high()};
75 if self.high_on {self.seg_p.set_low()} else {self.seg_p.set_high()};
76 }
77
78 pub fn set_segments(&mut self,
79 seg_a_on: bool,
80 seg_b_on: bool,
81 seg_c_on: bool,
82 seg_d_on: bool,
83 seg_e_on: bool,
84 seg_f_on: bool,
85 seg_g_on: bool,
86 seg_p_on: bool) {
87
88 if seg_a_on ^ !self.high_on {self.seg_a.set_high()} else {self.seg_a.set_low()};
89 if seg_b_on ^ !self.high_on {self.seg_b.set_high()} else {self.seg_b.set_low()};
90 if seg_c_on ^ !self.high_on {self.seg_c.set_high()} else {self.seg_c.set_low()};
91 if seg_d_on ^ !self.high_on {self.seg_d.set_high()} else {self.seg_d.set_low()};
92 if seg_e_on ^ !self.high_on {self.seg_e.set_high()} else {self.seg_e.set_low()};
93 if seg_f_on ^ !self.high_on {self.seg_f.set_high()} else {self.seg_f.set_low()};
94 if seg_g_on ^ !self.high_on {self.seg_g.set_high()} else {self.seg_g.set_low()};
95 if seg_p_on ^ !self.high_on {self.seg_p.set_high()} else {self.seg_p.set_low()};
96 }
97
98 pub fn display(&mut self, count: u8, seg_p_on: bool) {
99 let (seg_a_on, seg_f_on, seg_b_on, seg_g_on, seg_e_on, seg_c_on, seg_d_on) = match count {
100 0x0 => (true, true, true, false, true, true, true),
101 0x1 => (false, false, true, false, false, true, false),
102 0x2 => (true, false, true, true, true, false, true),
103 0x3 => (true, false, true, true, false, true, true),
104 0x4 => (false, true, true, true, false, true, false),
105 0x5 => (true, true, false, true, false, true, true),
106 0x6 => (true, true, false, true, true, true, true),
107 0x7 => (true, false, true, false, false, true, false),
108 0x8 => (true, true, true, true, true, true, true),
109 0x9 => (true, true, true, true, false, true, false),
110 0xA => (true, true, true, false, true, true, false),
111 0xB => (false, true, false, true, true, true, true),
112 0xC => (false, false, false, true, true, false, true),
113 0xD => (false, false, true, true, true, true, true),
114 0xE => (true, true, false, true, true, false, true),
115 0xF => (true, true, false, true, true, false, false),
116 _ => (true, true, true, true, true, true, true),
117 };
118
119 self.set_segments(
120 seg_a_on,
121 seg_b_on,
122 seg_c_on,
123 seg_d_on,
124 seg_e_on,
125 seg_f_on,
126 seg_g_on,
127 seg_p_on
128 );
129 }
130}