1pub mod alarm;
10pub mod client;
12pub mod cov;
14pub mod cov_manager;
16pub mod discovery;
18pub mod error;
20pub mod file;
22pub mod listener;
24pub mod point;
26pub mod range;
28pub mod schedule;
30pub mod server;
32pub mod simulator;
34pub mod throttle;
36pub mod value;
38pub mod walk;
40
41pub use alarm::{
42 AlarmSummaryItem, EnrollmentSummaryItem, EventInformationItem, EventInformationResult,
43 EventNotification,
44};
45pub use client::{BacnetClient, ForeignDeviceRenewal};
46pub use cov::{CovNotification, CovPropertyValue};
47pub use cov_manager::{
48 CovManager, CovManagerBuilder, CovSubscriptionSpec, CovUpdate, UpdateSource,
49};
50pub use discovery::{DiscoveredDevice, DiscoveredObject};
51pub use error::ClientError;
52pub use file::{AtomicReadFileResult, AtomicWriteFileResult};
53pub use listener::{create_notification_listener, Notification, NotificationListener};
54pub use point::{PointClassification, PointDirection, PointKind};
55pub use range::{ClientBitString, ReadRangeResult};
56pub use rustbac_bacnet_sc::BacnetScTransport;
57pub use rustbac_core::services::acknowledge_alarm::{EventState, TimeStamp};
58pub use rustbac_core::services::device_management::{DeviceCommunicationState, ReinitializeState};
59pub use rustbac_datalink::bip::transport::{BroadcastDistributionEntry, ForeignDeviceTableEntry};
60pub use schedule::{CalendarEntry, DateRange, TimeValue};
61pub use server::{BacnetServer, BacnetServiceError, ObjectStore, ObjectStoreHandler, ServiceHandler};
62pub use simulator::SimulatedDevice;
63pub use throttle::DeviceThrottle;
64pub use value::ClientDataValue;
65pub use walk::{DeviceWalkResult, ObjectSummary};
66
67use rustbac_core::encoding::{primitives::decode_unsigned, reader::Reader, tag::Tag};
69use rustbac_core::types::ObjectId;
70
71fn decode_ctx_unsigned(r: &mut Reader<'_>) -> Result<u32, ClientError> {
72 match Tag::decode(r)? {
73 Tag::Context { len, .. } => Ok(decode_unsigned(r, len as usize)?),
74 _ => Err(ClientError::UnsupportedResponse),
75 }
76}
77
78fn decode_ctx_object_id(r: &mut Reader<'_>) -> Result<ObjectId, ClientError> {
79 Ok(ObjectId::from_raw(decode_ctx_unsigned(r)?))
80}
81
82fn data_value_to_client(value: rustbac_core::types::DataValue<'_>) -> ClientDataValue {
83 match value {
84 rustbac_core::types::DataValue::Null => ClientDataValue::Null,
85 rustbac_core::types::DataValue::Boolean(v) => ClientDataValue::Boolean(v),
86 rustbac_core::types::DataValue::Unsigned(v) => ClientDataValue::Unsigned(v),
87 rustbac_core::types::DataValue::Signed(v) => ClientDataValue::Signed(v),
88 rustbac_core::types::DataValue::Real(v) => ClientDataValue::Real(v),
89 rustbac_core::types::DataValue::Double(v) => ClientDataValue::Double(v),
90 rustbac_core::types::DataValue::OctetString(v) => ClientDataValue::OctetString(v.to_vec()),
91 rustbac_core::types::DataValue::CharacterString(v) => {
92 ClientDataValue::CharacterString(v.to_string())
93 }
94 rustbac_core::types::DataValue::BitString(v) => ClientDataValue::BitString {
95 unused_bits: v.unused_bits,
96 data: v.data.to_vec(),
97 },
98 rustbac_core::types::DataValue::Enumerated(v) => ClientDataValue::Enumerated(v),
99 rustbac_core::types::DataValue::Date(v) => ClientDataValue::Date(v),
100 rustbac_core::types::DataValue::Time(v) => ClientDataValue::Time(v),
101 rustbac_core::types::DataValue::ObjectId(v) => ClientDataValue::ObjectId(v),
102 rustbac_core::types::DataValue::Constructed { tag_num, values } => {
103 ClientDataValue::Constructed {
104 tag_num,
105 values: values.into_iter().map(data_value_to_client).collect(),
106 }
107 }
108 }
109}