]> mj.ucw.cz Git - arexx.git/commitdiff
Experimental support for 32-bit sensor IDs (packet length 12)
authorMartin Mares <mj@ucw.cz>
Mon, 7 Mar 2016 13:05:26 +0000 (14:05 +0100)
committerMartin Mares <mj@ucw.cz>
Mon, 7 Mar 2016 13:05:26 +0000 (14:05 +0100)
So far, only type 0x20000000 temperature sensors are supported.

arexxd.c

index 462b664c4812541268e194cbd253be19c113fa9e..466271b27c90746c7502c30df5b1044a7cb47081 100644 (file)
--- a/arexxd.c
+++ b/arexxd.c
@@ -1,7 +1,7 @@
 /*
  *     Linux Interfece for Arexx Data Loggers
  *
- *     (c) 2011-2012 Martin Mares <mj@ucw.cz>
+ *     (c) 2011-2016 Martin Mares <mj@ucw.cz>
  */
 
 #include <stdio.h>
@@ -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;
 }