11use std:: sync:: atomic:: { AtomicBool , Ordering } ;
22use std:: sync:: Arc ;
3- use std:: time:: SystemTime ;
3+ use std:: time:: { Duration , SystemTime } ;
44
55use booster:: { ButtonEventMsg , FallDownState , LowCommand , LowState , RemoteControllerState } ;
66use color_eyre:: eyre:: { Context , OptionExt } ;
@@ -21,6 +21,7 @@ use parking_lot::Mutex;
2121use ros2:: geometry_msgs:: transform_stamped:: TransformStamped ;
2222use serde:: Deserialize ;
2323use tokio:: sync:: mpsc:: { channel, Receiver , Sender } ;
24+ use tokio:: time:: sleep;
2425use tokio_tungstenite:: tungstenite:: Message ;
2526use tokio_util:: sync:: CancellationToken ;
2627use types:: audio:: SpeakerRequest ;
@@ -85,12 +86,12 @@ impl MujocoHardwareInterface {
8586 } ;
8687
8788 let time = Arc :: new ( Mutex :: new ( SystemTime :: UNIX_EPOCH ) ) ;
88- tokio:: spawn ( worker (
89+ tokio:: spawn ( keep_running . clone ( ) . run_until_cancelled_owned ( worker (
8990 time. clone ( ) ,
9091 parameters. mujoco_websocket_address ,
9192 keep_running. clone ( ) ,
9293 worker_channels,
93- ) ) ;
94+ ) ) ) ;
9495
9596 Ok ( Self {
9697 paths : parameters. paths ,
@@ -114,13 +115,15 @@ async fn worker(
114115 keep_running : CancellationToken ,
115116 mut worker_channels : WorkerChannels ,
116117) -> Result < ( ) > {
117- let websocket = tokio_tungstenite:: connect_async ( address) . await ;
118-
119- let Ok ( ( mut websocket, _) ) = websocket else {
120- log:: warn!( "connecting to websocket failed" ) ;
121- keep_running. cancel ( ) ;
122- return Ok ( ( ) ) ;
118+ let mut websocket = loop {
119+ let websocket = tokio_tungstenite:: connect_async ( & address) . await ;
120+ if let Ok ( ( websocket, _) ) = websocket {
121+ break websocket;
122+ } ;
123+ log:: info!( "connecting to websocket failed, retrying..." ) ;
124+ sleep ( Duration :: from_secs_f32 ( 1.0 ) ) . await ;
123125 } ;
126+
124127 loop {
125128 tokio:: select! {
126129 maybe_websocket_event = websocket. next( ) => {
0 commit comments