From d6c5529247d326967962895b34606f2b1e2874ca Mon Sep 17 00:00:00 2001 From: Stefan Wahren Date: Wed, 3 Oct 2012 23:01:44 +0200 Subject: [PATCH 01/10] new function mbus_frame_direction to get the direction of a frame (slave to master or vice versa) extended mbus_frame_data_parse to check the direction of a frame --- mbus/mbus-protocol.c | 41 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 37 insertions(+), 4 deletions(-) diff --git a/mbus/mbus-protocol.c b/mbus/mbus-protocol.c index 59736e9..dee306e 100755 --- a/mbus/mbus-protocol.c +++ b/mbus/mbus-protocol.c @@ -300,6 +300,19 @@ mbus_frame_type(mbus_frame *frame) return -1; } +//------------------------------------------------------------------------------ +/// Return the M-Bus frame direction +//------------------------------------------------------------------------------ +int +mbus_frame_direction(mbus_frame *frame) +{ + if (frame) + { + return (frame->control & MBUS_CONTROL_MASK_DIR); + } + return -1; +} + //------------------------------------------------------------------------------ /// Verify that parsed frame is a valid M-bus frame. // @@ -2713,7 +2726,23 @@ mbus_data_variable_parse(mbus_frame *frame, mbus_data_variable *data) int mbus_frame_data_parse(mbus_frame *frame, mbus_frame_data *data) { - if (frame && data) + char direction; + + if (frame == NULL) + { + snprintf(error_str, sizeof(error_str), "Got null pointer to frame."); + return -1; + } + + if (data == NULL) + { + snprintf(error_str, sizeof(error_str), "Got null pointer to data."); + return -1; + } + + direction = (frame->control & MBUS_CONTROL_MASK_DIR); + + if (direction == MBUS_CONTROL_MASK_DIR_S2M) { if (frame->control_information == MBUS_CONTROL_INFO_ERROR_GENERAL) { @@ -2761,9 +2790,13 @@ mbus_frame_data_parse(mbus_frame *frame, mbus_frame_data *data) return -1; } } - - snprintf(error_str, sizeof(error_str), "Got null pointer to frame or data."); - + else + { + snprintf(error_str, sizeof(error_str), "Wrong direction in frame (master to slave)"); + + return -1; + } + return -1; } From d211c3cbcbace176892dd9333102a8fbd2c21d01 Mon Sep 17 00:00:00 2001 From: Stefan Wahren Date: Wed, 3 Oct 2012 23:03:05 +0200 Subject: [PATCH 02/10] new function mbus_frame_direction to get the direction of a frame (slave to master or vice versa) --- mbus/mbus-protocol.h | 1 + 1 file changed, 1 insertion(+) diff --git a/mbus/mbus-protocol.h b/mbus/mbus-protocol.h index 8ec0ce6..f1e9d06 100755 --- a/mbus/mbus-protocol.h +++ b/mbus/mbus-protocol.h @@ -555,6 +555,7 @@ const char *mbus_data_fixed_function(int status); // M-Bus frame data struct access/write functions // int mbus_frame_type(mbus_frame *frame); +int mbus_frame_direction(mbus_frame *frame); // // Slave status data register. From 169e37d360f5782dbbfe8bf9ccb5877cb6af7fb9 Mon Sep 17 00:00:00 2001 From: Stefan Wahren Date: Wed, 3 Oct 2012 23:06:11 +0200 Subject: [PATCH 03/10] Extend mbus_recv_frame with simple echo cancelation --- mbus/mbus-protocol-aux.c | 101 +++++++++++++++++++++------------------ 1 file changed, 54 insertions(+), 47 deletions(-) diff --git a/mbus/mbus-protocol-aux.c b/mbus/mbus-protocol-aux.c index 57758eb..0792598 100755 --- a/mbus/mbus-protocol-aux.c +++ b/mbus/mbus-protocol-aux.c @@ -150,17 +150,17 @@ mbus_variable_vif vif_table[] = { { 0x56, 1.0e3, "kg/h", "Mass flow" }, { 0x57, 1.0e4, "kg/h", "Mass flow" }, - /* E101 10nn Flow Temperature °C (0.001°C to 1°C) */ - { 0x58, 1.0e-3, "°C", "Flow temperature" }, - { 0x59, 1.0e-2, "°C", "Flow temperature" }, - { 0x5A, 1.0e-1, "°C", "Flow temperature" }, - { 0x5B, 1.0e0, "°C", "Flow temperature" }, + /* E101 10nn Flow Temperature �C (0.001�C to 1�C) */ + { 0x58, 1.0e-3, "�C", "Flow temperature" }, + { 0x59, 1.0e-2, "�C", "Flow temperature" }, + { 0x5A, 1.0e-1, "�C", "Flow temperature" }, + { 0x5B, 1.0e0, "�C", "Flow temperature" }, - /* E101 11nn Return Temperature °C (0.001°C to 1°C) */ - { 0x5C, 1.0e-3, "°C", "Return temperature" }, - { 0x5D, 1.0e-2, "°C", "Return temperature" }, - { 0x5E, 1.0e-1, "°C", "Return temperature" }, - { 0x5F, 1.0e0, "°C", "Return temperature" }, + /* E101 11nn Return Temperature �C (0.001�C to 1�C) */ + { 0x5C, 1.0e-3, "�C", "Return temperature" }, + { 0x5D, 1.0e-2, "�C", "Return temperature" }, + { 0x5E, 1.0e-1, "�C", "Return temperature" }, + { 0x5F, 1.0e0, "�C", "Return temperature" }, /* E110 00nn Temperature Difference K (mK to K) */ { 0x60, 1.0e-3, "K", "Temperature difference" }, @@ -168,11 +168,11 @@ mbus_variable_vif vif_table[] = { { 0x62, 1.0e-1, "K", "Temperature difference" }, { 0x63, 1.0e0, "K", "Temperature difference" }, - /* E110 01nn External Temperature °C (0.001°C to 1°C) */ - { 0x64, 1.0e-3, "°C", "External temperature" }, - { 0x65, 1.0e-2, "°C", "External temperature" }, - { 0x66, 1.0e-1, "°C", "External temperature" }, - { 0x67, 1.0e0, "°C", "External temperature" }, + /* E110 01nn External Temperature �C (0.001�C to 1�C) */ + { 0x64, 1.0e-3, "�C", "External temperature" }, + { 0x65, 1.0e-2, "�C", "External temperature" }, + { 0x66, 1.0e-1, "�C", "External temperature" }, + { 0x67, 1.0e0, "�C", "External temperature" }, /* E110 10nn Pressure bar (1mbar to 1000mbar) */ { 0x68, 1.0e-3, "bar", "Pressure" }, @@ -564,29 +564,29 @@ mbus_variable_vif vif_table[] = { { 0x236, 1.0e0, "Reserved", "Reserved" }, { 0x237, 1.0e0, "Reserved", "Reserved" }, - /* E101 10nn Flow Temperature 10(nn-3) °F 0.001°F to 1°F */ - { 0x238, 1.0e-3, "°F", "Flow temperature" }, - { 0x239, 1.0e-2, "°F", "Flow temperature" }, - { 0x23A, 1.0e-1, "°F", "Flow temperature" }, - { 0x23B, 1.0e0, "°F", "Flow temperature" }, + /* E101 10nn Flow Temperature 10(nn-3) �F 0.001�F to 1�F */ + { 0x238, 1.0e-3, "�F", "Flow temperature" }, + { 0x239, 1.0e-2, "�F", "Flow temperature" }, + { 0x23A, 1.0e-1, "�F", "Flow temperature" }, + { 0x23B, 1.0e0, "�F", "Flow temperature" }, - /* E101 11nn Return Temperature 10(nn-3) °F 0.001°F to 1°F */ - { 0x23C, 1.0e-3, "°F", "Return temperature" }, - { 0x23D, 1.0e-2, "°F", "Return temperature" }, - { 0x23E, 1.0e-1, "°F", "Return temperature" }, - { 0x23F, 1.0e0, "°F", "Return temperature" }, + /* E101 11nn Return Temperature 10(nn-3) �F 0.001�F to 1�F */ + { 0x23C, 1.0e-3, "�F", "Return temperature" }, + { 0x23D, 1.0e-2, "�F", "Return temperature" }, + { 0x23E, 1.0e-1, "�F", "Return temperature" }, + { 0x23F, 1.0e0, "�F", "Return temperature" }, - /* E110 00nn Temperature Difference 10(nn-3) °F 0.001°F to 1°F */ - { 0x240, 1.0e-3, "°F", "Temperature difference" }, - { 0x241, 1.0e-2, "°F", "Temperature difference" }, - { 0x242, 1.0e-1, "°F", "Temperature difference" }, - { 0x243, 1.0e0, "°F", "Temperature difference" }, + /* E110 00nn Temperature Difference 10(nn-3) �F 0.001�F to 1�F */ + { 0x240, 1.0e-3, "�F", "Temperature difference" }, + { 0x241, 1.0e-2, "�F", "Temperature difference" }, + { 0x242, 1.0e-1, "�F", "Temperature difference" }, + { 0x243, 1.0e0, "�F", "Temperature difference" }, - /* E110 01nn External Temperature 10(nn-3) °F 0.001°F to 1°F */ - { 0x244, 1.0e-3, "°F", "External temperature" }, - { 0x245, 1.0e-2, "°F", "External temperature" }, - { 0x246, 1.0e-1, "°F", "External temperature" }, - { 0x247, 1.0e0, "°F", "External temperature" }, + /* E110 01nn External Temperature 10(nn-3) �F 0.001�F to 1�F */ + { 0x244, 1.0e-3, "�F", "External temperature" }, + { 0x245, 1.0e-2, "�F", "External temperature" }, + { 0x246, 1.0e-1, "�F", "External temperature" }, + { 0x247, 1.0e0, "�F", "External temperature" }, /* E110 1nnn Reserved */ { 0x248, 1.0e0, "Reserved", "Reserved" }, @@ -598,19 +598,19 @@ mbus_variable_vif vif_table[] = { { 0x24E, 1.0e0, "Reserved", "Reserved" }, { 0x24F, 1.0e0, "Reserved", "Reserved" }, - /* E111 00nn Cold / Warm Temperature Limit 10(nn-3) °F 0.001°F to 1°F */ - { 0x250, 1.0e-3, "°F", "Cold / Warm Temperature Limit" }, - { 0x251, 1.0e-2, "°F", "Cold / Warm Temperature Limit" }, - { 0x252, 1.0e-1, "°F", "Cold / Warm Temperature Limit" }, - { 0x253, 1.0e0, "°F", "Cold / Warm Temperature Limit" }, + /* E111 00nn Cold / Warm Temperature Limit 10(nn-3) �F 0.001�F to 1�F */ + { 0x250, 1.0e-3, "�F", "Cold / Warm Temperature Limit" }, + { 0x251, 1.0e-2, "�F", "Cold / Warm Temperature Limit" }, + { 0x252, 1.0e-1, "�F", "Cold / Warm Temperature Limit" }, + { 0x253, 1.0e0, "�F", "Cold / Warm Temperature Limit" }, - /* E111 01nn Cold / Warm Temperature Limit 10(nn-3) °C 0.001°C to 1°C */ - { 0x254, 1.0e-3, "°C", "Cold / Warm Temperature Limit" }, - { 0x255, 1.0e-2, "°C", "Cold / Warm Temperature Limit" }, - { 0x256, 1.0e-1, "°C", "Cold / Warm Temperature Limit" }, - { 0x257, 1.0e0, "°C", "Cold / Warm Temperature Limit" }, + /* E111 01nn Cold / Warm Temperature Limit 10(nn-3) �C 0.001�C to 1�C */ + { 0x254, 1.0e-3, "�C", "Cold / Warm Temperature Limit" }, + { 0x255, 1.0e-2, "�C", "Cold / Warm Temperature Limit" }, + { 0x256, 1.0e-1, "�C", "Cold / Warm Temperature Limit" }, + { 0x257, 1.0e0, "�C", "Cold / Warm Temperature Limit" }, - /* E111 1nnn cumul. count max power § 10(nnn-3) W 0.001W to 10000W */ + /* E111 1nnn cumul. count max power � 10(nnn-3) W 0.001W to 10000W */ { 0x258, 1.0e-3, "W", "Cumul count max power" }, { 0x259, 1.0e-3, "W", "Cumul count max power" }, { 0x25A, 1.0e-1, "W", "Cumul count max power" }, @@ -686,7 +686,7 @@ mbus_variable_vif fixed_table[] = { { 0x36, 1.0e1, "m^3/h", "Volume flow" }, { 0x37, 1.0e2, "m^3/h", "Volume flow" }, - { 0x38, 1.0e-3, "°C", "Temperature" }, + { 0x38, 1.0e-3, "�C", "Temperature" }, { 0x39, 1.0e0, "Units for H.C.A.", "H.C.A." }, @@ -1467,6 +1467,13 @@ mbus_recv_frame(mbus_handle * handle, mbus_frame *frame) } result = handle->recv(handle, frame); + + /* frame valid, but wrong direction */ + if (mbus_frame_direction(frame) == MBUS_CONTROL_MASK_DIR_M2S) + { + /* purge echo and retry (echo cancelation) */ + result = handle->recv(handle, frame); + } if (frame != NULL) { From af80dda0d87de8a2836e84f7f9613e48c989c6a1 Mon Sep 17 00:00:00 2001 From: Stefan Wahren Date: Wed, 3 Oct 2012 23:25:10 +0200 Subject: [PATCH 04/10] Revert "Extend mbus_recv_frame with simple echo cancelation" This reverts commit 169e37d360f5782dbbfe8bf9ccb5877cb6af7fb9. --- mbus/mbus-protocol-aux.c | 101 ++++++++++++++++++--------------------- 1 file changed, 47 insertions(+), 54 deletions(-) diff --git a/mbus/mbus-protocol-aux.c b/mbus/mbus-protocol-aux.c index 0792598..57758eb 100755 --- a/mbus/mbus-protocol-aux.c +++ b/mbus/mbus-protocol-aux.c @@ -150,17 +150,17 @@ mbus_variable_vif vif_table[] = { { 0x56, 1.0e3, "kg/h", "Mass flow" }, { 0x57, 1.0e4, "kg/h", "Mass flow" }, - /* E101 10nn Flow Temperature �C (0.001�C to 1�C) */ - { 0x58, 1.0e-3, "�C", "Flow temperature" }, - { 0x59, 1.0e-2, "�C", "Flow temperature" }, - { 0x5A, 1.0e-1, "�C", "Flow temperature" }, - { 0x5B, 1.0e0, "�C", "Flow temperature" }, + /* E101 10nn Flow Temperature °C (0.001°C to 1°C) */ + { 0x58, 1.0e-3, "°C", "Flow temperature" }, + { 0x59, 1.0e-2, "°C", "Flow temperature" }, + { 0x5A, 1.0e-1, "°C", "Flow temperature" }, + { 0x5B, 1.0e0, "°C", "Flow temperature" }, - /* E101 11nn Return Temperature �C (0.001�C to 1�C) */ - { 0x5C, 1.0e-3, "�C", "Return temperature" }, - { 0x5D, 1.0e-2, "�C", "Return temperature" }, - { 0x5E, 1.0e-1, "�C", "Return temperature" }, - { 0x5F, 1.0e0, "�C", "Return temperature" }, + /* E101 11nn Return Temperature °C (0.001°C to 1°C) */ + { 0x5C, 1.0e-3, "°C", "Return temperature" }, + { 0x5D, 1.0e-2, "°C", "Return temperature" }, + { 0x5E, 1.0e-1, "°C", "Return temperature" }, + { 0x5F, 1.0e0, "°C", "Return temperature" }, /* E110 00nn Temperature Difference K (mK to K) */ { 0x60, 1.0e-3, "K", "Temperature difference" }, @@ -168,11 +168,11 @@ mbus_variable_vif vif_table[] = { { 0x62, 1.0e-1, "K", "Temperature difference" }, { 0x63, 1.0e0, "K", "Temperature difference" }, - /* E110 01nn External Temperature �C (0.001�C to 1�C) */ - { 0x64, 1.0e-3, "�C", "External temperature" }, - { 0x65, 1.0e-2, "�C", "External temperature" }, - { 0x66, 1.0e-1, "�C", "External temperature" }, - { 0x67, 1.0e0, "�C", "External temperature" }, + /* E110 01nn External Temperature °C (0.001°C to 1°C) */ + { 0x64, 1.0e-3, "°C", "External temperature" }, + { 0x65, 1.0e-2, "°C", "External temperature" }, + { 0x66, 1.0e-1, "°C", "External temperature" }, + { 0x67, 1.0e0, "°C", "External temperature" }, /* E110 10nn Pressure bar (1mbar to 1000mbar) */ { 0x68, 1.0e-3, "bar", "Pressure" }, @@ -564,29 +564,29 @@ mbus_variable_vif vif_table[] = { { 0x236, 1.0e0, "Reserved", "Reserved" }, { 0x237, 1.0e0, "Reserved", "Reserved" }, - /* E101 10nn Flow Temperature 10(nn-3) �F 0.001�F to 1�F */ - { 0x238, 1.0e-3, "�F", "Flow temperature" }, - { 0x239, 1.0e-2, "�F", "Flow temperature" }, - { 0x23A, 1.0e-1, "�F", "Flow temperature" }, - { 0x23B, 1.0e0, "�F", "Flow temperature" }, + /* E101 10nn Flow Temperature 10(nn-3) °F 0.001°F to 1°F */ + { 0x238, 1.0e-3, "°F", "Flow temperature" }, + { 0x239, 1.0e-2, "°F", "Flow temperature" }, + { 0x23A, 1.0e-1, "°F", "Flow temperature" }, + { 0x23B, 1.0e0, "°F", "Flow temperature" }, - /* E101 11nn Return Temperature 10(nn-3) �F 0.001�F to 1�F */ - { 0x23C, 1.0e-3, "�F", "Return temperature" }, - { 0x23D, 1.0e-2, "�F", "Return temperature" }, - { 0x23E, 1.0e-1, "�F", "Return temperature" }, - { 0x23F, 1.0e0, "�F", "Return temperature" }, + /* E101 11nn Return Temperature 10(nn-3) °F 0.001°F to 1°F */ + { 0x23C, 1.0e-3, "°F", "Return temperature" }, + { 0x23D, 1.0e-2, "°F", "Return temperature" }, + { 0x23E, 1.0e-1, "°F", "Return temperature" }, + { 0x23F, 1.0e0, "°F", "Return temperature" }, - /* E110 00nn Temperature Difference 10(nn-3) �F 0.001�F to 1�F */ - { 0x240, 1.0e-3, "�F", "Temperature difference" }, - { 0x241, 1.0e-2, "�F", "Temperature difference" }, - { 0x242, 1.0e-1, "�F", "Temperature difference" }, - { 0x243, 1.0e0, "�F", "Temperature difference" }, + /* E110 00nn Temperature Difference 10(nn-3) °F 0.001°F to 1°F */ + { 0x240, 1.0e-3, "°F", "Temperature difference" }, + { 0x241, 1.0e-2, "°F", "Temperature difference" }, + { 0x242, 1.0e-1, "°F", "Temperature difference" }, + { 0x243, 1.0e0, "°F", "Temperature difference" }, - /* E110 01nn External Temperature 10(nn-3) �F 0.001�F to 1�F */ - { 0x244, 1.0e-3, "�F", "External temperature" }, - { 0x245, 1.0e-2, "�F", "External temperature" }, - { 0x246, 1.0e-1, "�F", "External temperature" }, - { 0x247, 1.0e0, "�F", "External temperature" }, + /* E110 01nn External Temperature 10(nn-3) °F 0.001°F to 1°F */ + { 0x244, 1.0e-3, "°F", "External temperature" }, + { 0x245, 1.0e-2, "°F", "External temperature" }, + { 0x246, 1.0e-1, "°F", "External temperature" }, + { 0x247, 1.0e0, "°F", "External temperature" }, /* E110 1nnn Reserved */ { 0x248, 1.0e0, "Reserved", "Reserved" }, @@ -598,19 +598,19 @@ mbus_variable_vif vif_table[] = { { 0x24E, 1.0e0, "Reserved", "Reserved" }, { 0x24F, 1.0e0, "Reserved", "Reserved" }, - /* E111 00nn Cold / Warm Temperature Limit 10(nn-3) �F 0.001�F to 1�F */ - { 0x250, 1.0e-3, "�F", "Cold / Warm Temperature Limit" }, - { 0x251, 1.0e-2, "�F", "Cold / Warm Temperature Limit" }, - { 0x252, 1.0e-1, "�F", "Cold / Warm Temperature Limit" }, - { 0x253, 1.0e0, "�F", "Cold / Warm Temperature Limit" }, + /* E111 00nn Cold / Warm Temperature Limit 10(nn-3) °F 0.001°F to 1°F */ + { 0x250, 1.0e-3, "°F", "Cold / Warm Temperature Limit" }, + { 0x251, 1.0e-2, "°F", "Cold / Warm Temperature Limit" }, + { 0x252, 1.0e-1, "°F", "Cold / Warm Temperature Limit" }, + { 0x253, 1.0e0, "°F", "Cold / Warm Temperature Limit" }, - /* E111 01nn Cold / Warm Temperature Limit 10(nn-3) �C 0.001�C to 1�C */ - { 0x254, 1.0e-3, "�C", "Cold / Warm Temperature Limit" }, - { 0x255, 1.0e-2, "�C", "Cold / Warm Temperature Limit" }, - { 0x256, 1.0e-1, "�C", "Cold / Warm Temperature Limit" }, - { 0x257, 1.0e0, "�C", "Cold / Warm Temperature Limit" }, + /* E111 01nn Cold / Warm Temperature Limit 10(nn-3) °C 0.001°C to 1°C */ + { 0x254, 1.0e-3, "°C", "Cold / Warm Temperature Limit" }, + { 0x255, 1.0e-2, "°C", "Cold / Warm Temperature Limit" }, + { 0x256, 1.0e-1, "°C", "Cold / Warm Temperature Limit" }, + { 0x257, 1.0e0, "°C", "Cold / Warm Temperature Limit" }, - /* E111 1nnn cumul. count max power � 10(nnn-3) W 0.001W to 10000W */ + /* E111 1nnn cumul. count max power § 10(nnn-3) W 0.001W to 10000W */ { 0x258, 1.0e-3, "W", "Cumul count max power" }, { 0x259, 1.0e-3, "W", "Cumul count max power" }, { 0x25A, 1.0e-1, "W", "Cumul count max power" }, @@ -686,7 +686,7 @@ mbus_variable_vif fixed_table[] = { { 0x36, 1.0e1, "m^3/h", "Volume flow" }, { 0x37, 1.0e2, "m^3/h", "Volume flow" }, - { 0x38, 1.0e-3, "�C", "Temperature" }, + { 0x38, 1.0e-3, "°C", "Temperature" }, { 0x39, 1.0e0, "Units for H.C.A.", "H.C.A." }, @@ -1467,13 +1467,6 @@ mbus_recv_frame(mbus_handle * handle, mbus_frame *frame) } result = handle->recv(handle, frame); - - /* frame valid, but wrong direction */ - if (mbus_frame_direction(frame) == MBUS_CONTROL_MASK_DIR_M2S) - { - /* purge echo and retry (echo cancelation) */ - result = handle->recv(handle, frame); - } if (frame != NULL) { From f7e238afddd753cb29a0db58207c7213d92bfe49 Mon Sep 17 00:00:00 2001 From: Stefan Wahren Date: Wed, 3 Oct 2012 23:31:37 +0200 Subject: [PATCH 05/10] Extend mbus_recv_frame with simple echo cancelation --- mbus/mbus-protocol-aux.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/mbus/mbus-protocol-aux.c b/mbus/mbus-protocol-aux.c index 57758eb..dd6ddb5 100755 --- a/mbus/mbus-protocol-aux.c +++ b/mbus/mbus-protocol-aux.c @@ -1467,6 +1467,13 @@ mbus_recv_frame(mbus_handle * handle, mbus_frame *frame) } result = handle->recv(handle, frame); + + /* frame valid, but wrong direction */ + if (mbus_frame_direction(frame) == MBUS_CONTROL_MASK_DIR_M2S) + { + /* purge echo and retry (echo cancelation) */ + result = handle->recv(handle, frame); + } if (frame != NULL) { From 78f16f0248f5a6da09e98bc645f10505299c7d7f Mon Sep 17 00:00:00 2001 From: Stefan Wahren Date: Thu, 4 Oct 2012 22:30:53 +0200 Subject: [PATCH 06/10] New defines for purge behavior (echo cancelation) --- mbus/mbus-protocol-aux.c | 7 +++++++ mbus/mbus-protocol-aux.h | 5 +++++ 2 files changed, 12 insertions(+) diff --git a/mbus/mbus-protocol-aux.c b/mbus/mbus-protocol-aux.c index 57758eb..dd6ddb5 100755 --- a/mbus/mbus-protocol-aux.c +++ b/mbus/mbus-protocol-aux.c @@ -1467,6 +1467,13 @@ mbus_recv_frame(mbus_handle * handle, mbus_frame *frame) } result = handle->recv(handle, frame); + + /* frame valid, but wrong direction */ + if (mbus_frame_direction(frame) == MBUS_CONTROL_MASK_DIR_M2S) + { + /* purge echo and retry (echo cancelation) */ + result = handle->recv(handle, frame); + } if (frame != NULL) { diff --git a/mbus/mbus-protocol-aux.h b/mbus/mbus-protocol-aux.h index 5b63188..02694d9 100755 --- a/mbus/mbus-protocol-aux.h +++ b/mbus/mbus-protocol-aux.h @@ -70,12 +70,17 @@ #define MBUS_PROBE_COLLISION 2 #define MBUS_PROBE_ERROR -1 +#define MBUS_FRAME_PURGE_S2M 2 +#define MBUS_FRAME_PURGE_M2S 1 +#define MBUS_FRAME_PURGE_NONE 0 + /** * Unified MBus handle type encapsulating either Serial or TCP gateway. */ struct _mbus_handle { int fd; int max_retry; + char purge_first_frame; char is_serial; /**< _handle type (non zero for serial) */ int (*open) (struct _mbus_handle *handle); int (*close) (struct _mbus_handle *handle); From fef774d98d8d4271965e192f36fb98b8f098c21b Mon Sep 17 00:00:00 2001 From: Stefan Wahren Date: Thu, 4 Oct 2012 22:33:22 +0200 Subject: [PATCH 07/10] Purge behavior as new context parameter (default = purge master to slave) --- mbus/mbus-protocol-aux.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/mbus/mbus-protocol-aux.c b/mbus/mbus-protocol-aux.c index dd6ddb5..ec0f6f0 100755 --- a/mbus/mbus-protocol-aux.c +++ b/mbus/mbus-protocol-aux.c @@ -1353,6 +1353,7 @@ mbus_context_serial(const char *device) handle->max_retry = 3; handle->is_serial = 1; + handle->purge_first_frame = MBUS_FRAME_PURGE_M2S; handle->auxdata = serial_data; handle->open = mbus_serial_connect; handle->close = mbus_serial_disconnect; @@ -1395,6 +1396,7 @@ mbus_context_tcp(const char *host, int port) handle->max_retry = 3; handle->is_serial = 0; + handle->purge_first_frame = MBUS_FRAME_PURGE_M2S; handle->auxdata = tcp_data; handle->open = mbus_tcp_connect; handle->close = mbus_tcp_disconnect; @@ -1468,11 +1470,16 @@ mbus_recv_frame(mbus_handle * handle, mbus_frame *frame) result = handle->recv(handle, frame); - /* frame valid, but wrong direction */ - if (mbus_frame_direction(frame) == MBUS_CONTROL_MASK_DIR_M2S) + switch (mbus_frame_direction(frame)) { - /* purge echo and retry (echo cancelation) */ - result = handle->recv(handle, frame); + case MBUS_CONTROL_MASK_DIR_M2S: + if (handle->purge_first_frame == MBUS_FRAME_PURGE_M2S) + result = handle->recv(handle, frame); // purge echo and retry + break; + case MBUS_CONTROL_MASK_DIR_S2M: + if (handle->purge_first_frame == MBUS_FRAME_PURGE_S2M) + result = handle->recv(handle, frame); // purge echo and retry + break; } if (frame != NULL) From da2850532340e94c32a99c78857d98926cb8ef75 Mon Sep 17 00:00:00 2001 From: Stefan Wahren Date: Thu, 4 Oct 2012 22:59:09 +0200 Subject: [PATCH 08/10] revert last commit --- .gitignore | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/.gitignore b/.gitignore index fc465f8..2bb98e8 100644 --- a/.gitignore +++ b/.gitignore @@ -21,6 +21,10 @@ src/config.h.in /m4 # configure stuff: +Makefile +bin/Makefile +mbus/Makefile +test/Makefile config.log config.status libtool @@ -41,5 +45,18 @@ test/.deps *.la *.lo .libs/ +bin/libmbus.1 +bin/libmbus.1 +bin/mbus-serial-request-data +bin/mbus-serial-request-data-multi-reply +bin/mbus-serial-scan +bin/mbus-serial-scan-secondary +bin/mbus-serial-select-secondary +bin/mbus-serial-switch-baudrate +bin/mbus-tcp-request-data +bin/mbus-tcp-request-data-multi-reply +bin/mbus-tcp-scan +bin/mbus-tcp-scan-secondary +bin/mbus-tcp-select-secondary !*.c From 30ab8dd6436fddf44e70d54f0904bc812a9b3c06 Mon Sep 17 00:00:00 2001 From: Stefan Wahren Date: Thu, 4 Oct 2012 23:20:28 +0200 Subject: [PATCH 09/10] handle direction of ACK correctly --- mbus/mbus-protocol.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/mbus/mbus-protocol.c b/mbus/mbus-protocol.c index dee306e..e47f8d2 100755 --- a/mbus/mbus-protocol.c +++ b/mbus/mbus-protocol.c @@ -308,7 +308,14 @@ mbus_frame_direction(mbus_frame *frame) { if (frame) { - return (frame->control & MBUS_CONTROL_MASK_DIR); + if (frame->type == MBUS_FRAME_TYPE_ACK) + { + return MBUS_CONTROL_MASK_DIR_S2M; + } + else + { + return (frame->control & MBUS_CONTROL_MASK_DIR); + } } return -1; } From 3de91c5eab48dcc07827cc1e468cabacdd5e051a Mon Sep 17 00:00:00 2001 From: Stefan Wahren Date: Fri, 5 Oct 2012 22:09:07 +0200 Subject: [PATCH 10/10] Added product name mapping for Ista sensonic II mbus --- mbus/mbus-protocol.c | 9 +++++++++ mbus/mbus-protocol.h | 1 + 2 files changed, 10 insertions(+) diff --git a/mbus/mbus-protocol.c b/mbus/mbus-protocol.c index e47f8d2..e627091 100755 --- a/mbus/mbus-protocol.c +++ b/mbus/mbus-protocol.c @@ -856,6 +856,15 @@ mbus_data_product_name(mbus_data_variable_header *header) break; } } + else if (manufacturer == MBUS_VARIABLE_DATA_MAN_RKE) + { + switch (header->version) + { + case 0x69: + strcpy(buff,"Ista sensonic II mbus"); + break; + } + } else if (manufacturer == MBUS_VARIABLE_DATA_MAN_SVM) { switch (header->version) diff --git a/mbus/mbus-protocol.h b/mbus/mbus-protocol.h index f1e9d06..c1473a3 100755 --- a/mbus/mbus-protocol.h +++ b/mbus/mbus-protocol.h @@ -484,6 +484,7 @@ typedef struct _mbus_data_secondary_address { #define MBUS_VARIABLE_DATA_MAN_NZR 0x3B52 #define MBUS_VARIABLE_DATA_MAN_PAD 0x4024 #define MBUS_VARIABLE_DATA_MAN_QDS 0x4493 +#define MBUS_VARIABLE_DATA_MAN_RKE 0x4965 #define MBUS_VARIABLE_DATA_MAN_SEN 0x4CAE #define MBUS_VARIABLE_DATA_MAN_SLB 0x4D82 #define MBUS_VARIABLE_DATA_MAN_SON 0x4DEE