-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathccsds-tc.pk
152 lines (135 loc) · 4.14 KB
/
ccsds-tc.pk
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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
/**
* @file ccsds-tc.pk
* @author Conlan Wesson
* Poke support for CCSDS TC Space Data Link Protocol (CCSDS 232.0-B-4).
*
* @ingroup ccsds
* @defgroup tc CCSDS TC Space Data Link Protocol
* @{
*/
/// User-defined TC Frame Error Control Field presence. (4.1.4.1.1)
var tc_fecf_present = 0T;
/// TC Frame Version 1 (4.1.2.2.2)
var TC_VERSION_1 = 0b00;
/// TC Bypass Type-A (4.1.2.3.1.2 a)
var TC_BYPASS_TYPE_A = 0T;
/// TC Bypass Type-B (4.1.2.3.1.2 b)
var TC_BYPASS_TYPE_B = 1T;
/// TC Control Command Type-D (4.1.2.3.2.2 a)
var TC_CONTROL_COMMAND_TYPE_D = 0T;
/// TC Control Command Type-C (4.1.2.3.2.2 b)
var TC_CONTROL_COMMAND_TYPE_C = 1T;
/**
* TC Space Data Link Frame Primary Header
*/
type TC_Frame_Primary_Header =
struct
{
uint<2> version = TC_VERSION_1;
uint<1> bypass;
uint<1> control_command;
uint<2> spare : spare == 0b00; // (4.1.2.4.2)
uint<10> scid;
uint<6> vcid;
offset<uint<10>,B> length : (length >= 4#B);
uint<8> sequence_number : (bypass == 0) || (sequence_number == 0); // (4.1.2.8 3)
// Master Channel Identifier (2.1.3)
computed uint<12> mcid;
method get_mcid = uint<12>:
{
return version:::scid;
}
method set_mcid = (uint<12> id) void:
{
version = id .>> 10;
scid = id & 0x3FF;
}
// Global Virtual Channel Identifier (2.1.3)
computed uint<18> gvcid;
method get_gvcid = uint<18>:
{
return version:::scid:::vcid;
}
method set_gvcid = (uint<18> id) void:
{
version = id .>> 16;
scid = (id .>> 6) & 0x3FF;
vcid = id & 0x3F;
}
/**
* Pretty printer.
*/
method _print = void:
{
print ("#<\n");
printf (" %<struct-field-name:Primary Header%>:\n");
printf (" %<struct-field-name:Version%>: %<integer:%u3d%>\n", version+1);
printf (" %<struct-field-name:Bypass Flag%>: Type-%s\n", (bypass == TC_BYPASS_TYPE_A) ? "A" : "B");
printf (" %<struct-field-name:Control Command Flag%>: Type-%s\n", (control_command == TC_CONTROL_COMMAND_TYPE_D) ? "D" : "C");
printf (" %<struct-field-name:Spacecraft ID%>: %<integer:0x%u10x%>\n", scid);
printf (" %<struct-field-name:Virtual Channel ID%>: %<integer:0x%u6x%>\n", vcid);
printf (" %<struct-field-name:Frame Length%>: %v\n", length+1#B);
printf (" %<struct-field-name:Sequence Number%>: %<integer:%u8d%>\n", sequence_number);
print (">\n");
}
};
assert(1#TC_Frame_Primary_Header == 5#B);
/// Continuing portion of service data unit (4.1.3.2.2.2.2)
var TC_SEQUENCE_CONTINUING = 0b00;
/// First portion of service data unit (4.1.3.2.2.2.2)
var TC_SEQUENCE_FIRST = 0b01;
/// Last portion of service data unit (4.1.3.2.2.2.2)
var TC_SEQUENCE_LAST = 0b10;
/// No segmentation of service data unit (4.1.3.2.2.2.2)
var TC_SEQUENCE_NO_SEGMENTATION = 0b11;
/**
* TC Space Data Link Frame Segment Header
*/
type TC_Segment_Header =
struct
{
uint<2> sequence_flags;
uint<6> map_id;
/**
* Pretty printer.
*/
method _print = void:
{
print ("#<\n");
printf (" %<struct-field-name:Segment Header%>:\n");
printf (" %<struct-field-name:Sequence Flags%>: ");
if (sequence_flags == TC_SEQUENCE_CONTINUING)
print ("Continuing portion\n");
else if (sequence_flags == TC_SEQUENCE_FIRST)
print ("First portion\n");
else if (sequence_flags == TC_SEQUENCE_LAST)
print ("Last portion\n");
else if (sequence_flags == TC_SEQUENCE_NO_SEGMENTATION)
print ("No segmentation\n");
printf (" %<struct-field-name:MAP ID%>: %<integer:0x%u6x%>\n", map_id);
print (">\n");
}
};
/**
* TC Space Data Link Frame
*/
type TC_Frame =
struct
{
TC_Frame_Primary_Header header;
// Data Field
var data_offset = OFFSET;
var data_length = header.length + 1#B - 1#TC_Frame_Primary_Header; // (4.1.2.7.3)
byte[0] @ OFFSET + data_length;
if (tc_fecf_present)
uint<16> fecf;
/**
* Get the data field.
* @return Array containing the data field.
*/
method get_data = byte[]:
{
return byte[data_length] @ data_offset;
}
};
/** @} */ // defgroup tc