use crate::consts::MESSAGE_ID_V1_MAX;
use crate::payload::IntoPayload;
use crate::types::{CrcExtra, MavLinkVersion, MessageId};
pub trait MessageSpec {
fn id(&self) -> MessageId;
fn min_supported_mavlink_version(&self) -> MavLinkVersion;
fn crc_extra(&self) -> CrcExtra;
}
pub trait MessageSpecStatic {
fn spec() -> MessageInfo;
fn message_id() -> MessageId;
fn crc_extra() -> CrcExtra;
fn min_supported_mavlink_version() -> MavLinkVersion;
}
pub trait Message: MessageSpec + IntoPayload {}
#[derive(Copy, Clone, Debug)]
pub struct MessageInfo {
id: MessageId,
min_supported_mavlink_version: MavLinkVersion,
crc_extra: CrcExtra,
}
impl MessageSpec for MessageInfo {
#[inline(always)]
fn id(&self) -> MessageId {
self.id()
}
#[inline(always)]
fn min_supported_mavlink_version(&self) -> MavLinkVersion {
self.min_supported_mavlink_version()
}
#[inline(always)]
fn crc_extra(&self) -> CrcExtra {
self.crc_extra()
}
}
impl MessageInfo {
pub const fn new(id: MessageId, crc_extra: CrcExtra) -> Self {
let min_supported_mavlink_version = if id > MESSAGE_ID_V1_MAX {
MavLinkVersion::V2
} else {
MavLinkVersion::V1
};
Self {
id,
min_supported_mavlink_version,
crc_extra,
}
}
#[inline]
pub fn id(&self) -> MessageId {
self.id
}
#[inline]
pub fn min_supported_mavlink_version(&self) -> MavLinkVersion {
self.min_supported_mavlink_version
}
#[inline]
pub fn crc_extra(&self) -> CrcExtra {
self.crc_extra
}
}