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(