/*
* 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>
#define IGNORE_UNKNOWN_SENSORS
typedef unsigned char byte;
+typedef unsigned int uint;
static libusb_context *usb_ctxt;
static libusb_device_handle *devh;
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.
}
}
-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);
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
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;
unit = "ppm";
}
} else {
- log_error("Unknown sensor type 0x%04x", id);
+ log_error("Unknown sensor type 0x%08x", id);
return;
}
return;
}
- cooked_point(t + TIME_OFFSET, id, z, unit, q);
+ cooked_point(t + TIME_OFFSET, id & 0x0fffffff, z, unit, q);
}
/*** USB interface ***/
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");
}
points++;
}
+end:
return points;
}