#![no_std] #![no_main] // pick a panicking behavior extern crate panic_halt; // you can put a breakpoint on `rust_begin_unwind` to catch panics // extern crate panic_abort; // requires nightly // extern crate panic_itm; // logs messages over ITM; requires ITM support // extern crate panic_semihosting; // logs messages to the host stderr; requires a debugger use metro_m0 as hal; use cortex_m::asm; use embedded_hal; use hal::clock::GenericClockController; use hal::delay::Delay; use hal::entry; use hal::pac::{CorePeripherals, Peripherals}; use hal::prelude::*; macro_rules! write_rgb_zero { ($pin:expr, $delay:expr) => { $pin.set_high().unwrap(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); $pin.set_low().unwrap(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); // 12 asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); // 24 asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); // 36 asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); }; } macro_rules! write_rgb_one { ($pin:expr, $delay:expr) => { $pin.set_high().unwrap(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); $pin.set_low().unwrap(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); asm::nop(); }; } // #[proc_macro] // pub fn write_rgb(item: TokenStream) -> TokenStream { // item // } // macro_rules! write_rgb { // ($pin:expr, $delay:expr, $uint8:expr) => { // for i in (0..8).rev() { // if ($uint8 >> i) & 1 == 1 { // write_rgb_one!($pin, $delay); // } else { // write_rgb_zero!($pin, $delay); // } // } // }; // } #[entry] fn main() -> ! { let mut peripherals = Peripherals::take().unwrap(); let core = CorePeripherals::take().unwrap(); let mut clocks = GenericClockController::with_external_32kosc( peripherals.GCLK, &mut peripherals.PM, &mut peripherals.SYSCTRL, &mut peripherals.NVMCTRL, ); let mut pins = hal::Pins::new(peripherals.PORT); let mut red_led = pins.d13.into_push_pull_output(&mut pins.port); let mut assert_pin = pins.d12.into_push_pull_output(&mut pins.port); let switch = pins.d3.into_pull_down_input(&mut pins.port); let mut rgb_meme = pins.neopixel.into_push_pull_output(&mut pins.port); let mut delay = Delay::new(core.SYST, &mut clocks); loop { delay.delay_us(255u8); assert_pin.set_high().unwrap(); if switch.is_high().unwrap() { red_led.set_high().unwrap(); } else { red_led.set_low().unwrap(); } assert_pin.set_low().unwrap(); lol(&mut rgb_meme, &mut delay); } } #[no_mangle] fn lol( pin: &mut metro_m0::gpio::Pa30>, delay: &mut hal::delay::Delay, ) { pin.set_low().unwrap(); delay.delay_us(60u8); // write_rgb!(pin, delay, 10); // write_rgb!(pin, delay, 0); // write_rgb!(pin, delay, 0); // write_rgb!(pin, delay, 128); write_rgb_zero!(pin, delay); write_rgb_zero!(pin, delay); write_rgb_zero!(pin, delay); write_rgb_zero!(pin, delay); write_rgb_zero!(pin, delay); write_rgb_zero!(pin, delay); write_rgb_zero!(pin, delay); write_rgb_zero!(pin, delay); write_rgb_zero!(pin, delay); write_rgb_zero!(pin, delay); write_rgb_zero!(pin, delay); write_rgb_zero!(pin, delay); write_rgb_zero!(pin, delay); write_rgb_zero!(pin, delay); write_rgb_zero!(pin, delay); write_rgb_zero!(pin, delay); write_rgb_zero!(pin, delay); write_rgb_zero!(pin, delay); write_rgb_zero!(pin, delay); write_rgb_zero!(pin, delay); write_rgb_zero!(pin, delay); write_rgb_zero!(pin, delay); write_rgb_zero!(pin, delay); write_rgb_one!(pin, delay); }