rsiot/components_config/uart_general/protocol/
protocol.rs1#![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#[derive(Clone, Copy, Debug, Default, PartialEq)]
13pub struct Protocol {
14 pub address: u8,
16 pub serde_alg: SerdeAlg,
18}
19impl Protocol {
20 pub fn new(address: u8) -> Self {
22 Self {
23 address,
24 serde_alg: SerdeAlg::new(SerdeAlgKind::Postcard),
25 }
26 }
27
28 pub fn serialize_request<TData>(&self, data: TData) -> Result<FieldbusRequest, Error>
30 where
31 TData: Serialize,
32 {
33 let uart_message = UartPacket {
34 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 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 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 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}