"""Process DPU diagnostic HK APID (96, 8) TM ( 3, 26) SID ( 4) 0 0 150 N SWA_TM_DPU_RECEIVED_TC_CNT_HK APID (96, 8) TM ( 3, 26) SID ( 6) 0 0 150 N SWA_TM_HW_DIAGN_PARAM_HK APID (96, 8) TM ( 3, 26) SID ( 7) 0 0 600 N SWA_TM_MAX_DURATION_SSID_HK APID (96, 8) TM ( 3, 26) SID ( 12) 0 0 150 N SWA_DPU_TM_CNT_HK Generate .xls file or make some plots """ from solar import * from CCSDS import CCSDS_reader, TM import numpy as np import struct from collections import namedtuple from matplotlib import pyplot as plt import itertools import functools AUX_DIR = "/DATA/SOLAR/AUX" FIELDS = {} FIELDS [6] = [ ("SID", "B", "Telemetry"), (None, "x", "Spare"), ("SID_count", "H", "Counter"), ("DB_SWIRE_OBC1_STATUS", "I", "DB_SWIRE_OBC1_STATUS"), ("DB_SWIRE_OBC2_STATUS", "I", "DB_SWIRE_OBC2_STATUS"), ("DB_SWIRE_EAS1_STATUS", "I", "DB_SWIRE_EAS1_STATUS"), ("DB_SWIRE_EAS2_STATUS", "I", "DB_SWIRE_EAS2_STATUS"), ("DB_SWIRE_PAS_STATUS", "I", "DB_SWIRE_PAS_STATUS"), ("DB_SWIRE_HIS_STATUS", "I", "DB_SWIRE_HIS_STATUS"), ("EXOS_SPARE1", "I", "EXOS_SPARE1"), ("EXOS_SPARE2", "I", "EXOS_SPARE2"), ("EXOS_ROLLBUFF_EAS1", "I", "EXOS_ROLLBUFF_EAS1"), ("EXOS_ROLLBUFF_EAS2", "I", "EXOS_ROLLBUFF_EAS2"), ("EXOS_ROLLBUFF_PAS", "I", "EXOS_ROLLBUFF_PAS"), ("EXOS_SWIRE_OBC1_TX", "I", "EXOS_SWIRE_OBC1_TX"), ("EXOS_SWIRE_OBC1_RX", "I", "EXOS_SWIRE_OBC1_RX"), ("EXOS_SWIRE_OBC2_TX", "I", "EXOS_SWIRE_OBC2_TX"), ("EXOS_SWIRE_OBC2_RX", "I", "EXOS_SWIRE_OBC2_RX"), ("EXOS_SWIRE_EAS1_TX", "I", "EXOS_SWIRE_EAS1_TX"), ("EXOS_SWIRE_EAS1_RX", "I", "EXOS_SWIRE_EAS1_RX"), ("EXOS_SWIRE_EAS2_TX", "I", "EXOS_SWIRE_EAS2_TX"), ("EXOS_SWIRE_EAS2_RX", "I", "EXOS_SWIRE_EAS2_RX"), ("EXOS_SWIRE_PAS_TX", "I", "EXOS_SWIRE_PAS_TX"), ("EXOS_SWIRE_PAS_RX", "I", "EXOS_SWIRE_PAS_RX"), ("EXOS_SWIRE_HIS_TX", "I", "EXOS_SWIRE_HIS_TX"), ("EXOS_SWIRE_HIS_RX", "I", "EXOS_SWIRE_HIS_RX"), ("EXOS_SPW_OBC1_RX_Err", "H", "EXOS_SPW_OBC1_RX_Err"), ("EXOS_SPW_OBC1_RX_EEP", "H", "EEP received on OBC1 RX"), ("EXOS_SPW_OBC2_RX_Err", "H", "Packet lost for buffer full on OBC2 RX"), ("EXOS_SPW_OBC2_RX_EEP", "H", "EEP received on OBC2 RX "), ("EXOS_SPW_EAS1_RX_Err", "H", "Packet lost for buffer full on EAS1 RX"), ("EXOS_SPW_EAS1_RX_EEP", "H", "EEP received on EAS1 RX"), ("EXOS_SPW_EAS2_RX_Err", "H", "Packet lost for buffer full on EAS2 RX"), ("EXOS_SPW_EAS2_RX_EEP", "H", "EEP received on EAS2 RX"), ("EXOS_SPW_PAS_RX_Err", "H", "Packet lost for buffer full on PAS RX"), ("EXOS_SPW_PAS_RX_EEP", "H", "EEP received on PAS RX "), ("EXOS_SPW_HIS_RX_Err", "H", "Packet lost for buffer full on HIS RX"), ("EXOS_SPW_HIS_RX_EEP", "H", "EEP received on HIS RX"), ] FIELDS [7] = [ ("SID", "B", "SID"), (None, "x", "Spare"), ("SID_count", "H", "SID counter"), ("AswDuration", "H", "Whole ASW task duration during the last period"), ("maxDurationTcMngr", "H", "TC Manager Max duration during the last period"), ("maxDurationDpuMngr", "H","DPU Manager Max duration during the last period"), ("maxDurationTimeMngr", "H", "Time Manager Max duration during the last period"), ("maxDurationSensorMngr", "H", "Time Manager Max duration during the last period"), ("maxDurationEas1Mngr", "H", "EAS 1 Manager Max duration during the last period"), ("maxDurationEas2Mngr", "H", "EAS 2 Manager Max duration during the last period"), ("maxDurationPASMngr", "H", "PAS Manager Max duration during the last period"), ("maxDurationHISMngr", "H", "HIS Manager Max duration during the last period"), ("maxDurationFdirMngr", "H", "PUS Time Manager Max duration during the last period"), ("maxDurationPusMngr", "H", "PUS Manager Max duration during the last period"), ] FIELDS [12] = [ ("SID", "B", "Telemetry Identifier 12 (Diagnostic 3,26)"), (None, "x", "Spare"), ("SID_count", "H", "Counter Sequence Counter related to the SID PUS MANAGER TM COUNTER DATA"), ("issuedTmPkt_95_5", "H", "(PID 95) PCAT 5 counter"), ("issuedTmPkt_95_12", "H", "(PID 95) PCAT 12"), (None, "xx", "(PID 95) spare field"), (None, "xx", "(PID 95) spare field"), ("issuedTmPkt_96_4", "H", "(PID 96) PCAT 4 counter"), ("issuedTmPkt_96_12", "H", "(PID 96) PCAT 12 counter"), ("issuedTmPkt_98_8", "H", "(PID 96) PCAT 8 counter"), (None, "xx", "(PID 96) spare field"), ("issuedTmPkt_97_12", "H", "(PID 97) PCAT 12 counter"), (None, "xx", "(PID 97) spare field"), (None, "xx", "(PID 97) spare field"), (None, "xx", "(PID 97) spare field"), ("issuedTmPkt_98_4", "H", "(PID 98) PCAT 4 counter"), ("issuedTmPkt_98_12", "H", "(PID 98) PCAT 12 counter"), (None, "xx", "(PID 98) spare field"), (None, "xx", "(PID 98) spare field"), ("issuedTmPkt_99_1", "H", "(PID 99) PCAT 1 counter"), ("issuedTmPkt_99_4", "H", "(PID 99) PCAT 4 counter"), ("issuedTmPkt_99_7", "H", "(PID 99) PCAT 7 counter"), ("issuedTmPkt_99_9", "H", "(PID 99) PCAT 9 counter"), ("issuedTmPkt_99_12", "H", "(PID 99) PCAT 12 counter"), ("lostTmPkt_95_5", "H", "(PID 95) PCAT 5 counter"), ("lostTmPkt_95_12", "H", "(PID 95) PCAT 12"), (None, "xx", "(PID 95) spare field"), (None, "xx", "(PID 95) spare field"), ("lostTmPkt_96_4", "H", "(PID 96) PCAT 4 counter"), ("lostTmPkt_96_8", "H", "(PID 96) PCAT 8 counter"), (None, "xx", "(PID 96) spare field"), (None, "xx", "(PID 96) spare field"), ("lostTmPkt_97_12", "H", "(PID 97) PCAT 12 counter"), (None, "xx", "(PID 97) spare field"), (None, "xx", "(PID 97) spare field"), (None, "xx", "(PID 97) spare field"), ("lostTmPkt_98_4", "H", "(PID 98) PCAT 4 counter"), ("lostTmPkt_98_12", "H", "(PID 98) PCAT 12 counter"), (None, "xx", "(PID 98) spare field"), (None, "xx", "(PID 98) spare field"), ("lostTmPkt_99_1", "H", "(PID 99) PCAT 1 counter"), ("lostTmPkt_99_4", "H", "(PID 99) PCAT 4 counter"), ("lostTmPkt_99_7", "H", "(PID 99) PCAT 7 counter"), ("lostTmPkt_99_9", "H", "(PID 99) PCAT 9 counter"), ("lostTmPkt_99_12", "H", "(PID 99) PCAT 12 counter"), ] def make_daily_filter (day): """ Daily packet filter """ t1 = datetime.datetime.combine (day, datetime.time (0,0,0)) t2 = t1 + datetime.timedelta (days = 1) def fun (packet): return TM (packet) and t1 <= packet.dt < t2 return functools.partial (filter, fun) def make_filter (sid): """ Return a function that filter HK SID packets """ def fun (packet): return packet.service_type == 3 and packet.sid == sid return functools.partial (filter, fun) def get_data (day, sid): """ Pas DPU HK packet with a given SID """ fmt = ">" + "".join (fmt for name, fmt, descr in FIELDS [sid]) size = struct.calcsize (fmt) filename = get_L0_filename (day, "swa-pas-tm", "bin") if not filename: filename = get_L0_filename (day, "swa-pas-tm", "hex") print ("Read", filename) daily = make_daily_filter (day) filter_sid = make_filter (sid) with CCSDS_reader (filename) as reader: for packet in daily (filter_sid (reader)): yield (packet.dt, * struct.unpack (fmt, packet.data)) def to_excel (day, sid): """ Generates a daily Excel file """ import pyexcel as pe output_file = os.path.join ( AUX_DIR, ymd (day), "%s.SID.%02d.xls" % (ymd (day), sid)) names = ["DateTime"] + [name for name, fmt, descr in FIELDS[sid] if name] sheet = pe.get_sheet (array = itertools.chain ([names], get_data (day, sid))) nr = sheet.number_of_rows() sheet.save_as (output_file, name_column_by_row = 0) print ("Generation", output_file, "=>", nr, "rows") def to_numpy (day, sid): """ Generates daily numpy array """ names = ["epoch"] + [name for name, fmt, descr in FIELDS[sid] if name] formats = ["object_"] + ["int"] * (len (names) -1) dtype = dict (names = names, formats = formats) return np.array (list (get_data (day, sid)), dtype = dtype) def plot (day, sid): """ Plot some DPU HK parameters """ data = to_numpy (day, sid) if sid == 7: plt.plot (data["epoch"], data ["AswDuration"]) if sid == 12: plt.plot (data ["epoch"], data ["lostTmPkt_98_4"]) plt.show() def sid_4 (day): sid = 4 for packet in get_data (day, sid): print (packet) if __name__ == "__main__": from sys import argv, exit for arg in argv [1:]: day = str_to_date (arg) # sid_4 (day) # continue # plot (day, sid) for sid in [6, 7, 12]: to_excel (day, sid) # to_numpy (day, sid) # plot (day, 12)