#![cfg_attr(target_os = "none", no_std)]
#![cfg_attr(target_os = "none", no_main)]
use msrt::endpoint::{EndpointPoll, MessageEvent, PassiveEndpoint, ReceiveReport};
const TX_BUF_BYTES: usize = 256;
const POLLS_PER_TICK: usize = 16;
pub struct McuMsrt {
endpoint: PassiveEndpoint,
tx_buf: [u8; TX_BUF_BYTES],
}
impl McuMsrt {
#[must_use]
pub fn new() -> Self {
Self {
endpoint: PassiveEndpoint::new(msrt::endpoint::EngineConfig::default()),
tx_buf: [0; TX_BUF_BYTES],
}
}
pub fn on_rx_byte(&mut self, now_ms: u64, byte: u8) -> ReceiveReport {
self.endpoint.receive(now_ms, core::slice::from_ref(&byte))
}
pub fn poll<W>(&mut self, now_ms: u64, mut write: W) -> msrt::error::Result<()>
where
W: FnMut(&[u8]),
{
for _ in 0..POLLS_PER_TICK {
match self.endpoint.poll(now_ms, &mut self.tx_buf)? {
EndpointPoll::Transmit { bytes, .. } => write(bytes),
EndpointPoll::Message(message) => self.on_message(message)?,
EndpointPoll::SendFailed(_) | EndpointPoll::Idle => break,
}
}
Ok(())
}
fn on_message(&mut self, _message: MessageEvent) -> msrt::error::Result<()> {
let _ = self.endpoint.send(b"mcu msrt received host message")?;
Ok(())
}
}
impl Default for McuMsrt {
fn default() -> Self {
Self::new()
}
}
#[cfg(not(target_os = "none"))]
fn main() {
println!("build this example for a no_std MCU target to use the embedded entry point");
}
#[cfg(target_os = "none")]
#[panic_handler]
fn panic(_info: &core::panic::PanicInfo<'_>) -> ! {
loop {}
}
#[cfg(target_os = "none")]
#[unsafe(no_mangle)]
pub extern "C" fn main() -> ! {
let mut msrt = McuMsrt::new();
let mut now_ms = 0u64;
loop {
while let Some(byte) = read_transport_byte() {
let _ = msrt.on_rx_byte(now_ms, byte);
}
let _ = msrt.poll(now_ms, write_transport);
now_ms = now_ms.wrapping_add(1);
}
}
#[cfg(target_os = "none")]
fn read_transport_byte() -> Option<u8> {
None
}
#[cfg(target_os = "none")]
fn write_transport(_bytes: &[u8]) {
}