Server: Add get system and calibration status functions support

This commit is contained in:
Arthur Golubtsov
2019-09-12 02:35:33 +03:00
parent c6349393d1
commit d32e1480e1
2 changed files with 53 additions and 7 deletions

View File

@@ -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)

View File

@@ -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"))