Skip to content

Commit b004332

Browse files
committed
first_aproach
1 parent e2f8889 commit b004332

File tree

3 files changed

+170
-6
lines changed

3 files changed

+170
-6
lines changed

src/device/devices.rs

+5-4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use bluerobotics_ping::device::PingDevice;
2+
use paperclip::actix::Apiv2Schema;
23
use serde::{Deserialize, Serialize};
34
use tokio::sync::{mpsc, oneshot};
45
use tracing::{error, trace, warn};
@@ -267,7 +268,7 @@ pub enum UpgradeResult {
267268
Ping360,
268269
}
269270

270-
#[derive(Debug, Clone, Serialize, Deserialize)]
271+
#[derive(Debug, Clone, Serialize, Deserialize, Apiv2Schema)]
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, Apiv2Schema)]
281282
pub enum Ping1DRequest {
282283
DeviceID,
283284
ModeAuto,
@@ -308,7 +309,7 @@ pub enum Ping1DRequest {
308309
GotoBootloader,
309310
}
310311

311-
#[derive(Debug, Clone, Serialize, Deserialize)]
312+
#[derive(Debug, Clone, Serialize, Deserialize, Apiv2Schema)]
312313
pub enum Ping360Request {
313314
MotorOff,
314315
DeviceData,
@@ -319,7 +320,7 @@ pub enum Ping360Request {
319320
AutoTransmit(bluerobotics_ping::ping360::AutoTransmitStruct),
320321
}
321322

322-
#[derive(Debug, Clone, Serialize, Deserialize)]
323+
#[derive(Debug, Clone, Serialize, Deserialize, Apiv2Schema)]
323324
pub enum PingCommonRequest {
324325
DeviceInformation,
325326
ProtocolVersion,

src/device/manager/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ pub enum Request {
160160
DisableContinuousMode(UuidWrapper),
161161
}
162162

163-
#[derive(Debug, Clone, Serialize, Deserialize)]
163+
#[derive(Debug, Clone, Serialize, Deserialize, Apiv2Schema)]
164164
pub struct UuidWrapper {
165165
pub uuid: Uuid,
166166
}

src/server/protocols/v1/rest.rs

+164-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::device::manager::ManagerActorHandler;
1+
use crate::device::manager::{ManagerActorHandler, UuidWrapper};
22
use crate::server::protocols::v1::errors::Error;
33
use actix_web::Responder;
44
use mime_guess::from_path;
@@ -9,6 +9,7 @@ use paperclip::actix::{
99
};
1010
use serde::{Deserialize, Serialize};
1111
use serde_json::json;
12+
use uuid::Uuid;
1213

1314
#[derive(rust_embed::RustEmbed)]
1415
#[folder = "src/server/protocols/v1/frontend"]
@@ -46,6 +47,12 @@ async fn server_metadata() -> Result<Json<ServerMetadata>, Error> {
4647
pub fn register_services(cfg: &mut web::ServiceConfig) {
4748
cfg.service(index)
4849
.service(post_request)
50+
.service(device_manager_get)
51+
.service(device_manager_post)
52+
.service(device_manager_device_get)
53+
.service(device_manager_device_ping1d_get)
54+
.service(device_manager_device_ping360_get)
55+
.service(device_manager_device_common_get)
4956
.service(index_files);
5057
}
5158

@@ -64,6 +71,162 @@ async fn post_request(
6471

6572
Ok(Json(answer))
6673
}
74+
75+
#[derive(Debug, Clone, Serialize, Deserialize, Apiv2Schema)]
76+
pub enum DeviceManagerGetOptionsV1 {
77+
AutoCreate,
78+
List,
79+
Search,
80+
}
81+
82+
#[derive(Debug, Clone, Serialize, Deserialize, Apiv2Schema)]
83+
pub enum DeviceManagerPostOptionsV1 {
84+
Delete,
85+
Info,
86+
EnableContinuousMode,
87+
DisableContinuousMode,
88+
}
89+
90+
#[derive(Debug, Clone, Serialize, Deserialize, Apiv2Schema)]
91+
pub enum DeviceManagerDeviceRequestGetOptionsV1 {
92+
Delete,
93+
Info,
94+
EnableContinuousMode,
95+
DisableContinuousMode,
96+
}
97+
98+
#[api_v2_operation]
99+
#[get("device_manager/{selection}")]
100+
async fn device_manager_get(
101+
manager_handler: web::Data<ManagerActorHandler>,
102+
selection: web::Path<DeviceManagerGetOptionsV1>,
103+
) -> Result<Json<crate::device::manager::Answer>, Error> {
104+
let request = match selection.into_inner(){
105+
DeviceManagerGetOptionsV1::AutoCreate => crate::device::manager::Request::AutoCreate,
106+
DeviceManagerGetOptionsV1::List => crate::device::manager::Request::List,
107+
DeviceManagerGetOptionsV1::Search => crate::device::manager::Request::Search,
108+
};
109+
110+
let answer = manager_handler.send(request).await?;
111+
112+
// Broadcast the results to webscoket clients.
113+
crate::server::protocols::v1::websocket::send_to_websockets(json!(answer), None);
114+
115+
Ok(Json(answer))
116+
}
117+
118+
#[api_v2_operation]
119+
#[post("device_manager/{device}/{selection}")]
120+
async fn device_manager_post(
121+
manager_handler: web::Data<ManagerActorHandler>,
122+
info: web::Path<(Uuid, DeviceManagerPostOptionsV1)>,
123+
) -> Result<Json<crate::device::manager::Answer>, Error> {
124+
let info = info.into_inner();
125+
let uuid = info.0;
126+
let request = info.1;
127+
128+
let request = match request {
129+
DeviceManagerPostOptionsV1::Delete => crate::device::manager::Request::Delete(uuid.into()),
130+
DeviceManagerPostOptionsV1::Info => crate::device::manager::Request::Info(uuid.into()),
131+
DeviceManagerPostOptionsV1::EnableContinuousMode => crate::device::manager::Request::EnableContinuousMode(uuid.into()),
132+
DeviceManagerPostOptionsV1::DisableContinuousMode => crate::device::manager::Request::DisableContinuousMode(uuid.into()),
133+
};
134+
135+
let answer = manager_handler.send(request).await?;
136+
137+
// Broadcast the results to webscoket clients.
138+
crate::server::protocols::v1::websocket::send_to_websockets(json!(answer), None);
139+
140+
Ok(Json(answer))
141+
}
142+
143+
#[api_v2_operation]
144+
#[get("device_manager/{device}/{request}")]
145+
async fn device_manager_device_get(
146+
manager_handler: web::Data<ManagerActorHandler>,
147+
info: web::Path<(Uuid, crate::device::devices::PingRequest)>,
148+
) -> Result<Json<crate::device::manager::Answer>, Error> {
149+
let info = info.into_inner();
150+
let uuid = info.0;
151+
let request = info.1;
152+
153+
let request = crate::device::manager::Request::Ping(crate::device::manager::DeviceRequestStruct{uuid : uuid, device_request : request});
154+
155+
156+
let answer = manager_handler.send(request).await?;
157+
158+
// Broadcast the results to webscoket clients.
159+
crate::server::protocols::v1::websocket::send_to_websockets(json!(answer), None);
160+
161+
Ok(Json(answer))
162+
}
163+
164+
#[api_v2_operation]
165+
#[get("device_manager/{device}/ping1d/{request}")]
166+
async fn device_manager_device_ping1d_get(
167+
manager_handler: web::Data<ManagerActorHandler>,
168+
info: web::Path<(Uuid, crate::device::devices::Ping1DRequest)>,
169+
) -> Result<Json<crate::device::manager::Answer>, Error> {
170+
let info = info.into_inner();
171+
let uuid = info.0;
172+
let request = info.1;
173+
174+
let request = crate::device::devices::PingRequest::Ping1D(request);
175+
176+
let request = crate::device::manager::Request::Ping(crate::device::manager::DeviceRequestStruct{uuid : uuid.into(), device_request : request});
177+
178+
let answer = manager_handler.send(request).await?;
179+
180+
// Broadcast the results to webscoket clients.
181+
crate::server::protocols::v1::websocket::send_to_websockets(json!(answer), None);
182+
183+
Ok(Json(answer))
184+
}
185+
186+
#[api_v2_operation]
187+
#[get("device_manager/{device}/ping360/{request}")]
188+
async fn device_manager_device_ping360_get(
189+
manager_handler: web::Data<ManagerActorHandler>,
190+
info: web::Path<(Uuid, crate::device::devices::Ping360Request)>,
191+
) -> Result<Json<crate::device::manager::Answer>, Error> {
192+
let info = info.into_inner();
193+
let uuid = info.0;
194+
let request = info.1;
195+
196+
let request = crate::device::devices::PingRequest::Ping360(request);
197+
198+
let request = crate::device::manager::Request::Ping(crate::device::manager::DeviceRequestStruct{uuid : uuid.into(), device_request : request});
199+
200+
let answer = manager_handler.send(request).await?;
201+
202+
// Broadcast the results to webscoket clients.
203+
crate::server::protocols::v1::websocket::send_to_websockets(json!(answer), None);
204+
205+
Ok(Json(answer))
206+
}
207+
208+
#[api_v2_operation]
209+
#[get("device_manager/{device}/common/{request}")]
210+
async fn device_manager_device_common_get(
211+
manager_handler: web::Data<ManagerActorHandler>,
212+
info: web::Path<(Uuid, crate::device::devices::PingCommonRequest)>,
213+
) -> Result<Json<crate::device::manager::Answer>, Error> {
214+
let info = info.into_inner();
215+
let uuid = info.0;
216+
let request = info.1;
217+
218+
let request = crate::device::devices::PingRequest::Common(request);
219+
220+
let request = crate::device::manager::Request::Ping(crate::device::manager::DeviceRequestStruct{uuid : uuid.into(), device_request : request});
221+
222+
let answer = manager_handler.send(request).await?;
223+
224+
// Broadcast the results to webscoket clients.
225+
crate::server::protocols::v1::websocket::send_to_websockets(json!(answer), None);
226+
227+
Ok(Json(answer))
228+
}
229+
67230
#[derive(Debug, Serialize, Deserialize, Apiv2Schema)]
68231
pub struct ServerMetadata {
69232
pub name: &'static str,

0 commit comments

Comments
 (0)