diff --git a/Ccs/ccs_function_lib.py b/Ccs/ccs_function_lib.py index 98dacdb67fe16fe3570b6c1ab6602f7097544f60..b4c06121d66b8627b5c22f0227681619c5a011eb 100644 --- a/Ccs/ccs_function_lib.py +++ b/Ccs/ccs_function_lib.py @@ -2324,7 +2324,11 @@ def Tcsend_common(tc_bytes, apid, st, sst, sleep=0.2, pool_name='LIVE'): ssc = counters[int(str(apid), 0)] # increase the SSC counter counters[int(str(apid), 0)] += 1 - logger.debug('TC(%s,%s) sent to APID %s @ %f' % (st, sst, apid, t)) + #logger.info('TC(%s,%s) sent to APID %s @ %f' % (st, sst, apid, t)) + # More specific Logging format that is compatible with the TST + log_dict = dict([('st', st),('sst', sst),('ssc', ssc),('apid', apid),('timestamp', t)]) + json_string = '{} {}'.format('#SENT TC', json.dumps(log_dict)) + logger.info(json_string) time.sleep(sleep) return apid, ssc, t diff --git a/Ccs/poolview_sql.py b/Ccs/poolview_sql.py index 72c456bc52cc3fc2954d0340034711546f73382f..cdd2be5f0dfaefac56aef4885f8f6c1b2bb8386c 100644 --- a/Ccs/poolview_sql.py +++ b/Ccs/poolview_sql.py @@ -1663,7 +1663,7 @@ class TMPoolView(Gtk.Window): for row in model: if row[0] in self.currently_selected: try: - self.selection.select_path(model.get_path(model.get_iter(row[0] - self.offset - 1))) + self.selection.select_path(model.get_path(model.get_iter(row[0] - self.offset))) except ValueError: pass except TypeError: @@ -2770,8 +2770,7 @@ class TMPoolView(Gtk.Window): # Whole function is now done in Poolmgr def load_pool(self, widget=None, filename=None, brute=False, force_db_import=False, protocol='PUS'): if cfl.is_open('poolmanager', cfl.communication['poolmanager']): - #poolmgr = cfl.dbus_connection('poolmanager', cfl.communication['poolmanager']) - pass + poolmgr = cfl.dbus_connection('poolmanager', cfl.communication['poolmanager']) else: cfl.start_pmgr(True, '--nogui') #path_pm = os.path.join(confignator.get_option('paths', 'ccs'), 'pus_datapool.py') @@ -3140,7 +3139,13 @@ class TMPoolView(Gtk.Window): return def stop_recording(self, widget=None, pool_name=None): - poolmgr = cfl.dbus_connection('poolmanager', cfl.communication['poolmanager']) + if not self.active_pool_info.live: + return False + + if cfl.is_open('poolmanager', cfl.communication['poolmanager']): + poolmgr = cfl.dbus_connection('poolmanager', cfl.communication['poolmanager']) + else: + poolmgr = None if pool_name is None: pool_name = self.active_pool_info.pool_name @@ -3152,7 +3157,8 @@ class TMPoolView(Gtk.Window): if self.active_pool_info.pool_name == pool_name: self.active_pool_info = ActivePoolInfo(pool_name, self.active_pool_info.modification_time, pool_name, False) - poolmgr.Functions('loaded_pools_func', pool_name, self.active_pool_info) + if poolmgr: + poolmgr.Functions('loaded_pools_func', pool_name, self.active_pool_info) else: # Check if the pool name does exist @@ -3165,13 +3171,15 @@ class TMPoolView(Gtk.Window): pinfo_modification_time = int(pinfo[2]) #poolmgr.Functions('loaded_pools_func', pool_name, ActivePoolInfo(pool_name, pinfo_modification_time, pool_name, False), ignore_reply=True) - poolmgr.Functions('loaded_pools_func', pool_name, - ActivePoolInfo(pool_name, pinfo_modification_time, pool_name, False)) + if poolmgr: + poolmgr.Functions('loaded_pools_func', pool_name, + ActivePoolInfo(pool_name, pinfo_modification_time, pool_name, False)) # Update the Poolmanager GUI #poolmgr.Functions('disconnect', pool_name, ignore_reply = True) - poolmgr.Functions('disconnect', pool_name) + if poolmgr: + poolmgr.Functions('disconnect', pool_name) iter = self.pool_selector.get_active_iter() mod = self.pool_selector.get_model() @@ -3181,20 +3189,42 @@ class TMPoolView(Gtk.Window): return - def stop_all_recording(self): + def stop_recording_info(self, pool_name=None): """ - Poolmanager is closed and therefore all "Live" Pools become static pools - Functions is normally called by the poolmanager when it is closing + Connection is closed by the Poolmanager, Informes the Pool Viewer to stop updating or + Poolmanager is closed and therefore all Pools become static pools + Functions is normally called by the poolmanager when it is closing or disconnecting any connections """ + + # if no pool name was specified, Change all connections to static + if not pool_name: + mod = self.pool_selector.get_model() + self.active_pool_info = ActivePoolInfo(self.active_pool_info.filename, + self.active_pool_info.modification_time, + self.active_pool_info.pool_name, False) + #self.active_pool_info.live = False + for row in mod: + mod[row.iter][1] = self.live_signal[self.active_pool_info.live] + self.stop_butt.set_sensitive(False) + # If active pool is live change it to static - if self.active_pool_info.live: - self.active_pool_info = ActivePoolInfo(self.active_pool_info.file_name, self.active_pool_info.modification_time, self.active_pool_info.pool_name, False) + elif self.active_pool_info.pool_name == pool_name: + self.active_pool_info = ActivePoolInfo(self.active_pool_info.filename, self.active_pool_info.modification_time, self.active_pool_info.pool_name, False) + + iter = self.pool_selector.get_active_iter() + mod = self.pool_selector.get_model() + if mod is not None: + mod[iter][1] = self.live_signal[self.active_pool_info.live] + self.stop_butt.set_sensitive(False) + + # Specific Pool is no longer LIVe + else: + mod = self.pool_selector.get_model() + for row in mod: + if mod[row.iter][0] == pool_name: + mod[row.iter][1] = self.live_signal[self.active_pool_info.live] + self.stop_butt.set_sensitive(False) - iter = self.pool_selector.get_active_iter() - mod = self.pool_selector.get_model() - if mod is not None: - mod[iter][1] = self.live_signal[self.active_pool_info.live] - self.stop_butt.set_sensitive(False) return def refresh_treeview(self, pool_name): @@ -3226,17 +3256,16 @@ class TMPoolView(Gtk.Window): #if not self.active_pool_info.live: # return False - - if cfl.is_open('poolmanager', cfl.communication['poolmanager']): - poolmgr = cfl.dbus_connection('poolmanager', cfl.communication['poolmanager']) - else: - return False + #if cfl.is_open('poolmanager', cfl.communication['poolmanager']): + # poolmgr = cfl.dbus_connection('poolmanager', cfl.communication['poolmanager']) + #else: + # return False # Get value of dict connections, with key self.active... and key recording, True to get - pool_connection_recording = poolmgr.Dictionaries('connections', self.active_pool_info.pool_name, 'recording', - True) + #pool_connection_recording = poolmgr.Dictionaries('connections', self.active_pool_info.pool_name, 'recording', + # True) #pool_connection = poolmgr.Dictionaries('connections', self.active_pool_info.pool_name) - if pool_connection_recording: + if self.active_pool_info.live: #if self.pool.connections[self.active_pool_info.pool_name]['recording']: rows = self.get_current_pool_rows() if rows.first() is None: @@ -3252,7 +3281,7 @@ class TMPoolView(Gtk.Window): else: return True else: - self.stop_recording() + #self.stop_recording() return False def dbtest(self, pool_name, sleep=0.1): diff --git a/Ccs/pus_datapool.py b/Ccs/pus_datapool.py index 591c5d3a9605d443397ce67a2272ebdd67378791..0346e7ceb7f5f5fe6f6122c54f4c0b66f1e70935 100644 --- a/Ccs/pus_datapool.py +++ b/Ccs/pus_datapool.py @@ -17,7 +17,7 @@ import DBus_Basic import dbus import dbus.service from dbus.mainloop.glib import DBusGMainLoop - +#cfl.Tcsend_DB('SASW ModHkPeriodCmd', 1, 8, pool_name='new_tmtc_pool') import configparser import confignator import gi @@ -447,6 +447,12 @@ class DatapoolManager: if self.own_gui: self.own_gui.disconnect_incoming_via_code(param=[pool_name, None, 'TM']) # Updates the gui + + #Tell the Poolviewer to stop updating + if cfl.is_open('poolviewer', cfl.communication['poolviewer']): + pv = cfl.dbus_connection('poolviewer', cfl.communication['poolviewer']) + cfl.Functions(pv, 'stop_recording_info', str(pool_name)) + return def connect_tc(self, pool_name, host, port, drop_rx=True, protocol='PUS', timeout=10, is_server=False, options=''): @@ -535,6 +541,12 @@ class DatapoolManager: self.tc_sock = None if self.own_gui: self.own_gui.disconnect_incoming_via_code(param=[pool_name, None, 'TC']) # Updates the gui + + #Tell the Poolviewer to stop updating + if cfl.is_open('poolviewer', cfl.communication['poolviewer']): + pv = cfl.dbus_connection('poolviewer', cfl.communication['poolviewer']) + cfl.Functions(pv, 'stop_recording_info', str(pool_name)) + return # Function will disconnect both TC/TM connection if they have the same name @@ -556,6 +568,10 @@ class DatapoolManager: if self.own_gui: self.own_gui.disconnect_incoming_via_code(param=[pool_name, None, None]) # Updates the gui + #Tell the Poolviewer to stop updating + if cfl.is_open('poolviewer', cfl.communication['poolviewer']): + pv = cfl.dbus_connection('poolviewer', cfl.communication['poolviewer']) + cfl.Functions(pv, 'stop_recording_info', str(pool_name)) return # Is used from the GUI to tell the Poolmanager which connections have been disconnected @@ -572,6 +588,11 @@ class DatapoolManager: self.tc_connections[pool_name]['socket'].close() del self.tc_connections[pool_name] + #Tell the Poolviewer to stop updating + if cfl.is_open('poolviewer', cfl.communication['poolviewer']): + pv = cfl.dbus_connection('poolviewer', cfl.communication['poolviewer']) + cfl.Functions(pv, 'stop_recording_info', str(pool_name)) + return def get_time(self): @@ -1871,17 +1892,16 @@ class DatapoolManager: nr = '' editor.Functions('_to_console_via_socket', 'del(pmgr' + str(nr) + ')') - #if cfl.is_open('poolviewer', cfl.communication['poolviewer']): - # pv = cfl.dbus_connection('poolviewer', cfl.communication['poolviewer']) - # # Ignore_reply = True not recommended, but it is checked here that it is working - # pv.Functions('stop_all_recording', ignore_reply=True) # Tell poolviewer that pool is no longer live - # time.sleep(1) - for pool in self.loaded_pools.keys(): - self.disconnect(self.loaded_pools[pool].pool_name) - print(self.loaded_pools) - print(self.connections) + # Tell the Poolviewer that all Pools are now static if cfl.is_open('poolviewer', cfl.communication['poolviewer']): - self.small_refresh_function() + pv = cfl.dbus_connection('poolviewer', cfl.communication['poolviewer']) + cfl.Functions(pv, 'stop_recording_info') # Tell poolviewer that pool is no longer live + #time.sleep(1) + #for pool in self.loaded_pools.keys(): + # self.disconnect(self.loaded_pools[pool].pool_name) + + #if cfl.is_open('poolviewer', cfl.communication['poolviewer']): + # self.small_refresh_function() try: self.update_all_connections_quit() diff --git a/Tst/prep_test_env.py b/Tst/prep_test_env.py index 3c3f948ca463b1f73bd224a95a599eed48076bf3..53a483b9c02c7e50d415ea781a265fc8a5000eb7 100755 --- a/Tst/prep_test_env.py +++ b/Tst/prep_test_env.py @@ -29,6 +29,7 @@ logger.addHandler(hdlr=console_hdlr) file_hdlr = toolbox.create_file_handler(file=log_file) logger.addHandler(hdlr=file_hdlr) +pool_name = 'new_tmtc_pool' def run(pool_name): logger.info('1) ------------------- Start the simulators -------------------') @@ -73,4 +74,4 @@ def run(pool_name): if __name__ == '__main__': - run(pool_name='new_tmtc_pool') + run(pool_name=pool_name) diff --git a/Tst/progress_view/progress_view.py b/Tst/progress_view/progress_view.py index 343d702cb56a9fd4dfc85e7fa23b4a1fd45c18a2..95257a12898875d019b58136b3bed298d400e362 100644 --- a/Tst/progress_view/progress_view.py +++ b/Tst/progress_view/progress_view.py @@ -208,31 +208,49 @@ class TestProgressView(Gtk.ApplicationWindow): renderer_number.set_property('scale', 2) renderer_number.set_property('single-paragraph-mode', True) column_number = Gtk.TreeViewColumn('Step', renderer_number, text=8) + column_number.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE) + column_number.set_resizable(True) + column_number.set_min_width(50) self.view.append_column(column_number) # column 2 renderer_exec_date = Gtk.CellRendererText() column_exec_date = Gtk.TreeViewColumn('Execution date', renderer_exec_date, text=1, background=7) + column_exec_date.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE) + column_exec_date.set_resizable(True) + column_exec_date.set_min_width(50) self.view.append_column(column_exec_date) # column 3 renderer_type = Gtk.CellRendererText() column_type = Gtk.TreeViewColumn('Type', renderer_type, text=2, background=7) + column_type.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE) + column_type.set_resizable(True) + column_type.set_min_width(50) self.view.append_column(column_type) # column 4 renderer_cmd_version = Gtk.CellRendererText() column_cmd_version = Gtk.TreeViewColumn('Version', renderer_cmd_version, text=3, background=7) + column_cmd_version.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE) + column_cmd_version.set_resizable(True) + column_cmd_version.set_min_width(50) self.view.append_column(column_cmd_version) # column 5 renderer_cmd_status = Gtk.CellRendererText() column_cmd_status = Gtk.TreeViewColumn('Status', renderer_cmd_status, text=4, background=7) + column_cmd_status.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE) + column_cmd_status.set_resizable(True) + column_cmd_status.set_min_width(50) self.view.append_column(column_cmd_status) # column 6 renderer_tcs = Gtk.CellRendererText() column_tcs = Gtk.TreeViewColumn('TC\'s sent', renderer_tcs, text=5, background=7) + column_tcs.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE) + column_tcs.set_resizable(True) + column_tcs.set_min_width(50) self.view.append_column(column_tcs) # column 7 @@ -249,6 +267,9 @@ class TestProgressView(Gtk.ApplicationWindow): renderer_result = Gtk.CellRendererText() renderer_result.set_property('xalign', 0.5) column_result = Gtk.TreeViewColumn('Result', renderer_result, text=6, background=9) + column_result.set_sizing(Gtk.TreeViewColumnSizing.AUTOSIZE) + column_result.set_resizable(True) + column_result.set_min_width(50) # column_result.set_cell_data_func(cell_renderer=renderer_result, func=set_bkgrd_clr, func_data=None) self.view.append_column(column_result) @@ -581,6 +602,31 @@ class TestProgressView(Gtk.ApplicationWindow): row[7] = entry_background return row + def add_detailed_row(self, inner_row_iter, tree_store): + detailed_info=[] + for count, item in enumerate(tree_store[inner_row_iter]): + if count in [0,7,9]: # Stepnumber, colour, colour + detailed_info.append(item) + elif count == 1: + detailed_info.append('Description:') + elif count == 2: + detailed_info.append('Code') + elif count == 4: + if tree_store[inner_row_iter][2] == 'command': + detailed_info.append('Command Code:') + elif tree_store[inner_row_iter][2] == 'verification': + detailed_info.append('Verification Code:') + else: + detailed_info.append('Error Code:') + elif count == 5: + detailed_info.append('Code') + elif count in [3,6,8]: + detailed_info.append('') + + new_row_iter = tree_store.append(inner_row_iter, detailed_info) + new_row = tree_store[new_row_iter] + + def load_json(self, filepath): if not os.path.isfile(filepath): message = 'load_file: no file found for the path {}'.format(filepath) @@ -634,7 +680,8 @@ class TestProgressView(Gtk.ApplicationWindow): for step in test_model.sequences[0].steps: step_number = step.step_number_test_format if step_number not in tree_store_steps: - step_desc = 'Step ' + str(step_number) + # Sequnece number is no longer shown as it is not necessary as long as only one sequnece is supported + step_desc = 'Step ' + str(step_number[:-2]) new_drawer_row = self.build_row_list(step_number=str(step_number), step_desc=step_desc) @@ -718,6 +765,7 @@ class TestProgressView(Gtk.ApplicationWindow): exec_date=item['exec_date']) new_row_iter = tree_store.append(row.iter, new_row_list) new_row = tree_store[new_row_iter] + # add the information if the step was executed or had an exception if 'exception' in item: self.build_row_list(row=new_row, @@ -736,6 +784,9 @@ class TestProgressView(Gtk.ApplicationWindow): tcs_str += telecommand.tc_kind() self.build_row_list(row=new_row, tcs=tcs_str) + + self.add_detailed_row(new_row_iter, tree_store) + self.restore_expanded_states(tree_store) def load_vrc_into_tree_store(self, tree_store, vrc_steps):