use tokio::sync::broadcast;
use crate::types::{MotorErrorKind, MotorIdentity};
use super::types::ReinitReason;
pub const DEFAULT_EVENTS_CAPACITY: usize = 256;
#[derive(Debug, Clone)]
#[non_exhaustive]
pub enum Cia402Event {
NodeAppeared { nid: u8 },
Identified { nid: u8, identity: MotorIdentity },
IdentifyFailed { nid: u8, reason: String },
NodeOnline { nid: u8 },
NodeOffline { nid: u8 },
Initializing { nid: u8 },
Initialized { nid: u8 },
NeedsReinit { nid: u8, reason: ReinitReason },
EnteredError {
nid: u8,
kind: MotorErrorKind,
raw: u16,
},
}
#[derive(Debug)]
pub enum EventStreamItem {
Event(Cia402Event),
Lagged { dropped: u64 },
}
pub struct EventStream {
rx: broadcast::Receiver<Cia402Event>,
}
impl std::fmt::Debug for EventStream {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("EventStream").finish_non_exhaustive()
}
}
impl EventStream {
pub(crate) fn new(rx: broadcast::Receiver<Cia402Event>) -> Self {
Self { rx }
}
pub async fn recv(&mut self) -> Option<EventStreamItem> {
match self.rx.recv().await {
Ok(ev) => Some(EventStreamItem::Event(ev)),
Err(broadcast::error::RecvError::Lagged(n)) => {
Some(EventStreamItem::Lagged { dropped: n })
}
Err(broadcast::error::RecvError::Closed) => None,
}
}
}