sat-rs/satrs-core/src/mode.rs

69 lines
1.7 KiB
Rust
Raw Normal View History

2023-02-15 11:05:32 +01:00
use core::mem::size_of;
2023-02-15 00:33:33 +01:00
use crate::tmtc::TargetId;
use serde::{Deserialize, Serialize};
2023-02-15 11:05:32 +01:00
use spacepackets::{ByteConversionError, SizeMissmatch};
2023-02-15 00:33:33 +01:00
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
2023-02-15 11:05:32 +01:00
pub struct ModeAndSubmode {
2023-02-15 00:33:33 +01:00
mode: u32,
submode: u16,
}
2023-02-15 11:05:32 +01:00
impl ModeAndSubmode {
pub const fn new_mode_only(mode: u32) -> Self {
Self {
mode,
submode: 0
}
}
pub const fn new(mode: u32, submode: u16) -> Self {
Self {
mode,
submode
}
}
pub fn raw_len() -> usize {
size_of::<u32>() + size_of::<u16>()
}
pub fn from_be_bytes(buf: &[u8]) -> Result<Self, ByteConversionError> {
if buf.len() < 6 {
return Err(ByteConversionError::FromSliceTooSmall(SizeMissmatch {
expected: 6,
found: buf.len()
}));
}
Ok(Self {
mode: u32::from_be_bytes(buf[0..4].try_into().unwrap()),
submode: u16::from_be_bytes(buf[4..6].try_into().unwrap())
})
}
}
2023-02-15 00:33:33 +01:00
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct ModeCommand {
address: TargetId,
2023-02-15 11:05:32 +01:00
mode_submode: ModeAndSubmode,
}
impl ModeCommand {
pub const fn new(address: TargetId, mode_submode: ModeAndSubmode) -> Self {
Self {
address,
mode_submode
}
}
2023-02-15 00:33:33 +01:00
}
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub enum ModeRequest {
SetMode(ModeCommand),
ReadMode(TargetId),
AnnounceMode(TargetId),
AnnounceModeRecursive(TargetId),
}