/*! * Blink the builtin LED - the "Hello World" of embedded programming. */ #![no_std] #![no_main] #![feature(iter_array_chunks)] #![feature(const_slice_make_iter)] #![feature(slice_as_chunks)] #![feature(asm_experimental_arch)] use core::ptr::addr_of; use atmega_hal::{ Usart, spi::{self, Settings}, usart::Baudrate, }; use panic_halt as _; use crate::{ display::{Display, Rgb565, Vec2}, font::{Letter, draw_text}, graphics::{Image, LARGE_CAT_UNSAFE, PRESS_BTN_UNSAFE, draw_image}, peripherals::Button, }; mod display; mod font; mod graphics; mod peripherals; type CoreClock = atmega_hal::clock::MHz8; #[avr_device::entry] fn main() -> ! { let dp = atmega_hal::Peripherals::take().unwrap(); let pins = atmega_hal::pins!(dp); let rx = pins.pd0; let tx = pins.pd1; let mut serial = Usart::new( dp.USART0, rx, tx.into_output(), Baudrate::::new(57600), ); // let eeprom = Eeprom::new(dp.EEPROM); // ufmt::uwriteln!(serial, "Eeprom capacity: {}", eeprom.capacity()).unwrap(); let cs = pins.pb2.into_output(); let (spi, cs) = spi::Spi::new( dp.SPI, pins.pb5.into_output(), pins.pb3.into_output(), pins.pb4.into_pull_up_input(), cs, Settings { data_order: spi::DataOrder::MostSignificantFirst, clock: spi::SerialClockRate::OscfOver2, mode: embedded_hal::spi::Mode { polarity: embedded_hal::spi::Polarity::IdleHigh, phase: embedded_hal::spi::Phase::CaptureOnFirstTransition, }, }, ); let mut display = Display { spi, dc: pins.pb1.into_output(), cs, rst: pins.pd7.into_output(), delay: atmega_hal::delay::Delay::::new(), }; display.init(); let mut button = Button::from(pins.pd5.into_pull_up_input()); let mut idx = 0; let images = [Image::from(addr_of!(LARGE_CAT_UNSAFE))]; let len = images.len(); // match draw_image( // &mut serial, // &mut Image::from(addr_of!(PRESS_BTN_UNSAFE)).iter(), // &mut display, // Vec2 { x: 0, y: 0 }, // ) { // Ok(_) => ufmt::uwriteln!(serial, "Successfully read QOI").unwrap(), // Err(e) => ufmt::uwriteln!(serial, "Error: {:?}", e).unwrap(), // } let letter = Letter::from('h', Rgb565::white(), Rgb565::black()); draw_text( &mut display, "hello there!", Rgb565::white(), Rgb565::red(), Vec2 { x: 10, y: 10 }, 3, ); loop { if button.poll() { match draw_image( &mut serial, &mut images[idx].iter(), &mut display, Vec2 { x: 0, y: 0 }, ) { Ok(_) => ufmt::uwriteln!(serial, "Successfully read QOI").unwrap(), Err(e) => ufmt::uwriteln!(serial, "Error: {:?}", e).unwrap(), } idx = (idx + 1) % len; } } }