diff --git a/src/applogic/mod.rs b/src/applogic/mod.rs index bf078a0..0ced524 100644 --- a/src/applogic/mod.rs +++ b/src/applogic/mod.rs @@ -106,7 +106,6 @@ pub struct GlosaSignalInfo { pub struct SignalGroupData { pub phase: SignalPhase, pub maneuver: map::Maneuvers, - pub usages: Vec, pub timing: Option, } @@ -384,29 +383,35 @@ impl State { }), ) } else { - // get signal groups which are in our approach and have a maneuver + // get signal groups which are in our approach let mut approach_sig_grps = intersection .signal_groups() .iter() - .filter_map(|i| { - if let Some(maneuver) = i.maneuvers() - && info - .signal_groups - .iter() - .find(|sg_id| **sg_id == i.id()) - .is_some() - { - let phase = i + .filter(|i| { + info.signal_groups + .iter() + .find(|sg_id| **sg_id == i.id()) + .is_some() + }) + .collect::>(); + + // sort signal groups by maneuver + approach_sig_grps.sort_by_key(|v| v.maneuvers()); + + // display signal phases + let sig_grps = approach_sig_grps + .iter() + .filter_map(|sig| { + if let Some(maneuver) = sig.maneuvers() { + let phase = sig .phase() .map(core::convert::Into::into) .unwrap_or_default(); - let timing = TimingData::new(i, self.time.and_utc()); - let usages = i.source_lane_usages().to_vec(); + let timing = TimingData::new(sig, self.time.and_utc()); Some(SignalGroupData { phase, maneuver, - usages, timing, }) } else { @@ -415,39 +420,11 @@ impl State { }) .collect::>(); - // sort signal groups by maneuver - approach_sig_grps.sort_by_key(|v| v.maneuver); - - // // display signal phases - // let sig_grps = approach_sig_grps - // .iter() - // .filter_map(|sig| { - // if let Some(maneuver) = sig.sig_group.maneuvers() { - // let phase = sig - // .sig_group - // .phase() - // .map(core::convert::Into::into) - // .unwrap_or_default(); - // let timing = - // TimingData::new(&sig.sig_group, self.time.and_utc()); - - // Some(SignalGroupData { - // phase, - // maneuver, - // timing, - // usages: sig.lane_types.clone(), - // }) - // } else { - // None - // } - // }) - // .collect::>(); - ( None, GlosaOutput::Locked(GlosaSignalInfo { intersection_id: intersection.id(), - signal_groups: approach_sig_grps, + signal_groups: sig_grps, }), ) // keep state, return signal groups } diff --git a/src/applogic/v2x/map.rs b/src/applogic/v2x/map.rs index 1e1055f..d7e2195 100644 --- a/src/applogic/v2x/map.rs +++ b/src/applogic/v2x/map.rs @@ -191,35 +191,27 @@ impl Intersection { fn collect_signal_groups(lanes: &[Lane]) -> Vec { let mut connections = lanes .iter() - .flat_map(ConnectionExt::from_lane) - .filter(|i| i.conn.signal_group.is_some()) + .flat_map(|i| i.connections.clone()) + .filter(|i| i.signal_group.is_some()) .collect::>(); - connections.sort_by_key(|i| i.conn.signal_group.unwrap_or_default()); + connections.sort_by_key(|i| i.signal_group.unwrap_or_default()); - let chunks = connections.chunk_by(|a, b| a.conn.signal_group == b.conn.signal_group); + let chunks = connections.chunk_by(|a, b| a.signal_group == b.signal_group); chunks .map(|chunk| { - let (sig_grp_id, maneuvers, mut target_lanes, mut source_lane_usages) = - chunk.iter().fold( - (None, Maneuvers::default(), vec![], vec![]), - |(sig_grp_id, maneuvers, mut lanes, mut usages), i| { - let new_maneuvers = i - .conn - .maneuvers - .map(|v| core::ops::Add::add(maneuvers, v)) - .unwrap_or_default(); - lanes.push(i.conn.target_lane_id); + let (sig_grp_id, maneuvers, mut target_lanes) = chunk.iter().fold( + (None, Maneuvers::default(), vec![]), + |(sig_grp_id, maneuvers, mut lanes), i| { + let new_maneuvers = i + .maneuvers + .map(|v| core::ops::Add::add(maneuvers, v)) + .unwrap_or_default(); + lanes.push(i.target_lane_id); - let lane_usages = i.source_lane_usages.clone(); - usages.extend_from_slice(&lane_usages); - - usages.sort_unstable(); - usages.dedup(); // TODO: only do this after all lanes were added? - - (i.conn.signal_group, new_maneuvers, lanes, usages) - }, - ); + (i.signal_group, new_maneuvers, lanes) + }, + ); // unwrap is fine since we removed all connections without signal group beforehand let id = sig_grp_id.unwrap(); @@ -234,7 +226,6 @@ impl Intersection { SignalGroup { id, maneuvers, - source_lane_usages, target_lanes, phase: None, min_end_time: None, @@ -411,28 +402,6 @@ impl From<&etsi_its_dsrc::Connection> for Connection { } } -#[derive(Debug, Clone)] -#[allow(unused)] -struct ConnectionExt { - source_lane_id: u8, - source_lane_usages: Vec, - conn: Connection, -} - -impl ConnectionExt { - fn from_lane(value: &Lane) -> Vec { - value - .connections - .iter() - .map(|conn| Self { - source_lane_id: value.id, - source_lane_usages: value.usages.clone(), - conn: *conn, - }) - .collect() - } -} - /// Different view on a lane connection /// /// Technically this data is redundant with the `Connection` data of a `Lane`, @@ -442,8 +411,7 @@ impl ConnectionExt { pub struct SignalGroup { id: u8, maneuvers: Option, - source_lane_usages: Vec, // for easier signal group evaluation - target_lanes: Vec, // mainly for debugging + target_lanes: Vec, // mainly for debugging // SPAT data /// current signal phase @@ -473,9 +441,6 @@ impl SignalGroup { pub fn maneuvers(&self) -> Option { self.maneuvers } - pub fn source_lane_usages(&self) -> &[UsageType] { - &self.source_lane_usages - } pub fn phase(&self) -> Option { self.phase } diff --git a/src/screen.rs b/src/screen.rs index 4cd6106..791d086 100644 --- a/src/screen.rs +++ b/src/screen.rs @@ -308,9 +308,9 @@ where self.clear(); } else { // only clear maneuver and timing area otherwise - let sig_total_height = 97 + if is_big_height { 20 } else { 0 }; + let sig_total_height = 67 + if is_big_height { 20 } else { 0 }; primitives::Rectangle::new( - geometry::Point::new(0, 100 - 25 + self.size.offset_top), + geometry::Point::new(0, 105 + self.size.offset_top), geometry::Size::new(self.size.width.into(), sig_total_height), ) .into_styled(Self::BK_STYLE) @@ -355,22 +355,7 @@ where .into_styled(style) .draw(&mut self.target)?; - // draw lane type - let lane_type_symbol = if sig.usages.contains(&applogic::v2x::map::UsageType::Bike) { - "B" // TODO: rather do a bike symbol? - } else if sig.usages.contains(&applogic::v2x::map::UsageType::Vehicle) { - " " - } else { - "?" - }; - - text::Text::with_alignment( - &lane_type_symbol, - geometry::Point::new(centerline, 100 + self.size.offset_top), - Self::DEFAULT_TEXT_STYLE, - text::Alignment::Center, - ) - .draw(&mut self.target)?; + // TODO: draw lane type? // draw maneuver text::Text::with_alignment(