Revert "Merge branch 'qt-gui-update' of https://github.com/CopterExpress/clever-show into qt-gui-update"

This reverts commit a6c4bd76f4, reversing
changes made to d0eed91f73.
This commit is contained in:
Arthur Golubtsov
2020-01-24 14:18:33 +03:00
parent a6c4bd76f4
commit bbc1525998
9 changed files with 121 additions and 217 deletions

View File

@@ -24,7 +24,6 @@ remove_disconnected = boolean(default=False)
start_position = boolean(default=True)
last_task = boolean(default=True)
time_delta = boolean(default=True)
config_version = boolean(default=True)
[[[__many__]]]
__many__ = boolean

View File

@@ -372,7 +372,7 @@ class ConfigModel(QtCore.QAbstractItemModel):
return QtCore.Qt.CopyAction | QtCore.Qt.MoveAction
def mimeTypes(self):
return ['app/configitem']
return ['app/configitem', 'text/xml']
def mimeData(self, indexes):
mimedata = QtCore.QMimeData()

View File

@@ -49,10 +49,8 @@ class CopterTableWidget(QTableView):
self.setSortingEnabled(True)
self.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustToContents)
self.resizeColumnsToContents()
self.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectItems)
self.setSelectionMode(QtWidgets.QAbstractItemView.SingleSelection)
self.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
self.doubleClicked.connect(self.on_double_click)
self.setDragEnabled(True)
def moved(self, logical_index, old_index, new_index):
name = self.current_columns.pop(old_index)

View File

@@ -1,14 +1,12 @@
import re
import sys
import os
import time
import math
import indexed
from contextlib import suppress
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import Qt as Qt, QUrl, QDir
from PyQt5.QtWidgets import QApplication
from PyQt5.QtCore import Qt as Qt
ModelDataRole = 998
ModelStateRole = 999
@@ -118,18 +116,15 @@ columns_names = {'copter_id': 'copter ID',
'current_position': 'current x y z yaw frame_id',
'start_position': ' start x y z ',
'last_task': 'last task',
'time_delta': 'dt',
'config_version': 'configuration',
'time_delta': 'dt'
}
columns = list(columns_names.keys())
class CopterData:
class_basic_attrs = indexed.IndexedOrderedDict([('copter_id', None), ('git_ver', None), ('animation_id', None),
('battery', None), ('fcu_status', None), ('calibration_status', None),
('battery', None), ('fcu_status', None), ('cal_status', None),
('mode', None), ('selfcheck', None), ('current_position', None),
('start_position', None), ('last_task', None), ('time_delta', None),
("config_version", None), ('client', None)])
('start_position', None), ('last_task', None), ('time_delta', None), ('client', None)])
def __init__(self, **kwargs):
self.attrs_dict = self.class_basic_attrs.copy()
@@ -304,11 +299,7 @@ def place_time_delta(value):
@ModelFormatter.col_format(11, ModelFormatter.VIEW_FORMATTER)
def view_time_delta(value):
return "{:.3f}".format(value)
def is_column(index, column_name):
return index.column() == columns.index(column_name)
return "{:.3f}".format(value)
class CopterDataModel(QtCore.QAbstractTableModel):
@@ -479,7 +470,7 @@ class CopterDataModel(QtCore.QAbstractTableModel):
self.update_model(index, role)
return True
def select_all(self): # probably NOT thread-safe! TODO remake
def select_all(self): # probably NOT thread-safe!
self.first_col_is_checked = not self.first_col_is_checked
for row_num, copter in enumerate(self.data_contents):
copter.states.checked = int(self.first_col_is_checked)*2
@@ -489,37 +480,8 @@ class CopterDataModel(QtCore.QAbstractTableModel):
roles = Qt.ItemIsSelectable | Qt.ItemIsEnabled
if index.column() == 0:
roles |= Qt.ItemIsUserCheckable | Qt.ItemIsEditable
if is_column(index, "config_version"):
roles |= Qt.ItemIsDragEnabled # | Qt.ItemIsDropEnabled
return roles
def supportedDropActions(self):
return QtCore.Qt.CopyAction
def mimeTypes(self):
return ['text/plain']
def mimeData(self, indexes):
index = indexes[0]
if is_column(index, "config_version"):
return self._config_mime(index)
return None
def _config_mime(self, index):
mimedata = QtCore.QMimeData()
path = os.path.join(QDir.tempPath(), "config_{}.ini".format(
self.data_contents[index.row()].copter_id))
with suppress(OSError): # remove if file exists
os.remove(path)
self.data_contents[index.row()].client.get_file("config/client.ini", path,)
mimedata.setUrls([QUrl.fromLocalFile(path)])
return mimedata
@QtCore.pyqtSlot(int, int, QtCore.QVariant, QtCore.QVariant)
def update_item(self, row, col, value, role=Qt.EditRole):
self.setData(self.index(row, col), value, role)

View File

@@ -8,7 +8,6 @@ import datetime
import threading
import selectors
import collections
import traceback
import inspect # Add parent dir to PATH to import messaging_lib and config_lib
@@ -157,7 +156,6 @@ class Server(messaging.Singleton):
client.process_events(mask)
except Exception as error:
logging.error("Exception {} occurred for {}! Resetting connection!".format(error, client.addr))
traceback.print_exc()
client.close(True)
else: # Notifier
client.process_events(mask)
@@ -187,9 +185,9 @@ class Server(messaging.Singleton):
def _ip_broadcast(self):
logging.info("Broadcast sender thread started!")
msg = messaging.MessageManager.create_action_message(
"server_ip", kwargs={"host": self.ip, "port": str(self.config.server_port), "id": self.id,
"start_time": str(self.time_started)})
msg = messaging.MessageManager.create_simple_message(
"server_ip", {"host": self.ip, "port": str(self.config.server_port), "id": self.id,
"start_time": str(self.time_started)})
logging.debug("Formed broadcast message: {}".format(msg))
broadcast_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
@@ -233,11 +231,11 @@ class Server(messaging.Singleton):
message.process_message()
content = message.content
right_command = (content and message.jsonheader["action"] == "server_ip")
right_command = (content and content["command"] == "server_ip")
if right_command:
different_id = content["kwargs"]["id"] != str(self.id)
self_younger = float(content["kwargs"]["start_time"]) <= self.time_started
different_id = content["args"]["id"] != str(self.id)
self_younger = float(message.content["args"]["start_time"]) <= self.time_started
if different_id and self_younger:
# younger server should shut down
@@ -255,7 +253,7 @@ class Server(messaging.Singleton):
logging.info("Broadcast listener thread stopped, socked closed!")
def send_starttime(self, copter, start_time):
copter.send_message("start", kwargs={"time": str(start_time)})
copter.send_message("start", {"time": str(start_time)})
def requires_connect(f):
@@ -358,7 +356,7 @@ class Client(messaging.ConnectionManager):
@classmethod
@requires_any_connected
def broadcast_message(cls, command, args=None, force_all=False):
cls.broadcast(messaging.MessageManager.create_action_message(command, args), force_all)
cls.broadcast(messaging.MessageManager.create_simple_message(command, args), force_all)
if __name__ == '__main__':

View File

@@ -127,7 +127,7 @@ class MainWindow(QtWidgets.QMainWindow):
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"}))
b_partial(self.send_to_selected, "service_restart", {"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"))
@@ -200,9 +200,8 @@ class MainWindow(QtWidgets.QMainWindow):
yield f(copter, *args, **kwargs)
@pyqtSlot()
def send_to_selected(self, command, command_args=(), command_kwargs=None):
return list(self.iterate_selected(lambda copter: copter.client.send_message(
command, command_args, command_kwargs)))
def send_to_selected(self, command, command_args=None):
return list(self.iterate_selected(lambda copter: copter.client.send_message(command, command_args)))
def new_client_connected(self, client: Client):
logging.debug("Added client {}".format(client))
@@ -238,14 +237,13 @@ class MainWindow(QtWidgets.QMainWindow):
"animation_id": 2,
"battery": 3,
"fcu_status": 4,
"calibration_status": 5,
"cal_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():
@@ -288,7 +286,7 @@ class MainWindow(QtWidgets.QMainWindow):
self.ui.pause_button.setText('Resume')
else:
time_gap = 0.1 # TODO config? automatic delay detection?
self.send_to_selected("resume", kwargs={"time": server.time_now() + time_gap})
self.send_to_selected("resume", {"time": server.time_now() + time_gap})
self.ui.pause_button.setText('Pause')
@pyqtSlot()
@@ -297,7 +295,7 @@ class MainWindow(QtWidgets.QMainWindow):
for copter in self.model.user_selected():
if self.model.checks.takeoff_checks(copter):
if self.ui.z_checkbox.isChecked():
copter.client.send_message("takeoff_z", {"z": str(self.ui.z_spin.value())}) # todo int, merge commands
copter.client.send_message("takeoff_z", {"z": str(self.ui.z_spin.value())}) # todo int
else:
copter.client.send_message("takeoff")
@@ -427,7 +425,7 @@ class MainWindow(QtWidgets.QMainWindow):
@pyqtSlot()
def send_aruco(self):
def callback(copter):
copter.client.send_message("service_restart", kwargs={"name": "clever"})
copter.client.send_message("service_restart", {"name": "clever"})
self.send_files("Select aruco map configuration file", "Aruco map files (*.txt)", onefile=True,
client_path="/home/pi/catkin_ws/src/clever/aruco_pose/map/",
@@ -467,20 +465,20 @@ class MainWindow(QtWidgets.QMainWindow):
copters = self.model.user_selected()
for copter in copters:
copter.client.send_message("config", kwargs={"config": data, "mode": mode.lower()})
copter.client.send_message("config", {"config": data, "mode": mode.lower()})
@pyqtSlot()
def send_any_command(self):
text, ok = QInputDialog.getText(self, "Enter command to send on copter",
"Command:", QLineEdit.Normal, "")
if ok and text:
self.send_to_selected("execute", kwargs={"command": text})
self.send_to_selected("execute", {"command": text})
@pyqtSlot()
def restart_clever_show(self):
for copter in self.model.user_selected():
copter.client.send_message("service_restart", kwargs={"name": "visual_pose_watchdog"})
copter.client.send_message("service_restart", kwargs={"name": "clever-show"})
copter.client.send_message("service_restart", {"name": "visual_pose_watchdog"})
copter.client.send_message("service_restart", {"name": "clever-show"})
@pyqtSlot()
def restart_chrony(self):