Esempio n. 1
0
    for i in range(3):
        child1 = QStandardItem("Property")
        child1.setEditable(False)
        child2 = QStandardItem("Value")
        model.appendRow([child1, child2])

    treeView.resize(QSize(100, 100))
    layout = QHBoxLayout()
    layout.addWidget(treeView)
    layout.addWidget(view)
    layout.addWidget(textEdit)

    w.setLayout(layout)
    
    
    mainWindow.menuBar().addMenu("File")
    mainWindow.menuBar().addMenu("Help")

    
    toolBar = QToolBar()
    toolBar.setGeometry(QRect(100, 100, 100, 100))
    toolBar.addAction("Node")
    toolBar.addAction("Edge")

    mainWindow.addToolBar(Qt.LeftToolBarArea, toolBar)
    
    mainWindow.setCentralWidget(w)
    mainWindow.showMaximized()
    
    sys.exit(app.exec_())
class Window(QMainWindow):
    def __init__(self):
        super().__init__()
        self.Title_list = [
            "PW", " PA ", "Signal\nCategory", "PRI", "PRI \n Min",
            "PRI \n Max", "Scan \n Type", "Scan \n Rate"
        ]
        title = "Radar Pulse Analyser"
        left = 500
        top = 300
        width = 800
        height = 600
        iconName = "icon.png"
        self.ServerStopFlag = False
        self.ClearDispCount = 0
        self.setWindowTitle(title)
        self.setWindowIcon(QtGui.QIcon(iconName))
        self.setGeometry(left, top, width, height)
        self.UiComponents()
        self.show()
        #  self.Text.append("Server Started")
        self.Server_Start()

    ###################################################################################################################
    def UiComponents(self):
        self.toolbar = QToolBar(self)
        self.toolbar.setMovable(False)
        self.toolbar.setStyleSheet("background-color : white")
        self.toolbar.setGeometry(QRect(0, 0, 800, 60))
        self.Text = QTextEdit(self)
        self.Text.move(0, 500)
        self.Text.resize(800, 100)
        self.button = QPushButton("Start Pulse Analysis", self)
        self.button.move(150, 150)
        self.button.setGeometry(QRect(10, 455, 180, 40))
        self.button1 = QPushButton("Stop Pulse Analysis", self)
        self.button1.move(40, 40)
        self.button1.setGeometry(QRect(200, 455, 180, 40))
        self.button2 = QPushButton("Clear", self)
        self.button2.move(50, 50)
        self.button2.setGeometry(QRect(390, 455, 180, 40))
        self.button3 = QPushButton("Save PDW", self)
        self.button3.setGeometry(QRect(580, 455, 180, 40))
        self.ActplotDTOA = QAction("PLSCMT\nVS\nDTOA", self)
        self.ActplotHistPRI = QAction("Histogram", self)
        self.ActplotHistPW = QAction("PA\nVS\nDTOA", self)
        self.toolbar.addAction(self.ActplotDTOA)
        self.toolbar.addAction(self.ActplotHistPRI)
        self.toolbar.addAction(self.ActplotHistPW)

        self.tableWidget = QTableWidget(self)
        self.tableWidget.setGeometry(QRect(10, 60, 775, 380))
        font = QtGui.QFont()
        font.setBold(True)
        font.setPointSize(9)
        font.setItalic(True)
        font.setWeight(75)
        self.tableWidget.setFont(font)
        self.tableWidget.setObjectName("tableWidget")
        self.tableWidget.setColumnCount(8)
        self.tableWidget.horizontalHeader().setSectionResizeMode(
            QHeaderView.Stretch)
        self.tableWidget.setHorizontalHeaderLabels(self.Title_list)

        self.button.clicked.connect(self.Server_Start)
        self.button1.clicked.connect(self.Server_Stop)
        self.button2.clicked.connect(self.Clear)
        self.button3.clicked.connect(self.savePDW)

        self.ActplotDTOA.triggered.connect(self.plotDTOA)
        self.ActplotHistPRI.triggered.connect(self.plotHistPRI)
        self.ActplotHistPW.triggered.connect(self.plotHistPW)

        self.button.setEnabled(False)
        self.CurRowInd = 0
        self.thread = MyThread()
        # self.thread.change_value.connect(self.setProgressVal)
        self.thread.StopFlag = False
        self.thread.start()
        self.thread.StartPulseAnalysis = False
        # self.thread.pd_PDW_Update.connect(self.updateGraphs)
        # self.thread.Track_Update.connect(self.updateTrackTable)
        self.thread.updatePDW.connect(self.ExtractPDW)
        self.RAW_DTOA = np.empty(0, dtype='u4')
        self.PulseWidth = np.empty(0, dtype='u4')
        self.PulseAmpl = np.empty(0, dtype='u4')
        self.PDWUpdateFlag = False
        self.timer = QTimer(self)
        #self.timer = 2000
        # self.timer.timeout(2000)
        self.timer.timeout.connect(self.ExtractPulseParam)
        ############################################################################################################

    def plotDTOA(self):
        if self.SignalType == 'JITTER':
            Plot_DTOA(self.RAW_DTOA, x_lim2=500)
        else:
            Plot_DTOA(self.RAW_DTOA, x_lim2=100)

    def plotHistPRI(self):
        Plot_DTOA_Hist(self.RAW_DTOA)

    def plotHistPW(self):
        Plot_DTOA_Hist(self.PulseWidth)

    def ExtractPDW(self, recv_data):
        # self.Text.append('Extract PDW')
        PW, PA, D_TOA = Extract_PDW(recv_data[1:])
        self.RAW_DTOA = np.concatenate((self.RAW_DTOA, D_TOA), axis=0)
        self.PulseWidth = np.concatenate((self.PulseWidth, PW), axis=0)
        self.PulseAmpl = np.concatenate((self.PulseAmpl, PA), axis=0)
        self.PDWUpdateFlag = True
#####################################################################################################################

    def ExtractPulseParam(self):
        self.Text.append('Pulse Count' + str(len(self.RAW_DTOA)))
        # self.CurRowInd = self.tableWidget.rowCount()
        # self.tableWidget.setRowCount(self.CurRowInd+1)
        if self.PDWUpdateFlag == True:
            try:
                self.tableWidget.setRowCount(self.CurRowInd + 1)
                # self.CurRowInd = 1
                if len(self.RAW_DTOA > 1000):
                    TrackData = GetPRI(self.RAW_DTOA[-1000:])
                    TrackData['Pulse Width'] = GetPW(self.PulseWidth[-1000:])
                else:
                    TrackData = GetPRI(self.RAW_DTOA)
                    TrackData['Pulse Width'] = GetPW(self.PulseWidth)
                print(TrackData)
                self.SignalType = TrackData.get('Signal Category')
                self.Text.clear()
                self.Text.append(str(TrackData))
                PW = f'''{TrackData['Pulse Width']}'''
                PA = f'''{TrackData['Pulse Amplitude']}'''
                PRI = f'''{TrackData['PRI']}'''
                minPRI = f'''{TrackData['Min PRI']}'''
                maxPRI = f'''{TrackData['Max PRI']}'''
                ScanRate = f'''{TrackData['Scan Rate']}'''
                self.tableWidget.setItem(self.CurRowInd, 0,
                                         QTableWidgetItem(PW))
                self.tableWidget.setItem(self.CurRowInd, 1,
                                         QTableWidgetItem(PA))
                self.tableWidget.setItem(
                    self.CurRowInd, 2,
                    QTableWidgetItem(TrackData.get('Signal Category')))
                self.tableWidget.setItem(self.CurRowInd, 3,
                                         QTableWidgetItem(PRI))
                self.tableWidget.setItem(self.CurRowInd, 4,
                                         QTableWidgetItem(minPRI))
                self.tableWidget.setItem(self.CurRowInd, 5,
                                         QTableWidgetItem(maxPRI))
                self.tableWidget.setItem(
                    self.CurRowInd, 6,
                    QTableWidgetItem(TrackData.get('Scan Type')))
                self.tableWidget.setItem(self.CurRowInd, 7,
                                         QTableWidgetItem(ScanRate))
                #  print (GetPW(PulseWidth))
                #self.Track_Update.emit(TrackData)
            except:
                self.Text.append('No PDWs in Buffer')
            self.PDWUpdateFlag = False
        self.timer.start(2000)
        #Munny Write here to insert into table TrackData
        #self.savePDW()
####################################################################################################################

    def savePDW(self):
        TOA = []
        TOA.append(0)
        for i in range(1, len(self.RAW_DTOA)):
            TOA.append(TOA[i - 1] + self.RAW_DTOA[i - 1])
        pdwdata = []
        # for i in range(1000):
        #     pdwdata.append([PulseWidth[i], PulseAmpl[i], RAW_DTOA[i], TOA[i]])
        try:
            df = pd.DataFrame(columns=['TOA', 'PW', 'PA', 'DTOA'])
            df['PW'] = self.PulseWidth
            df['PA'] = self.PulseAmpl
            df['DTOA'] = self.RAW_DTOA
            df['TOA'] = TOA
            df.to_csv('pdw.csv')
        # self.pd_PDW_Update.emit(df)
        except:
            print('Error')

    ###################################################################################################################
    def Server_Start(self):
        self.Clear()
        self.Text.append("Pulse Analysis Started")
        self.RAW_DTOA = np.empty(0, dtype='u4')
        self.PulseWidth = np.empty(0, dtype='u4')
        self.PulseAmpl = np.empty(0, dtype='u4')

        self.button.setEnabled(False)
        self.button1.setEnabled(True)
        # self.Text.append("Server Started")
        self.thread.StartPulseAnalysis = True
        self.timer.start(2000)

    ###################################################################################################################
    def Server_Stop(self):
        # self.thread.StopFlag = True
        self.button.setEnabled(True)
        self.button1.setEnabled(False)
        self.Text.append("Pulse Analysis Stopped")
        self.thread.StartPulseAnalysis = False
        #self.thread.exit()
        #self.ServerStopFlag = True
        self.timer.stop()

    ###################################################################################################################
    def updateGraphs(self, df_Pdw):
        print('Update Graphs')

    # print(df_Pdw.head())
    # Munny write here for Graphs updation

    def updateTrackTable(self, TrackData):
        print('Update Table')
        print(TrackData)
        # Munny Write here for Tbale updation
#######################################################################################################################

    def Clear(self):
        self.Text.clear()
Esempio n. 3
0
class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__(None)
        self.config = Configuration()
        self.config.readConfig(self.config.configFile)
        self.initUI()

    # Define UI elements
    def initUI(self):
        logger.info("SpecAnalyzer v." + __version__)
        self.setWindowTitle("SpecAnalyzer %s" % __version__)
        self.setGeometry(10, 30, 340, 220)
        self.setFixedSize(self.size())
        self.aboutwid = AboutWidget()
        self.resultswind = ResultsWindow(parent=self)
        self.camerawind = CameraWindow(parent=self)
        self.weblinks = WebLinksWidget()
        self.acquisition = Acquisition(parent=self)
        self.acquisitionwind = AcquisitionWindow(parent=self)
        self.powermeterwind = PowermeterWindow(parent=self)
        self.sourcemeterwind = SourcemeterWindow(parent=self)

        self.deviceLabel = QLabel(self)
        self.deviceLabel.setGeometry(QRect(10, 30, 100, 20))
        self.deviceLabel.setText("Name:")
        self.deviceText = QLineEdit(self)
        self.deviceText.setText("")
        self.deviceText.setGeometry(QRect(130, 30, 200, 20))

        self.commentsLabel = QLabel(self)
        self.commentsLabel.setGeometry(QRect(10, 60, 100, 20))
        self.commentsLabel.setText("Comments:")
        self.commentsText = QLineEdit(self)
        self.commentsText.setText("")
        self.commentsText.setGeometry(QRect(130, 60, 200, 20))

        self.deviceAreaLabel = QLabel(self)
        self.deviceAreaLabel.setGeometry(QRect(10, 90, 120, 20))
        self.deviceAreaLabel.setText("Device area [cm\u00B2]:")
        self.deviceAreaText = QLineEdit(self)
        self.deviceAreaText.setText(str(self.config.deviceArea))
        self.deviceAreaText.editingFinished.connect(self.setDeviceArea)
        self.deviceAreaText.setGeometry(QRect(130, 90, 100, 20))

        # Create menu and toolbar
        self.menuBar = QMenuBar(self)
        self.menuBar.setGeometry(0, 0, 340, 25)
        self.toolBar = QToolBar(self)
        self.toolBar.setGeometry(0, 170, 340, 25)

        # Menu entries
        self.loadConfigMenu = QAction("&Load Configuration", self)
        self.loadConfigMenu.setShortcut("Ctrl+Shift+o")
        self.loadConfigMenu.setStatusTip('Quit')
        self.loadConfigMenu.triggered.connect(self.loadConfig)

        self.saveConfigMenu = QAction("&Save Configuration", self)
        self.saveConfigMenu.setShortcut("Ctrl+Shift+s")
        self.saveConfigMenu.setStatusTip('Quit')
        self.saveConfigMenu.triggered.connect(self.saveConfig)

        self.loadMenu = QAction("&Load Data", self)
        self.loadMenu.setShortcut("Ctrl+o")
        self.loadMenu.setStatusTip('Load csv data from saved file')
        self.loadMenu.triggered.connect(self.resultswind.read_csv)

        self.directoryMenu = QAction("&Set directory for saved files", self)
        self.directoryMenu.setShortcut("Ctrl+d")
        self.directoryMenu.setStatusTip('Set directory for saved files')
        self.directoryMenu.triggered.connect(self.resultswind.set_dir_saved)

        self.quitMenu = QAction("&Quit", self)
        self.quitMenu.setShortcut("Ctrl+q")
        self.quitMenu.setStatusTip('Quit')
        self.quitMenu.triggered.connect(self.fileQuit)

        fileMenu = self.menuBar.addMenu('&File')
        fileMenu.addAction(self.quitMenu)
        fileMenu.addSeparator()
        fileMenu.addAction(self.loadMenu)
        fileMenu.addAction(self.directoryMenu)
        fileMenu.addSeparator()
        fileMenu.addAction(self.loadConfigMenu)
        fileMenu.addAction(self.saveConfigMenu)

        self.powermeterMenu = QAction("&Powermeter", self)
        self.powermeterMenu.setShortcut("Ctrl+p")
        self.powermeterMenu.setStatusTip('Powermeter controls')
        self.powermeterMenu.triggered.connect(self.powermeterwind.show)
        self.sourcemeterMenu = QAction("&Sourcemeter", self)
        self.sourcemeterMenu.setShortcut("Ctrl+k")
        self.sourcemeterMenu.setStatusTip('Sourcemeter controls')
        self.sourcemeterMenu.triggered.connect(self.sourcemeterwind.show)
        self.cameraMenu = QAction("&Camera", self)
        self.cameraMenu.setShortcut("Ctrl+c")
        self.cameraMenu.setStatusTip('Camera controls')
        self.cameraMenu.triggered.connect(self.camerawind.show)

        instrumentsMenu = self.menuBar.addMenu('&Instruments')
        instrumentsMenu.addAction(self.sourcemeterMenu)
        instrumentsMenu.addSeparator()
        instrumentsMenu.addAction(self.powermeterMenu)
        instrumentsMenu.addAction(self.cameraMenu)

        self.viewWindowMenus(self.menuBar, self)

        self.helpMenu = QAction("&Help", self)
        self.helpMenu.setShortcut("Ctrl+h")
        self.helpMenu.setStatusTip('Help')
        self.helpMenu.triggered.connect(self.weblinks.help)
        self.devBugsMenu = QAction("&Development and Bugs", self)
        self.devBugsMenu.setShortcut("Ctrl+b")
        self.devBugsMenu.setStatusTip('Development and bugs')
        self.devBugsMenu.triggered.connect(self.weblinks.help)
        self.aboutMenu = QAction("&About", self)
        self.aboutMenu = QAction("&About", self)
        self.aboutMenu.setShortcut("Ctrl+a")
        self.aboutMenu.setStatusTip('About')
        self.aboutMenu.triggered.connect(self.aboutwid.show)

        aboutMenu = self.menuBar.addMenu('&Help')
        aboutMenu.addAction(self.helpMenu)
        aboutMenu.addAction(self.devBugsMenu)
        aboutMenu.addSeparator()
        aboutMenu.addAction(self.aboutMenu)

        # Toolbar Entries #
        self.acquisitionToolbar = QAction("&Acquisition", self)
        self.acquisitionToolbar.setShortcut("Ctrl+a")
        self.acquisitionToolbar.setStatusTip('Acquisition paramenters')
        self.acquisitionToolbar.triggered.connect(self.acquisitionwind.show)

        self.resultsToolbar = QAction("&Results", self)
        self.resultsToolbar.setShortcut("Ctrl+p")
        self.resultsToolbar.setStatusTip('Results Panel')
        self.resultsToolbar.triggered.connect(self.resultswind.show)

        self.cameraToolbar = QAction("&Camera", self)
        self.cameraToolbar.setShortcut("Ctrl+c")
        self.cameraToolbar.setStatusTip('Camera and alignment')
        self.cameraToolbar.triggered.connect(self.camerawind.show)

        #toolBar = self.addToolBar("&Toolbar")
        self.toolBar.addAction(self.acquisitionToolbar)
        self.toolBar.addSeparator()
        self.toolBar.addAction(self.resultsToolbar)
        self.toolBar.addSeparator()
        self.toolBar.addAction(self.cameraToolbar)
        self.toolBar.addSeparator()

        #### Create status bar ####
        self.statusBar = QStatusBar()
        self.setStatusBar(self.statusBar)
        self.statusBarLabel = QLabel(self)
        self.statusBar.addPermanentWidget(self.statusBarLabel, 1)
        self.statusBarLabel.setText("System: ready")
        #self.statusBar().showMessage("Ready", 5000)

        #### Create basic push buttons to run acquisition ####
        self.startAcqButton = QPushButton(self)
        self.startAcqButton.setGeometry(QRect(10, 120, 160, 40))
        self.startAcqButton.setObjectName("Start Acquisition")
        self.startAcqButton.setText("Start Acquisition")
        self.startAcqButton.clicked.connect(self.acquisition.start)
        self.stopAcqButton = QPushButton(self)
        self.stopAcqButton.setGeometry(QRect(170, 120, 160, 40))
        self.stopAcqButton.setObjectName("Stop Acquisition")
        self.stopAcqButton.setText("Stop Acquisition")
        self.stopAcqButton.setEnabled(False)
        self.stopAcqButton.clicked.connect(self.acquisition.stop)

    # Logic for loading parameters from a configuration file
    def loadConfig(self):
        filename = QFileDialog.getOpenFileName(self, "Open INI config file",
                                               "", "*.ini")
        self.config.readConfig(filename)
        print("Confguration parameters loaded from:", filename[0])
        logger.info("Confguration parameters loaded from:" + filename[0])

    # Logic for saving parameters to a configuration file
    def saveConfig(self):
        filename = QFileDialog.getSaveFileName(self, "Save INI config file",
                                               "", "*.ini")
        self.config.saveConfig(filename[0])
        print("Confguration parameters saved to:", filename[0])
        logger.info("Confguration parameters saved to:" + filename[0])

    # Logic to save deviceArea on config when done editing the corresponding field
    def setDeviceArea(self):
        self.config.conf['Devices']['deviceArea'] = str(
            self.deviceAreaText.text())
        self.config.saveConfig(self.config.configFile)
        self.config.readConfig(self.config.configFile)

    # When closing the MainWindow, all windows need to close as we..
    def fileQuit(self):
        QApplication.closeAllWindows()

    # Enable/disable buttons
    def enableButtonsAcq(self, flag):
        if flag is False:
            self.startAcqButton.setText("Acquisition Running...")
        else:
            self.startAcqButton.setText("Start Acquisition")
        self.startAcqButton.setEnabled(flag)
        self.stopAcqButton.setEnabled(not flag)
        self.deviceText.setEnabled(flag)
        self.commentsText.setEnabled(flag)
        self.deviceAreaText.setEnabled(flag)

    # Adds Menus to expose other Windows.
    def viewWindowMenus(self, menuObj, obj):
        viewMainWindowMenu = QAction("&Main Window", self)
        viewMainWindowMenu.setShortcut("Ctrl+w")
        viewMainWindowMenu.setStatusTip('Display Main Window')
        viewMainWindowMenu.triggered.connect(
            lambda: self.displayMainWindow(obj))
        viewAcquisitionMenu = QAction("&Acquisition Window", self)
        viewAcquisitionMenu.setShortcut("Ctrl+a")
        viewAcquisitionMenu.setStatusTip('Display Acquisition Window')
        viewAcquisitionMenu.triggered.connect(
            lambda: self.displayMainWindow(obj.acquisitionwind))
        viewResultsMenu = QAction("&Results Window", self)
        viewResultsMenu.setShortcut("Ctrl+r")
        viewResultsMenu.setStatusTip('Display Results Window')
        viewResultsMenu.triggered.connect(
            lambda: self.displayMainWindow(obj.resultswind))
        viewCameraMenu = QAction("&Camera Window", self)
        viewCameraMenu.setShortcut("Ctrl+c")
        viewCameraMenu.setStatusTip('Display Camera Window')
        viewCameraMenu.triggered.connect(
            lambda: self.displayMainWindow(obj.camerawind))

        windowMenu = menuObj.addMenu('&Window')
        windowMenu.addAction(viewMainWindowMenu)
        windowMenu.addAction(viewAcquisitionMenu)
        windowMenu.addAction(viewResultsMenu)
        windowMenu.addAction(viewCameraMenu)

    # Display main window
    def displayMainWindow(self, obj):
        obj.show()
        obj.setWindowState(obj.windowState() & Qt.WindowMinimized
                           | Qt.WindowActive)
        obj.raise_()
        obj.activateWindow()

    # Logic to run when quitting the program
    # Dialog box for confirmation
    def closeEvent(self, event):
        quit_msg = "Are you sure you want to exit the program?"
        reply = QMessageBox.question(self, 'Message', quit_msg, QMessageBox.No,
                                     QMessageBox.Yes)

        if reply == QMessageBox.Yes:
            try:
                self.acquisition.acq_thread.stop()
            except:
                pass
            self.close()
        else:
            event.ignore()