diff --git a/Cargo.toml b/Cargo.toml index e106fd1..f03bffd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,7 +11,7 @@ edition = "2018" [dependencies] -display-interface = "0.4.0" +display-interface = "0.4.1" embedded-hal = "0.2.4" [dependencies.embedded-graphics] diff --git a/src/graphics.rs b/src/graphics.rs index 7a73acd..9af929a 100644 --- a/src/graphics.rs +++ b/src/graphics.rs @@ -1,6 +1,6 @@ use crate::{Ili9341, OutputPin}; -use core::{fmt::Debug, iter}; +use core::iter; use embedded_graphics::{ drawable::Pixel, @@ -14,13 +14,12 @@ use embedded_graphics::{ DrawTarget, }; -impl DrawTarget for Ili9341 +impl DrawTarget for Ili9341 where IFACE: display_interface::WriteOnlyDataCommand, - RESET: OutputPin, - PinE: Debug, + RESET: OutputPin, { - type Error = crate::Error; + type Error = display_interface::DisplayError; fn size(&self) -> Size { Size::new(self.width as u32, self.height as u32) diff --git a/src/lib.rs b/src/lib.rs index beca9ed..95fefa6 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -12,6 +12,8 @@ use display_interface::WriteOnlyDataCommand; pub use embedded_hal::spi::MODE_0 as SPI_MODE; +pub use display_interface::DisplayError; + /// Trait that defines display size information pub trait DisplaySize { /// Width in pixels @@ -36,12 +38,6 @@ impl DisplaySize for DisplaySize320x480 { const HEIGHT: usize = 480; } -#[derive(Debug)] -pub enum Error { - Interface, - OutputPin(PinE), -} - /// The default orientation is Portrait pub enum Orientation { Portrait, @@ -74,10 +70,10 @@ pub struct Ili9341 { mode: Orientation, } -impl Ili9341 +impl Ili9341 where IFACE: WriteOnlyDataCommand, - RESET: OutputPin, + RESET: OutputPin, { pub fn new( interface: IFACE, @@ -85,7 +81,7 @@ where delay: &mut DELAY, mode: Orientation, _display_size: SIZE, - ) -> Result> + ) -> Result where DELAY: DelayMs, SIZE: DisplaySize, @@ -99,10 +95,13 @@ where }; // Do hardware reset by holding reset low for at least 10us - ili9341.reset.set_low().map_err(Error::OutputPin)?; + ili9341.reset.set_low().map_err(|_| DisplayError::RSError)?; delay.delay_ms(1); // Set high for normal operation - ili9341.reset.set_high().map_err(Error::OutputPin)?; + ili9341 + .reset + .set_high() + .map_err(|_| DisplayError::RSError)?; // Wait 5ms after reset before sending commands // and 120ms before sending Sleep Out @@ -130,23 +129,17 @@ where Ok(ili9341) } - fn command(&mut self, cmd: Command, args: &[u8]) -> Result<(), Error> { - self.interface - .send_commands(U8Iter(&mut once(cmd as u8))) - .map_err(|_| Error::Interface)?; - self.interface - .send_data(U8Iter(&mut args.iter().cloned())) - .map_err(|_| Error::Interface) + fn command(&mut self, cmd: Command, args: &[u8]) -> Result<(), DisplayError> { + self.interface.send_commands(U8Iter(&mut once(cmd as u8)))?; + self.interface.send_data(U8Iter(&mut args.iter().cloned())) } - fn write_iter>(&mut self, data: I) -> Result<(), Error> { + fn write_iter>(&mut self, data: I) -> Result<(), DisplayError> { self.command(Command::MemoryWrite, &[])?; - self.interface - .send_data(U16BEIter(&mut data.into_iter())) - .map_err(|_| Error::Interface) + self.interface.send_data(U16BEIter(&mut data.into_iter())) } - fn set_window(&mut self, x0: u16, y0: u16, x1: u16, y1: u16) -> Result<(), Error> { + fn set_window(&mut self, x0: u16, y0: u16, x1: u16, y1: u16) -> Result<(), DisplayError> { self.command( Command::ColumnAddressSet, &[ @@ -164,8 +157,7 @@ where (y1 >> 8) as u8, (y1 & 0xff) as u8, ], - )?; - Ok(()) + ) } /// Configures the screen for hardware-accelerated vertical scrolling. @@ -173,7 +165,7 @@ where &mut self, fixed_top_lines: u16, fixed_bottom_lines: u16, - ) -> Result> { + ) -> Result { let height = match self.mode { Orientation::Landscape | Orientation::LandscapeFlipped => self.width, Orientation::Portrait | Orientation::PortraitFlipped => self.height, @@ -199,7 +191,7 @@ where &mut self, scroller: &mut Scroller, num_lines: u16, - ) -> Result<(), Error> { + ) -> Result<(), DisplayError> { scroller.top_offset += num_lines; if scroller.top_offset > (scroller.height - scroller.fixed_bottom_lines) { scroller.top_offset = scroller.fixed_top_lines @@ -231,7 +223,7 @@ where x1: u16, y1: u16, data: I, - ) -> Result<(), Error> { + ) -> Result<(), DisplayError> { self.set_window(x0, y0, x1, y1)?; self.write_iter(data) } @@ -252,13 +244,13 @@ where x1: u16, y1: u16, data: &[u16], - ) -> Result<(), Error> { + ) -> Result<(), DisplayError> { self.set_window(x0, y0, x1, y1)?; self.write_iter(data.iter().cloned()) } /// Change the orientation of the screen - pub fn set_orientation(&mut self, mode: Orientation) -> Result<(), Error> { + pub fn set_orientation(&mut self, mode: Orientation) -> Result<(), DisplayError> { let was_landscape = match self.mode { Orientation::Landscape | Orientation::LandscapeFlipped => true, Orientation::Portrait | Orientation::PortraitFlipped => false,