go-tracker/src/main.rs
2024-09-27 00:55:26 +02:00

154 lines
4 KiB
Rust

#![no_std]
#![no_main]
use defmt::*;
use embassy_executor::Spawner;
use embassy_net::StackResources;
use embassy_net_ppp;
use embassy_stm32::i2c::{self, I2c};
use embassy_stm32::rng::{self, Rng};
use embassy_stm32::time::Hertz;
use embassy_stm32::usart::Config;
use embassy_stm32::{bind_interrupts, peripherals, usart};
use embassy_stm32::{
gpio::{Level, Output, Speed},
usart::BufferedUart,
};
use embassy_time::{Duration, Timer};
use net::net_init;
use rand::RngCore;
use static_cell::StaticCell;
use {defmt_rtt as _, panic_probe as _};
mod gnss;
mod mqtt;
mod net;
mod sensors;
bind_interrupts!(struct Irqs {
USART2 => usart::BufferedInterruptHandler<peripherals::USART2>;
USART3 => usart::InterruptHandler<peripherals::USART3>;
RNG => rng::InterruptHandler<peripherals::RNG>;
I2C1_EV => i2c::EventInterruptHandler<peripherals::I2C1>;
I2C1_ER => i2c::ErrorInterruptHandler<peripherals::I2C1>;
});
#[embassy_executor::main]
async fn main(spawner: Spawner) {
let mut stm_config = embassy_stm32::Config::default();
{
use embassy_stm32::rcc::*;
stm_config.rcc.sys = Sysclk::PLL1_R;
stm_config.rcc.hsi = false;
stm_config.rcc.hse = Some(Hse {
freq: embassy_stm32::time::Hertz(12_000_000),
mode: HseMode::Oscillator,
});
stm_config.rcc.pll = Some(Pll {
source: PllSource::HSE, // 12 MHz
prediv: PllPreDiv::DIV1,
mul: PllMul::MUL8, // 12 * 8 = 96 MHz
divp: None,
divq: None,
divr: Some(PllRDiv::DIV2), // 96 / 2 = 48 MHz
});
stm_config.rcc.ls = LsConfig::default();
}
let p = embassy_stm32::init(stm_config);
let mut config = Config::default();
config.baudrate = 115_200;
config.stop_bits = embassy_stm32::usart::StopBits::STOP1;
defmt::info!("Moin");
let mut rng = Rng::new(p.RNG, Irqs);
let mut net_key = Output::new(p.PA1, Level::Low, Speed::Low);
let mut pwr_en = Output::new(p.PB2, Level::Low, Speed::Low);
let mut pwr_tmp = Output::new(p.PB5, Level::Low, Speed::Low);
// Power on modem
pwr_en.set_high();
pwr_tmp.set_high();
static RX_BUF: StaticCell<[u8; 512]> = StaticCell::new();
static TX_BUF: StaticCell<[u8; 512]> = StaticCell::new();
let mut usart_modem = BufferedUart::new(
p.USART2,
Irqs,
p.PA3,
p.PA2,
RX_BUF.init([0; 512]),
TX_BUF.init([0; 512]),
config,
)
.unwrap();
// TODO untested
let gnss_uart = usart::Uart::new(
p.USART3,
p.PB11,
p.PB10,
Irqs,
p.DMA1_CH2,
p.DMA1_CH3,
Config::default(),
)
.unwrap();
let i2c = I2c::new(
p.I2C1,
p.PB6,
p.PB7,
Irqs,
p.DMA1_CH6,
p.DMA1_CH7,
Hertz(100_000),
Default::default(),
);
net_init(&mut net_key, &mut usart_modem).await;
// spawner.spawn(gnss::gnss_task(gnss_uart)).unwrap();
static STATE: StaticCell<embassy_net_ppp::State<8, 8>> = StaticCell::new();
let state = STATE.init(embassy_net_ppp::State::<8, 8>::new());
let (device, runner) = embassy_net_ppp::new(state);
// Generate random seed
let seed = rng.next_u64();
// Init network stack
static RESOURCES: StaticCell<StackResources<3>> = StaticCell::new();
let (stack, runner_net) = embassy_net::new(
device,
embassy_net::Config::default(),
RESOURCES.init(StackResources::new()),
seed,
);
// Launch network task
spawner.spawn(net::net_task(runner_net)).unwrap();
spawner
.spawn(net::ppp_task(stack, runner, usart_modem))
.unwrap();
loop {
Timer::after(Duration::from_secs(1)).await;
if stack.is_link_up() {
info!("Ready");
break;
}
}
spawner.spawn(sensors::sensors_task(i2c)).unwrap();
spawner.spawn(mqtt::mqtt_task(stack)).unwrap();
loop {
Timer::after(Duration::from_secs(1)).await;
}
}