Changes to remove restrictions on context tags being less than or equal to 14.

This commit is contained in:
minack
2009-09-03 01:25:28 +00:00
parent 2febfbbe56
commit 260438935b
4 changed files with 337 additions and 66 deletions
+1 -1
View File
@@ -72,7 +72,7 @@ extern "C" {
uint32_t * value);
int decode_tag_number_and_value_safe(
uint8_t * apdu,
uint8_t apdu_len_remaining,
uint32_t apdu_len_remaining,
uint8_t * tag_number,
uint32_t * value);
/* returns true if the tag is context specific */
+4
View File
@@ -61,6 +61,10 @@ extern "C" {
int decode_double(
uint8_t * apdu,
double *real_value);
int decode_context_double(
uint8_t * apdu,
uint8_t tag_number,
double *double_value);
int decode_double_safe(
uint8_t * apdu,
uint32_t len_value,
+313 -65
View File
@@ -347,7 +347,7 @@ int decode_tag_number(
/* Same as function above, but will safely fail is packet has been truncated */
int decode_tag_number_safe(
uint8_t * apdu,
uint16_t apdu_len_remaining,
uint32_t apdu_len_remaining,
uint8_t * tag_number)
{
int len = 0; /* return value */
@@ -437,7 +437,7 @@ int decode_tag_number_and_value(
/* Same as function above, but will safely fail is packet has been truncated */
int decode_tag_number_and_value_safe(
uint8_t * apdu,
uint8_t apdu_len_remaining,
uint32_t apdu_len_remaining,
uint8_t * tag_number,
uint32_t * value)
{
@@ -872,14 +872,10 @@ int encode_context_object_id(
{
int len = 0;
/* assumes that the tag only consumes 1 octet */
len = encode_bacnet_object_id(&apdu[1], object_type, instance);
/* we only reserved 1 byte for encoding the tag - check the limits */
if ((tag_number <= 14) && (len <= 4)) {
len += encode_tag(&apdu[0], tag_number, true, (uint32_t) len);
} else {
len = 0;
}
/* length of object id is 4 octets, as per 20.2.14 */
len = encode_tag(&apdu[0], tag_number, true, 4);
len += encode_bacnet_object_id(&apdu[len], object_type, instance);
return len;
}
@@ -1214,15 +1210,21 @@ int encode_context_unsigned(
uint32_t value)
{
int len = 0;
len = encode_bacnet_unsigned(&apdu[1], value);
/* we only reserved 1 byte for encoding the tag - check the limits */
if ((tag_number <= 14) && (len <= 4)) {
len += encode_tag(&apdu[0], tag_number, true, (uint32_t) len);
/* length of unsigned is variable, as per 20.2.4 */
if (value < 0x100) {
len = 1;
} else if (value < 0x10000) {
len = 2;
} else if (value < 0x1000000) {
len = 3;
} else {
len = 0;
len = 4;
}
len = encode_tag(&apdu[0], tag_number, true, len);
len += encode_bacnet_unsigned(&apdu[len], value);
return len;
}
@@ -1319,16 +1321,21 @@ int encode_context_enumerated(
{
int len = 0; /* return value */
/* assumes that the tag only consumes 1 octet */
len = encode_bacnet_enumerated(&apdu[1], value);
/* we only reserved 1 byte for encoding the tag - check the limits */
if ((tag_number <= 14) && (len <= 4)) {
len += encode_tag(&apdu[0], tag_number, true, (uint32_t) len);
/* length of enumerated is variable, as per 20.2.11 */
if (value < 0x100) {
len = 1;
} else if (value < 0x10000) {
len = 2;
} else if (value < 0x1000000) {
len = 3;
} else {
len = 0;
len = 4;
}
return len;
len = encode_tag(&apdu[0], tag_number, true, (uint32_t) len);
len += encode_bacnet_enumerated(&apdu[len], value);
return len;
}
/* from clause 20.2.5 Encoding of a Signed Integer Value */
@@ -1435,15 +1442,20 @@ int encode_context_signed(
{
int len = 0; /* return value */
/* assumes that the tag only consumes 1 octet */
len = encode_bacnet_signed(&apdu[1], value);
/* we only reserved 1 byte for encoding the tag - check the limits */
if ((tag_number <= 14) && (len <= 4)) {
len += encode_tag(&apdu[0], tag_number, true, (uint32_t) len);
/* length of signed int is variable, as per 20.2.11 */
if ((value >= -128) && (value < 128)) {
len = 1;
} else if ((value >= -32768) && (value < 32768)) {
len = 2;
} else if ((value > -8388608) && (value < 8388608)) {
len = 3;
} else {
len = 0;
len = 4;
}
len = encode_tag(&apdu[0], tag_number, true, (uint32_t) len);
len += encode_bacnet_signed(&apdu[len], value);
return len;
}
@@ -1472,15 +1484,9 @@ int encode_context_real(
{
int len = 0;
/* assumes that the tag only consumes 1 octet */
len = encode_bacnet_real(value, &apdu[1]);
/* we only reserved 1 byte for encoding the tag - check the limits */
if (tag_number <= 14) {
len += encode_tag(&apdu[0], tag_number, true, (uint32_t) len);
} else {
len = 0;
}
/* length of double is 4 octets, as per 20.2.6 */
len = encode_tag(&apdu[0], tag_number, true, 4);
len += encode_bacnet_real(value, &apdu[len]);
return len;
}
@@ -1510,14 +1516,9 @@ int encode_context_double(
{
int len = 0;
/* assumes that the tag only consumes 1 octet */
len = encode_bacnet_double(value, &apdu[1]);
/* we only reserved 1 byte for encoding the tag - check the limits */
if (tag_number <= 14) {
len += encode_tag(&apdu[0], tag_number, true, (uint32_t) len);
} else {
len = 0;
}
/* length of double is 8 octets, as per 20.2.7 */
len = encode_tag(&apdu[0], tag_number, true, 8);
len += encode_bacnet_double(value, &apdu[len]);
return len;
}
@@ -1562,14 +1563,9 @@ int encode_context_time(
{
int len = 0; /* return value */
/* assumes that the tag only consumes 1 octet */
len = encode_bacnet_time(&apdu[1], btime);
/* we only reserved 1 byte for encoding the tag - check the limits */
if ((tag_number <= 14) && (len <= 4)) {
len += encode_tag(&apdu[0], tag_number, true, (uint32_t) len);
} else {
len = 0;
}
/* length of time is 4 octets, as per 20.2.13 */
len = encode_tag(&apdu[0], tag_number, true, 4);
len += encode_bacnet_time(&apdu[len], btime);
return len;
}
@@ -1703,14 +1699,9 @@ int encode_context_date(
{
int len = 0; /* return value */
/* assumes that the tag only consumes 1 octet */
len = encode_bacnet_date(&apdu[1], bdate);
/* we only reserved 1 byte for encoding the tag - check the limits */
if ((tag_number <= 14) && (len <= 4)) {
len += encode_tag(&apdu[0], tag_number, true, (uint32_t) len);
} else {
len = 0;
}
/* length of date is 4 octets, as per 20.2.12 */
len = encode_tag(&apdu[0], tag_number, true, 4);
len += encode_bacnet_date(&apdu[len], bdate);
return len;
}
@@ -2418,6 +2409,7 @@ void testUnsignedContextDecodes(
int inLen;
int outLen;
int outLen2;
uint8_t large_context_tag = 0xfe;
/* 32 bit number */
uint32_t in = 0xdeadbeef;
@@ -2433,7 +2425,15 @@ void testUnsignedContextDecodes(
ct_test(pTest, in == out);
ct_test(pTest, outLen2 == -1);
/* 16 bit number */
inLen = encode_context_unsigned(apdu, large_context_tag, in);
outLen = decode_context_unsigned(apdu, large_context_tag, &out);
outLen2 = decode_context_unsigned(apdu, large_context_tag-1, &out);
ct_test(pTest, inLen == outLen);
ct_test(pTest, in == out);
ct_test(pTest, outLen2 == -1);
/* 16 bit number */
in = 0xdead;
inLen = encode_context_unsigned(apdu, 10, in);
outLen = decode_context_unsigned(apdu, 10, &out);
@@ -2441,6 +2441,13 @@ void testUnsignedContextDecodes(
ct_test(pTest, inLen == outLen);
ct_test(pTest, in == out);
inLen = encode_context_unsigned(apdu, large_context_tag, in);
outLen = decode_context_unsigned(apdu, large_context_tag, &out);
outLen2 = decode_context_unsigned(apdu, large_context_tag-1, &out);
ct_test(pTest, inLen == outLen);
ct_test(pTest, in == out);
ct_test(pTest, outLen2 == -1);
/* 8 bit number */
in = 0xde;
inLen = encode_context_unsigned(apdu, 10, in);
@@ -2449,6 +2456,13 @@ void testUnsignedContextDecodes(
ct_test(pTest, inLen == outLen);
ct_test(pTest, in == out);
inLen = encode_context_unsigned(apdu, large_context_tag, in);
outLen = decode_context_unsigned(apdu, large_context_tag, &out);
outLen2 = decode_context_unsigned(apdu, large_context_tag-1, &out);
ct_test(pTest, inLen == outLen);
ct_test(pTest, in == out);
ct_test(pTest, outLen2 == -1);
/* 4 bit number */
in = 0xd;
inLen = encode_context_unsigned(apdu, 10, in);
@@ -2457,6 +2471,13 @@ void testUnsignedContextDecodes(
ct_test(pTest, inLen == outLen);
ct_test(pTest, in == out);
inLen = encode_context_unsigned(apdu, large_context_tag, in);
outLen = decode_context_unsigned(apdu, large_context_tag, &out);
outLen2 = decode_context_unsigned(apdu, large_context_tag-1, &out);
ct_test(pTest, inLen == outLen);
ct_test(pTest, in == out);
ct_test(pTest, outLen2 == -1);
/* 2 bit number */
in = 0x2;
inLen = encode_context_unsigned(apdu, 10, in);
@@ -2464,6 +2485,15 @@ void testUnsignedContextDecodes(
ct_test(pTest, inLen == outLen);
ct_test(pTest, in == out);
inLen = encode_context_unsigned(apdu, large_context_tag, in);
outLen = decode_context_unsigned(apdu, large_context_tag, &out);
outLen2 = decode_context_unsigned(apdu, large_context_tag-1, &out);
ct_test(pTest, inLen == outLen);
ct_test(pTest, in == out);
ct_test(pTest, outLen2 == -1);
}
void testSignedContextDecodes(
@@ -2473,6 +2503,8 @@ void testSignedContextDecodes(
int inLen;
int outLen;
int outLen2;
uint8_t large_context_tag = 0xfe;
/* 32 bit number */
int32_t in = 0xdeadbeef;
@@ -2488,6 +2520,14 @@ void testSignedContextDecodes(
ct_test(pTest, in == out);
ct_test(pTest, outLen2 == -1);
inLen = encode_context_signed(apdu, large_context_tag, in);
outLen = decode_context_signed(apdu, large_context_tag, &out);
outLen2 = decode_context_signed(apdu, large_context_tag-1, &out);
ct_test(pTest, inLen == outLen);
ct_test(pTest, in == out);
ct_test(pTest, outLen2 == -1);
/* 16 bit number */
in = 0xdead;
inLen = encode_context_signed(apdu, 10, in);
@@ -2496,6 +2536,14 @@ void testSignedContextDecodes(
ct_test(pTest, inLen == outLen);
ct_test(pTest, in == out);
inLen = encode_context_signed(apdu, large_context_tag, in);
outLen = decode_context_signed(apdu, large_context_tag, &out);
outLen2 = decode_context_signed(apdu, large_context_tag-1, &out);
ct_test(pTest, inLen == outLen);
ct_test(pTest, in == out);
ct_test(pTest, outLen2 == -1);
/* 8 bit number */
in = 0xde;
inLen = encode_context_signed(apdu, 10, in);
@@ -2504,6 +2552,14 @@ void testSignedContextDecodes(
ct_test(pTest, inLen == outLen);
ct_test(pTest, in == out);
inLen = encode_context_signed(apdu, large_context_tag, in);
outLen = decode_context_signed(apdu, large_context_tag, &out);
outLen2 = decode_context_signed(apdu, large_context_tag-1, &out);
ct_test(pTest, inLen == outLen);
ct_test(pTest, in == out);
ct_test(pTest, outLen2 == -1);
/* 4 bit number */
in = 0xd;
inLen = encode_context_signed(apdu, 10, in);
@@ -2512,6 +2568,14 @@ void testSignedContextDecodes(
ct_test(pTest, inLen == outLen);
ct_test(pTest, in == out);
inLen = encode_context_signed(apdu, large_context_tag, in);
outLen = decode_context_signed(apdu, large_context_tag, &out);
outLen2 = decode_context_signed(apdu, large_context_tag-1, &out);
ct_test(pTest, inLen == outLen);
ct_test(pTest, in == out);
ct_test(pTest, outLen2 == -1);
/* 2 bit number */
in = 0x2;
inLen = encode_context_signed(apdu, 10, in);
@@ -2519,6 +2583,15 @@ void testSignedContextDecodes(
ct_test(pTest, inLen == outLen);
ct_test(pTest, in == out);
inLen = encode_context_signed(apdu, large_context_tag, in);
outLen = decode_context_signed(apdu, large_context_tag, &out);
outLen2 = decode_context_signed(apdu, large_context_tag-1, &out);
ct_test(pTest, inLen == outLen);
ct_test(pTest, in == out);
ct_test(pTest, outLen2 == -1);
}
void testEnumeratedContextDecodes(
@@ -2528,6 +2601,7 @@ void testEnumeratedContextDecodes(
int inLen;
int outLen;
int outLen2;
uint8_t large_context_tag = 0xfe;
/* 32 bit number */
uint32_t in = 0xdeadbeef;
@@ -2543,6 +2617,14 @@ void testEnumeratedContextDecodes(
ct_test(pTest, in == out);
ct_test(pTest, outLen2 == -1);
inLen = encode_context_enumerated(apdu, large_context_tag, in);
outLen = decode_context_enumerated(apdu, large_context_tag, &out);
outLen2 = decode_context_enumerated(apdu, large_context_tag-1, &out);
ct_test(pTest, inLen == outLen);
ct_test(pTest, in == out);
ct_test(pTest, outLen2 == -1);
/* 16 bit number */
in = 0xdead;
inLen = encode_context_enumerated(apdu, 10, in);
@@ -2551,6 +2633,13 @@ void testEnumeratedContextDecodes(
ct_test(pTest, inLen == outLen);
ct_test(pTest, in == out);
inLen = encode_context_enumerated(apdu, large_context_tag, in);
outLen = decode_context_enumerated(apdu, large_context_tag, &out);
outLen2 = decode_context_enumerated(apdu, large_context_tag-1, &out);
ct_test(pTest, inLen == outLen);
ct_test(pTest, in == out);
ct_test(pTest, outLen2 == -1);
/* 8 bit number */
in = 0xde;
inLen = encode_context_enumerated(apdu, 10, in);
@@ -2559,6 +2648,13 @@ void testEnumeratedContextDecodes(
ct_test(pTest, inLen == outLen);
ct_test(pTest, in == out);
inLen = encode_context_enumerated(apdu, large_context_tag, in);
outLen = decode_context_enumerated(apdu, large_context_tag, &out);
outLen2 = decode_context_enumerated(apdu, large_context_tag-1, &out);
ct_test(pTest, inLen == outLen);
ct_test(pTest, in == out);
ct_test(pTest, outLen2 == -1);
/* 4 bit number */
in = 0xd;
inLen = encode_context_enumerated(apdu, 10, in);
@@ -2567,6 +2663,13 @@ void testEnumeratedContextDecodes(
ct_test(pTest, inLen == outLen);
ct_test(pTest, in == out);
inLen = encode_context_enumerated(apdu, large_context_tag, in);
outLen = decode_context_enumerated(apdu, large_context_tag, &out);
outLen2 = decode_context_enumerated(apdu, large_context_tag-1, &out);
ct_test(pTest, inLen == outLen);
ct_test(pTest, in == out);
ct_test(pTest, outLen2 == -1);
/* 2 bit number */
in = 0x2;
inLen = encode_context_enumerated(apdu, 10, in);
@@ -2574,6 +2677,14 @@ void testEnumeratedContextDecodes(
ct_test(pTest, inLen == outLen);
ct_test(pTest, in == out);
inLen = encode_context_enumerated(apdu, large_context_tag, in);
outLen = decode_context_enumerated(apdu, large_context_tag, &out);
outLen2 = decode_context_enumerated(apdu, large_context_tag-1, &out);
ct_test(pTest, inLen == outLen);
ct_test(pTest, in == out);
ct_test(pTest, outLen2 == -1);
}
void testFloatContextDecodes(
@@ -2583,6 +2694,7 @@ void testFloatContextDecodes(
int inLen;
int outLen;
int outLen2;
uint8_t large_context_tag = 0xfe;
/* 32 bit number */
float in;
@@ -2598,6 +2710,14 @@ void testFloatContextDecodes(
ct_test(pTest, in == out);
ct_test(pTest, outLen2 == -1);
inLen = encode_context_real(apdu, large_context_tag, in);
outLen = decode_context_real(apdu, large_context_tag, &out);
outLen2 = decode_context_real(apdu, large_context_tag-1, &out);
ct_test(pTest, inLen == outLen);
ct_test(pTest, in == out);
ct_test(pTest, outLen2 == -1);
in = 0.0f;
inLen = encode_context_real(apdu, 10, in);
outLen = decode_context_real(apdu, 10, &out);
@@ -2605,6 +2725,62 @@ void testFloatContextDecodes(
ct_test(pTest, inLen == outLen);
ct_test(pTest, in == out);
inLen = encode_context_real(apdu, large_context_tag, in);
outLen = decode_context_real(apdu, large_context_tag, &out);
outLen2 = decode_context_real(apdu, large_context_tag-1, &out);
ct_test(pTest, inLen == outLen);
ct_test(pTest, in == out);
ct_test(pTest, outLen2 == -1);
}
void testDoubleContextDecodes(
Test * pTest)
{
uint8_t apdu[MAX_APDU];
int inLen;
int outLen;
int outLen2;
uint8_t large_context_tag = 0xfe;
/* 64 bit number */
double in;
double out;
in = 0.1234;
inLen = encode_context_double(apdu, 10, in);
outLen = decode_context_double(apdu, 10, &out);
outLen2 = decode_context_double(apdu, 9, &out);
ct_test(pTest, inLen == outLen);
ct_test(pTest, in == out);
ct_test(pTest, outLen2 == -1);
inLen = encode_context_double(apdu, large_context_tag, in);
outLen = decode_context_double(apdu, large_context_tag, &out);
outLen2 = decode_context_double(apdu, large_context_tag-1, &out);
ct_test(pTest, inLen == outLen);
ct_test(pTest, in == out);
ct_test(pTest, outLen2 == -1);
in = 0.0;
inLen = encode_context_double(apdu, 10, in);
outLen = decode_context_double(apdu, 10, &out);
outLen2 = decode_context_double(apdu, 9, &out);
ct_test(pTest, inLen == outLen);
ct_test(pTest, in == out);
inLen = encode_context_double(apdu, large_context_tag, in);
outLen = decode_context_double(apdu, large_context_tag, &out);
outLen2 = decode_context_double(apdu, large_context_tag-1, &out);
ct_test(pTest, inLen == outLen);
ct_test(pTest, in == out);
ct_test(pTest, outLen2 == -1);
}
static void testObjectIDContextDecodes(
@@ -2614,6 +2790,7 @@ static void testObjectIDContextDecodes(
int inLen;
int outLen;
int outLen2;
uint8_t large_context_tag = 0xfe;
/* 32 bit number */
uint16_t in_type;
@@ -2634,6 +2811,14 @@ static void testObjectIDContextDecodes(
ct_test(pTest, in_id == out_id);
ct_test(pTest, outLen2 == -1);
inLen = encode_context_object_id(apdu, large_context_tag, in_type, in_id);
outLen = decode_context_object_id(apdu, large_context_tag, &out_type, &out_id);
outLen2 = decode_context_object_id(apdu, large_context_tag-1, &out_type, &out_id);
ct_test(pTest, inLen == outLen);
ct_test(pTest, in_type == out_type);
ct_test(pTest, in_id == out_id);
ct_test(pTest, outLen2 == -1);
}
static void testCharacterStringContextDecodes(
@@ -2643,6 +2828,8 @@ static void testCharacterStringContextDecodes(
int inLen;
int outLen;
int outLen2;
uint8_t large_context_tag = 0xfe;
BACNET_CHARACTER_STRING in;
BACNET_CHARACTER_STRING out;
@@ -2658,6 +2845,16 @@ static void testCharacterStringContextDecodes(
ct_test(pTest, in.length == out.length);
ct_test(pTest, in.encoding == out.encoding);
ct_test(pTest, strcmp(in.value, out.value) == 0);
inLen = encode_context_character_string(apdu, large_context_tag, &in);
outLen = decode_context_character_string(apdu, large_context_tag, &out);
outLen2 = decode_context_character_string(apdu, large_context_tag-1, &out);
ct_test(pTest, outLen2 == -1);
ct_test(pTest, inLen == outLen);
ct_test(pTest, in.length == out.length);
ct_test(pTest, in.encoding == out.encoding);
ct_test(pTest, strcmp(in.value, out.value) == 0);
}
void testBitStringContextDecodes(
@@ -2667,6 +2864,7 @@ void testBitStringContextDecodes(
int inLen;
int outLen;
int outLen2;
uint8_t large_context_tag = 0xfe;
BACNET_BIT_STRING in;
BACNET_BIT_STRING out;
@@ -2688,6 +2886,14 @@ void testBitStringContextDecodes(
ct_test(pTest, in.bits_used == out.bits_used);
ct_test(pTest, memcmp(in.value, out.value, MAX_BITSTRING_BYTES) == 0);
inLen = encode_context_bitstring(apdu, large_context_tag, &in);
outLen = decode_context_bitstring(apdu, large_context_tag, &out);
outLen2 = decode_context_bitstring(apdu, large_context_tag-1, &out);
ct_test(pTest, outLen2 == -1);
ct_test(pTest, inLen == outLen);
ct_test(pTest, in.bits_used == out.bits_used);
ct_test(pTest, memcmp(in.value, out.value, MAX_BITSTRING_BYTES) == 0);
}
void testOctetStringContextDecodes(
@@ -2697,6 +2903,8 @@ void testOctetStringContextDecodes(
int inLen;
int outLen;
int outLen2;
uint8_t large_context_tag = 0xfe;
BACNET_OCTET_STRING in;
BACNET_OCTET_STRING out;
@@ -2713,6 +2921,16 @@ void testOctetStringContextDecodes(
ct_test(pTest, inLen == outLen);
ct_test(pTest, in.length == out.length);
ct_test(pTest, octetstring_value_same(&in, &out));
inLen = encode_context_octet_string(apdu, large_context_tag, &in);
outLen = decode_context_octet_string(apdu, large_context_tag, &out);
outLen2 = decode_context_octet_string(apdu, large_context_tag-1, &out);
ct_test(pTest, outLen2 == -1);
ct_test(pTest, inLen == outLen);
ct_test(pTest, in.length == out.length);
ct_test(pTest, octetstring_value_same(&in, &out));
}
void testTimeContextDecodes(
@@ -2722,6 +2940,7 @@ void testTimeContextDecodes(
int inLen;
int outLen;
int outLen2;
uint8_t large_context_tag = 0xfe;
BACNET_TIME in;
BACNET_TIME out;
@@ -2741,6 +2960,19 @@ void testTimeContextDecodes(
ct_test(pTest, in.hundredths == out.hundredths);
ct_test(pTest, in.min == out.min);
ct_test(pTest, in.sec == out.sec);
inLen = encode_context_time(apdu, large_context_tag, &in);
outLen = decode_context_bacnet_time(apdu, large_context_tag, &out);
outLen2 = decode_context_bacnet_time(apdu, large_context_tag-1, &out);
ct_test(pTest, outLen2 == -1);
ct_test(pTest, inLen == outLen);
ct_test(pTest, in.hour == out.hour);
ct_test(pTest, in.hundredths == out.hundredths);
ct_test(pTest, in.min == out.min);
ct_test(pTest, in.sec == out.sec);
}
void testDateContextDecodes(
@@ -2750,6 +2982,8 @@ void testDateContextDecodes(
int inLen;
int outLen;
int outLen2;
uint8_t large_context_tag = 0xfe;
BACNET_DATE in;
BACNET_DATE out;
@@ -2763,11 +2997,22 @@ void testDateContextDecodes(
outLen = decode_context_date(apdu, 10, &out);
outLen2 = decode_context_date(apdu, 9, &out);
ct_test(pTest, outLen2 == -1);
ct_test(pTest, outLen2 == -1);
ct_test(pTest, inLen == outLen);
ct_test(pTest, in.day == out.day);
ct_test(pTest, in.month == out.month);
ct_test(pTest, in.wday == out.wday);
ct_test(pTest, in.year == out.year);
/* Test large tags */
inLen = encode_context_date(apdu, large_context_tag, &in);
outLen = decode_context_date(apdu, large_context_tag, &out);
outLen2 = decode_context_date(apdu, large_context_tag-1, &out);
ct_test(pTest, inLen == outLen);
ct_test(pTest, in.day == out.day);
ct_test(pTest, in.month == out.month);
ct_test(pTest, in.wday == out.wday);
ct_test(pTest, in.year == out.year);
}
@@ -2779,7 +3024,7 @@ int main(
Test *pTest;
bool rc;
pTest = ct_create("BACDCode", NULL);
pTest = ct_create("BACDCode", NULL);
/* individual tests */
rc = ct_addTestFunction(pTest, testBACDCodeTags);
assert(rc);
@@ -2821,6 +3066,9 @@ int main(
rc = ct_addTestFunction(pTest, testFloatContextDecodes);
assert(rc);
rc = ct_addTestFunction(pTest, testDoubleContextDecodes);
assert(rc);
rc = ct_addTestFunction(pTest, testObjectIDContextDecodes);
assert(rc);
+19
View File
@@ -40,6 +40,7 @@
#include "bits.h"
#include "bacstr.h"
#include "bacint.h"
#include "bacreal.h"
/* NOTE: byte order plays a role in decoding multibyte values */
/* http://www.unixpapa.com/incnote/byteorder.html */
@@ -227,6 +228,24 @@ int encode_bacnet_double(
return 8;
}
int decode_context_double(
uint8_t * apdu,
uint8_t tag_number,
double *double_value)
{
uint32_t len_value;
int len = 0;
if (decode_is_context_tag(&apdu[len], tag_number)) {
len +=
decode_tag_number_and_value(&apdu[len], &tag_number, &len_value);
len += decode_double(&apdu[len], double_value);
} else {
len = -1;
}
return len;
}
/* end of decoding_encoding.c */
#ifdef TEST
#include <assert.h>