From a8f751729041d79340b819bd5f9def7322a7e7ae Mon Sep 17 00:00:00 2001 From: Henry N Date: Fri, 8 May 2020 21:29:02 +0200 Subject: [PATCH 1/6] amb8465: Print config UART_CMD_OUT_ENABLE --- src/wmbus_amb8465.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/src/wmbus_amb8465.cc b/src/wmbus_amb8465.cc index ca57710..6c1a6da 100644 --- a/src/wmbus_amb8465.cc +++ b/src/wmbus_amb8465.cc @@ -218,6 +218,7 @@ void WMBusAmber::getConfiguration() // // These are just some random config settings store in non-volatile memory. verbose("(amb8465) config: uart %02x\n", received_payload_[2]); + verbose("(amb8465) config: IND output enabled %02x\n", received_payload_[5+2]); verbose("(amb8465) config: radio Channel %02x\n", received_payload_[60+2]); uchar re = received_payload_[69+2]; verbose("(amb8465) config: rssi enabled %02x\n", re); From b955c692d51ca0576184b9bbe4a252328d9dd887 Mon Sep 17 00:00:00 2001 From: Henry N Date: Fri, 8 May 2020 21:38:09 +0200 Subject: [PATCH 2/6] amb8465: Fix: Update config RSSI_Enable = false Bugfix: Update local "rssi expected" to false, If RSSI is not set in config. --- src/wmbus_amb8465.cc | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/wmbus_amb8465.cc b/src/wmbus_amb8465.cc index 6c1a6da..dd240fb 100644 --- a/src/wmbus_amb8465.cc +++ b/src/wmbus_amb8465.cc @@ -222,9 +222,7 @@ void WMBusAmber::getConfiguration() verbose("(amb8465) config: radio Channel %02x\n", received_payload_[60+2]); uchar re = received_payload_[69+2]; verbose("(amb8465) config: rssi enabled %02x\n", re); - if (re != 0) { - rssi_expected_ = true; - } + rssi_expected_ = (re != 0) ? true : false; verbose("(amb8465) config: mode Preselect %02x\n", received_payload_[70+2]); } From 60ddad6e1d537af34ab94c35f946c2a650f616e1 Mon Sep 17 00:00:00 2001 From: Henry N Date: Fri, 8 May 2020 21:56:20 +0200 Subject: [PATCH 3/6] amb8465: Fix: RSSI is only in CMD_DATA_IND Byte for rssi is only injected in responses from CMD_DATA_IND. rssi is -2 bytes before end, because -1 byte is the CheckSum. Fix calculation for frame_length. frame_length = 1 byte start (0xFF) + 1 byte CMD (0x8A) + 1 byte len (0x7A) + payload_len + 0/1 byte RSSI + 1 byte Check Sum = 4 + payload_len. PS: The old code was working, because rssi_expected_ was always true (1). --- src/wmbus_amb8465.cc | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/wmbus_amb8465.cc b/src/wmbus_amb8465.cc index dd240fb..ffc6221 100644 --- a/src/wmbus_amb8465.cc +++ b/src/wmbus_amb8465.cc @@ -307,20 +307,25 @@ FrameStatus WMBusAmber::checkAMB8465Frame(vector &data, debug("(amb8465) not enough bytes yet for command.\n"); return PartialFrame; } + + // Only response from CMD_DATA_IND has rssi + int rssi_len = (rssi_expected_ && data[1] == (0x80|CMD_DATA_IND)) ? 1 : 0; + // A command response begins with 0xff *msgid_out = data[1]; payload_len = data[2]; *payload_len_out = payload_len; *payload_offset = 3; - *frame_length = 3+payload_len + (int)rssi_expected_; + // FF CMD len payload [RSSI] CS + *frame_length = 4 + payload_len + rssi_len; if (data.size() < *frame_length) { debug("(amb8465) not enough bytes yet, partial command response %d %d.\n", data.size(), *frame_length); return PartialFrame; } - if (rssi_expected_) { - *rssi = data[*frame_length-1]; + if (rssi_len) { + *rssi = data[*frame_length-2]; } debug("(amb8465) received full command frame\n"); return FullFrame; From c229cb3d0f67bde4b034cd052c8ab30f4fd357a6 Mon Sep 17 00:00:00 2001 From: Henry N Date: Fri, 8 May 2020 22:02:22 +0200 Subject: [PATCH 4/6] amb8465: Update rssi from transparant data Update rssi from transparent rx data. Print rssi only after get an update of rssi (CMD_DATA_IND or transparent RX). --- src/wmbus_amb8465.cc | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/wmbus_amb8465.cc b/src/wmbus_amb8465.cc index ffc6221..98c6cc7 100644 --- a/src/wmbus_amb8465.cc +++ b/src/wmbus_amb8465.cc @@ -326,6 +326,7 @@ FrameStatus WMBusAmber::checkAMB8465Frame(vector &data, if (rssi_len) { *rssi = data[*frame_length-2]; + verbose("(amb8465) rssi %d\n", *rssi); } debug("(amb8465) received full command frame\n"); return FullFrame; @@ -345,6 +346,13 @@ FrameStatus WMBusAmber::checkAMB8465Frame(vector &data, } debug("(amb8465) received full frame\n"); + + if (rssi_expected_) + { + *rssi = data[*frame_length-1]; + verbose("(amb8465) rssi %d\n", *rssi); + } + return FullFrame; } @@ -390,10 +398,6 @@ void WMBusAmber::processSerialData() read_buffer_.erase(read_buffer_.begin(), read_buffer_.begin()+frame_length); - if (rssi_expected_) - { - verbose("(amb8465) rssi %d\n", rssi); - } handleMessage(msgid, payload); } } From 8d283533c3869ecd0a48c83d0c59bfddb53425ca Mon Sep 17 00:00:00 2001 From: Henry N Date: Fri, 8 May 2020 22:06:33 +0200 Subject: [PATCH 5/6] amb8465: Print rssi in dBm --- src/wmbus_amb8465.cc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/wmbus_amb8465.cc b/src/wmbus_amb8465.cc index 98c6cc7..487979f 100644 --- a/src/wmbus_amb8465.cc +++ b/src/wmbus_amb8465.cc @@ -326,7 +326,8 @@ FrameStatus WMBusAmber::checkAMB8465Frame(vector &data, if (rssi_len) { *rssi = data[*frame_length-2]; - verbose("(amb8465) rssi %d\n", *rssi); + signed int dbm = (*rssi >= 128) ? (*rssi - 256) / 2 - 74 : *rssi / 2 - 74; + verbose("(amb8465) rssi %d (%d dBm)\n", *rssi, dbm); } debug("(amb8465) received full command frame\n"); return FullFrame; @@ -350,7 +351,8 @@ FrameStatus WMBusAmber::checkAMB8465Frame(vector &data, if (rssi_expected_) { *rssi = data[*frame_length-1]; - verbose("(amb8465) rssi %d\n", *rssi); + signed int dbm = (*rssi >= 128) ? (*rssi - 256) / 2 - 74 : *rssi / 2 - 74; + verbose("(amb8465) rssi %d (%d dBm)\n", *rssi, dbm); } return FullFrame; From 0159f4c449ffef3d23334143138c847597728b68 Mon Sep 17 00:00:00 2001 From: Henry N Date: Fri, 8 May 2020 22:20:10 +0200 Subject: [PATCH 6/6] amb8465: Print rssi after full command frame Just to have the same order as before. --- src/wmbus_amb8465.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/wmbus_amb8465.cc b/src/wmbus_amb8465.cc index 487979f..cbbe09b 100644 --- a/src/wmbus_amb8465.cc +++ b/src/wmbus_amb8465.cc @@ -324,12 +324,13 @@ FrameStatus WMBusAmber::checkAMB8465Frame(vector &data, return PartialFrame; } + debug("(amb8465) received full command frame\n"); + if (rssi_len) { *rssi = data[*frame_length-2]; signed int dbm = (*rssi >= 128) ? (*rssi - 256) / 2 - 74 : *rssi / 2 - 74; verbose("(amb8465) rssi %d (%d dBm)\n", *rssi, dbm); } - debug("(amb8465) received full command frame\n"); return FullFrame; } // If it is not a 0xff we assume it is a message beginning with a length.