Files
clever-show/Server/server_qt.py
2019-03-28 17:37:46 +03:00

158 lines
5.3 KiB
Python

import glob
from PyQt5 import QtWidgets
from PyQt5.QtGui import QStandardItem
from PyQt5.QtGui import QStandardItemModel
from PyQt5.QtCore import QModelIndex
from PyQt5.QtCore import Qt
from PyQt5.QtCore import pyqtSlot
from PyQt5.QtWidgets import QFileDialog
# Importing gui form
from server_gui import Ui_MainWindow
from server import *
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.initUI()
self.show()
def initUI(self):
#Connecting
self.ui.check_button.clicked.connect(self.check_selected)
self.ui.start_button.clicked.connect(self.send_starttime)
self.ui.pause_button.clicked.connect(self.pause_all)
self.ui.stop_button.clicked.connect(self.stop_all)
self.ui.takeoff_button.clicked.connect(self.takeoff_selected)
self.ui.land_button.clicked.connect(self.land_all)
self.ui.disarm_button.clicked.connect(self.disarm_all)
self.ui.action_send_animations.triggered.connect(self.send_animations)
self.ui.action_send_configurations.triggered.connect(self.send_configurations)
self.ui.action_send_Aruco_map.triggered.connect(self.send_aruco)
#Initing table and table model
self.ui.tableView.setModel(model)
self.ui.tableView.horizontalHeader().setStretchLastSection(True)
@pyqtSlot()
def check_selected(self):
#Client.request_to_selected("selfcheck")
#for row_num in range(model.rowCount()):
# item = model.index(row_num, 0)
# data = model.itemData(item)
# print(item.data())
# print(item, data)
# if data.isCheckable() and data.checkState() == Qt.Checked:
# print("Copter checked")
# batt = Client.get_by_id(data.text()).get_response("batt_voltage")
# model.setData(model.index(0, 2), batt)
self.ui.start_button.setEnabled(True)
self.ui.takeoff_button.setEnabled(True)
@pyqtSlot()
def send_starttime(self):
dt = self.ui.start_delay_spin.value()
server.send_starttime(dt)
@pyqtSlot()
def stop_all(self):
Client.broadcast(Client.form_message("stop"))
@pyqtSlot()
def pause_all(self):
if self.ui.pause_button.text() == 'Pause':
Client.broadcast(Client.form_message('pause'))
self.ui.pause_button.setText('Resume')
else:
Client.broadcast(Client.form_message('resume'))
self.ui.pause_button.setText('Pause')
@pyqtSlot()
def takeoff_selected(self):
Client.send_to_selected(Client.form_message("takeoff"))
@pyqtSlot()
def land_all(self):
Client.broadcast(Client.form_message("land"))
@pyqtSlot()
def disarm_all(self):
Client.broadcast(Client.form_message("disarm"))
@pyqtSlot()
def send_animations(self):
path = str(QFileDialog.getExistingDirectory(self, "Select Animation Directory"))
if path:
print("Selected directory:", path)
files = [file for file in glob.glob(path + '/*.csv')]
names = [os.path.basename(file).split(".")[0] for file in files]
print(files)
for file, name in zip(files, names):
for copter in Client.clients.values():
if name == copter.copter_id:
copter.send_file(file, "animation.csv") # TODO config
else:
print("Filename not matches with any drone connected")
@pyqtSlot()
def send_configurations(self):
path = QFileDialog.getOpenFileName(self, "Select configuration file", filter="Configs (*.ini *.txt .cfg)")[0]
if path:
print("Selected file:", path)
sendable_config = configparser.ConfigParser()
sendable_config.read(path)
options = []
for section in sendable_config.sections():
for option in dict(sendable_config.items(section)):
value = sendable_config[section][option]
print("Got item from config:", section, option, value)
options.append(ConfigOption(section, option, value))
Client.send_config_options(*options)
@pyqtSlot()
def send_aruco(self):
path = QFileDialog.getOpenFileName(self, "Select aruco map configuration file", filter="Configs (*.txt)")[0]
if path:
filename = os.path.basename(path)
print("Selected file:", path, filename)
for copter in Client.clients.values():
copter.send_file(path, "/home/pi/catkin_ws/src/clever/aruco_pose/map/animation_map.txt")
model = QStandardItemModel()
model.setHorizontalHeaderLabels(
('copter ID', 'animation ID', 'battery V', 'battery %', 'selfcheck', 'time UTC')
)
model.setColumnCount(6)
model.setRowCount(0)
def client_connected(self: Client):
copter_id_item = QStandardItem(self.copter_id)
copter_id_item.setCheckable(True)
model.appendRow((copter_id_item, )) # TODO: get responses for another columns
Client.on_connect = client_connected
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
window = MainWindow()
server = Server()
server.start()
app.exec_()
server.stop()
sys.exit()