use bacnet_encoding::apdu::{Apdu, UnconfirmedRequest, encode_apdu};
pub use bacnet_objects::device_identity::{
DeviceIdentity, NetworkPortEntry, build_database_with_extra,
};
use bacnet_services::who_is::IAmRequest;
use bacnet_types::{enums::UnconfirmedServiceChoice, error::Error};
use bytes::BytesMut;
pub fn iam_request(identity: &DeviceIdentity) -> IAmRequest {
IAmRequest {
object_identifier: identity.device_oid(),
max_apdu_length: u32::from(identity.max_apdu_length()),
segmentation_supported: identity.segmentation(),
vendor_id: identity.vendor_id(),
}
}
pub fn encode_iam_apdu(identity: &DeviceIdentity) -> Result<Vec<u8>, Error> {
let mut service = BytesMut::new();
iam_request(identity).encode(&mut service);
let mut apdu = BytesMut::new();
encode_apdu(
&mut apdu,
&Apdu::UnconfirmedRequest(UnconfirmedRequest {
service_choice: UnconfirmedServiceChoice::I_AM,
service_request: service.freeze(),
}),
)?;
Ok(apdu.to_vec())
}
pub fn client_config(identity: &DeviceIdentity) -> bacnet_client::client::ClientConfig {
let mut config = bacnet_client::client::ClientConfig::default();
apply_to_client_config(identity, &mut config);
config
}
pub fn apply_to_client_config(
identity: &DeviceIdentity,
config: &mut bacnet_client::client::ClientConfig,
) {
config.max_apdu_length =
bacnet_encoding::apdu::max_apdu_header_at_or_below(u32::from(identity.max_apdu_length()))
.expect("validated identity exceeds the minimum message size");
}
pub fn server_config(identity: &DeviceIdentity) -> bacnet_server::server::ServerConfig {
bacnet_server::server::ServerConfig {
device: identity.clone(),
..Default::default()
}
}