-
Notifications
You must be signed in to change notification settings - Fork 0
/
ccsds-spp.pk
121 lines (102 loc) · 3.53 KB
/
ccsds-spp.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
/**
* @file ccsds-spp.pk
* @author Conlan Wesson
* Poke support for CCSDS Space Packet Protocol (CCSDS 133.0-B-2).
*
* @ingroup ccsds
* @defgroup spp CCSDS Space Packet
* @{
*/
/// Version 1 CCSDS Packet (4.1.3.2.2)
var SPACE_PACKET_VERSION_1 = 0b000 as uint<3>;
/// Telemetry Packet Type (4.1.3.3.2.3)
var SPACE_PACKET_TELEMETRY = 0T;
/// Telecommand Packet Type (4.1.3.3.2.3)
var SPACE_PACKET_TELECOMMAND = 1T;
/// APID for Idle Packets (4.1.3.3.4.4)
var SPACE_PACKET_APID_IDLE = 0x7FF as uint<11>;
/// Continuation segment of User Data (4.1.3.4.2.2 a)
var SPACE_PACKET_CONTINUATION = 0b00;
/// First segment of User Data (4.1.3.4.2.2 b)
var SPACE_PACKET_FIRST_SEGMENT = 0b01;
/// Last segment of User Data (4.1.3.4.2.2 c)
var SPACE_PACKET_LAST_SEGMENT = 0b10;
/// Unsegmented User Data (4.1.3.4.2.2 d)
var SPACE_PACKET_UNSEGMENTED = 0b11;
/**
* Space Packet Primary Header
*/
type Space_Packet_Primary_Header =
struct
{
uint<3> version = SPACE_PACKET_VERSION_1;
struct {
uint<1> pkt_type;
uint<1> sec_hdr_flag;
uint<11> apid : (apid != SPACE_PACKET_APID_IDLE) || (sec_hdr_flag == 0); // 4.1.3.3.3.4 The Secondary Header Flag shall be set to '0' for Idle Packets.
} identification;
struct {
uint<2> flags;
uint<14> count;
} sequence_control;
offset<uint<16>,B> data_length;
/**
* Pretty printer.
*/
method _print = void:
{
print ("#<\n");
printf (" %<struct-field-name:Primary Header%>:\n");
printf (" %<struct-field-name:Version%>: %<integer:%u3d%>\n", version);
printf (" %<struct-field-name:Identification%>:\n");
printf (" %<struct-field-name:Packet Type%>: ");
if (identification.pkt_type == SPACE_PACKET_TELEMETRY)
print ("Telemetry\n");
else
print ("Telecommand\n");
printf (" %<struct-field-name:Secondary Header Flag%>: %<integer:%u1d%>\n", identification.sec_hdr_flag);
printf (" %<struct-field-name:Application Identifier%>: ");
if (identification.apid == SPACE_PACKET_APID_IDLE)
print ("Idle\n");
else
printf( "%<integer:0x%u11x%>\n", identification.apid);
printf (" %<struct-field-name:Sequence Control%>:\n");
printf (" %<struct-field-name:Sequence Flags%>: ");
if (sequence_control.flags == SPACE_PACKET_CONTINUATION)
print ("Continuation\n");
else if (sequence_control.flags == SPACE_PACKET_FIRST_SEGMENT)
print ("First Segment\n");
else if (sequence_control.flags == SPACE_PACKET_LAST_SEGMENT)
print ("Last Segment\n");
else if (sequence_control.flags == SPACE_PACKET_UNSEGMENTED)
print ("Unsegmented\n");
printf (" %<struct-field-name:Sequence Count%>: %<integer:%u14d%>\n", sequence_control.count);
printf (" %<struct-field-name:Data Length%>: %v\n", data_length+1#B);
print (">\n");
}
};
assert(1#Space_Packet_Primary_Header == 6#B);
/**
* Space Packet
*/
type Space_Packet =
struct
{
// Primary Header
Space_Packet_Primary_Header header;
// Secondary Header
if (header.identification.sec_hdr_flag)
byte[0] secondary_header;
// User Data Field
var user_data_offset = OFFSET;
byte[0] @ OFFSET + header.data_length + 1#B;
/**
* Get the user data.
* @return Array containing the user data field.
*/
method get_user_data = byte[]:
{
return byte[header.data_length + 1#B] @ user_data_offset;
}
};
/** @} */ // defgroup spp