From 66c5a994a2cb782aed38a34ec47e9e9b882b3b7a Mon Sep 17 00:00:00 2001
From: Marko Mecina <marko.mecina@univie.ac.at>
Date: Thu, 5 May 2022 16:59:30 +0200
Subject: [PATCH] rearrange content of TST MIB inspection tab

---
 Ccs/ccs_function_lib.py  |  59 +++++++++++-----
 Tst/tst/data_pool_tab.py |  19 ++---
 Tst/tst/tc_management.py | 126 +++++++++++----------------------
 Tst/tst/tm_management.py | 148 +++++++++++++++++++--------------------
 4 files changed, 158 insertions(+), 194 deletions(-)

diff --git a/Ccs/ccs_function_lib.py b/Ccs/ccs_function_lib.py
index cb982c8..38fdff7 100644
--- a/Ccs/ccs_function_lib.py
+++ b/Ccs/ccs_function_lib.py
@@ -2660,12 +2660,16 @@ def get_tc_list(ccf_descr=None):
 
     if ccf_descr is None:
         cmds = scoped_session_idb.execute('SELECT ccf_cname, ccf_descr, ccf_descr2, ccf_type, ccf_stype, ccf_npars, '
-                                          'cpc_descr, cpc_dispfmt, cdf_eltype, cpc_pname, cdf_value, cpc_inter, cpc_radix FROM ccf LEFT JOIN cdf ON cdf.cdf_cname=ccf.ccf_cname '
-                                          'LEFT JOIN cpc ON cpc.cpc_pname=cdf.cdf_pname').fetchall()
+                                          'cpc_descr, cpc_dispfmt, cdf_eltype, cpc_pname, cdf_value, cpc_inter, '
+                                          'cpc_radix FROM ccf LEFT JOIN cdf ON cdf.cdf_cname=ccf.ccf_cname '
+                                          'LEFT JOIN cpc ON cpc.cpc_pname=cdf.cdf_pname '
+                                          'ORDER BY ccf_type, ccf_stype, ccf_cname').fetchall()
     else:
         cmds = scoped_session_idb.execute('SELECT ccf_cname, ccf_descr, ccf_descr2, ccf_type, ccf_stype, ccf_npars, '
-                                          'cpc_descr, cpc_dispfmt, cdf_eltype, cpc_pname, cdf_value, cpc_inter, cpc_radix FROM ccf LEFT JOIN cdf ON cdf.cdf_cname=ccf.ccf_cname '
-                                          'LEFT JOIN cpc ON cpc.cpc_pname=cdf.cdf_pname WHERE ccf_descr="{}"'.format(ccf_descr)).fetchall()
+                                          'cpc_descr, cpc_dispfmt, cdf_eltype, cpc_pname, cdf_value, cpc_inter, '
+                                          'cpc_radix FROM ccf LEFT JOIN cdf ON cdf.cdf_cname=ccf.ccf_cname '
+                                          'LEFT JOIN cpc ON cpc.cpc_pname=cdf.cdf_pname '
+                                          'WHERE ccf_descr="{}"'.format(ccf_descr)).fetchall()
 
     scoped_session_idb.close()
 
@@ -2676,6 +2680,7 @@ def get_tc_list(ccf_descr=None):
 
     return cmd_dict
 
+
 def get_tc_calibration_and_parameters(ccf_descr=None):
 
     if ccf_descr is None:
@@ -2685,7 +2690,8 @@ def get_tc_calibration_and_parameters(ccf_descr=None):
                                                   'LEFT JOIN cpc ON cdf.cdf_pname=cpc.cpc_pname '
                                                   'LEFT JOIN prv ON cpc.cpc_prfref=prv.prv_numbr '
                                                   'LEFT JOIN pas ON cpc.cpc_pafref=pas.pas_numbr '
-                                                  'WHERE cpc_descr IS NOT NULL').fetchall()
+                                                  'WHERE cpc_descr IS NOT NULL ORDER BY ccf_type, ccf_stype, ccf_cname, '
+                                                  'cdf_bit, pas_alval').fetchall()
 
     else:
         calibrations = scoped_session_idb.execute('SELECT ccf_cname, ccf_descr, cdf_pname, cpc_descr, cpc_categ, cpc_ptc, '
@@ -2694,8 +2700,8 @@ def get_tc_calibration_and_parameters(ccf_descr=None):
                                                   'LEFT JOIN cpc ON cdf.cdf_pname=cpc.cpc_pname '
                                                   'LEFT JOIN prv ON cpc.cpc_prfref=prv.prv_numbr '
                                                   'LEFT JOIN pas ON cpc.cpc_pafref=pas.pas_numbr '
-                                                  'WHERE cpc_descr IS NOT NULL '
-                                                  'WHERE ccf_descr="{}"'.format(ccf_descr)).fetchall()
+                                                  'WHERE cpc_descr IS NOT NULL AND '
+                                                  'ccf_descr="{}"'.format(ccf_descr)).fetchall()
 
     scoped_session_idb.close()
 
@@ -2704,9 +2710,30 @@ def get_tc_calibration_and_parameters(ccf_descr=None):
     for row in calibrations:
         calibrations_dict.setdefault(row[0:5], []).append(row[5:11])
 
-
     return calibrations_dict
 
+
+def get_tm_parameter_list(st, sst, apid, pi1val):
+    que = 'SELECT pid_spid, pid_tpsd FROM pid WHERE pid_type={} AND pid_stype={} AND pid_apid={} AND pid_pi1_val={}'.format(st, sst, apid, pi1val)
+    spid, tpsd = scoped_session_idb.execute(que).fetchall()[0]
+
+    if tpsd == -1:
+        que = 'SELECT plf_name, pcf_descr, plf_offby, pcf_ptc, pcf_pfc FROM plf LEFT JOIN pcf ON plf_name=pcf_name WHERE plf_spid={} ORDER BY plf_offby, plf_offbi'.format(spid)
+    else:
+        que = 'SELECT vpd_name, pcf_descr, NULL, pcf_ptc, pcf_pfc FROM vpd LEFT JOIN pcf ON vpd_name=pcf_name WHERE vpd_tpsd={} ORDER BY vpd_pos'.format(tpsd)
+
+    res = scoped_session_idb.execute(que).fetchall()
+
+    return res
+
+
+def get_tm_parameter_info(pname):
+    que = 'SELECT ocp_lvalu, ocp_hvalu, ocp_type, txp_from, txp_altxt FROM pcf LEFT JOIN ocp ON pcf_name=ocp_name LEFT JOIN txp ON pcf_curtx=txp_numbr WHERE pcf_name="{}" ORDER BY txp_from, ocp_pos'.format(pname)
+    res = scoped_session_idb.execute(que).fetchall()
+
+    return res
+
+
 def get_tm_id(pcf_descr=None):
     if pcf_descr is None:
         tms = scoped_session_idb.execute('SELECT pid_type, pid_stype, pid_apid, pid_pi1_val, pid_descr, pid_tpsd, '
@@ -2722,7 +2749,8 @@ def get_tm_id(pcf_descr=None):
                                          'LEFT JOIN txf '
                                          'ON pcf_curtx = txf_numbr '
                                          'LEFT JOIN txp '
-                                         'ON txf_numbr = txp.txp_numbr').fetchall()
+                                         'ON txf_numbr = txp.txp_numbr '
+                                         'ORDER BY pid_type, pid_stype, pid_apid, pid_pi1_val').fetchall()
 
     else:
         tms = scoped_session_idb.execute('SELECT pid_type, pid_stype, pid_apid, pid_pi1_val, pid_descr , pid_tpsd, '
@@ -2748,20 +2776,17 @@ def get_tm_id(pcf_descr=None):
     for row in tms:
         tms_dict.setdefault(row[0:5], []).append(row[5:])
 
-
     return tms_dict
 
-def get_data_pool_items(pcf_descr = None):
+
+def get_data_pool_items(pcf_descr=None):
     if pcf_descr is None:
         data_pool = scoped_session_idb.execute('SELECT pcf_pid, pcf_descr, pcf_ptc, pcf_pfc '
-                                         'FROM pcf '
-                                        'WHERE pcf_pid <> 0').fetchall()
+                                               'FROM pcf WHERE pcf_pid <> 0').fetchall()
 
     else:
         data_pool = scoped_session_idb.execute('SELECT pcf_pid, pcf_descr, pcf_ptc, pcf_pfc '
-                                         'FROM pcf '
-                                        'WHERE pcf_pid <> 0 '
-                                        'WHERE pcf_descr="{}"'.format(pcf_descr)).fetchall()
+                                               'FROM pcf WHERE pcf_pid <> 0 AND pcf_descr="{}"'.format(pcf_descr)).fetchall()
 
     scoped_session_idb.close()
 
@@ -2770,11 +2795,9 @@ def get_data_pool_items(pcf_descr = None):
     for row in data_pool:
         data_pool_dict.setdefault(row[0:4], []).append(row[5:])
 
-
     return data_pool_dict
 
 
-
 def get_dp_items(source='mib'):
     fmt = {3: {4: 'UINT8', 12: 'UINT16', 14: 'UINT32'}, 4: {4: 'INT8', 12: 'INT16', 14: 'INT32'}, 5: {1: 'FLOAT'}, 9: {18: 'CUC'}, 7: {1: '1OCT'}}
 
diff --git a/Tst/tst/data_pool_tab.py b/Tst/tst/data_pool_tab.py
index 4e36de9..e6a250a 100644
--- a/Tst/tst/data_pool_tab.py
+++ b/Tst/tst/data_pool_tab.py
@@ -5,11 +5,11 @@ gi.require_version("GtkSource", "3.0")
 from gi.repository import Gtk, Gdk, GtkSource
 import confignator
 import sys
+
 sys.path.append(confignator.get_option('paths', 'ccs'))
 import ccs_function_lib as cfl
 import s2k_partypes as s2k
 
-
 dictionary_of_data_pool = cfl.get_data_pool_items()
 list_of_data_pool = list(dictionary_of_data_pool.keys())
 
@@ -17,6 +17,7 @@ data_pool_sublist = []
 
 pid_list = []
 
+
 def get_data_pool_sublist():
     for counter in list_of_data_pool:
         pcf_pid = str(counter[0])
@@ -36,9 +37,8 @@ def get_data_pool_sublist():
 
     return data_pool_sublist, pid_list
 
-data_pool_sublist, pid_list = get_data_pool_sublist()
-
 
+data_pool_sublist, pid_list = get_data_pool_sublist()
 
 
 class DataPoolTable(Gtk.Grid):
@@ -79,9 +79,7 @@ class DataPoolTable(Gtk.Grid):
 
         # creating the treeview, making it use the filter a model, adding columns
         self.treeview = Gtk.TreeView.new_with_model(Gtk.TreeModelSort(self.data_pool_filter))
-        for i, column_title in enumerate(
-            ["pcf_pid", "pcf_descr", "datatype"]
-        ):
+        for i, column_title in enumerate(["PID", "DESCR", "DATATYPE"]):
             renderer = Gtk.CellRendererText()
             column = Gtk.TreeViewColumn(column_title, renderer, text=i)
             column.set_sort_column_id(i)
@@ -107,7 +105,6 @@ class DataPoolTable(Gtk.Grid):
         self.treeview.connect("drag-data-get", self.on_drag_data_get)
         self.treeview.connect("drag-begin", self.on_drag_begin)
 
-
         self.show_all()
 
     def on_pid_combo_changed(self, combo):
@@ -119,12 +116,10 @@ class DataPoolTable(Gtk.Grid):
 
         self.data_pool_filter.refilter()
 
-
     def on_clear_button_clicked(self, widget):
         self.current_filter_data_pool = None
         self.data_pool_filter.refilter()
 
-
     def item_selected(self, selection):
         model, row = selection.get_selected()
         if row is not None:
@@ -133,8 +128,6 @@ class DataPoolTable(Gtk.Grid):
         else:
             pass
 
-
-
     def data_pool_filter_func(self, model, iter, data):
 
         if (
@@ -145,14 +138,10 @@ class DataPoolTable(Gtk.Grid):
         else:
             return model[iter][0] == self.current_filter_data_pool
 
-
-
-
     def on_drag_data_get(self, treeview, drag_context, selection_data, info, time, *args):
         treeselection = treeview.get_selection()
         model, my_iter = treeselection.get_selected()
         selection_data.set_text(pid, -1)
 
-
     def on_drag_begin(self, *args):
         pass
diff --git a/Tst/tst/tc_management.py b/Tst/tst/tc_management.py
index 2dee664..ca5b448 100644
--- a/Tst/tst/tc_management.py
+++ b/Tst/tst/tc_management.py
@@ -1,20 +1,16 @@
 #!/usr/bin/env python3
 import gi
 
-
 gi.require_version("Gtk", "3.0")
 gi.require_version("GtkSource", "3.0")
 from gi.repository import Gtk, Gdk, GtkSource
 import confignator
 import sys
+
 sys.path.append(confignator.get_option('paths', 'ccs'))
 import ccs_function_lib as cfl
 import s2k_partypes as s2k
 
-
-
-
-
 tc_type = None
 
 dictionary_of_commands = cfl.get_tc_list()
@@ -26,8 +22,6 @@ subtype_list = []
 descr_list = []
 calibrations_list = []
 
-
-
 for command in read_in_list_of_commands:
     command = list(command)
     del command[0]
@@ -39,33 +33,28 @@ for command in read_in_list_of_commands:
     if command[0] not in type_list:
         type_list.append(command[0])
 
-
 type_list.sort()
 subtype_list.sort()
 
-
-
-
-
 dictionary_of_variables = cfl.get_tc_calibration_and_parameters()
 
 
 def get_cpc_descr(tc_type):
-
-
     # read_in_list_of_variables = list(dictionary_of_variables.keys())
 
     cpc_descr = []
 
     for key in dictionary_of_variables:
         if tc_type in key:
-            cpc_descr.append(key[3])
-    cpc_descr = [[list_element] for list_element in cpc_descr]
+            ptc, pfc = dictionary_of_variables[key][0][:2]
+            cpc_descr.append([*key[2:4], s2k.ptt[ptc][pfc]])
+    # cpc_descr = [[list_element] for list_element in cpc_descr]
     return cpc_descr
 
 
 def get_calibrations(tc_type, cpc_descr):
     treeview_tuple_list = []
+    alvals = []
     for key in dictionary_of_variables:
         if tc_type in key and cpc_descr in key:
             for counter in dictionary_of_variables[key]:
@@ -77,41 +66,43 @@ def get_calibrations(tc_type, cpc_descr):
                 pas_altxt = counter[4]
                 pas_alval = counter[5]
 
-                if cpc_ptc == None:
+                if pas_alval is not None:
+                    if pas_alval in alvals:
+                        continue
+                    prv_minval = pas_altxt
+                    alvals.append(pas_alval)
+
+                if cpc_ptc is None:
                     cpc_ptc = "None"
-                if cpc_pfc == None:
+                if cpc_pfc is None:
                     cpc_pfc = "None"
-                if prv_minval == None:
+                if prv_minval is None:
                     prv_minval = "None"
-                if prv_maxval == None:
+                if prv_maxval is None:
                     prv_maxval = "None"
-                if pas_altxt == None:
+                if pas_altxt is None:
                     pas_altxt = "None"
-                if pas_alval == None:
+                if pas_alval is None:
                     pas_alval = "None"
 
-
                 if cpc_ptc == "None":
                     data_type = "None"
-                    pass
                 else:
                     data_type = s2k.ptt[cpc_ptc][cpc_pfc]
 
-                treeview_tuple = tuple([prv_minval, prv_maxval, pas_altxt, pas_alval, data_type])
+                treeview_tuple = tuple([prv_minval, prv_maxval, pas_altxt, pas_alval])
                 treeview_tuple_list.append(treeview_tuple)
     return treeview_tuple_list
 
 
-
-
-
 class TcTable(Gtk.Grid):
     def __init__(self, *args, **kwargs):
         super().__init__(*args, **kwargs)
 
-        self.set_size_request(500,500)
+        self.set_size_request(500, 500)
         # self.set_orientation(Gtk.Orientation.VERTICAL)
         # self.grid = Gtk.Grid
+        self.set_row_spacing(5)
 
         self.telecommand_liststore = Gtk.ListStore(int, int, str, str)
         for telecommand_ref in list_of_commands:
@@ -130,6 +121,7 @@ class TcTable(Gtk.Grid):
         # self.current_filter_type = None
 
         self.type_combo = Gtk.ComboBox.new_with_model(self.type_liststore)
+        self.type_combo.set_tooltip_text("Service TYPE filter")
         self.type_combo.connect("changed", self.on_type_combo_changed)
         renderer_text = Gtk.CellRendererText()
         self.type_combo.pack_start(renderer_text, True)
@@ -138,15 +130,11 @@ class TcTable(Gtk.Grid):
 
         self.clear_button = Gtk.Button(label="Clear")
         self.clear_button.connect("clicked", self.on_clear_button_clicked)
-        self.attach_next_to(
-            self.clear_button, self.type_combo, Gtk.PositionType.RIGHT, 1, 1
-        )
+        self.attach_next_to(self.clear_button, self.type_combo, Gtk.PositionType.RIGHT, 1, 1)
 
         # creating the treeview, making it use the filter a model, adding columns
         self.treeview = Gtk.TreeView.new_with_model(Gtk.TreeModelSort(self.telecommand_filter))
-        for i, column_title in enumerate(
-            ["#TYPE", "SUBTYPE", "DESCR", "LONGDESCR"]
-        ):
+        for i, column_title in enumerate(["TYPE", "SUBTYPE", "DESCR", "LONGDESCR"]):
             renderer = Gtk.CellRendererText()
             column = Gtk.TreeViewColumn(column_title, renderer, text=i)
             column.set_sort_column_id(i)
@@ -190,10 +178,10 @@ class TcTable(Gtk.Grid):
 
         self.telecommand_filter.refilter()
 
-
     def on_clear_button_clicked(self, widget):
         self.current_filter_telecommand = None
         self.telecommand_filter.refilter()
+        self.type_combo.set_active_id(None)
 
     def item_selected(self, selection):
         model, row = selection.get_selected()
@@ -215,10 +203,7 @@ class TcTable(Gtk.Grid):
 
     def telecommand_filter_func(self, model, iter, data):
 
-        if (
-                self.current_filter_telecommand is None
-                or self.current_filter_telecommand == "None"
-        ):
+        if self.current_filter_telecommand is None or self.current_filter_telecommand == "None":
             return True
         else:
             return model[iter][0] == self.current_filter_telecommand
@@ -232,8 +217,6 @@ class TcTable(Gtk.Grid):
         pass
 
 
-
-
 class CommandDescriptionBox(Gtk.Box):
     def __init__(self):
 
@@ -242,10 +225,8 @@ class CommandDescriptionBox(Gtk.Box):
         self.set_vexpand(True)
         # self.set_hexpand(False)
 
-
-
         # first treeview for commands
-        self.descr_liststore = Gtk.ListStore(str)
+        self.descr_liststore = Gtk.ListStore(int, str, str, str)
         for descr_ref in descr_list:
             self.descr_liststore.append(list(descr_ref))
         self.current_filter_descr = None
@@ -257,22 +238,21 @@ class CommandDescriptionBox(Gtk.Box):
 
         self.descr_treeview = Gtk.TreeView(model=self.descr_filter)
 
-
-        for i, column_title in enumerate(
-            [1]
-        ):
+        for i, column_title in enumerate(["POS", "NAME", "PARAMETER", "DATATYPE"]):
             renderer = Gtk.CellRendererText()
+            if column_title == "POS":
+                renderer.set_property('xalign', 1)
             column = Gtk.TreeViewColumn(column_title, renderer, text=i)
+            if column_title == "NAME":
+                column.set_visible(False)
             column.colnr = i
             self.descr_treeview.append_column(column)
 
-
         # item selection
         # self.treeview.connect("button-press-event", self.on_cell_clicked)
         self.selected_row = self.descr_treeview.get_selection()
         self.selected_row.connect("changed", self.item_selected)
 
-
         self.scrollable_treelist = Gtk.ScrolledWindow()
         # self.scrollable_treelist.set_vexpand(True)
         # self.scrollable_treelist.set_hexpand(20)
@@ -280,10 +260,8 @@ class CommandDescriptionBox(Gtk.Box):
 
         self.scrollable_treelist.add(self.descr_treeview)
 
-
-
         # second treeview for calibrations
-        self.cal_liststore = Gtk.ListStore(str, str, str, str, str)
+        self.cal_liststore = Gtk.ListStore(str, str, str, str)
         for cal_ref in calibrations_list:
             self.cal_liststore.append(list(cal_ref))
         self.current_filter_descr = None
@@ -295,68 +273,49 @@ class CommandDescriptionBox(Gtk.Box):
 
         self.cal_treeview = Gtk.TreeView(model=self.cal_filter)
 
-        for i, column_title in enumerate(
-                ["prv_minval", "prv_maxval", "pas_altxt", "pas_alval", "data-type"]
-        ):
+        for i, column_title in enumerate(["MIN", "MAX", "TEXT", "VAL"]):
             calibrations_renderer = Gtk.CellRendererText()
             column = Gtk.TreeViewColumn(column_title, calibrations_renderer, text=i)
             column.colnumbr = i
             self.cal_treeview.append_column(column)
 
-
         self.scrollable_calibrations_treelist = Gtk.ScrolledWindow()
         # self.scrollable_calibrations_treelist.set_vexpand(True)
         self.pack_start(self.scrollable_calibrations_treelist, True, True, 0)
 
         self.scrollable_calibrations_treelist.add(self.cal_treeview)
 
-
-
-
-
     def descr_filter_func(self, model, iter, data):
-        if (
-            self.current_filter_descr is None
-            or self.current_filter_descr == "None"
-        ):
+        if self.current_filter_descr is None or self.current_filter_descr == "None":
             return True
         else:
             return model[iter][2] == self.current_filter_descr
 
-
     def item_selected(self, selection):
         model, row = selection.get_selected()
         if row is not None:
             # print("item_selected")
             # print(model[row][0])
             calibrations_list.clear()
-            calibrations_list.append(get_calibrations(tc_type, model[row][0]))
+            calibrations_list.append(get_calibrations(tc_type, model[row][2]))
             self.refresh_cal_treeview()
 
-
-
-
-
     def refresh_descr_treeview(self):
         self.descr_liststore.clear()
-        self.descr_liststore = Gtk.ListStore(str)
-        for descr_ref in descr_list:
-            self.descr_liststore.append(tuple(descr_ref))
-        self.descr_treeview.set_model(self.descr_liststore)
-
+        # self.descr_liststore = Gtk.ListStore(str, str, str, str)
+        for i, descr_ref in enumerate(descr_list):
+            self.descr_liststore.append([i+1] + list(descr_ref))
+        # self.descr_treeview.set_model(self.descr_liststore)
 
     def cal_filter_func(self, model, iter, data):
-        if (
-            self.current_filter_descr is None
-            or self.current_filter_descr == "None"
-        ):
+        if (self.current_filter_descr is None or self.current_filter_descr == "None"):
             return True
         else:
             return model[iter][2] == self.current_filter_descr
 
     def refresh_cal_treeview(self):
 
-        self.cal_liststore = Gtk.ListStore(str, str, str, str, str)
+        self.cal_liststore = Gtk.ListStore(str, str, str, str)
 
         if calibrations_list == [] or calibrations_list == [[]]:
             pass
@@ -364,9 +323,6 @@ class CommandDescriptionBox(Gtk.Box):
             for cal_ref in calibrations_list[0]:
                 self.cal_liststore.append(list(cal_ref))
 
-
         # self.cal_treeview.set_model(self.cal_liststore)
 
-
         self.cal_treeview.set_model(self.cal_liststore)
-
diff --git a/Tst/tst/tm_management.py b/Tst/tst/tm_management.py
index e7cc4ee..108d03c 100644
--- a/Tst/tst/tm_management.py
+++ b/Tst/tst/tm_management.py
@@ -1,26 +1,23 @@
 #!/usr/bin/env python3
 import gi
 
-
 gi.require_version("Gtk", "3.0")
 gi.require_version("GtkSource", "3.0")
 from gi.repository import Gtk, Gdk, GtkSource
 import confignator
 import sys
+
 sys.path.append(confignator.get_option('paths', 'ccs'))
 import ccs_function_lib as cfl
 import s2k_partypes as s2k
 
 dictionary_of_tms = cfl.get_tm_id()
 
-
 tm_list = list(dictionary_of_tms.keys())
 tm_type_list = []
 
 tm_type_sub_list = []
 
-
-
 for counter in tm_list:
     if counter[0] not in tm_type_list:
         tm_type_list.append(counter[0])
@@ -44,8 +41,7 @@ def get_tm_type_sublist(tm_descr):
                 pcf_ptc = counter[8]
                 pcf_pfc = counter[9]
 
-
-                if pcf_ptc == None:
+                if pcf_ptc is None:
                     data_type = "None"
                     pass
                 else:
@@ -56,13 +52,12 @@ def get_tm_type_sublist(tm_descr):
     return tm_type_sub_list
 
 
-
-
 class TmTable(Gtk.Grid):
     def __init__(self, *args, **kwargs):
         super().__init__(*args, **kwargs)
 
-        self.set_size_request(500,500)
+        self.set_size_request(500, 500)
+        self.set_row_spacing(5)
 
         self.telemetry_liststore = Gtk.ListStore(int, int, int, int, str)
         for telemetry_ref in tm_list:
@@ -82,6 +77,7 @@ class TmTable(Gtk.Grid):
 
         self.type_combo = Gtk.ComboBox.new_with_model(self.type_liststore)
         self.type_combo.connect("changed", self.on_type_combo_changed)
+        self.type_combo.set_tooltip_text("Service TYPE filter")
         renderer_text = Gtk.CellRendererText()
         self.type_combo.pack_start(renderer_text, True)
         self.type_combo.add_attribute(renderer_text, "text", 0)
@@ -89,15 +85,11 @@ class TmTable(Gtk.Grid):
 
         self.clear_button = Gtk.Button(label="Clear")
         self.clear_button.connect("clicked", self.on_clear_button_clicked)
-        self.attach_next_to(
-            self.clear_button, self.type_combo, Gtk.PositionType.RIGHT, 1, 1
-        )
+        self.attach_next_to(self.clear_button, self.type_combo, Gtk.PositionType.RIGHT, 1, 1)
 
         # creating the treeview, making it use the filter a model, adding columns
         self.treeview = Gtk.TreeView.new_with_model(Gtk.TreeModelSort(self.telemetry_filter))
-        for i, column_title in enumerate(
-            ["#TYPE", "SUBTYPE", "APID", "PI1_VALUE", "PID DESCR"]
-        ):
+        for i, column_title in enumerate(["TYPE", "SUBTYPE", "APID", "PI1_VALUE", "DESCR"]):
             renderer = Gtk.CellRendererText()
             column = Gtk.TreeViewColumn(column_title, renderer, text=i)
             column.set_sort_column_id(i)
@@ -115,15 +107,12 @@ class TmTable(Gtk.Grid):
 
         self.scrollable_treelist.add(self.treeview)
 
-        self.telemetry_entry = Gtk.Entry()
-        self.telemetry_entry.set_placeholder_text("<Telemetry Variables>")
-        self.attach_next_to(self.telemetry_entry, self.scrollable_treelist, Gtk.PositionType.BOTTOM, 8, 1)
+        # self.telemetry_entry = Gtk.Entry()
+        # self.telemetry_entry.set_placeholder_text("<Telemetry Variables>")
+        # self.attach_next_to(self.telemetry_entry, self.scrollable_treelist, Gtk.PositionType.BOTTOM, 8, 1)
 
         self.secondary_box = TmSecondaryTable()
-        self.attach_next_to(self.secondary_box, self.telemetry_entry, Gtk.PositionType.BOTTOM, 8, 5)
-
-
-
+        self.attach_next_to(self.secondary_box, self.scrollable_treelist, Gtk.PositionType.BOTTOM, 8, 5)
 
         # Set up Drag and Drop
         self.treeview.drag_source_set(Gdk.ModifierType.BUTTON1_MASK, [], Gdk.DragAction.COPY)
@@ -144,38 +133,24 @@ class TmTable(Gtk.Grid):
 
         self.telemetry_filter.refilter()
 
-
     def on_clear_button_clicked(self, widget):
         self.current_filter_telemetry = None
         self.telemetry_filter.refilter()
+        self.type_combo.set_active_id(None)
 
     def item_selected(self, selection):
         model, row = selection.get_selected()
         if row is not None:
-            tm_descr = model[row][4]
-            global tm_type_sub_list
-            tm_type_sub_list = get_tm_type_sublist(tm_descr)
-            self.secondary_box.refresh_secondary_treelist()
-
-
-
-
-
-
-
-
-
-
-
-
-
+            parlist = cfl.get_tm_parameter_list(*model[row][:4])
+            self.secondary_box.refresh_parameter_treelist(parlist)
+            # tm_descr = model[row][4]
+            # global tm_type_sub_list
+            # tm_type_sub_list = get_tm_type_sublist(tm_descr)
+            # self.secondary_box.refresh_secondary_treelist()
 
     def telemetry_filter_func(self, model, iter, data):
 
-        if (
-                self.current_filter_telemetry is None
-                or self.current_filter_telemetry == "None"
-        ):
+        if self.current_filter_telemetry is None or self.current_filter_telemetry == "None":
             return True
         else:
             return model[iter][0] == self.current_filter_telemetry
@@ -183,16 +158,13 @@ class TmTable(Gtk.Grid):
     def on_drag_data_get(self, treeview, drag_context, selection_data, info, time, *args):
         treeselection = treeview.get_selection()
         model, my_iter = treeselection.get_selected()
-        selection_data.set_text(cfl.make_tc_template(descr, comment=False), -1)
+        # selection_data.set_text(cfl.make_tc_template(descr, comment=False), -1)
+        selection_data.set_text('', -1)
 
     def on_drag_begin(self, *args):
         pass
 
 
-
-
-
-
 class TmSecondaryTable(Gtk.Box):
     def __init__(self):
 
@@ -201,54 +173,78 @@ class TmSecondaryTable(Gtk.Box):
         self.set_vexpand(True)
         # self.set_hexpand(False)
 
+        self.parameter_liststore = Gtk.ListStore(int, str, str, int, str)
+        self.parameter_treeview = Gtk.TreeView(model=self.parameter_liststore)
+
+        for i, column_title in enumerate(["POS", "NAME", "PARAMETER", "OFFBY", "DATATYPE"]):
+            renderer = Gtk.CellRendererText()
+            if column_title in ("POS", "OFFBY"):
+                renderer.set_property('xalign', 1)
+            column = Gtk.TreeViewColumn(column_title, renderer, text=i)
+            if column_title == "NAME":
+                column.set_visible(False)
+            self.parameter_treeview.append_column(column)
+        self.parameter_treeview.set_tooltip_column(1)
+
+        # item selection
+        self.selected_row = self.parameter_treeview.get_selection()
+        self.selected_row.connect("changed", self.parameter_selected)
+
+        self.scrollable_parameter_treelist = Gtk.ScrolledWindow()
+        self.pack_start(self.scrollable_parameter_treelist, True, True, 0)
 
-        self.secondary_liststore = Gtk.ListStore(str, str, str, str, str, str, str)
-        for tm_type_sub_ref in tm_type_sub_list:
-            self.secondary_liststore.append(list(tm_type_sub_ref))
-        self.current_filter_secondary = None
+        self.scrollable_parameter_treelist.add(self.parameter_treeview)
+
+        self.secondary_liststore = Gtk.ListStore(str, str, str, str, str)
+        # for tm_type_sub_ref in tm_type_sub_list:
+        #     self.secondary_liststore.append(list(tm_type_sub_ref))
+        # self.current_filter_secondary = None
 
         # Creating filter, feeding it with liststore model
         self.secondary_filter = self.secondary_liststore.filter_new()
         # setting the filter function
-        self.secondary_filter.set_visible_func(self.secondary_filter_func)
-            
+        # self.secondary_filter.set_visible_func(self.secondary_filter_func)
+
         self.secondary_treeview = Gtk.TreeView(model=self.secondary_filter)
 
-        for i, column_title in enumerate(
-            ["pcf_name", "pcf_descr", "pcf_curtx", "txp_from", "txp_altxt", "plf_offby", "data_type"]
-        ):
+        for i, column_title in enumerate(["LOW", "HIGH", "OCPTYPE", "VAL", "TEXT"]):
             renderer = Gtk.CellRendererText()
             column = Gtk.TreeViewColumn(column_title, renderer, text=i)
             self.secondary_treeview.append_column(column)
 
-
         self.scrollable_secondary_tm_treelist = Gtk.ScrolledWindow()
         self.pack_start(self.scrollable_secondary_tm_treelist, True, True, 0)
 
         self.scrollable_secondary_tm_treelist.add(self.secondary_treeview)
-        
-        
 
-             
-        
+    def refresh_parameter_treelist(self, parlist):
+        self.parameter_liststore.clear()
+        for i, par in enumerate(parlist):
+            par = list(par)
+            self.parameter_liststore.append([i+1] + par[:3] + [s2k.ptt[par[3]][par[4]]])
+
+    def parameter_selected(self, selection):
+        model, row = selection.get_selected()
+        if row is not None:
+            pname = model[row][1]
+            self.refresh_secondary_treelist(pname)
+
     def secondary_filter_func(self, model, iter, data):
-        if (
-            self.current_filter_secondary is None
-            or self.current_filter_secondary == "None"
-        ):
+        if self.current_filter_secondary is None or self.current_filter_secondary == "None":
             return True
         else:
             return model[iter][2] == self.current_filter_descr
 
-    def refresh_secondary_treelist(self):
+    def refresh_secondary_treelist(self, pname):
         self.secondary_liststore.clear()
-        self.secondary_liststore = Gtk.ListStore(str, str, str, str, str, str, str)
-        for tm_type_sub_ref in tm_type_sub_list:
-            self.secondary_liststore.append(list(tm_type_sub_ref))
-        self.secondary_treeview.set_model(self.secondary_liststore)
-
-
-
-
+        info = cfl.get_tm_parameter_info(pname)
 
+        if not info:
+            return
 
+        for cal in info:
+            self.secondary_liststore.append(list(map(str, cal)))
+        # self.secondary_liststore = Gtk.ListStore(str, str, str, str, str, str, str)
+        # for tm_type_sub_ref in tm_type_sub_list:
+        #     self.secondary_liststore.append(list(tm_type_sub_ref))
+        # self.secondary_treeview.set_model(self.secondary_liststore)
-- 
GitLab