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)
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")