|
@@ -308,7 +308,8 @@ static void raw_point(int t, int id, int raw, int q)
|
|
double z = raw;
|
|
double z = raw;
|
|
double hi, lo;
|
|
double hi, lo;
|
|
char *unit;
|
|
char *unit;
|
|
- int idhi = id & 0xf000;
|
|
|
|
|
|
+ int idhi = id & 0xfffff000;
|
|
|
|
+ int userid = id & 0x0FFFFFFF;
|
|
|
|
|
|
if (idhi == 0x1000) {
|
|
if (idhi == 0x1000) {
|
|
z = 0.02*z - 273.15;
|
|
z = 0.02*z - 273.15;
|
|
@@ -352,17 +353,31 @@ static void raw_point(int t, int id, int raw, int q)
|
|
hi = 1e6;
|
|
hi = 1e6;
|
|
unit = "ppm";
|
|
unit = "ppm";
|
|
}
|
|
}
|
|
|
|
+ } else if ( idhi = 0x40000000) {
|
|
|
|
+ if (!(id & 1)) {
|
|
|
|
+ // Temperature
|
|
|
|
+ z = z/100 - 39.6;
|
|
|
|
+ lo = -60;
|
|
|
|
+ hi = 125;
|
|
|
|
+ unit = "C";
|
|
|
|
+ } else {
|
|
|
|
+ // Humidity
|
|
|
|
+ z = -2.8e-6*z*z + 0.0405*z - 4;
|
|
|
|
+ lo = 0;
|
|
|
|
+ hi = 100.1;
|
|
|
|
+ unit = "%RH";
|
|
|
|
+ }
|
|
} else {
|
|
} else {
|
|
- log_error("Unknown sensor type 0x%04x", id);
|
|
|
|
|
|
+ log_error("Unknown sensor type 0x%04x.%04x/%d", ((id & 0xFFFF0000) >> 16), (id & 0xFFFF), userid);
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
if (z < lo || z > hi) {
|
|
if (z < lo || z > hi) {
|
|
- log_error("Sensor %d: value %f out of range", id, z);
|
|
|
|
|
|
+ log_error("Sensor 0x%04x.%04x/%d: value %f out of range", ((id & 0xFFFF0000) >> 16), (id & 0xFFFF), userid, z);
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
- cooked_point(t + TIME_OFFSET, id, raw, z, unit, q);
|
|
|
|
|
|
+ cooked_point(t + TIME_OFFSET, userid, raw, z, unit, q);
|
|
}
|
|
}
|
|
|
|
|
|
/*** USB interface ***/
|
|
/*** USB interface ***/
|
|
@@ -562,12 +577,18 @@ static int parse_packet(byte *reply)
|
|
|
|
|
|
int pos = 1;
|
|
int pos = 1;
|
|
int points = 0;
|
|
int points = 0;
|
|
|
|
+ int len = 0;
|
|
|
|
+ int id = 0;
|
|
|
|
+ int raw = 0;
|
|
|
|
+ int t = 0;
|
|
|
|
+ int q = 0;
|
|
while (pos < 64) {
|
|
while (pos < 64) {
|
|
byte *p = reply + pos;
|
|
byte *p = reply + pos;
|
|
- int len = p[0];
|
|
|
|
|
|
+ len = p[0];
|
|
|
|
+ p++;
|
|
if (!len || len == 0xff)
|
|
if (!len || len == 0xff)
|
|
break;
|
|
break;
|
|
- if (len < 9 || len > 10) {
|
|
|
|
|
|
+ if (len < 9 || len > 12) {
|
|
log_error("Unknown tuple length %02x", len);
|
|
log_error("Unknown tuple length %02x", len);
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
@@ -575,13 +596,25 @@ static int parse_packet(byte *reply)
|
|
log_error("Tuple truncated");
|
|
log_error("Tuple truncated");
|
|
break;
|
|
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;
|
|
|
|
|
|
+ if (len < 11) {
|
|
|
|
+ id = get_le16(p);
|
|
|
|
+ p += 2;
|
|
|
|
+ } else {
|
|
|
|
+ id = get_le32(p);
|
|
|
|
+ p += 4;
|
|
|
|
+ }
|
|
|
|
+ raw = get_be16(p);
|
|
|
|
+ p += 2;
|
|
|
|
+ t = get_le32(p);
|
|
|
|
+ p += 4;
|
|
|
|
+ if (( (byte)*p & 1) == 1) {
|
|
|
|
+ q = (byte)*p;
|
|
|
|
+ } else {
|
|
|
|
+ q = -1;
|
|
|
|
+ }
|
|
if (debug_raw_data) {
|
|
if (debug_raw_data) {
|
|
- printf("... %02x: id=%d raw=%d t=%d", len, id, raw, t);
|
|
|
|
- if (len > 9)
|
|
|
|
|
|
+ printf("... %02x: id=0x%04x.%04x userid=%d raw=%d t=%d", len, ((id & 0xFFFF0000) >> 16), (id & 0xFFFF), (id & 0x0FFFFFFF), raw, t);
|
|
|
|
+ // if (len & 1)
|
|
printf(" q=%d", q);
|
|
printf(" q=%d", q);
|
|
printf("\n");
|
|
printf("\n");
|
|
}
|
|
}
|