use automotive_wire_codec::{read_u8, read_u32_be, write_u8, write_u32_be};
use super::message_error::MessageError;
use super::traits::{Decode, Encode};
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
#[repr(u8)]
pub enum EntityStatusNodeType {
DoIPGateway = 0x00,
DoIPNode = 0x01,
Reserved(u8),
}
impl From<u8> for EntityStatusNodeType {
fn from(value: u8) -> Self {
match value {
0x00 => EntityStatusNodeType::DoIPGateway,
0x01 => EntityStatusNodeType::DoIPNode,
0x02..=0xFF => EntityStatusNodeType::Reserved(value),
}
}
}
impl From<EntityStatusNodeType> for u8 {
fn from(value: EntityStatusNodeType) -> Self {
match value {
EntityStatusNodeType::DoIPGateway => 0x00,
EntityStatusNodeType::DoIPNode => 0x01,
EntityStatusNodeType::Reserved(value) => value,
}
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct EntityStatusResponse {
pub node_type: EntityStatusNodeType,
pub max_concurrent_tcp_sockets: u8,
pub open_tcp_sockets: u8,
pub max_data_size: u32,
}
impl<'a> Decode<'a> for EntityStatusResponse {
type Error = MessageError;
fn decode(buf: &'a [u8]) -> Result<(Self, &'a [u8]), MessageError> {
let (node_type, rest) = read_u8(buf)?;
let node_type = EntityStatusNodeType::from(node_type);
let (max_concurrent_tcp_sockets, rest) = read_u8(rest)?;
let (open_tcp_sockets, rest) = read_u8(rest)?;
let (max_data_size, rest) = read_u32_be(rest)?;
Ok((
EntityStatusResponse {
node_type,
max_concurrent_tcp_sockets,
open_tcp_sockets,
max_data_size,
},
rest,
))
}
}
impl Encode for EntityStatusResponse {
type Error = MessageError;
fn encoded_size(&self) -> Result<usize, MessageError> {
Ok(7)
}
fn encode(&self, writer: &mut impl embedded_io::Write) -> Result<usize, MessageError> {
write_u8(writer, self.node_type.into())?;
write_u8(writer, self.max_concurrent_tcp_sockets)?;
write_u8(writer, self.open_tcp_sockets)?;
write_u32_be(writer, self.max_data_size)?;
Ok(7)
}
}