Exemplo n.º 1
0
class ScopeShotTimer(QDialog):
    def __init__(self):
        super(ScopeShotTimer, self).__init__()

        self.initUI()

    def initUI(self):

        self.count = 0

        self.timer = QtCore.QTimer(self)
        self.timer.timeout.connect(self.Time)
        self.timer.start(1000)

        self.lcd = QLCDNumber(self)
        # get the palette
        palette = self.lcd.palette()

        # foreground color
        palette.setColor(palette.WindowText, QtGui.QColor(85, 85, 255))
        # background color
        palette.setColor(palette.Background, QtGui.QColor(0, 170, 255))
        # "light" border
        palette.setColor(palette.Light, QtGui.QColor(255, 0, 0))
        # "dark" border
        palette.setColor(palette.Dark, QtGui.QColor(0, 255, 0))

        # set the palette
        self.lcd.setPalette(palette)
        self.lcd.setMinimumHeight(100)
        self.lcd.setMinimumWidth(148)

        self.lcd.display(self.count)

        diologGrid = QGridLayout()
        diologGrid.addWidget(self.lcd, 0, 0)

        self.okButton = QPushButton('Capture Scope Shot', self)
        self.okButton.clicked[bool].connect(self.close)
        diologGrid.addWidget(self.okButton, 0, 1)

        self.setLayout(diologGrid)

        self.setGeometry(200, 200, 150, 100)
        self.setWindowTitle('Scope Capture')
        self.setWindowIcon(QIcon('xbox_icon.ico'))

    def Time(self):
        #        self.lcd.display(strftime("%H"+":"+"%M"+":"+"%S"))
        self.count += 1
        self.lcd.display(self.count)
        if self.count == 120:
            print '\a'
Exemplo n.º 2
0
class timeWidget(QWidget):

    time = pyqtSignal()

    def __init__(self, winParent):
        super(timeWidget, self).__init__()
        self.winParent = winParent
        self.seconds = 0

        hLayout = QHBoxLayout()

        timeLabel = QLabel("Time")
        self.lcd = QLCDNumber(self)
        self.lcd.setMaximumSize(100, 50)
        hLayout.addWidget(timeLabel, 0)
        hLayout.addWidget(self.lcd, 1)

        hSpacer = QSpacerItem(300, 30, QSizePolicy.Ignored,
                              QSizePolicy.Ignored)
        hLayout.addItem(hSpacer)

        self.setLayout(hLayout)

        timer = QTimer(self)
        timer.start(1000)
        timer.timeout.connect(self.printTime)

        # get the palette
        palette = self.lcd.palette()

        # foreground color
        palette.setColor(palette.WindowText, QColor(85, 85, 255))
        # background color
        palette.setColor(palette.Background, QColor(0, 170, 255))
        # "light" border
        palette.setColor(palette.Light, QColor(255, 0, 0))
        # "dark" border
        palette.setColor(palette.Dark, QColor(0, 255, 0))

        # set the palette
        self.lcd.setPalette(palette)

    def printTime(self):
        self.seconds += 1
        self.lcd.display(self.seconds)
class timeWidget(QWidget):

    time = pyqtSignal()
    def __init__(self,winParent):    
        super(timeWidget, self).__init__()
        self.winParent=winParent
        self.seconds = 0
        
        hLayout = QHBoxLayout()
        
        timeLabel = QLabel("Time")
        self.lcd = QLCDNumber(self)
        self.lcd.setMaximumSize(100,50)
        hLayout.addWidget(timeLabel,0)
        hLayout.addWidget(self.lcd, 1)

        hSpacer = QSpacerItem(300, 30, QSizePolicy.Ignored, QSizePolicy.Ignored)
        hLayout.addItem(hSpacer)

        self.setLayout(hLayout)

        timer = QTimer(self)
        timer.start(1000)
        timer.timeout.connect(self.printTime)


        # get the palette
        palette = self.lcd.palette()

        # foreground color
        palette.setColor(palette.WindowText, QColor(85, 85, 255))
        # background color
        palette.setColor(palette.Background, QColor(0, 170, 255))
        # "light" border
        palette.setColor(palette.Light, QColor(255, 0, 0))
        # "dark" border
        palette.setColor(palette.Dark, QColor(0, 255, 0))

        # set the palette
        self.lcd.setPalette(palette)

    def printTime(self):
        self.seconds += 1
        self.lcd.display(self.seconds)
Exemplo n.º 4
0
class CountDownTimer(QLCDNumber):
    """
    time_allocation: positive integer, indicating the allocated time for user
    time_value: started as time_allocation, and dynamically changed every second
    """

    def __init__(self, time_allocation=15, parent=None):
        super(CountDownTimer, self).__init__(parent)
        self.time_allocation = time_allocation
        self.time_value = self.time_allocation

        # timer
        self.timer = QTimer(self)
        self.timer.timeout.connect(self.advance_time)

        # LCD time display
        self.lcd = QLCDNumber(self)
        self.lcd.setDigitCount(3)
        self.lcd.setSegmentStyle(QLCDNumber.Flat)
        self.lcd.display(self.time_value)

    def restart_timer(self):
        self.time_value = self.time_allocation
        self.lcd.display(self.time_value)
        palette = self.lcd.palette()
        palette.setColor(palette.WindowText, QColor(0, 0, 0))
        self.lcd.setPalette(palette)
        self.timer.start(1000)

    def advance_time(self):
        self.time_value -= 1

        # Yellow - five seconds left
        if self.time_value == 5:
            palette = self.lcd.palette()
            palette.setColor(palette.WindowText, QColor(255, 153, 0))
            self.lcd.setPalette(palette)

        # Red - no time left
        if self.time_value == 0:
            palette = self.lcd.palette()
            palette.setColor(palette.WindowText, QColor(255, 0, 0))
            self.lcd.setPalette(palette)
        self.lcd.display(self.time_value)
Exemplo n.º 5
0
class MainWindow(QWidget):
    def __init__(self, ser, sio):
        super().__init__()

        # Setup the colour palette
        palette = self.palette()
        palette.setColor(QPalette.Window, QColor(40, 40, 40))
        palette.setColor(QPalette.WindowText, QColor(230, 230, 230))
        palette.setColor(QPalette.Base, QColor(252, 252, 252))
        palette.setColor(QPalette.AlternateBase, QColor(239, 240, 241))
        palette.setColor(QPalette.ToolTipBase, QColor(239, 240, 241))
        palette.setColor(QPalette.ToolTipText, QColor(49, 54, 59))
        palette.setColor(QPalette.Text, QColor(0, 0, 0))
        palette.setColor(QPalette.Button, QColor(85, 90, 95))
        palette.setColor(QPalette.ButtonText, QColor(50, 50, 50))
        palette.setColor(QPalette.BrightText, QColor(255, 255, 255))
        palette.setColor(QPalette.Link, QColor(41, 128, 185))
        palette.setColor(QPalette.Highlight, QColor(136, 136, 136))
        palette.setColor(QPalette.HighlightedText, QColor(239, 240, 241))
        palette.setColor(QPalette.Disabled, QPalette.Light, Qt.white)
        palette.setColor(QPalette.Disabled, QPalette.Shadow,
                         QColor(234, 234, 234))
        self.setPalette(palette)

        self.ser = ser
        self.sio = sio
        self.start = 1
        self.maxforce = 0000.00
        self.oldforce = 0.0
        self.force = 0.0
        self.initUI()

    def initUI(self):
        self.grid = QGridLayout()
        self.teams = {}
        self.currentteam = [QListWidgetItem_Team()]
        self.chartView = QChartView()
        self.loadNewGraph = True

        # LCD Widget to display the force
        self.forcelcd = QLCDNumber(7, self)
        self.forcelcd.setStyleSheet(
            "color: rgb(0, 210, 0); border-image: url(background3.png) stretch; background-repeat: no-repeat;"
        )
        lcdpalette = self.forcelcd.palette()
        lcdpalette.setColor(lcdpalette.Light, QtGui.QColor(0, 255, 0))
        lcdpalette.setColor(lcdpalette.Dark, QtGui.QColor(0, 0, 0))
        self.forcelcd.setPalette(lcdpalette)
        self.forcelcd.setFrameStyle(0)

        # Push buttons
        zero = QPushButton('Zero Scale', self)
        clearmax = QPushButton('Reset', self)
        clearmax.clicked.connect(self.reset)
        export = QPushButton('Export', self)
        togglestart = QPushButton('Start/Stop', self)

        # Push Button Functions
        zero.clicked.connect(self.zero_scale)
        clearmax.clicked.connect(self.reset)
        export.clicked.connect(self.exportTeams)
        togglestart.clicked.connect(self.toggle)

        # Textbox to enter in team name
        self.teaminput = QLineEdit()
        self.teaminput.setText('Enter team here')
        self.teaminput.returnPressed.connect(self.addTeam)

        # Current highest force text
        self.maxforce = 0000.00
        self.maxforcetxt = QLabel()
        self.maxforcetxt.setFont(QtGui.QFont("Quartz", 62))
        self.maxforcetxt.setText("Maximum Force: %.2f N" % self.maxforce)
        self.maxforcetxt.setStyleSheet(
            "color: rgb(0, 210, 0); background-image: url(maxbackground.png); background-attachment: fixed"
        )
        self.maxforcetxt.setAlignment(QtCore.Qt.AlignCenter)

        # List of teams and scores
        self.teamlist = QListWidget()
        self.teamlist.setStyleSheet("background-color: rgb(85, 90, 100);")
        self.teamlist.setSortingEnabled(True)
        self.teamlist.itemDoubleClicked.connect(self.selectTeam)

        # EGBC Logo
        self.EGBC = QLabel()
        img = QPixmap('EGBC_Logo_Mod2.png')
        self.EGBC.setPixmap(img)

        # Add widgets to grid and format
        self.grid.setColumnStretch(1, 2)
        self.grid.setColumnStretch(2, 2)
        self.grid.setColumnStretch(3, 2)
        self.grid.setColumnStretch(4, 2)
        self.grid.setColumnStretch(5, 1)
        self.grid.setColumnStretch(6, 2)
        self.grid.setRowStretch(1, 6)
        self.grid.setRowStretch(0, 1)

        self.grid.addWidget(self.maxforcetxt, 0, 1, 1, 4)
        self.grid.addWidget(self.EGBC, 0, 5, 1, 2)
        self.grid.addWidget(self.forcelcd, 1, 1, 1, 5)
        self.grid.addWidget(zero, 2, 1)
        self.grid.addWidget(clearmax, 2, 2)
        self.grid.addWidget(export, 2, 3)
        self.grid.addWidget(togglestart, 2, 4)
        self.grid.addWidget(self.teamlist, 1, 6)
        self.grid.addWidget(self.teaminput, 2, 6)

        self.updateforce()
        self.setLayout(self.grid)
        print(self.teaminput.width())
        self.showFullScreen()

    def keyPressEvent(self, e):
        if e.key() == Qt.Key_Escape:
            reply = QMessageBox.question(self, 'PyQt5 message',
                                         "Do you want to exit the program?",
                                         QMessageBox.Yes | QMessageBox.No,
                                         QMessageBox.No)
            if reply == QMessageBox.Yes:
                self.close()
            else:
                e.ignore()

    def zero_scale(self):
        self.ser.write(b'x\r\n')
        self.sio.flush()
        trunk = self.sio.readline()
        self.ser.write(b'1\r\n')
        self.sio.flush()
        for line in self.sio.readlines():
            if line == '>\r\n':
                break
        self.ser.write(b'x\r\nx\r\n')
        self.sio.flush()
        self.reset()
        return

    def reset(self):
        self.maxforce = 0.0
        self.force = 0.0
        self.maxforcetxt.setText(str("Maximum Force: %.2f N" % self.maxforce))
        self.forcelcd.display(self.force)

    def toggle(self):
        self.start ^= 1
        if self.start:
            self.chartView.hide()
            #self.grid.removeWidget(self.chartView)
            self.forcelcd.show()
        else:
            self.loadNewGraph = True
            self.forcelcd.hide()

    def addTeam(self):
        self.grid.removeWidget(self.chartView)
        team = self.teaminput.text()
        print(team)
        if team and team != "Enter team here":
            self.teaminput.setText("")
            self.teams[team] = [
                0.00,
            ]

            item = QListWidgetItem_Team()
            item.setText(team + " - " + str(self.teams[team]))
            item.setFont(QtGui.QFont("Times", 32))

            self.teamlist.addItem(item)

        with open(os.path.join(csv_path, team + '.csv'), 'w',
                  newline='') as csvfileout:
            writer = csv.DictWriter(csvfileout, fieldnames=['Sample', 'Force'])
            writer.writeheader()
            csvfileout.close()

    def selectTeam(self):
        self.chartView.hide()
        self.currentteam = self.teamlist.selectedItems()
        if not self.start:
            self.loadNewGraph = True

    def exportTeams(self):
        for team in self.teams:
            sample = 0
            with open(os.path.join(csv_path, team + '.csv'), 'w',
                      newline='') as csvfileout:
                writer = csv.DictWriter(csvfileout,
                                        fieldnames=['Sample', 'Force'])
                writer.writeheader()
                for samples in self.teams[team]:
                    writer.writerow({'Sample': sample, 'Force': samples})
                    sample += 1
            csvfileout.close()

    def get_force(self):
        self.ser.flushOutput()
        self.ser.flushInput()
        output = self.sio.readline()
        print(output)

        if 'Exiting' not in output and len(output) in range(10, 12):
            end = output.rfind(',kg')
            value = output[0:end]
        else:
            value = self.oldforce / 9.81
        return value

    def updateforce(self):
        self.grid.removeWidget(self.chartView)
        if self.start:
            # Generate some random force values for testing
            #self.force = random.randrange(1,5000,1)
            #self.force += 0.01

            self.force = round(float(self.get_force()) * 9.81, 2)
            self.forcelcd.display(self.force)
            self.oldforce = self.force

            # Update team dictionary and CSV file
            if self.currentteam[0].name():
                self.teams[self.currentteam[0].name()].append(self.force)

                start = time.time()
                with open(os.path.join(csv_path,
                                       self.currentteam[0].name() + ".csv"),
                          "a+",
                          newline='') as csvfile:
                    writer = csv.DictWriter(csvfile,
                                            fieldnames=['Sample', 'Force'])
                    csvfile.seek(0)

                    writer.writerow({
                        'Sample': self.currentteam[0].samples,
                        'Force': self.force
                    })
                    self.currentteam[0].samples += 1
                    csvfile.close()
                end = time.time()
                print(end - start)

        # New max force found, update the force label and list
            if self.force > self.maxforce:
                self.maxforce = self.force
                self.maxforcetxt.setText("Maximum Force: %.2f N" % self.force)
                self.currentteam[0].setForce(self.force)

        if not self.start and self.loadNewGraph:
            data = QSplineSeries()
            data.setName(self.currentteam[0].name())

            with open(os.path.join(csv_path,
                                   self.currentteam[0].name() + '.csv'),
                      "r",
                      newline='') as file:
                for line in file:
                    if "Sample" not in line:
                        s = line.split(",")
                        data.append(float(s[0]), float(s[1]))
                file.close()

            maxForceline = QLineSeries()
            maxForceline.setName("Maxiumum Force")
            maxForceline.append(0.0, self.currentteam[0].force())
            maxForceline.append(self.currentteam[0].samples,
                                self.currentteam[0].force())

            force_chart = QChart()
            force_chart.addSeries(data)
            force_chart.addSeries(maxForceline)
            force_chart.setToolTip("{}".format(self.maxforce))
            force_chart.setTitle("Force vs. Time Graph for {}".format(
                self.currentteam[0].name()))
            force_chart.createDefaultAxes()
            force_chart.axisY().setRange(0, self.currentteam[0].force() + 10)
            force_chart.setTheme(2)
            self.chartView = QChartView(force_chart)
            self.chartView.setRenderHint(QPainter.Antialiasing)
            # self.grid.removeWidget(self.chartView)
            self.grid.addWidget(self.chartView, 1, 1, 1, 5)
            print(self.grid.children())
            self.chartView.show()
            self.loadNewGraph = False

        QtCore.QTimer.singleShot(200, lambda: self.updateforce())
class PlayingMediaWidget(QWidget):

    def __init__(self, cue, **kwargs):
        super().__init__(**kwargs)

        self.cue = cue
        self.cue_time = CueTime(cue)
        self.cue_time.notify.connect(self._time_updated, Connection.QtQueued)

        self._dbmeter_element = None
        self._accurate_time = False

        scroll_size = (self.parent().verticalScrollBar().width() + 5)
        self.setGeometry(0, 0, self.parent().width() - scroll_size, 102)
        self.setFocusPolicy(Qt.NoFocus)

        self.gridLayoutWidget = QWidget(self)
        self.gridLayoutWidget.setGeometry(self.geometry())
        self.gridLayout = QGridLayout(self.gridLayoutWidget)
        self.gridLayout.setContentsMargins(2, 2, 2, 2)

        self.nameLabel = QLabel(self.gridLayoutWidget)
        self.nameLabel.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored)
        self.nameLabel.setText(cue.name)
        self.nameLabel.setToolTip(cue.name)
        self.gridLayout.addWidget(self.nameLabel, 0, 0, 1, 3)

        self.playPauseButton = QPushButton(self.gridLayoutWidget)
        self.playPauseButton.setSizePolicy(QSizePolicy.Ignored,
                                           QSizePolicy.Ignored)
        self.playPauseButton.setIcon(QIcon.fromTheme('media-playback-pause'))
        self.playPauseButton.setIconSize(QSize(24, 24))
        self.playPauseButton.setFocusPolicy(Qt.NoFocus)
        self.playPauseButton.clicked.connect(self._pause)
        self.gridLayout.addWidget(self.playPauseButton, 1, 0)

        self.stopButton = QPushButton(self.gridLayoutWidget)
        self.stopButton.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored)
        self.stopButton.setIcon(QIcon.fromTheme('media-playback-stop'))
        self.stopButton.setIconSize(QSize(24, 24))
        self.stopButton.setFocusPolicy(Qt.NoFocus)
        self.stopButton.clicked.connect(self._stop)
        self.gridLayout.addWidget(self.stopButton, 1, 1)

        self.timeDisplay = QLCDNumber(self.gridLayoutWidget)
        self.timeDisplay.setStyleSheet('background-color: transparent')
        self.timeDisplay.setSegmentStyle(QLCDNumber.Flat)
        self.timeDisplay.setDigitCount(8)
        self.timeDisplay.display(strtime(cue.media.duration))
        self.gridLayout.addWidget(self.timeDisplay, 1, 2)

        self.seekSlider = QClickSlider(self.gridLayoutWidget)
        self.seekSlider.setOrientation(Qt.Horizontal)
        self.seekSlider.setRange(0, cue.media.duration)
        self.seekSlider.setFocusPolicy(Qt.NoFocus)
        self.seekSlider.sliderMoved.connect(self._seek)
        self.seekSlider.sliderJumped.connect(self._seek)
        self.seekSlider.setVisible(False)

        self.dbmeter = QDbMeter(self.gridLayoutWidget)
        self.dbmeter.setVisible(False)

        self.gridLayout.setRowStretch(0, 1)
        self.gridLayout.setRowStretch(1, 2)
        self.gridLayout.setColumnStretch(0, 3)
        self.gridLayout.setColumnStretch(1, 3)
        self.gridLayout.setColumnStretch(2, 5)

        cue.changed('name').connect(self.name_changed)
        cue.media.changed('duration').connect(self.update_duration)
        cue.media.played.connect(self._pause_to_play)
        cue.media.paused.connect(self._play_to_pause)

        self.fade = self.cue.media.element('Fade')
        if self.fade is not None:
            self.fade.enter_fadein.connect(self.enter_fadein)
            self.fade.enter_fadeout.connect(self.enter_fadeout)
            self.fade.exit_fadein.connect(self.exit_fade)
            self.fade.exit_fadeout.connect(self.exit_fade)

    def enter_fadeout(self):
        p = self.timeDisplay.palette()
        p.setColor(p.Text, QColor(255, 50, 50))
        self.timeDisplay.setPalette(p)

    def enter_fadein(self):
        p = self.timeDisplay.palette()
        p.setColor(p.Text, QColor(0, 255, 0))
        self.timeDisplay.setPalette(p)

    def exit_fade(self):
        self.timeDisplay.setPalette(self.palette())

    def name_changed(self, name):
        self.nameLabel.setText(name)
        self.nameLabel.setToolTip(name)

    def set_accurate_time(self, enable):
        self._accurate_time = enable

    def set_seek_visible(self, visible):
        if visible and not self.seekSlider.isVisible():
            self.gridLayout.addWidget(self.seekSlider, 2, 0, 1, 3)
            self.gridLayout.setRowStretch(2, 1)
        elif not visible and self.seekSlider.isVisible():
            self.gridLayout.removeWidget(self.seekSlider)
            self.gridLayout.setRowStretch(2, 0)

        self.seekSlider.setVisible(visible)

    def set_dbmeter_visible(self, visible):
        if self._dbmeter_element is not None:
            self._dbmeter_element.level_ready.disconnect(self.dbmeter.plot)
            self._dbmeter_element = None

        if visible:
            self._dbmeter_element = self.cue.media.element('DbMeter')
            if self._dbmeter_element is not None:
                self._dbmeter_element.level_ready.connect(self.dbmeter.plot)

        # Add/Remove the QDbMeter in the layout
        if visible and not self.dbmeter.isVisible():
            self.gridLayout.addWidget(self.dbmeter, 0, 3, 4, 1)
            self.gridLayout.setColumnStretch(3, 1)
        elif not visible and self.dbmeter.isVisible():
            self.gridLayout.removeWidget(self.dbmeter)
            self.gridLayout.setColumnStretch(3, 0)

        self.dbmeter.setVisible(visible)

    def _time_updated(self, time):
        if not self.visibleRegion().isEmpty():
            # If the given value is the duration or < 0 set the time to 0
            if time == self.cue.media.duration or time < 0:
                time = 0

            # Set the value the seek slider
            self.seekSlider.setValue(time)

            # Show the time in the widget
            self.timeDisplay.display(strtime(self.cue.media.duration - time,
                                             accurate=self._accurate_time))

    def update_duration(self, media, duration):
        self.seekSlider.setMaximum(duration)

    def _stop(self, *args):
        self.cue.stop()

    def _play(self, *args):
        self.cue.start()

    def _pause(self, *args):
        self.cue.pause()

    def _seek(self, position):
        self.cue.media.seek(position)

    def _play_to_pause(self):
        self.playPauseButton.clicked.disconnect()
        self.playPauseButton.clicked.connect(self._play)
        self.playPauseButton.setIcon(QIcon.fromTheme('media-playback-start'))

    def _pause_to_play(self):
        self.playPauseButton.clicked.disconnect()
        self.playPauseButton.clicked.connect(self._pause)
        self.playPauseButton.setIcon(QIcon.fromTheme('media-playback-pause'))
Exemplo n.º 7
0
class PlayingMediaWidget(QWidget):

    def __init__(self, cue, media_time, parent=None):
        super().__init__(parent)

        self.cue = cue
        self.media_time = media_time

        self._dbmeter_element = None
        self._accurate_time = False

        scroll_size = (self.parent().verticalScrollBar().width() + 5)
        self.setGeometry(0, 0, self.parent().width() - scroll_size, 102)
        self.setFocusPolicy(Qt.NoFocus)

        self.gridLayoutWidget = QWidget(self)
        self.gridLayoutWidget.setGeometry(self.geometry())
        self.gridLayout = QGridLayout(self.gridLayoutWidget)
        self.gridLayout.setContentsMargins(2, 2, 2, 2)

        self.nameLabel = QLabel(self.gridLayoutWidget)
        self.nameLabel.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored)
        self.nameLabel.setText(cue['name'])
        self.nameLabel.setToolTip(cue['name'])
        self.gridLayout.addWidget(self.nameLabel, 0, 0, 1, 3)

        self.playPauseButton = QPushButton(self.gridLayoutWidget)
        self.playPauseButton.setSizePolicy(QSizePolicy.Ignored,
                                           QSizePolicy.Ignored)
        self.playPauseButton.setIcon(QIcon.fromTheme("media-playback-pause"))
        self.playPauseButton.setFocusPolicy(Qt.NoFocus)
        self.playPauseButton.clicked.connect(lambda: self.cue.media.pause())
        self.gridLayout.addWidget(self.playPauseButton, 1, 0)

        self.stopButton = QPushButton(self.gridLayoutWidget)
        self.stopButton.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored)
        self.stopButton.setIcon(QIcon.fromTheme("media-playback-stop"))
        self.stopButton.setFocusPolicy(Qt.NoFocus)
        self.stopButton.clicked.connect(lambda m: cue.media.stop())
        self.gridLayout.addWidget(self.stopButton, 1, 1)

        self.timeDisplay = QLCDNumber(self.gridLayoutWidget)
        self.timeDisplay.setSegmentStyle(QLCDNumber.Flat)
        self.timeDisplay.setDigitCount(8)
        self.timeDisplay.display(strtime(cue.media['duration']))
        self.gridLayout.addWidget(self.timeDisplay, 1, 2)

        self.seekSlider = QClickSlider(self.gridLayoutWidget)
        self.seekSlider.setOrientation(Qt.Horizontal)
        self.seekSlider.setRange(0, cue.media['duration'])
        self.seekSlider.setFocusPolicy(Qt.NoFocus)
        self.seekSlider.sliderMoved.connect(cue.media.seek)
        self.seekSlider.sliderJumped.connect(cue.media.seek)
        self.seekSlider.setVisible(False)

        self.dbmeter = QDbMeter(self.gridLayoutWidget)
        self.dbmeter.setVisible(False)

        self.gridLayout.setRowStretch(0, 1)
        self.gridLayout.setRowStretch(1, 2)
        self.gridLayout.setColumnStretch(0, 3)
        self.gridLayout.setColumnStretch(1, 3)
        self.gridLayout.setColumnStretch(2, 5)

        self.media_time.notify.connect(self.on_time_updated)

        cue.updated.connect(self.on_cue_updated)
        cue.media.duration.connect(self.update_duration)
        cue.media.played.connect(self._pause_to_play)
        cue.media.paused.connect(self._play_to_pause)

        self.fade = self.cue.media.element("Fade")
        if self.fade is not None:
            self.fade.enter_fadein.connect(self.enter_fadein)
            self.fade.enter_fadeout.connect(self.enter_fadeout)
            self.fade.exit_fadein.connect(self.exit_fade)
            self.fade.exit_fadeout.connect(self.exit_fade)

    def enter_fadeout(self):
        p = self.timeDisplay.palette()
        p.setColor(p.Text, QColor(255, 50, 50))
        self.timeDisplay.setPalette(p)

    def enter_fadein(self):
        p = self.timeDisplay.palette()
        p.setColor(p.Text, QColor(0, 255, 0))
        self.timeDisplay.setPalette(p)

    def exit_fade(self):
        self.timeDisplay.setPalette(self.palette())

    def on_cue_updated(self, cue):
        self.nameLabel.setText(cue['name'])
        self.nameLabel.setToolTip(cue['name'])

    def set_accurate_time(self, enable):
        self._accurate_time = enable

    def set_seek_visible(self, visible):
        if visible and not self.seekSlider.isVisible():
            self.gridLayout.addWidget(self.seekSlider, 2, 0, 1, 3)
            self.gridLayout.setRowStretch(2, 1)
        elif not visible and self.seekSlider.isVisible():
            self.gridLayout.removeWidget(self.seekSlider)
            self.gridLayout.setRowStretch(2, 0)

        self.seekSlider.setVisible(visible)

    def set_dbmeter_visible(self, visible):
        if self._dbmeter_element is not None:
            self._dbmeter_element.levelReady.disconnect(self.dbmeter.plot)
            self._dbmeter_element = None

        if visible:
            self._dbmeter_element = self.cue.media.element("DbMeter")
            if self._dbmeter_element is not None:
                self._dbmeter_element.levelReady.connect(self.dbmeter.plot)

        # Add/Remove the QDbMeter in the layout
        if visible and not self.dbmeter.isVisible():
            self.gridLayout.addWidget(self.dbmeter, 0, 3, 4, 1)
            self.gridLayout.setColumnStretch(3, 1)
        elif not visible and self.dbmeter.isVisible():
            self.gridLayout.removeWidget(self.dbmeter)
            self.gridLayout.setColumnStretch(3, 0)

        self.dbmeter.setVisible(visible)

    def on_time_updated(self, time):
        if not self.visibleRegion().isEmpty():
            # If the given value is the duration or < 0 set the time to 0
            if time == self.cue.media['duration'] or time < 0:
                time = 0

            # Set the value the seek slider
            self.seekSlider.setValue(time)

            # If in count-down mode the widget will show the remaining time
            time = self.cue.media['duration'] - time

            # Show the time in the widget
            self.timeDisplay.display(strtime(time,
                                             accurate=self._accurate_time))

    def update_duration(self, media, duration):
        self.seekSlider.setMaximum(duration)

    def _play_to_pause(self):
        self.playPauseButton.clicked.disconnect()
        self.playPauseButton.clicked.connect(lambda: self.cue.media.play())
        self.playPauseButton.setIcon(QIcon.fromTheme("media-playback-start"))

    def _pause_to_play(self):
        self.playPauseButton.clicked.disconnect()
        self.playPauseButton.clicked.connect(lambda: self.cue.media.pause())
        self.playPauseButton.setIcon(QIcon.fromTheme("media-playback-pause"))

    def destroy_widget(self):
        self.hide()
        self.set_dbmeter_visible(False)
        self.media_time.notify.disconnect(self.on_time_updated)

        if self.fade is not None:
            self.fade.enter_fadein.disconnect(self.enter_fadein)
            self.fade.enter_fadeout.disconnect(self.enter_fadeout)
            self.fade.exit_fadein.disconnect(self.exit_fade)
            self.fade.exit_fadeout.disconnect(self.exit_fade)

        self.cue.media.duration.disconnect(self.update_duration)
        self.cue.updated.disconnect(self.on_cue_updated)
Exemplo n.º 8
0
class timeDigitalWidget(QWidget):

    time = pyqtSignal()

    def __init__(self, winParent, Percentage):
        super(timeDigitalWidget, self).__init__()
        self.winParent = winParent
        self.seconds = 900
        self.pose3d = pose3d
        self.Percentage = Percentage
        self.show = False
        self.MAX_PERCENT = 30
        self.MAX_MARK = 10

        self.hLayout = QHBoxLayout()

        timeLabel = QLabel("Time")
        self.lcd = QLCDNumber(self)
        self.lcd.setMaximumSize(100, 50)
        self.hLayout.addWidget(timeLabel, 0)
        self.hLayout.addWidget(self.lcd, 1)

        hSpacer = QSpacerItem(300, 30, QSizePolicy.Ignored,
                              QSizePolicy.Ignored)
        self.hLayout.addItem(hSpacer)

        self.setLayout(self.hLayout)

        timer = QTimer(self)
        timer.start(1000)
        timer.timeout.connect(self.printTime)

        # get the palette
        palette = self.lcd.palette()

        # foreground color
        palette.setColor(palette.WindowText, QColor(85, 85, 255))
        # background color
        palette.setColor(palette.Background, QColor(0, 170, 255))
        # "light" border
        palette.setColor(palette.Light, QColor(255, 0, 0))
        # "dark" border
        palette.setColor(palette.Dark, QColor(0, 255, 0))

        # set the palette
        self.lcd.setPalette(palette)

    def showMark(self):
        self.show = True
        mark = self.testPercentage()
        markLabel = QLabel('Final mark: ' + str(mark))
        self.hLayout.addWidget(markLabel, 0)
        self.setLayout(self.hLayout)

    def printTime(self):

        if self.seconds > 0:
            self.seconds -= 1
        else:
            if not self.show:
                self.showMark()
        self.lcd.display(self.seconds)

    def testPercentage(self):
        pHouse = self.Percentage.calculatePercentage()
        markPerc = float(pHouse) * float(self.MAX_MARK) / float(
            self.MAX_PERCENT)
        if pHouse > self.MAX_PERCENT:
            markPerc = 10
        return markPerc
Exemplo n.º 9
0
class Objetives(QWidget):
    NumButtons = 3

    def __init__(self, parent=None):
        super(Objetives, self).__init__(parent)

        self.createDisplay()
        self.createDisplayAverage()
        self.createButtons()

        self.numVictory = 0
        self.numLosses = 0

        mainLayout = QGridLayout()
        mainLayout.addWidget(self.displayLCD)
        mainLayout.addWidget(self.horizontalGroupBox)
        mainLayout.addWidget(self.displayWinPercent)

        self.setLayout(mainLayout)

        self.setWindowTitle("Objetives")

    def createButtons(self):
        self.horizontalGroupBox = QGroupBox("")
        layout = QGridLayout()

        self.victoryButton = self.createButton("Victory", "+",self.addVictoryOrLosses)
        self.lossesButton = self.createButton("Losses", "+",self.addVictoryOrLosses)
        self.victoryDecreaseButton = self.createButton("DV","-",self.addVictoryOrLosses)
        self.losseDecreaseButton = self.createButton("DL","-",self.addVictoryOrLosses)

        self.lossesButton.setMinimumWidth(150)
        self.victoryButton.setMinimumWidth(150)

        self.losseDecreaseButton.setMaximumHeight(20)
        self.victoryDecreaseButton.setMaximumHeight(20)

        layout.addWidget(self.victoryButton, 0, 0, 1, 1)
        layout.addWidget(self.lossesButton, 0, 2, 1, 1)
        layout.addWidget(self.victoryDecreaseButton, 1, 0, 1, 1)
        layout.addWidget(self.losseDecreaseButton, 1, 2, 1, 1)

        self.horizontalGroupBox.setLayout(layout)

    def createDisplayAverage(self):
        self.displayWinPercent = QGroupBox("Wins")
        layout = QHBoxLayout()

        self.progressBar = QProgressBar()
        self.progressBar.setRange(0, 100)
        # self.progressBar.setValue(5000)

        layout.addWidget(self.progressBar)

        self.displayWinPercent.setLayout(layout)

    def createDisplay(self):
        self.displayLCD = QGroupBox("")
        layout = QHBoxLayout()

        paletteLosses = QPalette()
        paletteVictory = QPalette()

        paletteLosses.setColor(paletteLosses.WindowText, QColor(255, 000, 000))
        paletteVictory.setColor(paletteVictory.WindowText, QColor(000, 255, 000))

        self.lossesLcd = QLCDNumber(3)
        self.lossesLcd.setSegmentStyle(QLCDNumber.Filled)
        self.lossesLcd.setPalette(paletteLosses)

        self.victoryLcd = QLCDNumber(3)
        self.victoryLcd.setSegmentStyle(QLCDNumber.Filled)
        self.victoryLcd.setPalette(paletteVictory)

        self.lossesLcd.setMinimumHeight(100)
        self.victoryLcd.setMinimumHeight(100)

        self.lossesLcd.setMinimumWidth(150)
        self.victoryLcd.setMinimumWidth(150)

        layout.addWidget(self.victoryLcd)
        layout.addWidget(self.lossesLcd)

        self.displayLCD.setLayout(layout)

    def addVictoryOrLosses(self):
        clickedButton = self.sender()
        clickedOperator = clickedButton.text()
        operand = float(1)

        if clickedOperator == "Victory":
            self.numVictory = self.numVictory + 1
            self.victoryLcd.display(str(self.numVictory))

        if clickedOperator == "DV":
            self.numVictory = self.numVictory - 1
            self.victoryLcd.display(str(self.numVictory))

        if clickedOperator == "Losses":
            self.numLosses = self.numLosses + 1
            self.lossesLcd.display(str(self.numLosses))

        if clickedOperator == "DL":
            self.numLosses = self.numLosses - 1
            self.lossesLcd.display(str(self.numLosses))

        self.calculateAverage()

    def calculateAverage(self):
        total = self.numVictory + self.numLosses

        # self.progressBar.setValue((int(self.numVictory / total * 100)))
        self.progressBar.setValue(100)
        # self.victoryLcdAv.display(str(int(self.numVictory / total * 100)))
        # self.lossesLcdAv.display(str(int(self.numLosses / total * 100)))

    def createButton(self, text, op, member):
        button = Button(text,op)
        button.clicked.connect(member)
        return button
Exemplo n.º 10
0
class OverWatch(QWidget):
    update_sig = pyqtSignal(str)

    def __init__(self):
        super().__init__()
        self.timer = QTimer()
        self.timer.timeout.connect(self.collDat)
        self.timer.start(2000)
        self.collectData = DataCollect(self.update_sig)
        self.update_sig.connect(self.update)
        self.inrec = []
        self.dsb1 = []
        self.dsb2 = []
        self.dsb3 = []
        self.initUI()

    def initUI(self):

        hbox = QHBoxLayout()

        # tH is the house temperature panel
        tH = QFrame(self)
        tH.setFrameShape(QFrame.StyledPanel)
        tHvbox = QGridLayout()
        tHvbox.addWidget(QLabel('Inside'), 1, 1, 1, 2)
        tHvbox.addWidget(QLabel('Outside'), 1, 3, 1, 2)
        tHvbox.addWidget(QLabel('Temp:'), 2, 0)
        tHvbox.addWidget(QLabel('C'), 2, 2)
        tHvbox.addWidget(QLabel('C'), 2, 4)
        tHvbox.addWidget(QLabel('Humidity:'), 3, 0)
        tHvbox.addWidget(QLabel('%'), 3, 2)
        tHvbox.addWidget(QLabel('%'), 3, 4)
        self.outTemp = QLCDNumber()
        self.inTemp = QLCDNumber()
        self.outHD = QLCDNumber()
        self.inHD = QLCDNumber()
        # get the palette
        palette = self.inTemp.palette()
        # palette.setColor(palette.Window, QtGui.QColor(255, 0, 0))
        palette.setColor(palette.Light, QtGui.QColor(0, 0, 0))
        palette.setColor(palette.Dark, QtGui.QColor(0, 0, 0))
        self.inTemp.setPalette(palette)
        self.outTemp.setPalette(palette)
        self.inHD.setPalette(palette)
        self.outHD.setPalette(palette)

        tHvbox.addWidget(self.outTemp, 2, 3, 1, 1)
        tHvbox.addWidget(self.inTemp, 2, 1, 1, 1)
        tHvbox.addWidget(self.outHD, 3, 3, 1, 1)
        tHvbox.addWidget(self.inHD, 3, 1, 1, 1)
        self.tPlot = PlotWidget()
        tHvbox.addWidget(self.tPlot, 4, 0, 4, 5)
        self.weekbt = QPushButton('Week')
        self.monthbt = QPushButton('Month')
        tHvbox.addWidget(self.weekbt, 8, 0)
        tHvbox.addWidget(self.monthbt, 8, 1)
        self.pBar = QProgressBar()
        self.pBar.setOrientation(Qt.Vertical)
        tHvbox.addWidget(self.pBar, 4, 6)
        self.pBar.setRange(950, 1050)

        tH.setLayout(tHvbox)

        tr = QFrame(self)
        tr.setFrameShape(QFrame.StyledPanel)

        bt = QFrame(self)
        bt.setFrameShape(QFrame.StyledPanel)

        split1 = QSplitter(Qt.Horizontal)
        split1.addWidget(bt)
        split1.addWidget(tr)

        split2 = QSplitter(Qt.Vertical)
        split2.addWidget(tH)
        split2.addWidget(split1)
        hbox.addWidget(split2)
        self.tPlot.plot(self.inrec, pen=None, symbol='x')
        self.setLayout(hbox)
        self.setGeometry(300, 300, 800, 600)
        self.setWindowTitle('OverWatch')
        self.show()
        self.collDat()

    def collDat(self):
        """ collect values """
        self.collectData.start()

    def update(self, dat):
        """ Update the plot """
        data = dict([[v.split(':')[0], float(v.split(':')[1])]
                     for v in dat.split(',')])
        self.inTemp.display(data['InTemp'])
        self.outTemp.display(data['DSB1'])
        self.inHD.display(data['InHD'])
        self.outHD.display(data['DSB2'])
        self.pBar.setValue(int(data['Press']) * 10)
        self.inrec.append(data['InTemp'])
        self.dsb1.append(data['DSB1'])
        self.dsb2.append(data['DSB2'])
        self.dsb3.append(data['DSB3'])
        self.tPlot.plot(self.inrec, symbol='x')
        self.tPlot.plot(self.dsb1, symbol='o')
        self.tPlot.plot(self.dsb2, symbol='o')
        self.tPlot.plot(self.dsb3, symbol='o')
Exemplo n.º 11
0
class RunningCueWidget(QWidget):
    def __init__(self, cue, **kwargs):
        super().__init__(**kwargs)
        self.setGeometry(0, 0, self.parent().viewport().width(), 80)
        self.setFocusPolicy(Qt.NoFocus)
        self.setLayout(QHBoxLayout(self))
        self.layout().setContentsMargins(0, 0, 0, 1)

        self._accurate_time = False

        self.cue = cue
        self.cue_time = CueTime(cue)
        self.cue_time.notify.connect(self._time_updated, Connection.QtQueued)

        # Use this to avoid transparent background
        self.gridLayoutWidget = QWidget(self)
        self.gridLayout = QGridLayout(self.gridLayoutWidget)
        self.gridLayout.setContentsMargins(3, 3, 3, 3)
        self.gridLayout.setSpacing(2)
        self.layout().addWidget(self.gridLayoutWidget)

        self.nameLabel = QLabel(self.gridLayoutWidget)
        self.nameLabel.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored)
        self.nameLabel.setText(cue.name)
        self.nameLabel.setToolTip(cue.name)
        self.gridLayout.addWidget(self.nameLabel, 0, 0, 1, 2)

        self.controlButtons = CueControlButtons(parent=self.gridLayoutWidget)
        self.gridLayout.addWidget(self.controlButtons, 1, 0)

        if CueAction.Stop in cue.CueActions:
            self.controlButtons.stopButton.clicked.connect(self._stop)
        else:
            self.controlButtons.stopButton.setEnabled(False)
        if CueAction.Pause in cue.CueActions:
            self.controlButtons.pauseButton.clicked.connect(self._pause)
            self.controlButtons.startButton.clicked.connect(self._resume)
        else:
            self.controlButtons.pauseButton.setEnabled(False)
            self.controlButtons.startButton.setEnabled(False)
        if CueAction.FadeIn in cue.CueActions:
            self.controlButtons.fadeInButton.clicked.connect(self._fadein)
        else:
            self.controlButtons.fadeInButton.setEnabled(False)
        if CueAction.FadeOut in cue.CueActions:
            self.controlButtons.fadeOutButton.clicked.connect(self._fadeout)
        else:
            self.controlButtons.fadeOutButton.setEnabled(False)
        if CueAction.Interrupt in cue.CueActions:
            self.controlButtons.interruptButton.clicked.connect(
                self._interrupt)
        else:
            self.controlButtons.interruptButton.setEnabled(False)

        self.timeDisplay = QLCDNumber(self.gridLayoutWidget)
        self.timeDisplay.setStyleSheet('background-color: transparent')
        self.timeDisplay.setSegmentStyle(QLCDNumber.Flat)
        self.timeDisplay.setDigitCount(8)
        self.timeDisplay.display(strtime(cue.duration))
        self.gridLayout.addWidget(self.timeDisplay, 1, 1)

        self.gridLayout.setRowStretch(0, 1)
        self.gridLayout.setRowStretch(1, 3)
        self.gridLayout.setColumnStretch(0, 7)
        self.gridLayout.setColumnStretch(1, 5)

        cue.changed('name').connect(self.name_changed, Connection.QtQueued)
        cue.started.connect(self.controlButtons.pauseMode, Connection.QtQueued)
        cue.paused.connect(self.controlButtons.startMode, Connection.QtQueued)

        # Fade enter/exit
        cue.fadein_start.connect(self.enter_fadein, Connection.QtQueued)
        cue.fadein_end.connect(self.exit_fade, Connection.QtQueued)
        cue.fadeout_start.connect(self.enter_fadeout, Connection.QtQueued)
        cue.fadeout_end.connect(self.exit_fade, Connection.QtQueued)

    def enter_fadein(self):
        p = self.timeDisplay.palette()
        p.setColor(p.Text, QColor(0, 255, 0))
        self.timeDisplay.setPalette(p)

    def enter_fadeout(self):
        p = self.timeDisplay.palette()
        p.setColor(p.Text, QColor(255, 50, 50))
        self.timeDisplay.setPalette(p)

    def exit_fade(self):
        self.timeDisplay.setPalette(self.palette())

    def name_changed(self, name):
        self.nameLabel.setText(name)
        self.nameLabel.setToolTip(name)

    def set_accurate_time(self, enable):
        self._accurate_time = enable

    def _time_updated(self, time):
        if not self.visibleRegion().isEmpty():
            # If the given value is the duration or < 0 set the time to 0
            if time == self.cue.duration or time < 0:
                time = 0

            self._update_timers(time)

    def _update_timers(self, time):
        self.timeDisplay.display(
            strtime(self.cue.duration - time, accurate=self._accurate_time))

    def _pause(self):
        self.cue.pause(fade=config['ListLayout'].getboolean('PauseCueFade'))

    def _resume(self):
        self.cue.restart(fade=config['ListLayout'].getboolean('ResumeCueFade'))

    def _stop(self):
        self.cue.stop(fade=config['ListLayout'].getboolean('StopCueFade'))

    def _interrupt(self):
        self.cue.interrupt(
            fade=config['ListLayout'].getboolean('InterruptCueFade'))

    def _fadeout(self):
        self.cue.execute(CueAction.FadeOut)

    def _fadein(self):
        self.cue.execute(CueAction.FadeIn)
Exemplo n.º 12
0
class CueWidget(QWidget):
    ICON_SIZE = 14
    SLIDER_RANGE = 1000

    context_menu_request = pyqtSignal(object, QPoint)
    edit_request = pyqtSignal(object)
    cue_executed = pyqtSignal(object)

    def __init__(self, cue, **kwargs):
        super().__init__(**kwargs)
        self.cue = None

        self._selected = False
        self._accurate_timing = False
        self._show_dbmeter = False
        self._show_volume = False
        self._countdown_mode = True

        self._dbmeter_element = None
        self._fade_element = None
        self._volume_element = None

        self.setAttribute(Qt.WA_TranslucentBackground)
        self.setLayout(QGridLayout())

        self.layout().setContentsMargins(0, 0, 0, 0)
        self.layout().setSpacing(2)
        self.layout().setColumnStretch(0, 6)
        self.layout().setRowStretch(0, 4)

        self.nameButton = QClickLabel(self)
        self.nameButton.setObjectName('ButtonCueWidget')
        self.nameButton.setWordWrap(True)
        self.nameButton.setAlignment(Qt.AlignCenter)
        self.nameButton.setFocusPolicy(Qt.NoFocus)
        self.nameButton.clicked.connect(self._clicked)
        self.nameButton.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored)
        self.layout().addWidget(self.nameButton, 0, 0)

        self.statusIcon = QLabel(self.nameButton)
        self.statusIcon.setStyleSheet('background-color: transparent')
        self.statusIcon.setPixmap(
            pixmap_from_icon('led-off', CueWidget.ICON_SIZE))

        self.seekSlider = QClickSlider(self.nameButton)
        self.seekSlider.setOrientation(Qt.Horizontal)
        self.seekSlider.setFocusPolicy(Qt.NoFocus)
        self.seekSlider.setVisible(False)

        self.volumeSlider = QClickSlider(self.nameButton)
        self.volumeSlider.setObjectName('VolumeSlider')
        self.volumeSlider.setOrientation(Qt.Vertical)
        self.volumeSlider.setFocusPolicy(Qt.NoFocus)
        self.volumeSlider.setRange(0, CueWidget.SLIDER_RANGE)
        self.volumeSlider.setPageStep(10)
        self.volumeSlider.valueChanged.connect(
            self._change_volume, Qt.DirectConnection)
        self.volumeSlider.setVisible(False)

        self.dbMeter = QDbMeter(self)
        self.dbMeter.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored)
        self.dbMeter.setVisible(False)

        self.timeBar = QProgressBar(self)
        self.timeBar.setTextVisible(False)
        self.timeBar.setLayout(QHBoxLayout())
        self.timeBar.layout().setContentsMargins(0, 0, 0, 0)
        self.timeDisplay = QLCDNumber(self.timeBar)
        self.timeDisplay.setStyleSheet('background-color: transparent')
        self.timeDisplay.setSegmentStyle(QLCDNumber.Flat)
        self.timeDisplay.setDigitCount(8)
        self.timeDisplay.display('00:00:00')
        self.timeBar.layout().addWidget(self.timeDisplay)
        self.timeBar.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored)
        self.timeBar.setVisible(False)

        self._set_cue(cue)

    @property
    def selected(self):
        return self._selected

    @selected.setter
    def selected(self, value):
        self._selected = value
        self._update_style(self.cue.stylesheet)

    def contextMenuEvent(self, event):
        self.context_menu_request.emit(self, event.globalPos())

    def mouseMoveEvent(self, event):
        if (event.buttons() == Qt.LeftButton and
                (event.modifiers() == Qt.ControlModifier or
                         event.modifiers() == Qt.ShiftModifier)):
            mime_data = QMimeData()
            mime_data.setText(PageWidget.DRAG_MAGIC)

            drag = QDrag(self)
            drag.setMimeData(mime_data)
            drag.setPixmap(self.grab(self.rect()))

            if event.modifiers() == Qt.ControlModifier:
                drag.exec_(Qt.MoveAction)
            else:
                drag.exec_(Qt.CopyAction)

            event.accept()
        else:
            event.ignore()

    def set_countdown_mode(self, mode):
        self._countdown_mode = mode
        self._update_time(self.cue.current_time())

    def set_accurate_timing(self, enable):
        self._accurate_timing = enable
        if self.cue.state & CueState.Pause:
            self._update_time(self.cue.current_time(), True)
        elif not self.cue.state & CueState.Running:
            self._update_duration(self.cue.duration)

    def show_seek_slider(self, visible):
        if isinstance(self.cue, MediaCue):
            self.seekSlider.setVisible(visible)
            self.update()

    def show_dbmeters(self, visible):
        if isinstance(self.cue, MediaCue):
            self._show_dbmeter = visible

            if self._dbmeter_element is not None:
                self._dbmeter_element.level_ready.disconnect(self.dbMeter.plot)
                self._dbmeter_element = None

            if visible:
                self._dbmeter_element = self.cue.media.element('DbMeter')
                if self._dbmeter_element is not None:
                    self._dbmeter_element.level_ready.connect(self.dbMeter.plot)

                self.layout().addWidget(self.dbMeter, 0, 2)
                self.layout().setColumnStretch(2, 1)
                self.dbMeter.show()
            else:
                self.layout().removeWidget(self.dbMeter)
                self.layout().setColumnStretch(2, 0)
                self.dbMeter.hide()

            self.update()

    def show_volume_slider(self, visible):
        if isinstance(self.cue, MediaCue):
            self._show_volume = visible

            if self._volume_element is not None:
                self._volume_element.changed('volume').disconnect(
                    self.reset_volume)
                self._volume_element = None

            if visible:
                self.volumeSlider.setEnabled(self.cue.state & CueState.Running)
                self._volume_element = self.cue.media.element('Volume')
                if self._volume_element is not None:
                    self.reset_volume()
                    self._volume_element.changed('volume').connect(
                        self.reset_volume,
                        Connection.QtQueued)

                self.layout().addWidget(self.volumeSlider, 0, 1)
                self.layout().setColumnStretch(1, 1)
                self.volumeSlider.show()
            else:
                self.layout().removeWidget(self.volumeSlider)
                self.layout().setColumnStretch(1, 0)
                self.volumeSlider.hide()

            self.update()

    def reset_volume(self):
        if self._volume_element is not None:
            self.volumeSlider.setValue(round(fader_to_slider(
                self._volume_element.volume) * CueWidget.SLIDER_RANGE))

    def _set_cue(self, cue):
        self.cue = cue

        # Cue properties changes
        self.cue.changed('name').connect(
            self._update_name, Connection.QtQueued)
        self.cue.changed('stylesheet').connect(
            self._update_style, Connection.QtQueued)
        self.cue.changed('duration').connect(
            self._update_duration, Connection.QtQueued)
        self.cue.changed('description').connect(
            self._update_description, Connection.QtQueued)

        # Fade enter/exit
        self.cue.fadein_start.connect(self._enter_fadein, Connection.QtQueued)
        self.cue.fadein_end.connect(self._exit_fade, Connection.QtQueued)
        self.cue.fadeout_start.connect(self._enter_fadeout, Connection.QtQueued)
        self.cue.fadeout_end.connect(self._exit_fade, Connection.QtQueued)

        # Cue status changed
        self.cue.interrupted.connect(self._status_stopped, Connection.QtQueued)
        self.cue.started.connect(self._status_playing, Connection.QtQueued)
        self.cue.stopped.connect(self._status_stopped, Connection.QtQueued)
        self.cue.paused.connect(self._status_paused, Connection.QtQueued)
        self.cue.error.connect(self._status_error, Connection.QtQueued)
        self.cue.end.connect(self._status_stopped, Connection.QtQueued)

        # DbMeter connections
        if isinstance(cue, MediaCue):
            self.cue.media.elements_changed.connect(
                self._media_updated, Connection.QtQueued)

            self.cue.paused.connect(self.dbMeter.reset, Connection.QtQueued)
            self.cue.stopped.connect(self.dbMeter.reset, Connection.QtQueued)
            self.cue.end.connect(self.dbMeter.reset, Connection.QtQueued)
            self.cue.error.connect(self.dbMeter.reset, Connection.QtQueued)

            self.seekSlider.sliderMoved.connect(self.cue.media.seek)
            self.seekSlider.sliderJumped.connect(self.cue.media.seek)

        self._cue_time = CueTime(self.cue)
        self._cue_time.notify.connect(self._update_time, Connection.QtQueued)

        self._update_name(cue.name)
        self._update_style(cue.stylesheet)
        self._update_duration(self.cue.duration)

    def _media_updated(self):
        self.show_dbmeters(self._show_dbmeter)
        self.show_volume_slider(self._show_volume)

    def _update_name(self, name):
        self.nameButton.setText(name)

    def _update_description(self, description):
        self.nameButton.setToolTip(description)

    def _change_volume(self, new_volume):
        self._volume_element.current_volume = slider_to_fader(
            new_volume / CueWidget.SLIDER_RANGE)

    def _clicked(self, event):
        if not (self.seekSlider.geometry().contains(event.pos()) and
                    self.seekSlider.isVisible()):
            if event.button() != Qt.RightButton:
                if event.modifiers() == Qt.ShiftModifier:
                    self.edit_request.emit(self.cue)
                elif event.modifiers() == Qt.ControlModifier:
                    self.selected = not self.selected
                else:
                    self.cue_executed.emit(self.cue)
                    self.cue.execute()

    def _update_style(self, stylesheet):
        stylesheet += 'text-decoration: underline;' if self.selected else ''
        self.nameButton.setStyleSheet(stylesheet)

    def _enter_fadein(self):
        p = self.timeDisplay.palette()
        p.setColor(p.WindowText, QColor(0, 255, 0))
        self.timeDisplay.setPalette(p)

    def _enter_fadeout(self):
        p = self.timeDisplay.palette()
        p.setColor(p.WindowText, QColor(255, 50, 50))
        self.timeDisplay.setPalette(p)

    def _exit_fade(self):
        self.timeDisplay.setPalette(self.timeBar.palette())

    def _status_stopped(self):
        self.statusIcon.setPixmap(
            pixmap_from_icon('led-off', CueWidget.ICON_SIZE))
        self.volumeSlider.setEnabled(False)
        self._update_time(0, True)
        self.reset_volume()

    def _status_playing(self):
        self.statusIcon.setPixmap(
            pixmap_from_icon('led-running', CueWidget.ICON_SIZE))
        self.volumeSlider.setEnabled(True)

    def _status_paused(self):
        self.statusIcon.setPixmap(
            pixmap_from_icon('led-pause', CueWidget.ICON_SIZE))
        self.volumeSlider.setEnabled(False)

    def _status_error(self, cue, error, details):
        self.statusIcon.setPixmap(
            pixmap_from_icon('led-error', CueWidget.ICON_SIZE))
        self.volumeSlider.setEnabled(False)
        self.reset_volume()

        QDetailedMessageBox.dcritical(self.cue.name, error, details)

    def _update_duration(self, duration):
        # Update the maximum values of seek-slider and time progress-bar
        if duration > 0:
            if not self.timeBar.isVisible():
                self.layout().addWidget(self.timeBar, 1, 0, 1, 3)
                self.layout().setRowStretch(1, 1)
                self.timeBar.show()
            self.timeBar.setMaximum(duration)
            self.seekSlider.setMaximum(duration)
        else:
            self.timeBar.hide()
            self.layout().setRowStretch(1, 0)

        if not self.cue.state & CueState.Running:
            self._update_time(duration, True)

    def _update_time(self, time, ignore_visibility=False):
        if ignore_visibility or not self.visibleRegion().isEmpty():
            # If the given value is the duration or < 0 set the time to 0
            if time == self.cue.duration or time < 0:
                time = 0

            # Set the value the seek slider
            self.seekSlider.setValue(time)

            # If in count-down mode the widget will show the remaining time
            if self._countdown_mode:
                time = self.cue.duration - time

            # Set the value of the timer progress-bar
            if self.cue.duration > 0:
                self.timeBar.setValue(time)

            # Show the time in the widget
            self.timeDisplay.display(
                strtime(time, accurate=self._accurate_timing))

    def resizeEvent(self, event):
        self.update()

    def update(self):
        super().update()
        self.layout().activate()

        s_width = self.nameButton.width() - 8
        s_height = self.seekSlider.height()
        s_ypos = self.nameButton.height() - s_height

        self.seekSlider.setGeometry(4, s_ypos, s_width, s_height)
        self.statusIcon.setGeometry(4, 4,
                                    CueWidget.ICON_SIZE,
                                    CueWidget.ICON_SIZE)
Exemplo n.º 13
0
class PlayingMediaWidget(QWidget):
    def __init__(self, cue, **kwargs):
        super().__init__(**kwargs)
        self.setFocusPolicy(Qt.NoFocus)
        self.setGeometry(0, 0, self.parent().viewport().width(), 110)

        self.cue = cue
        self.cue_time = CueTime(cue)
        self.cue_time.notify.connect(self._time_updated, Connection.QtQueued)

        self._dbmeter_element = None
        self._accurate_time = False

        self.gridLayoutWidget = QWidget(self)
        self.gridLayoutWidget.setGeometry(self.geometry())
        self.gridLayout = QGridLayout(self.gridLayoutWidget)
        self.gridLayout.setContentsMargins(3, 3, 3, 3)
        self.gridLayout.setSpacing(2)

        self.nameLabel = QLabel(self.gridLayoutWidget)
        self.nameLabel.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored)
        self.nameLabel.setText(cue.name)
        self.nameLabel.setToolTip(cue.name)
        self.gridLayout.addWidget(self.nameLabel, 0, 0, 1, 2)

        self.controlButtons = CueControlButtons(parent=self.gridLayoutWidget)
        self.controlButtons.stopButton.clicked.connect(self._stop)
        self.controlButtons.pauseButton.clicked.connect(self._pause)
        self.controlButtons.startButton.clicked.connect(self._start)
        self.controlButtons.fadeInButton.clicked.connect(self._fadein)
        self.controlButtons.fadeOutButton.clicked.connect(self._fadeout)
        self.controlButtons.interruptButton.clicked.connect(self._interrupt)
        self.gridLayout.addWidget(self.controlButtons, 1, 0)

        self.timeDisplay = QLCDNumber(self.gridLayoutWidget)
        self.timeDisplay.setStyleSheet('background-color: transparent')
        self.timeDisplay.setSegmentStyle(QLCDNumber.Flat)
        self.timeDisplay.setDigitCount(8)
        self.timeDisplay.display(strtime(cue.media.duration))
        self.gridLayout.addWidget(self.timeDisplay, 1, 1)

        self.seekSlider = QClickSlider(self.gridLayoutWidget)
        self.seekSlider.setOrientation(Qt.Horizontal)
        self.seekSlider.setRange(0, cue.media.duration)
        self.seekSlider.setFocusPolicy(Qt.NoFocus)
        self.seekSlider.sliderMoved.connect(self._seek)
        self.seekSlider.sliderJumped.connect(self._seek)
        self.seekSlider.setVisible(False)

        self.dbmeter = QDbMeter(self.gridLayoutWidget)
        self.dbmeter.setVisible(False)

        self.gridLayout.setRowStretch(0, 1)
        self.gridLayout.setRowStretch(1, 3)
        self.gridLayout.setColumnStretch(0, 7)
        self.gridLayout.setColumnStretch(1, 5)

        cue.changed('name').connect(self.name_changed)
        cue.changed('duration').connect(self.update_duration)
        cue.started.connect(self.controlButtons.pauseMode)
        cue.paused.connect(self.controlButtons.startMode)

        # Fade enter/exit
        cue.fadein_start.connect(self.enter_fadein, Connection.QtQueued)
        cue.fadein_end.connect(self.exit_fade, Connection.QtQueued)
        cue.fadeout_start.connect(self.enter_fadeout, Connection.QtQueued)
        cue.fadeout_end.connect(self.exit_fade, Connection.QtQueued)

    def enter_fadein(self):
        p = self.timeDisplay.palette()
        p.setColor(p.Text, QColor(0, 255, 0))
        self.timeDisplay.setPalette(p)

    def enter_fadeout(self):
        p = self.timeDisplay.palette()
        p.setColor(p.Text, QColor(255, 50, 50))
        self.timeDisplay.setPalette(p)

    def exit_fade(self):
        self.timeDisplay.setPalette(self.palette())

    def name_changed(self, name):
        self.nameLabel.setText(name)
        self.nameLabel.setToolTip(name)

    def set_accurate_time(self, enable):
        self._accurate_time = enable

    def set_seek_visible(self, visible):
        if visible and not self.seekSlider.isVisible():
            self.gridLayout.addWidget(self.seekSlider, 2, 0, 1, 2)
            self.gridLayout.setRowStretch(2, 1)
        elif not visible and self.seekSlider.isVisible():
            self.gridLayout.removeWidget(self.seekSlider)
            self.gridLayout.setRowStretch(2, 0)

        self.seekSlider.setVisible(visible)

    def set_dbmeter_visible(self, visible):
        if self._dbmeter_element is not None:
            self._dbmeter_element.level_ready.disconnect(self.dbmeter.plot)
            self._dbmeter_element = None

        if visible:
            self._dbmeter_element = self.cue.media.element('DbMeter')
            if self._dbmeter_element is not None:
                self._dbmeter_element.level_ready.connect(self.dbmeter.plot)

        # Add/Remove the QDbMeter in the layout
        if visible and not self.dbmeter.isVisible():
            self.gridLayout.addWidget(self.dbmeter, 0, 2, 3, 1)
            self.gridLayout.setColumnStretch(2, 1)
        elif not visible and self.dbmeter.isVisible():
            self.gridLayout.removeWidget(self.dbmeter)
            self.gridLayout.setColumnStretch(2, 0)

        self.dbmeter.setVisible(visible)

    def _time_updated(self, time):
        if not self.visibleRegion().isEmpty():
            # If the given value is the duration or < 0 set the time to 0
            if time == self.cue.media.duration or time < 0:
                time = 0

            # Set the value the seek slider
            self.seekSlider.setValue(time)

            # Show the time in the widget
            self.timeDisplay.display(
                strtime(self.cue.media.duration - time,
                        accurate=self._accurate_time))

    def update_duration(self, duration):
        self.seekSlider.setMaximum(duration)

    def _pause(self):
        self.cue.pause(fade=config['ListLayout'].getboolean('PauseCueFade'))

    def _start(self):
        self.cue.start(fade=config['ListLayout'].getboolean('RestartCueFade'))

    def _stop(self):
        self.cue.stop(fade=config['ListLayout'].getboolean('StopCueFade'))

    def _interrupt(self):
        self.cue.interrupt(
            fade=config['ListLayout'].getboolean('InterruptCueFade'))

    def _fadeout(self):
        self.cue.fadeout(config['ListLayout'].getfloat('CueFadeDuration'),
                         FadeOutType[config['ListLayout'].get('CueFadeType')])

    def _fadein(self):
        self.cue.fadein(config['ListLayout'].getfloat('CueFadeDuration'),
                        FadeInType[config['ListLayout'].get('CueFadeType')])

    def _seek(self, position):
        self.cue.media.seek(position)
Exemplo n.º 14
0
class MainWindow(QMainWindow):
    def __init__(self):

        super().__init__()

        self.left = 10
        self.top = 10
        self.title = 'Rodent Vitals Monitoring Software'
        self.width = 700
        self.height = 500
        self.model = []

        #Matplotlib graphs

        self.lbl = PlotCanvas()

        #LCDs for numerical vital monitoring

        self.lcd_BR = QLCDNumber(self)
        self.lcd_HR = QLCDNumber(self)
        self.lcd_TEMP = QLCDNumber(self)

        self.control = PID()
        self.control.setPoint(set_point=35)

        print("Initializing MainWindow")

        if not os.path.isdir(
                '/home/pi/Documents/MouseVitalMonitoring/Voltage Data'):
            os.mkdir('/home/pi/Documents/MouseVitalMonitoring/Voltage Data')

        if not os.path.isdir(
                '/home/pi/Documents/MouseVitalMonitoring/Vital Data'):
            os.mkdir('/home/pi/Documents/MouseVitalMonitoring/Vital Data')

        GPIO.output(33, 1)

        self.initUI()

    def initUI(self):

        # Set Main Window Geometry and Title

        self.setGeometry(self.left, self.top, self.width, self.height)
        self.setWindowTitle(self.title)

        #LCDs for numerical vital monitoring

        self.lcd_BR.setSegmentStyle(QLCDNumber.Flat)
        paletteBR = self.lcd_BR.palette()
        paletteBR.setColor(paletteBR.WindowText, QtGui.QColor(85, 85, 240))
        self.lcd_BR.setPalette(paletteBR)
        self.lcd_BR.display(58)

        self.lcd_HR.setSegmentStyle(QLCDNumber.Flat)
        paletteHR = self.lcd_HR.palette()
        paletteHR.setColor(paletteHR.WindowText, QtGui.QColor(85, 255, 85))
        self.lcd_HR.setPalette(paletteHR)
        self.lcd_HR.display(287)

        self.lcd_TEMP.setSegmentStyle(QLCDNumber.Flat)
        paletteTEMP = self.lcd_TEMP.palette()
        paletteTEMP.setColor(paletteTEMP.WindowText, QtGui.QColor(255, 85, 85))
        self.lcd_TEMP.setPalette(paletteTEMP)
        self.lcd_TEMP.display(17)

        #Labels for vitals

        BRlabel = QLabel('Breathing Rate (breaths/min)')
        HRlabel = QLabel('Heart Rate (beats/min)')
        TEMPlabel = QLabel('Subject Temperature (Celsius)')

        #Setting up Frame Layout

        wid = QWidget(self)
        self.setCentralWidget(wid)

        box = QHBoxLayout(self)

        #Boxes for LCD vitals

        box_HRLCD = QHBoxLayout(self)
        box_BRLCD = QHBoxLayout(self)
        box_TEMPLCD = QHBoxLayout(self)

        box_HRLCD.addWidget(self.lcd_HR)
        box_BRLCD.addWidget(self.lcd_BR)
        box_TEMPLCD.addWidget(self.lcd_TEMP)

        box_graph = QHBoxLayout(self)

        box_graph.addWidget(self.lbl)

        left = QFrame(self)
        left.setFrameShape(QFrame.Box)

        topright = QFrame(self)
        topright.setFrameShape(QFrame.Box)

        middleright = QFrame(self)
        middleright.setFrameShape(QFrame.Box)

        bottomright = QFrame(self)
        bottomright.setFrameShape(QFrame.Box)

        left.setLayout(box_graph)
        topright.setLayout(box_HRLCD)

        middleright.setLayout(box_BRLCD)

        bottomright.setLayout(box_TEMPLCD)

        # Splitting frames and adding layout to window

        splitter1 = QSplitter(Qt.Vertical)
        splitter1.addWidget(topright)
        splitter1.addWidget(middleright)

        splitter2 = QSplitter(Qt.Vertical)
        splitter2.addWidget(splitter1)
        splitter2.addWidget(bottomright)

        splitter3 = QSplitter(Qt.Horizontal)
        splitter3.addWidget(left)
        splitter3.addWidget(splitter2)

        box.addWidget(splitter3)
        wid.setLayout(box)

        menubar = self.menuBar()
        fileMenu = menubar.addMenu('File')
        recordingMenu = menubar.addMenu('Recording Options')

        self.statusbar = self.statusBar()
        self.statusbar.showMessage('Ready')

        changeWindowSize = QAction('Change Window Size', self)
        changeWindowSize.triggered.connect(lambda: self.windowSizeInput())

        resetWindow = QAction('Reset Window to Present', self)
        resetWindow.triggered.connect(lambda: self.windowReset())

        recordingMenu.addAction(changeWindowSize)
        recordingMenu.addAction(resetWindow)

        fileMenu.addAction(newAct)
        fileMenu.addMenu(impMenu)
        fileMenu.addMenu(expMenu)
        fileMenu.addMenu(recordingMenu)

        #Making the status bar

        viewStatAct = QAction('View statusbar', self, checkable=True)
        viewStatAct.setStatusTip('View statusbar')
        viewStatAct.setChecked(True)
        viewStatAct.triggered.connect(self.toggleMenu)
        viewMenu.addAction(viewStatAct)

        #Making the toolbar

        exitAct = QAction(QIcon('cancel-512.png'), 'Exit', self)
        exitAct.triggered.connect(lambda: self.Close())

        exportAct = QAction(QIcon('200px-Love_Heart_SVG.svg.png'),
                            'Export Vitals', self)
        exportAct.triggered.connect(lambda: self.writeRealCsv())

        exportRawAct = QAction(QIcon('LVtemp0360812798988.png'),
                               'Export Raw Data', self)
        exportRawAct.triggered.connect(lambda: self.writeVoltageCsv())

        startAct = QAction(QIcon('graphs icon.png'), 'Start Graphs', self)
        startAct.triggered.connect(
            lambda: self.lbl.plot(lcd_HR=self.lcd_HR,
                                  lcd_BR=self.lcd_BR,
                                  lcd_TEMP=self.lcd_TEMP,
                                  control=self.control))

        heatAct = QAction(QIcon('temperature icon.png'), 'Start Temperature',
                          self)
        heatAct.triggered.connect(lambda: self.tempControl())

        vitalsAct = QAction(QIcon('vitals icon.png'), 'Start Recording', self)
        vitalsAct.triggered.connect(lambda: self.startVitals())

        self.toolbar = self.addToolBar('Exit')
        self.toolbar = self.addToolBar('Save')
        self.toolbar = self.addToolBar('Export')
        self.toolbar = self.addToolBar('Export')

        self.toolbar.addAction(exitAct)
        self.toolbar.addAction(startAct)
        self.toolbar.addAction(heatAct)
        self.toolbar.addAction(vitalsAct)
        self.toolbar.addAction(exportRawAct)
        self.toolbar.addAction(exportAct)

        print("Creating toolbar menus and displaying window")
        #Setting window size and showing

        self.show()

    def Close(self):

        today = dt.now()

        today = today.strftime("%Y-%m-%d-%H%M%S")

        #sub.call(["git", "add", "."])
        #sub.call(["git", "commit", "-m", "Data Updates"])
        #sub.call(["git", "push"])

        sys.exit()

    def tempControl(self):

        while True:

            current_value = ConvertTemp(ReadChannel(2))

            print(current_value)

            newvalue = self.control.update(current_value=current_value)
            print(newvalue)

            if newvalue > current_value:

                direction = 1

            else:

                direction = 0

            GPIO.output(33, 1)
            GPIO.output(29, direction)

            time.sleep(2)

    def startVitals(self):

        #self.tempControl()
        self.lbl.plot(lcd_HR=self.lcd_HR,
                      lcd_BR=self.lcd_BR,
                      lcd_TEMP=self.lcd_TEMP,
                      control=self.control)

    def windowSizeInput(self):

        # open a smaller window with a numerical input option

        num, ok = QInputDialog.getInt(self, "Window Dialog", "enter a number")

        if ok:
            newSize = num
            self.lbl.plot(window=newSize * 10000, start=self.lbl.current_time)

    def windowReset(self):

        self.lbl.plot(window=self.lbl.window, start=self.lbl.current_time)

    def toggleMenu(self, state):

        if state:
            self.statusbar.show()
        else:
            self.statusbar.hide()

    def writeVoltageCsv(self):

        today = dt.now()

        today = today.strftime("%Y-%m-%d-%H%M%S")

        workingdir = os.getcwd() + '/Voltage Data/'

        volt_hr = np.array(self.lbl.hr_volt)
        volt_br = np.array(self.lbl.br_volt)
        volt_temp = np.array(self.lbl.temp_volt)

        len_x = len(time)
        len_hr = len(volt_hr)
        len_br = len(volt_br)
        len_temp = len(volt_temp)

        lengths = np.array([len_hr, len_br, len_temp])

        x = min(int(s) for s in lengths)

        time = time[0:(x - 1)]
        volt_hr = volt_hr[0:(x - 1)]
        volt_br = volt_br[0:(x - 1)]
        volt_temp = volt_temp[0:(x - 1)]

        fileName_volt = workingdir + 'Voltage_Data' + today + '.csv'

        data = pd.DataFrame({
            'Heart Rate (V)': volt_hr,
            'Breathing Rate (V)': volt_br,
            'Temperature (V)': volt_temp
        })
        data.to_csv(fileName_volt, index=False)

    def writeRealCsv(self):

        today = dt.now()

        today = today.strftime("%Y-%m-%d-%H%M%S")

        workingdir = os.getcwd() + '/Vital Data/'

        real_hr = np.array(self.lbl.hr_data)
        real_br = np.array(self.lbl.br_data)
        real_temp = np.array(self.lbl.temp_data)

        hr_nan = np.isnan(real_hr)
        br_nan = np.isnan(real_br)
        temp_nan = np.isnan(real_temp)

        real_hr[hr_nan] = 0
        real_br[br_nan] = 0
        real_temp[temp_nan] = 0

        fileName_real = workingdir + 'Vital_Data' + today + '.csv'

        data = pd.DataFrame({
            'Heart Rate (bpm)': real_hr,
            'Breathing Rate (bpm)': real_temp,
            'Temperature (F)': real_temp
        })
        data.to_csv(fileName_real, index=False)
Exemplo n.º 15
0
    def initUI(self):

        #Layout: You need to create a QWidget and set it as the central widget on the QMainWindow and assign the QLayout to th

        #wid = QWidget(self)
        self.setCentralWidget(self.wid)

        QToolTip.setFont(QFont('SansSerif', 10))

        #labels

        AcName = QLabel('Action Name', self)
        AcNameEdit = QLineEdit()
        self.ac_name_obj = AcNameEdit

        AcType = QLabel('Action Type', self)
        AcTypes = ['PUMP', 'VALVE ACTION']
        # Create and fill the combo box to choose the tyoe of action
        AcTypeBox = QComboBox()
        AcTypeBox.addItems(AcTypes)
        self.ac_type_obj = AcTypeBox

        #minutes
        AcDurationMin = QLabel('Action Duration [min]', self)
        AcDurationLCDMin = QLCDNumber()
        AcDurationLCDMin.setSegmentStyle(QLCDNumber.Flat)

        #change color of LCD, not working
        palette = QPalette()
        palette.setColor(QPalette.Background, QColor(170, 255, 0))
        palette.setColor(QPalette.Base, QColor(170, 255, 0))
        palette.setColor(QPalette.AlternateBase, QColor(170, 255, 0))
        AcDurationLCDMin.setPalette(palette)

        sliderAcDurMin = QSlider(Qt.Horizontal, self)
        sliderAcDurMin.setMaximum(60)
        sliderAcDurMin.valueChanged.connect(AcDurationLCDMin.display)
        self.ac_duration_min_obj = sliderAcDurMin

        #seconds
        AcDurationSec = QLabel('[sec]', self)
        AcDurationLCDSec = QLCDNumber()
        AcDurationLCDSec.setSegmentStyle(QLCDNumber.Flat)

        sliderAcDurSec = QSlider(Qt.Horizontal, self)
        sliderAcDurSec.setMaximum(60)
        sliderAcDurSec.valueChanged.connect(AcDurationLCDSec.display)
        self.ac_duration_sec_obj = sliderAcDurSec

        #tStart
        TStart = QLabel('Time Start [sec]', self)
        TStartEdit = QLineEdit()
        self.t_start_obj = TStartEdit

        #valve options
        """IfValve = QLabel('If Action type is "Valve" ONLY, select options below. \n' 'Keep the Valve number at 0 if PUMPNG selected',self)

        ValveOption = QLabel('Valve Option')
        ValveOptions = ['NO VALVE','OPENING', 'CLOSING']
        ValveOptionBox = QComboBox()
        ValveOptionBox.addItems(ValveOptions)
        self.valve_option_action_obj = ValveOptionBox
        """
        ValveNumber = QLabel('Valve Number', self)
        ValveNumberLCD = QLCDNumber()
        ValveNumberLCD.setSegmentStyle(QLCDNumber.Flat)
        sliderValveNumber = QSlider(Qt.Horizontal, self)
        sliderValveNumber.setMaximum(24)
        sliderValveNumber.valueChanged.connect(ValveNumberLCD.display)
        self.valve_number_obj = sliderValveNumber

        #Valve action list

        AcList = QLabel('Action list', self)
        AcListEdit = QTextEdit()
        AcListEdit.autoFormatting()
        self.actionDisplay = AcListEdit

        #valve option button
        Valvebtn = QPushButton('Add Action', self)
        Valvebtn.clicked.connect(self.AddAction)
        Valvebtn.resize(Valvebtn.sizeHint())

        #chip bonding button
        Bondingbtn = QPushButton('Chip Bonding', self)
        Bondingbtn.clicked.connect(self.chip_bonding)
        Bondingbtn.resize(Bondingbtn.sizeHint())

        #bonding duration
        BondDuration = QLabel('Bond Duration [h]', self)
        BondDurationEdit = QLineEdit()
        self.bond_duration_obj = BondDurationEdit

        #quit button

        qbtn = QPushButton('Quit',
                           self)  #second parameter is the parent widget
        qbtn.clicked.connect(self.closeEvent)
        #qbtn.clicked.connect(QApplication.instance().quit)
        #btn.setToolTip('This is a <b>QPushButton</b> widget') --> text when pointing at the button
        qbtn.resize(qbtn.sizeHint())  #recommended size for the button
        #qbtn.move(1600, 900) #position in absolute position

        #next button

        nextbtn = QPushButton('Next',
                              self)  #second parameter is the parent widget
        nextbtn.clicked.connect(self.GoToNext)
        nextbtn.resize(nextbtn.sizeHint())  #recommended size for the butto

        #grid Layout

        grid = QGridLayout()

        grid.addWidget(AcName, 1, 0)
        grid.addWidget(AcNameEdit, 1, 1)

        grid.addWidget(AcType, 2, 0)
        grid.addWidget(AcTypeBox, 2, 1)

        grid.addWidget(AcDurationMin, 3, 0)
        grid.addWidget(AcDurationLCDMin, 3, 1)
        grid.addWidget(sliderAcDurMin, 3, 2)

        grid.addWidget(AcDurationSec, 3, 3)
        grid.addWidget(AcDurationLCDSec, 3, 4)
        grid.addWidget(sliderAcDurSec, 3, 5)

        grid.addWidget(TStart, 4, 0)
        grid.addWidget(TStartEdit, 4, 1)

        #grid.addWidget(IfValve, 5, 0)

        #grid.addWidget(ValveOption,6, 0 )
        #grid.addWidget(ValveOptionBox, 6, 1)
        grid.addWidget(ValveNumber, 6, 2)
        grid.addWidget(ValveNumberLCD, 6, 3)
        grid.addWidget(sliderValveNumber, 6, 4)

        grid.addWidget(Bondingbtn, 8, 3)
        grid.addWidget(BondDuration, 8, 1)
        grid.addWidget(BondDurationEdit, 8, 2)

        grid.addWidget(AcList, 9, 0)
        grid.addWidget(AcListEdit, 9, 1, 1, 4)

        grid.addWidget(Valvebtn, 7, 1)
        grid.addWidget(qbtn, 11, 7)
        grid.addWidget(nextbtn, 10, 1)

        #print(sliderAcDur.value())

        for i in range(0, 6):
            grid.setColumnStretch(i, 1)
            grid.setRowStretch(i, 1)
            grid.setSpacing(1)
            grid.setHorizontalSpacing(1)
            grid.setVerticalSpacing(1)

        self.wid.setLayout(grid)

        #menu bar

        exitAct = QAction(QIcon('exit.png'), '&Exit', self)
        exitAct.setShortcut('Ctrl+Q')
        exitAct.setStatusTip('Exit application')
        exitAct.triggered.connect(qApp.quit)

        self.statusBar()

        menubar = self.menuBar()
        fileMenu = menubar.addMenu('File')
        fileMenu.addAction(exitAct)

        #submenu

        impMenu = QMenu('Import', self)
        impAct = QAction('Import mail', self)
        impMenu.addAction(impAct)

        newAct = QAction('New', self)

        fileMenu.addAction(newAct)
        fileMenu.addMenu(impMenu)

        #window geometry
        self.setGeometry(0, 0, 1800,
                         1000)  # x start, y start, x length, y length
        self.setWindowTitle('Micropump GUI _ Action')
Exemplo n.º 16
0
class tiempoDigitalWidget(QWidget):

    time = pyqtSignal()

    def __init__(self, winParent, porcentaje):
        super(tiempoDigitalWidget, self).__init__()
        self.winParent = winParent
        self.seconds = 900
        self.pose3d = pose3d
        self.porcentaje = porcentaje
        self.show = False
        self.MAX_PERCENT = 30
        self.MAX_NOTA = 10

        self.hLayout = QHBoxLayout()

        tiempoLabel = QLabel("Tiempo")
        self.lcd = QLCDNumber(self)
        self.lcd.setMaximumSize(100, 50)
        self.hLayout.addWidget(tiempoLabel, 0)
        self.hLayout.addWidget(self.lcd, 1)

        hSpacer = QSpacerItem(300, 30, QSizePolicy.Ignored,
                              QSizePolicy.Ignored)
        self.hLayout.addItem(hSpacer)

        self.setLayout(self.hLayout)

        timer = QTimer(self)
        timer.start(1000)
        timer.timeout.connect(self.printTime)

        # get the palette
        palette = self.lcd.palette()

        # foreground color
        palette.setColor(palette.WindowText, QColor(85, 85, 255))
        # background color
        palette.setColor(palette.Background, QColor(0, 170, 255))
        # "light" border
        palette.setColor(palette.Light, QColor(255, 0, 0))
        # "dark" border
        palette.setColor(palette.Dark, QColor(0, 255, 0))

        # set the palette
        self.lcd.setPalette(palette)

    def showNota(self):
        self.show = True
        nota = self.testPorcentaje()
        notaLabel = QLabel('Nota final: ' + str(nota))
        self.hLayout.addWidget(notaLabel, 0)
        self.setLayout(self.hLayout)

    def printTime(self):
        if self.seconds > 0:
            self.seconds -= 1
        else:
            if not self.show:
                self.showNota()
        self.lcd.display(self.seconds)

    def testPorcentaje(self):
        pCasa = self.porcentaje.calculatePercentaje()
        notaPorc = pCasa * self.MAX_NOTA / self.MAX_PERCENT
        if pCasa > self.MAX_PERCENT:
            notaPorc = 10
        return notaPorc
Exemplo n.º 17
0
class MainWindow(QMainWindow):


	def __init__(self):

		super().__init__()

		self.left = 10
		self.top = 10
		self.title = 'Rodent Vitals Monitoring Software Demo'
		self.width = 1200
		self.height = 1200
		self.model = [] 

		#Matplotlib graphs 


		self.lbl = PlotCanvas()


		#LCDs for numerical vital monitoring 

		self.lcd_BR = QLCDNumber(self)
		self.lcd_HR = QLCDNumber(self)
		self.lcd_TEMP = QLCDNumber(self)


		self.initUI()

	def initUI(self):  

		# Set Main Window Geometry and Title

		self.setGeometry(self.left, self.top, self.width, self.height)
		self.setWindowTitle(self.title)  



		#LCDs for numerical vital monitoring 

		
		self.lcd_BR.setSegmentStyle(QLCDNumber.Flat)
		paletteBR = self.lcd_BR.palette()
		paletteBR.setColor(paletteBR.WindowText, QtGui.QColor(85, 85, 240))
		self.lcd_BR.setPalette(paletteBR)
		self.lcd_BR.display(58)


		
		self.lcd_HR.setSegmentStyle(QLCDNumber.Flat)
		paletteHR = self.lcd_HR.palette()
		paletteHR.setColor(paletteHR.WindowText, QtGui.QColor(85, 255, 85))
		self.lcd_HR.setPalette(paletteHR)
		self.lcd_HR.display(287)

		
		self.lcd_TEMP.setSegmentStyle(QLCDNumber.Flat)
		paletteTEMP = self.lcd_TEMP.palette()
		paletteTEMP.setColor(paletteTEMP.WindowText, QtGui.QColor(255, 85, 85))
		self.lcd_TEMP.setPalette(paletteTEMP)
		self.lcd_TEMP.display(17)



		#Labels for vitals 


		BRlabel = QLabel('Breathing Rate (breaths/min)')
		HRlabel = QLabel('Heart Rate (beats/min)')
		TEMPlabel = QLabel('Subject Temperature (Celsius)')


		#Setting up Frame Layout 

		wid = QWidget(self)
		self.setCentralWidget(wid)

		box = QHBoxLayout(self)


		#Boxes for LCD vitals 

		box_HRLCD = QHBoxLayout(self)
		box_BRLCD = QHBoxLayout(self)
		box_TEMPLCD = QHBoxLayout(self)

		box_HRLCD.addWidget(self.lcd_HR)
		box_BRLCD.addWidget(self.lcd_BR)
		box_TEMPLCD.addWidget(self.lcd_TEMP)


		box_graph = QHBoxLayout(self)

		box_graph.addWidget(self.lbl)



		# Frames for vitals 

		left = QFrame(self)
		left.setFrameShape(QFrame.Box)

		topright = QFrame(self)
		topright.setFrameShape(QFrame.Box)

		middleright = QFrame(self)
		middleright.setFrameShape(QFrame.Box)

		bottomright = QFrame(self)
		bottomright.setFrameShape(QFrame.Box)

		left.setLayout(box_graph)
		topright.setLayout(box_HRLCD)

		middleright.setLayout(box_BRLCD)


		bottomright.setLayout(box_TEMPLCD)


		# Splitting frames and adding layout to window 


		splitter1 = QSplitter(Qt.Vertical)
		splitter1.addWidget(topright)
		splitter1.addWidget(middleright)

		splitter2 = QSplitter(Qt.Vertical)
		splitter2.addWidget(splitter1)
		splitter2.addWidget(bottomright)

		splitter3 = QSplitter(Qt.Horizontal)
		splitter3.addWidget(left)
		splitter3.addWidget(splitter2)


		box.addWidget(splitter3)
		wid.setLayout(box)    

	
		menubar = self.menuBar()
		fileMenu = menubar.addMenu('File')
		viewMenu = menubar.addMenu('View')
		recordingMenu = menubar.addMenu('Recording Options')

		self.statusbar = self.statusBar()
		self.statusbar.showMessage('Ready')
	
		impMenu = QMenu('Import', self)
		impAct = QAction('Import data', self) 
		impAct.triggered.connect(lambda: self.loadCsv)
		impMenu.addAction(impAct)

		expMenu = QMenu('Export', self)
		expAct = QAction('Export data', self) 
		expAct.triggered.connect(lambda: self.writeCsv)
		expMenu.addAction(expAct)
		
		newAct = QAction('New', self)       

		changeWindowSize = QAction('Change Window Size', self)
		changeWindowSize.triggered.connect(lambda: self.windowSizeInput()) 

		resetWindow = QAction('Reset Window to Present', self)
		resetWindow.triggered.connect(lambda: self.windowReset())



		recordingMenu.addAction(changeWindowSize)

		recordingMenu.addAction(resetWindow)

		
		fileMenu.addAction(newAct)
		fileMenu.addMenu(impMenu)
		fileMenu.addMenu(expMenu)
		fileMenu.addMenu(recordingMenu)

		#Making the status bar 

		viewStatAct = QAction('View statusbar', self, checkable=True)
		viewStatAct.setStatusTip('View statusbar')
		viewStatAct.setChecked(True)
		viewStatAct.triggered.connect(self.toggleMenu)
		viewMenu.addAction(viewStatAct)

		#Making the toolbar 


		exitAct = QAction(QIcon('cancel-512.png'), 'Exit', self)
		exitAct.triggered.connect(lambda: sys.exit())

		exportAct = QAction(QIcon('512x512.png'), 'Export Vitals', self)
		exportAct.triggered.connect(lambda: self.writeRealCsv())

		exportRawAct = QAction(QIcon('document.png'), 'Export Raw Data', self)
		exportRawAct.triggered.connect(lambda: self.writeVoltageCsv())

		startAct = QAction(QIcon('graphs icon.png'), 'Start Graphs', self)
		startAct.triggered.connect(lambda: self.lbl.plot(self.lcd_HR, self.lcd_BR, self.lcd_TEMP))

		heatAct = QAction(QIcon('temperature icon.png'), 'Start Temperature', self)
		heatAct.triggered.connect(lambda: self.tempControl())

		vitalsAct = QAction(QIcon('vitals icon.png'), 'Start Vitals', self)
		vitalsAct.triggered.connect(lambda: self.startVitals())

		
		self.toolbar = self.addToolBar('Exit')
		self.toolbar = self.addToolBar('Save')
		self.toolbar = self.addToolBar('Export')
		self.toolbar = self.addToolBar('Export')

		self.toolbar.addAction(exitAct)
		self.toolbar.addAction(startAct)
		self.toolbar.addAction(heatAct)
		self.toolbar.addAction(vitalsAct)
		self.toolbar.addAction(exportAct)


		#Setting window size and showing
  
		self.show()

	def analyzeHR(self, run=True):

		data = genfromtxt('breathdata.csv', dtype=None, delimiter=',')
		
		HR_ADCchan = 1

		run = True 

		all_data = []
		all_hr = []

		count = 0

		while run: 

			Value = []
			HR = []

			HR_Wave = WaveletTransform(data[1+count:5000+count])
			peakind = signal.find_peaks_cwt(HR_Wave, np.arange(1,1000))

			dist = []


			for i in range(len(peakind)-2):

				dist.append(peakind[i+1] - peakind[i])

			heart_rate = np.mean(1./np.sum(dist))
			self.lcd_HR.display(heart_rate)
			all_hr.append(heart_rate)

			count = count + 10
			print(heart_rate)





	def startVitals(self):

		t = []

		vital_thread = threading.Thread(target = self.analyzeHR())
		t.append(vital_thread)
		vital_thread.start()

		#temp_thread = threading.Thread(self.tempControl())
		plot_thread = threading.Thread(target = self.lbl.plot())
		

		t.append(plot_thread)
		

		#temp_thread.start()
		plot_thread.start()
		#plot_thread.run()
		
		#vital_thread.run()


		

	def windowSizeInput(self):

		# open a smaller window with a numerical input option 

		num,ok = QInputDialog.getInt(self,"Window Dialog","enter a number")
		
		if ok:
			newSize = num
			self.lbl.plot(window=newSize, start = self.lbl.current_time)


	def windowReset(self):

		self.lbl.plot(window = self.lbl.window, start = self.lbl.current_time)
	
	def toggleMenu(self, state):
		
		if state:
			self.statusbar.show()
		else:
			self.statusbar.hide()

	# IN PROGRESS - last line of loadCSV needs to be changed and graphs need to be made self variables upon initialization for dynamic changing and one for models for each vital

	def writeVoltageCsv(self):
		cwd = os.getcwd()

		volt_hr = self.lbl.volt_hr
		volt_br = self.lbl.volt_br
		volt_temp = self.lbl.volt_temp

		fileName_volt = cwd + "/Voltage_Data.csv"
		

		data = pd.DataFrame({'Heart Rate (V)':volt_hr, 'Breathing Rate (V)':volt_br, 'Temperature (V)':volt_temp})
		data.to_csv(fileName_volt, index=False)

	def writeRealCsv(self):
		cwd = os.getcwd()
		real_hr = self.lbl.real_hr
		real_br = self.lbl.real_br
		real_temp = self.lbl.real_temp

		fileName_real = cwd + "/Vital_Data.csv"

		data = pd.DataFrame({'Heart Rate (bpm)':real_hr, 'Breathing Rate (bpm)':real_temp, 'Temperature (F)':real_temp})
		data.to_csv(fileName_real, index=False)
Exemplo n.º 18
0
class timeDigitalWidget(QWidget):

    time = pyqtSignal()
    def __init__(self,winParent, percentaje):
        super(timeDigitalWidget, self).__init__()
        self.winParent=winParent
        self.seconds = 900
        self.pose3d = pose3d
        self.percentaje = percentaje
        self.show = False
        self.MAX_PERCENT = 30
        self.MAX_MARK = 10

        self.hLayout = QHBoxLayout()

        timeLabel = QLabel("Time")
        self.lcd = QLCDNumber(self)
        self.lcd.setMaximumSize(100,50)
        self.hLayout.addWidget(timeLabel,0)
        self.hLayout.addWidget(self.lcd, 1)

        hSpacer = QSpacerItem(300, 30, QSizePolicy.Ignored, QSizePolicy.Ignored)
        self.hLayout.addItem(hSpacer)

        self.setLayout(self.hLayout)

        timer = QTimer(self)
        timer.start(1000)
        timer.timeout.connect(self.printTime)

        # get the palette
        palette = self.lcd.palette()

        # foreground color
        palette.setColor(palette.WindowText, QColor(85, 85, 255))
        # background color
        palette.setColor(palette.Background, QColor(0, 170, 255))
        # "light" border
        palette.setColor(palette.Light, QColor(255, 0, 0))
        # "dark" border
        palette.setColor(palette.Dark, QColor(0, 255, 0))

        # set the palette
        self.lcd.setPalette(palette)

    def showMark(self):
        self.show = True
        mark = self.testPercentaje()
        markLabel = QLabel('Final mark: ' + str(mark))
        self.hLayout.addWidget(markLabel, 0)
        self.setLayout(self.hLayout)

    def printTime(self):

        if self.seconds > 0:
            self.seconds -= 1
        else:
            if not self.show:
                self.showMark()
        self.lcd.display(self.seconds)


    def testPercentaje(self):
        pHouse = self.percentaje.calculatePercentaje()
        markPerc = float(pHouse) * float(self.MAX_MARK) / float(self.MAX_PERCENT)
        if pHouse > self.MAX_PERCENT:
            markPerc = 10
        return markPerc
Exemplo n.º 19
0
class SigSlot(QWidget):
    def __init__(self,parent=None):
        QWidget.__init__(self)

        self.dev = None
        self.model = None
        self.cur_range = None
        self.mode = None
        self.initalizing = True
        self.load_enabled = False

        self.setWindowTitle('ITECH Electric Load')

        self.dev_selector = QComboBox(self)
        self.dev_selector.addItems(serial_ports())
        # self.dev_selector.addItems(["COM7"])

        self.btn_connect = QPushButton('Open', self)
        self.btn_connect.clicked.connect(self.on_open_click)
        self.btn_connect.setToolTip('This is an example button')

        # Device Selector
        box_selector = QHBoxLayout()
        box_selector.addWidget(self.dev_selector)
        box_selector.addWidget(self.btn_connect)

        self.dev_id = QLineEdit(self)

        # Mode Zone
        mode_selector = QVBoxLayout()
        mode_group = QGroupBox("Mode", self)
        self.mode_cc = QRadioButton("CC")
        self.mode_cc.toggled.connect(lambda:self.on_mode_select(self.mode_cc))
        self.mode_cv = QRadioButton("CV")
        self.mode_cv.toggled.connect(lambda:self.on_mode_select(self.mode_cv))
        self.mode_cr = QRadioButton("CR")
        self.mode_cr.toggled.connect(lambda:self.on_mode_select(self.mode_cr))
        self.mode_cp = QRadioButton("CW")
        self.mode_cp.toggled.connect(lambda:self.on_mode_select(self.mode_cp))
        mode_selector.addWidget(self.mode_cc)
        mode_selector.addWidget(self.mode_cv)
        mode_selector.addWidget(self.mode_cr)
        mode_selector.addWidget(self.mode_cp)

        # Load Control        
        self.lcd = QLCDNumber(8, self)
        spRight = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred)
        spRight.setHorizontalStretch(2)
        self.lcd.setSizePolicy(spRight)

        self.btn_load = QPushButton('LOAD', self)
        self.btn_load.clicked.connect(self.on_btn_load_clicked)


        # Power
        main_slider_label = QLabel("Power:", self)
        self.slider = QSlider(Qt.Horizontal,self)
        self.main_slider_value = QLineEdit("0.00A", self)
        self.main_slider_value.installEventFilter(self)
        # sp_slider_value = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred)
        # sp_slider_value.setHorizontalStretch(0.1)
        # self.main_slider_value.setSizePolicy(sp_slider_value)
        self.main_slider_value.setFixedSize(80, 20)
        self.slider.setMinimum(0)
        self.slider.setMaximum(10000 * 132)
        self.slider.setSingleStep(132*10000 / 300)

        # Meassure Zone Start
        mode_meas_vol = QGroupBox("Voltage", self)
        mode_meas_cur = QGroupBox("Current", self)
        mode_meas_pow = QGroupBox("Power", self)

        meas_vol_layout = QHBoxLayout()
        self.meas_vol_lcd = QLCDNumber(6, self)
        # get the palette
        palette = self.meas_vol_lcd.palette()
        palette.setColor(palette.Light, QColor(255, 0, 0))
        self.meas_vol_lcd.setPalette(palette)
        meas_vol_layout.addWidget(self.meas_vol_lcd)
        mode_meas_vol.setLayout(meas_vol_layout)

        meas_cur_layout = QHBoxLayout()
        self.meas_cur_lcd = QLCDNumber(6, self)
        palette = self.meas_cur_lcd.palette()
        palette.setColor(palette.Light, QColor(0, 255, 0))
        self.meas_cur_lcd.setPalette(palette)
        meas_cur_layout.addWidget(self.meas_cur_lcd)
        mode_meas_cur.setLayout(meas_cur_layout)

        meas_pow_layout = QHBoxLayout()
        self.meas_pow_lcd = QLCDNumber(6, self)
        palette = self.meas_pow_lcd.palette()
        palette.setColor(palette.Light, QColor(0, 0, 255))
        self.meas_pow_lcd.setPalette(palette)
        meas_pow_layout.addWidget(self.meas_pow_lcd)
        mode_meas_pow.setLayout(meas_pow_layout)

        meas_layout = QHBoxLayout()
        meas_layout.addWidget(mode_meas_vol)
        meas_layout.addWidget(mode_meas_cur)
        meas_layout.addWidget(mode_meas_pow)
        # Meassure Zone End

        # Pluse Zone
        pulse_mainLayout = QVBoxLayout()
        pulse_group = QGroupBox("Pluse", self)
        pulse_layout = QHBoxLayout()
        self.pulse_enabled = QCheckBox("ENABLE", self)
        self.pulse_freq = QSlider(Qt.Horizontal, self)
        self.pulse_freq.setMinimum(1)
        self.pulse_freq.setMaximum(5000)
        self.pulse_freq.setSingleStep(10)

        self.pulse_freq_text = QLineEdit("0.00Hz", self)
        self.pulse_freq_text.installEventFilter(self)
        self.pulse_freq_text.setFixedSize(60, 20)

        self.pulse_duty = QSlider(Qt.Horizontal, self)
        self.pulse_duty.setMinimum(50)
        self.pulse_duty.setMaximum(950)

        self.pulse_duty_text = QLineEdit("50.0%", self)
        self.pulse_duty_text.installEventFilter(self)
        self.pulse_duty_text.setFixedSize(40, 20)

        pulse_level_label = QLabel("Level:", self)
        self.pulse_level_slider = QSlider(Qt.Horizontal,self)
        self.pulse_level_text = QLineEdit("0.00A", self)
        self.pulse_level_text.installEventFilter(self)
        self.pulse_level_text.setFixedSize(40, 20)
        self.pulse_level_slider.setMinimum(0)
        self.pulse_level_slider.setMaximum(1000)

        pulse_layout.addWidget(self.pulse_enabled)
        pulse_layout.addWidget(self.pulse_freq)
        pulse_layout.addWidget(self.pulse_freq_text)
        pulse_layout.addWidget(self.pulse_duty)
        pulse_layout.addWidget(self.pulse_duty_text)

        pulse_level_layout = QHBoxLayout()
        pulse_level_layout.addWidget(pulse_level_label)
        pulse_level_layout.addWidget(self.pulse_level_slider)
        pulse_level_layout.addWidget(self.pulse_level_text)

        pulse_mainLayout.addLayout(pulse_layout)
        pulse_mainLayout.addLayout(pulse_level_layout)
        pulse_group.setLayout(pulse_mainLayout)

        self.pulse_enabled.toggled.connect(self.on_pulse_enabled_toggle)
        self.pulse_freq.valueChanged.connect(self.on_pulse_freq_slider_valueChanged)
        self.pulse_duty.valueChanged.connect(self.on_pulse_duty_slider_valueChanged)
        self.pulse_level_slider.valueChanged.connect(self.on_pulse_level_slider_valueChanged)
        # Pluse Zone End


        main_layout = QHBoxLayout()
        mode_group.setLayout(mode_selector)
        # mode_size = mode_group.sizeHint()
        # mode_size.setWidth(80)
        # mode_group.resize(mode_size)
        main_layout.addWidget(mode_group)
        main_layout.addWidget(self.lcd)
        self.btn_load.setFixedSize(self.btn_load.sizeHint().width(), mode_group.sizeHint().height())
        main_layout.addWidget(self.btn_load)

        vbox = QVBoxLayout()
        vbox.addLayout(box_selector)
        vbox.addWidget(self.dev_id)
        vbox.addLayout(main_layout)

        layer_main_slider = QHBoxLayout()
        layer_main_slider.addWidget(main_slider_label)
        layer_main_slider.addWidget(self.slider)
        layer_main_slider.addWidget(self.main_slider_value)        
        vbox.addLayout(layer_main_slider)

        vbox.addLayout(meas_layout)

        vbox.addWidget(pulse_group)

        self.setLayout(vbox)
         
        self.slider.valueChanged.connect(self.on_main_slider_valueChanged)
        self.resize(350,250)

        timer = QTimer(self)
        timer.setSingleShot(False)
        timer.timeout.connect(self.get_meas_value)
        timer.start(100)

    def get_main_scale_div(self):
        div_val = 10000

        return div_val

    def get_cmd(self, cmd):
        try:
            model = self.model.split(",")
            for i in range(0,len(COMMAND_SET)):
                if model[1] in COMMAND_SET[i]["models"]:
                    return COMMAND_SET[i][cmd]

            return COMMAND_SET[0][cmd]
        except Exception as e:
            return None

    @pyqtSlot()
    def get_meas_value(self):
        if self.dev is not None and not self.initalizing:
            try:
                state = self.dev.GetInputValues()
                self.meas_curr = state[1]
                self.meas_volt = state[0]
                self.meas_pow = state[2]

                self.load_enabled = (state[3] & 0x8) == 0x8
                self.update_load_button()

                self.meas_cur_lcd.display(self.meas_curr)
                self.meas_vol_lcd.display(self.meas_volt)
                self.meas_pow_lcd.display(self.meas_pow)
            except Exception as e:
                print("Read data failed")

    def update_mode(self):
        div_val = self.get_main_scale_div()
        
        if self.mode == "CC":
            max_var = self.dev.GetMaxCurrent()
            self.slider.setMaximum(max_var * div_val)
            self.slider.setSingleStep(max_var * div_val / 300)

            self.cur_current = self.dev.GetCCCurrent()
            self.slider.setValue(float(self.cur_current) * div_val)
            self.pulse_enabled.setEnabled(True)
        elif self.mode == "CV":
            max_var = self.dev.GetMaxVoltage()
            self.slider.setMaximum(max_var * div_val)
            self.slider.setSingleStep(max_var * div_val / 300)
            
            self.cur_voltage = self.dev.GetCVVoltage()
            self.slider.setValue(float(self.cur_voltage) * div_val)
            self.pulse_enabled.setEnabled(False)
        elif self.mode == "CW":
            max_var = self.dev.GetMaxPower()
            self.slider.setMaximum(max_var * div_val)
            self.slider.setSingleStep(max_var * div_val / 300)
            
            self.cur_power = self.dev.GetCWPower()
            self.slider.setValue(float(self.cur_power) * div_val)
            self.pulse_enabled.setEnabled(False)
        elif self.mode == "CR":
            max_var = 7500
            self.slider.setMaximum(max_var * div_val)
            self.slider.setSingleStep(max_var * div_val / 300)
            
            self.cur_resister = self.dev.GetCRResistance()
            self.slider.setValue(float(self.cur_resister) * div_val)
            self.pulse_enabled.setEnabled(False)
        self.update_slider_value()

    @pyqtSlot()
    def on_open_click(self):
        print("Click", self.dev_selector.currentText())
        if self.dev is None:
            self.initalizing = True
            self.dev = dcload.DCLoad()
            self.dev.Initialize(self.dev_selector.currentText(), 115200)
            self.btn_connect.setText("Close")
            self.model, serial_no, fw = self.dev.GetProductInformation()
            self.dev_id.setText(self.model)

            mode = self.dev.GetMode()
            self.mode = mode
            if mode == "CC":
                self.mode_cc.setChecked(True)
            elif mode == "CV":
                self.mode_cv.setChecked(True)
            elif mode == "CR":
                self.mode_cr.setChecked(True)
            elif mode == "CW":
                self.mode_cp.setChecked(True)

            self.update_mode()

            self.dev.SetRemoteControl()

            # self.dev.write("PULSe:FREQuency?")
            # self.cur_pulse_freq = self.dev.read().strip()
            # self.dev.write("PULSe:DCYCle?")
            # self.cur_pulse_duty = self.dev.read().strip()
            # self.dev.write("PULSe:LEVel:PERCentage:CURRent?")

            trans_state = self.dev.GetTransient(self.mode)
            self.trans_state = trans_state
            if trans_state[1] + trans_state[3] == 0:
                self.cur_pulse_freq = 10000
                self.cur_pulse_duty = 50
            else:
                self.cur_pulse_freq = 1 / (trans_state[1] + trans_state[3])
                self.cur_pulse_duty = trans_state[1] / (trans_state[1] + trans_state[3]) * 100
            self.cur_pulse_level = trans_state[0] / (self.slider.value()/self.get_main_scale_div()) * 100

            cur_function = self.dev.GetFunction()
            if cur_function == "transient":
                self.cur_pulse_enabled = True
            else:
                self.cur_pulse_enabled = False
            print("Pluse Freq : %s  DUTY: %s%%" % (self.cur_pulse_freq, self.cur_pulse_duty))
            self.update_pulse_info()

            self.initalizing = False
        else:
            del self.dev
            self.btn_connect.setText("Open")
            self.dev = None
            self.initalizing = True

    def update_pulse_info(self):
        duty_1 = 1 / self.cur_pulse_freq * (self.cur_pulse_duty / 100)
        duty_2 = 1 / self.cur_pulse_freq * (1 - self.cur_pulse_duty / 100)
        print(self.mode, self.cur_pulse_level / 100 * self.slider.value()/self.get_main_scale_div(), int(duty_1 * 10000), self.slider.value()/self.get_main_scale_div(), int(10000*duty_2))
        self.dev.SetTransient(self.mode, self.cur_pulse_level / 100 * self.slider.value()/self.get_main_scale_div(), duty_1, self.slider.value()/self.get_main_scale_div(), duty_2, "continuous")

        self.pulse_freq.setValue(float(self.cur_pulse_freq))
        self.pulse_duty.setValue(float(self.cur_pulse_duty) * 10)
        self.pulse_level_slider.setValue(float(self.cur_pulse_level) * 10)
        self.pulse_freq_text.setText("%.0fHz" % (float(self.cur_pulse_freq)))
        self.pulse_duty_text.setText("%.01f%%" % (float(self.cur_pulse_duty)))
        self.pulse_level_text.setText("%.01f%%" % (float(self.cur_pulse_level)))
        if self.cur_pulse_enabled:
            self.pulse_enabled.setChecked(True)
            self.mode_cv.setEnabled(False)
            self.mode_cr.setEnabled(False)
            self.mode_cp.setEnabled(False)
        else:
            self.pulse_enabled.setChecked(False)
            self.mode_cv.setEnabled(True)
            self.mode_cr.setEnabled(True)
            self.mode_cp.setEnabled(True)

    @pyqtSlot()
    def on_pulse_enabled_toggle(self):
        if not self.initalizing:
            self.cur_pulse_enabled = not self.cur_pulse_enabled
            if self.cur_pulse_enabled:
                self.dev.SetFunction("transient")
                print(self.dev.GetTriggerSource())
                self.dev.TriggerLoad()
            else:
                self.dev.SetFunction("fixed")
            print("Set Pluse To %s" % (self.cur_pulse_enabled))
            self.update_pulse_info()

    @pyqtSlot()
    def on_pulse_freq_slider_valueChanged(self):
        if self.initalizing:
            return
        print("Set Pluse Frequence to %d" % (self.pulse_freq.value()))
        self.cur_pulse_freq = self.pulse_freq.value()
        self.update_pulse_info()

    @pyqtSlot()
    def on_pulse_duty_slider_valueChanged(self):
        if self.initalizing:
            return
        print("Set Pluse Duty to %.01f%%" % (self.pulse_duty.value()/10))
        self.cur_pulse_duty = self.pulse_duty.value()/10
        self.update_pulse_info()

    @pyqtSlot()
    def on_pulse_level_slider_valueChanged(self):
        if self.initalizing:
            return
        print("Set Pluse Level to %.01f%%" % (self.pulse_level_slider.value()/10))
        self.cur_pulse_level = (self.pulse_level_slider.value()/10)
        self.update_pulse_info()

    @pyqtSlot()
    def on_mode_select(self,b):
        if b.isChecked() and not self.initalizing:
            print("Set MODE = %s  %d" % (b.text(), b.isChecked()))
            self.dev.SetMode(b.text())
            self.mode = b.text()
            self.update_mode()

    def update_slider_value(self):
        div_val = self.get_main_scale_div()
        
        self.lcd.display("%.03f" % (self.slider.value()/div_val))

        if self.mode == "CC":
            self.main_slider_value.setText("%.03f A" % (self.slider.value()/div_val))
        elif self.mode == "CV":
            self.main_slider_value.setText("%.04f V" % (self.slider.value()/div_val))
        elif self.mode == "CW":
            self.main_slider_value.setText("%.04f W" % (self.slider.value()/div_val))
        elif self.mode == "CR":
            self.main_slider_value.setText("%.04f Ω" % (self.slider.value()/div_val))

    @pyqtSlot()
    def on_main_slider_valueChanged(self):
        div_val = self.get_main_scale_div()
        
        if self.initalizing:
            return
        print("Set Power to %d" % (self.slider.value()))
        self.update_slider_value()
        if self.mode == "CC":
            self.dev.SetCCCurrent(self.slider.value()/div_val)
        elif self.mode == "CV":
            self.dev.SetCVVoltage(self.slider.value()/div_val)
        elif self.mode == "CW":
            self.dev.SetCWPower(self.slider.value()/div_val)
        elif self.mode == "CR":
            self.dev.SetCRResistance(self.slider.value()/div_val)

    def eventFilter(self, obj, event):
        if obj == self.main_slider_value and event.type() == QEvent.KeyPress:
            if event.key() == Qt.Key_Return or event.key() == Qt.Key_Enter:
                try:
                    div_val = self.get_main_scale_div()
                    if self.mode == "CR" and float(self.main_slider_value.text()) * div_val > 0:
                        self.slider.setValue(float(self.main_slider_value.text()) * div_val)
                    else:
                        self.slider.setValue(float(self.main_slider_value.text()) * div_val)

                    self.on_main_slider_valueChanged()
                    self.main_slider_value.selectAll()
                except Exception as e:
                    print("INPUT INVALID")
                    self.update_slider_value()
            elif event.key() == Qt.Key_Escape:
                self.update_slider_value()
        elif obj == self.pulse_freq_text and event.type() == QEvent.KeyPress:
            if event.key() == Qt.Key_Return or event.key() == Qt.Key_Enter:
                try:
                    self.pulse_freq.setValue(float(self.pulse_freq_text.text()))
                    self.pulse_freq_text.selectAll()
                except Exception as e:
                    print("INPUT INVALID")
                    self.update_pulse_info()
            elif event.key() == Qt.Key_Escape:
                self.update_pulse_info()
        elif obj == self.pulse_duty_text and event.type() == QEvent.KeyPress:
            if event.key() == Qt.Key_Return or event.key() == Qt.Key_Enter:
                try:
                    self.pulse_duty.setValue(float(self.pulse_duty_text.text()) * 10)
                    self.pulse_duty_text.selectAll()
                except Exception as e:
                    print("INPUT INVALID")
                    self.update_pulse_info()
            elif event.key() == Qt.Key_Escape:
                self.update_pulse_info()
        elif obj == self.pulse_level_text and event.type() == QEvent.KeyPress:
            if event.key() == Qt.Key_Return or event.key() == Qt.Key_Enter:
                try:
                    self.pulse_level_slider.setValue(float(self.pulse_level_text.text()) * 10)
                    self.pulse_level_text.selectAll()
                except Exception as e:
                    print("INPUT INVALID")
                    self.update_pulse_info()
            elif event.key() == Qt.Key_Escape:
                self.update_pulse_info()
        elif event.type() == QEvent.Enter and obj in [self.main_slider_value, self.pulse_freq_text, self.pulse_duty_text, self.pulse_level_text]:
            rc = super(SigSlot, self).eventFilter(obj, event)
            obj.setFocus()
            obj.selectAll()
            return rc
        #     print(obj)
        return super(SigSlot, self).eventFilter(obj, event)

    def update_load_button(self):
        if self.load_enabled == False:
            self.btn_load.setStyleSheet("background-color: #00ff77;")
            self.mode_cc.setEnabled(True)
            self.mode_cv.setEnabled(True)
            self.mode_cr.setEnabled(True)
            self.mode_cp.setEnabled(True)
        else:
            self.btn_load.setStyleSheet("background-color: red;")
            self.mode_cc.setEnabled(False)
            self.mode_cv.setEnabled(False)
            self.mode_cr.setEnabled(False)
            self.mode_cp.setEnabled(False)

    @pyqtSlot()
    def on_btn_load_clicked(self):
        if self.initalizing:
            return
        print("Change Load State")
        if self.load_enabled == False:
            self.dev.TurnLoadOn()
            self.load_enabled = True
        else:
            print("Close LOAD")
            self.dev.TurnLoadOff()
            self.load_enabled = False

        self.update_load_button()
    
    def keyPressEvent(self, e):
        if e.key() == Qt.Key_F5:
            self.on_btn_load_clicked()
Exemplo n.º 20
0
class RmsDriver(QObject):
    def __init__(self, driverNum):
        super().__init__()
        self.CtrlNum = driverNum
        self.name = 'Driver ' + str(driverNum)
        self.lapcount = 0
        self.bestLapTime = None
        self.lapTime = None
        self.time = None
        self.fuellevel = 15
        self.pitcount = 0
        self.pit = False
        self.buildDriver()

    def buildDriver(self):
        self.nameFont = QFont()
        self.nameFont.setPointSize(20)
        self.nameFont.setBold(True)
        self.nameBtn = QPushButton(self.name + '\n' + 'Ctrl: ' +
                                   str(self.CtrlNum))
        self.nameBtn.setToolTip('Click to change driver name')
        self.nameBtn.setFont(self.nameFont)
        self.nameBtn.setStyleSheet(
            "QPushButton { border: 5px solid black; border-radius: 10px; background-color: white}"
        )

        self.lapCountLCD = QLCDNumber(3)
        self.lapCountLCD.setStyleSheet(
            "QLCDNumber{ border-radius: 10px; background-color: black}")
        lcdPalette = self.lapCountLCD.palette()
        lcdPalette.setColor(lcdPalette.WindowText, QColor(255, 255, 0))
        self.lapCountLCD.setPalette(lcdPalette)
        self.lapCountLCD.display(self.lapcount)

        self.bestLapLCD = QLCDNumber()
        self.bestLapLCD.setStyleSheet(
            "QLCDNumber{ border-radius: 10px; background-color: black}")
        lcdPalette = self.bestLapLCD.palette()
        lcdPalette.setColor(lcdPalette.WindowText, QColor(255, 255, 0))
        self.bestLapLCD.setPalette(lcdPalette)
        self.bestLapLCD.display(self.bestLapTime)

        self.lapLCD = QLCDNumber()
        self.lapLCD.setStyleSheet(
            "QLCDNumber{ border-radius: 10px; background-color: black}")
        lcdPalette = self.lapLCD.palette()
        lcdPalette.setColor(lcdPalette.WindowText, QColor(255, 255, 0))
        self.lapLCD.setPalette(lcdPalette)
        self.lapLCD.display(self.lapTime)

        self.fuelbar = QProgressBar()
        self.fuelbar.setOrientation(Qt.Horizontal)
        self.fuelbar.setStyleSheet(
            "QProgressBar{ color: white; background-color: black; border: 5px solid black; border-radius: 10px; text-align: center}\
                                    QProgressBar::chunk { background: qlineargradient(x1: 1, y1: 0.5, x2: 0, y2: 0.5, stop: 0 #00AA00, stop: "
            + str(0.92 - (1 / (self.fuellevel))) + " #22FF22, stop: " +
            str(0.921 - (1 / (self.fuellevel))) + " #22FF22, stop: " +
            str(1.001 - (1 / (self.fuellevel))) + " red, stop: 1 #550000); }")
        self.fuelbar.setMinimum(0)
        self.fuelbar.setMaximum(15)
        self.fuelbar.setValue(self.fuellevel)

        self.pitCountLCD = QLCDNumber(2)
        self.pitCountLCD.setStyleSheet(
            "QLCDNumber{ border-radius: 10px; background-color: black}")
        lcdPalette = self.pitCountLCD.palette()
        lcdPalette.setColor(lcdPalette.WindowText, QColor(255, 0, 0))
        self.pitCountLCD.setPalette(lcdPalette)
        self.pitCountLCD.display(self.pitcount)

    def getName(self):
        return self.name

    def getNameBtn(self):
        return self.nameBtn

    def getLapCountLCD(self):
        return self.lapCountLCD

    def getBestLapLCD(self):
        return self.bestLapLCD

    def getLapLCD(self):
        return self.lapLCD

    def getFuelBar(self):
        return self.fuelbar

    def setCtrlNum(self, num):
        self.CtrlNum = num
        self.nameBtn.setText(self.name + '\n' + 'Ctrl: ' + str(self.CtrlNum))

    def getPits(self):
        return self.pitCountLCD

    def newlap(self, timer):
        if self.time is not None:
            self.lapTime = timer.timestamp - self.time
            if self.bestLapTime is None or self.lapTime < self.bestLapTime:
                self.bestLapTime = self.lapTime
            self.lapcount += 1
        self.time = timer.timestamp
Exemplo n.º 21
0
class WheelBox(QWidget):
    valueChanged = pyqtSignal('double', name="valueChanged")

    def __init__(self, title, min, max, stepSize, parent):
        super().__init__(parent)

        self.__d_number = QLCDNumber(self)
        self.__d_number.setSegmentStyle(QLCDNumber.Filled)
        self.__d_number.setAutoFillBackground(True)
        self.__d_number.setFixedHeight(self.__d_number.sizeHint().height() * 2)
        self.__d_number.setFocusPolicy(Qt.WheelFocus)

        pal = QPalette(Qt.black)
        pal.setColor(QPalette.WindowText, Qt.green)
        self.__d_number.setPalette(pal)

        self.__d_wheel = Wheel(self)
        self.__d_wheel.setOrientation(Qt.Vertical)
        self.__d_wheel.setInverted(True)
        self.__d_wheel.setRange(min, max)
        self.__d_wheel.setSingleStep(stepSize)
        self.__d_wheel.setPageStepCount(5)
        self.__d_wheel.setFixedHeight(self.__d_number.height())

        self.__d_number.setFocusProxy(self.__d_wheel)

        font = QFont("Helvetica", 10)
        font.setBold(True)

        self.__d_label = QLabel(title, self)
        self.__d_label.setFont(font)

        hLayout = QHBoxLayout()
        hLayout.setContentsMargins(0, 0, 0, 0)
        hLayout.setSpacing(2)
        hLayout.addWidget(self.__d_number, 10)
        hLayout.addWidget(self.__d_wheel)

        vLayout = QVBoxLayout(self)
        vLayout.addLayout(hLayout, 10)
        vLayout.addWidget(self.__d_label, 0, Qt.AlignTop | Qt.AlignHCenter)

        self.__d_wheel.valueChanged.connect(self.display)

        self.__d_wheel.valueChanged.connect(self.valueChanged)

    def display(self, value):
        self.__d_number.display(value)

    def theme(self):
        return self.__d_wheel.palette().color(QPalette.Window)

    def setTheme(self, color):
        self.__d_wheel.setPalette(QPalette(color))

    def setValue(self, value):
        self.__d_wheel.setValue(value)
        self.__d_number.display(value)

    def value(self):
        return self.__d_wheel.value()

    theme = pyqtProperty(QColor, theme, setTheme)
Exemplo n.º 22
0
class MainWindow(QMainWindow):


	def __init__(self):

		super().__init__()

		self.left = 10
		self.top = 10
		self.title = 'Rodent Vitals Monitoring Software Demo'
		self.width = 700
		self.height = 500
		self.model = [] 

		#Matplotlib graphs 


		self.lbl = PlotCanvas()

		#LCDs for numerical vital monitoring 

		self.lcd_BR = QLCDNumber(self)
		self.lcd_HR = QLCDNumber(self)
		self.lcd_TEMP = QLCDNumber(self)


		self.control = PID()
		self.control.setPoint(set_point=37)

		print("Initializing MainWindow")


		self.initUI()

	def initUI(self):  

		# Set Main Window Geometry and Title

		self.setGeometry(self.left, self.top, self.width, self.height)
		self.setWindowTitle(self.title)  

		#LCDs for numerical vital monitoring 

		
		self.lcd_BR.setSegmentStyle(QLCDNumber.Flat)
		paletteBR = self.lcd_BR.palette()
		paletteBR.setColor(paletteBR.WindowText, QtGui.QColor(85, 85, 240))
		self.lcd_BR.setPalette(paletteBR)
		self.lcd_BR.display(58)

		
		self.lcd_HR.setSegmentStyle(QLCDNumber.Flat)
		paletteHR = self.lcd_HR.palette()
		paletteHR.setColor(paletteHR.WindowText, QtGui.QColor(85, 255, 85))
		self.lcd_HR.setPalette(paletteHR)
		self.lcd_HR.display(287)

		
		self.lcd_TEMP.setSegmentStyle(QLCDNumber.Flat)
		paletteTEMP = self.lcd_TEMP.palette()
		paletteTEMP.setColor(paletteTEMP.WindowText, QtGui.QColor(255, 85, 85))
		self.lcd_TEMP.setPalette(paletteTEMP)
		self.lcd_TEMP.display(17)



		#Labels for vitals 


		BRlabel = QLabel('Breathing Rate (breaths/min)')
		HRlabel = QLabel('Heart Rate (beats/min)')
		TEMPlabel = QLabel('Subject Temperature (Celsius)')


		#Setting up Frame Layout 

		wid = QWidget(self)
		self.setCentralWidget(wid)

		box = QHBoxLayout(self)


		#Boxes for LCD vitals 

		box_HRLCD = QHBoxLayout(self)
		box_BRLCD = QHBoxLayout(self)
		box_TEMPLCD = QHBoxLayout(self)

		box_HRLCD.addWidget(self.lcd_HR)
		box_BRLCD.addWidget(self.lcd_BR)
		box_TEMPLCD.addWidget(self.lcd_TEMP)


		box_graph = QHBoxLayout(self)

		box_graph.addWidget(self.lbl)


		left = QFrame(self)
		left.setFrameShape(QFrame.Box)



		topright = QFrame(self)
		topright.setFrameShape(QFrame.Box)

		middleright = QFrame(self)
		middleright.setFrameShape(QFrame.Box)

		bottomright = QFrame(self)
		bottomright.setFrameShape(QFrame.Box)

		left.setLayout(box_graph)
		topright.setLayout(box_HRLCD)

		middleright.setLayout(box_BRLCD)


		bottomright.setLayout(box_TEMPLCD)


		# Splitting frames and adding layout to window 


		splitter1 = QSplitter(Qt.Vertical)
		splitter1.addWidget(topright)
		splitter1.addWidget(middleright)

		splitter2 = QSplitter(Qt.Vertical)
		splitter2.addWidget(splitter1)
		splitter2.addWidget(bottomright)

		splitter3 = QSplitter(Qt.Horizontal)
		splitter3.addWidget(left)
		splitter3.addWidget(splitter2)


		box.addWidget(splitter3)
		wid.setLayout(box)   


	
		menubar = self.menuBar()
		fileMenu = menubar.addMenu('File')
		viewMenu = menubar.addMenu('View')
		recordingMenu = menubar.addMenu('Recording Options')

		self.statusbar = self.statusBar()
		self.statusbar.showMessage('Ready')
	
		impMenu = QMenu('Import', self)
		impAct = QAction('Import data', self) 
		impAct.triggered.connect(lambda: self.loadCsv)
		impMenu.addAction(impAct)

		expMenu = QMenu('Export', self)
		expAct = QAction('Export data', self) 
		expAct.triggered.connect(lambda: self.writeCsv)
		expMenu.addAction(expAct)
		
		newAct = QAction('New', self)       

		changeWindowSize = QAction('Change Window Size', self)
		changeWindowSize.triggered.connect(lambda: self.windowSizeInput()) 

		resetWindow = QAction('Reset Window to Present', self)
		resetWindow.triggered.connect(lambda: self.windowReset())


		recordingMenu.addAction(changeWindowSize)

		recordingMenu.addAction(resetWindow)

		
		fileMenu.addAction(newAct)
		fileMenu.addMenu(impMenu)
		fileMenu.addMenu(expMenu)
		fileMenu.addMenu(recordingMenu)

		#Making the status bar 

		viewStatAct = QAction('View statusbar', self, checkable=True)
		viewStatAct.setStatusTip('View statusbar')
		viewStatAct.setChecked(True)
		viewStatAct.triggered.connect(self.toggleMenu)
		viewMenu.addAction(viewStatAct)

		#Making the toolbar 

		exitAct = QAction(QIcon('cancel-512.png'), 'Exit', self)
		exitAct.triggered.connect(lambda: sys.exit())

		exportAct = QAction(QIcon('512x512.png'), 'Export Vitals', self)
		exportAct.triggered.connect(lambda: self.writeRealCsv())

		exportRawAct = QAction(QIcon('document.png'), 'Export Raw Data', self)
		exportRawAct.triggered.connect(lambda: self.writeVoltageCsv())

		startAct = QAction(QIcon('graphs icon.png'), 'Start Graphs', self)
		startAct.triggered.connect(lambda: self.lbl.plot(lcd_HR=self.lcd_HR, lcd_BR=self.lcd_BR, lcd_TEMP=self.lcd_TEMP))

		heatAct = QAction(QIcon('temperature icon.png'), 'Start Temperature', self)
		heatAct.triggered.connect(lambda: self.tempControl())

		vitalsAct = QAction(QIcon('vitals icon.png'), 'Start Vitals', self)
		vitalsAct.triggered.connect(lambda: self.displayVitals())



		
		self.toolbar = self.addToolBar('Exit')
		self.toolbar = self.addToolBar('Save')
		self.toolbar = self.addToolBar('Export')
		self.toolbar = self.addToolBar('Export')

		self.toolbar.addAction(exitAct)
		self.toolbar.addAction(startAct)
		self.toolbar.addAction(heatAct)
		self.toolbar.addAction(exportRawAct)
		self.toolbar.addAction(exportAct)

		print("Creating toolbar menus and displaying window")
		#Setting window size and showing
  
		self.show()

	def Close(self):

		self.p.stop()
		GPIO.cleanup()
		sys.exit()


	def tempControl(self):


		while True:

			current_value = ConvertTemp(ReadChannel(2), 1)

			#print(ReadChannel(2))
			print(current_value)

			newvalue = self.control.update(current_value=current_value)
			print(newvalue)

			if newvalue > current_value:

				direction = 1


			else: 

				direction = 0


			GPIO.output(33, 1)
			GPIO.output(29, direction)
			
			time.sleep(2)

		
	def startVitals(self):

		self.tempControl()
		self.lbl.plot()
		

	def windowSizeInput(self):

		# open a smaller window with a numerical input option 

		num,ok = QInputDialog.getInt(self,"Window Dialog","enter a number")
		
		if ok:
			newSize = num
			self.lbl.plot(window=newSize, start = self.lbl.current_time)

	def windowReset(self):

		self.lbl.plot(window = self.lbl.window, start = self.lbl.current_time)
	
	def toggleMenu(self, state):
		
		if state:
			self.statusbar.show()
		else:
			self.statusbar.hide()

	# IN PROGRESS - last line of loadCSV needs to be changed and graphs need to be made self variables upon initialization for dynamic changing and one for models for each vital

	def writeVoltageCsv(self, fileName):

		cwd = os.getcwd()

		volt_hr = self.lbl.volt_hr
		volt_br = self.lbl.volt_br
		volt_temp = self.lbl.volt_temp

		fileName_volt = cwd + fileName + "Voltage_Data.csv"
		

		data = pd.DataFrame({'Heart Rate (V)':volt_hr, 'Breathing Rate (V)':volt_br, 'Temperature (V)':volt_temp})
		data.to_csv(fileName_volt, index=False)

	def writeRealCsv(self, fileName):

		real_hr = self.lbl.real_hr
		real_br = self.lbl.real_br
		real_temp = self.lbl.real_temp

		fileName_real = cwd + fileName + "Vital_Data.csv"

		data = pd.DataFrame({'Heart Rate (bpm)':real_hr, 'Breathing Rate (bpm)':real_temp, 'Temperature (F)':real_temp})
		data.to_csv(fileName_real, index=False)
Exemplo n.º 23
0
class OmniRigQTControls:
    def __init__(self, operatingAsClient, sendCommandFunction=None):
        self.operatingAsClient = operatingAsClient
        self.omnirigObject = None
        self.omniRigInfo = {}
        self.sendCommandFunction = sendCommandFunction
        self.blackColorPalette = QPalette()
        self.blackColorPalette.setColor(QPalette.WindowText, QColor("black"))
        self.redColorPalette = QPalette()
        self.redColorPalette.setColor(QPalette.WindowText, QColor("red"))
        self.boldFont = QFont()
        self.boldFont.setBold(True)
        self.regularFont = QFont()
        self.regularFont.setBold(False)

        self.labelRigName = QLabel("Rig is not responding")
        self.rigSelectGroupBox = QGroupBox("Rig select:")

        self.radioBtnTRX1 = QRadioButton("Rig 1")
        self.radioBtnTRX1.setChecked(True)
        self.radioBtnTRX1.toggled.connect(self.refreshRigInformation)
        self.radioBtnTRX2 = QRadioButton("Rig 2")
        self.radioBtnTRX2.toggled.connect(self.refreshRigInformation)

        hboxRigSelect = QHBoxLayout()
        hboxRigSelect.addWidget(self.radioBtnTRX1)
        hboxRigSelect.addWidget(self.radioBtnTRX2)
        hboxRigSelect.addWidget(self.labelRigName)
        hboxRigSelect.addStretch()
        self.rigSelectGroupBox.setLayout(hboxRigSelect)
        self.rigSelectGroupBox.setMaximumWidth(360)

        self.lcdTrxFrequency = QLCDNumber(10)
        self.lcdTrxFrequency.display('00.000.00')
        self.lcdTrxFrequency.setPalette(self.blackColorPalette)
        self.lcdTrxFrequency.setMinimumHeight(50)
        self.lcdTrxFrequency.setMaximumHeight(50)
        self.lcdTrxFrequency.setMaximumWidth(275)
        self.lcdTrxFrequency.setMinimumWidth(275)

        self.labelRigModeLSB = QLabel('LSB')
        self.labelRigModeLSB.setFont(self.boldFont)
        self.labelRigModeLSB.setEnabled(False)

        self.labelRigModeUSB = QLabel('USB')
        self.labelRigModeUSB.setFont(self.boldFont)
        self.labelRigModeUSB.setEnabled(False)

        vboxMiddlePanel = QVBoxLayout()
        vboxMiddlePanel.addWidget(self.labelRigModeLSB)
        vboxMiddlePanel.addWidget(self.labelRigModeUSB)

        hboxMiddlePanel = QHBoxLayout()
        hboxMiddlePanel.addLayout(vboxMiddlePanel)
        hboxMiddlePanel.addStretch()

        self.btnBack500Hz = QPushButton("<--")
        self.btnBack500Hz.setFixedWidth(50)

        self.btnForward500Hz = QPushButton("-->")
        self.btnForward500Hz.setFixedWidth(50)
        self.btnForward500Hz.clicked.connect(self.btnOmniRigPlus500HzClick)

        self.btnOmniRigUSB = QPushButton("USB")
        self.btnOmniRigUSB.clicked.connect(self.btnOmniUSBClick)
        self.btnOmniRigUSB.setFixedWidth(50)

        self.btnOmniRigLSB = QPushButton("LSB")
        self.btnOmniRigLSB.clicked.connect(self.btnOmniLSBClick)
        self.btnOmniRigLSB.setFixedWidth(50)

        hboxRigCATControl = QHBoxLayout()
        hboxRigCATControl.addWidget(self.btnBack500Hz)
        hboxRigCATControl.addWidget(self.btnForward500Hz)
        hboxRigCATControl.addStretch()
        hboxRigCATControl.addWidget(self.btnOmniRigLSB)
        hboxRigCATControl.addWidget(self.btnOmniRigUSB)
        hboxRigCATControl.addStretch(1)

        hboxMainLayout = QHBoxLayout()
        hboxMainLayout.addWidget(self.lcdTrxFrequency)
        hboxMainLayout.addLayout(hboxMiddlePanel)

        self.vboxMainLayout = QVBoxLayout()
        self.vboxMainLayout.addWidget(self.rigSelectGroupBox)
        self.vboxMainLayout.addLayout(hboxMainLayout)
        if self.operatingAsClient is True:
            self.vboxMainLayout.addLayout(hboxRigCATControl)

    def setOmnirigObject(self, omnirigObject):
        self.omnirigObject = omnirigObject

    def btnOmniRigPlus500HzClick(self):
        try:
            self.omnirigObject = win32.Dispatch("OmniRig.OmniRigX")
        except:
            pass
        if self.omnirigObject is not None and self.operatingAsClient is False:
            if self.radioBtnTRX1.isChecked():
                self.omnirigObject.Rig1.SetSimplexMode(str(self.omnirigObject.Rig1.Freq+500))
            else:
                self.omnirigObject.Rig2.SetSimplexMode(str(self.omnirigObject.Rig1.Freq+500))
        if self.operatingAsClient is True and self.sendCommandFunction is not None:
            self.sendCommandFunction('+500=1')

    def btnOmniLSBClick(self):
        try:
            self.omnirigObject = win32.Dispatch("OmniRig.OmniRigX")
        except:
            pass
        if self.omnirigObject is not None and self.operatingAsClient is False:
            if self.radioBtnTRX1.isChecked():
                self.omnirigObject.Rig1.Mode = '67108864'
            else:
                self.omnirigObject.Rig2.Mode = '67108864'
        if self.operatingAsClient is True and self.sendCommandFunction is not None:
            self.sendCommandFunction('setLSB=1')

    def btnOmniUSBClick(self):
        try:
            self.omnirigObject = win32.Dispatch("OmniRig.OmniRigX")
        except:
            pass
        if self.omnirigObject is not None and self.operatingAsClient is False:
            if self.radioBtnTRX1.isChecked():
                self.omnirigObject.Rig1.Mode = '33554432'
            else:
                self.omnirigObject.Rig2.Mode = '33554432'

        if self.operatingAsClient is True and self.sendCommandFunction is not None:
            self.sendCommandFunction('setUSB=1')

    def setDisplayFreq(self, txtFreq):
        self.lcdTrxFrequency.display(txtFreq)

    def setOmniRigErrorText(self, msgText):
        self.labelRigName.setText(msgText)
        self.labelRigName.setPalette(self.redColorPalette)

    def setRigStatus(self, rigType):
        self.labelRigName.setText(rigType)
        self.labelRigName.setPalette(self.blackColorPalette)

    def getRigsInformation(self):
        return self.omniRigInfo

    def disableControls(self):
        self.radioBtnTRX1.setEnabled(False)
        self.radioBtnTRX2.setEnabled(False)

    def refreshRigInformation(self):
        rignum = '2'
        if self.radioBtnTRX1.isChecked():
            rignum = '1'
        if len(self.omniRigInfo) > 1:
            self.radioBtnTRX1.setText(self.omniRigInfo['1'].getRigType())
            self.radioBtnTRX2.setText(self.omniRigInfo['2'].getRigType())
            freqTxt = self.omniRigInfo[rignum].getRigFreq()
            self.setDisplayFreq(self.addDotsToFreq(freqTxt))
            self.setRigStatus(self.omniRigInfo[rignum].getRigStatus())

            if freqTxt == 0:
                self.labelRigModeUSB.setEnabled(False)
                self.labelRigModeLSB.setEnabled(False)
            else:
                if self.omniRigInfo[rignum].getRigMode() == 'LSB':
                    self.labelRigModeUSB.setEnabled(False)
                    self.labelRigModeLSB.setEnabled(True)
                else:
                    self.labelRigModeUSB.setEnabled(True)
                    self.labelRigModeLSB.setEnabled(False)

    def setRigInformation(self, omniRigInfo):
        self.omniRigInfo = omniRigInfo
        self.refreshRigInformation()

    def addDotsToFreq(self, freqvalue):
        freqTxt = str(freqvalue)
        if len(freqTxt) < 6:
            freqTxt = '00000000'

        firstPart = freqTxt[:-6]
        if len(freqTxt) == 8:
            mainPart = freqTxt[:7]
            middlePart = mainPart[2:5]
            lastPart = mainPart[5:]
        else:
            mainPart = freqTxt[:6]
            middlePart = mainPart[1:4]
            lastPart = mainPart[4:]

        return firstPart+"."+middlePart+"."+lastPart

    def getGUI(self):
        return self.vboxMainLayout
Exemplo n.º 24
0
class CueWidget(QWidget):

    STOP = QIcon.fromTheme('led-off')
    START = QIcon.fromTheme('led-running')
    PAUSE = QIcon.fromTheme('led-pause')
    ERROR = QIcon.fromTheme('led-error')

    ICON_SIZE = 14

    context_menu_request = pyqtSignal(object, QPoint)
    edit_request = pyqtSignal(object)
    cue_executed = pyqtSignal(object)

    def __init__(self, cue, **kwargs):
        super().__init__(**kwargs)
        self.cue = None

        self._selected = False
        self._accurate_timing = False
        self._show_dbmeter = False
        self._countdown_mode = True

        self._dbmeter_element = None
        self._fade_element = None

        self.setAttribute(Qt.WA_TranslucentBackground)
        self.setLayout(QGridLayout())

        self.layout().setContentsMargins(0, 0, 0, 0)
        self.layout().setSpacing(2)
        self.layout().setColumnStretch(0, 6)
        self.layout().setRowStretch(0, 4)

        self.nameButton = QClickLabel(self)
        self.nameButton.setObjectName('ButtonCueWidget')
        self.nameButton.setWordWrap(True)
        self.nameButton.setAlignment(Qt.AlignCenter)
        self.nameButton.setFocusPolicy(Qt.NoFocus)
        self.nameButton.clicked.connect(self._clicked)
        self.nameButton.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored)
        self.layout().addWidget(self.nameButton, 0, 0)

        self.statusIcon = QLabel(self.nameButton)
        self.statusIcon.setStyleSheet('background-color: transparent')
        self.statusIcon.setPixmap(CueWidget.STOP.pixmap(CueWidget.ICON_SIZE,
                                                        CueWidget.ICON_SIZE))

        self.seekSlider = QClickSlider(self.nameButton)
        self.seekSlider.setOrientation(Qt.Horizontal)
        self.seekSlider.setFocusPolicy(Qt.NoFocus)
        self.seekSlider.setVisible(False)

        self.dbMeter = QDbMeter(self)
        self.dbMeter.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored)
        self.dbMeter.setVisible(False)

        self.timeBar = QProgressBar(self)
        self.timeBar.setTextVisible(False)
        self.timeBar.setLayout(QHBoxLayout())
        self.timeBar.layout().setContentsMargins(0, 0, 0, 0)
        self.timeDisplay = QLCDNumber(self.timeBar)
        self.timeDisplay.setStyleSheet('background-color: transparent')
        self.timeDisplay.setSegmentStyle(QLCDNumber.Flat)
        self.timeDisplay.setDigitCount(8)
        self.timeDisplay.display('00:00:00')
        self.timeBar.layout().addWidget(self.timeDisplay)
        self.timeBar.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored)
        self.timeBar.setVisible(False)

        self._set_cue(cue)

    @property
    def selected(self):
        return self._selected

    @selected.setter
    def selected(self, value):
        self._selected = value
        self._update_style(self.cue.stylesheet)

    def contextMenuEvent(self, event):
        self.context_menu_request.emit(self, event.globalPos())

    def mouseMoveEvent(self, event):
        if (event.buttons() == Qt.LeftButton and
                (event.modifiers() == Qt.ControlModifier or
                 event.modifiers() == Qt.ShiftModifier)):
            mime_data = QMimeData()
            mime_data.setText(PageWidget.DRAG_MAGIC)

            drag = QDrag(self)
            drag.setMimeData(mime_data)
            drag.setPixmap(self.grab(self.rect()))

            if event.modifiers() == Qt.ControlModifier:
                drag.exec_(Qt.MoveAction)
            else:
                drag.exec_(Qt.CopyAction)

            event.accept()
        else:
            event.ignore()

    def set_countdown_mode(self, mode):
        self._countdown_mode = mode
        self._update_time(self.cue.current_time())

    def set_accurate_timing(self, enable):
        self._accurate_timing = enable
        if self.cue.state == CueState.Pause:
            self._update_time(self.cue.current_time(), True)
        elif self.cue.state != CueState.Running:
            self._update_duration(self.cue.duration)

    def show_seek_slider(self, visible):
        self.seekSlider.setVisible(visible)
        self.update()

    def show_dbmeters(self, visible):
        if isinstance(self.cue, MediaCue):
            self._show_dbmeter = visible

            if self._dbmeter_element is not None:
                self._dbmeter_element.level_ready.disconnect(self.dbMeter.plot)
                self._dbmeter_element = None

            if visible:
                self._dbmeter_element = self.cue.media.element('DbMeter')
                if self._dbmeter_element is not None:
                    self._dbmeter_element.level_ready.connect(self.dbMeter.plot)

                self.layout().addWidget(self.dbMeter, 0, 1)
                self.layout().setColumnStretch(1, 1)
                self.dbMeter.show()
            else:
                self.dbMeter.hide()
                self.layout().setColumnStretch(1, 0)

            self.update()

    def _set_cue(self, cue):
        self.cue = cue
        self.cue.changed('name').connect(self._update_name, Connection.QtQueued)
        self.cue.changed('stylesheet').connect(self._update_style, Connection.QtQueued)
        self.cue.changed('duration').connect(self._update_duration, Connection.QtQueued)
        self.cue.changed('description').connect(self._update_description, Connection.QtQueued)

        if isinstance(cue, MediaCue):
            self.cue.media.changed('pipe').connect(self._media_updated)

            self.cue.paused.connect(self.dbMeter.reset, Connection.QtQueued)
            self.cue.stopped.connect(self.dbMeter.reset, Connection.QtQueued)
            self.cue.end.connect(self.dbMeter.reset, Connection.QtQueued)
            self.cue.error.connect(self.dbMeter.reset, Connection.QtQueued)

            self.seekSlider.sliderMoved.connect(self.cue.media.seek)
            self.seekSlider.sliderJumped.connect(self.cue.media.seek)

        # Cue status changed
        self.cue.started.connect(self._status_playing, Connection.QtQueued)
        self.cue.stopped.connect(self._status_stopped, Connection.QtQueued)
        self.cue.paused.connect(self._status_paused, Connection.QtQueued)
        self.cue.error.connect(self._status_error, Connection.QtQueued)
        self.cue.end.connect(self._status_stopped, Connection.QtQueued)

        self._cue_time = CueTime(self.cue)
        self._cue_time.notify.connect(self._update_time)

        self._update_name(cue.name)
        self._update_style(cue.stylesheet)
        self._update_duration(self.cue.duration)

    def _media_updated(self):
        self.show_dbmeters(self._show_dbmeter)

        new_fade = self.cue.media.element('Fade')
        if new_fade is not self._fade_element:
            if self._fade_element is not None:
                self._fade_element.enter_fadein.disconnect(self._enter_fadein)
                self._fade_element.enter_fadeout.disconnect(self._enter_fadeout)
                self._fade_element.exit_fadein.disconnect(self._exit_fade)
                self._fade_element.exit_fadeout.disconnect(self._exit_fade)

            if new_fade is not None:
                self._fade_element = new_fade
                self._fade_element.enter_fadein.connect(self._enter_fadein)
                self._fade_element.enter_fadeout.connect(self._enter_fadeout)
                self._fade_element.exit_fadein.connect(self._exit_fade)
                self._fade_element.exit_fadeout.connect(self._exit_fade)

    def _update_name(self, name):
        self.nameButton.setText(name)

    def _update_description(self, description):
        self.nameButton.setToolTip(description)

    def _clicked(self, event):
        if not self.seekSlider.geometry().contains(event.pos()):
            if event.button() != Qt.RightButton:
                if event.modifiers() == Qt.ShiftModifier:
                    self.edit_request.emit(self.cue)
                elif event.modifiers() == Qt.ControlModifier:
                    self.selected = not self.selected
                else:
                    self.cue_executed.emit(self.cue)
                    self.cue.execute()

    def _update_style(self, stylesheet):
        stylesheet += 'text-decoration: underline;' if self.selected else ''
        self.nameButton.setStyleSheet(stylesheet)

    def _enter_fadein(self):
        p = self.timeDisplay.palette()
        p.setColor(p.WindowText, QColor(0, 255, 0))
        self.timeDisplay.setPalette(p)

    def _enter_fadeout(self):
        p = self.timeDisplay.palette()
        p.setColor(p.WindowText, QColor(255, 50, 50))
        self.timeDisplay.setPalette(p)

    def _exit_fade(self):
        self.timeDisplay.setPalette(self.timeBar.palette())

    def _status_stopped(self):
        self.statusIcon.setPixmap(CueWidget.STOP.pixmap(CueWidget.ICON_SIZE,
                                                        CueWidget.ICON_SIZE))
        self._update_time(0, True)

    def _status_playing(self):
        self.statusIcon.setPixmap(CueWidget.START.pixmap(CueWidget.ICON_SIZE,
                                                         CueWidget.ICON_SIZE))

    def _status_paused(self):
        self.statusIcon.setPixmap(CueWidget.PAUSE.pixmap(CueWidget.ICON_SIZE,
                                                         CueWidget.ICON_SIZE))

    def _status_error(self, cue, error, details):
        self.statusIcon.setPixmap(CueWidget.ERROR.pixmap(CueWidget.ICON_SIZE,
                                                         CueWidget.ICON_SIZE))
        QDetailedMessageBox.dcritical(self.cue.name, error, details)

    def _update_duration(self, duration):
        # Update the maximum values of seek-slider and time progress-bar
        if duration > 0:
            if not self.timeBar.isVisible():
                self.layout().addWidget(self.timeBar, 1, 0, 1, 2)
                self.layout().setRowStretch(1, 1)
                self.timeBar.show()
            self.timeBar.setMaximum(duration)
            self.seekSlider.setMaximum(duration)
        else:
            self.timeBar.hide()
            self.layout().setRowStretch(1, 0)

        # If not in playing or paused update the widget showed time
        if self.cue.state != CueState.Running or self.cue.state != CueState.Running:
            self._update_time(duration, True)

    def _update_time(self, time, ignore_visibility=False):
        if ignore_visibility or not self.visibleRegion().isEmpty():
            # If the given value is the duration or < 0 set the time to 0
            if time == self.cue.duration or time < 0:
                time = 0

            # Set the value the seek slider
            self.seekSlider.setValue(time)

            # If in count-down mode the widget will show the remaining time
            if self._countdown_mode:
                time = self.cue.duration - time

            # Set the value of the timer progress-bar
            if self.cue.duration > 0:
                self.timeBar.setValue(time)

            # Show the time in the widget
            self.timeDisplay.display(strtime(time, accurate=self._accurate_timing))

    def resizeEvent(self, event):
        self.update()

    def update(self):
        super().update()
        self.layout().activate()

        xdim = self.nameButton.width()
        ydim = self.nameButton.height() / 5
        ypos = self.nameButton.height() - ydim

        self.seekSlider.setGeometry(0, ypos, xdim, ydim)
        self.statusIcon.setGeometry(4, 4, CueWidget.ICON_SIZE,
                                    CueWidget.ICON_SIZE)
Exemplo n.º 25
0
class GeneralsTab(QWidget):
    def __init__(self, bus, bms_com):
        super().__init__()
        self.com1 = bms_com
        self.bus = bus
        '''self.warning_label = QLabel()
        warning_layout = QHBoxLayout()
        warning_layout.addStretch()
        warning_layout.addWidget(self.warning_label)
        warning_layout.addStretch()'''

        #set state of charge layout
        self.stateofcharge = QLabel('State of Charge:')
        self.percentage = QLabel('%')
        self.line = QLineEdit()
        #self.fillBlanks('soc', self.line)
        self.line.setFixedWidth(40)
        self.line.setReadOnly(True)

        self.logo = QLabel('')
        self.i = QPixmap('C:/Users/iheb/BMS_UI/icons/State of charge.ico')
        self.logo.setPixmap(self.i.scaled(30, 30))

        h_box0 = QHBoxLayout()
        h_box0.addSpacing(30)
        h_box0.addWidget(self.logo)
        h_box0.addWidget(self.stateofcharge)
        h_box0.addWidget(self.line)
        h_box0.addWidget(self.percentage)
        h_box0.addStretch()

        # set GeneralVolatge Layout

        self.voltage = QLabel("Battery Voltage")
        self.line2 = QLineEdit()

        self.line2.setFixedWidth(50)
        self.line2.setReadOnly(True)
        self.v = QLabel('V')

        self.logo1 = QLabel('')
        self.i1 = QPixmap('C:/Users/iheb/BMS_UI/icons/voltage.ico')
        self.logo1.setPixmap(self.i1.scaled(30, 30))

        h_box2 = QHBoxLayout()
        h_box2.addSpacing(30)
        h_box2.addWidget(self.logo1)
        h_box2.addWidget(self.voltage)
        h_box2.addWidget(self.line2)
        h_box2.addWidget(self.v)
        h_box2.addStretch()

        # set SC Layout

        self.sc = QLabel("Shutdown Circuit")
        self.line3 = QLineEdit()
        self.line3.setFixedWidth(50)
        self.line3.setReadOnly(True)

        self.logo2 = QLabel('')
        self.i2 = QPixmap('C:/Users/iheb/BMS_UI/icons/sc.png')
        self.logo2.setPixmap(self.i2.scaled(30, 30))

        h_box3 = QHBoxLayout()
        h_box3.addSpacing(30)
        h_box3.addWidget(self.logo2)
        h_box3.addWidget(self.sc)
        h_box3.addWidget(self.line3)

        h_box3.addStretch()

        #set Current (strom) layout
        self.current = QLabel("Battery Current (Strom)")
        self.line4 = QLineEdit()
        self.line4.setFixedWidth(50)
        self.line4.setReadOnly(True)
        self.c = QLabel('mA')

        self.logo3 = QLabel('')
        self.i3 = QPixmap('C:/Users/iheb/BMS_UI/icons/Strom.ico')
        self.logo3.setPixmap(self.i3.scaled(30, 30))

        h_box4 = QHBoxLayout()
        h_box4.addSpacing(30)
        h_box4.addWidget(self.logo3)
        h_box4.addWidget(self.current)
        h_box4.addWidget(self.line4)
        h_box4.addWidget(self.c)
        h_box4.addStretch()

        # first vertical layout that contains 5 horizental ones
        v_box1 = QVBoxLayout()
        v_box1.addSpacing(30)
        v_box1.addLayout(h_box0)

        v_box1.addStretch()

        v_box1.addLayout(h_box4)
        v_box1.addStretch()
        v_box1.addLayout(h_box2)

        v_box1.addStretch()
        v_box1.addLayout(h_box3)

        # max voltage layout

        self.vm = QLabel('Voltage Max:')
        self.line5 = QLineEdit()
        self.line5.setFixedWidth(50)
        self.line5.setReadOnly(True)
        self.logo8 = QLabel('')
        self.i8 = QPixmap('C:/Users/iheb/BMS_UI/icons/maxVoltage.png')
        self.logo8.setPixmap(self.i8.scaled(30, 30))
        self.v1 = QLabel('V')

        h_box5 = QHBoxLayout()
        h_box5.addSpacing(30)
        h_box5.addWidget(self.logo8)
        h_box5.addWidget(self.vm)
        h_box5.addWidget(self.line5)
        h_box5.addWidget(self.v1)
        h_box5.addStretch()

        # min Voltage Layout

        self.prStartTime = QLabel('Voltage Min:')
        self.line6 = QLineEdit()

        self.line6.setFixedWidth(50)
        self.line6.setReadOnly(True)
        self.logo4 = QLabel('')
        self.i4 = QPixmap('C:/Users/iheb/BMS_UI/icons/minVoltage.png')
        self.logo4.setPixmap(self.i4.scaled(30, 30))
        self.s = QLabel('mV')
        h_box6 = QHBoxLayout()
        h_box6.addSpacing(30)
        h_box6.addWidget(self.logo4)
        h_box6.addWidget(self.prStartTime)
        h_box6.addWidget(self.line6)
        h_box6.addWidget(self.s)
        h_box6.addStretch()

        # max temperature Layout

        self.failTime = QLabel('Temperature Max:')
        self.line7 = QLineEdit()
        self.line7.setFixedWidth(50)
        self.line7.setReadOnly(True)
        self.logo5 = QLabel('')
        self.i5 = QPixmap('C:/Users/iheb/BMS_UI/icons/maxTemperature.png')
        self.logo5.setPixmap(self.i5.scaled(30, 30))
        self.s1 = QLabel('C°')
        h_box7 = QHBoxLayout()
        h_box7.addSpacing(30)
        h_box7.addWidget(self.logo5)
        h_box7.addWidget(self.failTime)
        h_box7.addWidget(self.line7)
        h_box7.addWidget(self.s1)
        h_box7.addStretch()

        # min Temperature Layout

        self.upTime = QLabel('Temperature Min:')
        self.line8 = QLineEdit()
        self.line8.setFixedWidth(50)
        self.line8.setReadOnly(True)
        self.logo6 = QLabel('')
        self.i6 = QPixmap('C:/Users/iheb/BMS_UI/icons/minTemperature.png')
        self.logo6.setPixmap(self.i6.scaled(30, 30))
        self.s2 = QLabel('C°')
        h_box8 = QHBoxLayout()
        h_box8.addSpacing(30)
        h_box8.addWidget(self.logo6)
        h_box8.addWidget(self.upTime)
        h_box8.addWidget(self.line8)
        h_box8.addWidget(self.s2)
        h_box8.addStretch()

        # second vertical layout that contains 5 horizental ones
        v_box2 = QVBoxLayout()
        v_box2.addSpacing(30)
        v_box2.addLayout(h_box5)
        v_box2.addStretch()
        v_box2.addLayout(h_box6)
        v_box2.addStretch()
        v_box2.addLayout(h_box7)
        v_box2.addStretch()
        v_box2.addLayout(h_box8)

        #Transmition error Layout

        self.txError = QLabel('Transmition Error: ')
        self.line10 = QLineEdit()
        self.line10.setFixedWidth(50)
        self.line10.setReadOnly(True)

        h_box10 = QHBoxLayout()
        h_box10.addSpacing(30)
        h_box10.addWidget(self.txError)
        h_box10.addWidget(self.line10)
        h_box10.addStretch()

        # set current State layout

        self.state = QLabel("Current State: ")
        self.line1 = QLineEdit()
        self.line1.setFixedWidth(120)
        self.line1.setReadOnly(True)
        h_box1 = QHBoxLayout()
        h_box1.addSpacing(30)
        h_box1.addWidget(self.state)
        h_box1.addWidget(self.line1)
        h_box1.addStretch()

        # dcLink Voltage Layout

        self.HV_state = QLabel('HV Button:')
        self.line9 = QLineEdit('off')

        self.line9.setFixedWidth(30)
        self.line9.setReadOnly(True)
        self.v2 = QLabel('V')
        h_box9 = QHBoxLayout()
        h_box9.addSpacing(30)
        h_box9.addWidget(self.HV_state)
        h_box9.addWidget(self.line9)
        #h_box9.addWidget(self.v2)
        h_box9.addStretch()

        #start balancing command
        self.startBalancing = QPushButton('Start Balancing')
        self.logo7 = QLabel('')
        self.i7 = QPixmap('C:/Users/iheb/BMS_UI/icons/balancing.png')
        self.logo7.setPixmap(self.i7.scaled(30, 30))
        self.respond = QLabel('   ')

        #HV_Button_simuator
        self.HVButton = QPushButton('HV Button')
        self.logo9 = QLabel('')
        self.i9 = QPixmap('C:/Users/iheb/BMS_UI/icons/HV.png')
        self.logo9.setPixmap(self.i9.scaled(30, 30))
        self.respond1 = QLabel()
        self.i_hv = QPixmap('C:/Users/iheb/BMS_UI/icons/respond.png')

        h_box15 = QHBoxLayout()
        h_box15.addSpacing(30)
        h_box15.addWidget(self.logo7)
        h_box15.addSpacing(10)
        h_box15.addWidget(self.startBalancing)
        h_box15.addStretch()
        h_box15.addWidget(self.respond)
        h_box15.addStretch()

        h_box16 = QHBoxLayout()
        h_box16.addSpacing(30)
        h_box16.addWidget(self.logo9)
        h_box16.addSpacing(10)
        h_box16.addWidget(self.HVButton)
        h_box16.addStretch()
        h_box16.addWidget(self.respond1)
        h_box16.addStretch()

        v_box4 = QVBoxLayout()
        v_box4.addLayout(h_box15)
        v_box4.addStretch()
        v_box4.addLayout(h_box16)
        v_box4.addStretch()

        # AirLsAux  Layout
        '''self.airls = QLabel('AirLSAux: ')
        self.line11 = QLineEdit()
        self.line11.setFixedWidth(30)
        self.line11.setReadOnly(True)

        h_box11 = QHBoxLayout()
        h_box11.addSpacing(30)
        h_box11.addWidget(self.airls)
        h_box11.addWidget(self.line11)
        h_box11.addStretch()

        # AirHsAux  Layout

        self.airhs = QLabel('AirHSAux: ')
        self.line12 = QLineEdit()
        self.line12.setFixedWidth(30)
        self.line12.setReadOnly(True)

        h_box12 = QHBoxLayout()
        h_box12.addSpacing(30)
        h_box12.addWidget(self.airhs)
        h_box12.addWidget(self.line12)
        h_box12.addStretch()

        # HV Button  Layout

        self.hvButton = QLabel('HV Button: ')
        self.line13 = QLineEdit()
        self.line13.setFixedWidth(30)
        self.line13.setReadOnly(True)


        h_box13 = QHBoxLayout()
        h_box13.addSpacing(30)
        h_box13.addWidget(self.hvButton)
        h_box13.addWidget(self.line13)
        h_box13.addStretch()

        # Start Load Layout

        self.startLoad = QLabel('StartLoad: ')
        self.line14 = QLineEdit()
        self.line14.setFixedWidth(30)
        self.line14.setReadOnly(True)

        h_box14 = QHBoxLayout()
        h_box14.addSpacing(30)
        h_box14.addWidget(self.startLoad)
        h_box14.addWidget(self.line14)
        h_box14.addStretch()'''

        #third vertical layout that contains 5 horizental ones
        v_box3 = QVBoxLayout()
        v_box3.addSpacing(30)
        v_box3.addLayout(h_box10)
        v_box3.addStretch()
        v_box3.addLayout(h_box1)
        v_box3.addStretch()
        v_box3.addLayout(h_box9)
        v_box3.addStretch()
        v_box3.addLayout(v_box4)

        #horizental layout containing the fan controlling slider

        self.comment = QLabel('Enable')
        self.enable = QCheckBox()
        self.fan = QLabel('Fan Controller: ')
        self.lcd = QLCDNumber(self)
        self.sld = QSlider(Qt.Horizontal, self)
        self.sld.setMinimum(0)
        self.sld.setMaximum(100)
        self.sld.setTickInterval(1)
        palette = self.lcd.palette()
        palette.setColor(palette.Light, QColor(255, 0, 0))
        self.lcd.setPalette(palette)
        self.lcd.setFixedSize(55, 30)
        hbox = QHBoxLayout()
        hbox.addStretch()
        hbox.addWidget(self.comment)
        hbox.addWidget(self.enable)
        hbox.addWidget(self.fan)
        hbox.addWidget(self.sld)
        hbox.addSpacing(30)
        hbox.addWidget(self.lcd)
        hbox.addStretch()

        # set general layout
        v_box0 = QVBoxLayout()

        h_box = QHBoxLayout()
        h_box.addLayout(v_box1)
        h_box.addStretch()
        h_box.addLayout(v_box2)
        h_box.addStretch()
        h_box.addLayout(v_box3)
        h_box.addSpacing(30)
        #v_box0.addLayout(warning_layout)
        v_box0.addLayout(h_box)
        v_box0.addSpacing(30)

        v_box = QVBoxLayout()
        v_box.addLayout(v_box0)
        v_box.addLayout(hbox)

        self.setLayout(v_box)
        self.t = QTimer()  #timer for the Balancing response
        self.t1 = QTimer()  #timer for the HV Button response
        self.ie = QPixmap('C:/Users/iheb/BMS_UI/icons/error.png')
        self.i = QPixmap('C:/Users/iheb/BMS_UI/icons/respond.png')

    def fillBlanks(
        self
    ):  #methode that times the filling of the labels from the general tab
        self.timer1 = QTimer()
        self.timer1.timeout.connect(lambda: self.setData())
        self.timer1.start(2000)

    def setData(self):  #methode that enables the data to be set
        """self.d = self.data
        threading.Thread(target= self.d.fillData(140, 'soc')).start()
        threading.Thread(target=self.d.fillData(140, 'cs')).start()
        threading.Thread(target=self.d.fillData(140, 'bc')).start()
        threading.Thread(target=self.d.fillData(140, 'bv')).start()
        threading.Thread(target=self.d.fillData(140, 'sc')).start()
        threading.Thread(target=self.d.fillData(140, 'hvb')).start()
        threading.Thread(target=self.d.fillData(140, 'te')).start()
        threading.Thread(target=self.d.fillData(140, 'mxV')).start()
        threading.Thread(target=self.d.fillData(140, 'mnV')).start()
        threading.Thread(target=self.d.fillData(140, 'mxT')).start()
        threading.Thread(target=self.d.fillData(140, 'mnT')).start()"""
        self.line.setText(str(BMS_Data.getdata(cell=1, type='soc')))

        self.line1.setText(str(BMS_Data.getdata(cell=1, type='cs')))
        #print(str(BMS_Data.getdata(cell=1, type='cs')))
        self.line2.setText(str(BMS_Data.getdata(cell=1, type='bv')))
        #print(str(BMS_Data.getdata(cell=1, type='bv')))
        self.line3.setText(str(BMS_Data.getdata(cell=1, type='sc')))
        #print(str(BMS_Data.getdata(cell=1, type='sc')))
        self.line4.setText(str(BMS_Data.getdata(cell=1, type='bc')))
        #print(str(BMS_Data.getdata(cell=1, type='bc')))
        self.line5.setText(str(BMS_Data.getdata(cell=1, type='mxV')))
        #print(str(BMS_Data.getdata(cell=1, type='mxV')))
        self.line6.setText(str(BMS_Data.getdata(cell=1, type='mnV')))
        #print(str(BMS_Data.getdata(cell=1, type='mnV')))
        self.line7.setText(str(BMS_Data.getdata(cell=1, type='mxT')))
        #print(str(BMS_Data.getdata(cell=1, type='mxT')))
        self.line8.setText(str(BMS_Data.getdata(cell=1, type='mnT')))
        #print(str(BMS_Data.getdata(cell=1, type='mnT')))
        self.line9.setText(str(BMS_Data.getdata(cell=1, type='hvb')))
        #print(str(BMS_Data.getdata(cell=1, type='hvb')))
        self.line10.setText(str(BMS_Data.getdata(cell=1, type='te')))
        #print(str(BMS_Data.getdata(cell=1, type='te')))
        #self.line11.setText(str(self.d.getdata(cell=1, type='airLsAux')))
        #self.line12.setText(str(self.d.getdata(cell=1, type='airHsAux')))
        #self.line13.setText(str(self.d.getdata(cell=1, type='hvb')))
        #self.line14.setText(str(self.d.getdata(cell=1, type='sl')))

    def start_Balancing(self):

        self.respond.setMinimumSize(30, 30)

        if BMS_ControlParameter.getConnectionState():
            try:

                if self.sender().text() == 'Start Balancing':
                    self.startBalancing.setText('Stop Balancing')
                    self.com1.balancing(self.bus)
                    print('balancing on')
                    self.respond.setPixmap(self.i.scaled(30, 30))
                    self.t.timeout.connect(lambda: threading.Thread(
                        target=self.response(self.t, self.respond)).start())
                    self.t.start(2000)

                else:
                    self.startBalancing.setText('Start Balancing')
                    self.com1.stop_balancing(self.bus)
                    print('balancing off')
                    self.respond.setPixmap(self.i.scaled(30, 30))
                    self.t.timeout.connect(lambda: threading.Thread(
                        target=self.response(self.t, self.respond)).start())
                    self.t.start(2000)
            except Exception as e:

                self.respond.setPixmap(self.ie.scaled(30, 30))
                logging.error(traceback.format_exc())
        else:
            print("you need to be connected")

    def response(self, timer, label):
        label.clear()
        timer.stop()

    def HV_clicked(self):
        self.respond1.setMinimumSize(30, 30)

        if BMS_ControlParameter.getConnectionState():
            try:
                BMS_Data.setHv(1)
                self.com1.HV_simulate(self.bus)

                self.respond1.setPixmap(self.i_hv.scaled(30, 30))

                #self.t1.timeout.connect(lambda: threading.Thread(target=self.response(self.t1,self.respond1)).start())
                #self.t1.start(2000)

            except Exception as e:
                self.respond1.setPixmap(self.ie.scaled(30, 30))

                logging.error(traceback.format_exc())
        else:
            print("you need to be connected")

    """def no_pcan(self):
        self.warning_label.setText('NO PCAN ADAPTER IS DETECTED, PLEASE PLUG ADAPTER AND RESTART THE PROGRAM')"""

    def controlFan(self, x):

        if self.enable.isChecked(
        ):  #the check box needs to be checked in order to execute any command
            if BMS_ControlParameter.getConnectionState(
            ):  #there needs to be connection in order to execute any command
                try:
                    print(x)

                    if (x >= 0) and (x <= 100):
                        self.com1.sendFanControl(self.bus, x)

                except Exception as e:
                    #self.enable.setChecked(False)
                    logging.error(traceback.format_exc())
            else:
                print("you need to be connected")

    def sendUserFlag(self):
        sender = self.sender()
        if BMS_ControlParameter.getConnectionState() and sender.isChecked():
            self.com1.setUserFlag(self.bus)
            print('set')
        elif BMS_ControlParameter.getConnectionState() and not (
                sender.isChecked()):
            self.com1.resetUserFlag(self.bus)
            print('reset')
        else:
            print('not Connected')


####################################################################################################################