From 6ed2ab75acc907c2428f642022c76a8f4c63e4da Mon Sep 17 00:00:00 2001 From: Greg Quinn <greg.quinn@ssec.wisc.edu> Date: Tue, 8 Dec 2015 15:44:46 -0600 Subject: [PATCH] Get crio and crgen to pass pep8 Except for the draconian line length limit (used --max-line-length=99). --- edosl0util/crgen.py | 41 +++++++++++++++++++++++++++++++---------- edosl0util/crio.py | 30 +++++++++++++++++++++++++++--- 2 files changed, 58 insertions(+), 13 deletions(-) diff --git a/edosl0util/crgen.py b/edosl0util/crgen.py index 087af19..048e610 100644 --- a/edosl0util/crgen.py +++ b/edosl0util/crgen.py @@ -7,6 +7,7 @@ import os from edosl0util.headers import DaySegmentedTimecode from edosl0util.stream import jpss_packet_stream + def test_build_apid_info(): # FIXME: build CR comparison into the CLI calculated = build_cr('P1571289CRISSCIENCEAAT15320210920101.PDS') @@ -16,11 +17,13 @@ def test_build_apid_info(): del ingested['completion_time'] # creation time from the file name assert calculated == ingested + def build_cr(pds_file, prev_pds_file=None): """Best-effort CR generation by scanning a PDS data file Previous PDS data file may also be given to make gap detection more complete. """ + def main(): scan = scan_packets(pds_file, prev_pds_file) rv = {} @@ -35,31 +38,36 @@ def build_cr(pds_file, prev_pds_file=None): rv.update(aggregated_values(rv['apid_info'])) insert_fake_cr_info(rv) return rv + def file_info(pds_id, apid_info): - cr_entry = {'file_name': pds_id + '.PDS', 'apid_count': 0, 'apid_info' : []} + cr_entry = {'file_name': pds_id + '.PDS', 'apid_count': 0, 'apid_info': []} data_entry = {'file_name': pds_file, 'apid_count': len(apid_info), 'apid_info': [{'scid': npp_scid, 'apid': entry['apid'], 'first_packet_time': entry['first_packet_time'], 'last_packet_time': entry['last_packet_time']} - for entry in apid_info]} + for entry in apid_info]} return [cr_entry, data_entry] + def aggregated_values(apid_info): keys = ['total_packets', 'total_bytes', 'gap_count', 'fill_bytes', 'mismatched_length_packets', 'rs_corrected_packets'] return {key: sum(entry[key] for entry in apid_info) for key in keys} + return main() + def insert_fake_cr_info(cr): """Populate a CR with phony values for fields that can't be discovered via a packet scan""" cr.update({'edos_sw_ver_major': 0, 'edos_sw_ver_minor': 0, 'cr_type': 1, 'test_flag': 0, 'scs_count': 1, 'scs_info': {'start': missing_time_value, - 'stop': missing_time_value}, + 'stop': missing_time_value}, 'first_packet_esh_time': missing_time_value, 'last_packet_esh_time': missing_time_value, 'fill_bytes': 0, 'mismatched_length_packets': 0, 'rs_corrected_packets': 0}) insert_fake_apid_info(cr['apid_info']) + def pds_id_from_path(pds_file): """Pull 36-char PDS ID from a file name; that's the CR file name minus the .PDS""" file_name = os.path.basename(pds_file) @@ -69,10 +77,12 @@ def pds_id_from_path(pds_file): file_name, pds_file_name_length)) return file_name[:34] + '00' + def get_pds_creation_time(pds_file_or_id): """Parse 11-char creation time out of a PDS ID or file name; return a DaySegmentedTimecode""" return datetime_to_ccsds(datetime.strptime(pds_file_or_id[22:33], '%y%j%H%M%S')) + def build_apid_info(scan_apid_info): """Build up apid_info resulting from scan_packets into a full apid_info for a CR""" for entry in scan_apid_info: @@ -84,6 +94,7 @@ def build_apid_info(scan_apid_info): insert_fake_apid_info(apid_info) return apid_info + def insert_fake_apid_info(apid_info): """Fill CR apid_info with phony values for fields that can't be found via a packet scan""" for entry in apid_info: @@ -97,6 +108,7 @@ def insert_fake_apid_info(apid_info): gap.update({'pre_gap_packet_esh_time': missing_time_value, 'post_gap_packet_esh_time': missing_time_value}) + missing_time_value = DaySegmentedTimecode(0, 0, 0) npp_scid = 157 # FIXME: i guess this should come from the file name @@ -104,15 +116,16 @@ npp_scid = 157 # FIXME: i guess this should come from the file name # ripped from MDFCB, 2014-06-05 revision # modified to place CrIS FOV 6 in VCID 7 after testing against some real data npp_vcid_to_apids_map = { - 0: list(range(0, 15)) + list(range(16, 50)) + [65, 70, 100, 146, 155, 512, 513, 518, - 543, 544, 545, 550, 768, 769, 773] + list(range(1280, 1289)), + 0: (list(range(0, 15)) + list(range(16, 50)) + + [65, 70, 100, 146, 155, 512, 513, 518, 543, 544, 545, 550, 768, 769, 773] + + list(range(1280, 1289))), 1: [50, 101, 515, 528, 530, 531], 2: [102], 3: [103, 514, 536], 4: [104], 5: [105], - 6: [106, 1289, 1290] + list(set(range(1315, 1396)) - set(range(1318, 1391, 9)) - - set(range(1320, 1393, 9))), + 6: [106, 1289, 1290] + list(set(range(1315, 1396)) - set(range(1318, 1391, 9)) - + set(range(1320, 1393, 9))), 7: [107] + list(range(1318, 1391, 9)) + list(range(1320, 1393, 9)), 8: [108, 1294, 1295, 1296, 1398], 9: [109], @@ -130,11 +143,14 @@ npp_vcid_to_apids_map = { 21: [121, 517, 524, 549, 556, 780, 1291, 1292, 1293, 1397], 22: [122], 24: [147, 148, 149, 150]} -npp_apid_to_vcid_map = {apid: vcid for vcid, apids in npp_vcid_to_apids_map.items() - for apid in apids} +npp_apid_to_vcid_map = {apid: vcid + for vcid, apids in npp_vcid_to_apids_map.items() + for apid in apids} + def scan_packets(pds_file, prev_pds_file=None): """Scan a PDS data file for information needed to produce a construction record""" + def main(): prev_apid_map = build_prev_apid_map(prev_pds_file) apid_map = {} @@ -151,11 +167,13 @@ def scan_packets(pds_file, prev_pds_file=None): return {'first_packet_time': datetime_to_ccsds(first_pkt.stamp), 'last_packet_time': datetime_to_ccsds(last_pkt.stamp), 'apid_info': [apid_map[k] for k in sorted(apid_map)]} + def build_prev_apid_map(prev_pds_file): if prev_pds_file: return {entry['apid']: entry for entry in scan_packets(prev_pds_file)['apid_info']} else: return {} + def init_entry(pkt, entry_from_prev_pds): rv = {'apid': pkt.apid, 'first_packet_time': datetime_to_ccsds(pkt.stamp), 'first_packet_offset': pkt.offset, @@ -165,6 +183,7 @@ def scan_packets(pds_file, prev_pds_file=None): update_gap_info(rv['gap_info'], entry_from_prev_pds['last_packet_ssc'], entry_from_prev_pds['last_packet_time'], pkt) return rv + def update_entry(entry, new_pkt): prev_last_ssc = entry['last_packet_ssc'] prev_last_time = entry['last_packet_time'] @@ -173,6 +192,7 @@ def scan_packets(pds_file, prev_pds_file=None): entry['total_packets'] += 1 entry['total_bytes'] += new_pkt.size update_gap_info(entry['gap_info'], prev_last_ssc, prev_last_time, new_pkt) + def update_gap_info(gap_info, last_ssc, last_pkt_time, new_pkt): ssc_limit = 16384 # one more than highest SSC expected_new_ssc = (last_ssc + 1) % ssc_limit @@ -183,8 +203,10 @@ def scan_packets(pds_file, prev_pds_file=None): 'post_gap_packet_time': datetime_to_ccsds(new_pkt.stamp), 'post_gap_packet_offset': new_pkt.offset} gap_info.append(gap_entry) + return main() + def datetime_to_ccsds(dt): """Convert a packet stamp to DaySegmentedTimecode @@ -197,4 +219,3 @@ def datetime_to_ccsds(dt): return DaySegmentedTimecode(days, micros // 1000, micros % 1000) else: return DaySegmentedTimecode() - diff --git a/edosl0util/crio.py b/edosl0util/crio.py index 11e9439..ba81f8b 100644 --- a/edosl0util/crio.py +++ b/edosl0util/crio.py @@ -5,8 +5,10 @@ import ctypes as c import warnings from edosl0util.headers import BaseStruct, DaySegmentedTimecode + def read(cr_file): """Parse a PDS construction record from a file (*00.PDS)""" + def main(): rv = {} with open(cr_file, 'rb') as f: @@ -26,7 +28,7 @@ def read(cr_file): read_into_dict(f, Apid4Struct, d) d['mismatched_length_packet_ssc_list'] = [ read_struct(f, ApidMismatchedLengthStruct)['packet_ssc'] - for i in range(d['mismatched_length_packets'])] + for i in range(d['mismatched_length_packets'])] read_into_dict(f, Apid5Struct, d) rv['apid_info'].append(d) read_into_dict(f, Main3Struct, rv) @@ -41,16 +43,21 @@ def read(cr_file): if f.read(): warnings.warn('{} bytes remain after reading CR'.format(len(extra))) return rv + def read_into_dict(f, struct, data): data.update(read_struct(f, struct)) + def read_struct(f, struct): rv = struct_to_dict(struct.from_buffer_copy(f.read(c.sizeof(struct)))) rv = {k: v for k, v in rv.items() if not k.startswith('spare_')} # no spare fields return {k: int(v) if isinstance(v, long) else v for k, v in rv.items()} # no longs + return main() + def write(cr, out_file): """Write out a PDS construction record file""" + def main(): with open(out_file, 'wb') as f: write_struct(cr, Main1Struct, f) @@ -78,15 +85,19 @@ def write(cr, out_file): write_struct(dd, FileApidStruct, f) if d['apid_count'] == 0: write_struct({}, FileApidStruct, f) # one all-zero apid struct if no others + def write_struct(data, struct, out): fields = [f[0] for f in struct._fields_] struct_data = {k: v for k, v in data.items() if k in fields} out.write(memoryview(struct(**struct_data))) + main() + def struct_to_dict(s): return {f[0]: getattr(s, f[0]) for f in s._fields_} + class Main1Struct(BaseStruct): _fields_ = [('edos_sw_ver_major', c.c_uint8), ('edos_sw_ver_minor', c.c_uint8), @@ -97,10 +108,12 @@ class Main1Struct(BaseStruct): ('spare_2', c.c_uint8 * 9), ('scs_count', c.c_uint16)] + class ScsStruct(BaseStruct): _fields_ = [('start', DaySegmentedTimecode), ('stop', DaySegmentedTimecode)] + class Main2Struct(BaseStruct): _fields_ = [('fill_bytes', c.c_uint64), ('mismatched_length_packets', c.c_uint32), @@ -116,6 +129,7 @@ class Main2Struct(BaseStruct): ('spare_3', c.c_uint8 * 7), ('apid_count', c.c_uint8)] + class Apid1Struct(BaseStruct): _fields_ = [('spare_1', c.c_uint8 * 1), ('scid', c.c_uint8), @@ -124,15 +138,18 @@ class Apid1Struct(BaseStruct): ('spare_2', c.c_uint8 * 3), ('vcid_count', c.c_uint8)] + class ApidVcidStruct(BaseStruct): _fields_ = [('spare_1', c.c_uint16), ('spare_2', c.c_uint16, 2), ('scid', c.c_uint16, 8), ('vcid', c.c_uint16, 6)] + class Apid2Struct(BaseStruct): _fields_ = [('gap_count', c.c_uint32)] + class ApidGapStruct(BaseStruct): _fields_ = [('first_missing_ssc', c.c_uint32), ('post_gap_packet_offset', c.c_uint64), @@ -141,22 +158,27 @@ class ApidGapStruct(BaseStruct): ('post_gap_packet_time', DaySegmentedTimecode), ('pre_gap_packet_esh_time', DaySegmentedTimecode), ('post_gap_packet_esh_time', DaySegmentedTimecode)] - + + class Apid3Struct(BaseStruct): _fields_ = [('fill_packets', c.c_uint32)] + class ApidFillStruct(BaseStruct): _fields_ = [('packet_ssc', c.c_uint32), ('packet_offset', c.c_uint64), ('first_fill_byte', c.c_uint32)] + class Apid4Struct(BaseStruct): _fields_ = [('fill_bytes', c.c_uint64), ('mismatched_length_packets', c.c_uint32)] + class ApidMismatchedLengthStruct(BaseStruct): _fields_ = [('packet_ssc', c.c_uint32)] + class Apid5Struct(BaseStruct): _fields_ = [('first_packet_time', DaySegmentedTimecode), ('last_packet_time', DaySegmentedTimecode), @@ -167,15 +189,18 @@ class Apid5Struct(BaseStruct): ('total_bytes', c.c_uint64), ('spare_3', c.c_uint64)] + class Main3Struct(BaseStruct): _fields_ = [('spare_4', c.c_uint8 * 3), ('file_count', c.c_uint8)] + class FileStruct(BaseStruct): _fields_ = [('file_name', c.c_char * 40), ('spare_1', c.c_uint8 * 3), ('apid_count', c.c_uint8)] + class FileApidStruct(BaseStruct): _fields_ = [('spare_1', c.c_uint8 * 1), ('scid', c.c_uint8), @@ -183,4 +208,3 @@ class FileApidStruct(BaseStruct): ('first_packet_time', DaySegmentedTimecode), ('last_packet_time', DaySegmentedTimecode), ('spare_2', c.c_uint8 * 4)] - -- GitLab