diff --git a/Ccs/actions/action1.py b/Ccs/actions/action1.py index 3c18a4437d0fcca050c06b7bfd245f44d426ef34..f278101f41033e92a8c6f39efb247c33d8f35dd9 100644 --- a/Ccs/actions/action1.py +++ b/Ccs/actions/action1.py @@ -1,66 +1,4 @@ -# Prologue -#if (('initialization' not in dir()) or (initialization != "DB")) : -# exec(open('../acceptance_tests/v0.5/TestSetup_DB_05.py').read()) - -import time - - -#ccs.CnCsend('TC_CSR_OTA_S_HTR_N_ILIM 0.3') -#ccs.CnCsend('TC_OTA_S_HTR_N_SET_MODE 0') - -############################## -# allow several heater lines # -############################## - -#ccs.CnCsend('TC_CSR_OTA_S_HTR_N_ON') -ccs.CnCsend('TC_CSR_FEE_S_HTR_N_ON') -#ccs.CnCsend('TC_CSR_FPA_S_HTR_N_ON') -#ccs.CnCsend('TC_CSR_FPA_ANN_HTR_N_ON') - -#################### -# POWER ON THE BEE # -#################### - -# LCL/ARM the BEE power supply -ccs.CnCsend('TC_CSR_PS_ARM') -time.sleep(1) - -# set BEE PSN OVP and Voltage -ccs.CnCsend('TC_CSR_PSN_OVP 32.0') -ccs.CnCsend('TC_CSR_PSN_VSET 31.0') - -# switch ON the BEE power supply [NOMINAL] -ccs.CnCsend('TC_CSR_PSN_ON') -time.sleep(0.5) - -# set heater PS OCP limit -ccs.CnCsend('TC_CSR_PSH_OVP 32.0') -ccs.CnCsend('TC_CSR_PSH_ILIM 2.0') -ccs.CnCsend('TC_CSR_PSH_VSET 31.0') - -# switch ON the BEE Heater Output power supply [NOMINAL] -ccs.CnCsend('TC_CSR_PSH_ON') -time.sleep(0.5) - -# set ILIM of OTA Output to 0.5 (default is 0.2) -ccs.CnCsend('TC_CSR_P28V_OTA_N_ILIM 2.0') -time.sleep(0.25) - -# switch ON the OTA Output (also necessary for heaters) -ccs.CnCsend('TC_CSR_P28V_OTA_N_ON') -time.sleep(1) - - -######################### -# SEND THE BEE ON PULSE # -######################### - -# ARM the SHP pulse -ccs.CnCsend('TC_CSR_SHP_ARM 1') -time.sleep(0.5) - -# activate BEE [NOMINAL] via SHP output -ccs.CnCsend('TC_CSR_BEE_ON_N') - -# DISARM the SHP pulse -# ccs.CnCsend('TC_CSR_SHP_ARM 0',socket_name='TC') +# TC(3,5): SASW EnbHkCmd [KSC50057] +# Enable Periodic Generation of a Housekeeping Parameter Report St +SidNoCal = None # KSP50181 +cfl.Tcsend_DB('SASW EnbHkCmd', SidNoCal, pool_name='LIVE') \ No newline at end of file diff --git a/Ccs/ccs_function_lib.py b/Ccs/ccs_function_lib.py index f9a4a1ba81abf2578ebc9479a2e1b8c1846ca18c..c6387528e046ef6a93e13516c07b44348303c9bf 100644 --- a/Ccs/ccs_function_lib.py +++ b/Ccs/ccs_function_lib.py @@ -2384,6 +2384,7 @@ def get_last_pckt_time(pool_name='LIVE', string=True, dbcon=None): DbTelemetry.idx.desc() ).first() dbcon.close() + if row is not None: packet = row.raw else: diff --git a/Ccs/verification.py b/Ccs/verification.py deleted file mode 100644 index dcb1e7d68330d87c26027ecb9ea50c2390b64900..0000000000000000000000000000000000000000 --- a/Ccs/verification.py +++ /dev/null @@ -1,131 +0,0 @@ -import os -import json -import struct -import threading -import subprocess -import time -import sys -import dbus -import dbus.service -from dbus.mainloop.glib import DBusGMainLoop -import DBus_Basic - -import ccs_function_lib as cfl - -from typing import NamedTuple -import confignator -import gi - -import matplotlib -matplotlib.use('Gtk3Cairo') - - -# from sqlalchemy.sql.expression import func, distinct -from sqlalchemy.orm import load_only -from database.tm_db import DbTelemetryPool, DbTelemetry, RMapTelemetry, FEEDataTelemetry, scoped_session_maker - -import importlib -from confignator import config -check_cfg = config.get_config(file_path=confignator.get_option('config-files', 'ccs')) - - -def type_comparison(comparison_data): - pool_rows = cfl.get_pool_rows("PLM") - - st_list = [] - sst_list = [] - x = 0 - header_counter = 0 - while header_counter < 2: - x += 1 - entry = pool_rows.all()[-x] - - if entry.data.hex() == comparison_data: - - st_list.append(entry.stc) - sst_list.append(entry.sst) - - # print("ST Entry_" + str(x) + ": ", entry.stc) - # print("SST Entry_" + str(x) + ": ", entry.sst) - # print("Timestamp entry_" + str(x) + ": ", entry.timestamp) - header_counter += 1 - - - st_list_reverse = [st_list[1], st_list[0]] - sst_list_reverse = [sst_list[1], sst_list[0]] - - - if sst_list_reverse == [1, 7]: - print("Verification successful") - else: - print("Verification unsuccessful") - - return False - - - -verification_running = True - -print("RUNNING!!") - - -while verification_running == True: - - # while running the script checks the last three entries of the database and keeps them up to date - # to recognize a tc it checks the time - - pool_rows = cfl.get_pool_rows("PLM") - - system_time = time.clock_gettime(0) - - entry_1_data = pool_rows.all()[-1] - # entry_2_data = pool_rows.all()[-2] - # entry_3_data = pool_rows.all()[-3] - - time_1 = entry_1_data.timestamp - # time_2 = entry_2_data.timestamp - # time_3 = entry_3_data.timestamp - - # in this script the number 1 after a variable name always refers to data from the last entry - # number 2 refers to second last entry, number 3 to third last entry and so on - # this part triggers as soon as a tc has arrived in the database - - if time_1 == "": - - first_raw_digits = "" # this string will contain the first bytes of raw data - - telecommand = entry_1_data - telecommand_time = telecommand.timestamp - telecommand_raw = telecommand.raw.hex() - # telecommand_data = telecommand.data.hex() - # Variable to generate new telecommand timestamp, other than telecommand_time - telecommand_verification_timestamp = time.clock_gettime(0) - verification_time = telecommand_verification_timestamp + 2 - - for i in telecommand_raw: - first_raw_digits += str(i) - if len(first_raw_digits) > 7: - break - - # print("After Loop telecommand_first_digits: ", first_raw_digits) - - - while system_time < verification_time and system_time != verification_time: - system_time = time.clock_gettime(0) - - if system_time >= verification_time: - - verification_running = type_comparison(first_raw_digits) - - - - - - - - - - - - - diff --git a/Tst/__init__.py b/Tst/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/Tst/testing_library/testlib/tm.py b/Tst/testing_library/testlib/tm.py index 767c5e8ee54fd5d4209dfaec9ffe720f70402cd0..04d882914f7bbdf6ab48561a41ac3290f2a1a49d 100644 --- a/Tst/testing_library/testlib/tm.py +++ b/Tst/testing_library/testlib/tm.py @@ -61,8 +61,10 @@ import ccs_function_lib as cfl from database import tm_db -from . import idb -from . import tools +# from . import idb +# from . import tools +import tools +import idb # create a logger logger = logging.getLogger(__name__) @@ -112,13 +114,14 @@ def filter_chain(query, pool_name, is_tm=True, st=None, sst=None, apid=None, seq # ToDo database has the CUC timestamp as string. Here the timestamps are floats. # Does this comparison operations work? t_from_string = str(t_from) + 'U' # the timestamps in the database are saved as string - query = query.filter(tm_db.DbTelemetry.timestamp >= t_from_string) # ToDo check if the change from > to >= breaks something! + query = query.filter(tm_db.DbTelemetry.timestamp >= t_from) # ToDo check if the change from > to >= breaks something! + # ToDo: Funktion Cast verwenden um String auf Double zu casten # query = query.filter(tm_db.DbTelemetry.timestamp > t_from) # <- comparison with float if t_to is not None: # ToDo database has the CUC timestamp as string. Here the timestamps are floats. # Does this comparison operations work? t_to_string = str(t_to) + 'U' # the timestamps in the database are saved as string - query = query.filter(tm_db.DbTelemetry.timestamp <= t_to_string) + query = query.filter(tm_db.DbTelemetry.timestamp <= t_to) # ToDo: Funktion Cast verwenden um String auf Double zu casten # query = query.filter(tm_db.DbTelemetry.timestamp <= end) # <- comparison with float if dest_id is not None: query = query.filter(tm_db.DbTelemetry.destID == dest_id) @@ -136,6 +139,7 @@ def highest_cuc_timestamp(tm_list): :rtype: PUS packet || None """ highest = None + timestamp = None if isinstance(tm_list, list) and len(tm_list) > 0: cuc = 0 for i in range(len(tm_list)): @@ -147,7 +151,8 @@ def highest_cuc_timestamp(tm_list): if tstamp > cuc: cuc = tstamp highest = tm_list[i] - return highest + timestamp = tstamp + return highest, timestamp def lowest_cuc_timestamp(pool_name, tm_list): @@ -622,11 +627,13 @@ def get_tm(pool_name, st=None, sst=None, apid=None, ssc=None, duration=5, t_from of decoded telemetry packets or [] """ + # set the time interval t_from, t_to = set_time_interval(pool_name=pool_name, t_from=t_from, t_to=t_to, duration=duration) # for the case that t_to is in future, wait current_cuc = cfl.get_last_pckt_time(pool_name=pool_name, string=False) + if t_to > current_cuc: difference = t_to - current_cuc time.sleep(difference) @@ -979,7 +986,7 @@ def get_tc_acknow(pool_name, t_tc_sent, tc_apid, tc_ssc, tm_st=1, tm_sst=None): :param pool_name: str Name of the TM pool in the database :param t_tc_sent: float - CUC timestamp of the telecommand + CUC timestamp from which search for telecommand should start :param tc_apid: int or str Application process ID of the sent TC. Can be provided as integer or hexadecimal string :param tc_ssc: int @@ -1002,7 +1009,7 @@ def get_tc_acknow(pool_name, t_tc_sent, tc_apid, tc_ssc, tm_st=1, tm_sst=None): # make database query packets = fetch_packets(pool_name=pool_name, st=tm_st, sst=tm_sst, t_from=t_tc_sent - 1) - + # print(packets[1][0][0].CTIME + (packets[1][0][0].FTIME/1000000)) # filter for TM packets with the correct APID and source sequence counter (SSC) in the data field ack_tms = [] for i in range(len(packets)): @@ -1531,6 +1538,68 @@ def get_acquisition(pool_name, tm_21_3): logger.info(meta_data[i]) return result + + +def await_tc_identifier(pool_name, tc_apid, tc_ssc): + """ + Gather the data necessary to identify the newest telecommand and put it in tuple. + :param pool_name: str + Name of the pool for TM/TC packets in the database + :param tc_apid: int or str + APID of the TC + :param tc_ssc: int + Sequence number of TC + :param last_tm_timestamp: float + Timestamp of the latest TM in datapool + :return: tc_identifier: tuple + Tuple with data to identify TC + + """ + + assert isinstance(pool_name, str) + assert isinstance(tc_apid, int) or isinstance(tc_apid, str) + assert isinstance(tc_ssc, int) + + last_tm_timestamp = cfl.get_pool_rows(pool_name)[-1].timestamp + length_last_tm_timestamp = len(last_tm_timestamp) + last_tm_timestamp = last_tm_timestamp[:length_last_tm_timestamp - 1] + last_tm_timestamp = float(last_tm_timestamp) + + tc_identifier = (tc_apid, tc_ssc, last_tm_timestamp) + + return tc_identifier + + +def get_tc_identifier(pool_name, tc_apid, tc_ssc, tc_time): + """ + Gather the data necessary to identify the newest telecommand and put it in tuple. + :param pool_name: str + Name of the pool for TM/TC packets in the database + :param tc_apid: int or str + APID of the TC + :param tc_ssc: int + Sequence number of TC + :param tc_time: float or int + Timestamp of the latest TM in datapool + :return: tc_identifier: tuple + Tuple with data to identify TC + + """ + assert isinstance(pool_name, str) + assert isinstance(tc_apid, int) or isinstance(tc_apid, str) + assert isinstance(tc_ssc, int) + assert isinstance(tc_time, int) or isinstance(tc_time, float) + + tc_time = float(tc_time) + + tc_identifier = (tc_apid, tc_ssc, tc_time) + + return tc_identifier + + + + + if __name__ == '__main__': sys.path.append('.') r=get_tc_acknow('PLM',0.,321,5) diff --git a/Tst/tst/verification.py b/Tst/tst/verification.py new file mode 100644 index 0000000000000000000000000000000000000000..802718b988b39b70ec70cf038e4e5c7a251d4ceb --- /dev/null +++ b/Tst/tst/verification.py @@ -0,0 +1,218 @@ +import os +import json +import struct +import threading +import subprocess +import time +import sys +import dbus +import dbus.service +from dbus.mainloop.glib import DBusGMainLoop +import DBus_Basic + +import ccs_function_lib as cfl + +from typing import NamedTuple +import confignator +import gi + +import matplotlib +matplotlib.use('Gtk3Cairo') + + +# from sqlalchemy.sql.expression import func, distinct +from sqlalchemy.orm import load_only +from database.tm_db import DbTelemetryPool, DbTelemetry, RMapTelemetry, FEEDataTelemetry, scoped_session_maker + +import importlib +from confignator import config +check_cfg = config.get_config(file_path=confignator.get_option('config-files', 'ccs')) + + +def type_comparison(comparison_data, sst_1=1, sst_2=7, st_=1, st_2=1,): + pool_rows = cfl.get_pool_rows("PLM") + + st_list = [] + sst_list = [] + x = 0 + header_counter = 0 + while header_counter < 2: + x += 1 + entry = pool_rows.all()[-x] + + if entry.data.hex() == comparison_data: + + st_list.append(entry.stc) + sst_list.append(entry.sst) + + # print("ST Entry_" + str(x) + ": ", entry.stc) + # print("SST Entry_" + str(x) + ": ", entry.sst) + # print("Timestamp entry_" + str(x) + ": ", entry.timestamp) + header_counter += 1 + + + st_list_reverse = [st_list[1], st_list[0]] + sst_list_reverse = [sst_list[1], sst_list[0]] + + + if sst_list_reverse == [sst_1, sst_2]: + print("Verification successful") + else: + print("Verification unsuccessful") + + return False + + +def Verification( st_1=1, sst_1=1, st_2=1, sst_2=7, pool_name="PLM", verification_duration=2): + verification_running = True + + print("RUNNING!!") + + print("Variables: ") + print(st_1) + print(sst_1) + print(st_2) + print(sst_2) + print(pool_name) + print(verification_duration) + + + while verification_running == True: + + # while running the script checks the last three entries of the database and keeps them up to date + # to recognize a tc it checks the time + + pool_rows = cfl.get_pool_rows(pool_name) + + system_time = time.clock_gettime(0) + + entry_1_data = pool_rows.all()[-1] + # entry_2_data = pool_rows.all()[-2] + # entry_3_data = pool_rows.all()[-3] + + time_1 = entry_1_data.timestamp + # time_2 = entry_2_data.timestamp + # time_3 = entry_3_data.timestamp + + # in this script the number 1 after a variable name always refers to data from the last entry + # number 2 refers to second last entry, number 3 to third last entry and so on + # this part triggers as soon as a tc has arrived in the database + + if time_1 == "": + + first_raw_digits = "" # this string will contain the first bytes of raw data + + telecommand = entry_1_data + telecommand_time = telecommand.timestamp + telecommand_raw = telecommand.raw.hex() + # telecommand_data = telecommand.data.hex() + # Variable to generate new telecommand timestamp, other than telecommand_time + telecommand_verification_timestamp = time.clock_gettime(0) + verification_time = telecommand_verification_timestamp + verification_duration + + for i in telecommand_raw: + first_raw_digits += str(i) + if len(first_raw_digits) > 7: + break + + # print("After Loop telecommand_first_digits: ", first_raw_digits) + + + while system_time < verification_time and system_time != verification_time: + system_time = time.clock_gettime(0) + + if system_time >= verification_time: + + verification_running = type_comparison(first_raw_digits, sst_1, sst_2) + + + +def verification_template(verification_descr, pool_name="LIVE", ST_1=None, ST_2=None, SST_1=None, SST_2=None, time=2, + comment="", preamble="Ver.verification"): + if comment: + commentstr = "# TC({}, {}): {} [{}]\n# {}\n".format(*cmd[3:], cmd[1], cmd[0], cmd[2]) + newline = "\n" + else: + commentstr = "" + newline = "" + + exe = "{}('{}', ST_1={}, SST_1={}, ST_2={}, SST_2={}, pool_name='{}', time={})".format(preamble, verification_descr, + ST_1, SST_1, ST_2, SST_2, + pool_name, time) + return commentstr + exe + newline + + +# def new_verification_template(verification_descr, pool_name="LIVE", comment="", preamble=): + + +# reads in verification as soon as exec button in step widget is pressed +def read_verification(verification_string): + + + first_split = verification_string.split("(") + + + second_split = "" + for i in first_split[1]: + if i != ")": + second_split += i + + + third_split = second_split.split(",") + + + st_1 = third_split[1] + sst_1 = third_split[2] + st_2 = third_split[3] + sst_2 = third_split[4] + pool_name = third_split[5] + time_duration = third_split[6] + + + st_1_value = st_1.split("=")[1] + sst_1_value = sst_1.split("=")[1] + st_2_value = st_2.split("=")[1] + sst_2_value = sst_2.split("=")[1] + pool_name_value = pool_name.split("=")[1] + time_duration_value = time_duration.split("=")[1] + + st_sst_list = [st_1_value, sst_1_value, st_2_value, sst_2_value] + + + + value_list = [] + + for element in st_sst_list: + # print(element) + if element == "None": + element = None + else: + try: + element = int(element) + except: + raise AssertionError("ST and SST values have to be None or int") + + value_list.append(element) + + + if type(pool_name_value) == str: + # print("if pool name: ", pool_name_value) + value_list.append(pool_name_value) + else: + raise AssertionError("Pool Name needs to be str") + + # time_duration_value_checker = isinstance(time_duration_value, int) + # print("Time instance: ", time_duration_value_checker) + try: + time_duration_value = int(time_duration_value) + value_list.append(time_duration_value) + except: + raise AssertionError("Time has to be int") + + Verification(value_list[0], value_list[1], value_list[2], value_list[3], value_list[4], value_list[5]) + + + + + + diff --git a/Tst/tst/verification_tab.py b/Tst/tst/verification_tab.py index f62beabd578f8d66ab1015aee54e6e4fe42dd0e0..3d596912e442085294dc566ef23754b9af3aee69 100644 --- a/Tst/tst/verification_tab.py +++ b/Tst/tst/verification_tab.py @@ -12,11 +12,25 @@ sys.path.append(confignator.get_option('paths', 'ccs')) import ccs_function_lib as cfl import s2k_partypes as s2k +import time +import sys +import dbus +import dbus.service +from dbus.mainloop.glib import DBusGMainLoop +import DBus_Basic + + +from typing import NamedTuple +import confignator +import gi + + +import verification as ver verification_list = [ - ("Verification", 1, 7), - ("Other Verification", 0, 0) + ("Get TC Verification", 1, 7), + ("Await TC Verification", 1, 7) ] @@ -59,11 +73,23 @@ class VerificationTable(Gtk.Grid): # setting up layout self.scrollable_treelist = Gtk.ScrolledWindow() self.scrollable_treelist.set_vexpand(True) + self.scrollable_treelist.set_hexpand(True) self.grid.attach(self.scrollable_treelist, 0, 0, 8, 10) self.scrollable_treelist.add(self.treeview) + # handle selection + self.selected_row = self.treeview.get_selection() + self.selected_row.connect("changed", self.item_selected) + + + # Set up Drag and Drop + self.treeview.drag_source_set(Gdk.ModifierType.BUTTON1_MASK, [], Gdk.DragAction.COPY) + self.treeview.drag_source_set_target_list(None) + self.treeview.drag_source_add_text_targets() + self.treeview.connect("drag-data-get", self.on_drag_data_get) + self.treeview.connect("drag-begin", self.on_drag_begin) self.show_all() @@ -74,4 +100,168 @@ class VerificationTable(Gtk.Grid): ): return True else: - return model[iter][2] == self.current_filter_verification \ No newline at end of file + return model[iter][2] == self.current_filter_verification + + + + + + + # drag and drop + + def item_selected(self, selection): + model, row = selection.get_selected() + if row is not None: + + global verification_name + global ST + global SST + + verification_name = model[row][0] + ST = model[row][1] + SST = model[row][2] + global selected_data_for_drag_drop + + + selected_data_for_drag_drop = ver.verification_template("Verification_1") + # str(verification_name) + "\n ST = " + str(ST) + "\n SST = " + str(SST) + "\n Time = 2" + # selected_data_for_drag_drop = "{} ({}, {})".format((name, ST, SST)) + + else: + pass + + + + def on_drag_data_get(self, treeview, drag_context, selection_data, info, time, *args): + treeselection = treeview.get_selection() + model, my_iter = treeselection.get_selected() + global selected_data_for_drag_drop + selection_data.set_text(selected_data_for_drag_drop, -1) + + + + def on_drag_begin(self, *args): + pass + + + + + + + + + + +""" + +def make_verification_template(pool_name="LIVE", preamble="verification.Verification", options="", comment=False): + + + prcfg = "" + + return + + + def verification(self): + + # if st_variable == 1 and sst_variable == 7: + + pool_rows = cfl.get_pool_rows("PLM") + + system_time = time.clock_gettime(0) + + entry_1_data = pool_rows.all()[-1] + + time_1 = entry_1_data.timestamp + + if time_1 == "": + + first_raw_digits = "" # this string will contain the first bytes of raw data + + telecommand = entry_1_data + telecommand_time = telecommand.timestamp + telecommand_raw = telecommand.raw.hex() + + # Variable to generate new telecommand timestamp, other than telecommand_time + telecommand_verification_timestamp = time.clock_gettime(0) + verification_time = telecommand_verification_timestamp + 2 + + for i in telecommand_raw: + first_raw_digits += str(i) + if len(first_raw_digits) > 7: + break + + # print("After Loop telecommand_first_digits: ", first_raw_digits) + + while system_time < verification_time and system_time != verification_time: + system_time = time.clock_gettime(0) + + if system_time >= verification_time: + verification_running = self.type_comparison(first_raw_digits) + + + + + + def type_comparison(comparison_data): + pool_rows = cfl.get_pool_rows("PLM") + + st_list = [] + sst_list = [] + x = 0 + header_counter = 0 + while header_counter < 2: + x += 1 + entry = pool_rows.all()[-x] + + if entry.data.hex() == comparison_data: + st_list.append(entry.stc) + sst_list.append(entry.sst) + + # print("ST Entry_" + str(x) + ": ", entry.stc) + # print("SST Entry_" + str(x) + ": ", entry.sst) + # print("Timestamp entry_" + str(x) + ": ", entry.timestamp) + header_counter += 1 + + + st_list_reverse = [st_list[1], st_list[0]] + sst_list_reverse = [sst_list[1], sst_list[0]] + + if sst_list_reverse == [1, 7]: + print("Verification successful") + else: + print("Verification unsuccessful") + + return False + + + def get_drop_verification(self): + global verification_name + global ST + global SST + + return + + def verification_table(self, name, subtype, subsubtype): + +""" + + + + + + + + + + + + + + + + + + + + diff --git a/Tst/tst/view.py b/Tst/tst/view.py index 8bf2dcb2064bd14b9bb23062845b2b9493d61493..7f5fe4bb229b3bbf95244730b2865c5b6d7dc618 100644 --- a/Tst/tst/view.py +++ b/Tst/tst/view.py @@ -16,6 +16,7 @@ import dnd_data_parser import toolbox import cairo import sys +import verification import confignator ccs_path = confignator.get_option('paths', 'ccs') @@ -1311,12 +1312,23 @@ class StepWidget(Gtk.EventBox): return commands = str(self.get_commands_from_widget()) + commands2 = str(self.get_verification_from_widget()) + if len(commands) == 0: return + # if len(commands2) == 0: + # return + # print("Commands: ", commands) + # print("Verification: ", commands2) + # print(type(commands2)) + + # verification.read_verification(commands2) + ed = cfl.dbus_connection('editor') cfl.Functions(ed, '_to_console_via_socket', commands) + # cfl.Functions(ed, '_to_console_via_socket', commands2) def on_toggle_detail(self, toolbutton, *args): """