#![recursion_limit = "256"]
use core::pin::pin;
use log::info;
use rs_matter_stack::ble::BluerGattPeripheral;
use rs_matter_stack::matter::crypto::{default_crypto, Crypto};
use rs_matter_stack::matter::dm::clusters::app::on_off;
use rs_matter_stack::matter::dm::clusters::app::on_off::test::TestOnOffDeviceLogic;
use rs_matter_stack::matter::dm::clusters::app::on_off::OnOffHooks;
use rs_matter_stack::matter::dm::clusters::desc::{ClusterHandler as _, DescHandler};
use rs_matter_stack::matter::dm::clusters::net_comm::NetworkType;
use rs_matter_stack::matter::dm::devices::test::DAC_PRIVKEY;
use rs_matter_stack::matter::dm::devices::test::{TEST_DEV_ATT, TEST_DEV_COMM, TEST_DEV_DET};
use rs_matter_stack::matter::dm::devices::DEV_TYPE_ON_OFF_LIGHT;
use rs_matter_stack::matter::dm::networks::unix::UnixNetifs;
use rs_matter_stack::matter::dm::networks::wireless::NoopWirelessNetCtl;
use rs_matter_stack::matter::dm::{Async, Dataver, Endpoint, Node};
use rs_matter_stack::matter::dm::{EmptyHandler, EpClMatcher};
use rs_matter_stack::matter::error::Error;
use rs_matter_stack::matter::persist::DirKvBlobStore;
use rs_matter_stack::matter::transport::network::mdns::zeroconf::ZeroconfMdns;
use rs_matter_stack::matter::utils::init::InitMaybeUninit;
use rs_matter_stack::matter::{clusters, devices};
use rs_matter_stack::wireless::PreexistingWireless;
use rs_matter_stack::wireless::WifiMatterStack;
use static_cell::StaticCell;
const BUMP_SIZE: usize = 23500;
fn main() -> Result<(), Error> {
env_logger::init_from_env(
env_logger::Env::default().filter_or(env_logger::DEFAULT_FILTER_ENV, "info"),
);
info!("Starting...");
let stack = MATTER_STACK.uninit().init_with(WifiMatterStack::init(
&TEST_DEV_DET,
TEST_DEV_COMM,
&TEST_DEV_ATT,
));
let crypto = default_crypto(rand::thread_rng(), DAC_PRIVKEY);
let mut rand = crypto.weak_rand()?;
let on_off = on_off::OnOffHandler::new_standalone(
Dataver::new_rand(&mut rand),
LIGHT_ENDPOINT_ID,
TestOnOffDeviceLogic::new(true),
);
let handler = EmptyHandler
.chain(
EpClMatcher::new(
Some(LIGHT_ENDPOINT_ID),
Some(TestOnOffDeviceLogic::CLUSTER.id),
),
on_off::HandlerAsyncAdaptor(&on_off),
)
.chain(
EpClMatcher::new(Some(LIGHT_ENDPOINT_ID), Some(DescHandler::CLUSTER.id)),
Async(DescHandler::new(Dataver::new_rand(&mut rand)).adapt()),
);
let mut store = DirKvBlobStore::new_default();
futures_lite::future::block_on(stack.startup(&crypto, &mut store))?;
let kv = stack.matter().kv(store);
let matter = pin!(stack.run_coex(
PreexistingWireless::new(
edge_nal_std::Stack::new(),
UnixNetifs,
NoopWirelessNetCtl::new(NetworkType::Wifi),
ZeroconfMdns::new(),
BluerGattPeripheral::new(None),
),
&crypto,
(NODE, handler),
kv,
(),
));
futures_lite::future::block_on(async_compat::Compat::new(matter))
}
static MATTER_STACK: StaticCell<WifiMatterStack<BUMP_SIZE>> = StaticCell::new();
const LIGHT_ENDPOINT_ID: u16 = 1;
const NODE: Node = Node {
endpoints: &[
WifiMatterStack::<0, ()>::root_endpoint(),
Endpoint::new(
LIGHT_ENDPOINT_ID,
devices!(DEV_TYPE_ON_OFF_LIGHT),
clusters!(DescHandler::CLUSTER, TestOnOffDeviceLogic::CLUSTER),
),
],
};