#include "sensor_network.h" #include #include #include template void SensorNetwork::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 void SensorNetwork::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 void SensorNetwork::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 void SensorNetwork::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 void SensorNetwork::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>;