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.
This commit is contained in:
Stefan Wahren
2019-02-20 21:51:07 +01:00
parent 027f6fb689
commit 2f9fa5ccc8

View File

@ -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; int v0, v1, v2, x1, x2;
size_t i; 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++) 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; bcd_data[bcd_data_size-1-i] = (x2 << 4) | x1;
} }
if (value < 0)
{
bcd_data[bcd_data_size-1] |= 0xF0;
}
return 0; 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--) for (i = bcd_data_size; i > 0; i--)
{ {
val = (val * 10) + ((bcd_data[i-1]>>4) & 0xF); val *= 10;
val = (val * 10) + ( bcd_data[i-1] & 0xF);
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; return val;