@@ -8,17 +8,16 @@ use tokio_util::sync::CancellationToken;
88
99use hula_types:: hardware:: Ids ;
1010use path_serde:: { PathDeserialize , PathIntrospect , PathSerialize } ;
11- use types:: {
12- ball_position:: SimulatorBallState , field_dimensions:: FieldDimensions , players:: Players ,
13- } ;
11+ use types:: { ball_position:: SimulatorBallState , players:: Players } ;
1412
15- use crate :: { cyclers:: control:: Database , recorder:: Frame , robot:: to_player_number} ;
13+ use crate :: {
14+ cyclers:: control:: Database , recorder:: Frame , robot:: to_player_number, structs:: Parameters ,
15+ } ;
1616
1717#[ derive( Clone , Serialize , Deserialize , PathSerialize , PathDeserialize , PathIntrospect ) ]
18- pub struct Parameters {
18+ pub struct SimulatorState {
1919 selected_frame : usize ,
2020 selected_robot : usize ,
21- pub field_dimensions : FieldDimensions ,
2221}
2322
2423#[ derive( Clone , Default , Serialize , PathSerialize , PathIntrospect ) ]
@@ -35,9 +34,10 @@ struct BehaviorSimulatorDatabase {
3534
3635async fn timeline_server (
3736 keep_running : CancellationToken ,
38- mut parameters_reader : buffered_watch:: Receiver < ( SystemTime , Parameters ) > ,
37+ mut simulator_state_reader : buffered_watch:: Receiver < ( SystemTime , SimulatorState ) > ,
3938 mut outputs_writer : buffered_watch:: Sender < ( SystemTime , BehaviorSimulatorDatabase ) > ,
4039 mut control_writer : buffered_watch:: Sender < ( SystemTime , Database ) > ,
40+ mut parameter_writer : buffered_watch:: Sender < ( SystemTime , Parameters ) > ,
4141 mut frame_receiver : UnboundedReceiver < Frame > ,
4242) {
4343 let mut frames = Vec :: < Frame > :: new ( ) ;
@@ -61,26 +61,46 @@ async fn timeline_server(
6161 }
6262 }
6363 }
64- _ = parameters_reader . wait_for_change( ) => { }
64+ _ = simulator_state_reader . wait_for_change( ) => { }
6565 _ = keep_running. cancelled( ) => {
6666 break
6767 }
6868 }
6969
70- let ( _, parameters ) = & * parameters_reader . borrow_and_mark_as_seen ( ) ;
71- if let Some ( frame) = & frames. get ( parameters . selected_frame ) {
70+ let ( _, simulator_state ) = & * simulator_state_reader . borrow_and_mark_as_seen ( ) ;
71+ if let Some ( frame) = & frames. get ( simulator_state . selected_frame ) {
7272 {
7373 let ( time, outputs) = & mut * outputs_writer. borrow_mut ( ) ;
7474 outputs. main_outputs . frame_count = frames. len ( ) ;
7575 outputs. main_outputs . ball . clone_from ( & frame. ball ) ;
76- outputs. main_outputs . databases = frame. robots . clone ( ) ;
76+ outputs. main_outputs . databases = frame. robots . as_ref ( ) . map ( |maybe_robot_frame| {
77+ maybe_robot_frame
78+ . as_ref ( )
79+ . map ( |robot_frame| robot_frame. database . clone ( ) )
80+ } ) ;
7781 * time = frame. timestamp ;
7882 }
7983 {
8084 let ( time, control) = & mut * control_writer. borrow_mut ( ) ;
81- * control = to_player_number ( parameters. selected_robot )
85+ * control = to_player_number ( simulator_state. selected_robot )
86+ . ok ( )
87+ . and_then ( |player_number| {
88+ frame. robots [ player_number]
89+ . as_ref ( )
90+ . map ( |robot_frame| robot_frame. database . clone ( ) )
91+ } )
92+ . unwrap_or_default ( ) ;
93+ * time = frame. timestamp ;
94+ }
95+ {
96+ let ( time, parameters) = & mut * parameter_writer. borrow_mut ( ) ;
97+ * parameters = to_player_number ( simulator_state. selected_robot )
8298 . ok ( )
83- . and_then ( |player_number| frame. robots [ player_number] . clone ( ) )
99+ . and_then ( |player_number| {
100+ frame. robots [ player_number]
101+ . as_ref ( )
102+ . map ( |robot_frame| robot_frame. parameters . clone ( ) )
103+ } )
84104 . unwrap_or_default ( ) ;
85105 * time = frame. timestamp ;
86106 }
@@ -97,12 +117,12 @@ pub async fn run(
97117 body_id : "behavior_simulator" . to_string ( ) ,
98118 head_id : "behavior_simulator" . to_string ( ) ,
99119 } ;
100- let parameters_from_disk : Parameters =
120+ let initial_simulator_state : SimulatorState =
101121 parameters:: directory:: deserialize ( "crates/bevyhavior_simulator" , & ids, true )
102122 . wrap_err ( "failed to parse initial parameters" ) ?;
103- let initial_parameters = parameters_from_disk ;
104- let ( parameters_sender , parameters_receiver ) =
105- buffered_watch:: channel ( ( std:: time:: SystemTime :: now ( ) , initial_parameters ) ) ;
123+
124+ let ( simulator_state_sender , simulator_state_receiver ) =
125+ buffered_watch:: channel ( ( std:: time:: SystemTime :: now ( ) , initial_simulator_state ) ) ;
106126
107127 let ( outputs_sender, outputs_receiver) =
108128 buffered_watch:: channel ( ( UNIX_EPOCH , Default :: default ( ) ) ) ;
@@ -113,32 +133,38 @@ pub async fn run(
113133 let ( control_writer, control_reader) =
114134 buffered_watch:: channel ( ( UNIX_EPOCH , Default :: default ( ) ) ) ;
115135
116- let ( subscribed_control_writer , _subscribed_control_reader ) =
117- buffered_watch:: channel ( Default :: default ( ) ) ;
136+ let ( parameter_writer , parameter_reader ) =
137+ buffered_watch:: channel ( ( UNIX_EPOCH , Default :: default ( ) ) ) ;
118138
119139 let mut communication_server = communication:: server:: Server :: default ( ) ;
140+
141+ let ( control_subscriptions, _) = buffered_watch:: channel ( Default :: default ( ) ) ;
120142 let ( parameters_subscriptions, _) = buffered_watch:: channel ( Default :: default ( ) ) ;
143+ let ( simulator_state_subscriptions, _) = buffered_watch:: channel ( Default :: default ( ) ) ;
144+
121145 communication_server. expose_source (
122146 "BehaviorSimulator" ,
123147 outputs_receiver,
124148 subscribed_outputs_sender,
125149 ) ?;
126- communication_server. expose_source ( "Control" , control_reader, subscribed_control_writer) ?;
150+ communication_server. expose_source ( "Control" , control_reader, control_subscriptions) ?;
151+ communication_server. expose_source ( "parameters" , parameter_reader, parameters_subscriptions) ?;
127152 communication_server. expose_source (
128- "parameters " ,
129- parameters_receiver . clone ( ) ,
130- parameters_subscriptions ,
153+ "simulator " ,
154+ simulator_state_receiver . clone ( ) ,
155+ simulator_state_subscriptions ,
131156 ) ?;
132- communication_server. expose_sink ( "parameters " , parameters_sender ) ?;
157+ communication_server. expose_sink ( "simulator " , simulator_state_sender ) ?;
133158
134159 {
135160 let keep_running = keep_running. clone ( ) ;
136161 tokio:: spawn ( async {
137162 timeline_server (
138163 keep_running,
139- parameters_receiver ,
164+ simulator_state_receiver ,
140165 outputs_sender,
141166 control_writer,
167+ parameter_writer,
142168 frame_receiver,
143169 )
144170 . await
0 commit comments