#![no_main]
#![no_std]
mod common;
use defmt_rtt as _;
use embassy_stm32::interrupt;
use embassy_stm32::peripherals::USART3;
use embassy_stm32::{dma::NoDma, gpio};
use panic_probe as _;
use atat::{clock::Clock, AtatClient, ClientBuilder, Queues};
use bbqueue::BBBuffer;
use common::{timer::DwtTimer, Urc};
use cortex_m_rt::entry;
use fugit::ExtU32;
use embedded_hal_nb::nb;
#[cfg(feature = "defmt")]
defmt::timestamp!("{=u64}", { DwtTimer::<80_000_000>::now() / 80_000 });
const RX_BUFFER_BYTES: usize = 512;
const RES_CAPACITY_BYTES: usize = RX_BUFFER_BYTES;
const URC_CAPACITY_BYTES: usize = RX_BUFFER_BYTES * 3;
static mut INGRESS: Option<
atat::IngressManager<
atat::AtDigester<Urc>,
RX_BUFFER_BYTES,
RES_CAPACITY_BYTES,
URC_CAPACITY_BYTES,
>,
> = None;
static mut RX: Option<embassy_stm32::usart::UartRx<USART3>> = None;
#[entry]
fn main() -> ! {
static mut RES_QUEUE: BBBuffer<RES_CAPACITY_BYTES> = BBBuffer::new();
static mut URC_QUEUE: BBBuffer<URC_CAPACITY_BYTES> = BBBuffer::new();
let p = embassy_stm32::init(Default::default());
let mut wifi_nrst = gpio::OutputOpenDrain::new(
p.PD13,
gpio::Level::Low,
gpio::Speed::Medium,
gpio::Pull::None,
);
wifi_nrst.set_high();
let serial = embassy_stm32::usart::Uart::new(
p.USART3,
p.PD9,
p.PD8,
NoDma,
NoDma,
embassy_stm32::usart::Config::default(),
);
let (tx, rx) = serial.split();
let queues = Queues {
res_queue: RES_QUEUE.try_split_framed().unwrap(),
urc_queue: URC_QUEUE.try_split_framed().unwrap(),
};
let (mut client, ingress) = ClientBuilder::new(
tx,
DwtTimer::<80_000_000>::new(),
atat::AtDigester::new(),
atat::Config::new(atat::Mode::Timeout),
)
.build(queues);
unsafe { cortex_m::peripheral::NVIC::unmask(embassy_stm32::pac::Interrupt::USART3) };
unsafe { INGRESS = Some(ingress) };
unsafe { RX = Some(rx) };
let mut state = 0;
let mut loop_timer = DwtTimer::<80_000_000>::new();
loop {
#[cfg(feature = "defmt")]
defmt::debug!("\r\n\r\n\r\n");
match state {
0 => {
client.send(&common::general::GetManufacturerId).ok();
}
1 => {
client.send(&common::general::GetModelId).ok();
}
2 => {
client.send(&common::general::GetSoftwareVersion).ok();
}
3 => {
client.send(&common::general::GetWifiMac).ok();
}
_ => cortex_m::asm::bkpt(),
}
loop_timer.start(1.secs()).ok();
nb::block!(loop_timer.wait()).ok();
state += 1;
}
}
#[interrupt]
fn USART3() {
cortex_m::interrupt::free(|_| {
let ingress = unsafe { INGRESS.as_mut().unwrap() };
let rx = unsafe { RX.as_mut().unwrap() };
if let Ok(d) = nb::block!(rx.nb_read()) {
ingress.write(&[d]);
}
});
}
#[defmt::panic_handler]
fn panic() -> ! {
cortex_m::asm::udf()
}