From d4790deef78ab124caa9a32ab12743941c765fdf Mon Sep 17 00:00:00 2001 From: Teodor Sigaev Date: Sun, 3 Apr 2016 18:46:07 +0300 Subject: [PATCH 1/1] first --- Makefile | 30 ++++++ geyger.pdf | Bin 0 -> 85948 bytes main.c | 222 ++++++++++++++++++++++++++++++++++++++++++ trinket.c | 277 +++++++++++++++++++++++++++++++++++++++++++++++++++++ trinket.h | 43 +++++++++ 5 files changed, 572 insertions(+) create mode 100644 Makefile create mode 100644 geyger.pdf create mode 100644 main.c create mode 100644 trinket.c create mode 100644 trinket.h diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..b56a75c --- /dev/null +++ b/Makefile @@ -0,0 +1,30 @@ +CC=cc +INCLUDE=-I/usr/local/include -I. +LIB=-L/usr/local/lib -lhidapi +ifndef OS +OS=$(shell uname) +endif + +CFLAGS=-Wall -pedantic -std=c99 -O2 -g -DASSERT_CORE +ifeq ($(OS), FreeBSD) +endif + +ifeq ($(OS), Linux) +CFLAGS+= -D_GNU_SOURCE -D_LARGE_FILES -D_FILE_OFFSET_BITS=64 +endif + +OBJ=trinket.o main.o + +.SUFFIXES: .o.c + +.c.o: + $(CC) $(CFLAGS) $(INCLUDE) -c $< + +all: trinketd + +trinketd: $(OBJ) + $(CC) -o $@ $(OBJ) $(LIB) + +clean: + rm -rf *core *.o trinketd + diff --git a/geyger.pdf b/geyger.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a858d35dd37374715efb975f039a3b4bfb8a9093 GIT binary patch literal 85948 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 + * + * Redistribution and use in source and binary forms, with or without + * 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. + * 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. + * + * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + *------------------------------------------------------------------------- + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +static char* dbdir = NULL; +static int period = (150); +static char* pidfile = NULL; +static char* logfile = NULL; +static bool daemonize = false; +static char tfile[MAXPATHLEN], + ofile[MAXPATHLEN]; + +static const double coefficient = 1.0; + +static bool stopRequest = false; + +static void +sig_int(int sig) { + stopRequest = true; +} + +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]"); + + if (errmsg) { + puts(""); + puts(errmsg); + } + + exit(1); +} + +static void +main_loop() { + double prevDose, + curDose; + +restart: + prevDose = -1; + + if (trinketOpen() != ERR_OK) { + fprintf(stderr, "trinketOpen fails\n"); + sleep(1); + goto restart; + } + + while(42 && stopRequest == false) { + if (trinketGetCumDose(&curDose) != ERR_OK) { + fprintf(stderr, "trinketGetCumDose fails\n"); + trinketClose(); + sleep(1); + goto restart; + } + + if (prevDose >= 0.0) { + double counts = curDose - prevDose; + double radlevel = coefficient * counts / (double)period; + FILE *fh = stdout; + bool successOpen = true; + + if (daemonize) { + if ((fh = fopen(tfile, "w")) == NULL) { + fprintf(stderr, "fopen fails\n"); + successOpen = false; + } + } + + if (successOpen) { + fprintf(fh, "counts: %lld\n", (long long)counts); + fprintf(fh, "radlevel: %e\n", radlevel); + } + + if (fh != stdout) { + fflush(fh); + fclose(fh); + rename(tfile, ofile); + } + } + + prevDose = curDose; + sleep(period); + } + + trinketClose(); +} + + +extern char *optarg; +extern int opterr, optind; + +int +main(int argn, char* argv[]) { + int i; + int pidfd, + logfd; + struct sigaction sa; + + opterr = 0; + while((i=getopt(argn,argv,"dD:p:P:h")) != EOF) { + switch(i) { + case 'd': + daemonize = true; + break; + case 'D': + dbdir = strdup(optarg); + break; + case 'p': + pidfile = strdup(optarg); + break; + case 'P': + period = atoi(optarg); + break; + case 'h': + default: + usage(NULL); + } + } + + if (opterr || optind != argn) + usage("argument err"); + + if (period <= 0) + usage("Collecting period could not be zero nor negative"); + + if (daemonize && !dbdir) + usage("trinketd: it is useless to use -d without -D"); + + if (dbdir && strlen(dbdir) > MAXPATHLEN - 32) + usage("datadir is too long"); + + if (pidfile) { + pidfd = open(pidfile, O_CREAT | O_WRONLY | O_TRUNC, 0666); + if (pidfd < 0) + 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) { + if (daemon(0, 0) == -1) + usage("could not daemonize"); + } + + 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"); + close(pidfd); + } + + if (logfile) { + dup2(logfd, fileno(stderr)); + close(logfd); + } + + if (hid_init() < 0) { + fprintf(stderr, "hid_init fails\n"); + exit(1); + } + + if (dbdir) { + snprintf(tfile, MAXPATHLEN, "%s/trinket.tmp", dbdir); + snprintf(ofile, MAXPATHLEN, "%s/trinket.dat", dbdir); + } + + memset(&sa, 0, sizeof(sa)); + sigemptyset(&sa.sa_mask); + sa.sa_handler = sig_int; + sigaction(SIGINT, &sa, 0); + sigaction(SIGTERM, &sa, 0); + sigaction(SIGHUP, &sa, 0); + + main_loop(); + + hid_exit(); + return 0; +} diff --git a/trinket.c b/trinket.c new file mode 100644 index 0000000..6ff5e4d --- /dev/null +++ b/trinket.c @@ -0,0 +1,277 @@ +/*------------------------------------------------------------------------- + * trinket.c + * + * Copyright (c) 2016, Teodor Sigaev + * + * Redistribution and use in source and binary forms, with or without + * 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. + * 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. + * + * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + *------------------------------------------------------------------------- + */ + +#include +#include +#include +#include +#include + +#define packed_struct __attribute__((packed)) + +typedef enum { + CMD_PING = 0, + CMD_VCC_VALUE = 1, + CMD_VCC_ALARM = 2, + CMD_CLICK_DELAY = 3, + CMD_ALARM_LEVELS = 4, + CMD_RTC = 5, + CMD_DAY_ARCH = 6, + CMD_YEAR_ARCH = 7, + CMD_CUM_DOSE = 8, + CMD_INVOKE_BSL = 9 +} TrinketCommand; + +#define BEGIN_COMMAND (0x1B) +#define END_COMMAND (0x17) +#define ACK_ANSWER_OK (0x06) +#define ACK_ANSWER_ERR (0x15) +#define END_ANSWER (0x17) + +/* http://uglyduck.ath.cx/PDF/TexasInstruments/MSP430/usblib430/Programmers_Guide_MSP430_USB_API.pdf */ +#define REPORT_ID (0x3f) +typedef struct packed_struct { + uint8_t reportId; + uint8_t size; +} ProtoHeader; + + +#define DEV_TIMEOUT (5000 /* milliseconds */) +typedef struct { + /* + * Command desc + */ + uint8_t cmdId; + uint8_t cmdLen; /* 0 means variable, > 0 fixed */ + + /* + * Answer desc + */ + uint32_t respLen; /* 0 means variable, > 0 fixed */ +} TrinketProtoDesc; + +static const TrinketProtoDesc protoDesc[] = { + {CMD_PING, 4, 5 }, + {CMD_VCC_VALUE, 4, 8 }, + {CMD_VCC_ALARM, 8, 8 }, + {CMD_CLICK_DELAY, 8, 8 }, + {CMD_ALARM_LEVELS, 24, 24 }, + {CMD_RTC, 13, 13 }, + {CMD_DAY_ARCH, 4, 4 + 1440 * 2 }, + {CMD_YEAR_ARCH, 4, 4 + 5840 * 2 }, + {CMD_CUM_DOSE, 4, 12 }, + {CMD_INVOKE_BSL, 4, 0 } +}; + +static hid_device *trinketDev = NULL; + +#if 0 +static void +dumpBuf(char *msg, uint8_t *buf, int len) { + int i; + + fprintf(stderr,"%s:", msg); + for (i=0; icmdLen}, + BEGIN_COMMAND, + proto->cmdLen, + proto->cmdId, + END_COMMAND + }; + struct packed_struct { + ProtoHeader header; + uint8_t begin; + uint16_t len; + uint8_t payload /* = 0 */; + uint8_t end; + } resp; + int r; + + assert(proto->cmdId == CMD_PING); + assert(sizeof(cmd) == cmd.len + sizeof(ProtoHeader)); + assert(sizeof(resp) == proto->respLen + sizeof(ProtoHeader)); + + r = hid_write(trinketDev, (unsigned char*)&cmd, sizeof(cmd)); + + if (r < 0 || r != sizeof(cmd)) { + fprintf(stderr, "hid_write returns %d instead of %u\n", r, cmd.len); + return ERR_ERROR; + } + + /* must be assigned to 0x3F by the host */ + resp.header.reportId = REPORT_ID; + + r = hid_read_timeout(trinketDev, (unsigned char*)&resp, sizeof(resp), DEV_TIMEOUT); + if (r < 0) { + fprintf(stderr, "hid_read_timeout fails\n"); + return ERR_NO_ANSWER; + } + + if (r != sizeof(resp)) { + fprintf(stderr, "hid_read_timeout returns %d instead of %u\n", r, sizeof(resp)); + return ERR_ERROR; + } + + if (resp.header.reportId != REPORT_ID) { + fprintf(stderr, "hid_read_timeout returns report id %02x instead of %02x\n", resp.header.reportId, REPORT_ID); + return ERR_ERROR; + } + + if (resp.header.size != proto->respLen) { + fprintf(stderr, "hid_read_timeout returns length %u intsead if %u\n", resp.header.size, proto->respLen); + return ERR_PROTO; + } + + if (resp.len != proto->respLen) { + fprintf(stderr, "hid_read_timeout response length %u instead of %u\n", resp.len, proto->respLen); + return ERR_PROTO; + } + + if (!(resp.begin == ACK_ANSWER_OK && resp.payload == 0 && resp.end == END_ANSWER)) { + fprintf(stderr, "hid_read_timeout ACK %02x with payload %u and ETB %02x\n", resp.begin, resp.payload, resp.end); + return ERR_PROTO; + } + + return ERR_OK; +} + +TrinketErrorCode +trinketGetCumDose(double *value) { + const TrinketProtoDesc *proto = &protoDesc[CMD_CUM_DOSE]; + struct { + ProtoHeader header; + uint8_t begin; + uint8_t len; + uint8_t cmd; + uint8_t end; + } cmd = { + {REPORT_ID, proto->cmdLen}, + BEGIN_COMMAND, + proto->cmdLen, + proto->cmdId, + END_COMMAND + }; + struct packed_struct { + ProtoHeader header; + uint8_t begin; + uint16_t len; + double payload; + uint8_t end; + } resp; + int r; + + assert(proto->cmdId == CMD_CUM_DOSE); + assert(sizeof(cmd) == cmd.len + sizeof(ProtoHeader)); + assert(sizeof(resp) == proto->respLen + sizeof(ProtoHeader)); + + r = hid_write(trinketDev, (unsigned char*)&cmd, sizeof(cmd)); + + if (r < 0 || r != sizeof(cmd)) { + fprintf(stderr, "hid_send_feature_report returns %d instead of %u\n", r, cmd.len); + return ERR_ERROR; + } + + /* must be assigned to 0x3F by the host */ + resp.header.reportId = REPORT_ID; + + r = hid_read_timeout(trinketDev, (unsigned char*)&resp, sizeof(resp), DEV_TIMEOUT); + if (r < 0) { + fprintf(stderr, "hid_read_timeout fails\n"); + return ERR_NO_ANSWER; + } + + if (r != sizeof(resp)) { + fprintf(stderr, "hid_read_timeout returns %d instead of %u\n", r, sizeof(resp)); + return ERR_ERROR; + } + + if (resp.header.reportId != REPORT_ID) { + fprintf(stderr, "hid_read_timeout returns report id %02x instead of %02x\n", resp.header.reportId, REPORT_ID); + return ERR_ERROR; + } + + if (resp.header.size != proto->respLen) { + fprintf(stderr, "hid_read_timeout returns length %u intsead if %u\n", resp.header.size, proto->respLen); + return ERR_PROTO; + } + + if (resp.len != proto->respLen) { + fprintf(stderr, "hid_read_timeout response length %u instead of %u\n", resp.len, proto->respLen); + return ERR_PROTO; + } + + if (!(resp.begin == ACK_ANSWER_OK && resp.end == END_ANSWER)) { + fprintf(stderr, "hid_read_timeout ACK %02x and ETB %02x\n", resp.begin, resp.end); + return ERR_PROTO; + } + + *value = resp.payload; + + return ERR_OK; +} diff --git a/trinket.h b/trinket.h new file mode 100644 index 0000000..b5bb5ca --- /dev/null +++ b/trinket.h @@ -0,0 +1,43 @@ +/*------------------------------------------------------------------------- + * trinket.h + * + * Copyright (c) 2016, Teodor Sigaev + * + * Redistribution and use in source and binary forms, with or without + * 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. + * 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. + * + * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + *------------------------------------------------------------------------- + */ +#ifndef TRINKET_H +#define TRINKET_H + +typedef enum { + ERR_OK = 0, + ERR_NO_ANSWER = 1, + ERR_ERROR = 2, + ERR_PROTO = 3 +} TrinketErrorCode; + +TrinketErrorCode trinketOpen(); +void trinketClose(); +TrinketErrorCode trinketPing(); +TrinketErrorCode trinketGetCumDose(double *value); + +#endif -- 2.46.1