blob: 0e7c63eccbb2a32f32e7982904e6ebc2d478ff5a [file] [log] [blame]
use crate::gpio::GpioWrite;
use crate::result::TockResult;
pub struct ShiftRegister<'a> {
data_pin: &'a GpioWrite<'a>,
clock_pin: &'a GpioWrite<'a>,
latch_pin: &'a GpioWrite<'a>,
}
impl<'a> ShiftRegister<'a> {
pub fn new(
data_pin: &'a GpioWrite<'a>,
clock_pin: &'a GpioWrite<'a>,
latch_pin: &'a GpioWrite<'a>,
) -> ShiftRegister<'a> {
ShiftRegister {
data_pin,
clock_pin,
latch_pin,
}
}
pub fn write_bits(&mut self, values: &[bool]) -> TockResult<()> {
for i in values {
self.push_bit(*i)?;
}
self.display()
}
fn push_bit(&mut self, value: bool) -> TockResult<()> {
if value {
self.data_pin.set_high()
} else {
self.data_pin.set_low()
}?;
self.clock_pin.set_high()?;
self.clock_pin.set_low()
}
fn display(&mut self) -> TockResult<()> {
self.latch_pin.set_high()?;
self.latch_pin.set_low()
}
}