#![no_std]
use embedded_hal as hal;
use hal::digital::v2::OutputPin;
pub struct SevenSeg<A, B, C, D, E, F, G> {
seg_a: A,
seg_b: B,
seg_c: C,
seg_d: D,
seg_e: E,
seg_f: F,
seg_g: G,
}
impl<A, B, C, D, E, F, G> SevenSeg<A, B, C, D, E, F, G>
where
A: OutputPin,
B: OutputPin,
C: OutputPin,
D: OutputPin,
E: OutputPin,
F: OutputPin,
G: OutputPin,
{
pub fn new(seg_a: A, seg_b: B, seg_c: C, seg_d: D, seg_e: E, seg_f: F, seg_g: G) -> Self {
Self {
seg_a,
seg_b,
seg_c,
seg_d,
seg_e,
seg_f,
seg_g,
}
}
pub fn release(self) -> (A, B, C, D, E, F, G) {
(
self.seg_a, self.seg_b, self.seg_c, self.seg_d, self.seg_e, self.seg_f, self.seg_g,
)
}
pub fn clear(&mut self) -> Result<(), ()> {
self.seg_a(false)?;
self.seg_b(false)?;
self.seg_c(false)?;
self.seg_d(false)?;
self.seg_e(false)?;
self.seg_f(false)?;
self.seg_g(false)
}
pub fn seg_a(&mut self, state: bool) -> Result<(), ()> {
if state {
self.seg_a.set_high().map_err(|_| ())
} else {
self.seg_a.set_low().map_err(|_| ())
}
}
pub fn seg_b(&mut self, state: bool) -> Result<(), ()> {
if state {
self.seg_b.set_high().map_err(|_| ())
} else {
self.seg_b.set_low().map_err(|_| ())
}
}
pub fn seg_c(&mut self, state: bool) -> Result<(), ()> {
if state {
self.seg_c.set_high().map_err(|_| ())
} else {
self.seg_c.set_low().map_err(|_| ())
}
}
pub fn seg_d(&mut self, state: bool) -> Result<(), ()> {
if state {
self.seg_d.set_high().map_err(|_| ())
} else {
self.seg_d.set_low().map_err(|_| ())
}
}
pub fn seg_e(&mut self, state: bool) -> Result<(), ()> {
if state {
self.seg_e.set_high().map_err(|_| ())
} else {
self.seg_e.set_low().map_err(|_| ())
}
}
pub fn seg_f(&mut self, state: bool) -> Result<(), ()> {
if state {
self.seg_f.set_high().map_err(|_| ())
} else {
self.seg_f.set_low().map_err(|_| ())
}
}
pub fn seg_g(&mut self, state: bool) -> Result<(), ()> {
if state {
self.seg_g.set_high().map_err(|_| ())
} else {
self.seg_g.set_low().map_err(|_| ())
}
}
pub fn display(&mut self, num: u8) -> Result<(), ()> {
match num {
0 => {
self.seg_a(true)?;
self.seg_b(true)?;
self.seg_c(true)?;
self.seg_d(true)?;
self.seg_e(true)?;
self.seg_f(true)?;
self.seg_g(false)
}
1 => {
self.seg_a(false)?;
self.seg_b(false)?;
self.seg_c(false)?;
self.seg_d(false)?;
self.seg_e(true)?;
self.seg_f(true)?;
self.seg_g(false)
}
2 => {
self.seg_a(true)?;
self.seg_b(true)?;
self.seg_c(false)?;
self.seg_d(true)?;
self.seg_e(true)?;
self.seg_f(false)?;
self.seg_g(true)
}
3 => {
self.seg_a(true)?;
self.seg_b(false)?;
self.seg_c(false)?;
self.seg_d(true)?;
self.seg_e(true)?;
self.seg_f(true)?;
self.seg_g(true)
}
4 => {
self.seg_a(false)?;
self.seg_b(false)?;
self.seg_c(true)?;
self.seg_d(false)?;
self.seg_e(true)?;
self.seg_f(true)?;
self.seg_g(true)
}
5 => {
self.seg_a(true)?;
self.seg_b(false)?;
self.seg_c(true)?;
self.seg_d(true)?;
self.seg_e(false)?;
self.seg_f(true)?;
self.seg_g(true)
}
6 => {
self.seg_a(true)?;
self.seg_b(true)?;
self.seg_c(true)?;
self.seg_d(true)?;
self.seg_e(false)?;
self.seg_f(true)?;
self.seg_g(true)
}
7 => {
self.seg_a(false)?;
self.seg_b(false)?;
self.seg_c(false)?;
self.seg_d(true)?;
self.seg_e(true)?;
self.seg_f(true)?;
self.seg_g(false)
}
8 => {
self.seg_a(true)?;
self.seg_b(true)?;
self.seg_c(true)?;
self.seg_d(true)?;
self.seg_e(true)?;
self.seg_f(true)?;
self.seg_g(true)
}
9 => {
self.seg_a(true)?;
self.seg_b(false)?;
self.seg_c(true)?;
self.seg_d(true)?;
self.seg_e(true)?;
self.seg_f(true)?;
self.seg_g(true)
}
10 => {
self.seg_a(false)?;
self.seg_b(true)?;
self.seg_c(true)?;
self.seg_d(true)?;
self.seg_e(true)?;
self.seg_f(true)?;
self.seg_g(true)
}
11 => {
self.seg_a(true)?;
self.seg_b(true)?;
self.seg_c(true)?;
self.seg_d(false)?;
self.seg_e(false)?;
self.seg_f(true)?;
self.seg_g(true)
}
12 => {
self.seg_a(true)?;
self.seg_b(true)?;
self.seg_c(true)?;
self.seg_d(true)?;
self.seg_e(false)?;
self.seg_f(false)?;
self.seg_g(false)
}
13 => {
self.seg_a(true)?;
self.seg_b(true)?;
self.seg_c(false)?;
self.seg_d(false)?;
self.seg_e(true)?;
self.seg_f(true)?;
self.seg_g(true)
}
14 => {
self.seg_a(true)?;
self.seg_b(true)?;
self.seg_c(true)?;
self.seg_d(true)?;
self.seg_e(false)?;
self.seg_f(false)?;
self.seg_g(true)
}
15 => {
self.seg_a(false)?;
self.seg_b(true)?;
self.seg_c(true)?;
self.seg_d(true)?;
self.seg_e(false)?;
self.seg_f(false)?;
self.seg_g(true)
}
_ => self.clear(),
}
}
}