[feature] Bitfield record class
Introduction
The PDUs in IEEE1278.1-2012 contain structured, hierarchical records, of which three kinds can be identified: A. fixed-size records, with a fixed marshalled size that is known upfront, and record fields have octet-multiple sizes B. variable-size records, with a variable marshalled size that is not known upfront, and is typically included in one of the record fields as a length or count. C. fixed-size bitfield enums/records, with fields that are non-octet-multiple sizes
This is a first attempt at implementing the last category (C), involving record fields with non-octet-multiple sizes.
All tests pass so far.
Changes
New method for reading bytes from stream
DataInputStream and DataOutputStream get read_bytes() and write_byte() methods respectively that allow reading an arbitrary number of raw bytes from the stream , and writing a byte sequence of arbitrary size to the stream.
New namespace, record
The new classes are in a separate file, record.py, to avoid dumping its required imports into dis7.
If this namespacing arrangement is preferable I will gradually migrate other records over to this module as I work on them as well. This will leave dis7.py primarily for PDU classes.
Sample bitfield class definitions
In record.py are a bitfield class factory function, bitfield(), and two sample classes, SpreadSpectrum and NetId. I have also pushed a small change to dis7.py, which affects ModulationType (which uses SpreadSpectrum) and thus the TransmitterPdu class as well.
Minor bugfix
Also included is a small fix to SignalPdu, left over from #56.
Requests
Since this PR proposes an interface for bitfields, I would prefer to merge it into a testing branch first and keep it apart from master until sufficient time has passed for users and contributors to give it a run.
If this is okay, please reject this PR and I will make another one for testing branch after it is created.
Related/affected issues/PRs
- The Bitfield class incorporates the proposal in #54 to add a
marshalledSize()method that returns the bytesize of the complete record. Consider this an experiment for that proposal as well. - The addition of bitfield records contributes to progress in #14, which is held up by the absence of these record classes.
- bitfield classes, along with the
marshalledSize()method, will make #53 easier as it provides an easy way to obtain the length of records. - The namespacing proposal above mirrors #52 in its proposal to break up the dis7 module into multiple submodules so that it is easier to differentiate the classes in this package.
- While not currently open as an issue, the definition of
SpreadSpectrumcompletes the implementation ofModulationType, which means thattestTransmitterPdu.pycan now incorporate themodulationTypeattribute into its testing as well (it currently stops atpower)