diff --git a/src/PRadETChannel.cxx b/src/PRadETChannel.cxx index 3f4d13c78fbed0d94f9b367e87df35a81830e411..da3dc28ee21b8c02700a31f52eab5b3d33f4d957 100644 --- a/src/PRadETChannel.cxx +++ b/src/PRadETChannel.cxx @@ -36,8 +36,7 @@ PRadETChannel::~PRadETChannel() // Close ET connection void PRadETChannel::ForceClose() { - if(et_id != nullptr && et_alive(et_id)) - { + if((et_id != nullptr) && et_alive(et_id)) { et_forcedclose(et_id); et_id = nullptr; } diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt index cc473be08586a99e62b12d1bb473504c386f8dec..74815add0127f8aad04c09b75a6d80c36669208c 100644 --- a/tools/CMakeLists.txt +++ b/tools/CMakeLists.txt @@ -20,6 +20,7 @@ foreach(exe_src ${APP_SOURCES}) target_link_libraries(${exe} PUBLIC + ${PROJECT_NAME}::HallC Podd::Podd Podd::Decode coda_et::coda_et diff --git a/tools/et_feeder.cpp b/tools/et_feeder.cpp index 5cfc6db2123482b29a4412f22c939b8ac9648038..ce11688f588254cce9a9e3af51bb0ba9c73b0b61 100644 --- a/tools/et_feeder.cpp +++ b/tools/et_feeder.cpp @@ -2,8 +2,21 @@ #include "PRadETChannel.h" #include "et.h" #include "evio.h" +#include <csignal> +#include <thread> +#include <chrono> +#include <iostream> -#define PROGRESS_COUNT 1000 + +using namespace std::chrono; + + +volatile std::sig_atomic_t gSignalStatus; + + +void signal_handler(int signal) { + gSignalStatus = signal; +} int main(int argc, char* argv[]) @@ -14,15 +27,15 @@ int main(int argc, char* argv[]) conf_opt.AddOpt(ConfigOption::arg_require, 'h'); conf_opt.AddOpt(ConfigOption::arg_require, 'p'); conf_opt.AddOpt(ConfigOption::arg_require, 'f'); - conf_opt.AddOpt(ConfigOption::arg_require, 'r'); + conf_opt.AddOpt(ConfigOption::arg_require, 'i'); conf_opt.SetDesc("usage: %0 <data_file>"); conf_opt.SetDesc('h', "host address of the ET system, default \"localhost\"."); conf_opt.SetDesc('p', "port to connect, default 11111."); conf_opt.SetDesc('f', "memory mapped et file, default \"/tmp/et_feeder\"."); - conf_opt.SetDesc('r', "rate in mili-seconds to write data, default \"10\""); + conf_opt.SetDesc('i', "interval in milliseconds to write data, default \"10\""); - if (!conf_opt.ParseArgs(argc, argv) || conf_opt.NbofArgs() != 2) { + if (!conf_opt.ParseArgs(argc, argv) || conf_opt.NbofArgs() != 1) { std::cout << conf_opt.GetInstruction() << std::endl; return -1; } @@ -30,7 +43,7 @@ int main(int argc, char* argv[]) std::string host = "localhost"; int port = 11111; std::string etf = "/tmp/et_feeder"; - float rate = 10.; + int interval = 10; for (auto &opt : conf_opt.GetOptions()) { switch (opt.mark) { @@ -43,13 +56,39 @@ int main(int argc, char* argv[]) case 'f': etf = opt.var.String(); break; - case 'r': - rate = opt.var.Float(); + case 'i': + interval = opt.var.Int(); break; default : std::cout << conf_opt.GetInstruction() << std::endl; return -1; } } + + auto ch = new PRadETChannel(); + try { + ch->Open(host.c_str(), port, etf.c_str()); + ch->NewStation("Data Feeder"); + ch->AttachStation(); + } catch (PRadException e) { + std::cerr << e.FailureType() << ": " << e.FailureDesc() << std::endl; + return -1; + } + + // install signal handler + std::signal(SIGINT, signal_handler); + while (true) { + if (gSignalStatus == SIGINT) { + std::cout << "Received control-C, exiting..." << std::endl; + ch->ForceClose(); + break; + } + system_clock::time_point start(system_clock::now()); + system_clock::time_point next(start + std::chrono::milliseconds(interval)); + + std::this_thread::sleep_until(next); + } + + return 0; } diff --git a/tools/et_producer.cpp b/tools/et_producer.cpp index 57bbfed82800eb2d3d036435426f355d4f3fda8a..6d095f41d50d4e22ceddcc0d471db1dc98d92a3e 100644 --- a/tools/et_producer.cpp +++ b/tools/et_producer.cpp @@ -614,10 +614,10 @@ static void * signal_thread (void *arg) { sigset_t signal_set; int sig_number; - + sigemptyset(&signal_set); sigaddset(&signal_set, SIGINT); - + /* Not necessary to clean up as ET system will do it */ sigwait(&signal_set, &sig_number); printf("Got control-C, exiting\n");