File: BrownianMotionMqttClient.cpp

package info (click to toggle)
labplot 2.12.1-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 78,528 kB
  • sloc: cpp: 241,047; ansic: 6,324; python: 915; xml: 400; yacc: 237; sh: 221; awk: 35; makefile: 11
file content (82 lines) | stat: -rw-r--r-- 2,630 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#include "BrownianMotionMqttClient.h"
#include <QMqttTopicName>
#include <memory>
#include <random>

BrownianMotionMqttClient::BrownianMotionMqttClient(QObject* parent, int interval, const QString& hostname, int port, int yPaths)
	: QMqttClient(parent)
	, m_pathes(yPaths)
	, m_interval(interval) {
	setHostname(hostname);
	setPort(port);

	m_x.fill(0.0, m_pathes);

	m_generator = std::make_unique<std::default_random_engine>(m_seed);
	m_distribution = std::make_unique<std::normal_distribution<double>>(0.0, (std::pow(m_delta, 2.0) * m_dt));
}

void BrownianMotionMqttClient::setInterval(int interval) {
	m_interval = interval;
}

QString BrownianMotionMqttClient::subscribeBrownianTopic() {
	if (state() == ClientState::Connected) {
		QMqttTopicFilter filterX{QLatin1String("brownian/x")};

		QMqttSubscription* subscription;
		subscription = subscribe(filterX, m_qos);
		if (!subscription) {
			return QLatin1String("Could not subscribe. Is there a valid connection?");
		}
		m_qos = subscription->qos();
		m_brownian_xTopic = std::make_unique<QMqttTopicName>(subscription->topic().filter());

		for (int i = 0; i < m_pathes; i++) {
			QMqttTopicFilter filterY{QLatin1String("brownian/y") + QString::number(i)};
			subscription = subscribe(filterY, m_qos);
			if (!subscription) {
				return QLatin1String("Could not subscribe. Is there a valid connection?");
			}
			m_brownian_yTopics.push_back(std::make_unique<QMqttTopicName>(subscription->topic().filter()));
		}
	} else {
		return QLatin1String("Not connected");
	}
	return QLatin1String();
}

QString BrownianMotionMqttClient::publishBrownianData() {
	if (state() == ClientState::Connected && m_brownian_yTopics.size() != 0) {
		QString s;
		QVector<QString> brownianY;
		brownianY.fill(QString(), m_pathes);

		if (m_iterCount < m_itersTotal - m_iters - 1) {
			for (int i = 0; i < m_iters; i++) {
				if (!s.isEmpty())
					s.append(QLatin1String("\n"));

				s.append(QString::number(m_iterCount * m_dt));
				for (int j = 0; j < m_pathes; j++) {
					if (!brownianY[j].isEmpty())
						brownianY[j].append(QLatin1String("\n"));
					m_x[j] = m_x[j] + m_distribution->operator()(*m_generator);
					brownianY[j].append(QString::number(m_x[j]));
				}
				m_iterCount++;
			}
		} else {
			// Restart again
			m_iterCount = 0;
		}

		if (publish(*m_brownian_xTopic, s.toUtf8(), m_qos, false) == -1)
			return QLatin1String("Could not publish message");
		for (int i = 0; i < m_pathes; i++) {
			if (publish(*m_brownian_yTopics.at(i), brownianY[i].toUtf8(), m_qos, false) == -1)
				return QLatin1String("Could not publish message");
		}
	}
	return QLatin1String();
}