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