Skip to content

Commit 1a18531

Browse files
committed
backup
1 parent 7e938aa commit 1a18531

File tree

5 files changed

+207
-14
lines changed

5 files changed

+207
-14
lines changed

Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ udp-stream = "0.0.12"
2828
uuid = { version = "1.8", features = ["serde"] }
2929
validator = "0.18.1"
3030
thiserror = "1.0.61"
31+
ts-rs = { version = "9.0.1" , features = ["serde-compat", "uuid-impl"] }
3132

3233
[build-dependencies]
3334
vergen-gix = { version = "1.0.0-beta.2", default-features = false, features = ["build", "cargo"] }

src/device/devices.rs

+19-4
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use bluerobotics_ping::device::PingDevice;
22
use serde::{Deserialize, Serialize};
33
use tokio::sync::{mpsc, oneshot};
44
use tracing::{error, trace, warn};
5+
use ts_rs::TS;
56

67
pub struct DeviceActor {
78
pub receiver: mpsc::Receiver<DeviceActorRequest>,
@@ -267,7 +268,7 @@ pub enum UpgradeResult {
267268
Ping360,
268269
}
269270

270-
#[derive(Debug, Clone, Serialize, Deserialize)]
271+
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
271272
pub enum PingRequest {
272273
Ping1D(Ping1DRequest),
273274
Ping360(Ping360Request),
@@ -277,7 +278,7 @@ pub enum PingRequest {
277278
Stop,
278279
}
279280

280-
#[derive(Debug, Clone, Serialize, Deserialize)]
281+
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
281282
pub enum Ping1DRequest {
282283
DeviceID,
283284
ModeAuto,
@@ -296,33 +297,47 @@ pub enum Ping1DRequest {
296297
GainSetting,
297298
PingEnable,
298299
DistanceSimple,
300+
#[ts(skip)]
299301
SetDeviceId(bluerobotics_ping::ping1d::SetDeviceIdStruct),
302+
#[ts(skip)]
300303
SetModeAuto(bluerobotics_ping::ping1d::SetModeAutoStruct),
304+
#[ts(skip)]
301305
SetPingInterval(bluerobotics_ping::ping1d::SetPingIntervalStruct),
306+
#[ts(skip)]
302307
SetPingEnable(bluerobotics_ping::ping1d::SetPingEnableStruct),
308+
#[ts(skip)]
303309
SetSpeedOfSound(bluerobotics_ping::ping1d::SetSpeedOfSoundStruct),
310+
#[ts(skip)]
304311
SetRange(bluerobotics_ping::ping1d::SetRangeStruct),
312+
#[ts(skip)]
305313
SetGainSetting(bluerobotics_ping::ping1d::SetGainSettingStruct),
314+
#[ts(skip)]
306315
ContinuousStart(bluerobotics_ping::ping1d::ContinuousStartStruct),
316+
#[ts(skip)]
307317
ContinuousStop(bluerobotics_ping::ping1d::ContinuousStopStruct),
308318
GotoBootloader,
309319
}
310320

311-
#[derive(Debug, Clone, Serialize, Deserialize)]
321+
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
312322
pub enum Ping360Request {
313323
MotorOff,
314324
DeviceData,
315325
AutoDeviceData,
326+
#[ts(skip)]
316327
SetDeviceId(bluerobotics_ping::ping360::SetDeviceIdStruct),
328+
#[ts(skip)]
317329
Transducer(bluerobotics_ping::ping360::TransducerStruct),
330+
#[ts(skip)]
318331
Reset(bluerobotics_ping::ping360::ResetStruct),
332+
#[ts(skip)]
319333
AutoTransmit(bluerobotics_ping::ping360::AutoTransmitStruct),
320334
}
321335

322-
#[derive(Debug, Clone, Serialize, Deserialize)]
336+
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
323337
pub enum PingCommonRequest {
324338
DeviceInformation,
325339
ProtocolVersion,
340+
#[ts(skip)]
326341
SetDeviceId(bluerobotics_ping::common::SetDeviceIdStruct),
327342
}
328343

src/device/helpers/device_handling.rs

+110
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
use tracing::{error, trace, warn};
2+
use uuid::Uuid;
3+
4+
use crate::device::{
5+
devices::{self, DeviceActorHandler},
6+
manager::{Answer, Device, DeviceManager, DeviceSelection, DeviceStatus, ManagerError},
7+
};
8+
9+
impl DeviceManager {
10+
pub fn check_device_uuid(&self, device_id: Uuid) -> Result<(), ManagerError> {
11+
if self.device.contains_key(&device_id) {
12+
return Ok(());
13+
}
14+
error!(
15+
"Getting device handler for device: {:?} : Error, device doesn't exist",
16+
device_id
17+
);
18+
Err(ManagerError::DeviceNotExist(device_id))
19+
}
20+
21+
pub fn get_device(&self, device_id: Uuid) -> Result<&Device, ManagerError> {
22+
let device = self
23+
.device
24+
.get(&device_id)
25+
.ok_or(ManagerError::DeviceNotExist(device_id))?;
26+
Ok(device)
27+
}
28+
29+
pub async fn get_device_handler(&self, device_id: Uuid) -> Result<Answer, ManagerError> {
30+
self.check_device_uuid(device_id)?;
31+
32+
trace!(
33+
"Getting device handler for device: {:?} : Success",
34+
device_id
35+
);
36+
37+
// Fail-fast if device is stopped
38+
self.check_device_status(
39+
device_id,
40+
&[DeviceStatus::ContinuousMode, DeviceStatus::Running],
41+
)?;
42+
43+
let handler: DeviceActorHandler = self.get_device(device_id)?.handler.clone();
44+
45+
Ok(Answer::InnerDeviceHandler(handler))
46+
}
47+
48+
pub fn check_device_status(
49+
&self,
50+
device_id: Uuid,
51+
valid_statuses: &[DeviceStatus],
52+
) -> Result<(), ManagerError> {
53+
let status = &self.get_device(device_id)?.status;
54+
if !valid_statuses.contains(status) {
55+
return Err(ManagerError::DeviceStatus(status.clone(), device_id));
56+
}
57+
Ok(())
58+
}
59+
60+
pub fn get_mut_device(&mut self, device_id: Uuid) -> Result<&mut Device, ManagerError> {
61+
let device = self
62+
.device
63+
.get_mut(&device_id)
64+
.ok_or(ManagerError::DeviceNotExist(device_id))?;
65+
Ok(device)
66+
}
67+
68+
pub fn get_device_type(&self, device_id: Uuid) -> Result<DeviceSelection, ManagerError> {
69+
let device_type = self.device.get(&device_id).unwrap().device_type.clone();
70+
Ok(device_type)
71+
}
72+
73+
pub fn extract_handler(
74+
&self,
75+
device_handler: Answer,
76+
) -> Result<DeviceActorHandler, ManagerError> {
77+
match device_handler {
78+
Answer::InnerDeviceHandler(handler) => Ok(handler),
79+
answer => Err(ManagerError::Other(format!(
80+
"Unreachable: extract_handler helper, detail: {answer:?}"
81+
))),
82+
}
83+
}
84+
85+
pub async fn get_subscriber(
86+
&self,
87+
device_id: Uuid,
88+
) -> Result<
89+
tokio::sync::broadcast::Receiver<bluerobotics_ping::message::ProtocolMessage>,
90+
ManagerError,
91+
> {
92+
let handler_request = self.get_device_handler(device_id).await?;
93+
let handler = self.extract_handler(handler_request)?;
94+
95+
let subscriber = handler
96+
.send(devices::PingRequest::GetSubscriber)
97+
.await
98+
.map_err(|err| {
99+
warn!("Something went wrong while executing get_subscriber, details: {err:?}");
100+
ManagerError::DeviceError(err)
101+
})?;
102+
103+
match subscriber {
104+
devices::PingAnswer::Subscriber(subscriber) => Ok(subscriber),
105+
_ => Err(ManagerError::Other(
106+
"Unreachable: get_subscriber helper".to_string(),
107+
)),
108+
}
109+
}
110+
}

src/device/manager.rs

+9-8
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use std::{
88
use tokio::sync::{mpsc, oneshot};
99
use tokio_serial::{SerialPort, SerialPortBuilderExt, SerialStream};
1010
use tracing::{error, info, trace, warn};
11+
use ts_rs::TS;
1112
use udp_stream::UdpStream;
1213
use uuid::Uuid;
1314

@@ -56,15 +57,15 @@ impl Drop for Device {
5657
}
5758
}
5859

59-
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
60+
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, TS)]
6061
pub enum DeviceSelection {
6162
Common,
6263
Ping1D,
6364
Ping360,
6465
Auto,
6566
}
6667

67-
#[derive(Debug, Clone, Deserialize, Serialize, Hash)]
68+
#[derive(Debug, Clone, Deserialize, Serialize, Hash, TS)]
6869
pub enum SourceSelection {
6970
UdpStream(SourceUdpStruct),
7071
SerialStream(SourceSerialStruct),
@@ -75,13 +76,13 @@ enum SourceType {
7576
Serial(SerialStream),
7677
}
7778

78-
#[derive(Clone, Debug, Deserialize, Serialize, Hash, Apiv2Schema)]
79+
#[derive(Clone, Debug, Deserialize, Serialize, Hash, Apiv2Schema, TS)]
7980
pub struct SourceUdpStruct {
8081
pub ip: Ipv4Addr,
8182
pub port: u16,
8283
}
8384

84-
#[derive(Clone, Debug, Deserialize, Serialize, Hash, Apiv2Schema)]
85+
#[derive(Clone, Debug, Deserialize, Serialize, Hash, Apiv2Schema, TS)]
8586
pub struct SourceSerialStruct {
8687
pub path: String,
8788
pub baudrate: u32,
@@ -137,7 +138,7 @@ pub struct DeviceAnswer {
137138
pub device_id: Uuid,
138139
}
139140

140-
#[derive(Debug, Clone, Serialize, Deserialize, Apiv2Schema)]
141+
#[derive(Debug, Clone, Serialize, Deserialize, Apiv2Schema, TS)]
141142
#[serde(tag = "type", content = "payload")]
142143
pub enum Request {
143144
Create(CreateStruct),
@@ -151,7 +152,7 @@ pub enum Request {
151152
DisableContinuousMode(UuidWrapper),
152153
}
153154

154-
#[derive(Debug, Clone, Serialize, Deserialize)]
155+
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
155156
pub struct UuidWrapper {
156157
pub uuid: Uuid,
157158
}
@@ -174,13 +175,13 @@ impl From<UuidWrapper> for Uuid {
174175
}
175176
}
176177

177-
#[derive(Debug, Clone, Serialize, Deserialize)]
178+
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
178179
pub struct CreateStruct {
179180
pub source: SourceSelection,
180181
pub device_selection: DeviceSelection,
181182
}
182183

183-
#[derive(Debug, Clone, Serialize, Deserialize)]
184+
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
184185
pub struct DeviceRequestStruct {
185186
pub uuid: Uuid,
186187
pub device_request: crate::device::devices::PingRequest,

src/main.rs

+68-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1+
2+
3+
use device::manager::{CreateStruct, DeviceRequestStruct, UuidWrapper};
4+
use serde::{Deserialize, Serialize};
15
use tracing::info;
6+
use ts_rs::TS;
27

38
#[macro_use]
49
extern crate lazy_static;
@@ -9,16 +14,23 @@ mod device;
914
mod logger;
1015
mod server;
1116

12-
#[derive(Debug, Clone, Serialize, Deserialize)]
17+
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
18+
#[ts(export, export_to = "RequestModels.ts")]
1319
pub struct Command {
1420
pub command: CommandType,
1521
}
1622

17-
#[derive(Debug, Clone, Serialize, Deserialize)]
23+
#[derive(Debug, Clone, Serialize, Deserialize, TS)]
24+
#[serde(tag = "module")]
1825
pub enum CommandType {
1926
DeviceManager(device::manager::Request),
2027
}
2128

29+
// #[derive(Debug, Clone, Serialize, Deserialize)]
30+
// pub enum Command {
31+
// DeviceManager(device::manager::Request),
32+
// }
33+
2234
#[tokio::main]
2335
async fn main() {
2436
// CLI should be started before logger to allow control over verbosity
@@ -34,6 +46,60 @@ async fn main() {
3446
"DeviceManager initialized with following devices: {:?}",
3547
handler.send(crate::device::manager::Request::List).await
3648
);
49+
use serde_json::json;
50+
use uuid::Uuid;
51+
52+
// Define your requests
53+
let requests = vec![
54+
crate::device::manager::Request::Ping(DeviceRequestStruct {
55+
uuid: Uuid::parse_str("00000000-0000-0000-001e-10da679f8cee").unwrap(),
56+
device_request: crate::device::devices::PingRequest::Ping360(
57+
crate::device::devices::Ping360Request::Transducer(
58+
bluerobotics_ping::ping360::TransducerStruct {
59+
mode: 1,
60+
gain_setting: 2,
61+
angle: 0,
62+
transmit_duration: 500,
63+
sample_period: 80,
64+
transmit_frequency: 700,
65+
number_of_samples: 1200,
66+
transmit: 1,
67+
reserved: 1,
68+
},
69+
),
70+
),
71+
}),
72+
crate::device::manager::Request::EnableContinuousMode(UuidWrapper {
73+
uuid: Uuid::parse_str("00000000-0000-0000-001e-10da679f8cee").unwrap(),
74+
}),
75+
crate::device::manager::Request::List,
76+
crate::device::manager::Request::Create(CreateStruct {
77+
source: device::manager::SourceSelection::SerialStream(
78+
device::manager::SourceSerialStruct {
79+
path: "/dev/ttyUSB0".to_string(),
80+
baudrate: 115200,
81+
},
82+
),
83+
device_selection: device::manager::DeviceSelection::Auto,
84+
}),
85+
crate::device::manager::Request::Create(CreateStruct {
86+
source: device::manager::SourceSelection::UdpStream(device::manager::SourceUdpStruct {
87+
ip: "192.168.0.1".parse().unwrap(),
88+
port: 9092,
89+
}),
90+
device_selection: device::manager::DeviceSelection::Auto,
91+
}),
92+
];
93+
94+
// Print each request as JSON
95+
for request in requests {
96+
println!(
97+
"{}",
98+
json!(Command {
99+
command: CommandType::DeviceManager(request)
100+
})
101+
);
102+
}
37103

38104
server::manager::run(&cli::manager::server_address(), handler)
39105
.await

0 commit comments

Comments
 (0)