use std::collections::BTreeMap;
use tokio::sync::mpsc::Receiver;
use crate::ember::{aps, concentrator};
use crate::ezsp::{config, policy};
use crate::{Callback, Startup};
const RADIO_POWER: i8 = 8;
#[cfg_attr(not(feature = "apis-saltans"), expect(dead_code))]
pub struct Builder<T> {
pub(crate) transport: T,
pub(crate) callbacks: Receiver<Callback>,
pub(crate) startup: Startup,
pub(crate) policy: BTreeMap<policy::Id, u8>,
pub(crate) configuration: BTreeMap<config::Id, u16>,
pub(crate) concentrator: Option<concentrator::Parameters>,
pub(crate) radio_tx_power: i8,
pub(crate) aps_options: aps::Options,
pub(crate) buffers: usize,
}
impl<T> Builder<T> {
#[must_use]
pub const fn new(transport: T, callbacks: Receiver<Callback>, startup: Startup) -> Self {
Self {
transport,
callbacks,
startup,
policy: BTreeMap::new(),
configuration: BTreeMap::new(),
concentrator: None,
radio_tx_power: RADIO_POWER,
aps_options: aps::Options::empty(),
buffers: 1024,
}
}
#[must_use]
pub fn with_policy(mut self, policy: policy::Id, decision: impl Into<u8>) -> Self {
self.policy.insert(policy, decision.into());
self
}
#[must_use]
pub fn with_policies(mut self, policies: BTreeMap<policy::Id, u8>) -> Self {
self.policy.extend(policies);
self
}
#[must_use]
pub fn with_configuration(mut self, config: config::Id, value: u16) -> Self {
self.configuration.insert(config, value);
self
}
#[must_use]
pub fn with_configurations(mut self, configurations: BTreeMap<config::Id, u16>) -> Self {
self.configuration.extend(configurations);
self
}
#[must_use]
pub const fn with_concentrator(mut self, concentrator: concentrator::Parameters) -> Self {
self.concentrator.replace(concentrator);
self
}
#[must_use]
pub const fn with_radio_tx_power(mut self, radio_tx_power: i8) -> Self {
self.radio_tx_power = radio_tx_power;
self
}
#[must_use]
pub const fn with_aps_options(mut self, options: aps::Options) -> Self {
self.aps_options = options;
self
}
#[must_use]
pub const fn with_buffers(mut self, buffers: usize) -> Self {
self.buffers = buffers;
self
}
}
#[cfg(feature = "ashv2")]
impl Builder<crate::uart::Uart> {
pub fn ashv2<T>(serial_port: T, startup: Startup) -> (Self, crate::uart::Futures<T>)
where
T: crate::uart::SerialPort + Sync + 'static,
{
Self::ashv2_with_buffers(serial_port, startup, crate::uart::Buffers::default())
}
pub fn ashv2_with_buffers<T>(
serial_port: T,
startup: Startup,
buffers: crate::uart::Buffers,
) -> (Self, crate::uart::Futures<T>)
where
T: crate::uart::SerialPort + Sync + 'static,
{
let (ash_tx, ash_rx) = tokio::sync::mpsc::channel(buffers.ash_receiver);
let (ash_v2, futures) = crate::uart::start(serial_port, ash_tx);
let (callbacks_tx, callbacks_rx) = tokio::sync::mpsc::channel(buffers.ezsp_callbacks);
let (uart, splitter) = crate::uart::Uart::new(
ash_v2,
ash_rx,
callbacks_tx,
crate::MIN_NON_LEGACY_VERSION,
buffers.ezsp_messages,
);
(
Self::new(uart, callbacks_rx, startup),
crate::uart::Futures::new(splitter, futures),
)
}
}