Skip to content

Commit ca972d0

Browse files
committed
add start to start gamepad back
1 parent d972058 commit ca972d0

1 file changed

Lines changed: 41 additions & 22 deletions

File tree

tools/twix/src/panels/remote.rs

Lines changed: 41 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}
2325
impl 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

Comments
 (0)