diff --git a/Ccs/ccs_function_lib.py b/Ccs/ccs_function_lib.py index 5e169f86b543b7aa7d2a8773ea0e8f898745f7bd..dee5d514f50054ea5b5cbd53903ffdc1fd971e46 100644 --- a/Ccs/ccs_function_lib.py +++ b/Ccs/ccs_function_lib.py @@ -895,6 +895,13 @@ def Tm_header_formatted(tm, detailed=False): return 'APID:{}|SEQ:{}|LEN:{}|TYPE:{}|STYPE:{}|CUC:{}{}'.format( head.APID, head.PKT_SEQ_CNT, head.PKT_LEN, head.SERV_TYPE, head.SERV_SUB_TYPE, mkcucstring(tm), details) + +def spw_header_formatted(spw_header): + buf = spw_header.__class__.__name__ + '\n\n' + buf += spw_header.raw.hex() + return buf + + def get_header_parameters_detailed(pckt): """ Return values of all header elements @@ -904,6 +911,7 @@ def get_header_parameters_detailed(pckt): hparams = [(x[0], getattr(head, x[0])) for x in head._fields_] return hparams + ## # CUC timestring # @@ -4097,7 +4105,7 @@ def extract_spw(stream): if len(pkt_size_stream) < 2: break tla, pid = pkt_size_stream[:2] - logger.debug(pid) + logger.debug('{}, {}'.format(tla, pid)) # if (tla == pc.SPW_DPU_LOGICAL_ADDRESS) and (pid in SPW_PROTOCOL_IDS_R): if pid in SPW_PROTOCOL_IDS_R: diff --git a/Ccs/poolview_sql.py b/Ccs/poolview_sql.py index 8a757bb8cead47e2a8b72f3a6c5f97ef21908db7..b07a33a6838d9b7e9dbebfe5de7a5a51c2b7d1c1 100644 --- a/Ccs/poolview_sql.py +++ b/Ccs/poolview_sql.py @@ -1,3 +1,4 @@ +import io import os import importlib import json @@ -56,34 +57,36 @@ Telemetry = {'PUS': DbTelemetry, 'RMAP': RMapTelemetry, 'FEE': FEEDataTelemetry} class TMPoolView(Gtk.Window): - # (label, data columnt alignment) + # (label, data column alignment) column_labels = {'PUS': [('#', 1), ('TM/TC', 1), ("APID", 1), ("SEQ", 1), ("len-7", 1), ("ST", 1), ("SST", 1), ("Dest ID", 1), ("Time", 1), ("Data", 0)], - 'RMAP': [('#', 1), ('R/W', 1), ('Verify data', 1), ('Reply', 1), ('Key', 1), ('Transaction ID', 1), - ('Address', 1), ('Data Length', 1), ('Raw', 0)], - 'FEE': [('#', 1), ('Type', 1), ('Frame cnt', 1), ('Seq cnt', 1), ('Raw', 0)]} + 'RMAP': [('#', 1), ('TYPE', 1), ('R/W', 1), ('VERIFY', 1), ('REPLY', 1), ('INCR', 1), + ('KEY/STAT', 1), ('TA ID', 1), ('ADDRESS', 1), ('DATALEN', 1), ('RAW', 0)], + 'FEE': [('#', 1), ('TYPE', 1), ('FRAME CNT', 1), ('SEQ', 1), ('RAW', 0)]} tm_columns = {'PUS': {'#': [DbTelemetry.idx, 0, None], 'TM/TC': [DbTelemetry.is_tm, 0, None], "APID": [DbTelemetry.apid, 0, None], "SEQ": [DbTelemetry.seq, 0, None], "len-7": [DbTelemetry.len_7, 0, None], "ST": [DbTelemetry.stc, 0, None], "SST": [DbTelemetry.sst, 0, None], "Dest ID": [DbTelemetry.destID, 0, None], "Time": [DbTelemetry.timestamp, 0, None], "Data": [DbTelemetry.data, 0, None]}, - 'RMAP': {'#': [RMapTelemetry.idx, 0, None], 'R/W': [RMapTelemetry.write, 0, None], - "Verify data": [RMapTelemetry.verify, 0, None], "Reply": [RMapTelemetry.reply, 0, None], - "Key": [RMapTelemetry.keystat, 0, None], "Transaction ID": [RMapTelemetry.taid, 0, None], - "Address": [RMapTelemetry.addr, 0, None], "Data Length": [RMapTelemetry.datalen, 0, None], - "Raw": [RMapTelemetry.raw, 0, None]}, - 'FEE': {'#': [FEEDataTelemetry.idx, 0, None], 'Type': [FEEDataTelemetry.type, 0, None], - "Frame cnt": [FEEDataTelemetry.framecnt, 0, None], - "Seq cnt": [FEEDataTelemetry.seqcnt, 0, None], - "Raw": [FEEDataTelemetry.raw, 0, None]}} + 'RMAP': {'#': [RMapTelemetry.idx, 0, None], 'TYPE': [RMapTelemetry.cmd, 0, None], + 'R/W': [RMapTelemetry.write, 0, None], "VERIFY": [RMapTelemetry.verify, 0, None], + "REPLY": [RMapTelemetry.reply, 0, None], 'INCR': [RMapTelemetry.increment, 0, None], + "KEY": [RMapTelemetry.keystat, 0, None], "TA ID": [RMapTelemetry.taid, 0, None], + "ADDRESS": [RMapTelemetry.addr, 0, None], "DATALEN": [RMapTelemetry.datalen, 0, None], + "RAW": [RMapTelemetry.raw, 0, None]}, + 'FEE': {'#': [FEEDataTelemetry.idx, 0, None], 'TYPE': [FEEDataTelemetry.type, 0, None], + "FRAME CNT": [FEEDataTelemetry.framecnt, 0, None], + "SEQ": [FEEDataTelemetry.seqcnt, 0, None], + "RAW": [FEEDataTelemetry.raw, 0, None]}} sort_order_dict = {0: Gtk.SortType.ASCENDING, 1: Gtk.SortType.ASCENDING, 2: Gtk.SortType.DESCENDING} filter_rules = {} rule_box = None tmtc = {0: 'TM', 1: 'TC'} w_r = {0: 'R', 1: 'W'} + cmd_repl = {0: 'rep', 1: 'cmd'} autoscroll = 1 autoselect = 1 sort_order = Gtk.SortType.ASCENDING @@ -861,9 +864,6 @@ class TMPoolView(Gtk.Window): #print('TIME:::', time.time()-starttime) self.treeview.thaw_child_notify() - - return - def _filter_rows(self, rows): def f_rule(x): @@ -1316,7 +1316,6 @@ class TMPoolView(Gtk.Window): #new_session.close() self.shown_lock.release() - ''' running = True self.shown_lock.acquire() @@ -1352,13 +1351,12 @@ class TMPoolView(Gtk.Window): print(2) self.dbrows_list = [] ''' - return def format_loaded_rows(self, dbrows): ''' This function converts every packet into a readable form - @param dbrows: The rows gotten from SQL query - @return: Same Rows in readable form + @param dbrows: The rows from SQL query + @return: rows in readable form ''' tm_rows = [] @@ -1369,18 +1367,25 @@ class TMPoolView(Gtk.Window): tm_rows.append(tm_row) elif self.decoding_type == 'RMAP': for tm in dbrows: - tm_row = [tm.idx, self.w_r[tm.write], tm.verify, tm.reply, tm.keystat, tm.taid, tm.addr, tm.datalen, - tm.raw.hex()] + tm_row = [tm.idx, self.cmd_repl[tm.cmd], self.w_r[tm.write], int(tm.verify), int(tm.reply), + int(tm.increment), '0x{:02X}'.format(tm.keystat), tm.taid, self._addr_fmt_hex_str(tm.addr), + tm.datalen, tm.raw.hex()] tm_rows.append(tm_row) elif self.decoding_type == 'FEE': for tm in dbrows: tm_row = [tm.idx, tm.type, tm.framecnt, tm.seqcnt, tm.raw.hex()] tm_rows.append(tm_row) else: - self.logger.error('Error in format_loaded_rows_poolviewer, given Format is not valid') - + self.logger.error('Unsupported packet format!') return tm_rows + @staticmethod + def _addr_fmt_hex_str(x): + if x is not None: + return '0x{:08X}'.format(x) + else: + return '' + def tree_selection_changed(self, selection): mode = selection.get_mode() model, treepaths = selection.get_selected_rows() @@ -1647,12 +1652,11 @@ class TMPoolView(Gtk.Window): if self.decoding_type == 'PUS': return Gtk.ListStore('guint', str, 'guint', 'guint', 'guint', 'guint', 'guint', 'guint', str, str) elif self.decoding_type == 'RMAP': - return Gtk.ListStore('guint', str, bool, bool, 'guint', 'guint', 'guint', 'guint', str) + return Gtk.ListStore('guint', str, str, 'guint', 'guint', 'guint', str, 'guint', str, 'guint', str) elif self.decoding_type == 'FEE': return Gtk.ListStore('guint', 'guint', 'guint', 'guint', str) else: self.logger.error('Decoding Type is an unknown value') - return def set_keybinds(self): @@ -2515,10 +2519,15 @@ class TMPoolView(Gtk.Window): @delayed(10) def set_tm_data_view(self, selection=None, event=None, change_columns=False): - if not self.active_pool_info or not self.decoding_type == 'PUS': - self.logger.warning('Cannot decode parameters for RMAP or FEE data packets') + if not self.active_pool_info: + self.logger.warning('No active pool') + return + + if self.decoding_type != 'PUS' and self.rawswitch.get_active(): + self.logger.info('Cannot decode parameters for RMAP or FEE data packets') buf = Gtk.TextBuffer(text='Parameter view not available for non-PUS packets') self.tm_header_view.set_buffer(buf) + self.tm_data_view.get_model().clear() return if change_columns: @@ -2559,7 +2568,6 @@ class TMPoolView(Gtk.Window): self.last_decoded_row = rowidx tm_index = model[treepath[0]][0] - # tm_index = self.active_row new_session = self.session_factory_storage raw = new_session.query( Telemetry[self.decoding_type].raw @@ -2574,7 +2582,6 @@ class TMPoolView(Gtk.Window): new_session.close() return tm = raw[0] - # new_session.commit() new_session.close() self.set_decoder_view(tm) @@ -2582,7 +2589,6 @@ class TMPoolView(Gtk.Window): self.tm_header_view.set_monospace(False) datamodel.clear() try: - # buf = Gtk.TextBuffer(text=self.ccs.Tmformatted(tm, sort_by_name=self.sortswitch.get_active())) if self.UDEF: data = cfl.Tmformatted(tm, textmode=False, UDEF=True) buf = Gtk.TextBuffer(text=cfl.Tm_header_formatted(tm) + '\n{}\n'.format(data[1])) @@ -2594,15 +2600,22 @@ class TMPoolView(Gtk.Window): except Exception as error: buf = Gtk.TextBuffer(text='Error in decoding packet data:\n{}\n'.format(error)) - # print(traceback.format_exc()) else: self.tm_header_view.set_monospace(False) - head = cfl.Tm_header_formatted(tm, detailed=True) - headlen = TC_HEADER_LEN if (tm[0] >> 4 & 1) else TM_HEADER_LEN + + if self.decoding_type != 'PUS': + tmio = io.BytesIO(tm) + headers, _, _ = cfl.extract_spw(tmio) + header = headers[0].raw + headlen = len(header) + head = cfl.spw_header_formatted(headers[0]) + else: + head = cfl.Tm_header_formatted(tm, detailed=True) + headlen = TC_HEADER_LEN if (tm[0] >> 4 & 1) else TM_HEADER_LEN tmsource = tm[headlen:] - byteview = [[str(n + headlen), '{:02X}'.format(i), str(i), ascii(chr(i)).strip("'")] for n, i in enumerate(tmsource[:-PEC_LEN])] + byteview = [[str(n + headlen), '{:02X}'.format(i), str(i), ascii(chr(i)).strip("'")] for n, i in enumerate(tmsource[:])] self._feed_tm_data_view_model(datamodel, byteview) buf = Gtk.TextBuffer(text=head + '\n') @@ -2930,9 +2943,7 @@ class TMPoolView(Gtk.Window): else: # If not PUS open all other possible types but show RMAP for packet_type in Telemetry: - if packet_type == 'PUS': - pass - elif packet_type == 'RMAP': + if packet_type == 'RMAP': model = self.pool_selector.get_model() iter = model.append([self.active_pool_info.pool_name, self.live_signal[self.active_pool_info.live], packet_type]) self.pool_selector.set_active_iter(iter) # Always show the RMAP pool when created diff --git a/Ccs/pus_datapool.py b/Ccs/pus_datapool.py index d6ecda98cd0824bc3a3d1028c82350ed827140da..d61719949a760c2b26408a2b6cbe350811b84237 100644 --- a/Ccs/pus_datapool.py +++ b/Ccs/pus_datapool.py @@ -1079,7 +1079,6 @@ class DatapoolManager: elif self.tc_connections[pool_name]['protocol'].upper() == 'SPW': buf = io.BytesIO(buf) headers, pkts, _ = self.extract_spw(buf) - self.logger.critical(str(headers)+str(pkts)) for header, pkt in zip(headers, pkts): self.process_rmap(header, pkt, pool_name, pool_row=pool_row) else: