#![no_main]
#![no_std]
use bxcan::Fifo;
use panic_halt as _;
use bxcan::filter::Mask32;
use cortex_m_rt::entry;
use nb::block;
use stm32f1xx_hal::{can::Can, pac, prelude::*};
#[entry]
fn main() -> ! {
let dp = pac::Peripherals::take().unwrap();
let mut flash = dp.FLASH.constrain();
let rcc = dp.RCC.constrain();
rcc.cfgr.use_hse(8.MHz()).freeze(&mut flash.acr);
let mut afio = dp.AFIO.constrain();
let mut can1 = {
#[cfg(not(feature = "connectivity"))]
let can = Can::new(dp.CAN1, dp.USB);
#[cfg(feature = "connectivity")]
let can = Can::new(dp.CAN1);
let mut gpioa = dp.GPIOA.split();
let rx = gpioa.pa11.into_floating_input(&mut gpioa.crh);
let tx = gpioa.pa12.into_alternate_push_pull(&mut gpioa.crh);
can.assign_pins((tx, rx), &mut afio.mapr);
bxcan::Can::builder(can)
.set_bit_timing(0x001c_0003)
.leave_disabled()
};
let mut filters = can1.modify_filters();
filters.enable_bank(0, Fifo::Fifo0, Mask32::accept_all());
#[cfg(feature = "connectivity")]
let _can2 = {
let can = Can::new(dp.CAN2);
let mut gpiob = dp.GPIOB.split();
let rx = gpiob.pb5.into_floating_input(&mut gpiob.crl);
let tx = gpiob.pb6.into_alternate_push_pull(&mut gpiob.crl);
can.assign_pins((tx, rx), &mut afio.mapr);
let can2 = bxcan::Can::builder(can)
.set_bit_timing(0x001c_0003)
.leave_disabled();
let mut slave_filters = filters.set_split(14).slave_filters();
slave_filters.enable_bank(14, Fifo::Fifo0, Mask32::accept_all());
can2
};
drop(filters);
let mut can = can1;
block!(can.enable_non_blocking()).unwrap();
loop {
if let Ok(frame) = block!(can.receive()) {
block!(can.transmit(&frame)).unwrap();
}
}
}