Skip to content

Commit 716f64d

Browse files
authored
Add loser timeout (#2076)
1 parent ffc35a8 commit 716f64d

File tree

2 files changed

+28
-3
lines changed

2 files changed

+28
-3
lines changed

crates/control/src/role_assignment.rs

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ pub struct RoleAssignment {
4646
last_received_striker_message: Option<SystemTime>,
4747
last_system_time_transmitted_game_controller_return_message: Option<SystemTime>,
4848
last_transmitted_spl_message: Option<SystemTime>,
49+
loser_since: Option<SystemTime>,
4950
role: Role,
5051
last_time_player_was_penalized: Players<Option<SystemTime>>,
5152
last_sent_state: SentState,
@@ -79,6 +80,7 @@ pub struct CycleContext {
7980
Parameter<Duration, "role_assignment.keeper_replacementkeeper_switch_time">,
8081
maximum_trusted_team_ball_age:
8182
Parameter<Duration, "role_assignment.maximum_trusted_team_ball_age">,
83+
loser_timeout: Parameter<Duration, "role_assignment.loser_timeout">,
8284
claim_striker_from_team_ball: Parameter<bool, "role_assignment.claim_striker_from_team_ball">,
8385
initial_poses: Parameter<Players<InitialPose>, "localization.initial_poses">,
8486
optional_roles: Parameter<Vec<Role>, "behavior.optional_roles">,
@@ -116,6 +118,7 @@ impl RoleAssignment {
116118
last_received_striker_message: None,
117119
last_system_time_transmitted_game_controller_return_message: None,
118120
last_transmitted_spl_message: None,
121+
loser_since: None,
119122
role,
120123
last_time_player_was_penalized: Players::new(None),
121124
last_sent_state: SentState::Loser,
@@ -328,9 +331,17 @@ impl RoleAssignment {
328331
context.filtered_game_controller_state,
329332
*context.player_number,
330333
*context.maximum_trusted_team_ball_age,
334+
self.loser_since,
335+
*context.loser_timeout,
331336
*context.claim_striker_from_team_ball,
332337
context.optional_roles,
333338
);
339+
340+
self.loser_since = match (new_role, self.loser_since) {
341+
(Role::Loser, None) => Some(cycle_start_time),
342+
(Role::Loser, loser_since) => loser_since,
343+
_ => None,
344+
}
334345
}
335346

336347
new_role
@@ -559,6 +570,8 @@ fn update_role_state_machine(
559570
filtered_game_controller_state: Option<&FilteredGameControllerState>,
560571
player_number: PlayerNumber,
561572
maximum_trusted_team_ball_age: Duration,
573+
loser_since: Option<SystemTime>,
574+
loser_timeout: Duration,
562575
claim_striker_from_team_ball: bool,
563576
optional_roles: &[Role],
564577
) -> Role {
@@ -594,9 +607,14 @@ fn update_role_state_machine(
594607
// Edge-case, another Striker became Loser, so we claim striker since we see a ball
595608
(Role::Striker, true, Event::Loser) => Role::Striker,
596609

597-
// Loser remains Loser
598-
(Role::Loser, false, Event::None) => Role::Loser,
599-
(Role::Loser, false, Event::Loser) => Role::Loser,
610+
// Loser remains Loser, but becomes Searcher after a timeout
611+
(Role::Loser, false, Event::None | Event::Loser) => {
612+
if cycle_start_time.duration_since(loser_since.unwrap_or(SystemTime::UNIX_EPOCH)).expect("time ran backwards") < loser_timeout {
613+
Role::Loser
614+
} else {
615+
Role::Searcher
616+
}
617+
},
600618

601619
// Loser found ball and becomes Striker
602620
(Role::Loser, true, Event::None) => Role::Striker,
@@ -895,9 +913,11 @@ mod test {
895913
filtered_game_controller_state in prop_oneof![Just(None), Just(Some(FilteredGameControllerState{game_phase: GamePhase::PenaltyShootout{kicking_team: Team::Hulks}, ..Default::default()}))],
896914
player_number in Just(PlayerNumber::Five),
897915
maximum_trusted_team_ball_age in Just(Duration::from_secs(5)),
916+
loser_timeout in Just(Duration::from_secs(5)),
898917
claim_striker_from_team_ball: bool,
899918
optional_roles in Just(&[Role::DefenderLeft, Role::StrikerSupporter])
900919
) {
920+
let loser_since = Some(cycle_start_time - Duration::from_secs(4));
901921
let filtered_game_controller_state: Option<FilteredGameControllerState> = filtered_game_controller_state;
902922
let new_role = update_role_state_machine(
903923
initial_role,
@@ -909,6 +929,8 @@ mod test {
909929
filtered_game_controller_state.as_ref(),
910930
player_number,
911931
maximum_trusted_team_ball_age,
932+
loser_since,
933+
loser_timeout,
912934
claim_striker_from_team_ball,
913935
optional_roles,
914936
);
@@ -922,6 +944,8 @@ mod test {
922944
filtered_game_controller_state.as_ref(),
923945
player_number,
924946
maximum_trusted_team_ball_age,
947+
loser_since,
948+
loser_timeout,
925949
claim_striker_from_team_ball,
926950
optional_roles,
927951
);

etc/parameters/default.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1208,6 +1208,7 @@
12081208
"forced_role": null,
12091209
"keeper_replacementkeeper_switch_time": { "nanos": 0, "secs": 12 },
12101210
"maximum_trusted_team_ball_age": { "nanos": 0, "secs": 1 },
1211+
"loser_timeout": { "nanos": 0, "secs": 5 },
12111212
"claim_striker_from_team_ball": false
12121213
},
12131214
"walk_speed": {

0 commit comments

Comments
 (0)