From f1db458f8a69496ad25099dbbbf31d586b2bbf27 Mon Sep 17 00:00:00 2001 From: Fyor Klein Gunnewiek Date: Fri, 18 Jul 2025 13:14:07 -0300 Subject: [PATCH] Use a timer to obey kick-off from whistle --- yggdrasil/src/behavior/roles/striker.rs | 27 +++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/yggdrasil/src/behavior/roles/striker.rs b/yggdrasil/src/behavior/roles/striker.rs index ec6e36df1..73d95e764 100644 --- a/yggdrasil/src/behavior/roles/striker.rs +++ b/yggdrasil/src/behavior/roles/striker.rs @@ -22,7 +22,7 @@ use crate::{ vision::ball_detection::ball_tracker::BallTracker, }; -use std::time::Duration; +use std::time::{Duration, Instant}; const WALK_WITH_BALL_ANGLE: f32 = 0.3; const ALIGN_WITH_BALL_DISTANCE: f32 = 0.3; @@ -47,14 +47,37 @@ fn in_set_play( gamecontroller_message: Option>, primary_state: Res, player_config: Res, + mut whistle_time: Local>, ) -> bool { if let Some(message) = gamecontroller_message { return match *primary_state { // return true if there is a set play OR we are in Playing state with a secondary time (Kick-Off) - PrimaryState::Playing { .. } => { + PrimaryState::Playing { + whistle_in_set: false, + } => { + *whistle_time = None; + (message.set_play != SetPlay::None || message.secondary_time != 0) && message.kicking_team != player_config.team_number } + PrimaryState::Playing { + whistle_in_set: true, + } => { + if message.kicking_team == player_config.team_number { + false + } else if let Some(instant) = *whistle_time { + if instant.elapsed() > Duration::from_secs(10) { + false + } else { + // Await timer + true + } + } else { + *whistle_time = Some(Instant::now()); + // Await timer + return true; + } + } _ => false, }; }