use super::sipo;
pub struct FilledSipo {
shift_register: sipo::Sipo,
data: [u8; 2],
update_step: u8
}
impl FilledSipo {
pub fn create(shift_register: sipo::Sipo) -> FilledSipo {
FilledSipo {
shift_register,
data: [0,0],
update_step: 0
}
}
pub fn set_data(&mut self, data: [u8; 2]) {
self.data = data;
self.reset();
}
#[inline]
pub fn push_block(&mut self) {
while !self.step() {
}
}
pub fn step(&mut self) -> bool {
let mut index = 0;
let mut move_factor = self.update_step;
if self.update_step >= 8 {
index = 1;
move_factor -= 8;
}
self.shift_register.shift_value((self.data[index] >> (7 - move_factor)) & 1 == 1);
if self.update_step >= 15 {
self.update_step = 0;
self.shift_register.show();
return true;
}
self.update_step += 1;
return false;
}
#[inline]
pub fn reset(&mut self) {
self.update_step = 0;
}
pub fn clear(&mut self) {
self.set_data([0, 0]);
self.reset();
}
}