ping_viewer_next/device/manager/
device_handle.rs

1use 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        // Fail-fast if device is stopped
32        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}