Browse Source

Added support for new sensors

- Raw IDs now 4 (instead of 2) Bytes long
- There are more in devices.xml
Sven Velt 9 years ago
parent
commit
b0830316c7
1 changed files with 45 additions and 12 deletions
  1. 45 12
      arexxd.c

+ 45 - 12
arexxd.c

@@ -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");
 		}
 		}