diff --git a/Server/config/spec/configspec_server.ini b/Server/config/spec/configspec_server.ini
index b0efd85..fe8cd18 100644
--- a/Server/config/spec/configspec_server.ini
+++ b/Server/config/spec/configspec_server.ini
@@ -2,47 +2,47 @@ config_name = string(default='Copter config')
config_version = float(default='0.0')
[SERVER]
-port = integer(default=25000)
-buffer_size = integer(default=1024)
+ port = integer(default=25000)
+ buffer_size = integer(default=1024)
[TABLE]
-# True -> clients are removed on disconnection
-# False -> disconnected clients indicated
-remove_disconnected = boolean(default=False)
+ # True -> clients are removed on disconnection
+ # False -> disconnected clients indicated
+ remove_disconnected = boolean(default=False)
[[PRESETS]]
- current = string(default="DEFAULT")
- [[[DEFAULT]]]
- copter_id = boolean(default=True)
- git_version = boolean(default=True)
- animation_id = boolean(default=True)
- battery = boolean(default=True)
- fcu_status = boolean(default=True)
- calibration_status = boolean(default=True)
- mode = boolean(default=True)
- selfcheck = boolean(default=True)
- current_position = boolean(default=True)
- start_position = boolean(default=True)
- last_task = boolean(default=True)
- time_delta = boolean(default=True)
- config_version = boolean(default=True)
- [[[__many__]]]
- __many__ = boolean
+ current = string(default="DEFAULT")
+ [[[DEFAULT]]]
+ copter_id = boolean(default=True)
+ git_version = boolean(default=True)
+ animation_id = boolean(default=True)
+ battery = boolean(default=True)
+ fcu_status = boolean(default=True)
+ calibration_status = boolean(default=True)
+ mode = boolean(default=True)
+ selfcheck = boolean(default=True)
+ current_position = boolean(default=True)
+ start_position = boolean(default=True)
+ last_task = boolean(default=True)
+ time_delta = boolean(default=True)
+ config_version = boolean(default=True)
+ [[[__many__]]]
+ __many__ = boolean
[CHECKS]
-battery_min = float(default=50.0, min=0, max=100)
-# in meters
-start_pos_delta_max = float(default=1.0, min=0)
-# in meters
-time_delta_max = float(default=1.0, min=0)
+ battery_min = float(default=50.0, min=0, max=100)
+ # in meters
+ start_pos_delta_max = float(default=1.0, min=0)
+ # in meters
+ time_delta_max = float(default=1.0, min=0)
[BROADCAST]
-send = boolean(default=True)
-listen = boolean(default=True)
-port = integer(default=8181)
-# delay for message sending in seconds
-delay = float(default=5.0, min=0)
+ send = boolean(default=True)
+ listen = boolean(default=True)
+ port = integer(default=8181)
+ # delay for message sending in seconds
+ delay = float(default=5.0, min=0)
[NTP]
-use = boolean(default=False)
-host = string(default=ntp1.stratum2.ru)
-port = integer(default=123)
+ use = boolean(default=False)
+ host = string(default=ntp1.stratum2.ru)
+ port = integer(default=123)
diff --git a/Server/server_gui.py b/Server/server_gui.py
index b448385..5bc9ec3 100644
--- a/Server/server_gui.py
+++ b/Server/server_gui.py
@@ -2,7 +2,7 @@
# Form implementation generated from reading ui file 'server_gui.ui'
#
-# Created by: PyQt5 UI code generator 5.13.0
+# Created by: PyQt5 UI code generator 5.14.0
#
# WARNING! All changes made in this file will be lost!
@@ -13,7 +13,7 @@ from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
- MainWindow.resize(1360, 761)
+ MainWindow.resize(1360, 816)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setEnabled(True)
self.centralwidget.setObjectName("centralwidget")
@@ -51,23 +51,23 @@ class Ui_MainWindow(object):
self.start_text.setLayoutDirection(QtCore.Qt.RightToLeft)
self.start_text.setAlignment(QtCore.Qt.AlignCenter)
self.start_text.setObjectName("start_text")
- self.formLayout.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.start_text)
+ self.formLayout.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.start_text)
self.start_delay_spin = QtWidgets.QSpinBox(self.centralwidget)
self.start_delay_spin.setObjectName("start_delay_spin")
- self.formLayout.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.start_delay_spin)
+ self.formLayout.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.start_delay_spin)
self.music_text = QtWidgets.QLabel(self.centralwidget)
self.music_text.setLayoutDirection(QtCore.Qt.RightToLeft)
self.music_text.setObjectName("music_text")
- self.formLayout.setWidget(3, QtWidgets.QFormLayout.LabelRole, self.music_text)
+ self.formLayout.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.music_text)
self.music_delay_spin = QtWidgets.QDoubleSpinBox(self.centralwidget)
self.music_delay_spin.setDecimals(1)
self.music_delay_spin.setMaximum(1000.0)
self.music_delay_spin.setObjectName("music_delay_spin")
- self.formLayout.setWidget(3, QtWidgets.QFormLayout.FieldRole, self.music_delay_spin)
+ self.formLayout.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.music_delay_spin)
self.music_play_text = QtWidgets.QLabel(self.centralwidget)
self.music_play_text.setLayoutDirection(QtCore.Qt.RightToLeft)
self.music_play_text.setObjectName("music_play_text")
- self.formLayout.setWidget(4, QtWidgets.QFormLayout.LabelRole, self.music_play_text)
+ self.formLayout.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.music_play_text)
self.music_checkbox = QtWidgets.QCheckBox(self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
@@ -76,12 +76,12 @@ class Ui_MainWindow(object):
self.music_checkbox.setSizePolicy(sizePolicy)
self.music_checkbox.setFocusPolicy(QtCore.Qt.NoFocus)
self.music_checkbox.setContextMenuPolicy(QtCore.Qt.DefaultContextMenu)
- self.music_checkbox.setLayoutDirection(QtCore.Qt.RightToLeft)
+ self.music_checkbox.setLayoutDirection(QtCore.Qt.LeftToRight)
self.music_checkbox.setAutoFillBackground(False)
self.music_checkbox.setText("")
self.music_checkbox.setChecked(False)
self.music_checkbox.setObjectName("music_checkbox")
- self.formLayout.setWidget(4, QtWidgets.QFormLayout.FieldRole, self.music_checkbox)
+ self.formLayout.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.music_checkbox)
self.verticalLayout.addLayout(self.formLayout)
self.line = QtWidgets.QFrame(self.centralwidget)
self.line.setFrameShape(QtWidgets.QFrame.HLine)
@@ -117,10 +117,10 @@ class Ui_MainWindow(object):
self.formLayout_5.setObjectName("formLayout_5")
self.land_selected_button = QtWidgets.QPushButton(self.centralwidget)
self.land_selected_button.setObjectName("land_selected_button")
- self.formLayout_5.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.land_selected_button)
+ self.formLayout_5.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.land_selected_button)
self.land_all_button = QtWidgets.QPushButton(self.centralwidget)
self.land_all_button.setObjectName("land_all_button")
- self.formLayout_5.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.land_all_button)
+ self.formLayout_5.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.land_all_button)
self.verticalLayout.addLayout(self.formLayout_5)
self.line_6 = QtWidgets.QFrame(self.centralwidget)
self.line_6.setFrameShape(QtWidgets.QFrame.HLine)
@@ -146,14 +146,13 @@ class Ui_MainWindow(object):
self.formLayout_3 = QtWidgets.QFormLayout()
self.formLayout_3.setLabelAlignment(QtCore.Qt.AlignCenter)
self.formLayout_3.setFormAlignment(QtCore.Qt.AlignCenter)
- self.formLayout_3.setVerticalSpacing(6)
self.formLayout_3.setObjectName("formLayout_3")
self.disarm_all_button = QtWidgets.QPushButton(self.centralwidget)
self.disarm_all_button.setObjectName("disarm_all_button")
- self.formLayout_3.setWidget(3, QtWidgets.QFormLayout.FieldRole, self.disarm_all_button)
+ self.formLayout_3.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.disarm_all_button)
self.disarm_selected_button = QtWidgets.QPushButton(self.centralwidget)
self.disarm_selected_button.setObjectName("disarm_selected_button")
- self.formLayout_3.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.disarm_selected_button)
+ self.formLayout_3.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.disarm_selected_button)
self.verticalLayout.addLayout(self.formLayout_3)
self.line_3 = QtWidgets.QFrame(self.centralwidget)
self.line_3.setFrameShape(QtWidgets.QFrame.HLine)
@@ -164,22 +163,17 @@ class Ui_MainWindow(object):
self.formLayout_4.setLabelAlignment(QtCore.Qt.AlignCenter)
self.formLayout_4.setFormAlignment(QtCore.Qt.AlignCenter)
self.formLayout_4.setObjectName("formLayout_4")
- self.flip_button = QtWidgets.QPushButton(self.centralwidget)
- self.flip_button.setObjectName("flip_button")
- self.formLayout_4.setWidget(7, QtWidgets.QFormLayout.FieldRole, self.flip_button)
+ self.leds_button = QtWidgets.QPushButton(self.centralwidget)
+ self.leds_button.setObjectName("leds_button")
+ self.formLayout_4.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.leds_button)
self.takeoff_button = QtWidgets.QPushButton(self.centralwidget)
self.takeoff_button.setEnabled(True)
self.takeoff_button.setObjectName("takeoff_button")
self.formLayout_4.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.takeoff_button)
- self.leds_button = QtWidgets.QPushButton(self.centralwidget)
- self.leds_button.setObjectName("leds_button")
- self.formLayout_4.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.leds_button)
self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
self.horizontalLayout_2.setContentsMargins(-1, 0, -1, -1)
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
self.z_checkbox = QtWidgets.QCheckBox(self.centralwidget)
- self.z_checkbox.setCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor))
- self.z_checkbox.setFocusPolicy(QtCore.Qt.NoFocus)
self.z_checkbox.setLayoutDirection(QtCore.Qt.LeftToRight)
self.z_checkbox.setObjectName("z_checkbox")
self.horizontalLayout_2.addWidget(self.z_checkbox)
@@ -189,7 +183,10 @@ class Ui_MainWindow(object):
self.z_spin.setProperty("value", 1.0)
self.z_spin.setObjectName("z_spin")
self.horizontalLayout_2.addWidget(self.z_spin)
- self.formLayout_4.setLayout(4, QtWidgets.QFormLayout.FieldRole, self.horizontalLayout_2)
+ self.formLayout_4.setLayout(2, QtWidgets.QFormLayout.FieldRole, self.horizontalLayout_2)
+ self.flip_button = QtWidgets.QPushButton(self.centralwidget)
+ self.flip_button.setObjectName("flip_button")
+ self.formLayout_4.setWidget(3, QtWidgets.QFormLayout.FieldRole, self.flip_button)
self.verticalLayout.addLayout(self.formLayout_4)
self.line_4 = QtWidgets.QFrame(self.centralwidget)
self.line_4.setFrameShape(QtWidgets.QFrame.HLine)
@@ -215,27 +212,29 @@ class Ui_MainWindow(object):
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, 1360, 22))
+ self.menubar.setGeometry(QtCore.QRect(0, 0, 1360, 26))
self.menubar.setObjectName("menubar")
self.menuOptions = QtWidgets.QMenu(self.menubar)
self.menuOptions.setObjectName("menuOptions")
- self.menuDeveloper_mode = QtWidgets.QMenu(self.menuOptions)
- self.menuDeveloper_mode.setObjectName("menuDeveloper_mode")
- self.menuAnimation = QtWidgets.QMenu(self.menubar)
- self.menuAnimation.setObjectName("menuAnimation")
- self.menuDrone = QtWidgets.QMenu(self.menubar)
- self.menuDrone.setObjectName("menuDrone")
- self.menuDeveloper_mode_2 = QtWidgets.QMenu(self.menuDrone)
- self.menuDeveloper_mode_2.setObjectName("menuDeveloper_mode_2")
- self.menuMusic = QtWidgets.QMenu(self.menubar)
- self.menuMusic.setObjectName("menuMusic")
+ self.menuMusic_2 = QtWidgets.QMenu(self.menuOptions)
+ self.menuMusic_2.setObjectName("menuMusic_2")
+ self.menuTable = QtWidgets.QMenu(self.menubar)
+ self.menuTable.setObjectName("menuTable")
+ self.menuDrone_2 = QtWidgets.QMenu(self.menubar)
+ self.menuDrone_2.setObjectName("menuDrone_2")
+ self.menuSend = QtWidgets.QMenu(self.menuDrone_2)
+ self.menuSend.setObjectName("menuSend")
+ self.menuRestart = QtWidgets.QMenu(self.menuDrone_2)
+ self.menuRestart.setObjectName("menuRestart")
+ self.menuRetrive = QtWidgets.QMenu(self.menuDrone_2)
+ self.menuRetrive.setObjectName("menuRetrive")
MainWindow.setMenuBar(self.menubar)
self.action_send_animations = QtWidgets.QAction(MainWindow)
self.action_send_animations.setObjectName("action_send_animations")
self.action_send_configurations = QtWidgets.QAction(MainWindow)
self.action_send_configurations.setObjectName("action_send_configurations")
- self.action_send_Aruco_map = QtWidgets.QAction(MainWindow)
- self.action_send_Aruco_map.setObjectName("action_send_Aruco_map")
+ self.action_send_aruco_map = QtWidgets.QAction(MainWindow)
+ self.action_send_aruco_map.setObjectName("action_send_aruco_map")
self.action_update_client_repo = QtWidgets.QAction(MainWindow)
self.action_update_client_repo.setObjectName("action_update_client_repo")
self.actionSend_launch_file_for_clever = QtWidgets.QAction(MainWindow)
@@ -280,38 +279,69 @@ class Ui_MainWindow(object):
self.action_restart_chrony.setObjectName("action_restart_chrony")
self.action_send_fcu_parameters = QtWidgets.QAction(MainWindow)
self.action_send_fcu_parameters.setObjectName("action_send_fcu_parameters")
- self.menuDeveloper_mode.addAction(self.action_send_any_file)
- self.menuDeveloper_mode.addAction(self.action_send_any_command)
- self.menuOptions.addAction(self.action_send_animations)
- self.menuOptions.addAction(self.action_send_configurations)
- self.menuOptions.addAction(self.action_send_launch_file)
- self.menuOptions.addAction(self.action_send_Aruco_map)
- self.menuOptions.addAction(self.action_send_calibrations)
- self.menuOptions.addAction(self.action_send_fcu_parameters)
+ self.action_toggle_select = QtWidgets.QAction(MainWindow)
+ self.action_toggle_select.setObjectName("action_toggle_select")
+ self.action_select_all = QtWidgets.QAction(MainWindow)
+ self.action_select_all.setObjectName("action_select_all")
+ self.action_deselect_all = QtWidgets.QAction(MainWindow)
+ self.action_deselect_all.setObjectName("action_deselect_all")
+ self.action_edit_server_config = QtWidgets.QAction(MainWindow)
+ self.action_edit_server_config.setObjectName("action_edit_server_config")
+ self.action_edit_any_config = QtWidgets.QAction(MainWindow)
+ self.action_edit_any_config.setObjectName("action_edit_any_config")
+ self.action_update_server_git = QtWidgets.QAction(MainWindow)
+ self.action_update_server_git.setObjectName("action_update_server_git")
+ self.action_retrive_any_file = QtWidgets.QAction(MainWindow)
+ self.action_retrive_any_file.setObjectName("action_retrive_any_file")
+ self.action_restart_server = QtWidgets.QAction(MainWindow)
+ self.action_restart_server.setObjectName("action_restart_server")
+ self.action_configure_columns = QtWidgets.QAction(MainWindow)
+ self.action_configure_columns.setObjectName("action_configure_columns")
+ self.menuMusic_2.addAction(self.action_select_music_file)
+ self.menuMusic_2.addAction(self.action_play_music)
+ self.menuMusic_2.addAction(self.action_stop_music)
+ self.menuOptions.addAction(self.menuMusic_2.menuAction())
self.menuOptions.addSeparator()
- self.menuOptions.addAction(self.menuDeveloper_mode.menuAction())
+ self.menuOptions.addAction(self.action_edit_server_config)
+ self.menuOptions.addAction(self.action_edit_any_config)
self.menuOptions.addSeparator()
- self.menuOptions.addAction(self.action_select_all_rows)
- self.menuAnimation.addAction(self.action_set_start_to_current_position)
- self.menuAnimation.addAction(self.action_reset_start)
- self.menuDeveloper_mode_2.addAction(self.action_restart_clever)
- self.menuDeveloper_mode_2.addAction(self.action_restart_clever_show)
- self.menuDeveloper_mode_2.addAction(self.action_update_client_repo)
- self.menuDeveloper_mode_2.addAction(self.action_reboot_all)
- self.menuDrone.addAction(self.action_set_z_offset_to_ground)
- self.menuDrone.addAction(self.action_reset_z_offset)
- self.menuDrone.addSeparator()
- self.menuDrone.addAction(self.action_restart_chrony)
- self.menuDrone.addAction(self.action_remove_row)
- self.menuDrone.addSeparator()
- self.menuDrone.addAction(self.menuDeveloper_mode_2.menuAction())
- self.menuMusic.addAction(self.action_select_music_file)
- self.menuMusic.addAction(self.action_play_music)
- self.menuMusic.addAction(self.action_stop_music)
+ self.menuOptions.addAction(self.action_update_server_git)
+ self.menuOptions.addAction(self.action_restart_server)
+ self.menuTable.addAction(self.action_toggle_select)
+ self.menuTable.addAction(self.action_select_all)
+ self.menuTable.addAction(self.action_deselect_all)
+ self.menuTable.addSeparator()
+ self.menuTable.addAction(self.action_remove_row)
+ self.menuTable.addSeparator()
+ self.menuTable.addAction(self.action_configure_columns)
+ self.menuSend.addAction(self.action_send_animations)
+ self.menuSend.addAction(self.action_send_configurations)
+ self.menuSend.addAction(self.action_send_launch_file)
+ self.menuSend.addAction(self.action_send_aruco_map)
+ self.menuSend.addAction(self.action_send_calibrations)
+ self.menuSend.addAction(self.action_send_fcu_parameters)
+ self.menuSend.addSeparator()
+ self.menuSend.addAction(self.action_send_any_file)
+ self.menuSend.addAction(self.action_send_any_command)
+ self.menuRestart.addAction(self.action_restart_chrony)
+ self.menuRestart.addAction(self.action_restart_clever)
+ self.menuRestart.addAction(self.action_restart_clever_show)
+ self.menuRestart.addSeparator()
+ self.menuRestart.addAction(self.action_reboot_all)
+ self.menuRetrive.addAction(self.action_retrive_any_file)
+ self.menuDrone_2.addAction(self.menuSend.menuAction())
+ self.menuDrone_2.addAction(self.menuRetrive.menuAction())
+ self.menuDrone_2.addAction(self.menuRestart.menuAction())
+ self.menuDrone_2.addSeparator()
+ self.menuDrone_2.addAction(self.action_reset_z_offset)
+ self.menuDrone_2.addAction(self.action_set_z_offset_to_ground)
+ self.menuDrone_2.addAction(self.action_set_start_to_current_position)
+ self.menuDrone_2.addAction(self.action_reset_start)
+ self.menuDrone_2.addSeparator()
+ self.menuDrone_2.addAction(self.action_update_client_repo)
self.menubar.addAction(self.menuOptions.menuAction())
- self.menubar.addAction(self.menuDrone.menuAction())
- self.menubar.addAction(self.menuAnimation.menuAction())
- self.menubar.addAction(self.menuMusic.menuAction())
+ self.menubar.addAction(self.menuTable.menuAction())
+ self.menubar.addAction(self.menuDrone_2.menuAction())
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
@@ -334,23 +364,24 @@ class Ui_MainWindow(object):
self.emergency_land_button.setText(_translate("MainWindow", "Emergency land"))
self.disarm_all_button.setText(_translate("MainWindow", "Disarm ALL"))
self.disarm_selected_button.setText(_translate("MainWindow", "Disarm selected"))
- self.flip_button.setText(_translate("MainWindow", "Flip"))
- self.takeoff_button.setText(_translate("MainWindow", "Takeoff"))
self.leds_button.setText(_translate("MainWindow", "Test leds"))
+ self.takeoff_button.setText(_translate("MainWindow", "Takeoff"))
self.z_checkbox.setText(_translate("MainWindow", " Z ="))
self.z_spin.setSuffix(_translate("MainWindow", " m"))
+ self.flip_button.setText(_translate("MainWindow", "Flip"))
self.reboot_fcu.setText(_translate("MainWindow", "Reboot FCU"))
self.calibrate_gyro.setText(_translate("MainWindow", "Calibrate gyro"))
self.calibrate_level.setText(_translate("MainWindow", "Calibrate level"))
self.menuOptions.setTitle(_translate("MainWindow", "Server"))
- self.menuDeveloper_mode.setTitle(_translate("MainWindow", "Developer mode"))
- self.menuAnimation.setTitle(_translate("MainWindow", "Animation"))
- self.menuDrone.setTitle(_translate("MainWindow", "Drone"))
- self.menuDeveloper_mode_2.setTitle(_translate("MainWindow", "Developer mode"))
- self.menuMusic.setTitle(_translate("MainWindow", "Music"))
+ self.menuMusic_2.setTitle(_translate("MainWindow", "Music"))
+ self.menuTable.setTitle(_translate("MainWindow", "Table"))
+ self.menuDrone_2.setTitle(_translate("MainWindow", "Drone"))
+ self.menuSend.setTitle(_translate("MainWindow", "Send"))
+ self.menuRestart.setTitle(_translate("MainWindow", "Restart"))
+ self.menuRetrive.setTitle(_translate("MainWindow", "Retrive"))
self.action_send_animations.setText(_translate("MainWindow", "Send animations"))
self.action_send_configurations.setText(_translate("MainWindow", "Send configurations"))
- self.action_send_Aruco_map.setText(_translate("MainWindow", "Send aruco map"))
+ self.action_send_aruco_map.setText(_translate("MainWindow", "Send aruco map"))
self.action_update_client_repo.setText(_translate("MainWindow", "Update clever-show git"))
self.actionSend_launch_file_for_clever.setText(_translate("MainWindow", "Send launch file for clever"))
self.action_send_launch_file.setText(_translate("MainWindow", "Send launch files"))
@@ -369,8 +400,31 @@ class Ui_MainWindow(object):
self.action_send_any_file.setText(_translate("MainWindow", "Send any file"))
self.action_send_any_command.setText(_translate("MainWindow", "Send any command"))
self.action_stop_music.setText(_translate("MainWindow", "Stop music"))
- self.action_remove_row.setText(_translate("MainWindow", "Remove from table"))
+ self.action_remove_row.setText(_translate("MainWindow", "Remove drone"))
+ self.action_remove_row.setShortcut(_translate("MainWindow", "Ctrl+Del"))
self.action_send_calibrations.setText(_translate("MainWindow", "Send camera calibrations"))
- self.action_reboot_all.setText(_translate("MainWindow", "Reboot all"))
+ self.action_reboot_all.setText(_translate("MainWindow", "Reboot system"))
self.action_restart_chrony.setText(_translate("MainWindow", "Restart chrony"))
self.action_send_fcu_parameters.setText(_translate("MainWindow", "Send FCU parameters"))
+ self.action_toggle_select.setText(_translate("MainWindow", "Toggle select"))
+ self.action_toggle_select.setShortcut(_translate("MainWindow", "Ctrl+A"))
+ self.action_select_all.setText(_translate("MainWindow", "Select all"))
+ self.action_select_all.setShortcut(_translate("MainWindow", "Shift+A"))
+ self.action_deselect_all.setText(_translate("MainWindow", "Deselect all"))
+ self.action_deselect_all.setShortcut(_translate("MainWindow", "Alt+A"))
+ self.action_edit_server_config.setText(_translate("MainWindow", "Edit server config"))
+ self.action_edit_any_config.setText(_translate("MainWindow", "Edit any config"))
+ self.action_update_server_git.setText(_translate("MainWindow", "Update server git"))
+ self.action_retrive_any_file.setText(_translate("MainWindow", "Retrive any file"))
+ self.action_restart_server.setText(_translate("MainWindow", "Restart server"))
+ self.action_configure_columns.setText(_translate("MainWindow", "Configure columns"))
+
+
+if __name__ == "__main__":
+ import sys
+ app = QtWidgets.QApplication(sys.argv)
+ MainWindow = QtWidgets.QMainWindow()
+ ui = Ui_MainWindow()
+ ui.setupUi(MainWindow)
+ MainWindow.show()
+ sys.exit(app.exec_())
diff --git a/Server/server_gui.ui b/Server/server_gui.ui
index 59e73ad..0dd485a 100644
--- a/Server/server_gui.ui
+++ b/Server/server_gui.ui
@@ -7,7 +7,7 @@
0
0
1360
- 761
+ 816
@@ -76,7 +76,7 @@
Qt::AlignHCenter|Qt::AlignTop
- -
+
-
Qt::RightToLeft
@@ -89,14 +89,14 @@
- -
+
-
s
- -
+
-
Qt::RightToLeft
@@ -106,7 +106,7 @@
- -
+
-
s
@@ -119,7 +119,7 @@
- -
+
-
Qt::RightToLeft
@@ -129,7 +129,7 @@
- -
+
-
@@ -144,7 +144,7 @@
Qt::DefaultContextMenu
- Qt::RightToLeft
+ Qt::LeftToRight
false
@@ -224,14 +224,14 @@
0
-
-
+
-
Land selected
- -
+
-
Land ALL
@@ -286,17 +286,14 @@
Qt::AlignCenter
-
- 6
-
-
-
+
-
Disarm ALL
- -
+
-
Disarm selected
@@ -320,10 +317,10 @@
Qt::AlignCenter
-
-
-
+
-
+
- Flip
+ Test leds
@@ -337,26 +334,13 @@
- -
-
-
- Test leds
-
-
-
- -
+
-
0
-
-
- ArrowCursor
-
-
- Qt::NoFocus
-
Qt::LeftToRight
@@ -383,6 +367,13 @@
+ -
+
+
+ Flip
+
+
+
-
@@ -435,71 +426,89 @@
0
0
1360
- 22
+ 26
+
+
+ Toggle select
+
+
+ Ctrl+A
+
+
+
+
+ Select all
+
+
+ Shift+A
+
+
+
+
+ Deselect all
+
+
+ Alt+A
+
+
+
+
+ Edit server config
+
+
+
+
+ Edit any config
+
+
+
+
+ Update server git
+
+
+
+
+ Retrive any file
+
+
+
+
+ Restart server
+
+
+
+
+ Configure columns
+
+
start_delay_spin
diff --git a/Server/server_qt.py b/Server/server_qt.py
index e7d2899..7f422ba 100644
--- a/Server/server_qt.py
+++ b/Server/server_qt.py
@@ -26,7 +26,7 @@ import messaging_lib as messaging
import config as cfg
import copter_table_models as table
-from copter_table import CopterTableWidget
+from copter_table import CopterTableWidget, HeaderEditDialog
from visual_land_dialog import VisualLandDialog
from config_editor_models import ConfigDialog
@@ -38,6 +38,8 @@ def multi_glob(*patterns):
def b_partial(func, *args, **kwargs): # call argument blocker partial
return lambda *a: func(*args, **kwargs)
+def restart():
+ os.execl(sys.executable, os.path.abspath(__file__), *sys.argv)
def confirmation_required(text="Are you sure?", label="Confirm operation?"):
def inner(f):
@@ -100,11 +102,15 @@ class MainWindow(QtWidgets.QMainWindow):
self.player = QtMultimedia.QMediaPlayer()
def init_ui(self):
+ self.init_table()
+
# Connecting
self.ui.check_button.clicked.connect(self.selfcheck_selected)
self.ui.start_button.clicked.connect(self.send_start_time_selected)
self.ui.pause_button.clicked.connect(self.pause_resume_selected)
+ self.ui.z_checkbox.clicked.connect(self.ui.z_spin.setEnabled)
+
self.ui.land_all_button.clicked.connect(b_partial(Client.broadcast_message, "land"))
self.ui.land_selected_button.clicked.connect(b_partial(self.send_to_selected, "land"))
self.ui.disarm_all_button.clicked.connect(b_partial(Client.broadcast_message, "disarm"))
@@ -117,32 +123,40 @@ class MainWindow(QtWidgets.QMainWindow):
self.ui.reboot_fcu.clicked.connect(b_partial(self.send_to_selected, "reboot_fcu"))
self.ui.calibrate_gyro.clicked.connect(self.calibrate_gyro_selected)
self.ui.calibrate_level.clicked.connect(self.calibrate_level_selected)
- self.ui.action_remove_row.triggered.connect(self.remove_selected)
- self.ui.action_send_animations.triggered.connect(self.send_animations)
- self.ui.action_send_calibrations.triggered.connect(self.send_calibrations)
- self.ui.action_send_configurations.triggered.connect(self.send_config)
- self.ui.action_send_Aruco_map.triggered.connect(self.send_aruco)
- self.ui.action_send_launch_file.triggered.connect(self.send_launch)
- self.ui.action_send_fcu_parameters.triggered.connect(self.send_fcu_parameters)
- self.ui.action_send_any_file.triggered.connect(self.send_any_file)
- self.ui.action_send_any_command.triggered.connect(self.send_any_command)
- self.ui.action_restart_clever.triggered.connect(
- b_partial(self.send_to_selected, "service_restart", kwargs={"name": "clever"}))
- self.ui.action_restart_clever_show.triggered.connect(self.restart_clever_show)
- self.ui.action_update_client_repo.triggered.connect(b_partial(self.send_to_selected, "update_repo"))
- self.ui.action_reboot_all.triggered.connect(b_partial(self.send_to_selected, "reboot_all"))
- self.ui.action_set_start_to_current_position.triggered.connect(b_partial(self.send_to_selected, "move_start"))
- self.ui.action_reset_start.triggered.connect(b_partial(self.send_to_selected, "reset_start"))
- self.ui.action_set_z_offset_to_ground.triggered.connect(b_partial(self.send_to_selected, "set_z_to_ground"))
- self.ui.action_reset_z_offset.triggered.connect(b_partial(self.send_to_selected, "reset_z_offset"))
- self.ui.action_restart_chrony.triggered.connect(self.restart_chrony)
+
self.ui.action_select_music_file.triggered.connect(self.select_music_file)
self.ui.action_play_music.triggered.connect(self.play_music)
self.ui.action_stop_music.triggered.connect(self.stop_music)
- self.ui.action_select_all_rows.triggered.connect(self.model.select_all)
+ self.ui.action_restart_server.triggered.connect(restart)
- self.init_table()
+ self.ui.action_select_all.triggered.connect(partial(self.ui.copter_table.select_all, Qt.Checked))
+ self.ui.action_deselect_all.triggered.connect(partial(self.ui.copter_table.select_all, Qt.Unchecked))
+ self.ui.action_toggle_select.triggered.connect(self.ui.copter_table.toggle_select)
+ self.ui.action_remove_row.triggered.connect(self.remove_selected)
+ self.ui.action_configure_columns.triggered.connect(self.configure_columns)
+
+ self.ui.action_send_animations.triggered.connect(self.send_animations)
+ self.ui.action_send_calibrations.triggered.connect(self.send_calibrations)
+ self.ui.action_send_configurations.triggered.connect(self.send_config)
+ self.ui.action_send_aruco_map.triggered.connect(self.send_aruco)
+ self.ui.action_send_launch_file.triggered.connect(self.send_launch)
+ self.ui.action_send_fcu_parameters.triggered.connect(self.send_fcu_parameters)
+ self.ui.action_send_any_file.triggered.connect(self.send_any_file)
+ self.ui.action_send_any_command.triggered.connect(self.send_any_command)
+
+ self.ui.action_restart_clever.triggered.connect(
+ b_partial(self.send_to_selected, "service_restart", kwargs={"name": "clever"}))
+ self.ui.action_restart_clever_show.triggered.connect(self.restart_clever_show)
+ self.ui.action_restart_chrony.triggered.connect(self.restart_chrony)
+ self.ui.action_reboot_all.triggered.connect(b_partial(self.send_to_selected, "reboot_all"))
+
+ self.ui.action_set_start_to_current_position.triggered.connect(b_partial(self.send_to_selected, "move_start"))
+ self.ui.action_reset_start.triggered.connect(b_partial(self.send_to_selected, "reset_start"))
+ self.ui.action_set_z_offset_to_ground.triggered.connect(b_partial(self.send_to_selected, "set_z_to_ground"))
+ self.ui.action_reset_z_offset.triggered.connect(b_partial(self.send_to_selected, "reset_z_offset"))
+
+ self.ui.action_update_client_repo.triggered.connect(b_partial(self.send_to_selected, "update_repo"))
def init_table(self):
# Remove standard table widget
@@ -153,6 +167,7 @@ class MainWindow(QtWidgets.QMainWindow):
self.ui.copter_table.setObjectName("copter_table")
# Insert to layout at right
self.ui.horizontalLayout.insertWidget(0, self.ui.copter_table, 0)
+ self.ui.copter_table.setFocus()
def init_model(self):
# Connect model signals to UI
@@ -239,31 +254,16 @@ class MainWindow(QtWidgets.QMainWindow):
@pyqtSlot(object, dict)
def update_table_data(self, client, telems: dict):
- cols_dict = {
- "git_version": 1,
- "animation_id": 2,
- "battery": 3,
- "fcu_status": 4,
- "calibration_status": 5,
- "mode": 6,
- "selfcheck": 7,
- "current_position": 8,
- "start_position": 9,
- "task": 10,
- "time": 11,
- "config_version": 12,
- }
-
for key, value in telems.items():
- col = cols_dict.get(key, None)
- if col is None:
- logging.error("No column {} present!".format(key))
- continue
-
- row_data = self.model.get_row_by_attr("client", client)
- row_num = self.model.get_row_index(row_data)
- if row_num is not None:
- self.model.update_data(row_num, col, value, Qt.EditRole)
+ try:
+ col = self.model.index(key)
+ except ValueError:
+ logging.error(f"No column {key} present!")
+ else:
+ row_data = self.model.get_row_by_attr("client", client)
+ row_num = self.model.get_row_index(row_data)
+ if row_num is not None:
+ self.model.update_data(row_num, col, value, Qt.EditRole)
@pyqtSlot()
def remove_selected(self):
@@ -548,8 +548,11 @@ class MainWindow(QtWidgets.QMainWindow):
@pyqtSlot()
def visual_land(self):
- dialog = VisualLandDialog(self.model)
- dialog.start()
+ VisualLandDialog(self.model).start()
+
+ @pyqtSlot()
+ def configure_columns(self):
+ HeaderEditDialog(self.ui.copter_table, self.server.config).exec()
def register_callbacks(self):
@messaging.message_callback("telemetry")