diff --git a/Ccs/ccs_function_lib.py b/Ccs/ccs_function_lib.py index a1eef6702be51c8229ffb6c23432ee2795c4855c..91445ed010184affe8cdb5bc7da37539a6781bc6 100644 --- a/Ccs/ccs_function_lib.py +++ b/Ccs/ccs_function_lib.py @@ -76,16 +76,21 @@ personal_fmtlist = ['uint', 'ascii', 'oct'] fmtlengthlist = {'b': 1, 'B': 1, 'h': 2, 'H': 2, 'i': 4, 'I': 4, 'q': 8, 'Q': 8, 'f': 4, 'd': 8, 'i24': 3, 'I24': 3} -# get format and offset of HK SID -SID_FORMAT = {1: '>B', 2: '>H', 4: '>I'} -_sidfmt = scoped_session_idb.execute('SELECT PIC_PI1_OFF,PIC_PI1_WID FROM {}.pic where PIC_TYPE=3 and PIC_STYPE=25'.format(cfg.get('ccs-database', 'idb_schema'))).fetchall() -if len(_sidfmt) != 0: - SID_OFFSET, SID_BITSIZE = _sidfmt[0] - SID_SIZE = int(SID_BITSIZE / 8) -else: - SID_SIZE = 2 - SID_OFFSET = TM_HEADER_LEN - logger.warning('HK SID definition not found in MIB, using default: OFFSET={}, SIZE={}!'.format(SID_OFFSET, SID_SIZE)) +# get format and offset of SIDs/discriminants +SID_FORMAT = {8: '>B', 16: '>H', 32: '>I'} +try: + _sidfmt = scoped_session_idb.execute('SELECT PIC_TYPE,PIC_STYPE,PIC_APID,PIC_PI1_OFF,PIC_PI1_WID FROM pic').fetchall() + if len(_sidfmt) != 0: + SID_LUT = {tuple(k[:3]): tuple(k[3:]) for k in _sidfmt} + else: + SID_LUT = {} + logger.warning('SID definitions not found in MIB!') +except SQLOperationalError: + APID_FALLBACK = 322 + _sidfmt = scoped_session_idb.execute('SELECT PIC_TYPE,PIC_STYPE,PIC_PI1_OFF,PIC_PI1_WID FROM pic').fetchall() + SID_LUT = {tuple([*k[:2], APID_FALLBACK]): tuple(k[2:]) for k in _sidfmt} + logger.warning('MIB structure not compatible, using fallback APID ({}). This will impact packet decoding.'.format(APID_FALLBACK)) + # get names of TC parameters that carry data pool IDs, i.e. have CPC_CATEG=P DATA_POOL_ID_PARAMETERS = [par[0] for par in scoped_session_idb.execute('SELECT cpc_pname FROM cpc WHERE cpc_categ="P"').fetchall()] diff --git a/Ccs/packet_config_CHEOPS.py b/Ccs/packet_config_CHEOPS.py index f5388d9668dc7e3424e44e7fa6685eeb9016fc54..3aca67cfdb6b024056118f0f6f054617877bf7ec 100644 --- a/Ccs/packet_config_CHEOPS.py +++ b/Ccs/packet_config_CHEOPS.py @@ -28,6 +28,9 @@ rmapcrc = crcmod.mkCrcFun(0x107, rev=True, initCrc=0, xorOut=0) PEC_LEN = 2 # in bytes RMAP_PEC_LEN = 1 +# PUS packet structure definition + +PUS_PKT_VERS_NUM = 0 # 0 for space packets PUS_VERSION = 1 MAX_PKT_LEN = 1024 # bytes @@ -126,6 +129,16 @@ def calc_timestamp(time, sync=0, return_bytes=False): # TM_HEADER_LEN = sum([x[2] for x in PRIMARY_HEADER + TM_SECONDARY_HEADER]) // 8 # TC_HEADER_LEN = sum([x[2] for x in PRIMARY_HEADER + TC_SECONDARY_HEADER]) // 8 +class RawGetterSetter: + + @property + def raw(self): + return bytes(self.bin) + + @raw.setter + def raw(self, rawdata): + self.bin[:] = rawdata + class PHeaderBits(ctypes.BigEndianStructure): _pack_ = 1 @@ -135,7 +148,7 @@ class PHeaderBits(ctypes.BigEndianStructure): P_HEADER_LEN = ctypes.sizeof(PHeaderBits) -class PHeader(ctypes.Union): +class PHeader(ctypes.Union, RawGetterSetter): _pack_ = 1 _fields_ = [ ('bits', PHeaderBits), @@ -151,13 +164,19 @@ class TMHeaderBits(ctypes.BigEndianStructure): TM_HEADER_LEN = ctypes.sizeof(TMHeaderBits) -class TMHeader(ctypes.Union): +class TMHeader(ctypes.Union, RawGetterSetter): _pack_ = 1 _fields_ = [ ('bits', TMHeaderBits), ('bin', ctypes.c_ubyte * TM_HEADER_LEN) ] + def __init__(self): + super(TMHeader, self).__init__() + self.bits.PKT_VERS_NUM = PUS_PKT_VERS_NUM + self.bits.PKT_TYPE = 0 + self.bits.PUS_VERSION = PUS_VERSION + class TCHeaderBits(ctypes.BigEndianStructure): _pack_ = 1 @@ -167,13 +186,19 @@ class TCHeaderBits(ctypes.BigEndianStructure): TC_HEADER_LEN = ctypes.sizeof(TCHeaderBits) -class TCHeader(ctypes.Union): +class TCHeader(ctypes.Union, RawGetterSetter): _pack_ = 1 _fields_ = [ ('bits', TCHeaderBits), ('bin', ctypes.c_ubyte * TC_HEADER_LEN) ] + def __init__(self, *args, **kw): + super(TCHeader, self).__init__(*args, **kw) + self.bits.PKT_VERS_NUM = PUS_PKT_VERS_NUM + self.bits.PKT_TYPE = 1 + self.bits.PUS_VERSION = PUS_VERSION + CUC_OFFSET = TMHeaderBits.CTIME.offset @@ -183,18 +208,6 @@ SPW_PROTOCOL_IDS = { "CCSDS": 0x02 } - -class RawGetterSetter: - - @property - def raw(self): - return bytes(self.bin) - - @raw.setter - def raw(self, rawdata): - self.bin[:] = rawdata - - # RMAP packet structure definitions RMAP_MAX_PKT_LEN = 2 ** 15 @@ -271,13 +284,19 @@ FEEDATA_TRANSFER_HEADER = [ class RMapCommandHeaderBits(ctypes.BigEndianStructure): + _pack_ = 1 + _fields_ = [(label, ctype, bits) for label, ctype, bits in RMAP_COMMAND_HEADER] def __init__(self): raise NotImplementedError('Not available in project CHEOPS') +RMAP_COMMAND_HEADER_LEN = ctypes.sizeof(RMapCommandHeaderBits) # sum([x[2] for x in RMAP_COMMAND_HEADER]) // 8 + + class RMapCommandHeader(ctypes.Union, RawGetterSetter): + def __init__(self): raise NotImplementedError('Not available in project CHEOPS') diff --git a/Ccs/pus_datapool.py b/Ccs/pus_datapool.py index 4f8506843d161d1b496f4893b75b854afc536d9e..ea272c80397a77d922f6267a7799df4ca15cdd49 100644 --- a/Ccs/pus_datapool.py +++ b/Ccs/pus_datapool.py @@ -42,13 +42,15 @@ TMHeader, TCHeader, PHeader, TM_HEADER_LEN, TC_HEADER_LEN, P_HEADER_LEN, PEC_LEN packet_config.TC_HEADER_LEN, packet_config.P_HEADER_LEN, packet_config.PEC_LEN, packet_config.MAX_PKT_LEN, packet_config.timepack, packet_config.timecal] -RMapCommandHeader, RMapReplyWriteHeader, RMapReplyReadHeader = packet_config.RMapCommandHeader, \ - packet_config.RMapReplyWriteHeader, \ - packet_config.RMapReplyReadHeader - -RMAP_COMMAND_HEADER_LEN, RMAP_REPLY_WRITE_HEADER_LEN, RMAP_REPLY_READ_HEADER_LEN, RMAP_PEC_LEN = \ - packet_config.RMAP_COMMAND_HEADER_LEN, packet_config.RMAP_REPLY_WRITE_HEADER_LEN, \ - packet_config.RMAP_REPLY_READ_HEADER_LEN, packet_config.RMAP_PEC_LEN +# RMAP and FEE protocols are only supported in SMILE +if project.endswith('SMILE'): + RMapCommandHeader, RMapReplyWriteHeader, RMapReplyReadHeader = packet_config.RMapCommandHeader, \ + packet_config.RMapReplyWriteHeader, \ + packet_config.RMapReplyReadHeader + + RMAP_COMMAND_HEADER_LEN, RMAP_REPLY_WRITE_HEADER_LEN, RMAP_REPLY_READ_HEADER_LEN, RMAP_PEC_LEN = \ + packet_config.RMAP_COMMAND_HEADER_LEN, packet_config.RMAP_REPLY_WRITE_HEADER_LEN, \ + packet_config.RMAP_REPLY_READ_HEADER_LEN, packet_config.RMAP_PEC_LEN PLM_PKT_PREFIX_TM = packet_config.PLM_PKT_PREFIX_TM PLM_PKT_PREFIX_TC = packet_config.PLM_PKT_PREFIX_TC