1
//! PUS Service 11 Scheduling
2
use num_enum::{IntoPrimitive, TryFromPrimitive};
3
#[cfg(feature = "serde")]
4
use serde::{Deserialize, Serialize};
5

            
6
2
#[derive(Debug, PartialEq, Eq, Copy, Clone, IntoPrimitive, TryFromPrimitive)]
7
4
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
8
#[repr(u8)]
9
pub enum Subservice {
10
    // Core subservices
11
    TcEnableScheduling = 1,
12
    TcDisableScheduling = 2,
13
    TcResetScheduling = 3,
14
    TcInsertActivity = 4,
15
    TcDeleteActivityByRequestId = 5,
16
    TcDeleteActivitiesByFilter = 6,
17

            
18
    // Time shift subservices
19
    TcTimeShiftActivityWithRequestId = 7,
20
    TcTimeShiftActivitiesByFilter = 8,
21
    TcTimeShiftAll = 15,
22

            
23
    // Reporting subservices
24
    TcDetailReportByRequestId = 9,
25
    TmDetailReport = 10,
26
    TcDetailReportByFilter = 11,
27
    TcSummaryReportByRequestId = 12,
28
    TmSummaryReport = 13,
29
    TcSummaryReportByFilter = 14,
30
    TcDetailReportAll = 16,
31
    TcSummaryReportAll = 17,
32

            
33
    // Subschedule subservices
34
    TcReportSubscheduleStatus = 18,
35
    TmReportSubscheduleStatus = 19,
36
    TcEnableSubschedule = 20,
37
    TcDisableSubschedule = 21,
38

            
39
    // Group subservices
40
    TcCreateScheduleGroup = 22,
41
    TcDeleteScheduleGroup = 23,
42
    TcEnableScheduleGroup = 24,
43
    TcDisableScheduleGroup = 25,
44
    TcReportAllGroupsStatus = 26,
45
    TmReportAllGroupsStatus = 27,
46
}
47

            
48
/// This status applies to sub-schedules and groups as well as specified in ECSS-E-ST-70-41C 8.11.3
49
#[derive(Debug, PartialEq, Eq, Copy, Clone)]
50
4
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
51
pub enum SchedStatus {
52
    Disabled = 0,
53
    Enabled = 1,
54
}
55

            
56
impl From<bool> for SchedStatus {
57
    #[inline]
58
4
    fn from(value: bool) -> Self {
59
4
        if value {
60
2
            SchedStatus::Enabled
61
        } else {
62
2
            SchedStatus::Disabled
63
        }
64
4
    }
65
}
66

            
67
/// Time window types as specified in  ECSS-E-ST-70-41C 8.11.3
68
#[derive(Debug, PartialEq, Eq, Copy, Clone)]
69
4
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
70
pub enum TimeWindowType {
71
    SelectAll = 0,
72
    TimeTagToTimeTag = 1,
73
    FromTimeTag = 2,
74
    ToTimeTag = 3,
75
}
76

            
77
#[cfg(test)]
78
mod tests {
79
    use super::*;
80
    #[cfg(feature = "serde")]
81
    use crate::tests::generic_serde_test;
82

            
83
    #[test]
84
2
    fn test_bool_conv_0() {
85
2
        let enabled = true;
86
2
        let status: SchedStatus = enabled.into();
87
2
        assert_eq!(status, SchedStatus::Enabled)
88
2
    }
89

            
90
    #[test]
91
2
    fn test_bool_conv_1() {
92
2
        let enabled = false;
93
2
        let status: SchedStatus = enabled.into();
94
2
        assert_eq!(status, SchedStatus::Disabled)
95
2
    }
96

            
97
    #[test]
98
2
    fn test_conv_into_u8() {
99
2
        let subservice: u8 = Subservice::TcCreateScheduleGroup.into();
100
2
        assert_eq!(subservice, 22);
101
2
    }
102

            
103
    #[test]
104
2
    fn test_conv_from_u8() {
105
2
        let subservice: Subservice = 22u8.try_into().unwrap();
106
2
        assert_eq!(subservice, Subservice::TcCreateScheduleGroup);
107
2
    }
108

            
109
    #[test]
110
    #[cfg(feature = "serde")]
111
2
    fn test_serde_subservice_id() {
112
2
        generic_serde_test(Subservice::TcEnableScheduling);
113
2
    }
114

            
115
    #[test]
116
    #[cfg(feature = "serde")]
117
2
    fn test_serde_sched_status() {
118
2
        generic_serde_test(SchedStatus::Enabled);
119
2
    }
120

            
121
    #[test]
122
    #[cfg(feature = "serde")]
123
2
    fn test_serde_time_window_type() {
124
2
        generic_serde_test(TimeWindowType::SelectAll);
125
2
    }
126
}