From 7b897494fd3514d9382e26e044472ed2b865cbce Mon Sep 17 00:00:00 2001 From: Stefan Wahren Date: Wed, 3 Jul 2013 20:46:47 +0200 Subject: [PATCH] Improve wildcard search - handle collisions after request for secondary address - check frame type correctly - ignore M-Bus devices without secondary address --- mbus/mbus-protocol-aux.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/mbus/mbus-protocol-aux.c b/mbus/mbus-protocol-aux.c index 0987709..ddbabfd 100755 --- a/mbus/mbus-protocol-aux.c +++ b/mbus/mbus-protocol-aux.c @@ -2113,11 +2113,19 @@ mbus_probe_secondary_address(mbus_handle *handle, const char *mask, char *matchi } if (ret == MBUS_RECV_RESULT_INVALID) + { + /* check for more data (collision) */ + mbus_purge_frames(handle); + return MBUS_PROBE_COLLISION; + } + + /* check for more data (collision) */ + if (mbus_purge_frames(handle)) { return MBUS_PROBE_COLLISION; } - if (mbus_frame_type(&reply) != MBUS_FRAME_TYPE_ACK) + if (mbus_frame_type(&reply) == MBUS_FRAME_TYPE_LONG) { char *addr = mbus_frame_get_secondary_address(&reply); @@ -2125,6 +2133,7 @@ mbus_probe_secondary_address(mbus_handle *handle, const char *mask, char *matchi { // show error message, but procede with scan MBUS_ERROR("Failed to generate secondary address from M-Bus reply frame: %s\n", mbus_error_str()); + return MBUS_PROBE_NOTHING; } snprintf(matching_addr, 17, "%s", addr); @@ -2138,7 +2147,7 @@ mbus_probe_secondary_address(mbus_handle *handle, const char *mask, char *matchi } else { - MBUS_ERROR("%s: Unexpected reply for address [mask %s]. Got ACK, expected data.\n", + MBUS_ERROR("%s: Unexpected reply for address [mask %s]. Expected long frame.\n", __PRETTY_FUNCTION__, mask); return MBUS_PROBE_NOTHING; }