3
3
4
4
from PyQt5 .QtCore import QThread , pyqtSignal
5
5
from PyQt5 .QtWidgets import QApplication , QMainWindow , QVBoxLayout , QWidget , QHBoxLayout
6
- from PyQt5 .QtWidgets import QFileDialog , QTreeWidget , QTreeWidgetItem , QAction , QSplitter , QTableWidgetItem
6
+ from PyQt5 .QtWidgets import QPushButton , QFileDialog , QTreeWidget , QTreeWidgetItem , QAction , QSplitter , QTableWidgetItem
7
7
8
8
from PyQt5 .QtGui import QIcon
9
9
24
24
import os
25
25
26
26
from .version import __version__
27
+ from pyqtgraph import ImageView
27
28
28
29
29
30
def parse_file (file_path ):
@@ -84,13 +85,13 @@ def parse_file(file_path):
84
85
'internal_time_min' : minimal_time ,
85
86
'internal_time_max' : maximal_time ,
86
87
'log_duration' : duration ,
87
- 'spectral_count' : sums .shape ,
88
- 'channels' : hist .shape ,
88
+ 'spectral_count' : sums .shape [ 0 ] ,
89
+ 'channels' : hist .shape [ 0 ] ,
89
90
})
90
91
91
92
print ("Log file parsed in " , time .time ()- start_time , " seconds" )
92
93
93
- return [time_column , sums , hist , metadata , None ]
94
+ return [time_column , sums , hist , metadata , None , np_spectrum ]
94
95
95
96
class LoadDataThread (QThread ):
96
97
data_loaded = pyqtSignal (list )
@@ -151,7 +152,6 @@ def plot(self, data):
151
152
152
153
print ("PLOT DURATION ... " , time .time ()- start_time )
153
154
154
-
155
155
def telemetry_toggle (self , key , value ):
156
156
if self .telemetry_lines [key ] is not None :
157
157
self .telemetry_lines [key ].setVisible (value )
@@ -860,6 +860,38 @@ def run(self):
860
860
# Implement USB storage monitoring logic here
861
861
862
862
863
+
864
+ class LabdosConfigTab (QWidget ):
865
+ def __init__ (self ):
866
+ super ().__init__ ()
867
+
868
+ self .initUI ()
869
+
870
+ def initUI (self ):
871
+ # Create a QTabWidget
872
+ tab_widget = QTabWidget ()
873
+ tab_widget .setTabPosition (QTabWidget .West ) # Set the tab position to vertical
874
+
875
+ # Create the first tab - Realtime Data
876
+ realtime_tab = QWidget ()
877
+ realtime_layout = QVBoxLayout ()
878
+
879
+ firmware_tab = QWidget ()
880
+ firmware_layout = QVBoxLayout ()
881
+
882
+ # Add the tabs to the tab_widget
883
+ tab_widget .addTab (realtime_tab , "Realtime Data" )
884
+ tab_widget .addTab (firmware_tab , "Firmware" )
885
+
886
+ # Create a main layout for the LabdosConfigTab
887
+ main_layout = QVBoxLayout ()
888
+ main_layout .addWidget (tab_widget )
889
+
890
+ # Set the main layout for the LabdosConfigTab
891
+ self .setLayout (main_layout )
892
+
893
+
894
+
863
895
class AirdosConfigTab (QWidget ):
864
896
def __init__ (self ):
865
897
super ().__init__ ()
@@ -990,13 +1022,55 @@ def initUI(self):
990
1022
self .setLayout (layout )
991
1023
992
1024
1025
+ class DataSpectrumView (QWidget ):
1026
+
1027
+ def __init__ (self ,parent ):
1028
+ self .parent = parent
1029
+ super (DataSpectrumView , self ).__init__ (parent )
1030
+ self .setWindowFlags (self .windowFlags () | Qt .Window )
1031
+ self .initUI ()
1032
+
1033
+ def initUI (self ):
1034
+
1035
+ self .setWindowTitle (repr (self .parent ))
1036
+ self .setGeometry (100 , 100 , 400 , 300 )
1037
+ self .imv = pg .ImageView (view = pg .PlotItem ())
1038
+ layout = QVBoxLayout ()
1039
+ layout .addWidget (self .imv )
1040
+ self .setLayout (layout )
1041
+
1042
+ def plot_data (self , data ):
1043
+ # Clear the plot widget
1044
+ self .imv .clear ()
1045
+
1046
+ # Set the image data
1047
+ self .imv .setImage (np .where (data == 0 , np .nan , data ))
1048
+ #self.imv.autoLevels()
1049
+ #self.imv.autoRange()
1050
+
1051
+ self .imv .show ()
1052
+
1053
+ self .imv .setPredefinedGradient ('thermal' )
1054
+ self .imv .getView ().showGrid (True , True , 0.2 )
1055
+
1056
+
1057
+ # Invert the y-axis
1058
+ self .imv .getView ().invertY (False )
1059
+ #self.imv.getView().setLogMode(x=False, y=True)
1060
+
1061
+
1062
+ # Add axis labels
1063
+ #self.imv.setLabel('left', 'Y Axis')
1064
+ #self.imv.setLabel('bottom', 'X Axis')
1065
+
1066
+
1067
+
993
1068
class PlotTab (QWidget ):
994
1069
def __init__ (self ):
995
1070
super ().__init__ ()
996
1071
self .initUI ()
997
1072
998
1073
def initUI (self ):
999
-
1000
1074
self .properties_tree = QTreeWidget ()
1001
1075
self .properties_tree .setColumnCount (2 )
1002
1076
self .properties_tree .setHeaderLabels (["Property" , "Value" ])
@@ -1005,19 +1079,24 @@ def initUI(self):
1005
1079
self .datalines_tree .setColumnCount (1 )
1006
1080
self .datalines_tree .setHeaderLabels (["Units" ])
1007
1081
1082
+
1083
+ self .open_img_view_button = QPushButton ("Spectrogram" )
1084
+ self .open_img_view_button .clicked .connect (self .open_spectrogram_view )
1085
+
1086
+
1008
1087
log_view_widget = QWidget ()
1009
1088
1010
1089
self .left_panel = QSplitter (Qt .Vertical )
1011
1090
1012
1091
self .left_panel .addWidget (self .datalines_tree )
1013
1092
self .left_panel .addWidget (self .properties_tree )
1014
-
1093
+ self . left_panel . addWidget ( self . open_img_view_button )
1015
1094
1016
1095
self .logView_splitter = QSplitter (Qt .Horizontal )
1017
1096
self .logView_splitter .addWidget (self .left_panel )
1018
1097
#self.logView_splitter.addWidget(QWidget())
1019
-
1020
-
1098
+
1099
+
1021
1100
1022
1101
layout = QVBoxLayout ()
1023
1102
layout .addWidget (self .logView_splitter )
@@ -1042,6 +1121,7 @@ def start_data_loading(self):
1042
1121
self .load_data_thread .start ()
1043
1122
1044
1123
def on_data_loaded (self , data ):
1124
+ self .data = data # TODO>.. tohle do budoucna zrusit a nahradit tridou parseru..
1045
1125
print ("Data are fully loaded..." )
1046
1126
self .plot_canvas .plot (data )
1047
1127
print ("After plot data canvas" )
@@ -1080,6 +1160,15 @@ def add_properties_to_tree(item, properties):
1080
1160
self .properties_tree .expandAll ()
1081
1161
1082
1162
1163
+ def open_spectrogram_view (self ):
1164
+ matrix = self .data [- 1 ] #TODO .. tohle predelat na nejakou tridu pro parserovani
1165
+
1166
+ w = DataSpectrumView (self )
1167
+ w .show ()
1168
+ w .plot_data (matrix )
1169
+
1170
+
1171
+
1083
1172
class App (QMainWindow ):
1084
1173
def __init__ (self , args ):
1085
1174
super ().__init__ ()
@@ -1108,6 +1197,10 @@ def solve_startup_args(self):
1108
1197
if self .args .airdos :
1109
1198
print ("Oteviram zalozku s airdosem" )
1110
1199
self .openAirdosTab ()
1200
+
1201
+ if self .args .labdos :
1202
+ print ("Oteviram zalozku s labdosem" )
1203
+ self .openLabdosTab ()
1111
1204
1112
1205
def updateStackedWidget (self ):
1113
1206
print ("Updating stacked widget" )
@@ -1136,7 +1229,12 @@ def openAirdosTab(self):
1136
1229
self .tab_widget .addTab (airdos_tab , "Airdos control" )
1137
1230
self .tab_widget .setCurrentIndex (self .tab_widget .count () - 1 )
1138
1231
self .updateStackedWidget ()
1139
-
1232
+
1233
+ def openLabdosTab (self ):
1234
+ labdos_tab = LabdosConfigTab ()
1235
+ self .tab_widget .addTab (labdos_tab , "Labdos control" )
1236
+ self .tab_widget .setCurrentIndex (self .tab_widget .count () - 1 )
1237
+ self .updateStackedWidget ()
1140
1238
1141
1239
def blank_page (self ):
1142
1240
# This is widget for blank page
@@ -1153,7 +1251,6 @@ def initUI(self):
1153
1251
self .setGeometry (self .left , self .top , self .width , self .height )
1154
1252
self .setWindowIcon (QIcon ('media/icon_ust.png' ))
1155
1253
1156
-
1157
1254
self .tab_widget = QTabWidget ()
1158
1255
1159
1256
self .tab_widget .setCurrentIndex (0 )
@@ -1171,10 +1268,13 @@ def initUI(self):
1171
1268
1172
1269
tools = bar .addMenu ("&Tools" )
1173
1270
tool_airdosctrl = QAction ("AirdosControl" , self )
1174
- #tool_airdosctrl.setCheckable(True)
1175
1271
tool_airdosctrl .triggered .connect (self .action_switch_airdoscontrol )
1176
1272
tools .addAction (tool_airdosctrl )
1177
1273
1274
+ tools_labdosctrl = QAction ("LabdosControl" , self )
1275
+ tools_labdosctrl .triggered .connect (self .action_switch_labdoscontrol )
1276
+ tools .addAction (tools_labdosctrl )
1277
+
1178
1278
1179
1279
help = bar .addMenu ("&Help" )
1180
1280
doc = QAction ("Documentation" , self )
@@ -1204,12 +1304,14 @@ def initUI(self):
1204
1304
1205
1305
def action_switch_airdoscontrol (self ):
1206
1306
self .openAirdosTab ()
1307
+
1308
+ def action_switch_labdoscontrol (self ):
1309
+ self .openLabdosTab ()
1207
1310
1208
1311
def about (self ):
1209
1312
message = QMessageBox .about (self , "About dosview" , "dosview is a simple tool to visualize data from Universal Scientific Technologies's" )
1210
1313
1211
1314
1212
-
1213
1315
def open_new_file (self , flag ):
1214
1316
print ("Open new file" )
1215
1317
@@ -1228,6 +1330,7 @@ def main():
1228
1330
parser = argparse .ArgumentParser (description = 'Process some integers.' )
1229
1331
parser .add_argument ('file_path' , type = str , help = 'Path to the input file' , default = False , nargs = '?' )
1230
1332
parser .add_argument ('--airdos' , action = 'store_true' , help = 'Enable airdos control tab' )
1333
+ parser .add_argument ('--labdos' , action = 'store_true' , help = 'Enable labdos control tab' )
1231
1334
parser .add_argument ('--no_gui' , action = 'store_true' , help = 'Disable GUI and run in headless mode' )
1232
1335
parser .add_argument ('--version' , action = 'store_true' , help = 'Print version and exit' )
1233
1336
0 commit comments