1
0
Fork 0
mirror of https://git.rwth-aachen.de/acs/public/villas/node/ synced 2025-03-09 00:00:00 +01:00

added new villas::Tool class as common top-level entrypoint

This commit is contained in:
Steffen Vogel 2019-04-19 14:51:45 +02:00
parent bbe7c3af0b
commit 75cfec1990
3 changed files with 161 additions and 0 deletions

View file

@ -0,0 +1,71 @@
/** Common entry point for all villas command line tools.
*
* @file
* @author Steffen Vogel <stvogel@eonerc.rwth-aachen.de>
* @copyright 2014-2019, Institute for Automation of Complex Power Systems, EONERC
* @license GNU General Public License (version 3)
*
* VILLASnode
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*********************************************************************************/
#pragma once
#include <villas/log.hpp>
#include <villas/colors.hpp>
#include <villas/config.h>
#include <villas/exceptions.hpp>
#include <villas/utils.hpp>
namespace villas {
class Tool {
protected:
Logger logger;
int argc;
char **argv;
std::string name;
static Tool *current_tool;
static void staticHandler(int signal, siginfo_t *sinfo, void *ctx);
virtual void handler(int, siginfo_t *, void *)
{ }
static void printCopyright();
static void printVersion();
public:
Tool(int ac, char *av[], const std::string &name);
virtual int main()
{
return 0;
}
virtual void usage()
{ }
virtual void parse()
{ }
int run();
};
} // namespace villas

View file

@ -45,6 +45,7 @@ add_library(villas-common SHARED
terminal.cpp
version.cpp
common.cpp
tool.cpp
)
execute_process(

89
common/lib/tool.cpp Normal file
View file

@ -0,0 +1,89 @@
/** Common entry point for all villas command line tools.
*
* @author Steffen Vogel <stvogel@eonerc.rwth-aachen.de>
* @copyright 2014-2019, Institute for Automation of Complex Power Systems, EONERC
* @license GNU General Public License (version 3)
*
* VILLASnode
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*********************************************************************************/
#include <iostream>
#include <villas/tool.hpp>
using namespace villas;
void Tool::staticHandler(int signal, siginfo_t *sinfo, void *ctx)
{
if (current_tool)
current_tool->handler(signal, sinfo, ctx);
}
void Tool::printCopyright()
{
std::cout << PROJECT_NAME " " << CLR_BLU(PROJECT_BUILD_ID)
<< " (built on " CLR_MAG(__DATE__) " " CLR_MAG(__TIME__) ")" << std::endl
<< " Copyright 2014-2017, Institute for Automation of Complex Power Systems, EONERC" << std::endl
<< " Steffen Vogel <StVogel@eonerc.rwth-aachen.de>" << std::endl;
}
void Tool::printVersion()
{
std::cout << PROJECT_BUILD_ID << std::endl;
}
Tool::Tool(int ac, char *av[], const std::string &nme) :
argc(ac),
argv(av),
name(nme)
{
current_tool = this;
logger = logging.get(name);
}
int Tool::run()
{
try {
int ret;
logger->info("This is VILLASnode {} (built on {}, {})",
CLR_BLD(CLR_YEL(PROJECT_BUILD_ID)),
CLR_BLD(CLR_MAG(__DATE__)), CLR_BLD(CLR_MAG(__TIME__)));
ret = utils::signals_init(staticHandler);
if (ret)
throw RuntimeError("Failed to initialize signal subsystem");
/* Parse command line arguments */
parse();
/* Run tool */
ret = main();
logger->info(CLR_GRN("Goodbye!"));
return ret;
}
catch (std::runtime_error &e) {
logger->error("{}", e.what());
return -1;
}
}
Tool *Tool::current_tool = nullptr;