screen: Show lane types
This commit is contained in:
parent
2b9e50c16c
commit
7bbdae9243
8 changed files with 172 additions and 40 deletions
|
|
@ -191,27 +191,35 @@ impl Intersection {
|
|||
fn collect_signal_groups(lanes: &[Lane]) -> Vec<SignalGroup> {
|
||||
let mut connections = lanes
|
||||
.iter()
|
||||
.flat_map(|i| i.connections.clone())
|
||||
.filter(|i| i.signal_group.is_some())
|
||||
.flat_map(ConnectionExt::from_lane)
|
||||
.filter(|i| i.conn.signal_group.is_some())
|
||||
.collect::<Vec<_>>();
|
||||
|
||||
connections.sort_by_key(|i| i.signal_group.unwrap_or_default());
|
||||
connections.sort_by_key(|i| i.conn.signal_group.unwrap_or_default());
|
||||
|
||||
let chunks = connections.chunk_by(|a, b| a.signal_group == b.signal_group);
|
||||
let chunks = connections.chunk_by(|a, b| a.conn.signal_group == b.conn.signal_group);
|
||||
chunks
|
||||
.map(|chunk| {
|
||||
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 (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);
|
||||
|
||||
(i.signal_group, new_maneuvers, lanes)
|
||||
},
|
||||
);
|
||||
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)
|
||||
},
|
||||
);
|
||||
|
||||
// unwrap is fine since we removed all connections without signal group beforehand
|
||||
let id = sig_grp_id.unwrap();
|
||||
|
|
@ -226,6 +234,7 @@ impl Intersection {
|
|||
SignalGroup {
|
||||
id,
|
||||
maneuvers,
|
||||
source_lane_usages,
|
||||
target_lanes,
|
||||
phase: None,
|
||||
min_end_time: None,
|
||||
|
|
@ -402,6 +411,28 @@ impl From<&etsi_its_dsrc::Connection> for Connection {
|
|||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
#[allow(unused)]
|
||||
struct ConnectionExt {
|
||||
source_lane_id: u8,
|
||||
source_lane_usages: Vec<UsageType>,
|
||||
conn: Connection,
|
||||
}
|
||||
|
||||
impl ConnectionExt {
|
||||
fn from_lane(value: &Lane) -> Vec<Self> {
|
||||
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`,
|
||||
|
|
@ -411,7 +442,8 @@ impl From<&etsi_its_dsrc::Connection> for Connection {
|
|||
pub struct SignalGroup {
|
||||
id: u8,
|
||||
maneuvers: Option<Maneuvers>,
|
||||
target_lanes: Vec<u8>, // mainly for debugging
|
||||
source_lane_usages: Vec<UsageType>, // for easier signal group evaluation
|
||||
target_lanes: Vec<u8>, // mainly for debugging
|
||||
|
||||
// SPAT data
|
||||
/// current signal phase
|
||||
|
|
@ -441,6 +473,9 @@ impl SignalGroup {
|
|||
pub fn maneuvers(&self) -> Option<Maneuvers> {
|
||||
self.maneuvers
|
||||
}
|
||||
pub fn source_lane_usages(&self) -> &[UsageType] {
|
||||
&self.source_lane_usages
|
||||
}
|
||||
pub fn phase(&self) -> Option<etsi_its_dsrc::MovementPhaseState> {
|
||||
self.phase
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue