BS_Praktikum4/sensor_network.cpp

80 lines
2.2 KiB
C++
Raw Permalink Normal View History

2025-06-03 00:50:08 +02:00
#include "sensor_network.h"
#include <iostream>
#include <random>
#include <chrono>
2025-06-03 01:40:44 +02:00
/**
* Startet das Sensornetzwerk
* @param sensors Anzahl der Sensor-Threads
* @param analysers Anzahl der Analyse-Threads
*/
2025-06-03 00:50:08 +02:00
template <size_t N>
2025-06-03 01:25:44 +02:00
void SensorNetwork<N>::start(size_t sensors, size_t analysers) {
2025-06-03 00:50:08 +02:00
running = true;
2025-06-03 01:25:44 +02:00
2025-06-03 01:40:44 +02:00
// Sensor-Threads erstellen
2025-06-03 01:25:44 +02:00
for (size_t i = 0; i < sensors; ++i) {
threads.emplace_back([this] {
std::mt19937 gen(std::random_device{}());
std::uniform_int_distribution<> dist(0, 100);
2025-06-03 01:40:44 +02:00
2025-06-03 01:25:44 +02:00
while (running) {
2025-06-03 01:40:44 +02:00
// Zufälliges Intervall (100-500ms)
std::this_thread::sleep_for(
std::chrono::milliseconds(100 + gen() % 400));
// Messwert generieren und speichern
2025-06-03 01:25:44 +02:00
buffer.push(dist(gen));
}
2025-06-03 00:50:08 +02:00
});
}
2025-06-03 01:40:44 +02:00
// Analyse-Threads erstellen
2025-06-03 01:25:44 +02:00
for (size_t i = 0; i < analysers; ++i) {
threads.emplace_back([this] {
while (running) {
2025-06-03 01:40:44 +02:00
// Daten aus Puffer lesen
2025-06-03 01:25:44 +02:00
int data = buffer.pop();
2025-06-03 01:40:44 +02:00
// Analysemodell lesen
2025-06-03 01:25:44 +02:00
int model_val = model.read();
2025-06-03 01:40:44 +02:00
// Ausgabe (könnte auch analysieren)
std::cout << "Data: " << data
<< " Model: " << model_val << "\n";
2025-06-03 01:25:44 +02:00
}
2025-06-03 00:50:08 +02:00
});
}
2025-06-03 01:40:44 +02:00
// Controller-Thread erstellen
2025-06-03 01:25:44 +02:00
threads.emplace_back([this] {
std::mt19937 gen(std::random_device{}());
while (running) {
2025-06-03 01:40:44 +02:00
// Zufälliges Update-Intervall (500-2000ms)
std::this_thread::sleep_for(
std::chrono::milliseconds(500 + gen() % 1500));
// Analysemodell aktualisieren
2025-06-03 01:25:44 +02:00
model.write(gen() % 100);
}
2025-06-03 00:50:08 +02:00
});
}
2025-06-03 01:40:44 +02:00
/**
* Stoppt das Sensornetzwerk und wartet auf Threads
*/
2025-06-03 00:50:08 +02:00
template <size_t N>
void SensorNetwork<N>::stop() {
2025-06-03 01:40:44 +02:00
running = false; // Signal zum Stoppen
// Auf alle Threads warten
2025-06-03 01:25:44 +02:00
for (auto& t : threads) {
2025-06-03 00:50:08 +02:00
if (t.joinable()) t.join();
}
}
2025-06-03 01:40:44 +02:00
// Explizite Instanziierungen für gängige Puffergrößen
2025-06-03 00:50:08 +02:00
template class SensorNetwork<8>;
template class SensorNetwork<16>;
2025-06-03 01:25:44 +02:00
template class SensorNetwork<32>;