#![no_std]
#![no_main]
use panic_halt as _;
use rp_pico as bsp;
use bsp::entry;
use fugit::RateExtU32;
use display_interface_spi::SPIInterface;
use embedded_graphics::prelude::*;
use embedded_graphics::{
pixelcolor::Rgb565,
primitives::{Circle, PrimitiveStyleBuilder, Rectangle, Triangle},
};
use bsp::hal::{
clocks::{init_clocks_and_plls, Clock},
gpio, pac, pwm,
sio::Sio,
spi,
watchdog::Watchdog,
};
#[entry]
fn main() -> ! {
let mut pac = pac::Peripherals::take().unwrap();
let core = pac::CorePeripherals::take().unwrap();
let mut watchdog = Watchdog::new(pac.WATCHDOG);
let sio = Sio::new(pac.SIO);
let external_xtal_freq_hz = 12_000_000u32;
let clocks = init_clocks_and_plls(
external_xtal_freq_hz,
pac.XOSC,
pac.CLOCKS,
pac.PLL_SYS,
pac.PLL_USB,
&mut pac.RESETS,
&mut watchdog,
)
.ok()
.unwrap();
let mut delay = cortex_m::delay::Delay::new(core.SYST, clocks.system_clock.freq().to_Hz());
let pins = bsp::Pins::new(
pac.IO_BANK0,
pac.PADS_BANK0,
sio.gpio_bank0,
&mut pac.RESETS,
);
let _spi_sclk = pins.gpio10.into_mode::<gpio::FunctionSpi>();
let _spi_mosi = pins.gpio11.into_mode::<gpio::FunctionSpi>();
let spi_cs = pins.gpio9.into_push_pull_output();
let spi = spi::Spi::<_, _, 8>::new(pac.SPI1);
let spi = spi.init(
&mut pac.RESETS,
clocks.peripheral_clock.freq(),
8_000_000u32.Hz(),
&embedded_hal::spi::MODE_0,
);
let dc_pin = pins.gpio8.into_push_pull_output();
let rst_pin = pins.gpio12.into_push_pull_output();
let spi_interface = SPIInterface::new(spi, dc_pin, spi_cs);
let pwm_slices = pwm::Slices::new(pac.PWM, &mut pac.RESETS);
let mut pwm = pwm_slices.pwm6;
pwm.set_ph_correct();
pwm.enable();
let mut channel = pwm.channel_b;
channel.output_to(pins.gpio13);
let mut display = gc9a01a::GC9A01A::new(spi_interface, rst_pin, channel);
display.reset(&mut delay).unwrap();
display.set_backlight(55000);
display.initialize(&mut delay).unwrap();
display.clear(Rgb565::CSS_FOREST_GREEN).unwrap();
let yoffset = 100;
let style = PrimitiveStyleBuilder::new()
.stroke_width(2)
.stroke_color(Rgb565::CSS_RED)
.build();
Circle::new(Point::new(1, 1), 238)
.into_styled(style)
.draw(&mut display)
.unwrap();
Triangle::new(
Point::new(50, 32 + yoffset),
Point::new(50 + 32, 32 + yoffset),
Point::new(50 + 8, yoffset),
)
.into_styled(style)
.draw(&mut display)
.unwrap();
Rectangle::new(Point::new(110, yoffset), Size::new_equal(32))
.into_styled(style)
.draw(&mut display)
.unwrap();
Circle::new(Point::new(170, yoffset), 32)
.into_styled(style)
.draw(&mut display)
.unwrap();
exit()
}
pub fn exit() -> ! {
loop {
cortex_m::asm::bkpt();
}
}