예제 #1
0
class Controller:
    def __init__(self):
        self.login = MainApp()
        self.cpuThread = QThread()
        self.scannerThread = QThread()
        self.open_admin = False
        self.open_user = False
        self.open_stats = False
        self.cpu = SerialPort('CPU')
        self.scanner = SerialPort('Scanner')
        self.cpu.moveToThread(self.cpuThread)
        self.scanner.moveToThread(self.scannerThread)

    def showLogin(self):
        if self.cpu.ComPort is None:
            self.cpu.portConnect()
        try:
            self.cpu.close()
        except Exception as e:
            print("Error Port :", e)

        if self.scanner.ComPort is None:
            self.scanner.portConnect()
        try:
            self.scanner.close()
        except Exception as e:
            print("Error Port:", e)

        self.login.QTxtLogin.setText('')
        self.login.QTxtPass.setText('')
        if not self.login.loaded:
            self.login.switchWindow.connect(self.showUser)
            self.login.loaded = True
        if self.open_admin:
            self.admin.close()
        if self.open_user:
            self.user.close()
        self.login.show()

    def showUser(self, text):
        try:
            self.cpuThread.started.disconnect()
            self.cpuThread.terminate()
            self.scannerThread.started.disconnect()
            self.scannerThread.terminate()
        except Exception as e:
            print(e)
        users = pd.read_csv(home_path[:-4] + '/files/users.csv')
        res = users[(users['username'] == text)]
        if res['username'].item() == "admin":
            if not self.open_admin:
                self.admin = Admin('')
                self.open_admin = True
            self.admin.login = text
            self.admin.handleHeaders()
            if not self.admin.loaded:
                self.admin.switchWindow.connect(self.showLogin)
                self.admin.switchWindow2.connect(self.showStats)
                self.admin.loaded = True
            if self.open_stats:
                self.stats.close()
            self.login.close()
            self.admin.show()
        else:
            if not self.open_user:
                self.user = User('')
                self.open_user = True
            self.user.QTxtRef.setText('')
            self.user.login = text
            self.user.handleHeaders()
            self.user.handleUI()
            if not self.user.loaded:
                self.user.switchWindow.connect(self.showLogin)
                self.user.switchWindow2.connect(self.showStats)
                self.user.sendsignal.connect(self.sendToOutput)
                self.user.loaded = True
            self.cpu.open()
            self.scanner.open()
            if not self.cpu.is_connected:
                self.cpu.signal.connect(self.user.recieveData)
                self.cpu.is_connected = True
            if not self.scanner.is_connected:
                self.scanner.signal.connect(self.user.recieveData)
                self.scanner.is_connected = True
            self.cpuThread.started.connect(self.cpu.readSerialPort)
            self.scannerThread.started.connect(self.scanner.readSerialPort)
            self.cpuThread.setTerminationEnabled(True)
            self.cpuThread.start()
            self.scannerThread.setTerminationEnabled(True)
            self.scannerThread.start()
            self.login.close()
            if self.open_stats:
                self.stats.close()
            self.user.show()

    def sendToOutput(self, data):
        print('[+]Sending', data, 'to serial port')
        self.cpu.writeSerialPort(data)

    def showScan(self, text):
        if not self.open_scan:
            self.scan = Scan('')
            self.open_scan = True
        self.scan.login = text.split(';')[0]
        self.scan.reference = text.split(';')[1]
        self.scan.quantity = int(text.split(';')[2])
        self.scan.processed = 0
        self.scan.handleHeaders()
        self.scan.handel_progressBar()
        if not self.scan.loaded:
            self.scan.switchWindow.connect(self.showUser)
            self.scan.loaded = True

        self.cpu.moveToThread(self.cpuThread)
        self.cpu.signal.connect(self.scan.recieveData)
        self.cpuThread.started.connect(self.cpu.readSerialPort)
        self.cpuThread.setTerminationEnabled(True)
        self.cpuThread.start()

        self.scanner.moveToThread(self.scannerThread)
        self.scanner.signal.connect(self.scan.recieveData)
        self.scannerThread.started.connect(self.scanner.readSerialPort)
        self.scannerThread.setTerminationEnabled(True)
        self.scannerThread.start()

        self.user.close()
        time.sleep(0.5)
        self.scan.show()

    def showStats(self, text):
        try:
            self.serialPort.close()
        except Exception as e:
            print("error PORT :", e)
        if not self.open_stats:
            self.stats = Statistics('')
            self.open_stats = True
        self.stats.login = text
        self.stats.handleHeaders()
        if not self.stats.loaded:
            self.stats.switchWindow.connect(self.showUser)
            self.stats.loaded = True
        self.stats.show()
        if self.open_admin:
            self.admin.close()
        if self.open_user:
            self.user.close()
class WindowUtama(QMainWindow):
    def __init__(self):
        super().__init__()

        self.__serverSuccessFlag = False
        self.__firstmessagefound = False
        self.__printfirstmessage = False
        self.pause = False
        self.count = 0
        self.x_data = np.arange(DATA_LENGTH)
        self.freqs = FFTmodule.fftfreq(DATA_LENGTH,
                                       SAMPLE_INTERVAL)[:DATA_LENGTH // 2]
        self.magnitude = [0] * len(self.freqs)
        self.y_data = [0] * np.size(self.x_data)

        self.initServer()

        if self.__serverSuccessFlag:
            print(f"Server at {PORT}, {BAUDRATE} bps")
            self.initUi()
            self.resize(1000, 700)
            self.show()
            self.setTimer()
        else:
            exit(1)

    def initServer(self):
        self.UART = SerialPort(PORT, BAUDRATE)
        if self.UART.SUCCESS_OPEN:
            self.__serverSuccessFlag = True
        else:
            self.__serverSuccessFlag = False

    def initUi(self):
        self.setWindowTitle("Elektro - (Serial) Data Pysualization")

        # config main widget
        self.MainWidget = QWidget()
        self.MainWidgetLayout = QGridLayout()
        self.MainWidget.setLayout(self.MainWidgetLayout)

        # place the main widget in main window
        self.setCentralWidget(self.MainWidget)

        # INIT PLOTS -------------------------------------------------
        self.List_of_Plots = []
        self.TimePlot = FigureWidget(title=f"Time Domain",
                                     color=20,
                                     yRange=Y_LIMIT)
        self.FreqPlot = FigureWidget(title=f"Frequency Domain",
                                     color=40,
                                     yRange=[-20, 120])
        self.List_of_Plots.append(self.TimePlot)
        self.List_of_Plots.append(self.FreqPlot)

        # INIT CHANNEL INFO ------------------------------------------
        self.List_of_channels = []
        #for n in range(2):
        #    self.channel_n = ChannelWidget(title="Channel", num=n+1)
        #    self.List_of_channels.append(self.channel_n)

        # ADD WIDGETS TO LAYOUT --------------------------------------
        self.MainWidgetLayout.addWidget(self.List_of_Plots[0], 0, 0)
        self.MainWidgetLayout.addWidget(self.List_of_Plots[1], 1, 0)

        #self.MainWidgetLayout.addWidget(self.List_of_channels[0], 0, 2)
        #self.MainWidgetLayout.addWidget(self.List_of_channels[1], 1, 2)

    def setTimer(self):
        self.timer = QTimer()
        self.timer.timeout.connect(self.updateAll)
        self.timer.start(0)

    def updateAll(self):
        #self.start_time = time.time()

        try:
            data = self.UART.getNewData()
            if data.find(FIRST_MESSAGE):
                self.__firstmessagefound = True
                if not self.__printfirstmessage:
                    print("Found first message!")
                    self.__printfirstmessage = True

            if self.__firstmessagefound:
                data = float(data) * 5 / 1024
                self.y_data.append(data)
                self.y_data.pop(0)

                self.magnitude = FFTmodule.fft(self.y_data)
                self.magnitude = 20 * np.log(
                    np.abs(self.magnitude[:DATA_LENGTH // 2]))

                if not self.pause:
                    self.List_of_Plots[0].PlotData(self.x_data, self.y_data)
                    self.List_of_Plots[1].PlotData(self.freqs, self.magnitude)

                else:
                    print("Paused!")

        except KeyboardInterrupt:
            print("\nKeyboard Interrupted!")
            try:
                self.UART.close()
            except:
                print("Serial port already closed")
            exit(1)

        except ValueError:
            pass