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 Server - + - Developer mode + Music - - + + + - - - - - - + - + + - + + - + - Animation + Table - - + + + + + + + - + Drone - + - Developer mode + Send + + + + + + + + + + + + + Restart + + - + - + + + Retrive + + + + + + + + + + - - - - - - - - Music - - - - + - - - + + @@ -511,7 +520,7 @@ Send configurations - + Send aruco map @@ -606,7 +615,10 @@ - Remove from table + Remove drone + + + Ctrl+Del @@ -616,7 +628,7 @@ - Reboot all + Reboot system @@ -629,6 +641,60 @@ Send FCU parameters + + + 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")