From 1f9ce7b42e1e098e2aa48993a6cd7f12700ffc37 Mon Sep 17 00:00:00 2001 From: Marko Mecina <marko.mecina@univie.ac.at> Date: Thu, 8 Sep 2022 11:40:08 +0200 Subject: [PATCH] add look-up dictionary for FEE parameters --- Ccs/ccs_function_lib.py | 3 + Ccs/packet_config_SMILE.py | 152 ++++++++++++++++++++++++------------- 2 files changed, 101 insertions(+), 54 deletions(-) diff --git a/Ccs/ccs_function_lib.py b/Ccs/ccs_function_lib.py index ca4b476..1aa2b70 100644 --- a/Ccs/ccs_function_lib.py +++ b/Ccs/ccs_function_lib.py @@ -56,6 +56,9 @@ project = cfg.get('ccs-database', 'project') project_cfg = PCPREFIX + str(project) packet_config = importlib.import_module(project_cfg) +if project.upper() == 'SMILE': + fee_id = packet_config.fee_id + PUS_VERSION, TMHeader, TCHeader, PHeader, TM_HEADER_LEN, TC_HEADER_LEN, P_HEADER_LEN, PEC_LEN, MAX_PKT_LEN, timepack,\ timecal, calc_timestamp, CUC_OFFSET, CUC_EPOCH, crc = \ [packet_config.PUS_VERSION, packet_config.TMHeader, packet_config.TCHeader, packet_config.PHeader, diff --git a/Ccs/packet_config_SMILE.py b/Ccs/packet_config_SMILE.py index c9a4f5f..9034adf 100644 --- a/Ccs/packet_config_SMILE.py +++ b/Ccs/packet_config_SMILE.py @@ -72,7 +72,6 @@ CUC_EPOCH = datetime.datetime(2018, 1, 1, 0, 0, 0, 0, tzinfo=datetime.timezone.u def timecal(data, string=False): - if not isinstance(data, bytes): try: return data[0] @@ -107,7 +106,6 @@ def timecal(data, string=False): def calc_timestamp(time, sync=None, return_bytes=False): - if isinstance(time, (float, int)): ctime = int(time) ftime = round(time % 1 * timepack[2]) @@ -128,8 +126,9 @@ def calc_timestamp(time, sync=None, return_bytes=False): sync = 0b101 if time[-1].upper() == 'S' else 0 elif isinstance(time, bytes): - if len(time) not in [timepack[1], timepack[1]-timepack[3]]: - raise ValueError('Bytestring size ({}) does not match length specified in format ({})'.format(len(time), timepack[1])) + if len(time) not in [timepack[1], timepack[1] - timepack[3]]: + raise ValueError( + 'Bytestring size ({}) does not match length specified in format ({})'.format(len(time), timepack[1])) ctime = int.from_bytes(time[:4], 'big') ftime = int.from_bytes(time[4:7], 'big') if len(time) == timepack[1]: @@ -411,18 +410,63 @@ class FeeDataTransferHeader(ctypes.Union): # FEE utility functions # ######################### +# look-up table for FEE parameters (DP IDs & internal IDs) (20220908) +fee_id = {'vstart': {'pid': 345544373, 'idx': 1}, + 'vend': {'pid': 345544372, 'idx': 2}, + 'charge_injection_width': {'pid': 345544348, 'idx': 3}, + 'charge_injection_gap': {'pid': 345544347, 'idx': 4}, + 'parallel_toi_period': {'pid': 345544366, 'idx': 5}, + 'parallel_clk_overlap': {'pid': 345544365, 'idx': 6}, + 'n_final_dump': {'pid': 345544363, 'idx': 7}, + 'h_end': {'pid': 345544359, 'idx': 8}, + 'packet_size': {'pid': 345544364, 'idx': 9}, + 'int_period': {'pid': 345544362, 'idx': 10}, + 'readout_node_sel': {'pid': 345544368, 'idx': 11}, + 'h_start': {'pid': 345544360, 'idx': 12}, + 'ccd2_e_pix_threshold': {'pid': 345544327, 'idx': 13}, + 'ccd2_f_pix_threshold': {'pid': 345544328, 'idx': 14}, + 'ccd4_e_pix_threshold': {'pid': 345544334, 'idx': 15}, + 'ccd4_f_pix_threshold': {'pid': 345544335, 'idx': 16}, + 'full_sun_pix_threshold': {'pid': 345544358, 'idx': 17}, + 'ccd1_readout': {'pid': 345544325, 'idx': 18}, + 'ccd2_readout': {'pid': 345544329, 'idx': 19}, + 'charge_injection': {'pid': 345544346, 'idx': 20}, + 'tri_level_clk': {'pid': 345544371, 'idx': 21}, + 'img_clk_dir': {'pid': 345544361, 'idx': 22}, + 'reg_clk_dir': {'pid': 345544369, 'idx': 23}, + 'sync_sel': {'pid': 345544370, 'idx': 24}, + 'digitise_en': {'pid': 345544353, 'idx': 25}, + 'correction_bypass': {'pid': 345544351, 'idx': 26}, + 'dg_en': {'pid': 345544352, 'idx': 27}, + 'clear_full_sun_counters': {'pid': 345544350, 'idx': 28}, + 'edu_wandering_mask_en': {'pid': 345544354, 'idx': 29}, + 'ccd2_vod_config': {'pid': 345544331, 'idx': 30}, + 'ccd4_vod_config': {'pid': 345544337, 'idx': 31}, + 'ccd2_vrd_config': {'pid': 345544332, 'idx': 32}, + 'ccd4_vrd_config': {'pid': 345544338, 'idx': 33}, + 'ccd2_vgd_config': {'pid': 345544330, 'idx': 34}, + 'ccd4_vgd_config': {'pid': 345544336, 'idx': 35}, + 'ccd_vog_config': {'pid': 345544345, 'idx': 36}, + 'event_detection': {'pid': 345544355, 'idx': 37}, + 'clear_error_flag': {'pid': 345544349, 'idx': 38}, + 'event_pkt_limit': {'pid': 345544356, 'idx': 39}, + 'execute_op': {'pid': 345544357, 'idx': 40}, + 'ccd_mode_config': {'pid': 345544342, 'idx': 41}, + 'ccd_mode2_config': {'pid': 345544341, 'idx': 42}, + 'pix_offset': {'pid': 345544367, 'idx': 43}} + # FEE RW registers (SMILE-MSSL-PL-Register_map_v0.20) -FEE_CFG_REG_0 = 0x00000000 -FEE_CFG_REG_1 = 0x00000004 -FEE_CFG_REG_2 = 0x00000008 -FEE_CFG_REG_3 = 0x0000000C -FEE_CFG_REG_4 = 0x00000010 -FEE_CFG_REG_5 = 0x00000014 -FEE_CFG_REG_6 = 0x00000018 # unused -FEE_CFG_REG_7 = 0x0000001C # unused -FEE_CFG_REG_8 = 0x00000020 # unused -FEE_CFG_REG_9 = 0x00000024 # unused +FEE_CFG_REG_0 = 0x00000000 +FEE_CFG_REG_1 = 0x00000004 +FEE_CFG_REG_2 = 0x00000008 +FEE_CFG_REG_3 = 0x0000000C +FEE_CFG_REG_4 = 0x00000010 +FEE_CFG_REG_5 = 0x00000014 +FEE_CFG_REG_6 = 0x00000018 # unused +FEE_CFG_REG_7 = 0x0000001C # unused +FEE_CFG_REG_8 = 0x00000020 # unused +FEE_CFG_REG_9 = 0x00000024 # unused FEE_CFG_REG_10 = 0x00000028 # unused FEE_CFG_REG_11 = 0x0000002C # unused FEE_CFG_REG_12 = 0x00000030 # unused @@ -441,19 +485,18 @@ FEE_CFG_REG_24 = 0x00000060 FEE_CFG_REG_25 = 0x00000064 FEE_CFG_REG_26 = 0x00000068 - # FEE RO registers (SMILE-MSSL-PL-Register_map_v0.20) -FEE_HK_REG_0 = 0x00000700 # reserved -FEE_HK_REG_1 = 0x00000704 # reserved -FEE_HK_REG_2 = 0x00000708 # reserved -FEE_HK_REG_3 = 0x0000070C # reserved -FEE_HK_REG_4 = 0x00000710 -FEE_HK_REG_5 = 0x00000714 -FEE_HK_REG_6 = 0x00000718 -FEE_HK_REG_7 = 0x0000071C -FEE_HK_REG_8 = 0x00000720 -FEE_HK_REG_9 = 0x00000724 +FEE_HK_REG_0 = 0x00000700 # reserved +FEE_HK_REG_1 = 0x00000704 # reserved +FEE_HK_REG_2 = 0x00000708 # reserved +FEE_HK_REG_3 = 0x0000070C # reserved +FEE_HK_REG_4 = 0x00000710 +FEE_HK_REG_5 = 0x00000714 +FEE_HK_REG_6 = 0x00000718 +FEE_HK_REG_7 = 0x0000071C +FEE_HK_REG_8 = 0x00000720 +FEE_HK_REG_9 = 0x00000724 FEE_HK_REG_10 = 0x00000728 FEE_HK_REG_11 = 0x0000072C FEE_HK_REG_12 = 0x00000730 @@ -483,46 +526,45 @@ FEE_HK_REG_35 = 0x0000078C FEE_HK_REG_36 = 0x00000790 FEE_HK_REG_37 = 0x00000794 - # FEE modes # see MSSL-SMILE-SXI-IRD-0001 Draft A.14, req. MSSL-IF-17 # also SMILE-MSSL-PL-Register_map_v0.22, as the IRD does not list all modes -FEE_MODE_ID_ON = 0x0 # the thing is switched on -FEE_MODE_ID_FTP = 0x1 # frame transfer pattern -FEE_MODE_ID_STBY = 0x2 # stand-by-mode -FEE_MODE_ID_FT = 0x3 # frame transfer -FEE_MODE_ID_FF = 0x4 # full frame +FEE_MODE_ID_ON = 0x0 # the thing is switched on +FEE_MODE_ID_FTP = 0x1 # frame transfer pattern +FEE_MODE_ID_STBY = 0x2 # stand-by-mode +FEE_MODE_ID_FT = 0x3 # frame transfer +FEE_MODE_ID_FF = 0x4 # full frame FEE_CMD__ID_IMM_ON = 0x8 # immediate on-mode, this is a command, not a mode -FEE_MODE_ID_FFSIM = 0x9 # full frame simulation simulation -FEE_MODE_ID_EVSIM = 0xA # event detection simulation -FEE_MODE_ID_PTP1 = 0xB # parallel trap pump mode 1 -FEE_MODE_ID_PTP2 = 0xC # parallel trap pump mode 2 -FEE_MODE_ID_STP1 = 0xD # serial trap pump mode 1 -FEE_MODE_ID_STP2 = 0xE # serial trap pump mode 2 +FEE_MODE_ID_FFSIM = 0x9 # full frame simulation simulation +FEE_MODE_ID_EVSIM = 0xA # event detection simulation +FEE_MODE_ID_PTP1 = 0xB # parallel trap pump mode 1 +FEE_MODE_ID_PTP2 = 0xC # parallel trap pump mode 2 +FEE_MODE_ID_STP1 = 0xD # serial trap pump mode 1 +FEE_MODE_ID_STP2 = 0xE # serial trap pump mode 2 -FEE_MODE2_NOBIN = 0x1 # no binning mode -FEE_MODE2_BIN6 = 0x2 # 6x6 binning mode -FEE_MODE2_BIN24 = 0x3 # 24x4 binning mode +FEE_MODE2_NOBIN = 0x1 # no binning mode +FEE_MODE2_BIN6 = 0x2 # 6x6 binning mode +FEE_MODE2_BIN24 = 0x3 # 24x4 binning mode # these identifiy the bits in the readout node selection register -FEE_READOUT_NODE_E2 = 0b0010 -FEE_READOUT_NODE_F2 = 0b0001 -FEE_READOUT_NODE_E4 = 0b1000 -FEE_READOUT_NODE_F4 = 0b0100 +FEE_READOUT_NODE_E2 = 0b0010 +FEE_READOUT_NODE_F2 = 0b0001 +FEE_READOUT_NODE_E4 = 0b1000 +FEE_READOUT_NODE_F4 = 0b0100 # see MSSL-SMILE-SXI-IRD-0001 Draft A.14, req. MSSL-IF-108 -FEE_CCD_SIDE_F = 0x0 # left side -FEE_CCD_SIDE_E = 0x1 # right side -FEE_CCD_INTERLEAVED = 0x2 # F and E inverleaved +FEE_CCD_SIDE_F = 0x0 # left side +FEE_CCD_SIDE_E = 0x1 # right side +FEE_CCD_INTERLEAVED = 0x2 # F and E inverleaved FEE_CCD_ID_2 = 0x0 FEE_CCD_ID_4 = 0x1 -FEE_PKT_TYPE_DATA = 0x0 # any data -FEE_PKT_TYPE_EV_DET = 0x1 # event detection -FEE_PKT_TYPE_HK = 0x2 # housekeeping -FEE_PKT_TYPE_WMASK = 0x3 # wandering mask packet +FEE_PKT_TYPE_DATA = 0x0 # any data +FEE_PKT_TYPE_EV_DET = 0x1 # event detection +FEE_PKT_TYPE_HK = 0x2 # housekeeping +FEE_PKT_TYPE_WMASK = 0x3 # wandering mask packet class RMapCommandWrite(RMapCommandHeader): @@ -669,12 +711,13 @@ class FeeDataTransfer(FeeDataTransferHeader): self.set_type_details() self.set_evt_data() - #@property + # @property def info(self): head = 'HEADER\n' + '\n'.join(['{}:\t{}'.format(key, self.type_details[key]) for key in self.type_details]) if self.evt_data is not None: data = 'DATA\ncolumn: {}, row: {}\n\n{}'.format(self.evt_data['COLUMN'], self.evt_data['ROW'], - str(self.evt_data['IMAGE']).replace('[', ' ').replace(']', ' ')) + str(self.evt_data['IMAGE']).replace('[', ' ').replace(']', + ' ')) else: data = 'DATA\n' + self.data.hex().upper() @@ -696,7 +739,8 @@ class FeeDataTransfer(FeeDataTransferHeader): evtdata.bin[:] = self.data self.evt_data = {"COLUMN": evtdata.bits.column, "ROW": evtdata.bits.row, - "IMAGE": np.array(evtdata.bits.array)[::-1]} # structure according to MSSL-SMILE-SXI-IRD-0001 + "IMAGE": np.array(evtdata.bits.array)[ + ::-1]} # structure according to MSSL-SMILE-SXI-IRD-0001 else: self.evt_data = None -- GitLab