From: Martin Mares Date: Mon, 7 Mar 2016 13:05:26 +0000 (+0100) Subject: Experimental support for 32-bit sensor IDs (packet length 12) X-Git-Tag: v1.6~1^2~1 X-Git-Url: http://mj.ucw.cz/gitweb/?a=commitdiff_plain;h=19792db36c8ee4a44775bc59b06ee9aea2db4d73;p=arexx.git Experimental support for 32-bit sensor IDs (packet length 12) So far, only type 0x20000000 temperature sensors are supported. --- diff --git a/arexxd.c b/arexxd.c index 462b664..466271b 100644 --- a/arexxd.c +++ b/arexxd.c @@ -1,7 +1,7 @@ /* * Linux Interfece for Arexx Data Loggers * - * (c) 2011-2012 Martin Mares + * (c) 2011-2016 Martin Mares */ #include @@ -36,6 +36,7 @@ #define IGNORE_UNKNOWN_SENSORS typedef unsigned char byte; +typedef unsigned int uint; static libusb_context *usb_ctxt; static libusb_device_handle *devh; @@ -178,7 +179,7 @@ static void rrd_point(time_t t, const char *name, double val, char *unit) static int data_point_counter; // Since last log message static time_t packet_rx_time; -static double correct_point(int id, double val, const char **name) +static double correct_point(uint id, double val, const char **name) { /* * Manually calculated corrections and renames for my sensors. @@ -211,10 +212,10 @@ static double correct_point(int id, double val, const char **name) } } -static void cooked_point(time_t t, int id, double val, char *unit, int q) +static void cooked_point(time_t t, uint id, double val, char *unit, int q) { char namebuf[16]; - snprintf(namebuf, sizeof(namebuf), "%d", id); + snprintf(namebuf, sizeof(namebuf), "%u", id); const char *name = namebuf; double val2 = correct_point(id, val, &name); @@ -244,7 +245,7 @@ static void cooked_point(time_t t, int id, double val, char *unit, int q) rrd_point(t, name, val2, unit); } -static void raw_point(int t, int id, int raw, int q) +static void raw_point(uint t, uint id, int raw, int q) { /* * The binary blob provided by Arexx contains an embedded XML fragment @@ -279,14 +280,15 @@ static void raw_point(int t, int id, int raw, int q) double z = raw; double hi, lo; char *unit; - int idhi = id & 0xf000; + uint idhi = id & 0xfffff000; + uint idext = id & 0xf0000000; if (idhi == 0x1000) { z = 0.02*z - 273.15; lo = -200; hi = 600; unit = "C"; - } else if (idhi == 0x2000) { + } else if (idhi == 0x2000 || idext == 0x20000000) { if (raw >= 0x8000) z -= 0x10000; z /= 128; @@ -324,7 +326,7 @@ static void raw_point(int t, int id, int raw, int q) unit = "ppm"; } } else { - log_error("Unknown sensor type 0x%04x", id); + log_error("Unknown sensor type 0x%08x", id); return; } @@ -333,7 +335,7 @@ static void raw_point(int t, int id, int raw, int q) return; } - cooked_point(t + TIME_OFFSET, id, z, unit, q); + cooked_point(t + TIME_OFFSET, id & 0x0fffffff, z, unit, q); } /*** USB interface ***/ @@ -538,21 +540,35 @@ static int parse_packet(byte *reply) int len = p[0]; if (!len || len == 0xff) break; - if (len < 9 || len > 10) { - log_error("Unknown tuple length %02x", len); - break; - } if (pos + len > 64) { log_error("Tuple truncated"); break; } - int id = get_le16(p+1); - int raw = get_be16(p+3); - int t = get_le32(p+5); - int q = (len > 9) ? p[9] : -1; + + uint t, id; + int raw, q; + switch (len) { + case 9: + case 10: + id = get_le16(p+1); + raw = get_be16(p+3); + t = get_le32(p+5); + q = (len > 9) ? p[9] : -1; + break; + case 12: + id = get_le32(p+1); + raw = get_be16(p+5); + t = get_le32(p+7); + q = p[11]; + break; + default: + log_error("Unknown tuple length %02x", len); + goto end; + } + if (debug_raw_data) { - printf("... %02x: id=%d raw=%d t=%d", len, id, raw, t); - if (len > 9) + printf("... %02x: id=%08x raw=%d t=%u", len, id, raw, t); + if (q >= 0) printf(" q=%d", q); printf("\n"); } @@ -561,6 +577,7 @@ static int parse_packet(byte *reply) points++; } +end: return points; }