ccsds_time_fields
The ccsds_time_fields library adds the self-describing time-field
layer that is missing between raw embedded time bytes and the
format-specific objects in ccsds_time_codes.
This library covers CCSDS binary P-fields for:
CUC time fields using 1 to 7 coarse octets and 0 to 10 fine octets, including the two-octet extended P-field encoding
CDS time fields using 16-bit or 24-bit day segments and either no submillisecond segment, a 16-bit microsecond segment, or a 32-bit picosecond segment
CCS time fields using either calendar or day-of-year encoding and up to 6 BCD fraction octets
Representation
Descriptors are represented using the compound terms:
cuc_descriptor(CoarseOctets, FineOctets, Epoch)
cds_descriptor(DaySegmentOctets, SubmillisecondOctets, Epoch)
ccs_descriptor(CalendarVariant, FractionOctets)
Where:
Epochis eitherccsds_epochorunix_epochCalendarVariantis eithercalendarorday_of_year
This library uses the existing ccsds_time_codes objects to parse and
generate the T-field bytes once the descriptor has been decoded.
For the current scope, the agency-defined epoch bit in CUC and CDS
descriptors is mapped to the existing unix_epoch atom so callers can
keep using the same time-code objects and terms already provided by
ccsds_time_codes.
Parsing and generating
To parse a self-describing CUC time field:
| ?- ccsds_time_fields::parse(bytes([0x1E, 0x00, 0x00, 0x01, 0x00, 0x00, 0x80]), Descriptor, TimeCode).
To parse a self-describing extended CUC time field:
| ?- ccsds_time_fields::parse(bytes([0x9F, 0x28, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80]), Descriptor, TimeCode).
To generate the same time field from a descriptor and a time-code term:
| ?- ccsds_time_fields::generate(bytes(Bytes), cuc_descriptor(4, 2, ccsds_epoch), cuc_time(256, 128)).
To parse a self-describing CDS time field:
| ?- ccsds_time_fields::parse(bytes([0x40, 0x00, 0x01, 0x00, 0x00, 0x07, 0xD0]), Descriptor, TimeCode).
To parse a self-describing CDS time field with a 32-bit submillisecond segment:
| ?- ccsds_time_fields::parse(bytes([0x4E, 0x00, 0x00, 0x01, 0x00, 0x00, 0x07, 0xD0, 0x1D, 0xCD, 0x65, 0x00]), Descriptor, TimeCode).
To generate a self-describing CCS day-of-year time field:
| ?- ccsds_time_fields::generate(bytes(Bytes), ccs_descriptor(day_of_year, 1), ccs_ordinal_time(2026, 128, 14, 30, 45, 67)).
Descriptor helpers
The library also provides helper predicates for descriptor introspection:
valid_descriptor/1format/2epoch/2
For example:
| ?- ccsds_time_fields::format(cds_descriptor(3, 4, unix_epoch), Format).
| ?- ccsds_time_fields::epoch(ccs_descriptor(calendar, 1), Epoch).
API documentation
Open the ../../apis/library_index.html#ccsds_time_fields link in a web browser.
Loading
To load all entities in this library, load the loader.lgt file:
| ?- logtalk_load(ccsds_time_fields(loader)).
Testing
To test this library predicates, load the tester.lgt file:
| ?- logtalk_load(ccsds_time_fields(tester)).