Merge de la version fonctionnelle du moniteur (commit c513609)

This commit is contained in:
dimercur 2024-01-23 16:59:28 +01:00
parent f4f2b63207
commit 8547f7f1bf
4 changed files with 636 additions and 296 deletions

View file

@ -13,35 +13,100 @@ from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object): class Ui_MainWindow(object):
def setupUi(self, MainWindow): def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow") MainWindow.setObjectName("MainWindow")
MainWindow.resize(928, 629) MainWindow.resize(985, 745)
MainWindow.setMinimumSize(QtCore.QSize(985, 745))
self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget") self.centralwidget.setObjectName("centralwidget")
self.horizontalLayout_6 = QtWidgets.QHBoxLayout(self.centralwidget) self.widget = QtWidgets.QWidget(self.centralwidget)
self.horizontalLayout_6.setObjectName("horizontalLayout_6") self.widget.setGeometry(QtCore.QRect(20, 16, 947, 671))
self.widget.setObjectName("widget")
self.horizontalLayout_7 = QtWidgets.QHBoxLayout(self.widget)
self.horizontalLayout_7.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout_7.setObjectName("horizontalLayout_7")
self.verticalLayout_4 = QtWidgets.QVBoxLayout() self.verticalLayout_4 = QtWidgets.QVBoxLayout()
self.verticalLayout_4.setObjectName("verticalLayout_4") self.verticalLayout_4.setObjectName("verticalLayout_4")
self.checkBox_enableCamera = QtWidgets.QCheckBox(self.centralwidget)
self.checkBox_enableCamera.setObjectName("checkBox_enableCamera")
self.verticalLayout_4.addWidget(self.checkBox_enableCamera)
self.graphicsView_Image = QtWidgets.QGraphicsView(self.centralwidget)
self.graphicsView_Image.setObjectName("graphicsView_Image")
self.verticalLayout_4.addWidget(self.graphicsView_Image)
self.pushButton_confirmArena = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_confirmArena.setObjectName("pushButton_confirmArena")
self.verticalLayout_4.addWidget(self.pushButton_confirmArena)
self.horizontalLayout_3 = QtWidgets.QHBoxLayout() self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
self.horizontalLayout_3.setObjectName("horizontalLayout_3") self.horizontalLayout_3.setObjectName("horizontalLayout_3")
self.checkBox_enableFPS = QtWidgets.QCheckBox(self.centralwidget) self.checkBox_enableCamera = QtWidgets.QCheckBox(self.widget)
self.checkBox_enableCamera.setObjectName("checkBox_enableCamera")
self.horizontalLayout_3.addWidget(self.checkBox_enableCamera)
self.checkBox_enableFPS = QtWidgets.QCheckBox(self.widget)
self.checkBox_enableFPS.setObjectName("checkBox_enableFPS") self.checkBox_enableFPS.setObjectName("checkBox_enableFPS")
self.horizontalLayout_3.addWidget(self.checkBox_enableFPS) self.horizontalLayout_3.addWidget(self.checkBox_enableFPS)
self.checkBox_enablePosition = QtWidgets.QCheckBox(self.centralwidget)
self.checkBox_enablePosition.setObjectName("checkBox_enablePosition")
self.horizontalLayout_3.addWidget(self.checkBox_enablePosition)
self.verticalLayout_4.addLayout(self.horizontalLayout_3) self.verticalLayout_4.addLayout(self.horizontalLayout_3)
self.horizontalLayout_6.addLayout(self.verticalLayout_4) self.label_Image = QtWidgets.QLabel(self.widget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.label_Image.sizePolicy().hasHeightForWidth())
self.label_Image.setSizePolicy(sizePolicy)
self.label_Image.setMinimumSize(QtCore.QSize(640, 480))
self.label_Image.setSizeIncrement(QtCore.QSize(1, 1))
self.label_Image.setFrameShape(QtWidgets.QFrame.NoFrame)
self.label_Image.setText("")
self.label_Image.setObjectName("label_Image")
self.verticalLayout_4.addWidget(self.label_Image)
self.pushButton_confirmArena = QtWidgets.QPushButton(self.widget)
self.pushButton_confirmArena.setObjectName("pushButton_confirmArena")
self.verticalLayout_4.addWidget(self.pushButton_confirmArena)
self.horizontalLayout_6 = QtWidgets.QHBoxLayout()
self.horizontalLayout_6.setObjectName("horizontalLayout_6")
self.checkBox_enablePosition = QtWidgets.QCheckBox(self.widget)
self.checkBox_enablePosition.setObjectName("checkBox_enablePosition")
self.horizontalLayout_6.addWidget(self.checkBox_enablePosition)
self.gridLayout_2 = QtWidgets.QGridLayout()
self.gridLayout_2.setObjectName("gridLayout_2")
self.label_100 = QtWidgets.QLabel(self.widget)
self.label_100.setText("")
self.label_100.setPixmap(QtGui.QPixmap("ui/../res/icons8-robot-24.png"))
self.label_100.setAlignment(QtCore.Qt.AlignCenter)
self.label_100.setObjectName("label_100")
self.gridLayout_2.addWidget(self.label_100, 0, 0, 1, 1)
self.label_RobotID = QtWidgets.QLabel(self.widget)
self.label_RobotID.setAlignment(QtCore.Qt.AlignCenter)
self.label_RobotID.setObjectName("label_RobotID")
self.gridLayout_2.addWidget(self.label_RobotID, 0, 1, 1, 1)
self.label_102 = QtWidgets.QLabel(self.widget)
self.label_102.setText("")
self.label_102.setPixmap(QtGui.QPixmap("ui/../res/icons8-azimuth-24.png"))
self.label_102.setAlignment(QtCore.Qt.AlignCenter)
self.label_102.setObjectName("label_102")
self.gridLayout_2.addWidget(self.label_102, 1, 0, 1, 1)
self.label_RobotAngle = QtWidgets.QLabel(self.widget)
self.label_RobotAngle.setAlignment(QtCore.Qt.AlignCenter)
self.label_RobotAngle.setObjectName("label_RobotAngle")
self.gridLayout_2.addWidget(self.label_RobotAngle, 1, 1, 1, 1)
self.label_101 = QtWidgets.QLabel(self.widget)
self.label_101.setText("")
self.label_101.setPixmap(QtGui.QPixmap("ui/../res/icons8-emplacement-off-24.png"))
self.label_101.setAlignment(QtCore.Qt.AlignCenter)
self.label_101.setObjectName("label_101")
self.gridLayout_2.addWidget(self.label_101, 2, 0, 1, 1)
self.label_RobotPos = QtWidgets.QLabel(self.widget)
self.label_RobotPos.setAlignment(QtCore.Qt.AlignCenter)
self.label_RobotPos.setObjectName("label_RobotPos")
self.gridLayout_2.addWidget(self.label_RobotPos, 2, 1, 1, 1)
self.label_103 = QtWidgets.QLabel(self.widget)
self.label_103.setText("")
self.label_103.setPixmap(QtGui.QPixmap("ui/../res/icons8-flèche-haut-gauche-24.png"))
self.label_103.setAlignment(QtCore.Qt.AlignCenter)
self.label_103.setObjectName("label_103")
self.gridLayout_2.addWidget(self.label_103, 3, 0, 1, 1)
self.label_RobotDirection = QtWidgets.QLabel(self.widget)
self.label_RobotDirection.setAlignment(QtCore.Qt.AlignCenter)
self.label_RobotDirection.setObjectName("label_RobotDirection")
self.gridLayout_2.addWidget(self.label_RobotDirection, 3, 1, 1, 1)
self.horizontalLayout_6.addLayout(self.gridLayout_2)
self.verticalLayout_4.addLayout(self.horizontalLayout_6)
self.horizontalLayout_7.addLayout(self.verticalLayout_4)
self.verticalLayout_6 = QtWidgets.QVBoxLayout() self.verticalLayout_6 = QtWidgets.QVBoxLayout()
self.verticalLayout_6.setObjectName("verticalLayout_6") self.verticalLayout_6.setObjectName("verticalLayout_6")
self.groupBox_connection = QtWidgets.QGroupBox(self.centralwidget) self.groupBox_activation = QtWidgets.QGroupBox(self.widget)
self.groupBox_activation.setAlignment(QtCore.Qt.AlignCenter)
self.groupBox_activation.setObjectName("groupBox_activation")
self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.groupBox_activation)
self.verticalLayout_2.setObjectName("verticalLayout_2")
self.groupBox_connection = QtWidgets.QGroupBox(self.groupBox_activation)
self.groupBox_connection.setAlignment(QtCore.Qt.AlignCenter) self.groupBox_connection.setAlignment(QtCore.Qt.AlignCenter)
self.groupBox_connection.setFlat(False) self.groupBox_connection.setFlat(False)
self.groupBox_connection.setCheckable(False) self.groupBox_connection.setCheckable(False)
@ -102,12 +167,7 @@ class Ui_MainWindow(object):
self.line.setFrameShadow(QtWidgets.QFrame.Sunken) self.line.setFrameShadow(QtWidgets.QFrame.Sunken)
self.line.setObjectName("line") self.line.setObjectName("line")
self.verticalLayout.addWidget(self.line) self.verticalLayout.addWidget(self.line)
self.verticalLayout_6.addWidget(self.groupBox_connection) self.verticalLayout_2.addWidget(self.groupBox_connection)
self.groupBox_activation = QtWidgets.QGroupBox(self.centralwidget)
self.groupBox_activation.setAlignment(QtCore.Qt.AlignCenter)
self.groupBox_activation.setObjectName("groupBox_activation")
self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.groupBox_activation)
self.verticalLayout_2.setObjectName("verticalLayout_2")
self.checkBox_watchdog = QtWidgets.QCheckBox(self.groupBox_activation) self.checkBox_watchdog = QtWidgets.QCheckBox(self.groupBox_activation)
self.checkBox_watchdog.setObjectName("checkBox_watchdog") self.checkBox_watchdog.setObjectName("checkBox_watchdog")
self.verticalLayout_2.addWidget(self.checkBox_watchdog) self.verticalLayout_2.addWidget(self.checkBox_watchdog)
@ -120,7 +180,7 @@ class Ui_MainWindow(object):
self.line_2.setObjectName("line_2") self.line_2.setObjectName("line_2")
self.verticalLayout_2.addWidget(self.line_2) self.verticalLayout_2.addWidget(self.line_2)
self.verticalLayout_6.addWidget(self.groupBox_activation) self.verticalLayout_6.addWidget(self.groupBox_activation)
self.groupBox_mouvments = QtWidgets.QGroupBox(self.centralwidget) self.groupBox_mouvments = QtWidgets.QGroupBox(self.widget)
self.groupBox_mouvments.setAlignment(QtCore.Qt.AlignCenter) self.groupBox_mouvments.setAlignment(QtCore.Qt.AlignCenter)
self.groupBox_mouvments.setObjectName("groupBox_mouvments") self.groupBox_mouvments.setObjectName("groupBox_mouvments")
self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.groupBox_mouvments) self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.groupBox_mouvments)
@ -149,7 +209,7 @@ class Ui_MainWindow(object):
self.line_3.setObjectName("line_3") self.line_3.setObjectName("line_3")
self.verticalLayout_3.addWidget(self.line_3) self.verticalLayout_3.addWidget(self.line_3)
self.verticalLayout_6.addWidget(self.groupBox_mouvments) self.verticalLayout_6.addWidget(self.groupBox_mouvments)
self.groupBox_AnswerandBattery = QtWidgets.QGroupBox(self.centralwidget) self.groupBox_AnswerandBattery = QtWidgets.QGroupBox(self.widget)
self.groupBox_AnswerandBattery.setObjectName("groupBox_AnswerandBattery") self.groupBox_AnswerandBattery.setObjectName("groupBox_AnswerandBattery")
self.verticalLayout_5 = QtWidgets.QVBoxLayout(self.groupBox_AnswerandBattery) self.verticalLayout_5 = QtWidgets.QVBoxLayout(self.groupBox_AnswerandBattery)
self.verticalLayout_5.setObjectName("verticalLayout_5") self.verticalLayout_5.setObjectName("verticalLayout_5")
@ -168,10 +228,10 @@ class Ui_MainWindow(object):
self.verticalLayout_6.addWidget(self.groupBox_AnswerandBattery) self.verticalLayout_6.addWidget(self.groupBox_AnswerandBattery)
spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
self.verticalLayout_6.addItem(spacerItem) self.verticalLayout_6.addItem(spacerItem)
self.horizontalLayout_6.addLayout(self.verticalLayout_6) self.horizontalLayout_7.addLayout(self.verticalLayout_6)
MainWindow.setCentralWidget(self.centralwidget) MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 928, 22)) self.menubar.setGeometry(QtCore.QRect(0, 0, 985, 22))
self.menubar.setObjectName("menubar") self.menubar.setObjectName("menubar")
self.menu_Quitter = QtWidgets.QMenu(self.menubar) self.menu_Quitter = QtWidgets.QMenu(self.menubar)
self.menu_Quitter.setObjectName("menu_Quitter") self.menu_Quitter.setObjectName("menu_Quitter")
@ -195,15 +255,19 @@ class Ui_MainWindow(object):
_translate = QtCore.QCoreApplication.translate _translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "Robot Monitor")) MainWindow.setWindowTitle(_translate("MainWindow", "Robot Monitor"))
self.checkBox_enableCamera.setText(_translate("MainWindow", "Enable Ca&mera")) self.checkBox_enableCamera.setText(_translate("MainWindow", "Enable Ca&mera"))
self.pushButton_confirmArena.setText(_translate("MainWindow", "Co&nfirme arena border..."))
self.checkBox_enableFPS.setText(_translate("MainWindow", "Enable &FPS")) self.checkBox_enableFPS.setText(_translate("MainWindow", "Enable &FPS"))
self.pushButton_confirmArena.setText(_translate("MainWindow", "Co&nfirme arena border..."))
self.checkBox_enablePosition.setText(_translate("MainWindow", "Enable Pos&ition")) self.checkBox_enablePosition.setText(_translate("MainWindow", "Enable Pos&ition"))
self.label_RobotID.setText(_translate("MainWindow", "No robot (-1)"))
self.label_RobotAngle.setText(_translate("MainWindow", "0.0°"))
self.label_RobotPos.setText(_translate("MainWindow", "(0.0, 0.0)"))
self.label_RobotDirection.setText(_translate("MainWindow", "(0.0, 0.0)"))
self.groupBox_activation.setTitle(_translate("MainWindow", "Robot Activation"))
self.groupBox_connection.setTitle(_translate("MainWindow", "Connection")) self.groupBox_connection.setTitle(_translate("MainWindow", "Connection"))
self.label.setText(_translate("MainWindow", "Address:")) self.label.setText(_translate("MainWindow", "Address:"))
self.label_2.setText(_translate("MainWindow", "Port:")) self.label_2.setText(_translate("MainWindow", "Port:"))
self.label_3.setText(_translate("MainWindow", "Status:")) self.label_3.setText(_translate("MainWindow", "Status:"))
self.label_connectionStatus.setText(_translate("MainWindow", "Not connected")) self.label_connectionStatus.setText(_translate("MainWindow", "Not connected"))
self.groupBox_activation.setTitle(_translate("MainWindow", "Robot Activation"))
self.checkBox_watchdog.setText(_translate("MainWindow", "Start with &watchdog")) self.checkBox_watchdog.setText(_translate("MainWindow", "Start with &watchdog"))
self.pushButton_start.setText(_translate("MainWindow", "Start r&obot")) self.pushButton_start.setText(_translate("MainWindow", "Start r&obot"))
self.groupBox_mouvments.setTitle(_translate("MainWindow", "Mouvments")) self.groupBox_mouvments.setTitle(_translate("MainWindow", "Mouvments"))

View file

@ -1,27 +1,34 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
from email.message import Message from email.message import Message
from email.policy import Policy
import os import os
import time import time
import sys import sys
from tkinter import Image
from PyQt5 import (QtCore, QtWidgets) from PyQt5 import (QtCore, QtWidgets, QtGui)
from main_window import Ui_MainWindow from main_window import Ui_MainWindow
from log_dialog import Ui_Dialog from log_dialog import Ui_Dialog
from network import * from network import *
from globvar import GlobVar from globvar import GlobVar
import base64
class Window(QtWidgets.QMainWindow, Ui_MainWindow): class Window(QtWidgets.QMainWindow, Ui_MainWindow):
_msg_dialog= None _msg_dialog= None
_batteryTimer=None _batteryTimer=None
_FPSTimer=None
fps=0
def __init__(self, parent=None): def __init__(self, parent=None):
super().__init__(parent) super().__init__(parent)
self.setupUi(self) self.setupUi(self)
self.DisableUIWidgets("Network") #self.DisableUIWidgets("Network")
self.lineEdit_address.setText(GlobVar.address) self.lineEdit_address.setText(GlobVar.address)
self.lineEdit_port.setText(str(GlobVar.port)) self.lineEdit_port.setText(str(GlobVar.port))
@ -30,6 +37,8 @@ class Window(QtWidgets.QMainWindow, Ui_MainWindow):
self._msg_dialog.ui= Ui_Dialog() self._msg_dialog.ui= Ui_Dialog()
self._msg_dialog.ui.setupUi(self._msg_dialog) self._msg_dialog.ui.setupUi(self._msg_dialog)
self.fps=0
self.networkThread = Network() self.networkThread = Network()
self.connectSignalSlots() self.connectSignalSlots()
@ -41,6 +50,10 @@ class Window(QtWidgets.QMainWindow, Ui_MainWindow):
self._batteryTimer = QtCore.QTimer() self._batteryTimer = QtCore.QTimer()
self._batteryTimer.timeout.connect(self.OnBatteryTimeout) self._batteryTimer.timeout.connect(self.OnBatteryTimeout)
# Create fps timer
self._FPSTimer = QtCore.QTimer()
self._FPSTimer.timeout.connect(self.OnFPSTimeout)
def connectSignalSlots(self): def connectSignalSlots(self):
# Buttons # Buttons
self.pushButton_start.pressed.connect(self.OnButtonPress_Start) self.pushButton_start.pressed.connect(self.OnButtonPress_Start)
@ -78,7 +91,7 @@ class Window(QtWidgets.QMainWindow, Ui_MainWindow):
def EnableUIWidgets(self, area): def EnableUIWidgets(self, area):
if area == "Network": if area == "Network":
self.groupBox_activation.setDisabled(False) self.groupBox_activation.setDisabled(False)
self.graphicsView_Image.setDisabled(False) self.label_Image.setDisabled(False)
self.pushButton_confirmArena.setDisabled(False) self.pushButton_confirmArena.setDisabled(False)
self.checkBox_enableCamera.setDisabled(False) self.checkBox_enableCamera.setDisabled(False)
self.checkBox_enableFPS.setDisabled(False) self.checkBox_enableFPS.setDisabled(False)
@ -90,7 +103,7 @@ class Window(QtWidgets.QMainWindow, Ui_MainWindow):
def DisableUIWidgets(self, area): def DisableUIWidgets(self, area):
if area == "Network": if area == "Network":
self.groupBox_activation.setDisabled(True) self.groupBox_activation.setDisabled(True)
self.graphicsView_Image.setDisabled(True) self.label_Image.setDisabled(True)
self.pushButton_confirmArena.setDisabled(True) self.pushButton_confirmArena.setDisabled(True)
self.checkBox_enableCamera.setDisabled(True) self.checkBox_enableCamera.setDisabled(True)
self.checkBox_enableFPS.setDisabled(True) self.checkBox_enableFPS.setDisabled(True)
@ -131,16 +144,19 @@ class Window(QtWidgets.QMainWindow, Ui_MainWindow):
msg.warning(self,'Invalid answer', 'Server answer was not acknowledged. Maybe robot is still running', msg.Ok) msg.warning(self,'Invalid answer', 'Server answer was not acknowledged. Maybe robot is still running', msg.Ok)
self.pushButton_start.setText("Start r&obot") self.pushButton_start.setText("Start r&obot")
self.DisableUIWidgets("Robot") #self.DisableUIWidgets("Robot")
@QtCore.pyqtSlot() @QtCore.pyqtSlot()
def OnButtonPress_ConfirmArena(self): def OnButtonPress_ConfirmArena(self):
self.networkThread.cameraAskArena()
msg= QtWidgets.QMessageBox msg= QtWidgets.QMessageBox
ret = msg.question(self, '', 'Arena boundaries are correctly detected ?',msg.Yes| msg.No) ret = msg.question(self, '', 'Arena boundaries are correctly detected ?',msg.Yes| msg.No)
if ret == msg.Yes: if ret == msg.Yes:
self.networkThread.cameraConfirmArena()
print ("Answer is YES") print ("Answer is YES")
else: else:
self.networkThread.cameraInfirmArena()
print ("Answer is NO") print ("Answer is NO")
@QtCore.pyqtSlot() @QtCore.pyqtSlot()
@ -165,21 +181,26 @@ class Window(QtWidgets.QMainWindow, Ui_MainWindow):
@QtCore.pyqtSlot(int) @QtCore.pyqtSlot(int)
def OnCheckBoxChanged_EnableCamera(self, state): def OnCheckBoxChanged_EnableCamera(self, state):
msg= QtWidgets.QMessageBox if self.checkBox_enableCamera.isChecked():
msg.information(self, 'Feature not ready', 'Feature not yet available', msg.Ok) self.networkThread.cameraOpen()
self.checkBox_enableCamera.setChecked(False) else:
self.networkThread.cameraClose()
@QtCore.pyqtSlot(int) @QtCore.pyqtSlot(int)
def OnCheckBoxChanged_EnableFPS(self, state): def OnCheckBoxChanged_EnableFPS(self, state):
msg= QtWidgets.QMessageBox if state !=0:
msg.information(self, 'Feature not ready', 'Feature not yet available', msg.Ok) self._FPSTimer.start(1000)
self.checkBox_enableFPS.setChecked(False) self.checkBox_enableFPS.setText("FPS (0)")
else:
self._FPSTimer.stop()
self.checkBox_enableFPS.setText("Enable FPS")
@QtCore.pyqtSlot(int) @QtCore.pyqtSlot(int)
def OnCheckBoxChanged_EnablePosition(self, state): def OnCheckBoxChanged_EnablePosition(self, state):
msg= QtWidgets.QMessageBox if self.checkBox_enablePosition.isChecked():
msg.information(self, 'Feature not ready', 'Feature not yet available', msg.Ok) self.networkThread.cameraGetPosition()
self.checkBox_enablePosition.setChecked(False) else:
self.networkThread.cameraStopPosition()
@QtCore.pyqtSlot(int) @QtCore.pyqtSlot(int)
def OnCheckBoxChanged_GetBattery(self, state): def OnCheckBoxChanged_GetBattery(self, state):
@ -229,13 +250,82 @@ class Window(QtWidgets.QMainWindow, Ui_MainWindow):
self.checkBox_getBattery.setText ("Get battery (2 = full)") self.checkBox_getBattery.setText ("Get battery (2 = full)")
else: else:
self.checkBox_getBattery.setText ("Get battery (invalid value)") self.checkBox_getBattery.setText ("Get battery (invalid value)")
elif Network.CAMERA_IMAGE in s:
#print ("Image received")
#print ("Date received: " + s)
self.fps=self.fps+1
str_split = s.split(':')
try:
image_jpg= base64.b64decode(str_split[1])
img = QtGui.QImage.fromData(image_jpg, "jpg")
im_pixmap = QtGui.QPixmap(QtGui.QPixmap.fromImage(img))
#print ("Image size: " + str(im_pixmap.width()) + "x" + str(im_pixmap.height()))
self.label_Image.setPixmap(im_pixmap)
self.label_Image.setScaledContents(True)
self.label_Image.setSizePolicy(QtWidgets.QSizePolicy.Fixed,QtWidgets.QSizePolicy.Fixed)
except:
pass
#print ("Invalid image received")
elif Network.CAMERA_POSITION in s:
#CPOS:-1;0.000000;0.000000;0.000000;0.000000;0.000000
str_split = s.split(':')
values_split = str_split[1].split(';')
try:
robot_ID = int(values_split[0]) # Id of robot
except:
robot_ID = -1
try:
robot_Angle = float(values_split[1]) # angle of robot
except:
robot_Angle = 0.0
try:
robot_Coord_X = float(values_split[2]) # X coord of robot
except:
robot_Coord_X = 0.0
try:
robot_Coord_Y = float(values_split[3]) # Y coord of robot
except:
robot_Coord_Y = 0.0
try:
robot_Cap_X = float(values_split[4]) # X cap of robot
except:
robot_Cap_X = 0.0
try:
robot_Cap_Y = float(values_split[5]) # Y cap of robot
except:
robot_Cap_Y = 0.0
if robot_ID == -1:
self.label_RobotID.setText("No robot (-1)")
else:
self.label_RobotID.setText(values_split[0])
self.label_RobotAngle.setText("%.2f°" % (robot_Angle))
self.label_RobotPos.setText("(%.2f, %.2f)" % (robot_Coord_X, robot_Coord_Y))
self.label_RobotDirection.setText("(%.2f, %.2f)" % (robot_Cap_X, robot_Cap_Y))
# Callback for battery timeout # Callback for battery timeout
@QtCore.pyqtSlot() @QtCore.pyqtSlot()
def OnBatteryTimeout(self) -> None: def OnBatteryTimeout(self) -> None:
# Send a request for battery level. Answer will be done in OnReceptionEvent callback # Send a request for battery level. Answer will be done in OnReceptionEvent callback
self.networkThread.robotGetBattery() self.networkThread.robotGetBattery()
# Callback for FPS timeout
@QtCore.pyqtSlot()
def OnFPSTimeout(self) -> None:
# Display current FPS
self.checkBox_enableFPS.setText("FPS (" + str(self.fps)+")")
self.fps=0
# Callback for connection/deconnection event from network manager # Callback for connection/deconnection event from network manager
@QtCore.pyqtSlot(int) @QtCore.pyqtSlot(int)
def OnConnectionEvent(self, event) -> None: def OnConnectionEvent(self, event) -> None:
@ -251,7 +341,7 @@ class Window(QtWidgets.QMainWindow, Ui_MainWindow):
self.label_connectionStatus.setText("Not connected") self.label_connectionStatus.setText("Not connected")
self.pushButton_start.setText("Start r&obot") self.pushButton_start.setText("Start r&obot")
self.DisableUIWidgets("Network") #self.DisableUIWidgets("Network")
# Callback for answer event from network manager # Callback for answer event from network manager
@QtCore.pyqtSlot(int) @QtCore.pyqtSlot(int)

View file

@ -116,8 +116,8 @@ class Network(QtCore.QThread):
# Private method for connecting to server # Private method for connecting to server
def __connect(self) -> None: def __connect(self) -> None:
#self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
try: try:
self.sock.connect((GlobVar.address, GlobVar.port)) self.sock.connect((GlobVar.address, GlobVar.port))
@ -126,7 +126,7 @@ class Network(QtCore.QThread):
# In UDP, no way to know if server is running (connect is always successfull). # In UDP, no way to know if server is running (connect is always successfull).
# So, send a single line feed to ping the server # So, send a single line feed to ping the server
self.sock.send(str.encode("\n")) #self.sock.send(str.encode("\n"))
self.waitForAnswer=False self.waitForAnswer=False
# Private method for receiving data from server. # Private method for receiving data from server.
@ -147,6 +147,11 @@ class Network(QtCore.QThread):
bytes_recd = bytes_recd + len(chunk) bytes_recd = bytes_recd + len(chunk)
last_char=chunk[-1] last_char=chunk[-1]
#print ("")
#print ("Data: ")
#print (b''.join(chunks))
#print ("")
self.__receiveHandler(b''.join(chunks).decode("utf-8")) self.__receiveHandler(b''.join(chunks).decode("utf-8"))
chunks = [] chunks = []
bytes_recd =0 bytes_recd =0
@ -315,6 +320,46 @@ class Network(QtCore.QThread):
def robotGetBattery(self) -> None: def robotGetBattery(self) -> None:
ans = self.__sendCommand(self.ROBOT_GET_BATTERY,False) ans = self.__sendCommand(self.ROBOT_GET_BATTERY,False)
# Send OpenCamera command to server
def cameraOpen(self) -> int:
ans = self.__sendCommand(self.CAMERA_OPEN, True)
decodedAns = self.__decodeAnswer(ans)
self.answerEvent.emit(decodedAns)
return decodedAns
# Send CloseCamera command to server
def cameraClose(self) -> int:
ans = self.__sendCommand(self.CAMERA_CLOSE, True)
decodedAns = self.__decodeAnswer(ans)
self.answerEvent.emit(decodedAns)
return decodedAns
# Send GetPosition command to server
def cameraGetPosition(self) -> int:
ans = self.__sendCommand(self.CAMERA_POSITION_COMPUTE, True)
decodedAns = self.__decodeAnswer(ans)
self.answerEvent.emit(decodedAns)
return decodedAns
# Send StopPosition command to server
def cameraStopPosition(self) -> int:
ans = self.__sendCommand(self.CAMERA_POSITION_STOP, True)
decodedAns = self.__decodeAnswer(ans)
self.answerEvent.emit(decodedAns)
return decodedAns
# Send AskArena command to server
def cameraAskArena(self) -> None:
ans = self.__sendCommand(self.CAMERA_ARENA_ASK,False)
# Send ConfirmArena command to server
def cameraConfirmArena(self) -> None:
ans = self.__sendCommand(self.CAMERA_ARENA_CONFIRM,False)
# Send InfirmArena command to server
def cameraInfirmArena(self) -> None:
ans = self.__sendCommand(self.CAMERA_ARENA_INFIRM,False)
# Function for decoding battery level # Function for decoding battery level
def batterylevelToStr(batlvl: int) -> str: def batterylevelToStr(batlvl: int) -> str:
switcher = { switcher = {

View file

@ -6,313 +6,454 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>928</width> <width>985</width>
<height>629</height> <height>745</height>
</rect> </rect>
</property> </property>
<property name="minimumSize">
<size>
<width>985</width>
<height>745</height>
</size>
</property>
<property name="windowTitle"> <property name="windowTitle">
<string>Robot Monitor</string> <string>Robot Monitor</string>
</property> </property>
<widget class="QWidget" name="centralwidget"> <widget class="QWidget" name="centralwidget">
<layout class="QHBoxLayout" name="horizontalLayout_6"> <widget class="QWidget" name="">
<item> <property name="geometry">
<layout class="QVBoxLayout" name="verticalLayout_4"> <rect>
<item> <x>20</x>
<widget class="QCheckBox" name="checkBox_enableCamera"> <y>16</y>
<property name="text"> <width>947</width>
<string>Enable Ca&amp;mera</string> <height>671</height>
</property> </rect>
</widget> </property>
</item> <layout class="QHBoxLayout" name="horizontalLayout_7">
<item> <item>
<widget class="QGraphicsView" name="graphicsView_Image"/> <layout class="QVBoxLayout" name="verticalLayout_4">
</item> <item>
<item> <layout class="QHBoxLayout" name="horizontalLayout_3">
<widget class="QPushButton" name="pushButton_confirmArena">
<property name="text">
<string>Co&amp;nfirme arena border...</string>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_3">
<item>
<widget class="QCheckBox" name="checkBox_enableFPS">
<property name="text">
<string>Enable &amp;FPS</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="checkBox_enablePosition">
<property name="text">
<string>Enable Pos&amp;ition</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_6">
<item>
<widget class="QGroupBox" name="groupBox_connection">
<property name="title">
<string>Connection</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<property name="flat">
<bool>false</bool>
</property>
<property name="checkable">
<bool>false</bool>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item> <item>
<layout class="QHBoxLayout" name="horizontalLayout"> <widget class="QCheckBox" name="checkBox_enableCamera">
<item> <property name="text">
<widget class="QLabel" name="label"> <string>Enable Ca&amp;mera</string>
<property name="sizePolicy"> </property>
<sizepolicy hsizetype="Minimum" vsizetype="Preferred"> </widget>
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Address:</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_address">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>300</width>
<height>16777215</height>
</size>
</property>
</widget>
</item>
</layout>
</item> </item>
<item> <item>
<layout class="QHBoxLayout" name="horizontalLayout_2"> <widget class="QCheckBox" name="checkBox_enableFPS">
<item> <property name="text">
<widget class="QLabel" name="label_2"> <string>Enable &amp;FPS</string>
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Port:</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_port">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>300</width>
<height>16777215</height>
</size>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QLabel" name="label_3">
<property name="text">
<string>Status:</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_connectionStatus">
<property name="text">
<string>Not connected</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="Line" name="line">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property> </property>
</widget> </widget>
</item> </item>
</layout> </layout>
</widget> </item>
</item> <item>
<item> <widget class="QLabel" name="label_Image">
<widget class="QGroupBox" name="groupBox_activation"> <property name="sizePolicy">
<property name="title"> <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<string>Robot Activation</string> <horstretch>0</horstretch>
</property> <verstretch>0</verstretch>
<property name="alignment"> </sizepolicy>
<set>Qt::AlignCenter</set> </property>
</property> <property name="minimumSize">
<layout class="QVBoxLayout" name="verticalLayout_2"> <size>
<width>640</width>
<height>480</height>
</size>
</property>
<property name="sizeIncrement">
<size>
<width>1</width>
<height>1</height>
</size>
</property>
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pushButton_confirmArena">
<property name="text">
<string>Co&amp;nfirme arena border...</string>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_6">
<item> <item>
<widget class="QCheckBox" name="checkBox_watchdog"> <widget class="QCheckBox" name="checkBox_enablePosition">
<property name="text"> <property name="text">
<string>Start with &amp;watchdog</string> <string>Enable Pos&amp;ition</string>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QPushButton" name="pushButton_start"> <layout class="QGridLayout" name="gridLayout_2">
<property name="text"> <item row="0" column="0">
<string>Start r&amp;obot</string> <widget class="QLabel" name="label_100">
</property> <property name="text">
</widget> <string/>
</item> </property>
<item> <property name="pixmap">
<widget class="Line" name="line_2"> <pixmap>../res/icons8-robot-24.png</pixmap>
<property name="orientation"> </property>
<enum>Qt::Horizontal</enum> <property name="alignment">
</property> <set>Qt::AlignCenter</set>
</widget> </property>
</item> </widget>
</layout> </item>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_mouvments">
<property name="title">
<string>Mouvments</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="1"> <item row="0" column="1">
<widget class="QPushButton" name="pushButton_up"> <widget class="QLabel" name="label_RobotID">
<property name="text"> <property name="text">
<string>&amp;Up</string> <string>No robot (-1)</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="0"> <item row="1" column="0">
<widget class="QPushButton" name="pushButton_left"> <widget class="QLabel" name="label_102">
<property name="text"> <property name="text">
<string>&amp;Left</string> <string/>
</property>
<property name="pixmap">
<pixmap>../res/icons8-azimuth-24.png</pixmap>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="1"> <item row="1" column="1">
<widget class="QPushButton" name="pushButton_stop"> <widget class="QLabel" name="label_RobotAngle">
<property name="text"> <property name="text">
<string>&amp;Stop</string> <string>0.0°</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="2"> <item row="2" column="0">
<widget class="QPushButton" name="pushButton_right"> <widget class="QLabel" name="label_101">
<property name="text"> <property name="text">
<string>&amp;Right</string> <string/>
</property>
<property name="pixmap">
<pixmap>../res/icons8-emplacement-off-24.png</pixmap>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property> </property>
</widget> </widget>
</item> </item>
<item row="2" column="1"> <item row="2" column="1">
<widget class="QPushButton" name="pushButton_down"> <widget class="QLabel" name="label_RobotPos">
<property name="text"> <property name="text">
<string>&amp;Down</string> <string>(0.0, 0.0)</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property> </property>
</widget> </widget>
</item> </item>
</layout> <item row="3" column="0">
</item> <widget class="QLabel" name="label_103">
<item>
<widget class="Line" name="line_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_AnswerandBattery">
<property name="title">
<string>Others</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_5">
<item>
<widget class="QCheckBox" name="checkBox_getBattery">
<property name="text">
<string>Get &amp;Battery</string>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_5">
<item>
<widget class="QLabel" name="label_4">
<property name="text"> <property name="text">
<string>Last answer:</string> <string/>
</property>
<property name="pixmap">
<pixmap>../res/icons8-flèche-haut-gauche-24.png</pixmap>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item row="3" column="1">
<widget class="QLabel" name="label_lastAnswer"> <widget class="QLabel" name="label_RobotDirection">
<property name="text"> <property name="text">
<string>None</string> <string>(0.0, 0.0)</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property> </property>
</widget> </widget>
</item> </item>
</layout> </layout>
</item> </item>
</layout> </layout>
</widget> </item>
</item> </layout>
<item> </item>
<spacer name="verticalSpacer"> <item>
<property name="orientation"> <layout class="QVBoxLayout" name="verticalLayout_6">
<enum>Qt::Vertical</enum> <item>
</property> <widget class="QGroupBox" name="groupBox_activation">
<property name="sizeHint" stdset="0"> <property name="title">
<size> <string>Robot Activation</string>
<width>20</width> </property>
<height>40</height> <property name="alignment">
</size> <set>Qt::AlignCenter</set>
</property> </property>
</spacer> <layout class="QVBoxLayout" name="verticalLayout_2">
</item> <item>
</layout> <widget class="QGroupBox" name="groupBox_connection">
</item> <property name="title">
</layout> <string>Connection</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<property name="flat">
<bool>false</bool>
</property>
<property name="checkable">
<bool>false</bool>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="label">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Address:</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_address">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>300</width>
<height>16777215</height>
</size>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QLabel" name="label_2">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Port:</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="lineEdit_port">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>300</width>
<height>16777215</height>
</size>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QLabel" name="label_3">
<property name="text">
<string>Status:</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_connectionStatus">
<property name="text">
<string>Not connected</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="Line" name="line">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QCheckBox" name="checkBox_watchdog">
<property name="text">
<string>Start with &amp;watchdog</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pushButton_start">
<property name="text">
<string>Start r&amp;obot</string>
</property>
</widget>
</item>
<item>
<widget class="Line" name="line_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_mouvments">
<property name="title">
<string>Mouvments</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="1">
<widget class="QPushButton" name="pushButton_up">
<property name="text">
<string>&amp;Up</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QPushButton" name="pushButton_left">
<property name="text">
<string>&amp;Left</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QPushButton" name="pushButton_stop">
<property name="text">
<string>&amp;Stop</string>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QPushButton" name="pushButton_right">
<property name="text">
<string>&amp;Right</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QPushButton" name="pushButton_down">
<property name="text">
<string>&amp;Down</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="Line" name="line_3">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_AnswerandBattery">
<property name="title">
<string>Others</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_5">
<item>
<widget class="QCheckBox" name="checkBox_getBattery">
<property name="text">
<string>Get &amp;Battery</string>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_5">
<item>
<widget class="QLabel" name="label_4">
<property name="text">
<string>Last answer:</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_lastAnswer">
<property name="text">
<string>None</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
</widget>
</widget> </widget>
<widget class="QMenuBar" name="menubar"> <widget class="QMenuBar" name="menubar">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>928</width> <width>985</width>
<height>22</height> <height>22</height>
</rect> </rect>
</property> </property>