#![no_std]
#![no_main]
extern crate panic_halt;
use cortex_m_rt::entry;
use cortex_m::peripheral::Peripherals;
use stm32f4xx_hal::{
delay::Delay,
prelude::*,
spi::{self, Spi},
stm32,
};
use embedded_graphics::{
image::Image,
pixelcolor::{Gray4, Rgb565},
prelude::*,
primitives::{Circle, PrimitiveStyleBuilder, Rectangle, Triangle},
};
use tinybmp::Bmp;
use display_interface_spi::SPIInterfaceNoCS;
use ssd1320::buffered_graphics::BufferedSsd1320z2;
#[entry]
fn main() -> ! {
let p = stm32::Peripherals::take().unwrap();
let cp = Peripherals::take().unwrap();
let gpioa = p.GPIOA.split();
let gpiob = p.GPIOB.split();
let rcc = p.RCC.constrain();
let clocks = rcc.cfgr.freeze();
let mut led = gpioa.pa5.into_push_pull_output();
led.set_low().ok();
let sck = gpiob.pb3.into_alternate_af5();
let miso = spi::NoMiso;
let mosi = gpiob.pb5.into_alternate_af5();
let dc = gpiob.pb4.into_push_pull_output();
let mut res = gpiob.pb10.into_push_pull_output();
let cs1 = gpiob.pb13.into_push_pull_output();
let cs2 = gpiob.pb14.into_push_pull_output();
let mut delay = Delay::new(cp.SYST, clocks);
let mode = spi::Mode {
polarity: spi::Polarity::IdleLow,
phase: spi::Phase::CaptureOnFirstTransition,
};
let spi = Spi::spi1(p.SPI1, (sck, miso, mosi), mode, 8_000_000.hz(), clocks);
let iface = SPIInterfaceNoCS::new(spi, dc);
let mut display = BufferedSsd1320z2::new(iface, cs1, cs2);
display.init(&mut res, &mut delay);
let bmp: Bmp<Rgb565, 'static> = Bmp::from_slice(include_bytes!("rust.bmp")).unwrap();
let yoffset = 20;
let style = PrimitiveStyleBuilder::new()
.stroke_width(2)
.stroke_color(Gray4::WHITE)
.build();
Rectangle::new(Point::new(1, 1), Size::new(127, 63))
.into_styled(style)
.draw(&mut display)
.unwrap();
Triangle::new(
Point::new(16, 16 + yoffset),
Point::new(16 + 16, 16 + yoffset),
Point::new(16 + 8, yoffset),
)
.into_styled(style)
.draw(&mut display)
.unwrap();
Rectangle::new(Point::new(52, yoffset), Size::new_equal(16))
.into_styled(style)
.draw(&mut display)
.unwrap();
Circle::new(Point::new(88, yoffset), 16)
.into_styled(style)
.draw(&mut display)
.unwrap();
Image::new(&bmp, Point::new(140, 0))
.draw(&mut display.color_converted())
.unwrap();
display.flush().unwrap();
loop {
delay.delay_ms(500_u16);
led.toggle().ok();
}
}