telemetry/demo/device.cpp
2025-09-24 19:52:20 +00:00

64 lines
1.8 KiB
C++

#include <cstdlib>
#include <iostream>
#include <thread>
#include <csignal>
#include "device.hpp"
volatile std::sig_atomic_t gSignum;
void signal_callback_handler(int signum) {
gSignum = signum;
}
namespace djm::device {
Device::Device(std::unique_ptr<AnalyticsSource> analyticsSource_,
std::unique_ptr<TemperatureSource> temperatureSource_)
: analyticsSource(std::move(analyticsSource_)),
temperatureSource(std::move(temperatureSource_)) {}
int Device::run(telemetry::Sink::Writer&& writer)
{
using std::literals::chrono_literals::operator""ms;
static bool signal_callback_handler_installed = false;
if (!signal_callback_handler_installed) {
std::signal(SIGTERM, signal_callback_handler); // systemd shutdown request
std::signal(SIGINT, signal_callback_handler); // ctrl-c
}
while (!gSignum) {
auto start = std::chrono::system_clock::now();
auto tempReading = temperatureSource->read(100ms);
if (tempReading) {
std::cout << "read temperatures: " << tempReading->fmtDebug()
<< std::endl;
writer.capture(tempReading.value());
} else {
std::cout << "failed to read temperature sensors" << std::endl;
}
auto analyticsEvent = analyticsSource->await(250ms);
if (analyticsEvent) {
std::cout << "got analytics event: " << analyticsEvent->fmtDebug()
<< std::endl;
writer.capture(analyticsEvent.value());
} else {
std::cout << "no analytics event available" << std::endl;
}
auto delta = std::chrono::system_clock::now() - start;
std::this_thread::sleep_for(1000ms - delta);
}
std::string shutdown_reason("gracefull shutdown");
std::cout <<std::endl <<"[device] shutdown_reason: " <<shutdown_reason <<std::endl;
writer.capture(shutdown_reason);
return EXIT_SUCCESS;
}
} // namespace djm::device