From d32e1480e1c9002804219008934e85ffe5eafc57 Mon Sep 17 00:00:00 2001 From: Arthur Golubtsov Date: Thu, 12 Sep 2019 02:35:33 +0300 Subject: [PATCH] Server: Add get system and calibration status functions support --- Server/copter_table_models.py | 38 ++++++++++++++++++++++++++++++----- Server/server_qt.py | 22 ++++++++++++++++++-- 2 files changed, 53 insertions(+), 7 deletions(-) diff --git a/Server/copter_table_models.py b/Server/copter_table_models.py index 57fe84f..bd84cf9 100644 --- a/Server/copter_table_models.py +++ b/Server/copter_table_models.py @@ -8,7 +8,7 @@ from PyQt5.QtCore import Qt as Qt class CopterData: class_attrs = collections.OrderedDict([('copter_id', None), ('anim_id', None), ('batt_v', None), ('batt_p', None), - ('selfcheck', None), ('time_utc', None), ("time_delta", None), + ('sys_status', None), ('cal_status', None), ('selfcheck', None), ("time_delta", None), ("client", None), ("checked", 0)], ) def __init__(self, **kwargs): @@ -29,10 +29,11 @@ class CopterDataModel(QtCore.QAbstractTableModel): checks = {} selected_ready_signal = QtCore.pyqtSignal(bool) selected_takeoff_ready_signal = QtCore.pyqtSignal(bool) + selected_not_calibrating_signal = QtCore.pyqtSignal(bool) def __init__(self, parent=None): super(CopterDataModel, self).__init__(parent) - self.headers = ('copter ID', 'animation ID', 'battery V', 'battery %', 'selfcheck', 'time delta') + self.headers = ('copter ID', 'animation ID', 'battery V', 'battery %', 'sys status', 'calibration status', 'selfcheck', 'time delta') self.data_contents = [] def insertRows(self, contents, position='last', parent=QtCore.QModelIndex()): @@ -55,6 +56,10 @@ class CopterDataModel(QtCore.QAbstractTableModel): contents = contents or self.data_contents return filter(lambda x: takeoff_checks(x), contents) + def not_calibrating(self, contents=()): + contents = contents or self.data_contents + return filter(lambda x: not_calibrating_check(x), contents) + def rowCount(self, n=None): return len(self.data_contents) @@ -92,6 +97,7 @@ class CopterDataModel(QtCore.QAbstractTableModel): #self.modelReset.emit() self.selected_ready_signal.emit(set(self.user_selected()).issubset(self.selfchecked_ready())) self.selected_takeoff_ready_signal.emit(set(self.user_selected()).issubset(self.takeoff_ready())) + self.selected_not_calibrating_signal.emit(set(self.user_selected()).issubset(self.not_calibrating())) self.dataChanged.emit(index, index, (QtCore.Qt.EditRole,)) @QtCore.pyqtSlot() @@ -167,8 +173,25 @@ def check_bat_p(item): return False #return True #For testing - @col_check(4) +def check_sys_status(item): + if not item: + return None + if item == "MAV_STATE_STANDBY": + return True + else: + return False + +@col_check(5) +def check_cal_status(item): + if not item: + return None + if item == "OK": + return True + else: + return False + +@col_check(6) def check_selfcheck(item): if not item: return None @@ -177,7 +200,7 @@ def check_selfcheck(item): else: return False -@col_check(5) +@col_check(7) def check_time_delta(item): if not item: return None @@ -194,11 +217,16 @@ def all_checks(copter_item): return True def takeoff_checks(copter_item): - for i in range(3): + for i in range(5): if not CopterDataModel.checks[2+i](copter_item[2+i]): return False return True +def not_calibrating_check(copter_item): + if copter_item[5] == "CALIBRATING": + return False + return True + class CopterProxyModel(QtCore.QSortFilterProxyModel): def __init__(self, parent=None): super(CopterProxyModel, self).__init__(parent) diff --git a/Server/server_qt.py b/Server/server_qt.py index 1d3247d..0fce5e7 100644 --- a/Server/server_qt.py +++ b/Server/server_qt.py @@ -15,6 +15,8 @@ from server import * from copter_table_models import * from emergency import * +import threading + def confirmation_required(text="Are you sure?", label="Confirm operation?"): def inner(f): @@ -49,6 +51,8 @@ class MainWindow(QtWidgets.QMainWindow): self.model = CopterDataModel() self.proxy_model = CopterProxyModel() self.signals = SignalManager() + self.gyro_calibrated = {} + self.level_calibrated = {} self.init_model() @@ -103,8 +107,10 @@ class MainWindow(QtWidgets.QMainWindow): client.get_response("anim_id", self._set_copter_data, callback_args=(1, copter.copter_id)) client.get_response("batt_voltage", self._set_copter_data, callback_args=(2, copter.copter_id)) client.get_response("cell_voltage", self._set_copter_data, callback_args=(3, copter.copter_id)) - client.get_response("selfcheck", self._set_copter_data, callback_args=(4, copter.copter_id)) - client.get_response("time", self._set_copter_data, callback_args=(5, copter.copter_id)) + client.get_response("sys_status", self._set_copter_data, callback_args=(4, copter.copter_id)) + client.get_response("cal_status", self._set_copter_data, callback_args=(5, copter.copter_id)) + client.get_response("selfcheck", self._set_copter_data, callback_args=(6, copter.copter_id)) + client.get_response("time", self._set_copter_data, callback_args=(7, copter.copter_id)) def _set_copter_data(self, value, col, copter_id): row = self.model.data_contents.index(next( @@ -120,6 +126,10 @@ class MainWindow(QtWidgets.QMainWindow): elif col == 4: data = str(value) elif col == 5: + data = str(value) + elif col == 6: + data = str(value) + elif col == 7: #data = time.ctime(int(value)) data = "{}".format(round(float(value) - time.time(), 3)) if abs(float(data)) > 1: @@ -186,6 +196,14 @@ class MainWindow(QtWidgets.QMainWindow): def disarm_all(self): Client.broadcast_message("disarm") + @pyqtSlot() + def calibrate_gyro(self): + for copter in self.model.user_selected(): + client = copter.client + client.get_response("calibrate_gyro", self._get_calibration_info, callback_args=(copter.copter_id)) + + + @pyqtSlot() def send_animations(self): path = str(QFileDialog.getExistingDirectory(self, "Select Animation Directory"))