#include "MainControlLoop.h"
#include <chrono>
#include <csignal>
#include <cstdlib>
#include <thread>
using namespace mcx;
void run(cmd_line::Config config) {
nng_log_set_logger(nng_stderr_logger);
nng_log_set_level(nng_log_level::NNG_LOG_DEBUG);
parameter_server::Parameter paramServer;
paramServer.create("root", nullptr);
mcx::log::Module logger(config.path("Log"));
logger.create("logger", ¶mServer);
mcx::container::Task loggerTask("Logger_task", ¶mServer);
loggerTask.add(&logger);
loggerTask.configure();
log_info("System configuration:\n{}", config.toString());
user_parameters::Module userParameters(config.path("UserParameters"));
userParameters.create("UserParameters", ¶mServer);
watchdog::Module watchdog(config.mode(), watchdog::WatchdogType::EXTERNAL, "/dev/null");
watchdog.create("Watchdog", ¶mServer);
MainControlLoop mainControlLoop;
mainControlLoop.create("Control", ¶mServer);
container::Task controlsTask("Control_task", ¶mServer);
controlsTask.add({&mainControlLoop, &watchdog, &userParameters});
controlsTask.configure();
fbus::Manager fbusManager;
auto fbusModule = fbusManager.create(config.mode(), ¶mServer, config.path("Fieldbus"));
container::Task fbusTask("Fieldbus_task", ¶mServer);
fbusTask.add(fbusModule);
fbusTask.configure();
comm::RequestReply reqrep;
auto connectionData = config.server("Default");
connectionData.number_of_threads = 8;
comm::Publisher publisher(reqrep, connectionData);
publisher.create("ParamPub", ¶mServer);
container::Task commTask("Comm_task", ¶mServer);
commTask.add(&publisher);
commTask.configure();
reqrep.configure(¶mServer, cmd_line::path(config.path("Control")));
parameter_server::load(config.path("Control"), ¶mServer);
parameter_server::link(config.path("Link"), ¶mServer, config.mode());
loggerTask.start(config.task("Logger_task"));
commTask.start(config.task("Comm_task"));
controlsTask.start(config.task("Control_task"));
fbusTask.start(config.task("Fieldbus_task"));
bool isConnected = reqrep.start(connectionData);
log_assert(isConnected, "Failed to start Req/Rep server");
const char* lifetime_env = std::getenv("MCX_TEST_SERVER_LIFETIME_SEC");
if (lifetime_env != nullptr) {
int secs = std::atoi(lifetime_env);
if (secs > 0) {
std::thread([secs]() {
std::this_thread::sleep_for(std::chrono::seconds(secs));
std::raise(SIGTERM);
}).detach();
}
}
while (utils::running()) {
reqrep.iterate();
}
reqrep.stop();
commTask.stop();
controlsTask.stop();
fbusTask.stop();
loggerTask.stop();
paramServer.destroy();
}
int main(int argc, char** argv) {
auto config = mcx::cmd_line::parse(argc, argv,
{
});
utils::configureLogger(config.logLevel());
utils::startRealTime(config.realtime());
run(config);
utils::stopRealTime(config.realtime());
return 0;
}