#![no_std]
#![no_main]
#![feature(type_alias_impl_trait)]
use embassy_executor::Executor;
use embassy_time::{Duration, Timer};
use embassy_futures::select::{Either, select};
use embedded_hal_async::digital::Wait;
use esp32c3_hal::{
clock::ClockControl,
embassy,
gpio::{Gpio1, Gpio2, Input, PullDown, Output, PushPull},
peripherals::Peripherals,
prelude::*,
timer::TimerGroup,
Rtc,
IO,
};
use esp_backtrace as _;
use static_cell::StaticCell;
static EXECUTOR: StaticCell<Executor> = StaticCell::new();
#[embassy_executor::main(entry = "esp32c3_hal::entry")]
async fn main(spawner: embassy_executor::Spawner) {
let peripherals = Peripherals::take();
let mut system = peripherals.SYSTEM.split();
let clocks = ClockControl::boot_defaults(system.clock_control).freeze();
let mut rtc = Rtc::new(peripherals.RTC_CNTL);
let timer_group0 = TimerGroup::new(
peripherals.TIMG0,
&clocks,
&mut system.peripheral_clock_control,
);
let mut wdt0 = timer_group0.wdt;
let timer_group1 = TimerGroup::new(
peripherals.TIMG1,
&clocks,
&mut system.peripheral_clock_control,
);
let mut wdt1 = timer_group1.wdt;
// Disable watchdog timers
rtc.swd.disable();
rtc.rwdt.disable();
wdt0.disable();
wdt1.disable();
embassy::init(&clocks, timer_group0.timer0);
let io = IO::new(peripherals.GPIO, peripherals.IO_MUX);
// GPIO 1 as input
let input = io.pins.gpio1.into_pull_down_input();
let output = io.pins.gpio2.into_push_pull_output();
// Async requires the GPIO interrupt to wake futures
esp32c3_hal::interrupt::enable(
esp32c3_hal::peripherals::Interrupt::GPIO,
esp32c3_hal::interrupt::Priority::Priority1,
)
.unwrap();
spawner.spawn(task(input, output)).ok();
spawner.spawn(printer()).ok();
}
#[embassy_executor::task]
async fn task(mut input: Gpio1<Input<PullDown>>, mut output: Gpio2<Output<PushPull>>) {
loop {
input.wait_for_any_edge().await;
if input.is_high().unwrap() {
output.set_high().unwrap()
} else {
output.set_low().unwrap();
}
}
}
#[embassy_executor::task]
async fn printer() {
loop {
esp_println::println!(r#" __________________________
< Hello fellow Rustaceans! >
--------------------------
\
\
_~^~^~_
\) / o o \ (/
'_ - _'
/ '-----' \"#);
esp_println::println!();
Timer::after(Duration::from_secs(3)).await;
}
}