#[cfg(not(feature = "std"))]
use alloc::string::String;
use super::*;
use bacnet_encoding::constructed::tagged::{
decode_ctx_object_id, decode_ctx_primitive, decode_ctx_unsigned, expect_end,
};
fn decode_acknowledgment_source(content: &[u8]) -> Result<String, Error> {
if content.is_empty() {
return primitives::decode_character_string(content);
}
Ok(primitives::decode_character_string(content).unwrap_or_default())
}
#[derive(Debug, Clone, PartialEq)]
pub struct AcknowledgeAlarmRequest {
pub acknowledging_process_identifier: u32,
pub event_object_identifier: ObjectIdentifier,
pub event_state_acknowledged: EventState,
pub timestamp: BACnetTimeStamp,
pub acknowledgment_source: String,
pub time_of_acknowledgment: BACnetTimeStamp,
}
impl AcknowledgeAlarmRequest {
pub fn encode(&self, buf: &mut BytesMut) -> Result<(), Error> {
primitives::encode_ctx_unsigned(buf, 0, self.acknowledging_process_identifier as u64);
primitives::encode_ctx_object_id(buf, 1, &self.event_object_identifier);
primitives::encode_ctx_enumerated(buf, 2, self.event_state_acknowledged.to_raw());
primitives::encode_timestamp(buf, 3, &self.timestamp)?;
primitives::encode_ctx_character_string(buf, 4, &self.acknowledgment_source)?;
primitives::encode_timestamp(buf, 5, &self.time_of_acknowledgment)?;
Ok(())
}
pub fn decode(data: &[u8]) -> Result<Self, Error> {
let mut offset = 0;
let (acknowledging_process_identifier, end) =
decode_ctx_unsigned::<u32>(data, offset, 0, "AcknowledgeAlarm process-id")?;
offset = end;
let (event_object_identifier, end) =
decode_ctx_object_id(data, offset, 1, "AcknowledgeAlarm object-id")?;
offset = end;
let (event_state, end) =
decode_ctx_unsigned::<u32>(data, offset, 2, "AcknowledgeAlarm event-state")?;
let event_state_acknowledged = EventState::from_raw(event_state);
offset = end;
let (timestamp, new_offset) = primitives::decode_timestamp(data, offset, 3)?;
offset = new_offset;
let (content, end) =
decode_ctx_primitive(data, offset, 4, "AcknowledgeAlarm acknowledgment-source")?;
let acknowledgment_source = decode_acknowledgment_source(content)?;
offset = end;
let (time_of_acknowledgment, new_offset) = primitives::decode_timestamp(data, offset, 5)?;
expect_end(data, new_offset, new_offset, "AcknowledgeAlarm")?;
Ok(Self {
acknowledging_process_identifier,
event_object_identifier,
event_state_acknowledged,
timestamp,
acknowledgment_source,
time_of_acknowledgment,
})
}
}