@@ -172,8 +172,7 @@ def pack(self) -> bytearray:
172
172
173
173
174
174
class SpacePacketHeader (AbstractSpacePacket ):
175
- """This class encapsulates the space packet header.
176
- Packet reference: Blue Book CCSDS 133.0-B-2"""
175
+ """This class encapsulates the space packet header. Packet reference: Blue Book CCSDS 133.0-B-2"""
177
176
178
177
def __init__ (
179
178
self ,
@@ -187,6 +186,10 @@ def __init__(
187
186
):
188
187
"""Create a space packet header with the given field parameters.
189
188
189
+ The data length field can also be set from the total packet length by using the
190
+ :py:meth:`set_data_len_from_packet_len` method after construction of the space packet
191
+ header object.
192
+
190
193
>>> sph = SpacePacketHeader(packet_type=PacketType.TC, apid=0x42, seq_count=0, data_len=12)
191
194
>>> hex(sph.apid)
192
195
'0x42'
@@ -201,17 +204,28 @@ def __init__(
201
204
>>> sph.packet_seq_control
202
205
PacketSeqCtrl(seq_flags=<SequenceFlags.UNSEGMENTED: 3>, seq_count=0)
203
206
204
- :param packet_type: 0 for Telemetery, 1 for Telecommands
205
- :param apid: Application Process ID, should not be larger
206
- than 11 bits, deciaml 2074 or hex 0x7ff
207
- :param seq_count: Source sequence counter, should not be larger than 0x3fff or
208
- decimal 16383
209
- :param data_len: Contains a length count C that equals one fewer than the length of the
210
- packet data field. Should not be larger than 65535 bytes
211
- :param ccsds_version:
212
- :param sec_header_flag: Secondary header flag, or False by default.
213
- :param seq_flags:
214
- :raises ValueError: On invalid parameters
207
+ Parameters
208
+ -----------
209
+ packet_type: PacketType
210
+ 0 for Telemetery, 1 for Telecommands
211
+ apid: int
212
+ Application Process ID, should not be larger than 11 bits, deciaml 2074 or hex 0x7ff
213
+ seq_count: int
214
+ Source sequence counter, should not be larger than 0x3fff or decimal 16383
215
+ data_len: int
216
+ Contains a length count C that equals one fewer than the length of the packet data
217
+ field. Should not be larger than 65535 bytes
218
+ sec_header_flag: bool
219
+ Secondary header flag, or False by default.
220
+ seq_flags:
221
+ Sequence flags, defaults to unsegmented.
222
+ ccsds_version: int
223
+ Version of the CCSDS packet. Defaults to 0b000
224
+
225
+ Raises
226
+ --------
227
+ ValueError
228
+ On invalid parameters
215
229
"""
216
230
if data_len > pow (2 , 16 ) - 1 or data_len < 0 :
217
231
raise ValueError (
@@ -225,6 +239,54 @@ def __init__(
225
239
self ._psc = PacketSeqCtrl (seq_flags = seq_flags , seq_count = seq_count )
226
240
self .data_len = data_len
227
241
242
+ @classmethod
243
+ def tc (
244
+ cls ,
245
+ apid : int ,
246
+ seq_count : int ,
247
+ data_len : int ,
248
+ sec_header_flag : bool = False ,
249
+ seq_flags : SequenceFlags = SequenceFlags .UNSEGMENTED ,
250
+ ccsds_version : int = 0b000 ,
251
+ ) -> SpacePacketHeader :
252
+ """Create a space packet header with the given field parameters for a telecommand packet.
253
+ Calls the default constructor :py:meth:`SpacePacketHeader` with the packet type
254
+ set to :py:class:`PacketType.TC`.
255
+ """
256
+ return cls (
257
+ packet_type = PacketType .TC ,
258
+ apid = apid ,
259
+ seq_count = seq_count ,
260
+ data_len = data_len ,
261
+ sec_header_flag = sec_header_flag ,
262
+ seq_flags = seq_flags ,
263
+ ccsds_version = ccsds_version ,
264
+ )
265
+
266
+ @classmethod
267
+ def tm (
268
+ cls ,
269
+ apid : int ,
270
+ seq_count : int ,
271
+ data_len : int ,
272
+ sec_header_flag : bool = False ,
273
+ seq_flags : SequenceFlags = SequenceFlags .UNSEGMENTED ,
274
+ ccsds_version : int = 0b000 ,
275
+ ) -> SpacePacketHeader :
276
+ """Create a space packet header with the given field parameters for a telemetry packet.
277
+ Calls the default constructor :py:meth:`SpacePacketHeader` with the packet type
278
+ set to :py:class:`PacketType.TM`.
279
+ """
280
+ return cls (
281
+ packet_type = PacketType .TM ,
282
+ apid = apid ,
283
+ seq_count = seq_count ,
284
+ data_len = data_len ,
285
+ sec_header_flag = sec_header_flag ,
286
+ seq_flags = seq_flags ,
287
+ ccsds_version = ccsds_version ,
288
+ )
289
+
228
290
@classmethod
229
291
def from_composite_fields (
230
292
cls ,
@@ -289,6 +351,19 @@ def sec_header_flag(self, value):
289
351
def seq_count (self ):
290
352
return self ._psc .seq_count
291
353
354
+ def set_data_len_from_packet_len (self , packet_len : int ):
355
+ """Sets the data length field from the given total packet length. The total packet length
356
+ must be at least 7 bytes.
357
+
358
+ Raises
359
+ -------
360
+ ValueError
361
+ The passed packet length is smaller than the minimum expected 7 bytes.
362
+ """
363
+ if packet_len < CCSDS_HEADER_LEN + 1 :
364
+ raise ValueError ("specified total packet length too short" )
365
+ self .data_len = packet_len - CCSDS_HEADER_LEN - 1
366
+
292
367
@seq_count .setter
293
368
def seq_count (self , seq_cnt ):
294
369
self ._psc .seq_count = seq_cnt
@@ -313,7 +388,12 @@ def apid(self, apid):
313
388
def packet_len (self ) -> int :
314
389
"""Retrieve the full space packet size when packed.
315
390
316
- :return: Size of the TM packet based on the space packet header data length field.
391
+ The full packet size is the data length field plus the :py:const:`CCSDS_HEADER_LEN` of 6
392
+ bytes plus one.
393
+
394
+ Returns
395
+ --------
396
+ Size of the TM packet based on the space packet header data length field.
317
397
"""
318
398
return CCSDS_HEADER_LEN + self .data_len + 1
319
399
@@ -383,8 +463,12 @@ def __repr__(self):
383
463
)
384
464
385
465
def pack (self ) -> bytearray :
386
- """Pack the raw byte representation of the space packet
387
- :raises ValueError: Mandatory fields were not supplied properly"""
466
+ """Pack the raw byte representation of the space packet.
467
+
468
+ Raises
469
+ --------
470
+ ValueError
471
+ Mandatory fields were not supplied properly"""
388
472
packet = self .sp_header .pack ()
389
473
if self .sp_header .sec_header_flag :
390
474
if self .sec_header is None :
0 commit comments