main: Make critical_sections as short as possible
This commit is contained in:
parent
e024251260
commit
26a8d0d18a
1 changed files with 73 additions and 62 deletions
143
src/main.rs
143
src/main.rs
|
|
@ -162,25 +162,32 @@ async fn main(spawner: Spawner) -> ! {
|
||||||
|
|
||||||
let mut state = applogic::State::new();
|
let mut state = applogic::State::new();
|
||||||
loop {
|
loop {
|
||||||
embassy_time::Timer::after(embassy_time::Duration::from_millis(5)).await;
|
embassy_time::Timer::after(embassy_time::Duration::from_millis(1)).await;
|
||||||
|
|
||||||
#[cfg(feature = "gnss")]
|
#[cfg(feature = "gnss")]
|
||||||
critical_section::with(|cs| {
|
{
|
||||||
let gnss_update_ref = GNSS_UPDATE.borrow(cs);
|
let mut new_position = false;
|
||||||
|
critical_section::with(|cs| {
|
||||||
|
let gnss_update_ref = GNSS_UPDATE.borrow(cs);
|
||||||
|
|
||||||
if let Some(fix) = gnss_update_ref.replace(None) {
|
if let Some(fix) = gnss_update_ref.replace(None) {
|
||||||
let prev_state = state.initialized();
|
let prev_state = state.initialized();
|
||||||
state.update_with_gpsfix(&fix);
|
state.update_with_gpsfix(&fix);
|
||||||
|
|
||||||
if prev_state != state.initialized() {
|
if prev_state != state.initialized() {
|
||||||
let _ = screen::clear(&mut display).inspect_err(log_screen_error);
|
let _ = screen::clear(&mut display).inspect_err(log_screen_error);
|
||||||
|
}
|
||||||
|
|
||||||
|
new_position = true;
|
||||||
}
|
}
|
||||||
|
});
|
||||||
|
|
||||||
if fix.get_timestamp().is_some() {
|
if new_position {
|
||||||
info!("{}", state.print_fix());
|
info!("{}", state.print_fix());
|
||||||
|
|
||||||
// run GLOSA algorithm
|
// run GLOSA algorithm
|
||||||
#[cfg(feature = "spat")]
|
#[cfg(feature = "spat")]
|
||||||
|
{
|
||||||
let signal_groups = state.run_glosa();
|
let signal_groups = state.run_glosa();
|
||||||
|
|
||||||
for sig in &signal_groups {
|
for sig in &signal_groups {
|
||||||
|
|
@ -196,69 +203,73 @@ async fn main(spawner: Spawner) -> ! {
|
||||||
.inspect_err(log_screen_error);
|
.inspect_err(log_screen_error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
|
|
||||||
|
let mut new_data = None;
|
||||||
critical_section::with(|cs| {
|
critical_section::with(|cs| {
|
||||||
let queue_rc = WIFI_RX_QUEUE.borrow(cs).borrow();
|
let queue_rc = WIFI_RX_QUEUE.borrow(cs).borrow();
|
||||||
// unwrap is fine b/c we stored something in it before
|
// unwrap is fine b/c we stored something in it before
|
||||||
let queue = queue_rc.as_ref().unwrap();
|
let queue = queue_rc.as_ref().unwrap();
|
||||||
|
|
||||||
if let Some(data) = queue.pop() {
|
if let Some(data) = queue.pop() {
|
||||||
match c_its_parser::de::decode(&data, c_its_parser::Headers::IEEE802LlcGnBtp) {
|
new_data = Some(data);
|
||||||
Ok(msg) => {
|
|
||||||
use c_its_parser::ItsMessage;
|
|
||||||
use c_its_parser::standards::extensions::ItsMessageId;
|
|
||||||
|
|
||||||
debug!("Got new {:?} message", ItsMessageId::from(&msg));
|
|
||||||
|
|
||||||
match msg {
|
|
||||||
#[cfg(feature = "spat")]
|
|
||||||
ItsMessage::Mapem {
|
|
||||||
geonetworking: _,
|
|
||||||
transport: _,
|
|
||||||
etsi,
|
|
||||||
} => state.handle_mapem(&etsi),
|
|
||||||
#[cfg(feature = "spat")]
|
|
||||||
ItsMessage::Spatem {
|
|
||||||
geonetworking: _,
|
|
||||||
transport: _,
|
|
||||||
etsi,
|
|
||||||
} => {
|
|
||||||
if state.initialized() {
|
|
||||||
state.handle_spatem(&etsi);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(feature = "cam")]
|
|
||||||
ItsMessage::Cam {
|
|
||||||
geonetworking: _,
|
|
||||||
transport: _,
|
|
||||||
etsi,
|
|
||||||
} => applogic::cam::handle_cam(&etsi),
|
|
||||||
|
|
||||||
#[cfg(feature = "denm")]
|
|
||||||
ItsMessage::DenmV2 {
|
|
||||||
geonetworking: _,
|
|
||||||
transport: _,
|
|
||||||
etsi,
|
|
||||||
} => applogic::denm::handle_denm(&etsi),
|
|
||||||
#[cfg(feature = "denm")]
|
|
||||||
ItsMessage::DenmV1 {
|
|
||||||
geonetworking: _,
|
|
||||||
transport: _,
|
|
||||||
etsi: _,
|
|
||||||
} => {
|
|
||||||
// irrelevant since all received DENMs should be parsed as v2
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Err(err) => {
|
|
||||||
// will give false-positives when a message is received which wasn't enabled
|
|
||||||
debug!("Failed to parse V2X message: {err}");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
if let Some(data) = new_data {
|
||||||
|
match c_its_parser::de::decode(&data, c_its_parser::Headers::IEEE802LlcGnBtp) {
|
||||||
|
Ok(msg) => {
|
||||||
|
use c_its_parser::ItsMessage;
|
||||||
|
use c_its_parser::standards::extensions::ItsMessageId;
|
||||||
|
|
||||||
|
debug!("Got new {:?} message", ItsMessageId::from(&msg));
|
||||||
|
|
||||||
|
match msg {
|
||||||
|
#[cfg(feature = "spat")]
|
||||||
|
ItsMessage::Mapem {
|
||||||
|
geonetworking: _,
|
||||||
|
transport: _,
|
||||||
|
etsi,
|
||||||
|
} => state.handle_mapem(&etsi),
|
||||||
|
#[cfg(feature = "spat")]
|
||||||
|
ItsMessage::Spatem {
|
||||||
|
geonetworking: _,
|
||||||
|
transport: _,
|
||||||
|
etsi,
|
||||||
|
} => {
|
||||||
|
if state.initialized() {
|
||||||
|
state.handle_spatem(&etsi);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "cam")]
|
||||||
|
ItsMessage::Cam {
|
||||||
|
geonetworking: _,
|
||||||
|
transport: _,
|
||||||
|
etsi,
|
||||||
|
} => applogic::cam::handle_cam(&etsi),
|
||||||
|
|
||||||
|
#[cfg(feature = "denm")]
|
||||||
|
ItsMessage::DenmV2 {
|
||||||
|
geonetworking: _,
|
||||||
|
transport: _,
|
||||||
|
etsi,
|
||||||
|
} => applogic::denm::handle_denm(&etsi),
|
||||||
|
#[cfg(feature = "denm")]
|
||||||
|
ItsMessage::DenmV1 {
|
||||||
|
geonetworking: _,
|
||||||
|
transport: _,
|
||||||
|
etsi: _,
|
||||||
|
} => {
|
||||||
|
// irrelevant since all received DENMs should be parsed as v2
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Err(err) => {
|
||||||
|
// will give false-positives when a message is received which wasn't enabled
|
||||||
|
debug!("Failed to parse V2X message: {err}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// maintenance
|
// maintenance
|
||||||
state.prune();
|
state.prune();
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue