spacepackets/ecss/
scheduling.rs

1//! PUS Service 11 Scheduling
2use num_enum::{IntoPrimitive, TryFromPrimitive};
3#[cfg(feature = "serde")]
4use serde::{Deserialize, Serialize};
5
6#[derive(Debug, PartialEq, Eq, Copy, Clone, IntoPrimitive, TryFromPrimitive)]
7#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
8#[cfg_attr(feature = "defmt", derive(defmt::Format))]
9#[repr(u8)]
10pub enum Subservice {
11    // Core subservices
12    TcEnableScheduling = 1,
13    TcDisableScheduling = 2,
14    TcResetScheduling = 3,
15    TcInsertActivity = 4,
16    TcDeleteActivityByRequestId = 5,
17    TcDeleteActivitiesByFilter = 6,
18
19    // Time shift subservices
20    TcTimeShiftActivityWithRequestId = 7,
21    TcTimeShiftActivitiesByFilter = 8,
22    TcTimeShiftAll = 15,
23
24    // Reporting subservices
25    TcDetailReportByRequestId = 9,
26    TmDetailReport = 10,
27    TcDetailReportByFilter = 11,
28    TcSummaryReportByRequestId = 12,
29    TmSummaryReport = 13,
30    TcSummaryReportByFilter = 14,
31    TcDetailReportAll = 16,
32    TcSummaryReportAll = 17,
33
34    // Subschedule subservices
35    TcReportSubscheduleStatus = 18,
36    TmReportSubscheduleStatus = 19,
37    TcEnableSubschedule = 20,
38    TcDisableSubschedule = 21,
39
40    // Group subservices
41    TcCreateScheduleGroup = 22,
42    TcDeleteScheduleGroup = 23,
43    TcEnableScheduleGroup = 24,
44    TcDisableScheduleGroup = 25,
45    TcReportAllGroupsStatus = 26,
46    TmReportAllGroupsStatus = 27,
47}
48
49/// This status applies to sub-schedules and groups as well as specified in ECSS-E-ST-70-41C 8.11.3
50#[derive(Debug, PartialEq, Eq, Copy, Clone)]
51#[cfg_attr(feature = "defmt", derive(defmt::Format))]
52#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
53pub enum SchedStatus {
54    Disabled = 0,
55    Enabled = 1,
56}
57
58impl From<bool> for SchedStatus {
59    #[inline]
60    fn from(value: bool) -> Self {
61        if value {
62            SchedStatus::Enabled
63        } else {
64            SchedStatus::Disabled
65        }
66    }
67}
68
69/// Time window types as specified in  ECSS-E-ST-70-41C 8.11.3
70#[derive(Debug, PartialEq, Eq, Copy, Clone)]
71#[cfg_attr(feature = "defmt", derive(defmt::Format))]
72#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
73pub enum TimeWindowType {
74    SelectAll = 0,
75    TimeTagToTimeTag = 1,
76    FromTimeTag = 2,
77    ToTimeTag = 3,
78}
79
80#[cfg(test)]
81mod tests {
82    use super::*;
83    #[cfg(feature = "serde")]
84    use crate::tests::generic_serde_test;
85
86    #[test]
87    fn test_bool_conv_0() {
88        let enabled = true;
89        let status: SchedStatus = enabled.into();
90        assert_eq!(status, SchedStatus::Enabled)
91    }
92
93    #[test]
94    fn test_bool_conv_1() {
95        let enabled = false;
96        let status: SchedStatus = enabled.into();
97        assert_eq!(status, SchedStatus::Disabled)
98    }
99
100    #[test]
101    fn test_conv_into_u8() {
102        let subservice: u8 = Subservice::TcCreateScheduleGroup.into();
103        assert_eq!(subservice, 22);
104    }
105
106    #[test]
107    fn test_conv_from_u8() {
108        let subservice: Subservice = 22u8.try_into().unwrap();
109        assert_eq!(subservice, Subservice::TcCreateScheduleGroup);
110    }
111
112    #[test]
113    #[cfg(feature = "serde")]
114    fn test_serde_subservice_id() {
115        generic_serde_test(Subservice::TcEnableScheduling);
116    }
117
118    #[test]
119    #[cfg(feature = "serde")]
120    fn test_serde_sched_status() {
121        generic_serde_test(SchedStatus::Enabled);
122    }
123
124    #[test]
125    #[cfg(feature = "serde")]
126    fn test_serde_time_window_type() {
127        generic_serde_test(TimeWindowType::SelectAll);
128    }
129}