use lcd::*; use std::string::String; use std::vec::Vec; pub struct BufferHardware { pub commands: Vec, pub input: Option>, pub mode: FunctionMode, } impl BufferHardware { pub fn command(&mut self, cmd: String) { self.commands.push(cmd); } } impl Hardware for BufferHardware { fn rs(&mut self, bit: bool) { self.command(format!("R/S {}", bit)); } fn enable(&mut self, bit: bool) { self.command(format!("EN {}", bit)); } fn data(&mut self, data: u8) { let str = match self.mode { FunctionMode::Bit4 => format!("DATA 0b{:04b}", data), FunctionMode::Bit8 => format!("DATA 0b{:08b}", data), }; self.command(str); } fn mode(&self) -> FunctionMode { self.mode } fn can_read(&self) -> bool { self.input.is_some() } fn rw(&mut self, bit: bool) { self.command(format!("RW {}", bit)); } fn read_data(&mut self) -> u8 { self.command("IS BUSY?".to_string()); self.input.as_mut().unwrap().remove(0) } } impl Delay for BufferHardware { fn delay_us(&mut self, delay: u32) { self.command(format!("DELAY {}", delay)); } } pub fn test( mode: FunctionMode, input: Option>, ops: impl Fn(&mut Display), ) -> Vec { let hw = BufferHardware { commands: vec![], input, mode, }; let mut display = Display::new(hw); ops(&mut display); display.unwrap().commands }