From 2f9fa5ccc8aa032556ab77b7cafcb24670b6bf8d Mon Sep 17 00:00:00 2001 From: Stefan Wahren Date: Wed, 20 Feb 2019 21:51:07 +0100 Subject: [PATCH] Implement negative BCD number (Type A) According to W4B21021.pdf Appendix A a hex code Fh in the MSD position signals a negative BCD number. --- mbus/mbus-protocol.c | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/mbus/mbus-protocol.c b/mbus/mbus-protocol.c index 94773cd..8fcc948 100755 --- a/mbus/mbus-protocol.c +++ b/mbus/mbus-protocol.c @@ -461,9 +461,9 @@ mbus_data_bcd_encode(unsigned char *bcd_data, size_t bcd_data_size, int value) int v0, v1, v2, x1, x2; size_t i; - if (bcd_data && bcd_data_size && (value >= 0)) + if (bcd_data && bcd_data_size) { - v2 = value; + v2 = abs(value); for (i = 0; i < bcd_data_size; i++) { @@ -477,6 +477,11 @@ mbus_data_bcd_encode(unsigned char *bcd_data, size_t bcd_data_size, int value) bcd_data[bcd_data_size-1-i] = (x2 << 4) | x1; } + if (value < 0) + { + bcd_data[bcd_data_size-1] |= 0xF0; + } + return 0; } @@ -498,8 +503,20 @@ mbus_data_bcd_decode(unsigned char *bcd_data, size_t bcd_data_size) { for (i = bcd_data_size; i > 0; i--) { - val = (val * 10) + ((bcd_data[i-1]>>4) & 0xF); - val = (val * 10) + ( bcd_data[i-1] & 0xF); + val *= 10; + + if (bcd_data[i-1]>>4 < 0xA) + { + val += ((bcd_data[i-1]>>4) & 0xF); + } + + val = (val * 10) + (bcd_data[i-1] & 0xF); + } + + // hex code Fh in the MSD position signals a negative BCD number + if (bcd_data[bcd_data_size-1]>>4 == 0xF) + { + val *= -1; } return val;