108 lines
2.7 KiB
Rust
108 lines
2.7 KiB
Rust
use anyhow::{Result};
|
|
use embedded_graphics::{
|
|
mono_font::{ascii::FONT_10X20, MonoTextStyle},
|
|
pixelcolor::Rgb565,
|
|
prelude::{Dimensions, Drawable, Point, Primitive, RgbColor},
|
|
primitives::{PrimitiveStyleBuilder, Rectangle},
|
|
text::Text,
|
|
};
|
|
use embedded_hal::delay::blocking::DelayUs;
|
|
use esp_idf_hal::{
|
|
delay,
|
|
gpio::{self},
|
|
i2c::{self, Master, I2C0},
|
|
prelude::*,
|
|
};
|
|
use ssd1306::{
|
|
mode::{BufferedGraphicsMode, DisplayConfig},
|
|
prelude::I2CInterface,
|
|
size::DisplaySize128x64,
|
|
Ssd1306,
|
|
};
|
|
|
|
type Display = Ssd1306<
|
|
I2CInterface<Master<I2C0, gpio::Gpio9<gpio::Unknown>, gpio::Gpio10<gpio::Unknown>>>,
|
|
DisplaySize128x64,
|
|
BufferedGraphicsMode<DisplaySize128x64>,
|
|
>;
|
|
|
|
pub struct Screen {
|
|
pub display: Display,
|
|
}
|
|
|
|
impl Screen {
|
|
pub fn new(
|
|
i2c: i2c::I2C0,
|
|
sda: gpio::Gpio9<gpio::Unknown>,
|
|
scl: gpio::Gpio10<gpio::Unknown>,
|
|
) -> Result<Self> {
|
|
let config = <i2c::config::MasterConfig as Default>::default().baudrate(400.kHz().into());
|
|
let i2c = i2c::Master::<i2c::I2C0, _, _>::new(
|
|
i2c,
|
|
i2c::MasterPins { sda, scl },
|
|
config,
|
|
)?;
|
|
let di = ssd1306::I2CDisplayInterface::new(i2c);
|
|
|
|
let mut delay = delay::Ets;
|
|
delay.delay_ms(10_u32)?;
|
|
|
|
let mut display = ssd1306::Ssd1306::new(
|
|
di,
|
|
ssd1306::size::DisplaySize128x64,
|
|
ssd1306::rotation::DisplayRotation::Rotate0,
|
|
)
|
|
.into_buffered_graphics_mode();
|
|
|
|
display
|
|
.init()
|
|
.unwrap();
|
|
|
|
|
|
println!("LED rendering done");
|
|
|
|
let mut instance = Screen { display };
|
|
|
|
instance.draw_boot()?;
|
|
|
|
Ok(instance)
|
|
}
|
|
|
|
pub fn draw_boot(&mut self) -> Result<()>
|
|
{
|
|
println!("LED rendering done");
|
|
self.display.clear();
|
|
|
|
Rectangle::new(
|
|
self.display.bounding_box().top_left,
|
|
self.display.bounding_box().size,
|
|
)
|
|
.into_styled(
|
|
PrimitiveStyleBuilder::new()
|
|
.fill_color(Rgb565::BLUE.into())
|
|
.stroke_color(Rgb565::YELLOW.into())
|
|
.stroke_width(1)
|
|
.build(),
|
|
)
|
|
.draw(&mut self.display).expect("Failed to draw rectangle");
|
|
|
|
Text::new(
|
|
"Ivan's UPS",
|
|
Point::new(
|
|
12,
|
|
(self.display.bounding_box().size.height - 10) as i32 / 2 + 1,
|
|
),
|
|
MonoTextStyle::new(&FONT_10X20, Rgb565::WHITE.into()),
|
|
)
|
|
.draw(&mut self.display).expect("Failed to draw text");
|
|
|
|
println!("LED rendering done");
|
|
|
|
self.display
|
|
.flush()
|
|
.map_err(|e| anyhow::anyhow!("Display error: {:?}", e))?;
|
|
|
|
Ok(())
|
|
}
|
|
}
|