1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
//! PUS Service 11 Scheduling
use num_enum::{IntoPrimitive, TryFromPrimitive};
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};

#[derive(Debug, PartialEq, Eq, Copy, Clone, IntoPrimitive, TryFromPrimitive)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[repr(u8)]
pub enum Subservice {
    // Core subservices
    TcEnableScheduling = 1,
    TcDisableScheduling = 2,
    TcResetScheduling = 3,
    TcInsertActivity = 4,
    TcDeleteActivityByRequestId = 5,
    TcDeleteActivitiesByFilter = 6,

    // Time shift subservices
    TcTimeShiftActivityWithRequestId = 7,
    TcTimeShiftActivitiesByFilter = 8,
    TcTimeShiftAll = 15,

    // Reporting subservices
    TcDetailReportByRequestId = 9,
    TmDetailReport = 10,
    TcDetailReportByFilter = 11,
    TcSummaryReportByRequestId = 12,
    TmSummaryReport = 13,
    TcSummaryReportByFilter = 14,
    TcDetailReportAll = 16,
    TcSummaryReportAll = 17,

    // Subschedule subservices
    TcReportSubscheduleStatus = 18,
    TmReportSubscheduleStatus = 19,
    TcEnableSubschedule = 20,
    TcDisableSubschedule = 21,

    // Group subservices
    TcCreateScheduleGroup = 22,
    TcDeleteScheduleGroup = 23,
    TcEnableScheduleGroup = 24,
    TcDisableScheduleGroup = 25,
    TcReportAllGroupsStatus = 26,
    TmReportAllGroupsStatus = 27,
}

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

impl From<bool> for SchedStatus {
    fn from(value: bool) -> Self {
        if value {
            SchedStatus::Enabled
        } else {
            SchedStatus::Disabled
        }
    }
}

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

#[cfg(test)]
mod tests {
    use super::*;
    #[cfg(feature = "serde")]
    use crate::tests::generic_serde_test;

    #[test]
    fn test_bool_conv_0() {
        let enabled = true;
        let status: SchedStatus = enabled.into();
        assert_eq!(status, SchedStatus::Enabled)
    }

    #[test]
    fn test_bool_conv_1() {
        let enabled = false;
        let status: SchedStatus = enabled.into();
        assert_eq!(status, SchedStatus::Disabled)
    }

    #[test]
    fn test_conv_into_u8() {
        let subservice: u8 = Subservice::TcCreateScheduleGroup.into();
        assert_eq!(subservice, 22);
    }

    #[test]
    fn test_conv_from_u8() {
        let subservice: Subservice = 22u8.try_into().unwrap();
        assert_eq!(subservice, Subservice::TcCreateScheduleGroup);
    }

    #[test]
    #[cfg(feature = "serde")]
    fn test_serde_subservice_id() {
        generic_serde_test(Subservice::TcEnableScheduling);
    }

    #[test]
    #[cfg(feature = "serde")]
    fn test_serde_sched_status() {
        generic_serde_test(SchedStatus::Enabled);
    }

    #[test]
    #[cfg(feature = "serde")]
    fn test_serde_time_window_type() {
        generic_serde_test(TimeWindowType::SelectAll);
    }
}