Esempio n. 1
0
    def __init__(self, vehicle_event_dispatcher, ui_event_dispatcher):
        QtGui.QWidget.__init__(self)
        BasePanelController.__init__(self)

        self.ui = Ui_PIDParametersUpdaterPanel()
        self.ui.setupUi(self)

        self.ui.pid_type_list.addItem("ACCRO")
        self.ui.pid_type_list.addItem("STABLE")
        self.ui.pid_type_list.clicked.connect(self._pid_list_selection_clicked)
        self.ui.pid_type_list.setCurrentRow(0)

        self._accro_pid_tuning_controller = AccroPIDTuningController(
            vehicle_event_dispatcher, ui_event_dispatcher)
        self.ui.panel_container.addWidget(self._accro_pid_tuning_controller)
        self.ui.panel_container.setCurrentIndex(0)

        self._stable_pid_tuning_controller = StablePIDTuningController(
            vehicle_event_dispatcher, ui_event_dispatcher)
        self.ui.panel_container.addWidget(self._stable_pid_tuning_controller)

        self.ui.beginner_radio_button.clicked.connect(
            self._beginner_radio_button_pressed)
        self.ui.intermediate_radio_button.clicked.connect(
            self._intermediate_radio_button_pressed)
        self.ui.advance_radio_button.clicked.connect(
            self._advanced_radio_button_pressed)
        self.ui.beginner_radio_button.setChecked(True)

        self._current_pid_tuning_controller = self._accro_pid_tuning_controller
class PIDParametersUpdaterController(QtGui.QWidget, BasePanelController):
    
    def __init__(self, vehicle_event_dispatcher, ui_event_dispatcher):
        QtGui.QWidget.__init__(self)
        BasePanelController.__init__(self)
        
        self.ui = Ui_PIDParametersUpdaterPanel()
        self.ui.setupUi(self)
        
        self.ui.pid_type_list.addItem("ACCRO")
        self.ui.pid_type_list.addItem("STABLE")
        self.ui.pid_type_list.clicked.connect(self._pid_list_selection_clicked)
        self.ui.pid_type_list.setCurrentRow(0)
        
        
        self._accro_pid_tuning_controller = AccroPIDTuningController(vehicle_event_dispatcher, ui_event_dispatcher)
        self.ui.panel_container.addWidget(self._accro_pid_tuning_controller)
        self.ui.panel_container.setCurrentIndex(0)
        
        self._stable_pid_tuning_controller = StablePIDTuningController(vehicle_event_dispatcher, ui_event_dispatcher)
        self.ui.panel_container.addWidget(self._stable_pid_tuning_controller)
        
        self.ui.beginner_radio_button.clicked.connect(self._beginner_radio_button_pressed)
        self.ui.intermediate_radio_button.clicked.connect(self._intermediate_radio_button_pressed)
        self.ui.advance_radio_button.clicked.connect(self._advanced_radio_button_pressed)
        self.ui.beginner_radio_button.setChecked(True)
        
        self._current_pid_tuning_controller = self._accro_pid_tuning_controller
        
        
    def _pid_list_selection_clicked(self):
        if (self.ui.pid_type_list.currentItem().text() == 'ACCRO'):
            self._current_pid_tuning_controller = self._accro_pid_tuning_controller
        else:
            self._current_pid_tuning_controller = self._stable_pid_tuning_controller
        self.ui.panel_container.setCurrentWidget(self._current_pid_tuning_controller)
        
    def _beginner_radio_button_pressed(self):
        self._current_pid_tuning_controller.setBeginnerMode()
        
    def _intermediate_radio_button_pressed(self):
        self._current_pid_tuning_controller.setIntermediateMode()
    
    def _advanced_radio_button_pressed(self):
        self._current_pid_tuning_controller.setAdvancedMode()

        
    def start(self):
        pass
    def __init__(self, vehicle_event_dispatcher, ui_event_dispatcher):
        QtGui.QWidget.__init__(self)
        BasePanelController.__init__(self)

        self.ui = Ui_PIDParametersUpdaterPanel()
        self.ui.setupUi(self)
        self.ui.parameterTable.verticalHeader().setVisible(False)
        self.ui.buttonLoad.setEnabled(False)
        self.ui.buttonSave.setEnabled(False)
        self.ui.buttonUpload.setEnabled(False)

        self.ui.listParameterType.clicked.connect(self.updateSelection)
        self.ui.buttonUpload.clicked.connect(self.updateParameters)
        self.ui.buttonSave.clicked.connect(self.underConstruction)
        self.ui.buttonLoad.clicked.connect(self.underConstruction)
 def __init__(self, vehicle_event_dispatcher, ui_event_dispatcher):
     QtGui.QWidget.__init__(self)
     BasePanelController.__init__(self)
     
     self.ui = Ui_PIDParametersUpdaterPanel()
     self.ui.setupUi(self)
     
     self.ui.pid_type_list.addItem("ACCRO")
     self.ui.pid_type_list.addItem("STABLE")
     self.ui.pid_type_list.clicked.connect(self._pid_list_selection_clicked)
     self.ui.pid_type_list.setCurrentRow(0)
     
     self._accro_pid_tuning_controller = AccroPIDTuningController(vehicle_event_dispatcher, ui_event_dispatcher)
     self.ui.panel_container.addWidget(self._accro_pid_tuning_controller)
     self.ui.panel_container.setCurrentIndex(0)
     
     self._stable_pid_tuning_controller = StablePIDTuningController(vehicle_event_dispatcher, ui_event_dispatcher)
     self.ui.panel_container.addWidget(self._stable_pid_tuning_controller)
     
     self.ui.beginner_radio_button.clicked.connect(self._beginner_radio_button_pressed)
     self.ui.intermediate_radio_button.clicked.connect(self._intermediate_radio_button_pressed)
     self.ui.advance_radio_button.clicked.connect(self._advanced_radio_button_pressed)
     self.ui.beginner_radio_button.setChecked(True)
     self.ui.default_button.clicked.connect(self._default_button_pressed)
     
     self._current_pid_tuning_controller = self._accro_pid_tuning_controller
     self._user_level_mode = PIDUpdateMode.BEGINNER_MODE
     
     self._timer = QtCore.QTimer()
     self._timer.timeout.connect(self._sync_with_board)
 def __init__(self, vehicle_event_dispatcher, ui_event_dispatcher):
     QtGui.QWidget.__init__(self)
     BasePanelController.__init__(self)
     
     self.ui = Ui_PIDParametersUpdaterPanel()
     self.ui.setupUi(self)
     self.ui.parameterTable.verticalHeader().setVisible(False)
     self.ui.buttonLoad.setEnabled(False)
     self.ui.buttonSave.setEnabled(False)
     self.ui.buttonUpload.setEnabled(False)
     
     self.ui.listParameterType.clicked.connect(self.updateSelection)
     self.ui.buttonUpload.clicked.connect(self.updateParameters)
     self.ui.buttonSave.clicked.connect(self.underConstruction)
     self.ui.buttonLoad.clicked.connect(self.underConstruction)
class PIDParametersUpdaterController(QtGui.QWidget, BasePanelController):
    
    
    def __init__(self, vehicle_event_dispatcher, ui_event_dispatcher):
        QtGui.QWidget.__init__(self)
        BasePanelController.__init__(self)
        
        self.ui = Ui_PIDParametersUpdaterPanel()
        self.ui.setupUi(self)
        
        self.ui.pid_type_list.addItem("ACCRO")
        self.ui.pid_type_list.addItem("STABLE")
        self.ui.pid_type_list.clicked.connect(self._pid_list_selection_clicked)
        self.ui.pid_type_list.setCurrentRow(0)
        
        self._accro_pid_tuning_controller = AccroPIDTuningController(vehicle_event_dispatcher, ui_event_dispatcher)
        self.ui.panel_container.addWidget(self._accro_pid_tuning_controller)
        self.ui.panel_container.setCurrentIndex(0)
        
        self._stable_pid_tuning_controller = StablePIDTuningController(vehicle_event_dispatcher, ui_event_dispatcher)
        self.ui.panel_container.addWidget(self._stable_pid_tuning_controller)
        
        self.ui.beginner_radio_button.clicked.connect(self._beginner_radio_button_pressed)
        self.ui.intermediate_radio_button.clicked.connect(self._intermediate_radio_button_pressed)
        self.ui.advance_radio_button.clicked.connect(self._advanced_radio_button_pressed)
        self.ui.beginner_radio_button.setChecked(True)
        self.ui.default_button.clicked.connect(self._default_button_pressed)
        
        self._current_pid_tuning_controller = self._accro_pid_tuning_controller
        self._user_level_mode = PIDUpdateMode.BEGINNER_MODE
        
        self._timer = QtCore.QTimer()
        self._timer.timeout.connect(self._sync_with_board)
        
    def _pid_list_selection_clicked(self):
        self._current_pid_tuning_controller.stop()
        if (self.ui.pid_type_list.currentItem().text() == 'ACCRO'):
            self._current_pid_tuning_controller = self._accro_pid_tuning_controller
        else:
            self._current_pid_tuning_controller = self._stable_pid_tuning_controller
        
        self.ui.panel_container.setCurrentWidget(self._current_pid_tuning_controller)
        if (self._user_level_mode == PIDUpdateMode.BEGINNER_MODE) :
            self._current_pid_tuning_controller.setBeginnerMode()
        elif (self._user_level_mode == PIDUpdateMode.INTERMEDIATE_MODE) :
            self._current_pid_tuning_controller.setIntermediateMode()
        else :
            self._current_pid_tuning_controller.setAdvancedMode()
        self._current_pid_tuning_controller.start()
        
    def _beginner_radio_button_pressed(self):
        self._user_level_mode = PIDUpdateMode.BEGINNER_MODE
        self._current_pid_tuning_controller.set_beginner_mode()
        
    def _intermediate_radio_button_pressed(self):
        self._user_level_mode = PIDUpdateMode.INTERMEDIATE_MODE
        self._current_pid_tuning_controller.set_intermediate_mode()
    
    def _advanced_radio_button_pressed(self):
        self._user_level_mode = PIDUpdateMode.ADVANCED_MODE
        self._current_pid_tuning_controller.set_advanced_mode()

    def start(self):
        self._current_pid_tuning_controller.start()
        self._timer.start(250)
        
    def stop(self):
        self._current_pid_tuning_controller.stop()
        self._timer.stop()

    def _sync_with_board(self):
        self._current_pid_tuning_controller.sync_with_board()

    def _default_button_pressed(self):
        self._current_pid_tuning_controller.reset_default()
class PIDParametersUpdaterController(QtGui.QWidget, BasePanelController):
    
    def __init__(self, vehicle_model, message_sender):
        QtGui.QWidget.__init__(self)
        BasePanelController.__init__(self)
        
        self.vehicle_model = vehicle_model
        self.message_sender = message_sender
        
        self.ui = Ui_PIDParametersUpdaterPanel()
        self.ui.setupUi(self)
        self.ui.parameterTable.verticalHeader().setVisible(False)
        self.ui.buttonLoad.setEnabled(False)
        self.ui.buttonSave.setEnabled(False)
        self.ui.buttonUpload.setEnabled(False)
        
        self.ui.listParameterType.clicked.connect(self.updateSelection)
        self.ui.buttonUpload.clicked.connect(self.updateParameters)
        self.ui.buttonSave.clicked.connect(self.underConstruction)
        self.ui.buttonLoad.clicked.connect(self.underConstruction)
        
    def start(self, xmlSubPanel, boardConfiguration):
        self.subPanelName = xmlSubPanel
        self.boardConfiguration = boardConfiguration
        parameterTypes = self.xml.findall(self.subPanelName + "/ParameterType")
        self.ui.listParameterType.clear()
        # Load parameter types
        for parameterType in parameterTypes:
            typeName = parameterType.get("Name")
            if self.checkRequirementsMatch(self.subPanelName + "/ParameterType/[@Name='" + typeName + "']/Requirement"):
                self.ui.listParameterType.addItem(typeName)
        self.ui.listParameterType.setCurrentRow(0)
        self.ui.listParameterType.setFocus()
        descriptionHeader = QtGui.QTableWidgetItem("   Description")
        descriptionHeader.setTextAlignment(QtCore.Qt.AlignVCenter|QtCore.Qt.AlignLeft)
        self.ui.parameterTable.setHorizontalHeaderItem(2, descriptionHeader)
        self.updateSelection()
        self.ui.buttonLoad.setEnabled(self.comm.isConnected())
        self.ui.buttonSave.setEnabled(self.comm.isConnected())
        self.ui.buttonUpload.setEnabled(self.comm.isConnected())        
        
    def getXmlLocation(self, value):
        selectedType = str(self.ui.listParameterType.currentItem().text())
        xmlLocation = self.subPanelName + "/ParameterType/[@Name='" + selectedType + "']/" + value
        return xmlLocation
                   
    def updateSelection(self):
        # Generate location of where subpanel values are in XML
        parameterNames = self.xml.findall(self.getXmlLocation("Parameter"))
        
        # If connected, query AeroQuad for parameter values        
        if self.comm.isConnected():
            telemetry = self.xml.find(self.getXmlLocation("Telemetry")).text
            self.comm.write(telemetry)
            time.sleep(0.100)
            response = self.comm.waitForRead()
            telemetryData = response.split(",")
        
        # Fill in each row of parameter table
        rowCount = len(parameterNames)
        self.ui.parameterTable.setRowCount(rowCount)
        for currentRow in range(rowCount):
            # Create a floating point widget for value column
            name = QtGui.QTableWidgetItem(parameterNames[currentRow].get("Name") + "   ")
            data = QtGui.QDoubleSpinBox()
            data.setMinimum(-5000.0)
            data.setMaximum(5000)
            data.setDecimals(2)
            data.setAlignment(QtCore.Qt.AlignVCenter|QtCore.Qt.AlignRight)
            # If connected, fill in with telemetry response, otherwise fill in from XML file
            if self.comm.isConnected():
                data.setValue(float(telemetryData[currentRow]))
            else:
                data.setValue(float(parameterNames[currentRow].text))
            description = QtGui.QTableWidgetItem("   " + parameterNames[currentRow].get("Description"))
            self.ui.parameterTable.setItem(currentRow, 0, name)
            self.ui.parameterTable.setCellWidget(currentRow, 1, data)
            self.ui.parameterTable.setItem(currentRow, 2, description)
            
        self.ui.parameterTable.resizeColumnToContents(0)
        self.ui.parameterTable.resizeColumnToContents(1)
        self.ui.parameterTable.resizeColumnToContents(2)
        
    def updateParameters(self):
        parameterData = []
        for row in range(self.ui.parameterTable.rowCount()):
            #parameterData.append(str(self.ui.parameterTable.cellWidget(row, 1).text()))
            data = str(self.ui.parameterTable.cellWidget(row, 1).text())
            data = data.replace(',','.')
            parameterData.append(data)
        command = self.xml.find(self.getXmlLocation("Command")).text
        commandMessage = command + ";".join(parameterData) + ";"
        self.comm.write(commandMessage)
        time.sleep(0.100)
        telemetry = self.xml.find(self.getXmlLocation("Telemetry")).text
        self.comm.write(telemetry)
        time.sleep(0.100)
        response = self.comm.waitForRead()
        if response[-1] == ",":
            response = response[:-1]
        telemetryData = response.split(",")
        parameters = [float(x) for x in parameterData]
        telemetrys = [float(x) for x in telemetryData]
        if parameters == telemetrys:
            updateEEPROM = self.xml.find(self.getXmlLocation("UpdateEEPROM")).text
            self.comm.write(updateEEPROM)
            self.status("Parameter values successfully stored to the AeroQuad")
        else:
            parameterString = ", ".join(map(str, parameters))
            telemetryString = ", ".join(map(str,telemetrys))
            warningMessage = "Unable to verify parameters stored on the AeroQuad\n\nSent:         " + parameterString + "\nReceived: " + telemetryString
            msgBox = QtGui.QMessageBox(QtGui.QMessageBox.Warning, "Verification Error", warningMessage, QtGui.QMessageBox.NoButton, self)
            msgBox.addButton("&Retry", QtGui.QMessageBox.AcceptRole)
            msgBox.addButton("&Abort", QtGui.QMessageBox.RejectRole)
            if msgBox.exec_() == QtGui.QMessageBox.AcceptRole:
                self.status("Retrying parameter storage to AeroQuad...")
                self.updateParameters()
            else:
                self.status("Aborted parameter storage to AeroQuad")

    def underConstruction(self):
        self.status("This feature still under construction")
class PIDParametersUpdaterController(QtGui.QWidget, BasePanelController):
    def __init__(self, vehicle_event_dispatcher, ui_event_dispatcher):
        QtGui.QWidget.__init__(self)
        BasePanelController.__init__(self)

        self.ui = Ui_PIDParametersUpdaterPanel()
        self.ui.setupUi(self)
        self.ui.parameterTable.verticalHeader().setVisible(False)
        self.ui.buttonLoad.setEnabled(False)
        self.ui.buttonSave.setEnabled(False)
        self.ui.buttonUpload.setEnabled(False)

        self.ui.listParameterType.clicked.connect(self.updateSelection)
        self.ui.buttonUpload.clicked.connect(self.updateParameters)
        self.ui.buttonSave.clicked.connect(self.underConstruction)
        self.ui.buttonLoad.clicked.connect(self.underConstruction)

    def start(self):
        pass
#        self.subPanelName = xmlSubPanel
#        self.boardConfiguration = boardConfiguration
#        parameterTypes = self.xml.findall(self.subPanelName + "/ParameterType")
#        self.ui.listParameterType.clear()
#        # Load parameter types
#        for parameterType in parameterTypes:
#            typeName = parameterType.get("Name")
#            if self.checkRequirementsMatch(self.subPanelName + "/ParameterType/[@Name='" + typeName + "']/Requirement"):
#                self.ui.listParameterType.addItem(typeName)
#        self.ui.listParameterType.setCurrentRow(0)
#        self.ui.listParameterType.setFocus()
#        descriptionHeader = QtGui.QTableWidgetItem("   Description")
#        descriptionHeader.setTextAlignment(QtCore.Qt.AlignVCenter|QtCore.Qt.AlignLeft)
#        self.ui.parameterTable.setHorizontalHeaderItem(2, descriptionHeader)
#        self.updateSelection()
#        self.ui.buttonLoad.setEnabled(self._communicator.isConnected())
#        self.ui.buttonSave.setEnabled(self._communicator.isConnected())
#        self.ui.buttonUpload.setEnabled(self._communicator.isConnected())

    def getXmlLocation(self, value):
        selectedType = str(self.ui.listParameterType.currentItem().text())
        xmlLocation = self.subPanelName + "/ParameterType/[@Name='" + selectedType + "']/" + value
        return xmlLocation

    def updateSelection(self):
        # Generate location of where subpanel values are in XML
        parameterNames = self.xml.findall(self.getXmlLocation("Parameter"))

        # If connected, query AeroQuad for parameter values
        if self._communicator.isConnected():
            telemetry = self.xml.find(self.getXmlLocation("Telemetry")).text
            self._communicator.write(telemetry)
            time.sleep(0.100)
            response = self._communicator.waitForRead()
            telemetryData = response.split(",")

        # Fill in each row of parameter table
        rowCount = len(parameterNames)
        self.ui.parameterTable.setRowCount(rowCount)
        for currentRow in range(rowCount):
            # Create a floating point widget for value column
            name = QtGui.QTableWidgetItem(
                parameterNames[currentRow].get("Name") + "   ")
            data = QtGui.QDoubleSpinBox()
            data.setMinimum(-5000.0)
            data.setMaximum(5000)
            data.setDecimals(2)
            data.setAlignment(QtCore.Qt.AlignVCenter | QtCore.Qt.AlignRight)
            # If connected, fill in with telemetry response, otherwise fill in from XML file
            if self._communicator.isConnected():
                data.setValue(float(telemetryData[currentRow]))
            else:
                data.setValue(float(parameterNames[currentRow].text))
            description = QtGui.QTableWidgetItem(
                "   " + parameterNames[currentRow].get("Description"))
            self.ui.parameterTable.setItem(currentRow, 0, name)
            self.ui.parameterTable.setCellWidget(currentRow, 1, data)
            self.ui.parameterTable.setItem(currentRow, 2, description)

        self.ui.parameterTable.resizeColumnToContents(0)
        self.ui.parameterTable.resizeColumnToContents(1)
        self.ui.parameterTable.resizeColumnToContents(2)

    def updateParameters(self):
        parameterData = []
        for row in range(self.ui.parameterTable.rowCount()):
            #parameterData.append(str(self.ui.parameterTable.cellWidget(row, 1).text()))
            data = str(self.ui.parameterTable.cellWidget(row, 1).text())
            data = data.replace(',', '.')
            parameterData.append(data)
        command = self.xml.find(self.getXmlLocation("Command")).text
        commandMessage = command + ";".join(parameterData) + ";"
        self._communicator.write(commandMessage)
        time.sleep(0.100)
        telemetry = self.xml.find(self.getXmlLocation("Telemetry")).text
        self._communicator.write(telemetry)
        time.sleep(0.100)
        response = self._communicator.waitForRead()
        if response[-1] == ",":
            response = response[:-1]
        telemetryData = response.split(",")
        parameters = [float(x) for x in parameterData]
        telemetrys = [float(x) for x in telemetryData]
        if parameters == telemetrys:
            updateEEPROM = self.xml.find(
                self.getXmlLocation("UpdateEEPROM")).text
            self._communicator.write(updateEEPROM)
            self.status("Parameter values successfully stored to the AeroQuad")
        else:
            parameterString = ", ".join(map(str, parameters))
            telemetryString = ", ".join(map(str, telemetrys))
            warningMessage = "Unable to verify parameters stored on the AeroQuad\n\nSent:         " + parameterString + "\nReceived: " + telemetryString
            msgBox = QtGui.QMessageBox(QtGui.QMessageBox.Warning,
                                       "Verification Error", warningMessage,
                                       QtGui.QMessageBox.NoButton, self)
            msgBox.addButton("&Retry", QtGui.QMessageBox.AcceptRole)
            msgBox.addButton("&Abort", QtGui.QMessageBox.RejectRole)
            if msgBox.exec_() == QtGui.QMessageBox.AcceptRole:
                self.status("Retrying parameter storage to AeroQuad...")
                self.updateParameters()
            else:
                self.status("Aborted parameter storage to AeroQuad")

    def underConstruction(self):
        self.status("This feature still under construction")