From 24461a46358eecb2c26ef1105d9f30a28aa0ebd9 Mon Sep 17 00:00:00 2001
From: Marko Mecina <marko.mecina@univie.ac.at>
Date: Thu, 25 Aug 2022 14:26:22 +0200
Subject: [PATCH] code cleanup and better logging for pool viewer

---
 Ccs/poolview_sql.py | 134 ++++++++++++++------------------------------
 1 file changed, 43 insertions(+), 91 deletions(-)

diff --git a/Ccs/poolview_sql.py b/Ccs/poolview_sql.py
index 8bcea3d..4a07c38 100644
--- a/Ccs/poolview_sql.py
+++ b/Ccs/poolview_sql.py
@@ -1,4 +1,5 @@
 import os
+import importlib
 import json
 import struct
 import threading
@@ -19,6 +20,12 @@ import gi
 import matplotlib
 matplotlib.use('Gtk3Cairo')
 
+gi.require_version('Gtk', '3.0')
+gi.require_version('Notify', '0.7')
+from gi.repository import Gtk, Gdk, GdkPixbuf, GLib, Notify  # NOQA
+
+from event_storm_squasher import delayed
+
 # from matplotlib.figure import Figure
 # from matplotlib.backends.backend_gtk3cairo import FigureCanvasGTK3Cairo as FigureCanvas
 # from matplotlib.backends.backend_gtk3agg import FigureCanvasGTK3Agg as FigureCanvas
@@ -28,23 +35,13 @@ matplotlib.use('Gtk3Cairo')
 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'))
 
-project = check_cfg.get('ccs-database', 'project')
-project = 'packet_config_' + str(project)
+cfg = confignator.get_config(check_interpolation=False)
+
+project = 'packet_config_{}'.format(cfg.get('ccs-database', 'project'))
 packet_config = importlib.import_module(project)
 TM_HEADER_LEN, TC_HEADER_LEN, PEC_LEN = [packet_config.TM_HEADER_LEN, packet_config.TC_HEADER_LEN, packet_config.PEC_LEN]
 
-gi.require_version('Gtk', '3.0')
-gi.require_version('Notify', '0.7')
-from gi.repository import Gtk, Gdk, GdkPixbuf, GLib, Notify  # NOQA
-
-from event_storm_squasher import delayed
-
-# import logging.handlers
-
 ActivePoolInfo = NamedTuple(
     'ActivePoolInfo', [
         ('filename', str),
@@ -55,7 +52,6 @@ ActivePoolInfo = NamedTuple(
 fmtlist = {'INT8': 'b', 'UINT8': 'B', 'INT16': 'h', 'UINT16': 'H', 'INT32': 'i', 'UINT32': 'I', 'INT64': 'q',
            'UINT64': 'Q', 'FLOAT': 'f', 'DOUBLE': 'd', 'INT24': 'i24', 'UINT24': 'I24', 'bit*': 'bit'}
 
-
 Telemetry = {'PUS': DbTelemetry, 'RMAP': RMapTelemetry, 'FEE': FEEDataTelemetry}
 
 
@@ -115,7 +111,7 @@ class TMPoolView(Gtk.Window):
     shown_limit = 0
     only_scroll = False
 
-    def __init__(self, cfg=None, pool_name=None, cfilters='default', standalone=False):
+    def __init__(self, cfg=cfg, pool_name=None, cfilters='default', standalone=False):
         Gtk.Window.__init__(self, title="Pool View", default_height=800, default_width=1100)
 
         self.refresh_treeview_active = False
@@ -129,13 +125,8 @@ class TMPoolView(Gtk.Window):
 
         Notify.init('PoolViewer')
 
-        # self.dbustype = dbus.SessionBus()
-        if cfg is None:
-            self.cfg = confignator.get_config(file_path=confignator.get_option('config-files', 'ccs'))
-        else:
-            self.cfg = cfg
-
-        #self.cfg.source = confignator.get_option('config-files', 'ccs').split('/')[-1] # Used to write into the config file
+        # self.cfg = confignator.get_config()
+        self.cfg = cfg
 
         self.paned = Gtk.Paned(orientation=Gtk.Orientation.HORIZONTAL, wide_handle=True, position=400)
 
@@ -427,8 +418,7 @@ class TMPoolView(Gtk.Window):
             # Both are not in the same project do not change
 
             if not cfl.Variables(conn, 'main_instance') == self.main_instance:
-                print('Both are not running in the same project, no change possible')
-                self.logger.info('Application {} is not in the same project as {}: Can not communicate'.format(
+                self.logger.warning('Application {} is not in the same project as {}: Can not communicate'.format(
                     self.my_bus_name, self.cfg['ccs-dbus_names'][application] + str(instance)))
                 return
 
@@ -1388,8 +1378,7 @@ class TMPoolView(Gtk.Window):
                 tm_row = [tm.idx, tm.type, tm.framecnt, tm.seqcnt, tm.raw.hex()]
                 tm_rows.append(tm_row)
         else:
-            print('Error in format_loaded_rows_poolviewer')
-            self.logger.error('Given Format is not valid')
+            self.logger.error('Error in format_loaded_rows_poolviewer, given Format is not valid')
 
         return tm_rows
 
@@ -1411,7 +1400,7 @@ class TMPoolView(Gtk.Window):
 
             path = model.get_path(treeiter)
 
-        print('SEL', time.time(), path, self.autoscroll, self.autoselect)
+        self.logger.debug('SEL', time.time(), path, self.autoscroll, self.autoselect)
         # I will probably be murdered in my sleep for doing this, but it works!
         entry = int(str(path))
         children = self.pool_liststore.iter_n_children() - 1
@@ -1465,7 +1454,7 @@ class TMPoolView(Gtk.Window):
         self.autoscroll = 0
 
     def scroll_child(self, widget, event, data=None):
-        print('Seems like I do not work')
+        self.logger.debug('Seems like I do not work')
         return
 
     def scroll_event(self, widget, event, data=None):
@@ -1645,9 +1634,9 @@ class TMPoolView(Gtk.Window):
                 try:
                     self.selection.select_path(model.get_path(model.get_iter(row[0] - self.offset - 1)))
                 except ValueError:
-                    print('valerr')
+                    self.logger.info('valerr')
                 except TypeError:
-                    print('typerr')
+                    self.logger.info('typerr')
 
     def unselect_bottom(self, widget=None):
         if widget.count_selected_rows() > 1:
@@ -1662,8 +1651,7 @@ class TMPoolView(Gtk.Window):
         elif self.decoding_type == 'FEE':
             return Gtk.ListStore('guint', 'guint', 'guint', 'guint', str)
         else:
-            print('Unkwown data type')
-            self.logger.info('Decoding Type is an unknown Value')
+            self.logger.error('Decoding Type is an unknown value')
             return
 
     def set_keybinds(self):
@@ -1766,7 +1754,7 @@ class TMPoolView(Gtk.Window):
         filter_value.connect('activate', self._add_to_rules, filter_value, column_name, operator, 'AND')
 
         #path_ccs = self.cfg.get(section='ccs-paths', option='ccs')
-        path_ccs = confignator.get_option('paths', 'ccs')
+        path_ccs = self.cfg.get('paths', 'ccs')
 
         add_to_rule_button_and = Gtk.Button()
         pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size(os.path.join(path_ccs, 'pixmap/intersection_icon.svg'), 10, 10)
@@ -1964,7 +1952,7 @@ class TMPoolView(Gtk.Window):
 
     def _goto_timestamp(self, widget):
         if self.decoding_type != 'PUS':
-            print('No Timestamp in RMAP and FEE data')
+            self.logger.info('No Timestamp in RMAP and FEE data')
             return
 
         try:
@@ -2004,7 +1992,7 @@ class TMPoolView(Gtk.Window):
         menu.popup(None, None, None, None, 3, event.time)
 
     def menu_test(self, widget=None):
-        print('BALABALBLABLAL')
+        pass
 
     def check_structure_type(self):
 
@@ -2161,7 +2149,7 @@ class TMPoolView(Gtk.Window):
         univie_button = Gtk.ToolButton()
         # button_run_nextline.set_icon_name("media-playback-start-symbolic")
         pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size(
-            confignator.get_option('paths', 'ccs') + '/pixmap/Icon_Space_blau_en.png', 48, 48)
+            self.cfg.get('paths', 'ccs') + '/pixmap/Icon_Space_blau_en.png', 48, 48)
         icon = Gtk.Image.new_from_pixbuf(pixbuf)
         univie_button.set_icon_widget(icon)
         univie_button.set_tooltip_text('Applications and About')
@@ -2449,12 +2437,8 @@ class TMPoolView(Gtk.Window):
             return
 
         self.decoder_dict[label] = {'bytepos': bytepos, 'bytelen': bytelen}
-
-        self.cfg['ccs-user_decoders'][label] = json.dumps(self.decoder_dict[label])
         try:
-            self.cfg.save_to_file(file_path=confignator.get_option('config-files', 'ccs'))
-            #with open(self.cfg.source, 'w') as fdesc:
-            #    self.cfg.write(fdesc)
+            self.cfg.save_option_to_file('ccs-user_decoders', label, json.dumps(self.decoder_dict[label]))
         except AttributeError:
             self.logger.info('Could not save decoder to cfg')
 
@@ -2521,7 +2505,7 @@ 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':
-            print('Can not decode parameters for RMAP or FEE data packets')
+            self.logger.info('Can not 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)
             return
@@ -2732,7 +2716,7 @@ class TMPoolView(Gtk.Window):
         if filename is not None:
             self.load_pool(widget=None, filename=filename, protocol=protocol)
         else:
-            print('Please give a Filename')
+            self.logger.error('Please give a Filename')
             return 'Please give a Filename'
         return
 
@@ -2744,7 +2728,7 @@ class TMPoolView(Gtk.Window):
             cfl.start_pmgr(True, '--nogui')
             #path_pm = os.path.join(confignator.get_option('paths', 'ccs'), 'pus_datapool.py')
             #subprocess.Popen(['python3', path_pm, '--nogui'])
-            print('Poolmanager was started in the background')
+            self.logger.info('Poolmanager was started in the background')
 
             # Here we have a little bit of a tricky situation since when we start the Poolmanager it wants to tell the
             # Manager to which number it can talk to but it can only do this when PoolViewer is not busy...
@@ -2774,7 +2758,7 @@ class TMPoolView(Gtk.Window):
                 new_pmgr_nbr = 1
 
             if new_pmgr_nbr == 0:
-                print('The maximum amount of Poolviewers has been reached')
+                self.logger.warning('The maximum amount of Poolviewers has been reached')
                 return
 
             # Wait a maximum of 10 seconds to connect to the poolmanager
@@ -2787,7 +2771,6 @@ class TMPoolView(Gtk.Window):
                     i += 1
                     time.sleep(0.1)
 
-
         if filename is not None and filename:
             pool_name = filename.split('/')[-1]
             try:
@@ -2828,7 +2811,7 @@ class TMPoolView(Gtk.Window):
                 if package_type not in ['PUS', 'PLMSIM']:
                     package_type == 'SPW'
 
-            ## package_type defines which type was selected by the user, if any was selected
+            # package_type defines which type was selected by the user, if any was selected
             new_pool = cfl.Functions(poolmgr, 'load_pool_poolviewer', pool_name, filename, isbrute, force_db_import,
                                          self.count_current_pool_rows(), self.my_bus_name[-1], package_type)
 
@@ -2963,7 +2946,6 @@ class TMPoolView(Gtk.Window):
             self.stop_butt.set_sensitive(False)
         refresh_rate = 1
 
-
         GLib.timeout_add(refresh_rate * 1000, self.show_data_rate, refresh_rate, instance, priority=GLib.PRIORITY_DEFAULT)
         return True
 
@@ -2971,7 +2953,7 @@ class TMPoolView(Gtk.Window):
         # selection = self.treeview.get_selection()
         # model, paths = selection.get_selected_rows()
         if not self.active_pool_info:
-            print('No pool to extract packets from')
+            self.logger.error('No pool to extract packets from')
             return
             ###############
             # If this is ever changed to all packet standards and not only PUS, be aware that further down the database is asced of ST and SST... only possible for PUS
@@ -3098,14 +3080,14 @@ class TMPoolView(Gtk.Window):
         if cfl.is_open('poolmanager', cfl.communication['poolmanager']):
             poolmgr = cfl.dbus_connection('poolmanager', cfl.communication['poolmanager'])
         else:
-            path_pm = os.path.join(confignator.get_option('paths', 'ccs'), 'pus_datapool.py')
-            pmgr = subprocess.Popen(['python3', path_pm])
-            #print('Poolmanager has been started and is running in the background')
+            path_pm = os.path.join(self.cfg.get('paths', 'ccs'), 'pus_datapool.py')
+            subprocess.Popen(['python3', path_pm])
             return
 
         if poolmgr.Variables('gui_running'):
             poolmgr.Functions('raise_window')
             return
+
         # Ignore_reply is no problem here since only the gui is started
         poolmgr.Functions('start_gui', ignore_reply = True)
         return
@@ -3125,7 +3107,7 @@ class TMPoolView(Gtk.Window):
         # Not necessary done in Poolmanager
         # Dictionarie in Dictionaries are not very well supported over dbus connection
         # Get dictonary connections, key pool_name, key 'recording' set to False, True to change
-        #poolmgr.Dictionaries('connections', pool_name, 'recording', False, True)
+        # poolmgr.Dictionaries('connections', pool_name, 'recording', False, True)
 
         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)
@@ -3136,9 +3118,8 @@ class TMPoolView(Gtk.Window):
             # Check if the pool name does exist
             try:
                 pinfo = poolmgr.Dictionaries('loaded_pools', pool_name)
-            except:
-                print('Please give correct pool name')
-                self.logger.info('Stop Recording: Not existing PoolName was given')
+            except (dbus.DBusException, KeyError):
+                self.logger.error("Can't stop recording: pool name not in loaded pools")
                 return
 
             pinfo_modification_time = int(pinfo[2])
@@ -3263,10 +3244,10 @@ class TMPoolView(Gtk.Window):
                 25
             ).all()
             # rr=[row for row in rows]
-            print('fetched', rows[-1].idx, cnt, 'at', time.time())
+            self.logger.info('fetched', rows[-1].idx, cnt, 'at', time.time())
             dbcon.close()
             time.sleep(sleep)
-        print('TEST ABORTED')
+        self.logger.warning('TEST ABORTED')
 
     def starttest(self, pool_name, sleep=0.1):
         t = threading.Thread(target=self.dbtest, args=[pool_name, sleep])
@@ -3290,23 +3271,7 @@ class TMPoolView(Gtk.Window):
         window.set_cursor(Gdk.Cursor.new_from_name(Gdk.Display.get_default(), name))
 
     def show_data_rate(self, refresh_rate=1, instance=1):
-        '''
-    # while self.is_visible():
-        if not self.is_visible():
-            return False
-        with self.pool.lock:
-            data_rate = self.pool.databuflen*refresh_rate
-            self.pool.databuflen = 0
-            tc_data_rate = self.pool.tc_databuflen*refresh_rate
-            self.pool.tc_databuflen = 0
-            if self.active_pool_info is not None:
-                try:
-                    trashbytes = self.pool.trashbytes[self.active_pool_info.filename]
-                except KeyError:
-                    trashbytes = 0
-            else:
-                trashbytes = 0
-        '''
+
         if not self.active_pool_info.live:
             return False
 
@@ -3317,10 +3282,10 @@ class TMPoolView(Gtk.Window):
             trashbytes, tc_data_rate, data_rate = pmgr.Functions('calc_data_rate', self.active_pool_info.filename, refresh_rate)
             self.statusbar.push(0, 'Trash: {:d} B | TC: {:7.3f} KiB/s | TM: {:7.3f} KiB/s'.format(
                 trashbytes, tc_data_rate/1024, data_rate/1024))
-        except:
-            pass
+        except Exception as err:
+            self.logger.debug(err)
+
         return True
-        # time.sleep(refresh_rate)
 
     def show_bigdata(self, *args):
         self.bigd = BigDataViewer(self)
@@ -3365,8 +3330,6 @@ class SavePoolDialog(Gtk.FileChooserDialog):
         super(SavePoolDialog, self).__init__(title="Save packets", parent=parent, action=Gtk.FileChooserAction.SAVE)
         self.add_buttons(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
                                                       Gtk.STOCK_SAVE, Gtk.ResponseType.OK)
-        # Gtk.FileChooserDialog.__init__(self, "Save packets", parent=parent, action=Gtk.FileChooserAction.SAVE, buttons=(
-        #     Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, Gtk.STOCK_SAVE, Gtk.ResponseType.OK))
 
         # self.set_transient_for(parent)
 
@@ -3541,9 +3504,6 @@ class BigDataViewer(Gtk.Window):
 
     def on_draw(self, widget, cr):
         poolmgr = cfl.dbus_connection('poolmanager', cfl.communication['poolmanager'])
-        #res = poolmgr.Functions('_return_colour_list')
-        #print(res)
-        #print(type(res))
         check = poolmgr.Functions('_return_colour_list', 'try')
         if check is False:
             return
@@ -3633,14 +3593,6 @@ def run(pool_name):
 
 
 if __name__ == "__main__":
-    given_cfg = None
-    for i in sys.argv:
-        if i.endswith('.cfg'):
-            given_cfg = i
-    if given_cfg:
-        cfg = confignator.get_config(file_path=given_cfg)
-    else:
-        cfg = confignator.get_config(file_path=confignator.get_option('config-files', 'ccs'))
 
     poolname = None
     if len(sys.argv) > 1:
-- 
GitLab