1+ use std:: time:: Duration ;
2+
13use color_eyre:: { eyre:: OptionExt , Result } ;
24use linear_algebra:: Vector2 ;
35use serde:: { Deserialize , Serialize } ;
@@ -14,6 +16,7 @@ use types::{
1416#[ derive( Deserialize , Serialize ) ]
1517pub struct BallFilter {
1618 last_ball_position : Option < BallPosition < Ground > > ,
19+ last_ball_time : Option < CycleTime > ,
1720}
1821
1922#[ context]
@@ -36,6 +39,7 @@ impl BallFilter {
3639 pub fn new ( _context : CreationContext ) -> Result < Self > {
3740 Ok ( Self {
3841 last_ball_position : None ,
42+ last_ball_time : None ,
3943 } )
4044 }
4145
@@ -53,9 +57,22 @@ impl BallFilter {
5357 last_seen : context. cycle_time . start_time ,
5458 } ) ;
5559 self . last_ball_position = ball_position;
60+ self . last_ball_time = Some ( * context. cycle_time ) ;
5661 ball_position
5762 }
58- ( None , Some ( last_ball_position) ) => Some ( last_ball_position) ,
63+ ( None , Some ( last_ball_position) ) => {
64+ if self . last_ball_time . is_some ( )
65+ && Duration :: from_secs_f32 ( 2.0 )
66+ < context
67+ . cycle_time
68+ . start_time
69+ . duration_since ( self . last_ball_time . unwrap ( ) . start_time ) ?
70+ {
71+ self . last_ball_position = None ;
72+ self . last_ball_time = None ;
73+ }
74+ Some ( last_ball_position)
75+ }
5976 _ => None ,
6077 } ;
6178
0 commit comments