* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
+ * notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
*-------------------------------------------------------------------------
*/
+#include <errno.h>
#include <fcntl.h>
#include <stdbool.h>
#include <stdio.h>
#include <hidapi/hidapi.h>
#include <sys/param.h>
+#include <tlog.h>
#include <trinket.h>
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 char tfile[MAXPATHLEN],
ofile[MAXPATHLEN];
usage(const char *errmsg) {
puts("trinketd - collecting info from AtomPro");
puts("Copyright (c) 2016, Teodor Sigaev <teodor@sigaev.ru>");
- puts("trinketd [-d] [-l logfile] [-p pidfile] [-P period] [-D datadir]");
+ puts("trinketd [-d] [-p pidfile] [-P period] [-D datadir] [-i tics] [-l logfile");
if (errmsg) {
puts("");
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 && stopRequest == false) {
+ while(42) {
+
+ 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 = coefficient * counts * 3600.0 / (double)period;
+ trinketClose();
+
+ if (collected > 0 && prevDose[collected - 1] > curDose)
+ {
+ tlog(TL_WARN, "Reconnect or full reset detected");
+ collected = 0;
+ }
+
+ 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;
}
}
if (successOpen) {
fprintf(fh, "total: %lld\n", (long long)curDose);
fprintf(fh, "counts: %lld\n", (long long)counts);
- fprintf(fh, "radlevel: %e\n", radlevel);
+ fprintf(fh, "tics: %d\n", collected - 1);
+ fprintf(fh, "radlevel: %.02f\n", radlevel);
}
if (fh && fh != stdout) {
}
}
- prevDose = curDose;
sleep(period);
}
-
- trinketClose();
}
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:p:P:h")) != EOF) {
+ while((i=getopt(argn,argv,"dD:i:l:p:P:h")) != EOF) {
switch(i) {
case 'd':
daemonize = true;
case 'D':
dbdir = strdup(optarg);
break;
+ case 'i':
+ tics = atoi(optarg);
+ break;
+ case 'l':
+ logfile = strdup(optarg);
+ break;
case 'p':
pidfile = strdup(optarg);
break;
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");
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);