use super::seven_segment; use super::filled_sipo; pub struct FilledSevenSegment { seven_segment: seven_segment::SevenSegment, sipo: filled_sipo::FilledSipo, digits: [Option; 4], hide: u8, update_step: usize } impl FilledSevenSegment { pub fn create(seven_segment: seven_segment::SevenSegment, sipo: filled_sipo::FilledSipo) -> FilledSevenSegment { FilledSevenSegment { seven_segment, sipo, digits: [None, None, None, None], hide: 0, update_step: 0 } } #[inline] pub fn hide_digit(&mut self, digit_index: usize) { self.hide |= 1 << digit_index; } #[inline] pub fn show_digit(&mut self, digit_index: usize) { self.hide &= !(1 << digit_index); } #[inline] pub fn hide_all_digits(&mut self) { self.hide = 0xFF; } #[inline] pub fn show_all_digits(&mut self) { self.hide = 0; } pub fn set_digit(&mut self, digit_index: usize, digit: Option) { if digit_index < 4 { self.digits[digit_index] = digit; } } pub fn set_number(&mut self, number: [u8; 4]) { for (i, digit) in number.iter().enumerate() { self.digits[i] = Some(*digit); } } #[inline] pub fn show_number_block(&mut self) { while !self.step() {} } fn fill_digit(&mut self, digit_index: usize) { if digit_index > 3 { return } if (self.hide & (1 << digit_index)) != 0 { self.sipo.clear(); return } if let Some(digit) = self.digits[digit_index] { self.seven_segment.fill_digit(&mut self.sipo, digit, digit_index); } else { self.sipo.clear(); } } pub fn step(&mut self) -> bool { if self.update_step == 0 { self.fill_digit(0); self.update_step = 1; } if self.sipo.step() { self.update_step += 1; if self.update_step <= self.seven_segment.digits().into() { self.fill_digit(self.update_step - 1); } } if self.update_step > self.seven_segment.digits().into() { self.update_step = 0; return true; } return false; } #[inline] pub fn reset(&mut self) { self.update_step = 0; } #[inline] pub fn clear(&mut self) { self.digits = [None, None, None, None]; } }