diff --git a/src/applogic/mod.rs b/src/applogic/mod.rs index f0f89f9..cdb057e 100644 --- a/src/applogic/mod.rs +++ b/src/applogic/mod.rs @@ -66,7 +66,7 @@ pub struct State { pub struct SignalGroupData { pub phase: SignalPhase, pub maneuver: map::Maneuvers, - pub min_end_sec: Option, + pub end_sec: Option, } #[cfg(feature = "spat")] @@ -290,19 +290,23 @@ impl State { .map(core::convert::Into::into) .unwrap_or_default(); - let min_end_sec = sig.min_end_time().map(|time| { - let dur = time.sub(self.time.and_utc()).as_seconds_f32(); + let end_sec = + sig.likely_time() + .or_else(|| sig.min_end_time()) + .map(|time| { + let dur = + time.sub(self.time.and_utc()).as_seconds_f32(); - #[allow(clippy::cast_possible_truncation)] - let min_end_sec = dur.round() as i16; + #[allow(clippy::cast_possible_truncation)] + let end_sec = dur.round() as i16; - min_end_sec - }); + end_sec + }); Some(SignalGroupData { phase, maneuver: manv, - min_end_sec, + end_sec, }) } else { None diff --git a/src/applogic/v2x/map.rs b/src/applogic/v2x/map.rs index 44f4ef9..c8f781f 100644 --- a/src/applogic/v2x/map.rs +++ b/src/applogic/v2x/map.rs @@ -160,12 +160,19 @@ impl Intersection { && let Some(sig_grp) = self.signal_groups.get_mut(idx) { sig_grp.phase = Some(event.event_state); - if let Some(timing) = &event.timing - && !timing.min_end_time.is_out_of_range() - && !timing.min_end_time.is_unknown() - { - sig_grp.min_end_time = - Some(timing.min_end_time.to_datetime_from_moy(moy, year)); + if let Some(timing) = &event.timing { + if !timing.min_end_time.is_out_of_range() + && !timing.min_end_time.is_unknown() + { + sig_grp.min_end_time = + Some(timing.min_end_time.to_datetime_from_moy(moy, year)); + } + if let Some(likely) = &timing.likely_time + && !likely.is_out_of_range() + && !likely.is_unknown() + { + sig_grp.likely_time = Some(likely.to_datetime_from_moy(moy, year)); + } } } } else { @@ -216,6 +223,7 @@ impl Intersection { target_lanes, phase: None, min_end_time: None, + likely_time: None, } }) .collect() @@ -403,7 +411,7 @@ pub struct SignalGroup { phase: Option, min_end_time: Option>, // max_end_time: Option>, - // likely_time: Option>, + likely_time: Option>, } impl core::fmt::Display for SignalGroup { @@ -432,6 +440,9 @@ impl SignalGroup { pub fn min_end_time(&self) -> Option> { self.min_end_time } + pub fn likely_time(&self) -> Option> { + self.likely_time + } pub fn phase_to_str(&self) -> Option { self.phase.map(|v| { diff --git a/src/main.rs b/src/main.rs index 7c23a1a..850e495 100644 --- a/src/main.rs +++ b/src/main.rs @@ -180,7 +180,7 @@ async fn main(spawner: Spawner) -> ! { for sig in &signal_groups { let duration_str = sig - .min_end_sec + .end_sec .map(|v| alloc::format!("for {v} s")) .unwrap_or_default(); println!("GLOSA: {} {} {duration_str}", sig.maneuver, sig.phase); diff --git a/src/screen.rs b/src/screen.rs index 065d6e6..28c1eb8 100644 --- a/src/screen.rs +++ b/src/screen.rs @@ -119,9 +119,9 @@ where .draw(target)?; // draw timing indicator - if let Some(min_end_sec) = sig.min_end_sec { + if let Some(end_sec) = sig.end_sec { text::Text::with_alignment( - &alloc::format!("{min_end_sec}s"), + &alloc::format!("{end_sec}s"), geometry::Point::new(centerline, 160), text_style, text::Alignment::Center,