From 10243f78499b91ec6c93318e80da8b7e37dbdf70 Mon Sep 17 00:00:00 2001
From: Sebastian <seb.miksch@aon.at>
Date: Wed, 22 Jun 2022 16:43:22 +0200
Subject: [PATCH] adden verification functionalities and verification tab
 changed some typing errors

---
 Ccs/DBus_Basic.py           |   2 +-
 Ccs/ccs_function_lib.py     |  15 +++++
 Ccs/verification.py         | 131 ++++++++++++++++++++++++++++++++++++
 Tst/tst/tc_management.py    |  52 +++++++++++++-
 Tst/tst/tst.cfg             |   6 +-
 Tst/tst/tst.py              |   7 ++
 Tst/tst/verification_tab.py |  77 +++++++++++++++++++++
 egse.cfg                    |   4 +-
 8 files changed, 287 insertions(+), 7 deletions(-)
 create mode 100644 Ccs/verification.py
 create mode 100644 Tst/tst/verification_tab.py

diff --git a/Ccs/DBus_Basic.py b/Ccs/DBus_Basic.py
index 518ba36..157d812 100644
--- a/Ccs/DBus_Basic.py
+++ b/Ccs/DBus_Basic.py
@@ -53,7 +53,7 @@ class MessageListener(dbus.service.Object):
         try:
             self.win.set_title(str(project) + ': ' + str(self.win.get_title()) + ' ' + str(counting-1))
         except:
-            # Looks like a odd title name but is reshaped in pus_datapool.py
+            # Looks like an odd title name but is reshaped in pus_datapool.py
             self.win.windowname = str(project) + ': @ ' + str(counting-1)
         ###
 
diff --git a/Ccs/ccs_function_lib.py b/Ccs/ccs_function_lib.py
index 5ede9f2..f9a4a1b 100644
--- a/Ccs/ccs_function_lib.py
+++ b/Ccs/ccs_function_lib.py
@@ -2655,6 +2655,21 @@ def source_to_srec(data, outfile, memaddr=0x40180000, header=None, bytes_per_lin
 
     print('Data written to file: "{}"'.format(outfile))
 
+"""
+Test Function to get tm and tc from database tm
+"""
+def get_acute_tm_tc(description=None):
+
+    if description is None:
+        test = scoped_session_idb.execute("SELECT * FROM smile_data_storage.tm "
+                                          "WHERE smile_data_storage.tm.pool_id = 40;").fetchall()
+    else:
+        test = scoped_session_idb.execute("SELECT * FROM smile_data_storage.tm "
+                                          "WHERE smile_data_storage.tm.pool_id = 40;").fetchall()
+
+"""
+Test function ends
+"""
 
 def get_tc_list(ccf_descr=None):
 
diff --git a/Ccs/verification.py b/Ccs/verification.py
new file mode 100644
index 0000000..dcb1e7d
--- /dev/null
+++ b/Ccs/verification.py
@@ -0,0 +1,131 @@
+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/tst/tc_management.py b/Tst/tst/tc_management.py
index 2dee664..0fd53e9 100644
--- a/Tst/tst/tc_management.py
+++ b/Tst/tst/tc_management.py
@@ -5,6 +5,7 @@ import gi
 gi.require_version("Gtk", "3.0")
 gi.require_version("GtkSource", "3.0")
 from gi.repository import Gtk, Gdk, GtkSource
+from gi.repository.GdkPixbuf import Pixbuf
 import confignator
 import sys
 sys.path.append(confignator.get_option('paths', 'ccs'))
@@ -117,11 +118,14 @@ class TcTable(Gtk.Grid):
         for telecommand_ref in list_of_commands:
             self.telecommand_liststore.append(list(telecommand_ref))
         self.current_filter_telecommand = None
+        self.current_filter_longdescr = None
+        self.current_filter_descr = None
 
         # Creating the filter, feeding it with the liststore model
         self.telecommand_filter = self.telecommand_liststore.filter_new()
         # setting the filter function
         self.telecommand_filter.set_visible_func(self.telecommand_filter_func)
+        # self.telecommand_filter.set_visible_func(self.search_filter_func)
 
         # Create ListStores for the ComboBoxes
         self.type_liststore = Gtk.ListStore(int)
@@ -142,6 +146,23 @@ class TcTable(Gtk.Grid):
             self.clear_button, self.type_combo, Gtk.PositionType.RIGHT, 1, 1
         )
 
+        """
+        self.search_entry = Gtk.Entry()
+        self.search_entry.set_placeholder_text("<search>")
+        self.attach_next_to(
+            self.search_entry, self.clear_button, Gtk.PositionType.RIGHT, 1, 1
+        )
+
+        self.search_button = Gtk.ToolButton()
+        self.search_button.set_icon_name("search")
+        self.search_button.set_tooltip_text("Search")
+        self.search_button.connect("clicked", self.on_search)
+        self.attach_next_to(
+            self.search_button, self.search_entry, 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(
@@ -181,6 +202,7 @@ class TcTable(Gtk.Grid):
 
         self.show_all()
 
+
     def on_type_combo_changed(self, combo):
         combo_iter = combo.get_active_iter()
         if combo_iter is not None:
@@ -195,6 +217,7 @@ class TcTable(Gtk.Grid):
         self.current_filter_telecommand = None
         self.telecommand_filter.refilter()
 
+
     def item_selected(self, selection):
         model, row = selection.get_selected()
         if row is not None:
@@ -213,8 +236,9 @@ class TcTable(Gtk.Grid):
         else:
             pass
 
-    def telecommand_filter_func(self, model, iter, data):
 
+    def telecommand_filter_func(self, model, iter, data):
+        # print("test telecommand filter")
         if (
                 self.current_filter_telecommand is None
                 or self.current_filter_telecommand == "None"
@@ -223,15 +247,41 @@ class TcTable(Gtk.Grid):
         else:
             return model[iter][0] == self.current_filter_telecommand
 
+
     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, add_parcfg=True), -1)
 
+
     def on_drag_begin(self, *args):
         pass
 
 
+    def on_search(self, *args):
+        data_from_search_entry = self.search_entry.get_text()
+
+        self.telecommand_filter = self.telecommand_liststore.filter_new()
+        # setting the filter function
+        self.telecommand_filter.set_visible_func(self.search_filter_func)
+
+        self.telecommand_filter.refilter()
+
+        print(data_from_search_entry)
+        print("search started")
+
+
+    def search_filter_func(self, model, iter, data):
+        print("test search filter")
+        if (
+                self.current_filter_longdescr is None
+                or self.current_filter_longdescr == "None"
+        ):
+            return True
+        else:
+            return model[iter][3] == self.current_filter_longdescr
+
+
 
 
 class CommandDescriptionBox(Gtk.Box):
diff --git a/Tst/tst/tst.cfg b/Tst/tst/tst.cfg
index 74bdff7..1030e09 100644
--- a/Tst/tst/tst.cfg
+++ b/Tst/tst/tst.cfg
@@ -14,11 +14,11 @@ output-file-path = ${paths:tst}/logs_test_runs/output_files/
 
 [tst-preferences]
 show-json-view = True
-main-window-height = 1090
+main-window-height = 1043
 main-window-width = 1920
-paned-position = 953
+paned-position = 919
 paned-position-codeblockreuse = 520
 
 [tst-history]
-last-folder = /home/marko/space/smile/OBSW/Documentation/testspec/tst
+last-folder = /home/sebastian/OBSW/Documentation/testspec/tst
 
diff --git a/Tst/tst/tst.py b/Tst/tst/tst.py
index b7e8f50..bb975f5 100755
--- a/Tst/tst/tst.py
+++ b/Tst/tst/tst.py
@@ -24,6 +24,7 @@ import toolbox
 import tc_management as tcm
 import tm_management as tmm
 import data_pool_tab as dpt
+import verification_tab as vt
 
 import json_to_barescript
 import json_to_csv
@@ -355,6 +356,12 @@ class TstAppWindow(Gtk.ApplicationWindow):
         self.label_widget_data_pool.set_text('Data Pool')
         self.feature_area.append_page(child=self.data_pool_tab, tab_label=self.label_widget_data_pool)
 
+        # verification tab
+        self.verification_tab = vt.VerificationTable()
+        self.label_widget_verification = Gtk.Label()
+        self.label_widget_verification.set_text("Verification")
+        self.feature_area.append_page(child=self.verification_tab, tab_label=self.label_widget_verification)
+
 
 
         self.box.pack_start(self.work_desk, True, True, 0)
diff --git a/Tst/tst/verification_tab.py b/Tst/tst/verification_tab.py
new file mode 100644
index 0000000..f62beab
--- /dev/null
+++ b/Tst/tst/verification_tab.py
@@ -0,0 +1,77 @@
+# !/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
+from gi.repository.GdkPixbuf import Pixbuf
+import confignator
+import sys
+sys.path.append(confignator.get_option('paths', 'ccs'))
+import ccs_function_lib as cfl
+import s2k_partypes as s2k
+
+
+
+verification_list = [
+    ("Verification", 1, 7),
+    ("Other Verification", 0, 0)
+]
+
+
+
+
+
+
+class VerificationTable(Gtk.Grid):
+    def __init__(self, *args, **kwargs):
+        super().__init__(*args, **kwargs)
+
+        self.set_size_request(500,500)
+
+
+        self.grid = Gtk.Grid()
+        self.grid.set_column_homogeneous(True)
+        self.grid.set_row_homogeneous(True)
+        self.add(self.grid)
+
+        # Creating ListStore model
+        self.verification_liststore = Gtk.ListStore(str, int, int)
+        for verification_ref in verification_list:
+            self. verification_liststore.append(list(verification_ref))
+        self.current_filter_verification = None
+
+        # Creating filter, feeding it with liststore model
+        self.verification_filter = self.verification_liststore.filter_new()
+        # setting the filter function
+        self.verification_filter.set_visible_func(self.verification_filter_func)
+
+        # Creating treeview
+        self.treeview = Gtk.TreeView(model=self.verification_filter)
+        for i, column_title in enumerate(
+            ["Verification", "ST", "SST"]
+        ):
+            renderer = Gtk.CellRendererText()
+            column = Gtk.TreeViewColumn(column_title, renderer, text=i)
+            self.treeview.append_column(column)
+
+        # setting up layout
+        self.scrollable_treelist = Gtk.ScrolledWindow()
+        self.scrollable_treelist.set_vexpand(True)
+        self.grid.attach(self.scrollable_treelist, 0, 0, 8, 10)
+        self.scrollable_treelist.add(self.treeview)
+
+
+
+
+        self.show_all()
+
+    def verification_filter_func(self, model, iter, data):
+        if(
+                self.current_filter_verification is None
+                or self.current_filter_verification == "None"
+        ):
+            return True
+        else:
+            return model[iter][2] == self.current_filter_verification
\ No newline at end of file
diff --git a/egse.cfg b/egse.cfg
index 165dde6..b74ddb0 100644
--- a/egse.cfg
+++ b/egse.cfg
@@ -8,8 +8,8 @@ ia = ${obsw}/CrIa/build/pc
 start-simulator-log = ${logging:log-dir}/simulators/sim.log
 
 [database]
-user = egse
-password = xrayvision
+user = sebastian
+password = Ego,ich1
 host = 127.0.0.1
 
 [logging]
-- 
GitLab