use constants for argp options, documentation, allow up to 25 masters, nicer help, better variable names

This commit is contained in:
john30
2015-02-01 13:01:35 +01:00
parent b6ef8d747b
commit 5b373377a4
2 changed files with 73 additions and 57 deletions
+71 -55
View File
@@ -59,10 +59,10 @@ static struct options opt = {
2, // acquireRetries
2, // sendRetries
15000, // receiveTimeout
5, // numberMasters
5, // masterCount
false, // foreground
8888, // port
false, // localhost
false, // localOnly
"/var/log/ebusd.log", // logFile
false, // logRaw
false, // dump
@@ -81,45 +81,61 @@ const char *argp_program_bug_address = ""PACKAGE_BUGREPORT"";
/** the documentation of the program. */
static const char argpdoc[] =
PACKAGE " - a daemon for access to eBUS devices.";
"A daemon for access to eBUS devices.";
#define O_CHKCFG 1
#define O_POLINT 2
#define O_ANSWER 3
#define O_ACQTIM 4
#define O_ACQRET 5
#define O_SNDRET 6
#define O_RCVTIM 7
#define O_MASCNT 8
#define O_LOCAL 9
#define O_LOGARE 10
#define O_LOGLEV 11
#define O_LOGRAW 12
#define O_DMPFIL 13
#define O_DMPSIZ 14
/** the definition of the known program arguments. */
static const struct argp_option argpoptions[] = {
{NULL, 0, NULL, 0, "Device settings:", 1 },
{"device", 'd', "DEV", 0, "Use DEV as eBUS device (serial device or ip:port) [/dev/ttyUSB0]", 0 },
{"nodevicecheck", 'n', NULL, 0, "Skip serial eBUS device test", 0 },
{NULL, 0, NULL, 0, "Device options:", 1 },
{"device", 'd', "DEV", 0, "Use DEV as eBUS device (serial device or ip:port) [/dev/ttyUSB0]", 0 },
{"nodevicecheck", 'n', NULL, 0, "Skip serial eBUS device test", 0 },
{NULL, 0, NULL, 0, "Message configuration settings:", 2 },
{"configpath", 'c', "PATH", 0, "Read CSV config files from PATH [/etc/ebusd]", 0 },
{"checkconfig", 1, NULL, 0, "Only check CSV config files, then stop", 0 },
{"pollinterval", 2, "SEC", 0, "Poll for data every SEC seconds (0=disable) [5]", 0 },
{NULL, 0, NULL, 0, "Message configuration options:", 2 },
{"configpath", 'c', "PATH", 0, "Read CSV config files from PATH [/etc/ebusd]", 0 },
{"checkconfig", O_CHKCFG, NULL, 0, "Only check CSV config files, then stop", 0 },
{"pollinterval", O_POLINT, "SEC", 0, "Poll for data every SEC seconds (0=disable) [5]", 0 },
{NULL, 0, NULL, 0, "E-Bus settings:", 3 },
{"address", 'a', "ADDR", 0, "Use ADDR as own bus address [FF]", 0 },
{"answer", 3, NULL, 0, "Actively answer to requests from other masters", 0 },
{"acquiretimeout", 4, "USEC", 0, "Stop bus acquisition after USEC us [9400]", 0 },
{"acquireretries", 5, "COUNT", 0, "Retry bus acquisition COUNT times [2]", 0 },
{"sendretries", 6, "COUNT", 0, "Repeat failed sends COUNT times [2]", 0 },
{"receivetimeout", 7, "USEC", 0, "Expect a slave to answer within USEC us [15000]", 0 },
{"numbermasters", 8, "COUNT", 0, "Expect COUNT masters on the bus [5]", 0 },
{NULL, 0, NULL, 0, "eBUS options:", 3 },
{"address", 'a', "ADDR", 0, "Use ADDR as own bus address [FF]", 0 },
{"answer", O_ANSWER, NULL, 0, "Actively answer to requests from other masters", 0 },
{"acquiretimeout", O_ACQTIM, "USEC", 0, "Stop bus acquisition after USEC us [9400]", 0 },
{"acquireretries", O_ACQRET, "COUNT", 0, "Retry bus acquisition COUNT times [2]", 0 },
{"sendretries", O_SNDRET, "COUNT", 0, "Repeat failed sends COUNT times [2]", 0 },
{"receivetimeout", O_RCVTIM, "USEC", 0, "Expect a slave to answer within USEC us [15000]", 0 },
{"numbermasters", O_MASCNT, "COUNT", 0, "Expect COUNT masters on the bus [5]", 0 },
{NULL, 0, NULL, 0, "Daemon settings:", 4 },
{"foreground", 'f', NULL, 0, "Run in foreground", 0 },
{"port", 'p', "PORT", 0, "Listen for client connections on PORT [8888]", 0 },
{"localhost", 9, NULL, 0, "Listen on 127.0.0.1 interface only", 0 },
{NULL, 0, NULL, 0, "Daemon options:", 4 },
{"foreground", 'f', NULL, 0, "Run in foreground", 0 },
{"port", 'p', "PORT", 0, "Listen for client connections on PORT [8888]", 0 },
{"localhost", O_LOCAL, NULL, 0, "Listen on 127.0.0.1 interface only", 0 },
{NULL, 0, NULL, 0, "Log settings:", 5 },
{"logfile", 'l', "FILE", 0, "Write log to FILE (only for daemon) [/var/log/ebusd.log]", 0 },
{"logareas", 10, "AREAS", 0, "Only write log for matching AREAS: main,network,bus,update,all [all]", 0 },
{"loglevel", 11, "LEVEL", 0, "Only write log below or equal to LEVEL: error/notice/info/debug [notice]", 0 },
{"lograwdata", 12, NULL, 0, "Log each received/sent byte on the bus", 0 },
{NULL, 0, NULL, 0, "Log options:", 5 },
{"logfile", 'l', "FILE", 0, "Write log to FILE (only for daemon) [/var/log/ebusd.log]", 0 },
{"logareas", O_LOGARE, "AREAS", 0, "Only write log for matching AREAS: main,network,bus,update,all [all]", 0 },
{"loglevel", O_LOGLEV, "LEVEL", 0, "Only write log below or equal to LEVEL: error/notice/info/debug [notice]", 0 },
{"lograwdata", O_LOGRAW, NULL, 0, "Log each received/sent byte on the bus", 0 },
{NULL, 0, NULL, 0, "Dump settings:", 6 },
{"dump", 'D', NULL, 0, "Enable dump of received bytes", 0 },
{"dumpfile", 13, "FILE", 0, "Dump received bytes to FILE [/tmp/ebus_dump.bin]", 0 },
{"dumpsize", 14, "SIZE", 0, "Make dump files no larger than SIZE kB [100]", 0 },
{NULL, 0, NULL, 0, "Dump options:", 6 },
{"dump", 'D', NULL, 0, "Enable dump of received bytes", 0 },
{"dumpfile", O_DMPFIL, "FILE", 0, "Dump received bytes to FILE [/tmp/ebus_dump.bin]", 0 },
{"dumpsize", O_DMPSIZ, "SIZE", 0, "Make dump files no larger than SIZE kB [100]", 0 },
{NULL, 0, NULL, 0, NULL, 0 },
//{NULL, 0, NULL, 0, "Other:", 7 },
{NULL, 0, NULL, 0, NULL, 0 },
};
/**
@@ -134,7 +150,7 @@ error_t parse_opt(int key, char *arg, struct argp_state *state)
result_t result = RESULT_OK;
switch (key) {
// Device settings:
// Device options:
case 'd': // --device=/dev/ttyUSB0
if (arg == NULL || arg[0] == 0) {
argp_error(state, "invalid device");
@@ -146,7 +162,7 @@ error_t parse_opt(int key, char *arg, struct argp_state *state)
opt->noDeviceCheck = true;
break;
// Message configuration settings:
// Message configuration options:
case 'c': // --configpath=/etc/ebusd
if (arg == NULL || arg[0] == 0 || strcmp("/", arg) == 0) {
argp_error(state, "invalid configpath");
@@ -154,10 +170,10 @@ error_t parse_opt(int key, char *arg, struct argp_state *state)
}
opt->configPath = arg;
break;
case 1: // --checkconfig
case O_CHKCFG: // --checkconfig
opt->checkConfig = true;
break;
case 2: // --pollinterval=5
case O_POLINT: // --pollinterval=5
opt->pollInterval = parseInt(arg, 10, 0, 3600, result);
if (result != RESULT_OK) {
argp_error(state, "invalid pollinterval");
@@ -165,7 +181,7 @@ error_t parse_opt(int key, char *arg, struct argp_state *state)
}
break;
// E-Bus settings:
// eBUS options:
case 'a': // --address=FF
opt->address = parseInt(arg, 16, 0, 0xff, result);
if (result != RESULT_OK || !isMaster(opt->address)) {
@@ -173,46 +189,46 @@ error_t parse_opt(int key, char *arg, struct argp_state *state)
return EINVAL;
}
break;
case 3: // --answer
case O_ANSWER: // --answer
opt->answer = true;
break;
case 4: // --acquiretimeout=9400
case O_ACQTIM: // --acquiretimeout=9400
opt->acquireTimeout = parseInt(arg, 10, 1000, 100000, result);
if (result != RESULT_OK) {
argp_error(state, "invalid acquiretimeout");
return EINVAL;
}
break;
case 5: // --acquireretries=2
case O_ACQRET: // --acquireretries=2
opt->acquireRetries = parseInt(arg, 10, 0, 10, result);
if (result != RESULT_OK) {
argp_error(state, "invalid acquireretries");
return EINVAL;
}
break;
case 6: // --sendretries=2
case O_SNDRET: // --sendretries=2
opt->sendRetries = parseInt(arg, 10, 0, 10, result);
if (result != RESULT_OK) {
argp_error(state, "invalid sendretries");
return EINVAL;
}
break;
case 7: // --receivetimeout=15000
case O_RCVTIM: // --receivetimeout=15000
opt->receiveTimeout = parseInt(arg, 10, 1000, 100000, result);
if (result != RESULT_OK) {
argp_error(state, "invalid receivetimeout");
return EINVAL;
}
break;
case 8: // --numbermasters=5
opt->numberMasters = parseInt(arg, 10, 1, 10, result);
case O_MASCNT: // --numbermasters=5
opt->masterCount = parseInt(arg, 10, 1, 25, result);
if (result != RESULT_OK) {
argp_error(state, "invalid numbermasters");
return EINVAL;
}
break;
// Daemon settings:
// Daemon options:
case 'f': // --foreground
opt->foreground = true;
break;
@@ -223,11 +239,11 @@ error_t parse_opt(int key, char *arg, struct argp_state *state)
return EINVAL;
}
break;
case 9: // --localhost
opt->localhost = true;
case O_LOCAL: // --localhost
opt->localOnly = true;
break;
// Log settings:
// Log options:
case 'l': // --logfile=/var/log/ebusd.log
if (arg == NULL || arg[0] == 0 || strcmp("/", arg) == 0) {
argp_error(state, "invalid logfile");
@@ -235,34 +251,34 @@ error_t parse_opt(int key, char *arg, struct argp_state *state)
}
opt->logFile = arg;
break;
case 10: // --logareas=all
case O_LOGARE: // --logareas=all
if (!setLogFacilities(arg)) {
argp_error(state, "invalid logareas");
return EINVAL;
}
break;
case 11: // --loglevel=event
case O_LOGLEV: // --loglevel=event
if (!setLogLevel(arg)) {
argp_error(state, "invalid loglevel");
return EINVAL;
}
break;
case 12: // --lograwdata
case O_LOGRAW: // --lograwdata
opt->logRaw = true;
break;
// Dump settings:
// Dump options:
case 'D': // --dump
opt->dump = true;
break;
case 13: // --dumpfile=/tmp/ebus_dump.bin
case O_DMPFIL: // --dumpfile=/tmp/ebus_dump.bin
if (arg == NULL || arg[0] == 0 || strcmp("/", arg) == 0) {
argp_error(state, "invalid dumpfile");
return EINVAL;
}
opt->dumpFile = arg;
break;
case 14: // --dumpsize=100
case O_DMPSIZ: // --dumpsize=100
opt->dumpSize = parseInt(arg, 10, 1, 1000000, result);
if (result != RESULT_OK) {
argp_error(state, "invalid dumpsize");
@@ -474,10 +490,10 @@ result_t loadConfigFiles(DataFieldTemplates* templates, MessageMap* messages, bo
int main(int argc, char* argv[])
{
struct argp argp = { argpoptions, parse_opt, NULL, argpdoc, NULL, NULL, NULL };
setenv("ARGP_HELP_FMT", "no-dup-args-note", 0);
if (argp_parse(&argp, argc, argv, ARGP_IN_ORDER, NULL, &opt) != 0)
return EINVAL;
DataFieldTemplates templates;
MessageMap messages;
if (opt.checkConfig == true) {
+2 -2
View File
@@ -42,11 +42,11 @@ struct options
int acquireRetries; //!< number of retries for bus acquisition [2]
int sendRetries; //!< number of retries for failed sends [2]
int receiveTimeout; //!< timeout for receiving answer from slave in us [15000]
int numberMasters; //!< expected number of masters for arbitration [5]
int masterCount; //!< expected number of masters for arbitration [5]
bool foreground; //!< run in foreground
int port; //!< port to listen for client connections [8888]
bool localhost; //!< listen on 127.0.0.1 interface only
bool localOnly; //!< listen on 127.0.0.1 interface only
const char* logFile; //!< log file name [/var/log/ebusd.log]
bool logRaw; //!< log each received/sent byte on the bus