Branch data Line data Source code
1 : : #include "ZMQSubscriber.hpp"
2 : :
3 : : #include <QApplication>
4 : : #include <QtCore/QDebug>
5 : : #include <QtCore/QThread>
6 : : #include <csignal>
7 : : #include <cstdint>
8 : : #include <iostream>
9 : : #include <zmq.hpp>
10 : :
11 : 0 : ZmqSubscriber::ZmqSubscriber(std::unique_ptr<MQ::ZeroMQSocket> socket, QObject *parent)
12 : 0 : : QObject(parent), subscriber(std::move(socket)) {
13 : 0 : qDebug() << "ZmqSubscriber::init";
14 : 0 : }
15 : :
16 : 0 : ZmqSubscriber::~ZmqSubscriber() {
17 : 0 : qDebug() << "ZmqSubscriber::closing socket";
18 : 0 : subscriber->close();
19 : 0 : qDebug() << "ZmqSubscriber::finished";
20 : 0 : }
21 : :
22 : 0 : void ZmqSubscriber::checkForMessages() {
23 : 0 : qDebug() << "ZmqSubscriber::checkForMessages";
24 : 0 : subscriber->subscribe("");
25 : 0 : std::optional<std::vector<uint8_t>> message;
26 : :
27 : : while (true) {
28 : : try {
29 : 0 : message = subscriber->receive();
30 : 0 : } catch (zmq::error_t &e) {
31 : 0 : qDebug() << e.what();
32 : 0 : if (ETERM == e.num()) {
33 : 0 : break;
34 : : }
35 : 0 : }
36 : :
37 : 0 : if (!message.has_value()) {
38 : 0 : continue;
39 : : }
40 : 0 : decodeMessage(message.value());
41 : 0 : }
42 : 0 : qDebug() << "stopped receiving messages";
43 : 0 : }
44 : :
45 : 0 : void ZmqSubscriber::decodeMessage(const std::vector<uint8_t> &message) {
46 : 0 : if (message.empty()) {
47 : 0 : std::cerr << "Error: Invalid message - size is too small.\n";
48 : 0 : return;
49 : : }
50 : :
51 : 0 : switch (message[0]) {
52 : 0 : case 1: {
53 : : float speed;
54 : : float rpm;
55 : 0 : memcpy(&speed, message.data() + 1, sizeof(speed)); // Retrieve speed
56 : 0 : memcpy(&rpm, message.data() + 5, sizeof(rpm)); // Retrieve rpm (offset by 5)
57 : 0 : emit messageReceived(speed, rpm);
58 : 0 : break;
59 : : }
60 : 0 : case 2: {
61 : 0 : uint8_t const battery = message[1];
62 : 0 : emit batteryMessageReceived(battery);
63 : 0 : break;
64 : : }
65 : 0 : case 3: {
66 : 0 : uint8_t const temperature = message[1];
67 : 0 : emit temperatureMessageReceived(temperature);
68 : 0 : break;
69 : : }
70 : 0 : default:
71 : 0 : qDebug() << "No message definition";
72 : : }
73 : : }
|