rsiot/components_config/uart_general/protocol/
protocol.rs

1#![allow(clippy::module_inception)]
2
3use std::time::Instant;
4
5use serde::{de::DeserializeOwned, Serialize};
6
7use crate::serde_utils::{SerdeAlg, SerdeAlgKind};
8
9use super::{crc_alg::CrcAlg, Error, FieldbusRequest, FieldbusResponse, UartPacket};
10
11/// Протокол передачи
12#[derive(Clone, Copy, Debug, Default, PartialEq)]
13pub struct Protocol {
14    /// Адрес устройства
15    pub address: u8,
16    /// Алгоритм сериализации / десериализации
17    pub serde_alg: SerdeAlg,
18}
19impl Protocol {
20    /// Создание протокола
21    pub fn new(address: u8) -> Self {
22        Self {
23            address,
24            serde_alg: SerdeAlg::new(SerdeAlgKind::Postcard),
25        }
26    }
27
28    /// Сериализация запроса
29    pub fn serialize_request<TData>(&self, data: TData) -> Result<FieldbusRequest, Error>
30    where
31        TData: Serialize,
32    {
33        let uart_message = UartPacket {
34            // transaction_id: 0,
35            address: self.address,
36            data,
37        };
38
39        let mut payload = self.serde_alg.serialize(&uart_message)?;
40        CrcAlg::calculate(&mut payload);
41
42        let uart_request = FieldbusRequest {
43            request_creation_time: Instant::now(),
44            packet: payload,
45        };
46        Ok(uart_request)
47    }
48
49    /// Десериализация запроса
50    pub fn deserialize_request<TData>(
51        &self,
52        request: FieldbusRequest,
53    ) -> Result<UartPacket<TData>, Error>
54    where
55        TData: DeserializeOwned,
56    {
57        let payload = CrcAlg::check(&request.packet)?;
58        let uart_packet = self.serde_alg.deserialize(payload)?;
59        Ok(uart_packet)
60    }
61
62    /// Сериализация ответа
63    pub fn serialize_response<TData>(&self, data: TData) -> Result<FieldbusResponse, Error>
64    where
65        TData: Serialize,
66    {
67        let uart_message = UartPacket {
68            address: self.address,
69            data,
70        };
71
72        let mut payload = self.serde_alg.serialize(&uart_message)?;
73        CrcAlg::calculate(&mut payload);
74
75        let uart_response = FieldbusResponse {
76            request_creation_time: Instant::now(),
77            packet: payload,
78        };
79        Ok(uart_response)
80    }
81
82    /// Десериализация ответа
83    pub fn deserialize_response<TData>(
84        &self,
85        response: FieldbusResponse,
86    ) -> Result<UartPacket<TData>, Error>
87    where
88        TData: DeserializeOwned,
89    {
90        let payload = CrcAlg::check(&response.packet)?;
91        let uart_packet = self.serde_alg.deserialize(payload)?;
92        Ok(uart_packet)
93    }
94}