From 29b14b4dc6fcd0980cf0adf8bac8bebd55b6bbab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robert=20H=C3=B6gberg?= Date: Mon, 24 Jan 2022 05:15:52 +0100 Subject: [PATCH] Change wt0124 to use additional checksum (#1959) --- src/devices/wt0124.c | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/src/devices/wt0124.c b/src/devices/wt0124.c index 062b75af..2efd3481 100644 --- a/src/devices/wt0124.c +++ b/src/devices/wt0124.c @@ -12,9 +12,9 @@ /** WT0124 Pool Thermometer decoder. - 5e ba 9a 9f e1 34 - 01011110 10111010 10011010 10011111 11100001 00110100 - 5555RRRR RRRRTTTT TTTTTTTT UUCCFFFF XXXXXXXX ???????? + 5e ba 9a 9f e1 34 1 + 01011110 10111010 10011010 10011111 11100001 00110100 1 + 5555RRRR RRRRTTTT TTTTTTTT UUCCFFFF XXXXXXXX SSSSSSSS 1 - 5 = constant 5 - R = random power on id @@ -23,8 +23,8 @@ WT0124 Pool Thermometer decoder. - C = channel - F = constant F - X = xor checksum -- ? = unknown - +- S = sum checksum +- 1 = constant 1 */ #include "decoder.h" @@ -33,8 +33,8 @@ static int wt1024_callback(r_device *decoder, bitbuffer_t *bitbuffer) { data_t *data; uint8_t *b; // bits of a row + uint16_t sum; uint16_t sensor_rid; - int16_t value; float temp_c; uint8_t channel; @@ -49,10 +49,20 @@ static int wt1024_callback(r_device *decoder, bitbuffer_t *bitbuffer) return DECODE_ABORT_EARLY; } - /* Validate checksum */ + /* Validate xor checksum */ if (xor_bytes(b, 4) != b[4]) return DECODE_FAIL_MIC; + /* Validate sum checksum */ + sum = add_bytes(b, 4); + /* Carry bits are added to the sum .. */ + sum += sum >> 8; + /* .. but no carry bit is added to the sum from the last addition */ + sum += b[4]; + sum &= 0xFF; + if (sum != b[5]) + return DECODE_FAIL_MIC; + /* Get rid */ sensor_rid = (b[0] & 0x0F) << 4 | (b[1] & 0x0F); @@ -62,9 +72,6 @@ static int wt1024_callback(r_device *decoder, bitbuffer_t *bitbuffer) /* Get channel */ channel = (b[3] >> 4) & 0x3; - /* unk */ - value = b[5]; - if (decoder->verbose) { fprintf(stderr, "wt1024_callback:"); bitbuffer_print(bitbuffer); @@ -76,7 +83,6 @@ static int wt1024_callback(r_device *decoder, bitbuffer_t *bitbuffer) "id", "Random ID", DATA_INT, sensor_rid, "channel", "Channel", DATA_INT, channel, "temperature_C", "Temperature", DATA_FORMAT, "%.1f C", DATA_DOUBLE, temp_c, - "data", "Data", DATA_INT, value, "mic", "Integrity", DATA_STRING, "CHECKSUM", NULL); /* clang-format on */ @@ -99,7 +105,6 @@ static char *output_fields[] = { "id", "channel", "temperature_C", - "data", "mic", NULL, };