onyx/src/main.rs

276 lines
5.8 KiB
Rust

#![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<metro_m0::gpio::Output<metro_m0::gpio::PushPull>>,
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);
}