1
|
import logging
|
2
|
import math
|
3
|
import random
|
4
|
|
5
|
from PyQt5.QtCore import QSize, QThread, QObject, pyqtSignal
|
6
|
from PyQt5.QtWidgets import QMainWindow, QPlainTextEdit, QDialog, QHBoxLayout
|
7
|
from numpy import pi, sin, cos, tan, exp
|
8
|
from matplotlib.pyplot import subplot
|
9
|
|
10
|
from aswi2021vochomurka.model.Message import Message
|
11
|
from aswi2021vochomurka.service.mqtt.mqtt_subscriber import MQTTSubscriber
|
12
|
from aswi2021vochomurka.service.subscriber import Subscriber
|
13
|
from aswi2021vochomurka.service.subscriber_callback import SubscriberCallback
|
14
|
from aswi2021vochomurka.service.subscriber_params import SubscriberParams, ConnectionParams
|
15
|
|
16
|
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
|
17
|
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar
|
18
|
import matplotlib.pyplot as plt
|
19
|
|
20
|
import sys
|
21
|
from PyQt5.QtWidgets import QDialog, QApplication, QPushButton, QVBoxLayout
|
22
|
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
|
23
|
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar
|
24
|
import matplotlib.pyplot as plt
|
25
|
import random
|
26
|
|
27
|
from aswi2021vochomurka.view.logger_view import LoggerView
|
28
|
|
29
|
|
30
|
class Worker(QObject, SubscriberCallback):
|
31
|
connected = pyqtSignal()
|
32
|
disconnected = pyqtSignal()
|
33
|
error = pyqtSignal(Exception)
|
34
|
newMessage = pyqtSignal(str)
|
35
|
subscriber: Subscriber = None
|
36
|
|
37
|
params = SubscriberParams(
|
38
|
["/home/1", "/home/2"],
|
39
|
10,
|
40
|
ConnectionParams("localhost", 1883, 60),
|
41
|
True
|
42
|
)
|
43
|
|
44
|
def start(self):
|
45
|
self.subscriber = MQTTSubscriber(self, self.params)
|
46
|
self.subscriber.start()
|
47
|
|
48
|
def onConnected(self):
|
49
|
self.connected.emit()
|
50
|
|
51
|
def onDisconnected(self):
|
52
|
self.disconnected.emit()
|
53
|
|
54
|
def onError(self):
|
55
|
self.error.emit()
|
56
|
|
57
|
def onMessage(self, message: Message):
|
58
|
self.newMessage.emit(message.topic)
|
59
|
self.window.plot(message)
|
60
|
|
61
|
def onCloseTopic(self, topic: str):
|
62
|
pass
|
63
|
|
64
|
|
65
|
class MainView(QDialog):
|
66
|
worker: Worker = None
|
67
|
workerThread: QThread = None
|
68
|
|
69
|
def __init__(self):
|
70
|
super(MainView, self).__init__()
|
71
|
|
72
|
self.chartsNum = 0
|
73
|
self.arrayData = []
|
74
|
|
75
|
self.dataIndex = 0
|
76
|
self.dataDict = {}
|
77
|
|
78
|
self.figure = plt.figure(figsize=([500,500]))
|
79
|
|
80
|
self.canvas = FigureCanvas(self.figure)
|
81
|
self.toolbar = NavigationToolbar(self.canvas, self)
|
82
|
|
83
|
self.setMinimumSize(QSize(440, 240))
|
84
|
self.setWindowTitle("MQTT demo")
|
85
|
|
86
|
# Add logger text field
|
87
|
logger = LoggerView(self)
|
88
|
formatter = logging.Formatter('%(asctime)s %(message)s', '%H:%M')
|
89
|
logger.setFormatter(formatter)
|
90
|
logger.setLevel(logging.INFO)
|
91
|
logging.getLogger('').addHandler(logger)
|
92
|
|
93
|
layout = QVBoxLayout()
|
94
|
layout.addWidget(logger.widget)
|
95
|
layout.addWidget(self.toolbar)
|
96
|
layout.addWidget(self.canvas)
|
97
|
|
98
|
self.setLayout(layout)
|
99
|
|
100
|
self.initSubscriber()
|
101
|
|
102
|
def plot(self, message: Message):
|
103
|
self.figure.clear()
|
104
|
|
105
|
if message.topic in self.dataDict:
|
106
|
self.dataDict[message.topic].append(message.value)
|
107
|
else:
|
108
|
self.dataDict[message.topic] = [message.value]
|
109
|
self.chartsNum += 1
|
110
|
|
111
|
rows = math.ceil(self.chartsNum / 2)
|
112
|
|
113
|
b = 0
|
114
|
for a in self.dataDict.values():
|
115
|
self.figure.add_subplot(rows, 2, b + 1)
|
116
|
b += 1
|
117
|
plt.plot(a)
|
118
|
|
119
|
self.canvas.draw()
|
120
|
|
121
|
def initSubscriber(self):
|
122
|
self.workerThread = QThread()
|
123
|
self.worker = Worker()
|
124
|
self.worker.moveToThread(self.workerThread)
|
125
|
self.workerThread.started.connect(self.worker.start)
|
126
|
# self.worker.newMessage.connect(
|
127
|
# lambda message: self.b.insertPlainText(message + "\n")
|
128
|
# )
|
129
|
self.worker.window = self
|
130
|
self.workerThread.start()
|