94 lines
2.2 KiB
C++
94 lines
2.2 KiB
C++
#include "sensor_network.h"
|
|
#include <iostream>
|
|
#include <random>
|
|
#include <chrono>
|
|
|
|
template <size_t N>
|
|
void SensorNetwork<N>::start(size_t num_sensors, size_t num_analysers) {
|
|
running = true;
|
|
|
|
for(size_t i = 0; i < num_sensors; ++i) {
|
|
sensors.emplace_back([this, i] {
|
|
sensor_thread(i);
|
|
});
|
|
}
|
|
|
|
for(size_t i = 0; i < num_analysers; ++i) {
|
|
analysers.emplace_back([this, i] {
|
|
analyser_thread(i);
|
|
});
|
|
}
|
|
|
|
controller = std::thread([this] {
|
|
controller_thread();
|
|
});
|
|
}
|
|
|
|
template <size_t N>
|
|
void SensorNetwork<N>::stop() {
|
|
running = false;
|
|
|
|
for(auto& t : sensors) {
|
|
if (t.joinable()) t.join();
|
|
}
|
|
for(auto& t : analysers) {
|
|
if (t.joinable()) t.join();
|
|
}
|
|
if (controller.joinable()) {
|
|
controller.join();
|
|
}
|
|
}
|
|
|
|
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);
|
|
|
|
while(running) {
|
|
std::this_thread::sleep_for(
|
|
std::chrono::milliseconds(sleep_gen(gen))
|
|
);
|
|
|
|
int value = data_gen(gen);
|
|
buffer.push(value);
|
|
|
|
std::cout << "Sensor " << id << " produced: " << value << "\n";
|
|
}
|
|
}
|
|
|
|
template <size_t N>
|
|
void SensorNetwork<N>::analyser_thread(int id) {
|
|
while(running) {
|
|
int data = buffer.pop();
|
|
|
|
int model_value = model.read();
|
|
|
|
std::cout << "Analyser " << id << " processed: " << data
|
|
<< " | Model: " << model_value << "\n";
|
|
}
|
|
}
|
|
|
|
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);
|
|
|
|
while(running) {
|
|
std::this_thread::sleep_for(
|
|
std::chrono::milliseconds(sleep_gen(gen))
|
|
);
|
|
|
|
int new_value = update_gen(gen);
|
|
model.write(new_value);
|
|
|
|
std::cout << "Controller updated model to: " << new_value << "\n";
|
|
}
|
|
}
|
|
|
|
template class SensorNetwork<8>;
|
|
template class SensorNetwork<16>;
|
|
template class SensorNetwork<32>;
|