Add initial support for request ID in scheduler #31
@ -53,7 +53,7 @@ default-features = false
|
|||||||
optional = true
|
optional = true
|
||||||
|
|
||||||
[dependencies.spacepackets]
|
[dependencies.spacepackets]
|
||||||
version = "0.5.3"
|
version = "0.5.4"
|
||||||
# path = "../spacepackets"
|
# path = "../spacepackets"
|
||||||
# git = "https://egit.irs.uni-stuttgart.de/rust/spacepackets.git"
|
# git = "https://egit.irs.uni-stuttgart.de/rust/spacepackets.git"
|
||||||
# rev = ""
|
# rev = ""
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
//! # Core components of the Flight Software Rust Crate (FSRC) collection
|
//! # Core components of the sat-rs framework
|
||||||
//!
|
//!
|
||||||
//! This is a collection of Rust crates which can be used to build On-Board Software for remote
|
//! This is a collection of Rust crates which can be used to build On-Board Software for remote
|
||||||
//! systems like satellites of rovers. It has special support for space tailored protocols
|
//! systems like satellites of rovers. It has special support for space tailored protocols
|
||||||
|
@ -79,6 +79,8 @@ use alloc::vec;
|
|||||||
use alloc::vec::Vec;
|
use alloc::vec::Vec;
|
||||||
use core::fmt::{Display, Formatter};
|
use core::fmt::{Display, Formatter};
|
||||||
use delegate::delegate;
|
use delegate::delegate;
|
||||||
|
#[cfg(feature = "serde")]
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
#[cfg(feature = "std")]
|
#[cfg(feature = "std")]
|
||||||
use std::boxed::Box;
|
use std::boxed::Box;
|
||||||
#[cfg(feature = "std")]
|
#[cfg(feature = "std")]
|
||||||
@ -130,6 +132,7 @@ pub struct LocalPool {
|
|||||||
|
|
||||||
/// Simple address type used for transactions with the local pool.
|
/// Simple address type used for transactions with the local pool.
|
||||||
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
|
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
|
||||||
|
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
|
||||||
pub struct StoreAddr {
|
pub struct StoreAddr {
|
||||||
pub(crate) pool_idx: u16,
|
pub(crate) pool_idx: u16,
|
||||||
pub(crate) packet_idx: NumBlocks,
|
pub(crate) packet_idx: NumBlocks,
|
||||||
@ -144,6 +147,7 @@ impl StoreAddr {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
|
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
|
||||||
pub enum StoreIdError {
|
pub enum StoreIdError {
|
||||||
InvalidSubpool(u16),
|
InvalidSubpool(u16),
|
||||||
InvalidPacketIdx(u16),
|
InvalidPacketIdx(u16),
|
||||||
@ -166,6 +170,7 @@ impl Display for StoreIdError {
|
|||||||
impl Error for StoreIdError {}
|
impl Error for StoreIdError {}
|
||||||
|
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
|
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
|
||||||
pub enum StoreError {
|
pub enum StoreError {
|
||||||
/// Requested data block is too large
|
/// Requested data block is too large
|
||||||
DataTooLarge(usize),
|
DataTooLarge(usize),
|
||||||
@ -252,6 +257,14 @@ pub trait PoolProvider {
|
|||||||
/// Delete data inside the pool given a [StoreAddr]
|
/// Delete data inside the pool given a [StoreAddr]
|
||||||
fn delete(&mut self, addr: StoreAddr) -> Result<(), StoreError>;
|
fn delete(&mut self, addr: StoreAddr) -> Result<(), StoreError>;
|
||||||
fn has_element_at(&self, addr: &StoreAddr) -> Result<bool, StoreError>;
|
fn has_element_at(&self, addr: &StoreAddr) -> Result<bool, StoreError>;
|
||||||
|
|
||||||
|
/// Retrieve the length of the data at the given store address.
|
||||||
|
fn len_of_data(&self, addr: &StoreAddr) -> Result<usize, StoreError> {
|
||||||
|
if !self.has_element_at(addr)? {
|
||||||
|
return Err(StoreError::DataDoesNotExist(*addr));
|
||||||
|
}
|
||||||
|
return Ok(self.read(addr)?.len());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl LocalPool {
|
impl LocalPool {
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -104,8 +104,11 @@ pub use stdmod::{
|
|||||||
StdVerifSenderError,
|
StdVerifSenderError,
|
||||||
};
|
};
|
||||||
|
|
||||||
/// This is a request identifier as specified in 5.4.11.2 c. of the PUS standard
|
/// This is a request identifier as specified in 5.4.11.2 c. of the PUS standard.
|
||||||
|
///
|
||||||
/// This field equivalent to the first two bytes of the CCSDS space packet header.
|
/// This field equivalent to the first two bytes of the CCSDS space packet header.
|
||||||
|
/// This version of the request ID is supplied in the verification reports and does not contain
|
||||||
|
/// the source ID.
|
||||||
#[derive(Debug, Eq, Copy, Clone)]
|
#[derive(Debug, Eq, Copy, Clone)]
|
||||||
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
|
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
|
||||||
pub struct RequestId {
|
pub struct RequestId {
|
||||||
|
@ -16,7 +16,7 @@ use crate::pus::{PusReceiver, PusTcArgs, PusTmArgs};
|
|||||||
use crate::requests::RequestWithToken;
|
use crate::requests::RequestWithToken;
|
||||||
use satrs_core::pool::{SharedPool, StoreAddr, StoreError};
|
use satrs_core::pool::{SharedPool, StoreAddr, StoreError};
|
||||||
use satrs_core::pus::event_man::EventRequestWithToken;
|
use satrs_core::pus::event_man::EventRequestWithToken;
|
||||||
use satrs_core::pus::scheduling::PusScheduler;
|
use satrs_core::pus::scheduling::{PusScheduler, TcInfo};
|
||||||
use satrs_core::pus::verification::StdVerifReporterWithSender;
|
use satrs_core::pus::verification::StdVerifReporterWithSender;
|
||||||
use satrs_core::spacepackets::{ecss::PusPacket, tc::PusTc, tm::PusTm, SpHeader};
|
use satrs_core::spacepackets::{ecss::PusPacket, tc::PusTc, tm::PusTm, SpHeader};
|
||||||
use satrs_core::tmtc::{
|
use satrs_core::tmtc::{
|
||||||
@ -217,12 +217,12 @@ fn core_tmtc_loop(
|
|||||||
pus_receiver: &mut PusReceiver,
|
pus_receiver: &mut PusReceiver,
|
||||||
scheduler: Rc<RefCell<PusScheduler>>,
|
scheduler: Rc<RefCell<PusScheduler>>,
|
||||||
) {
|
) {
|
||||||
let releaser = |enabled: bool, addr: &StoreAddr| -> bool {
|
let releaser = |enabled: bool, info: &TcInfo| -> bool {
|
||||||
if enabled {
|
if enabled {
|
||||||
tc_args
|
tc_args
|
||||||
.tc_source
|
.tc_source
|
||||||
.tc_source
|
.tc_source
|
||||||
.send(*addr)
|
.send(info.addr())
|
||||||
.expect("sending TC to TC source failed");
|
.expect("sending TC to TC source failed");
|
||||||
}
|
}
|
||||||
true
|
true
|
||||||
@ -239,7 +239,7 @@ fn core_tmtc_loop(
|
|||||||
scheduler.update_time_from_now().unwrap();
|
scheduler.update_time_from_now().unwrap();
|
||||||
if let Ok(released_tcs) = scheduler.release_telecommands(releaser, pool.as_mut()) {
|
if let Ok(released_tcs) = scheduler.release_telecommands(releaser, pool.as_mut()) {
|
||||||
if released_tcs > 0 {
|
if released_tcs > 0 {
|
||||||
println!("{} Tc(s) released from scheduler", released_tcs);
|
println!("{released_tcs} TC(s) released from scheduler");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
drop(pool);
|
drop(pool);
|
||||||
|
Loading…
Reference in New Issue
Block a user