diff --git a/Server/emergency.py b/Server/emergency.py new file mode 100644 index 0000000..5c8f47c --- /dev/null +++ b/Server/emergency.py @@ -0,0 +1,64 @@ +import os +import glob + +from PyQt5 import QtWidgets +from PyQt5.QtGui import QStandardItemModel, QStandardItem +from PyQt5.QtCore import Qt, pyqtSlot +from PyQt5.QtWidgets import QFileDialog, QMessageBox +from PyQt5 import QtCore, QtGui, QtWidgets +from server import * +from server_qt import * + +class Ui_Dialog(object): + def setupUi(self, Dialog): + Dialog.setObjectName("Dialog") + Dialog.resize(632, 214) + self.pushButton_2 = QtWidgets.QPushButton(Dialog) + self.pushButton_2.setGeometry(QtCore.QRect(470, 110, 121, 61)) + self.pushButton_2.setSizeIncrement(QtCore.QSize(16, 16)) + self.pushButton_2.setObjectName("pushButton_2") + self.pushButton_3 = QtWidgets.QPushButton(Dialog) + self.pushButton_3.setGeometry(QtCore.QRect(40, 100, 121, 61)) + self.pushButton_3.setSizeIncrement(QtCore.QSize(16, 16)) + self.pushButton_3.setObjectName("pushButton_3") + self.pushButton_2.clicked.connect(self.btn_2) + self.pushButton_3.clicked.connect(self.btn_3) + self.label = QtWidgets.QLabel(Dialog) + self.label.setGeometry(QtCore.QRect(40, 40, 561, 51)) + font = QtGui.QFont() + font.setPointSize(16) + self.label.setFont(font) + self.label.setObjectName("label") + + self.retranslateUi(Dialog) + QtCore.QMetaObject.connectSlotsByName(Dialog) + + def retranslateUi(self, Dialog): + _translate = QtCore.QCoreApplication.translate + Dialog.setWindowTitle(_translate("Dialog", "Dialog")) + self.pushButton_2.setText(_translate("Dialog", "PushButton")) + self.pushButton_3.setText(_translate("Dialog", "PushButton")) + self.label.setText(_translate("Dialog", "\n" +"Select a group in which the drone does not work correctly")) + def btn_2(self): + for row_num in range(model.rowCount()): + item = model.item(row_num, 0) + if item.isCheckable() and item.checkState() == Qt.Checked: + copter = Client.get_by_id(item.text()) + copter.send_message("green") + def btn_3(self): + for row_num in range(model.rowCount()): + item = model.item(row_num, 0) + if item.isCheckable() and item.checkState() == Qt.Checked: + copter = Client.get_by_id(item.text()) + copter.send_message("red") + +if __name__ == "__main__": + import sys + app = QtWidgets.QApplication(sys.argv) + Dialog = QtWidgets.QDialog() + ui = Ui_Dialog() + ui.setupUi(Dialog) + Dialog.show() + sys.exit(app.exec_()) + diff --git a/Server/emergency.ui b/Server/emergency.ui new file mode 100644 index 0000000..a26c978 --- /dev/null +++ b/Server/emergency.ui @@ -0,0 +1,76 @@ + + + Dialog + + + + 0 + 0 + 632 + 214 + + + + Dialog + + + + + 470 + 110 + 121 + 61 + + + + + 16 + 16 + + + + PushButton + + + + + + 40 + 100 + 121 + 61 + + + + + 16 + 16 + + + + PushButton + + + + + + 40 + 40 + 561 + 51 + + + + + 16 + + + + +Select a group in which the drone does not work correctly + + + + + + diff --git a/Server/server_gui.py b/Server/server_gui.py index 8a16288..cf23ee1 100644 --- a/Server/server_gui.py +++ b/Server/server_gui.py @@ -11,7 +11,7 @@ from PyQt5 import QtCore, QtGui, QtWidgets class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") - MainWindow.resize(1239, 741) + MainWindow.resize(1284, 740) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setEnabled(True) self.centralwidget.setObjectName("centralwidget") @@ -54,9 +54,9 @@ class Ui_MainWindow(object): self.stop_button = QtWidgets.QPushButton(self.centralwidget) self.stop_button.setObjectName("stop_button") self.formLayout.setWidget(5, QtWidgets.QFormLayout.SpanningRole, self.stop_button) - self.test_Button = QtWidgets.QPushButton(self.centralwidget) - self.test_Button.setObjectName("test_Button") - self.formLayout.setWidget(6, QtWidgets.QFormLayout.SpanningRole, self.test_Button) + self.emergency_button = QtWidgets.QPushButton(self.centralwidget) + self.emergency_button.setObjectName("emergency_button") + self.formLayout.setWidget(6, QtWidgets.QFormLayout.SpanningRole, self.emergency_button) self.verticalLayout.addLayout(self.formLayout) self.line = QtWidgets.QFrame(self.centralwidget) self.line.setFrameShape(QtWidgets.QFrame.HLine) @@ -71,20 +71,23 @@ class Ui_MainWindow(object): self.formLayout_2.setWidget(1, QtWidgets.QFormLayout.SpanningRole, self.takeoff_button) self.land_button = QtWidgets.QPushButton(self.centralwidget) self.land_button.setObjectName("land_button") - self.formLayout_2.setWidget(2, QtWidgets.QFormLayout.SpanningRole, self.land_button) + self.formLayout_2.setWidget(3, QtWidgets.QFormLayout.SpanningRole, self.land_button) self.disarm_button = QtWidgets.QPushButton(self.centralwidget) self.disarm_button.setObjectName("disarm_button") - self.formLayout_2.setWidget(3, QtWidgets.QFormLayout.SpanningRole, self.disarm_button) + self.formLayout_2.setWidget(4, QtWidgets.QFormLayout.SpanningRole, self.disarm_button) self.leds_button = QtWidgets.QPushButton(self.centralwidget) self.leds_button.setObjectName("leds_button") self.formLayout_2.setWidget(0, QtWidgets.QFormLayout.SpanningRole, self.leds_button) + self.flip_button = QtWidgets.QPushButton(self.centralwidget) + self.flip_button.setObjectName("flip_button") + self.formLayout_2.setWidget(2, QtWidgets.QFormLayout.SpanningRole, self.flip_button) self.verticalLayout.addLayout(self.formLayout_2) self.horizontalLayout.addLayout(self.verticalLayout) self.horizontalLayout.setStretch(0, 1) self.gridLayout.addLayout(self.horizontalLayout, 0, 0, 1, 1) MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) - self.menubar.setGeometry(QtCore.QRect(0, 0, 1239, 21)) + self.menubar.setGeometry(QtCore.QRect(0, 0, 1284, 21)) self.menubar.setObjectName("menubar") self.menuOptions = QtWidgets.QMenu(self.menubar) self.menuOptions.setObjectName("menuOptions") @@ -112,11 +115,12 @@ class Ui_MainWindow(object): self.start_button.setText(_translate("MainWindow", "Start animation")) self.pause_button.setText(_translate("MainWindow", "Pause")) self.stop_button.setText(_translate("MainWindow", "Stop")) - self.test_Button.setText(_translate("MainWindow", "Test")) + self.emergency_button.setText(_translate("MainWindow", "Emergency land")) self.takeoff_button.setText(_translate("MainWindow", "Takeoff")) self.land_button.setText(_translate("MainWindow", "Land")) self.disarm_button.setText(_translate("MainWindow", "Disarm")) self.leds_button.setText(_translate("MainWindow", "Test leds")) + self.flip_button.setText(_translate("MainWindow", "Flip")) self.menuOptions.setTitle(_translate("MainWindow", "Actions")) self.action_send_animations.setText(_translate("MainWindow", "Send Animations")) self.action_send_configurations.setText(_translate("MainWindow", "Send Configurations")) diff --git a/Server/server_gui.ui b/Server/server_gui.ui index 08a4a2f..dbcb660 100644 --- a/Server/server_gui.ui +++ b/Server/server_gui.ui @@ -6,8 +6,8 @@ 0 0 - 1239 - 741 + 1284 + 740 @@ -92,9 +92,9 @@ - + - Test + Emergency land @@ -119,14 +119,14 @@ - + Land - + Disarm @@ -140,6 +140,13 @@ + + + + Flip + + + @@ -153,7 +160,7 @@ 0 0 - 1239 + 1284 21 diff --git a/Server/server_qt.py b/Server/server_qt.py index bdce950..ee8143f 100644 --- a/Server/server_qt.py +++ b/Server/server_qt.py @@ -11,6 +11,7 @@ from PyQt5.QtWidgets import QFileDialog, QMessageBox from server_gui import Ui_MainWindow from server import * +from emergency import * # noinspection PyArgumentList,PyCallByClass @@ -28,13 +29,13 @@ class MainWindow(QtWidgets.QMainWindow): self.ui.start_button.clicked.connect(self.send_starttime) self.ui.pause_button.clicked.connect(self.pause_all) self.ui.stop_button.clicked.connect(self.stop_all) - self.ui.test_Button.clicked.connect(self.test) + self.ui.emergency_button.clicked.connect(self.emergency) self.ui.leds_button.clicked.connect(self.test_leds) self.ui.takeoff_button.clicked.connect(self.takeoff_selected) self.ui.land_button.clicked.connect(self.land_all) self.ui.disarm_button.clicked.connect(self.disarm_all) - + self.ui.flip_button.clicked.connect(self.flip) self.ui.action_send_animations.triggered.connect(self.send_animations) self.ui.action_send_configurations.triggered.connect(self.send_configurations) self.ui.action_send_Aruco_map.triggered.connect(self.send_aruco) @@ -146,6 +147,7 @@ class MainWindow(QtWidgets.QMainWindow): @pyqtSlot() def send_animations(self): path = str(QFileDialog.getExistingDirectory(self, "Select Animation Directory")) + if path: print("Selected directory:", path) files = [file for file in glob.glob(path + '/*.csv')] @@ -193,13 +195,38 @@ class MainWindow(QtWidgets.QMainWindow): copter.send_file(path, "/home/pi/catkin_ws/src/clever/aruco_pose/map/animation_map.txt") copter.send_message("service_restart", {"name": "clever"}) @pyqtSlot() - def test(self): + def emergency(self): for row_num in range(model.rowCount()): item = model.item(row_num, 0) if item.isCheckable() and item.checkState() == Qt.Checked: copter = Client.get_by_id(item.text()) - copter.send_message("test") + copter.send_message("emergency") + Dialog = QtWidgets.QDialog() + ui = Ui_Dialog() + ui.setupUi(Dialog) + Dialog.show() + Dialog.exec_() + @pyqtSlot() + def flip(self): + reply = QMessageBox.question( + self, "Confirm operation", + "You are ready to turn the copter?", + QMessageBox.Yes | QMessageBox.No, QMessageBox.No + ) + if reply == QMessageBox.Yes: + print("Accepted") + for row_num in range(model.rowCount()): + item = model.item(row_num, 0) + if item.isCheckable() and item.checkState() == Qt.Checked: + if True: # TODO checks for batt/selfckeck here + copter = Client.get_by_id(item.text()) + copter.send_message("flip") + else: + print("Cancelled") + pass + + model = QStandardItemModel() model.setHorizontalHeaderLabels(