use crate::consts::{STX_V1, STX_V2};
use crate::protocol::MavLinkVersion;
#[derive(Clone, Copy, Debug)]
#[cfg_attr(feature = "specta", derive(specta::Type))]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum MavSTX {
V1,
V2,
Unknown(u8),
}
impl Default for MavSTX {
#[inline]
fn default() -> Self {
Self::Unknown(0)
}
}
impl From<MavSTX> for u8 {
#[inline]
fn from(value: MavSTX) -> Self {
match value {
MavSTX::V1 => STX_V1,
MavSTX::V2 => STX_V2,
MavSTX::Unknown(unknown) => unknown,
}
}
}
impl From<u8> for MavSTX {
#[inline]
fn from(value: u8) -> Self {
match value {
STX_V1 => MavSTX::V1,
STX_V2 => MavSTX::V2,
unknown => MavSTX::Unknown(unknown),
}
}
}
impl From<MavLinkVersion> for MavSTX {
#[inline]
fn from(value: MavLinkVersion) -> Self {
match value {
MavLinkVersion::V1 => MavSTX::V1,
MavLinkVersion::V2 => MavSTX::V2,
}
}
}
impl From<MavSTX> for Option<MavLinkVersion> {
#[inline]
fn from(value: MavSTX) -> Self {
value.to_mavlink_version()
}
}
impl MavSTX {
#[inline]
pub fn is_magic_byte(value: u8) -> bool {
value == STX_V1 || value == STX_V2
}
#[inline]
pub fn to_mavlink_version(&self) -> Option<MavLinkVersion> {
Some(match self {
MavSTX::V1 => MavLinkVersion::V1,
MavSTX::V2 => MavLinkVersion::V2,
MavSTX::Unknown(_) => return None,
})
}
}