use capsules_extra::crc::CrcDriver;
use core::mem::MaybeUninit;
use kernel::capabilities;
use kernel::component::Component;
use kernel::create_capability;
use kernel::hil::crc::Crc;
#[macro_export]
macro_rules! crc_component_static {
($C:ty $(,)?) => {{
let buffer = kernel::static_buf!([u8; capsules_extra::crc::DEFAULT_CRC_BUF_LENGTH]);
let crc = kernel::static_buf!(capsules_extra::crc::CrcDriver<'static, $C>);
(crc, buffer)
};};
}
pub struct CrcComponent<C: 'static + Crc<'static>> {
board_kernel: &'static kernel::Kernel,
driver_num: usize,
crc: &'static C,
}
impl<C: 'static + Crc<'static>> CrcComponent<C> {
pub fn new(
board_kernel: &'static kernel::Kernel,
driver_num: usize,
crc: &'static C,
) -> CrcComponent<C> {
CrcComponent {
board_kernel,
driver_num,
crc,
}
}
}
impl<C: 'static + Crc<'static>> Component for CrcComponent<C> {
type StaticInput = (
&'static mut MaybeUninit<CrcDriver<'static, C>>,
&'static mut MaybeUninit<[u8; capsules_extra::crc::DEFAULT_CRC_BUF_LENGTH]>,
);
type Output = &'static CrcDriver<'static, C>;
fn finalize(self, static_buffer: Self::StaticInput) -> Self::Output {
let grant_cap = create_capability!(capabilities::MemoryAllocationCapability);
let crc_buf = static_buffer
.1
.write([0; capsules_extra::crc::DEFAULT_CRC_BUF_LENGTH]);
let crc = static_buffer.0.write(CrcDriver::new(
self.crc,
crc_buf,
self.board_kernel.create_grant(self.driver_num, &grant_cap),
));
self.crc.set_client(crc);
crc
}
}