@@ -3,7 +3,7 @@ use std::{
33 atomic:: { AtomicBool , Ordering } ,
44 Arc ,
55 } ,
6- thread,
6+ thread:: { self , JoinHandle } ,
77 time:: { Duration , SystemTime } ,
88} ;
99
@@ -19,18 +19,22 @@ pub struct RemotePanel {
1919 nao : Arc < Nao > ,
2020 enabled : Arc < AtomicBool > ,
2121 latest_step : BufferHandle < Step > ,
22+ bg_running : Arc < AtomicBool > ,
23+ bg_handle : Option < JoinHandle < ( ) > > ,
2224}
2325impl Panel for RemotePanel {
2426 const NAME : & ' static str = "Remote" ;
2527
2628 fn new ( nao : Arc < Nao > , _value : Option < & Value > ) -> Self {
2729 let enabled = Arc :: new ( AtomicBool :: new ( false ) ) ;
2830 let latest_step = nao. subscribe_value ( "parameters.remote_control_parameters.walk" ) ;
31+ let bg_running = Arc :: new ( AtomicBool :: new ( true ) ) ;
2932
3033 let nao_clone = nao. clone ( ) ;
3134 let enabled_clone = enabled. clone ( ) ;
35+ let bg_running_clone = bg_running. clone ( ) ;
3236
33- thread:: spawn ( move || {
37+ let handle = thread:: spawn ( move || {
3438 let mut gilrs = match Gilrs :: new ( ) {
3539 Ok ( g) => g,
3640 Err ( e) => {
@@ -46,7 +50,9 @@ impl Panel for RemotePanel {
4650 . checked_sub ( UPDATE_DELAY )
4751 . unwrap_or ( SystemTime :: now ( ) ) ;
4852
49- loop { // TODO stop thread
53+ let mut start_was_pressed = false ;
54+
55+ while bg_running_clone. load ( Ordering :: Relaxed ) {
5056 gilrs. inc ( ) ;
5157 while let Some ( event) = gilrs. next_event ( ) {
5258 active_gamepad = Some ( event. id ) ;
@@ -73,24 +79,28 @@ impl Panel for RemotePanel {
7379 turn,
7480 } ;
7581
76- if gamepad
82+ let start_pressed = gamepad
7783 . button_data ( Button :: Start )
7884 . map ( |button| button. is_pressed ( ) )
79- . unwrap_or ( false )
80- {
81- enabled_clone. store ( !enabled_clone. load ( Ordering :: Relaxed ) , Ordering :: Relaxed ) ;
82- } //TODO not working
85+ . unwrap_or ( false ) ;
86+
87+ if start_pressed && !start_was_pressed {
88+ let new_state = !enabled_clone. load ( Ordering :: Relaxed ) ;
89+ enabled_clone. store ( new_state, Ordering :: Relaxed ) ;
90+
91+ if !new_state {
92+ reset ( & nao_clone) ;
93+ }
94+ }
95+ start_was_pressed = start_pressed;
8396
8497 if enabled_clone. load ( Ordering :: Relaxed ) {
8598 let now = SystemTime :: now ( ) ;
8699 if now. duration_since ( last_update) . expect ( "Time ran backwards" )
87100 > UPDATE_DELAY
88101 {
89102 last_update = now;
90- nao_clone. write (
91- "parameters.remote_control_parameters.walk" ,
92- TextOrBinary :: Text ( serde_json:: to_value ( step) . unwrap ( ) ) ,
93- )
103+ update_step ( & nao_clone, step) ;
94104 }
95105 }
96106 }
@@ -101,6 +111,8 @@ impl Panel for RemotePanel {
101111 nao,
102112 enabled,
103113 latest_step,
114+ bg_running,
115+ bg_handle : Some ( handle) ,
104116 }
105117 }
106118
@@ -113,16 +125,23 @@ fn get_axis_value(gamepad: Gamepad, axis: Axis) -> Option<f32> {
113125 Some ( gamepad. axis_data ( axis) ?. value ( ) )
114126}
115127
116- impl RemotePanel {
117- fn reset ( & self ) {
118- self . update_step ( serde_json:: to_value ( Step :: < f32 > :: default ( ) ) . unwrap ( ) ) ;
119- }
128+ fn reset ( nao : & Arc < Nao > ) {
129+ update_step ( nao, Step :: < f32 > :: default ( ) ) ;
130+ }
120131
121- fn update_step ( & self , step : Value ) {
122- self . nao . write (
123- "parameters.remote_control_parameters.walk" ,
124- TextOrBinary :: Text ( step) ,
125- )
132+ fn update_step ( nao : & Arc < Nao > , step : Step ) {
133+ nao. write (
134+ "parameters.remote_control_parameters.walk" ,
135+ TextOrBinary :: Text ( serde_json:: to_value ( step) . unwrap ( ) ) ,
136+ ) ;
137+ }
138+
139+ impl Drop for RemotePanel {
140+ fn drop ( & mut self ) {
141+ self . bg_running . store ( false , Ordering :: Relaxed ) ;
142+ if let Some ( handle) = self . bg_handle . take ( ) {
143+ let _ = handle. join ( ) ;
144+ }
126145 }
127146}
128147
@@ -132,7 +151,7 @@ impl Widget for &mut RemotePanel {
132151 if ui. checkbox ( & mut enabled, "Enabled (Start)" ) . changed ( ) {
133152 self . enabled . store ( enabled, Ordering :: Relaxed ) ;
134153 if !enabled {
135- self . reset ( ) ;
154+ reset ( & self . nao ) ;
136155 }
137156 } ;
138157
0 commit comments