use crate::{Message, MessageResult};
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub struct SameReceiverEvent {
what: SameEventType,
input_sample_counter: u64,
}
impl SameReceiverEvent {
pub fn message(&self) -> Option<&MessageResult> {
match self.what() {
SameEventType::Transport(TransportState::Message(res)) => Some(res),
_ => None,
}
}
pub fn message_ok(&self) -> Option<&Message> {
match self.what() {
SameEventType::Transport(TransportState::Message(res)) => res.as_ref().ok(),
_ => None,
}
}
pub fn burst(&self) -> Option<&[u8]> {
match self.what() {
SameEventType::Link(LinkState::Burst(res)) => Some(res.as_ref()),
_ => None,
}
}
pub fn into_message(self) -> Option<MessageResult> {
match self.what {
SameEventType::Transport(TransportState::Message(res)) => Some(res),
_ => None,
}
}
pub fn into_message_ok(self) -> Option<Message> {
match self.what {
SameEventType::Transport(TransportState::Message(res)) => res.ok(),
_ => None,
}
}
pub fn what(&self) -> &SameEventType {
&self.what
}
pub fn input_sample_counter(&self) -> u64 {
self.input_sample_counter
}
}
impl SameReceiverEvent {
pub(crate) fn new<E>(what: E, input_sample_counter: u64) -> Self
where
E: Into<SameEventType>,
{
Self {
what: what.into(),
input_sample_counter,
}
}
}
impl From<SameReceiverEvent> for Option<MessageResult> {
fn from(rx: SameReceiverEvent) -> Self {
rx.into_message()
}
}
impl From<SameReceiverEvent> for Option<Message> {
fn from(rx: SameReceiverEvent) -> Self {
rx.into_message_ok()
}
}
impl std::fmt::Display for SameReceiverEvent {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"[{:<14}]: event {}",
self.input_sample_counter,
self.what()
)
}
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub enum SameEventType {
Link(LinkState),
Transport(TransportState),
}
impl From<LinkState> for SameEventType {
fn from(inp: LinkState) -> Self {
Self::Link(inp)
}
}
impl From<TransportState> for SameEventType {
fn from(inp: TransportState) -> Self {
Self::Transport(inp)
}
}
impl AsRef<str> for SameEventType {
fn as_ref(&self) -> &str {
match self {
SameEventType::Link(_) => "link",
SameEventType::Transport(_) => "transport",
}
}
}
impl std::fmt::Display for SameEventType {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
SameEventType::Link(evt) => write!(f, "[{}]: {}", self.as_ref(), evt),
SameEventType::Transport(evt) => write!(f, "[{}]: {}", self.as_ref(), evt),
}
}
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum LinkState {
NoCarrier,
Searching,
Reading,
Burst(Vec<u8>),
}
impl AsRef<str> for LinkState {
fn as_ref(&self) -> &str {
match self {
LinkState::NoCarrier => "no carrier",
LinkState::Searching => "searching",
LinkState::Reading => "reading",
LinkState::Burst(_) => "decoded burst",
}
}
}
impl std::fmt::Display for LinkState {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
LinkState::Burst(data) => write!(
f,
"{}: \"{}\"",
self.as_ref(),
String::from_utf8_lossy(&data)
),
_ => write!(f, "{}", self.as_ref()),
}
}
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum TransportState {
Idle,
Assembling,
Message(MessageResult),
}
impl AsRef<str> for TransportState {
fn as_ref(&self) -> &str {
match self {
TransportState::Idle => "idle",
TransportState::Assembling => "assembling",
TransportState::Message(Ok(_)) => "message",
TransportState::Message(Err(_)) => "decode error",
}
}
}
impl std::fmt::Display for TransportState {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
TransportState::Message(Ok(msg)) => write!(
f,
"{}: ({:.1}% voting, {} errors) \"{}\"",
self.as_ref(),
100.0 * (msg.voting_byte_count() as f32 / msg.as_str().len() as f32),
msg.parity_error_count(),
msg
),
TransportState::Message(Err(err)) => write!(f, "{}: \"{}\"", self.as_ref(), err),
_ => write!(f, "{}", self.as_ref()),
}
}
}