//! Firmware for Tangentbord1, left half. // NOTE: the order of attributes matters here.. #![no_main] #![cfg(target_os = "none")] // only try to compile this for embedded #![no_std] #![feature(type_alias_impl_trait)] extern crate alloc; extern crate cortex_m_rt; use alloc::vec::Vec; use embassy_executor::Spawner; use embassy_rp::gpio::{Level, Output, Pin}; use embassy_time::Timer; use log::error; use tangentbord1::{ board::Board, event::Half, interrupts::Irqs, keyboard::KeyboardConfig, layer::Layer, logger::LogMultiplexer, rgb::Rgb, util::stall, ws2812::Ws2812, {allocator, rtt, uart, usb}, }; #[embassy_executor::main] async fn main(_spawner: Spawner) { let half = Half::Left; let rtt_write = rtt::init_rtt_logger(); allocator::init(); let p = embassy_rp::init(Default::default()); let board = Board::from(p); let _neopixel_power = Output::new(board.neopixel_power, Level::High); let mut neopixel = Ws2812::new(board.PIO0, Irqs, board.DMA_CH0, board.neopixel); let neopixels_d5 = Ws2812::new(board.PIO1, Irqs, board.DMA_CH1, board.d5); neopixel.write(&[Rgb::new(0xFF, 0x00, 0x00)]).await; let layers = include_bytes!("layers.pc"); let Ok(layers): Result>, _> = postcard::from_bytes(layers) else { log::error!("Failed to deserialize layer config"); stall().await }; let keyboard = KeyboardConfig { half, pins: [ // row 1 board.d24.degrade(), board.a3.degrade(), board.a2.degrade(), board.a1.degrade(), board.a0.degrade(), // row 2 board.d25.degrade(), board.sck.degrade(), board.mosi.degrade(), board.miso.degrade(), board.d2.degrade(), // row 3 board.d12.degrade(), board.d11.degrade(), board.d10.degrade(), board.d9.degrade(), board.d3.degrade(), // thumbpad board.d7.degrade(), board.scl.degrade(), board.sda.degrade(), ], // the index of the LEDs is different than the switch index. // each number is the index of the LED for the switch of that index. led_map: [4, 3, 2, 1, 0, 5, 6, 7, 8, 9, 14, 13, 12, 11, 10, 15, 16, 17], led_driver: neopixels_d5, layers, }; let Some([events1, events2]) = keyboard.create().await else { error!("failed to create keyboard"); return; }; uart::start(board.tx, board.rx, board.UART0, half, events2).await; neopixel.write(&[Rgb::new(0x00, 0x99, 0x99)]).await; let usb_logger = usb::setup_logger_and_keyboard(board.USB, events1).await; let logger = LogMultiplexer { outputs: [rtt_write, usb_logger], }; logger.init(); log::error!("log_level: error"); log::warn!("log_level: warn"); log::info!("log_level: info"); log::debug!("log_level: debug"); log::trace!("log_level: trace"); neopixel.write(&[Rgb::new(0x00, 0x00, 0xFF)]).await; Timer::after_secs(5).await; for b in (0u8..0xff).rev() { neopixel.write(&[Rgb::new(0, 0, b)]).await; Timer::after_millis(10).await; } stall().await }