Projekt

Obecné

Profil

Stáhnout (3.81 KB) Statistiky
| Větev: | Tag: | Revize:
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()
(3-3/3)