Improve Uberturns (#518)

If starting an UT and blocked, remove the reservation, allowing others to proceed.
If awakened, and banned and reserved attempt to proceed through the intersection.
This commit is contained in:
Bruce 2021-02-16 13:32:59 -08:00 committed by GitHub
parent 1fa57a1e17
commit e6e3fc844a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -140,6 +140,7 @@ impl IntersectionSimState {
) {
let state = self.state.get_mut(&turn.parent).unwrap();
assert!(state.accepted.remove(&Request { agent, turn }));
state.reserved.remove(&Request { agent, turn });
if !handling_live_edits && map.get_t(turn).turn_type != TurnType::SharedSidewalkCorner {
self.wakeup_waiting(now, turn.parent, scheduler, map);
@ -219,7 +220,9 @@ impl IntersectionSimState {
protected.push(req);
}
} else if let Some(ref signal) = map.maybe_get_traffic_signal(i) {
let stage = &signal.stages[self.state[&i].signal.as_ref().unwrap().current_stage];
let current_stage = self.state[&i].signal.as_ref().unwrap().current_stage;
let stage = &signal.stages[current_stage];
let reserved = &self.state[&i].reserved;
for (req, _) in all {
match stage.get_priority_of_turn(req.turn, signal) {
TurnPriority::Protected => {
@ -228,8 +231,12 @@ impl IntersectionSimState {
TurnPriority::Yield => {
yielding.push(req);
}
// No need to wake up
TurnPriority::Banned => {}
// No need to wake up unless it has reserved
TurnPriority::Banned => {
if reserved.contains(&req) {
protected.push(req);
}
}
}
}
} else if let Some(ref sign) = map.maybe_get_stop_sign(i) {
@ -441,6 +448,21 @@ impl IntersectionSimState {
if repeat_request {
self.not_allowed_requests += 1;
}
// remove the reservation if we're about to start a UT and can't move
if self.handle_uber_turns {
if let Some(ut) = maybe_cars_and_queues
.as_ref()
.and_then(|(car, _, _)| car.router.get_path().about_to_start_ut())
{
for t in &ut.path {
self.state
.get_mut(&t.parent)
.unwrap()
.reserved
.remove(&Request { agent, turn: *t });
}
}
}
return false;
}
@ -531,7 +553,6 @@ impl IntersectionSimState {
retain_btreeset(&mut self.blocked_by, |(c, _)| *c != car);
}
}
true
}