Skip to main content

bacnet_client/client/
file_list.rs

1use super::*;
2
3impl<T: TransportPort + 'static> BACnetClient<T> {
4    /// Get event information from a remote device.
5    pub async fn get_event_information(
6        &self,
7        destination_mac: &[u8],
8        last_received_object_identifier: Option<bacnet_types::primitives::ObjectIdentifier>,
9    ) -> Result<Bytes, Error> {
10        use bacnet_services::alarm_event::GetEventInformationRequest;
11
12        let request = GetEventInformationRequest {
13            last_received_object_identifier,
14        };
15        let mut buf = BytesMut::new();
16        request.encode(&mut buf);
17
18        self.confirmed_request(
19            destination_mac,
20            ConfirmedServiceChoice::GET_EVENT_INFORMATION,
21            &buf,
22        )
23        .await
24    }
25
26    /// Acknowledge an alarm on a remote device.
27    pub async fn acknowledge_alarm(
28        &self,
29        destination_mac: &[u8],
30        acknowledging_process_identifier: u32,
31        event_object_identifier: bacnet_types::primitives::ObjectIdentifier,
32        event_state_acknowledged: u32,
33        acknowledgment_source: &str,
34    ) -> Result<(), Error> {
35        use bacnet_services::alarm_event::AcknowledgeAlarmRequest;
36
37        let request = AcknowledgeAlarmRequest {
38            acknowledging_process_identifier,
39            event_object_identifier,
40            event_state_acknowledged,
41            timestamp: bacnet_types::primitives::BACnetTimeStamp::SequenceNumber(0),
42            acknowledgment_source: acknowledgment_source.to_string(),
43            time_of_acknowledgment: bacnet_types::primitives::BACnetTimeStamp::SequenceNumber(0),
44        };
45        let mut buf = BytesMut::new();
46        request.encode(&mut buf)?;
47
48        let _ = self
49            .confirmed_request(
50                destination_mac,
51                ConfirmedServiceChoice::ACKNOWLEDGE_ALARM,
52                &buf,
53            )
54            .await?;
55
56        Ok(())
57    }
58
59    /// Read a range of items from a list or log-buffer property.
60    pub async fn read_range(
61        &self,
62        destination_mac: &[u8],
63        object_identifier: bacnet_types::primitives::ObjectIdentifier,
64        property_identifier: bacnet_types::enums::PropertyIdentifier,
65        property_array_index: Option<u32>,
66        range: Option<bacnet_services::read_range::RangeSpec>,
67    ) -> Result<bacnet_services::read_range::ReadRangeAck, Error> {
68        use bacnet_services::read_range::{ReadRangeAck, ReadRangeRequest};
69
70        let request = ReadRangeRequest {
71            object_identifier,
72            property_identifier,
73            property_array_index,
74            range,
75        };
76        let mut buf = BytesMut::new();
77        request.encode(&mut buf);
78
79        let response_data = self
80            .confirmed_request(destination_mac, ConfirmedServiceChoice::READ_RANGE, &buf)
81            .await?;
82
83        ReadRangeAck::decode(&response_data)
84    }
85
86    /// Read file data from a remote device (stream or record access).
87    pub async fn atomic_read_file(
88        &self,
89        destination_mac: &[u8],
90        file_identifier: bacnet_types::primitives::ObjectIdentifier,
91        access: bacnet_services::file::FileAccessMethod,
92    ) -> Result<Bytes, Error> {
93        use bacnet_services::file::AtomicReadFileRequest;
94
95        let request = AtomicReadFileRequest {
96            file_identifier,
97            access,
98        };
99        let mut buf = BytesMut::new();
100        request.encode(&mut buf);
101
102        self.confirmed_request(
103            destination_mac,
104            ConfirmedServiceChoice::ATOMIC_READ_FILE,
105            &buf,
106        )
107        .await
108    }
109
110    /// Write file data to a remote device (stream or record access).
111    pub async fn atomic_write_file(
112        &self,
113        destination_mac: &[u8],
114        file_identifier: bacnet_types::primitives::ObjectIdentifier,
115        access: bacnet_services::file::FileWriteAccessMethod,
116    ) -> Result<Bytes, Error> {
117        use bacnet_services::file::AtomicWriteFileRequest;
118
119        let request = AtomicWriteFileRequest {
120            file_identifier,
121            access,
122        };
123        let mut buf = BytesMut::new();
124        request.encode(&mut buf);
125
126        self.confirmed_request(
127            destination_mac,
128            ConfirmedServiceChoice::ATOMIC_WRITE_FILE,
129            &buf,
130        )
131        .await
132    }
133
134    /// Add elements to a list property on a remote device.
135    pub async fn add_list_element(
136        &self,
137        destination_mac: &[u8],
138        object_identifier: bacnet_types::primitives::ObjectIdentifier,
139        property_identifier: bacnet_types::enums::PropertyIdentifier,
140        property_array_index: Option<u32>,
141        list_of_elements: Vec<u8>,
142    ) -> Result<(), Error> {
143        use bacnet_services::list_manipulation::ListElementRequest;
144
145        let request = ListElementRequest {
146            object_identifier,
147            property_identifier,
148            property_array_index,
149            list_of_elements,
150        };
151        let mut buf = BytesMut::new();
152        request.encode(&mut buf);
153
154        let _ = self
155            .confirmed_request(
156                destination_mac,
157                ConfirmedServiceChoice::ADD_LIST_ELEMENT,
158                &buf,
159            )
160            .await?;
161
162        Ok(())
163    }
164
165    /// Remove elements from a list property on a remote device.
166    pub async fn remove_list_element(
167        &self,
168        destination_mac: &[u8],
169        object_identifier: bacnet_types::primitives::ObjectIdentifier,
170        property_identifier: bacnet_types::enums::PropertyIdentifier,
171        property_array_index: Option<u32>,
172        list_of_elements: Vec<u8>,
173    ) -> Result<(), Error> {
174        use bacnet_services::list_manipulation::ListElementRequest;
175
176        let request = ListElementRequest {
177            object_identifier,
178            property_identifier,
179            property_array_index,
180            list_of_elements,
181        };
182        let mut buf = BytesMut::new();
183        request.encode(&mut buf);
184
185        let _ = self
186            .confirmed_request(
187                destination_mac,
188                ConfirmedServiceChoice::REMOVE_LIST_ELEMENT,
189                &buf,
190            )
191            .await?;
192
193        Ok(())
194    }
195}