parent
d194d9e18d
commit
f3a82ab88b
6 changed files with 167 additions and 24 deletions
|
|
@ -3,31 +3,43 @@
|
|||
#include <random>
|
||||
#include <chrono>
|
||||
|
||||
/**
|
||||
* Startet alle Threads des Netzwerks
|
||||
* @param num_sensors Anzahl der Sensor-Threads
|
||||
* @param num_analysers Anzahl der Analyse-Threads
|
||||
*/
|
||||
template <size_t N>
|
||||
void SensorNetwork<N>::start(size_t num_sensors, size_t num_analysers) {
|
||||
running = true;
|
||||
|
||||
// Starte Sensor-Threads
|
||||
for(size_t i = 0; i < num_sensors; ++i) {
|
||||
sensors.emplace_back([this, i] {
|
||||
sensor_thread(i);
|
||||
});
|
||||
}
|
||||
|
||||
// Starte Analyse-Threads
|
||||
for(size_t i = 0; i < num_analysers; ++i) {
|
||||
analysers.emplace_back([this, i] {
|
||||
analyser_thread(i);
|
||||
});
|
||||
}
|
||||
|
||||
// Starte Controller-Thread
|
||||
controller = std::thread([this] {
|
||||
controller_thread();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Stoppt alle Threads und wartet auf Beendigung
|
||||
*/
|
||||
template <size_t N>
|
||||
void SensorNetwork<N>::stop() {
|
||||
running = false;
|
||||
|
||||
// Warte auf Thread-Ende
|
||||
for(auto& t : sensors) {
|
||||
if (t.joinable()) t.join();
|
||||
}
|
||||
|
|
@ -39,18 +51,29 @@ void SensorNetwork<N>::stop() {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Thread-Funktion für Sensoren (Producer)
|
||||
* @param id Eindeutige ID des Sensors
|
||||
*
|
||||
* Funktionsweise:
|
||||
* 1. Generiert zufällige Messwerte
|
||||
* 2. Wartet zufällige Zeit (Messintervall)
|
||||
* 3. Schreibt Daten in Ringpuffer
|
||||
*/
|
||||
template <size_t N>
|
||||
void SensorNetwork<N>::sensor_thread(int id) {
|
||||
std::random_device rd;
|
||||
std::mt19937 gen(rd());
|
||||
std::uniform_int_distribution<> data_gen(0, 100);
|
||||
std::uniform_int_distribution<> sleep_gen(100, 500);
|
||||
std::uniform_int_distribution<> data_gen(0, 100); // Messwerte 0-100
|
||||
std::uniform_int_distribution<> sleep_gen(100, 500); // Intervall 100-500ms
|
||||
|
||||
while(running) {
|
||||
// Simuliere Messintervall
|
||||
std::this_thread::sleep_for(
|
||||
std::chrono::milliseconds(sleep_gen(gen))
|
||||
);
|
||||
|
||||
// Generiere und schreibe Messwert
|
||||
int value = data_gen(gen);
|
||||
buffer.push(value);
|
||||
|
||||
|
|
@ -58,11 +81,22 @@ void SensorNetwork<N>::sensor_thread(int id) {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Thread-Funktion für Analyse-Module (Consumer)
|
||||
* @param id Eindeutige ID des Moduls
|
||||
*
|
||||
* Funktionsweise:
|
||||
* 1. Liest Daten aus Ringpuffer (blockierend)
|
||||
* 2. Liest aktuelles Analysemodell
|
||||
* 3. Verarbeitet Daten (hier nur Ausgabe)
|
||||
*/
|
||||
template <size_t N>
|
||||
void SensorNetwork<N>::analyser_thread(int id) {
|
||||
while(running) {
|
||||
// Blockierendes Lesen aus Puffer
|
||||
int data = buffer.pop();
|
||||
|
||||
// Lesender Zugriff auf Analysemodell
|
||||
int model_value = model.read();
|
||||
|
||||
std::cout << "Analyser " << id << " processed: " << data
|
||||
|
|
@ -70,18 +104,27 @@ void SensorNetwork<N>::analyser_thread(int id) {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Thread-Funktion für System-Controller (Writer)
|
||||
*
|
||||
* Funktionsweise:
|
||||
* 1. Wartet zufällige Zeit zwischen Updates
|
||||
* 2. Schreibt neuen Wert ins Analysemodell
|
||||
*/
|
||||
template <size_t N>
|
||||
void SensorNetwork<N>::controller_thread() {
|
||||
std::random_device rd;
|
||||
std::mt19937 gen(rd());
|
||||
std::uniform_int_distribution<> update_gen(0, 100);
|
||||
std::uniform_int_distribution<> sleep_gen(500, 2000);
|
||||
std::uniform_int_distribution<> update_gen(0, 100); // Modellwerte
|
||||
std::uniform_int_distribution<> sleep_gen(500, 2000); // Update-Intervall
|
||||
|
||||
while(running) {
|
||||
// Warte bis zum nächsten Update
|
||||
std::this_thread::sleep_for(
|
||||
std::chrono::milliseconds(sleep_gen(gen))
|
||||
);
|
||||
|
||||
// Aktualisiere Analysemodell
|
||||
int new_value = update_gen(gen);
|
||||
model.write(new_value);
|
||||
|
||||
|
|
@ -89,6 +132,7 @@ void SensorNetwork<N>::controller_thread() {
|
|||
}
|
||||
}
|
||||
|
||||
// Explizite Instanziierung für gängige Puffergrößen
|
||||
template class SensorNetwork<8>;
|
||||
template class SensorNetwork<16>;
|
||||
template class SensorNetwork<32>;
|
||||
template class SensorNetwork<32>;
|
||||
Loading…
Add table
Add a link
Reference in a new issue