#![recursion_limit = "256"]
use core::pin::pin;
use log::info;
use rs_matter_stack::eth::EthMatterStack;
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;
use rs_matter_stack::matter::dm::clusters::desc::ClusterHandler as _;
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::{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 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(EthMatterStack::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(desc::DescHandler::CLUSTER.id)),
Async(desc::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_preex(
edge_nal_std::Stack::new(),
UnixNetifs,
ZeroconfMdns::new(),
&crypto,
(NODE, handler),
kv,
(),
));
futures_lite::future::block_on(matter)
}
static MATTER_STACK: StaticCell<EthMatterStack<BUMP_SIZE, ()>> = StaticCell::new();
const LIGHT_ENDPOINT_ID: u16 = 1;
const NODE: Node = Node {
endpoints: &[
EthMatterStack::<0, ()>::root_endpoint(),
Endpoint::new(
LIGHT_ENDPOINT_ID,
devices!(DEV_TYPE_ON_OFF_LIGHT),
clusters!(desc::DescHandler::CLUSTER, TestOnOffDeviceLogic::CLUSTER),
),
],
};