All fields in a packet including those in the packet primary header are defined by a name, bit length (if available), and data type.
This is done by using one of the following objects
These objects are used by the packet objects
PacketField is used to define most fields in a packet as well as the packet primary header.
It can be defined simply, for example:
PacketField(name='SHCOARSE', data_type='uint', bit_length=32)
It requires a name, data type, as well as bit length. The name can be any string. This string is used as the index in the resulting dictionary once a packet is parsed. It is also possible to provide a bit offset to define precisely its position within the packet. This is typically not necessary because packet are defined in a list. Without a bit offset, its value is calculated automatically assuming that the order of packet fields is correct.
PacketArray(name='SENSOR_GRID', data_type='uint', bit_length=16, array_shape=(32, 32), array_order='C')
The bit length is the value for each element in the array. Defining it this way makes it a fixed length field. It is also possible to use it to define a field that can have a variable size.:
PacketArray(name="data", data_type="uint", bit_length=16, array_shape="expand")
This enables the parsing of variable length packets using the