Working buttons & menu
This commit is contained in:
parent
a6ccd36ab5
commit
eb9dd99b96
181
src/epaper.rs
Normal file
181
src/epaper.rs
Normal file
@ -0,0 +1,181 @@
|
||||
use embedded_graphics::{
|
||||
geometry::{Point, Size},
|
||||
mono_font::MonoTextStyleBuilder,
|
||||
primitives::{Primitive, PrimitiveStyleBuilder, Rectangle},
|
||||
text::{Baseline, Text, TextStyleBuilder},
|
||||
Drawable,
|
||||
};
|
||||
use embedded_hal::delay::DelayNs;
|
||||
use embedded_hal_bus::spi::ExclusiveDevice;
|
||||
use epd_waveshare::epd3in7::*;
|
||||
use epd_waveshare::prelude::*;
|
||||
use esp_hal::{
|
||||
clock::Clocks,
|
||||
delay::Delay,
|
||||
gpio::{Gpio18, Gpio19, Gpio20, Gpio21, Gpio22, Gpio23, Input, Io, Level, Output, NO_PIN},
|
||||
peripherals::Peripherals,
|
||||
prelude::*,
|
||||
spi::{master::Spi, FullDuplexMode, SpiMode},
|
||||
};
|
||||
|
||||
pub type CS<'b> = Output<'b, Gpio20>;
|
||||
pub type BUS<'b> = Input<'b, Gpio23>;
|
||||
pub type RST<'b> = Output<'b, Gpio22>;
|
||||
pub type DC<'b> = Output<'b, Gpio21>;
|
||||
pub type SpiBus<'b> = Spi<'b, esp_hal::peripherals::SPI2, FullDuplexMode>;
|
||||
pub type SPI<'b> = ExclusiveDevice<SpiBus<'b>, CS<'b>, Delay>;
|
||||
pub type Driver<'b> = EPD3in7<SPI<'b>, BUS<'b>, DC<'b>, RST<'b>, Delay>;
|
||||
|
||||
pub struct Epaper<'d> {
|
||||
pub display: Display3in7,
|
||||
pub driver: Driver<'d>,
|
||||
pub spi: SPI<'d>,
|
||||
pub delay: Delay,
|
||||
}
|
||||
|
||||
/**
|
||||
* Board mapping:
|
||||
*
|
||||
*
|
||||
* _________
|
||||
* __| |__
|
||||
* | |
|
||||
* 3.3v O |
|
||||
* | |
|
||||
* | |
|
||||
* | |
|
||||
* | |
|
||||
* | O 23 - BUSY
|
||||
* | O 22 - RESET (RST)
|
||||
* | O 21 - DC
|
||||
* | O 20 - CS
|
||||
* | O 19 - CLK / SCLK
|
||||
* | O 18 - DIM
|
||||
* | |
|
||||
* | |
|
||||
* | |
|
||||
* |__ ___ __|
|
||||
* | | | |
|
||||
* CH343 ESP32C6
|
||||
*
|
||||
* Cannonical wiring
|
||||
* * BUSY - purple - Gpio23
|
||||
* * RST - white - Gpio22
|
||||
* * DC - green - Gpio21
|
||||
* * CS - orange - Gpio20
|
||||
* * CLK - yellow - Gpio19
|
||||
* * DIM - blue - Gpio18
|
||||
* * GND - brown - ANY GND
|
||||
* * VCC - gray - 3.3v
|
||||
*
|
||||
*/
|
||||
|
||||
// let mut epaper = epaper::Epaper::new(mosi, sclk, cs, dc, rst, busy, peripherals.SPI2, &clocks);
|
||||
impl<'d> Epaper<'d> {
|
||||
pub fn new(
|
||||
din: Gpio18,
|
||||
sclk: Gpio19,
|
||||
cs: Gpio20,
|
||||
dc: Gpio21,
|
||||
rst: Gpio22,
|
||||
busy: Gpio23,
|
||||
spi: esp_hal::peripherals::SPI2,
|
||||
clocks: &'d Clocks,
|
||||
) -> Self {
|
||||
let mut delay = Delay::new(&clocks);
|
||||
|
||||
let spi_bus: SpiBus = Spi::new(spi, 4_000.kHz(), SpiMode::Mode0, clocks).with_pins(
|
||||
Some(sclk),
|
||||
Some(din),
|
||||
NO_PIN,
|
||||
NO_PIN, // cs is handled by the exclusive device
|
||||
);
|
||||
|
||||
let cs: CS = Output::new(cs, Level::High);
|
||||
let busy: BUS = Input::new(busy, esp_hal::gpio::Pull::Up);
|
||||
let dc: DC = Output::new(dc, Level::High);
|
||||
let rst = Output::new(rst, Level::High);
|
||||
|
||||
log::info!("Intializing SPI Device...");
|
||||
let mut spi: SPI =
|
||||
ExclusiveDevice::new(spi_bus, cs, delay).expect("SPI device initialize error");
|
||||
log::info!("SPI ExclusiveDevice done");
|
||||
let mut driver =
|
||||
EPD3in7::new(&mut spi, busy, dc, rst, &mut delay, None).expect("eink initalize error");
|
||||
log::info!("Driver DONE");
|
||||
|
||||
let mut display = Display3in7::default();
|
||||
log::info!("Display DONE");
|
||||
display.set_rotation(DisplayRotation::Rotate90);
|
||||
log::info!("Display ratation DONE");
|
||||
driver.set_background_color(Color::White);
|
||||
driver.clear_frame(&mut spi, &mut delay).unwrap();
|
||||
|
||||
Self {
|
||||
display,
|
||||
driver,
|
||||
spi,
|
||||
delay,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn full_update(&mut self) {
|
||||
// self.driver
|
||||
// .clear_frame(&mut self.spi, &mut self.delay)
|
||||
// .unwrap();
|
||||
self.driver
|
||||
.update_and_display_frame(&mut self.spi, self.display.buffer(), &mut self.delay)
|
||||
.expect("display frame new graphics");
|
||||
}
|
||||
|
||||
pub fn full_erase(&mut self) {
|
||||
self.driver
|
||||
.clear_frame(&mut self.spi, &mut self.delay)
|
||||
.unwrap();
|
||||
log::info!("Clearing display");
|
||||
let _ = Rectangle::new(Point::new(0, 0), Size::new(480, 280))
|
||||
.into_styled(
|
||||
PrimitiveStyleBuilder::new()
|
||||
.fill_color(Color::White)
|
||||
.build(),
|
||||
)
|
||||
.draw(&mut self.display);
|
||||
log::info!("Clearing display DONE");
|
||||
}
|
||||
|
||||
pub fn print_welcome(&mut self) {
|
||||
// draw white on black background
|
||||
let style = MonoTextStyleBuilder::new()
|
||||
.font(&embedded_graphics::mono_font::ascii::FONT_9X15_BOLD)
|
||||
.text_color(Color::Black)
|
||||
.background_color(Color::White)
|
||||
.build();
|
||||
let text_style = TextStyleBuilder::new().baseline(Baseline::Top).build();
|
||||
let _ = Text::with_text_style("Booting...", Point::new(90, 10), style, text_style)
|
||||
.draw(&mut self.display);
|
||||
self.driver
|
||||
.update_and_display_frame(&mut self.spi, self.display.buffer(), &mut self.delay)
|
||||
.expect("display frame new graphics");
|
||||
self.delay.delay_ms(500);
|
||||
}
|
||||
|
||||
pub fn wake_up(&mut self) {
|
||||
self.driver.wake_up(&mut self.spi, &mut self.delay).unwrap();
|
||||
}
|
||||
|
||||
pub fn sleep(&mut self) {
|
||||
let _ = self.driver.sleep(&mut self.spi, &mut self.delay);
|
||||
}
|
||||
|
||||
pub fn partial_update(&mut self, pos: Point, size: Size, buffer: &[u8]) {
|
||||
let _ = self.driver.update_partial_frame(
|
||||
&mut self.spi,
|
||||
&mut self.delay,
|
||||
buffer,
|
||||
pos.x as u32,
|
||||
pos.y as u32,
|
||||
size.width,
|
||||
size.height,
|
||||
);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user