Skip to content

Commit ffd921e

Browse files
committed
locking
1 parent dfa10b2 commit ffd921e

File tree

2 files changed

+34
-27
lines changed

2 files changed

+34
-27
lines changed

src/cc253x.rs

+29-22
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,20 @@ use crate::{
66
},
77
};
88
use serialport::SerialPort;
9-
use std::{path::PathBuf, time::Duration};
9+
use std::{
10+
borrow::BorrowMut,
11+
ops::DerefMut,
12+
path::PathBuf,
13+
sync::{Arc, Mutex},
14+
time::Duration,
15+
};
1016

1117
//TODO: fix this
1218
const MAXIMUM_ZIGBEE_PAYLOAD_SIZE: usize = 255;
1319

1420
pub struct CC2531X {
1521
_supports_led: Option<bool>,
16-
serial: Box<dyn SerialPort>,
22+
serial: Arc<Mutex<Box<dyn SerialPort>>>,
1723
}
1824

1925
impl CC2531X {
@@ -23,13 +29,13 @@ impl CC2531X {
2329
.open()
2430
.map_err(|_e| CoordinatorError::SerialOpen)?;
2531
Ok(Self {
26-
serial,
32+
serial: Arc::new(Mutex::new(serial)),
2733
_supports_led: None,
2834
})
2935
}
3036

3137
pub async fn wait_for(
32-
&mut self,
38+
&self,
3339
name: &str,
3440
message_type: MessageType,
3541
subsystem: Subsystem,
@@ -40,6 +46,8 @@ impl CC2531X {
4046
let mut buffer = [0; MAX_FRAME_SIZE];
4147
let len = self
4248
.serial
49+
.lock()
50+
.unwrap()
4351
.read(&mut buffer)
4452
.map_err(|_e| CoordinatorError::Io)?;
4553
let packet = UnpiPacket::from_payload(
@@ -78,51 +86,48 @@ impl Coordinator for CC2531X {
7886
todo!()
7987
}
8088

81-
async fn version(&mut self) -> Result<usize, CoordinatorError> {
89+
async fn version(&self) -> Result<usize, CoordinatorError> {
8290
let command = get_command_by_name(&Subsystem::Sys, "version")
8391
.ok_or(CoordinatorError::NoCommandWithName)?;
92+
let mut lock = self.serial.lock().unwrap();
8493
let send = UnpiPacket::from_command_to_serial_async(
8594
command.id,
8695
command,
8796
&[],
8897
(MessageType::SREQ, Subsystem::Sys),
89-
&mut *self.serial,
98+
&mut **lock,
9099
);
91-
// let wait = self.wait_for(
92-
// "version",
93-
// MessageType::SRESP,
94-
// Subsystem::Sys,
95-
// command.id,
96-
// None,
97-
// );
98-
// let r = futures::try_join!(send, wait)?;
100+
let wait = self.wait_for("version", MessageType::SRESP, Subsystem::Sys, None);
101+
let r = futures::try_join!(send, wait)?;
99102
Ok(0)
100103
}
101104

102-
async fn reset(&mut self, reset_type: ResetType) -> Result<(), CoordinatorError> {
105+
async fn reset(&self, reset_type: ResetType) -> Result<(), CoordinatorError> {
103106
let command = get_command_by_name(&Subsystem::Sys, "reset_req")
104107
.ok_or(CoordinatorError::NoCommandWithName)?;
105108
let parameters = match reset_type {
106109
ResetType::Soft => &[("type", ParameterValue::U8(1))],
107110
ResetType::Hard => &[("type", ParameterValue::U8(0))],
108111
};
109112

113+
let mut lock = self.serial.lock().unwrap();
110114
UnpiPacket::from_command_to_serial(
111115
command.id,
112116
command,
113117
parameters,
114118
(MessageType::SREQ, Subsystem::Util),
115-
&mut *self.serial,
119+
&mut **lock,
116120
)?;
117121

118122
Ok(())
119123
}
120124

121-
async fn set_led(&mut self, led_status: LedStatus) -> Result<(), CoordinatorError> {
125+
async fn set_led(&self, led_status: LedStatus) -> Result<(), CoordinatorError> {
122126
let command = get_command_by_name(&Subsystem::Util, "led_control")
123127
.ok_or(CoordinatorError::NoCommandWithName)?;
124128
//TODO: const firmwareControlsLed = parseInt(this.version.revision) >= 20211029;
125129
let firmware_controls_led = true;
130+
let mut lock = self.serial.lock().unwrap();
126131
let parameters = match led_status {
127132
LedStatus::Disable => {
128133
if firmware_controls_led {
@@ -152,13 +157,13 @@ impl Coordinator for CC2531X {
152157
command,
153158
parameters,
154159
(MessageType::SREQ, Subsystem::Util),
155-
&mut *self.serial,
160+
&mut **lock,
156161
)?;
157162

158163
Ok(())
159164
}
160165

161-
async fn change_channel(&mut self, channel: u8) -> Result<(), CoordinatorError> {
166+
async fn change_channel(&self, channel: u8) -> Result<(), CoordinatorError> {
162167
let parameters = &[
163168
("dst_addr", ParameterValue::U16(0xffff)),
164169
(
@@ -181,31 +186,33 @@ impl Coordinator for CC2531X {
181186

182187
let command = get_command_by_name(&Subsystem::Zdo, "management_network_update_request")
183188
.ok_or(CoordinatorError::NoCommandWithName)?;
189+
let mut lock = self.serial.lock().unwrap();
184190
UnpiPacket::from_command_to_serial(
185191
command.id,
186192
command,
187193
parameters,
188194
(MessageType::SREQ, Subsystem::Zdo),
189-
&mut *self.serial,
195+
&mut **lock,
190196
)?;
191197

192198
Ok(())
193199
}
194200

195-
async fn set_transmit_power(&mut self, power: i8) -> Result<(), CoordinatorError> {
201+
async fn set_transmit_power(&self, power: i8) -> Result<(), CoordinatorError> {
196202
let parameters = &[
197203
("operation", ParameterValue::U8(0)),
198204
("value", ParameterValue::I8(power)),
199205
];
200206

201207
let command = get_command_by_name(&Subsystem::Zdo, "stack_tune")
202208
.ok_or(CoordinatorError::NoCommandWithName)?;
209+
let mut lock = self.serial.lock().unwrap();
203210
UnpiPacket::from_command_to_serial(
204211
command.id,
205212
command,
206213
parameters,
207214
(MessageType::SREQ, Subsystem::Zdo),
208-
&mut *self.serial,
215+
&mut **lock,
209216
)?;
210217
Ok(())
211218
}

src/coordinator.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -8,21 +8,21 @@ pub trait Coordinator {
88

99
fn start(&self) -> impl Future<Output = Result<(), CoordinatorError>>;
1010
fn stop(&self) -> impl Future<Output = Result<(), CoordinatorError>>;
11-
fn version(&mut self) -> impl Future<Output = Result<usize, CoordinatorError>>;
11+
fn version(&self) -> impl Future<Output = Result<usize, CoordinatorError>>;
1212
fn permit_join(
1313
&self,
1414
address: u16,
1515
duration: std::time::Duration,
1616
) -> impl Future<Output = Result<(), CoordinatorError>>;
17-
fn reset(&mut self, reset_type: ResetType) -> impl Future<Output = Result<(), CoordinatorError>>;
17+
fn reset(&self, reset_type: ResetType) -> impl Future<Output = Result<(), CoordinatorError>>;
1818
fn set_led(
19-
&mut self,
19+
&self,
2020
led_status: LedStatus,
2121
) -> impl Future<Output = Result<(), CoordinatorError>>;
22-
fn change_channel(&mut self, channel: u8)
22+
fn change_channel(&self, channel: u8)
2323
-> impl Future<Output = Result<(), CoordinatorError>>;
2424
fn set_transmit_power(
25-
&mut self,
25+
&self,
2626
power: i8,
2727
) -> impl Future<Output = Result<(), CoordinatorError>>;
2828
fn request_network_address(addr: &str) -> impl Future<Output = Result<(), CoordinatorError>>;

0 commit comments

Comments
 (0)