X-Git-Url: http://sigaev.ru/git/gitweb.cgi?a=blobdiff_plain;f=main.c;h=6bbd6cf89f2c93bc820b8b46cf92cd80ecb2b292;hb=2792e00e87c89cc11d9214733d6d52b127d15a07;hp=0fb4f1a1294917b8e41f60600661d3b43bbaeb3a;hpb=c0745f03eaa1918dd7ff97093618c8708932e2bd;p=trinked.git diff --git a/main.c b/main.c index 0fb4f1a..6bbd6cf 100644 --- a/main.c +++ b/main.c @@ -26,6 +26,7 @@ *------------------------------------------------------------------------- */ +#include #include #include #include @@ -35,14 +36,14 @@ #include #include +#include #include static char* dbdir = NULL; -static int period = (300); /* in seconds */ +static int period = 300; /* in seconds */ +static int tics = 1; static char* pidfile = NULL; -static char* logfile = NULL; static bool daemonize = false; -static bool workaround = false; static char tfile[MAXPATHLEN], ofile[MAXPATHLEN]; @@ -52,7 +53,7 @@ static void usage(const char *errmsg) { puts("trinketd - collecting info from AtomPro"); puts("Copyright (c) 2016, Teodor Sigaev "); - puts("trinketd [-d] [-l logfile] [-p pidfile] [-P period] [-D datadir] [-w]"); + puts("trinketd [-d] [-p pidfile] [-P period] [-D datadir] [-i tics]"); if (errmsg) { puts(""); @@ -64,38 +65,52 @@ usage(const char *errmsg) { static void main_loop() { - double prevDose, + double *prevDose, curDose; + int i; + int collected = 0; -restart: - prevDose = -1; - - if (trinketOpen() != ERR_OK) { - fprintf(stderr, "trinketOpen fails\n"); - sleep(1); - goto restart; + prevDose = malloc(sizeof(*prevDose) * (tics + 1)); + if (!prevDose) { + tlog(TL_CRIT, "could not allocate array, exiting..."); + return; } while(42) { - if (workaround) - trinketPing(); + + if (trinketOpen() != ERR_OK) { + tlog(TL_ALARM, "trinketOpen fails"); + sleep(1); + continue; + } if (trinketGetCumDose(&curDose) != ERR_OK) { - fprintf(stderr, "trinketGetCumDose fails\n"); + tlog(TL_ALARM, "trinketGetCumDose fails"); trinketClose(); sleep(1); - goto restart; + continue; } - if (prevDose >= 0.0) { - double counts = curDose - prevDose; - double radlevel = 1e6 * coefficient * counts * 3600.0 / (double)period; + trinketClose(); + + if (collected <= tics) { + prevDose[collected++] = curDose; + } else { + for (i=1; i<=tics; i++) + prevDose[i - 1] = prevDose[i]; + prevDose[tics] = curDose; + } + + if (collected > 1) { + double counts = curDose - prevDose[0]; + double radlevel = 1e6 * coefficient * counts * 3600.0 / + (double)(period * (collected - 1)); FILE *fh = stdout; bool successOpen = true; if (daemonize) { if ((fh = fopen(tfile, "w")) == NULL) { - fprintf(stderr, "fopen fails\n"); + tlog(TL_ALARM, "fopen fails: %s", strerror(errno)); successOpen = false; } } @@ -103,6 +118,7 @@ restart: if (successOpen) { fprintf(fh, "total: %lld\n", (long long)curDose); fprintf(fh, "counts: %lld\n", (long long)counts); + fprintf(fh, "tics: %d\n", collected - 1); fprintf(fh, "radlevel: %.02f\n", radlevel); } @@ -113,11 +129,8 @@ restart: } } - prevDose = curDose; sleep(period); } - - trinketClose(); } @@ -126,12 +139,12 @@ extern int opterr, optind; int main(int argn, char* argv[]) { - int i; - int pidfd, - logfd; + int i; + int pidfd; + char *logfile = NULL; opterr = 0; - while((i=getopt(argn,argv,"dD:l:p:P:wh")) != EOF) { + while((i=getopt(argn,argv,"dD:i:l:p:P:h")) != EOF) { switch(i) { case 'd': daemonize = true; @@ -139,6 +152,9 @@ main(int argn, char* argv[]) { case 'D': dbdir = strdup(optarg); break; + case 'i': + tics = atoi(optarg); + break; case 'l': logfile = strdup(optarg); break; @@ -148,9 +164,6 @@ main(int argn, char* argv[]) { case 'P': period = atoi(optarg); break; - case 'w': - workaround = true; - break; case 'h': default: usage(NULL); @@ -163,6 +176,9 @@ main(int argn, char* argv[]) { if (period <= 0) usage("Collecting period could not be zero nor negative"); + if (tics <= 0) + usage("Number of tics could not be zero nor negative"); + if (daemonize && !dbdir) usage("trinketd: it is useless to use -d without -D"); @@ -175,35 +191,31 @@ main(int argn, char* argv[]) { usage("could not write pidfile"); } - if (logfile) { - logfd = open(logfile, O_CREAT | O_WRONLY | O_APPEND, 0666); - if (logfd < 0) - usage("could not write logfile"); - } - if (daemonize) { + opentlog((logfile == NULL) ? TL_OPEN_SYSLOG : TL_OPEN_FILE, + TL_INFO, logfile); + if (daemon(0, 0) == -1) - usage("could not daemonize"); + tlog(TL_CRIT | TL_EXIT, "could not daemonize"); + } else { + opentlog(TL_OPEN_STDERR | TL_OPEN_FILE, TL_INFO, logfile); } + + if (pidfile) { char pid[64]; snprintf(pid, sizeof(pid), "%lld", (long long)getpid()); if (write(pidfd, pid, strlen(pid)) != strlen(pid)) - usage("could not write pid"); + tlog(TL_CRIT | TL_EXIT, "could not write pid"); close(pidfd); } - if (logfile) { - dup2(logfd, fileno(stderr)); - close(logfd); - } + tlog(TL_CRIT, "trinketd started, pid: %lld", (long long)getpid()); - if (hid_init() < 0) { - fprintf(stderr, "hid_init fails\n"); - exit(1); - } + if (hid_init() < 0) + tlog(TL_CRIT | TL_EXIT, "hid_init fails"); if (dbdir) { snprintf(tfile, MAXPATHLEN, "%s/trinket.tmp", dbdir);