|
|
|
@ -84,6 +84,8 @@ where
|
|
|
|
|
spi: &mut SPI,
|
|
|
|
|
delay: &mut DELAY,
|
|
|
|
|
) -> Result<(), SPI::Error> {
|
|
|
|
|
self.wait_until_idle();
|
|
|
|
|
|
|
|
|
|
self.interface.reset(delay);
|
|
|
|
|
|
|
|
|
|
// 3 Databytes:
|
|
|
|
@ -127,7 +129,6 @@ where
|
|
|
|
|
|
|
|
|
|
self.set_lut(spi, None)?;
|
|
|
|
|
|
|
|
|
|
self.wait_until_idle();
|
|
|
|
|
Ok(())
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -179,22 +180,20 @@ where
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn sleep(&mut self, spi: &mut SPI) -> Result<(), SPI::Error> {
|
|
|
|
|
self.wait_until_idle();
|
|
|
|
|
|
|
|
|
|
// 0x00 for Normal mode (Power on Reset), 0x01 for Deep Sleep Mode
|
|
|
|
|
//TODO: is 0x00 needed here or would 0x01 be even more efficient?
|
|
|
|
|
self.interface
|
|
|
|
|
.cmd_with_data(spi, Command::DEEP_SLEEP_MODE, &[0x00])?;
|
|
|
|
|
|
|
|
|
|
self.wait_until_idle();
|
|
|
|
|
Ok(())
|
|
|
|
|
.cmd_with_data(spi, Command::DEEP_SLEEP_MODE, &[0x00])
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn update_frame(&mut self, spi: &mut SPI, buffer: &[u8]) -> Result<(), SPI::Error> {
|
|
|
|
|
self.wait_until_idle();
|
|
|
|
|
|
|
|
|
|
self.use_full_frame(spi)?;
|
|
|
|
|
self.interface
|
|
|
|
|
.cmd_with_data(spi, Command::WRITE_RAM, buffer)?;
|
|
|
|
|
|
|
|
|
|
self.wait_until_idle();
|
|
|
|
|
Ok(())
|
|
|
|
|
.cmd_with_data(spi, Command::WRITE_RAM, buffer)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//TODO: update description: last 3 bits will be ignored for width and x_pos
|
|
|
|
@ -207,17 +206,18 @@ where
|
|
|
|
|
width: u32,
|
|
|
|
|
height: u32,
|
|
|
|
|
) -> Result<(), SPI::Error> {
|
|
|
|
|
self.wait_until_idle();
|
|
|
|
|
|
|
|
|
|
self.set_ram_area(spi, x, y, x + width, y + height)?;
|
|
|
|
|
self.set_ram_counter(spi, x, y)?;
|
|
|
|
|
|
|
|
|
|
self.interface
|
|
|
|
|
.cmd_with_data(spi, Command::WRITE_RAM, buffer)?;
|
|
|
|
|
|
|
|
|
|
self.wait_until_idle();
|
|
|
|
|
Ok(())
|
|
|
|
|
.cmd_with_data(spi, Command::WRITE_RAM, buffer)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn display_frame(&mut self, spi: &mut SPI) -> Result<(), SPI::Error> {
|
|
|
|
|
self.wait_until_idle();
|
|
|
|
|
|
|
|
|
|
// enable clock signal, enable cp, display pattern -> 0xC4 (tested with the arduino version)
|
|
|
|
|
//TODO: test control_1 or control_2 with default value 0xFF (from the datasheet)
|
|
|
|
|
self.interface
|
|
|
|
@ -226,24 +226,19 @@ where
|
|
|
|
|
self.interface.cmd(spi, Command::MASTER_ACTIVATION)?;
|
|
|
|
|
// MASTER Activation should not be interupted to avoid currption of panel images
|
|
|
|
|
// therefore a terminate command is send
|
|
|
|
|
self.interface.cmd(spi, Command::NOP)?;
|
|
|
|
|
|
|
|
|
|
self.wait_until_idle();
|
|
|
|
|
Ok(())
|
|
|
|
|
self.interface.cmd(spi, Command::NOP)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn clear_frame(&mut self, spi: &mut SPI) -> Result<(), SPI::Error> {
|
|
|
|
|
self.wait_until_idle();
|
|
|
|
|
|
|
|
|
|
self.use_full_frame(spi)?;
|
|
|
|
|
|
|
|
|
|
// clear the ram with the background color
|
|
|
|
|
let color = self.background_color.get_byte_value();
|
|
|
|
|
|
|
|
|
|
self.interface.cmd(spi, Command::WRITE_RAM)?;
|
|
|
|
|
self.interface
|
|
|
|
|
.data_x_times(spi, color, WIDTH / 8 * HEIGHT)?;
|
|
|
|
|
|
|
|
|
|
self.wait_until_idle();
|
|
|
|
|
Ok(())
|
|
|
|
|
self.interface.data_x_times(spi, color, WIDTH / 8 * HEIGHT)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn set_background_color(&mut self, background_color: Color) {
|
|
|
|
@ -304,6 +299,8 @@ where
|
|
|
|
|
assert!(start_x < end_x);
|
|
|
|
|
assert!(start_y < end_y);
|
|
|
|
|
|
|
|
|
|
self.wait_until_idle();
|
|
|
|
|
|
|
|
|
|
// x is positioned in bytes, so the last 3 bits which show the position inside a byte in the ram
|
|
|
|
|
// aren't relevant
|
|
|
|
|
self.interface.cmd_with_data(
|
|
|
|
@ -322,10 +319,7 @@ where
|
|
|
|
|
end_y as u8,
|
|
|
|
|
(end_y >> 8) as u8,
|
|
|
|
|
],
|
|
|
|
|
)?;
|
|
|
|
|
|
|
|
|
|
self.wait_until_idle();
|
|
|
|
|
Ok(())
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub(crate) fn set_ram_counter(
|
|
|
|
@ -334,6 +328,8 @@ where
|
|
|
|
|
x: u32,
|
|
|
|
|
y: u32,
|
|
|
|
|
) -> Result<(), SPI::Error> {
|
|
|
|
|
self.wait_until_idle();
|
|
|
|
|
|
|
|
|
|
// x is positioned in bytes, so the last 3 bits which show the position inside a byte in the ram
|
|
|
|
|
// aren't relevant
|
|
|
|
|
self.interface
|
|
|
|
@ -344,20 +340,16 @@ where
|
|
|
|
|
spi,
|
|
|
|
|
Command::SET_RAM_Y_ADDRESS_COUNTER,
|
|
|
|
|
&[y as u8, (y >> 8) as u8],
|
|
|
|
|
)?;
|
|
|
|
|
|
|
|
|
|
self.wait_until_idle();
|
|
|
|
|
Ok(())
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn set_lut_helper(&mut self, spi: &mut SPI, buffer: &[u8]) -> Result<(), SPI::Error> {
|
|
|
|
|
assert!(buffer.len() == 30);
|
|
|
|
|
|
|
|
|
|
self.interface
|
|
|
|
|
.cmd_with_data(spi, Command::WRITE_LUT_REGISTER, buffer)?;
|
|
|
|
|
|
|
|
|
|
self.wait_until_idle();
|
|
|
|
|
Ok(())
|
|
|
|
|
|
|
|
|
|
self.interface
|
|
|
|
|
.cmd_with_data(spi, Command::WRITE_LUT_REGISTER, buffer)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|