bacnet-client 0.12.0

BACnet async client: TSM, segmentation, discovery, and service APIs
Documentation
//! One bounded serial owner; raw Reject/APDU dispatch never awaits Number egress.
use super::*;
use bacnet_network::network_number::{number_is_reply, NumberControl};
use bacnet_types::network_number::NetworkNumber;

pub(super) const CAPACITY: usize = 256;
pub(super) fn spawn<T: TransportPort + 'static>(
    network: &Arc<NetworkLayer<T>>,
) -> (mpsc::Sender<NumberControl>, JoinHandle<()>) {
    let (tx, mut rx) = mpsc::channel(CAPACITY);
    let network = Arc::clone(network);
    let task = tokio::spawn(async move {
        let mut state = NetworkNumber::default();
        while let Some(control) = rx.recv().await {
            match control {
                NumberControl::NumberIs { number, flag } => {
                    state.observe(number, flag);
                    network.local_network_number().publish(state);
                }
                NumberControl::WhatIs => {
                    if let Some(npdu) = number_is_reply(state) {
                        if let Err(error) = network.transport().send_broadcast(&npdu).await {
                            debug!(%error, "Network-Number-Is broadcast failed");
                        }
                    }
                }
            }
        }
    });
    (tx, task)
}