Skip to main content

nros_diagnostic_msgs/msg/
diagnostic_status.rs

1// nros message type - pure Rust, no_std compatible
2// Package: diagnostic_msgs
3// Message: DiagnosticStatus
4
5use nros_core::{Deserialize, RosMessage, Serialize};
6use nros_serdes::{CdrReader, CdrWriter, DeserError, SerError};
7pub const OK: u8 = 0;
8pub const WARN: u8 = 1;
9pub const ERROR: u8 = 2;
10pub const STALE: u8 = 3;
11
12/// DiagnosticStatus message type
13#[derive(Debug, Clone, Default, PartialEq)]
14pub struct DiagnosticStatus {
15    pub level: u8,
16    pub name: heapless::String<64>,
17    pub message: heapless::String<128>,
18    pub hardware_id: heapless::String<96>,
19    pub values: heapless::Vec<crate::msg::KeyValue, 8>,
20}
21
22impl Serialize for DiagnosticStatus {
23    fn serialize(&self, writer: &mut CdrWriter) -> Result<(), SerError> {
24        // phase-303 W4 (#0267) — DHEADER wrap for XCDR2 appendable structs.
25        // No-op under XCDR1 (byte-identical); under XCDR2 delimits this struct.
26        let __dh = writer.begin_dheader()?;
27        writer.write_u8(self.level)?;
28        writer.write_string(self.name.as_str())?;
29        writer.write_string(self.message.as_str())?;
30        writer.write_string(self.hardware_id.as_str())?;
31        writer.write_u32(self.values.len() as u32)?;
32        for item in &self.values {
33            item.serialize(writer)?;
34        }
35        writer.end_dheader(__dh)?;
36        Ok(())
37    }
38}
39
40impl Deserialize for DiagnosticStatus {
41    fn deserialize(reader: &mut CdrReader) -> Result<Self, DeserError> {
42        // phase-303 W4 (#0267) — read the XCDR2 DHEADER (no-op under XCDR1);
43        // end_dheader skips any unknown trailing members (forward compat).
44        let __dh = reader.begin_dheader()?;
45        let __value = Self {
46            level: reader.read_u8()?,
47            name: {
48                let s = reader.read_string()?;
49                heapless::String::try_from(s).map_err(|_| DeserError::CapacityExceeded)?
50            },
51            message: {
52                let s = reader.read_string()?;
53                heapless::String::try_from(s).map_err(|_| DeserError::CapacityExceeded)?
54            },
55            hardware_id: {
56                let s = reader.read_string()?;
57                heapless::String::try_from(s).map_err(|_| DeserError::CapacityExceeded)?
58            },
59            values: {
60                let len = reader.read_u32()? as usize;
61                let mut vec = heapless::Vec::new();
62                for _ in 0..len {
63                    vec.push(Deserialize::deserialize(reader)?)
64                        .map_err(|_| DeserError::CapacityExceeded)?;
65                }
66                vec
67            },
68        };
69        reader.end_dheader(__dh)?;
70        Ok(__value)
71    }
72}
73
74impl RosMessage for DiagnosticStatus {
75    const TYPE_NAME: &'static str = "diagnostic_msgs::msg::dds_::DiagnosticStatus_";
76    const TYPE_HASH: &'static str = "TypeHashNotSupported";
77    // Issue 1179 -- the type's bound on `RosMessage`, the one trait every
78    // backend's registration can read. Computed from the schema below, not
79    // copied, so it cannot drift from it.
80    const MAX_SERIALIZED_BOUND: Option<usize> = ::nros_serdes::size::max_serialized_bound::<Self>();
81}
82
83// ── nros_serdes::Message — runtime field schema ─────────────────────────────
84// Consumed by RMW backends that build wire-type descriptors at runtime
85// (Cyclone DDS dynamic types, …) without per-RMW codegen at compile time.
86
87#[allow(non_upper_case_globals)]
88pub const NESTED_VALUES: ::nros_serdes::NestedType = ::nros_serdes::NestedType {
89    type_name: <crate::msg::KeyValue as ::nros_serdes::Message>::TYPE_NAME,
90    fields: <crate::msg::KeyValue as ::nros_serdes::Message>::FIELDS,
91};
92#[allow(non_upper_case_globals)]
93pub const FT_VALUES_ELEM: ::nros_serdes::FieldType =
94    ::nros_serdes::FieldType::Nested(&NESTED_VALUES);
95impl ::nros_serdes::Message for DiagnosticStatus {
96    const TYPE_NAME: &'static str = "diagnostic_msgs/msg/DiagnosticStatus";
97    const FIELDS: &'static [::nros_serdes::Field] = &[
98        ::nros_serdes::Field {
99            name: "level",
100            ty: ::nros_serdes::FieldType::Uint8,
101            offset: ::core::mem::offset_of!(DiagnosticStatus, level),
102        },
103        ::nros_serdes::Field {
104            name: "name",
105            ty: ::nros_serdes::FieldType::BoundedString(64),
106            offset: ::core::mem::offset_of!(DiagnosticStatus, name),
107        },
108        ::nros_serdes::Field {
109            name: "message",
110            ty: ::nros_serdes::FieldType::BoundedString(128),
111            offset: ::core::mem::offset_of!(DiagnosticStatus, message),
112        },
113        ::nros_serdes::Field {
114            name: "hardware_id",
115            ty: ::nros_serdes::FieldType::BoundedString(96),
116            offset: ::core::mem::offset_of!(DiagnosticStatus, hardware_id),
117        },
118        ::nros_serdes::Field {
119            name: "values",
120            ty: ::nros_serdes::FieldType::BoundedSequence(8, &FT_VALUES_ELEM),
121            offset: ::core::mem::offset_of!(DiagnosticStatus, values),
122        },
123    ];
124}