Changed infinite DeviceCommunicationControl timeout value back to zero. Bug found by unit test.

This commit is contained in:
skarg
2012-05-12 14:42:57 +00:00
parent 287fce78be
commit d0038e6456
+20 -9
View File
@@ -43,6 +43,7 @@
over a power cycle or reinitialization. */ over a power cycle or reinitialization. */
/* note: time duration is given in Minutes, but in order to be accurate, /* note: time duration is given in Minutes, but in order to be accurate,
we need to count down in seconds. */ we need to count down in seconds. */
/* infinite time duration is defined as 0 */
static uint32_t DCC_Time_Duration_Seconds = 0; static uint32_t DCC_Time_Duration_Seconds = 0;
static BACNET_COMMUNICATION_ENABLE_DISABLE DCC_Enable_Disable = static BACNET_COMMUNICATION_ENABLE_DISABLE DCC_Enable_Disable =
COMMUNICATION_ENABLE; COMMUNICATION_ENABLE;
@@ -84,6 +85,7 @@ bool dcc_communication_initiation_disabled(
return (DCC_Enable_Disable == COMMUNICATION_DISABLE_INITIATION); return (DCC_Enable_Disable == COMMUNICATION_DISABLE_INITIATION);
} }
/* note: 0 indicates either expired, or infinite duration */
uint32_t dcc_duration_seconds( uint32_t dcc_duration_seconds(
void) void)
{ {
@@ -115,10 +117,11 @@ bool dcc_set_status_duration(
/* valid? */ /* valid? */
if (status < MAX_BACNET_COMMUNICATION_ENABLE_DISABLE) { if (status < MAX_BACNET_COMMUNICATION_ENABLE_DISABLE) {
DCC_Enable_Disable = status; DCC_Enable_Disable = status;
if (status == COMMUNICATION_ENABLE) if (status == COMMUNICATION_ENABLE) {
DCC_Time_Duration_Seconds = 0; DCC_Time_Duration_Seconds = 0;
else } else {
DCC_Time_Duration_Seconds = minutes * 60; DCC_Time_Duration_Seconds = minutes * 60;
}
valid = true; valid = true;
} }
@@ -186,30 +189,38 @@ int dcc_decode_service_request(
decode_tag_number_and_value(&apdu[len], &tag_number, decode_tag_number_and_value(&apdu[len], &tag_number,
&len_value_type); &len_value_type);
len += decode_unsigned(&apdu[len], len_value_type, &value32); len += decode_unsigned(&apdu[len], len_value_type, &value32);
if (timeDuration) if (timeDuration) {
*timeDuration = (uint16_t) value32; *timeDuration = (uint16_t) value32;
} else if (timeDuration) }
*timeDuration = 0xFFFF; /* As big as we can make it: 2.99 years */ } else if (timeDuration) {
/* zero indicates infinite duration and
results in no timeout */
*timeDuration = 0;
}
/* Tag 1: enable_disable */ /* Tag 1: enable_disable */
if (!decode_is_context_tag(&apdu[len], 1)) if (!decode_is_context_tag(&apdu[len], 1)) {
return -1; return -1;
}
len += len +=
decode_tag_number_and_value(&apdu[len], &tag_number, decode_tag_number_and_value(&apdu[len], &tag_number,
&len_value_type); &len_value_type);
len += decode_enumerated(&apdu[len], len_value_type, &value32); len += decode_enumerated(&apdu[len], len_value_type, &value32);
if (enable_disable) if (enable_disable) {
*enable_disable = (BACNET_COMMUNICATION_ENABLE_DISABLE) value32; *enable_disable = (BACNET_COMMUNICATION_ENABLE_DISABLE) value32;
}
/* Tag 2: password --optional-- */ /* Tag 2: password --optional-- */
if (len < apdu_len) { if (len < apdu_len) {
if (!decode_is_context_tag(&apdu[len], 2)) if (!decode_is_context_tag(&apdu[len], 2)) {
return -1; return -1;
}
len += len +=
decode_tag_number_and_value(&apdu[len], &tag_number, decode_tag_number_and_value(&apdu[len], &tag_number,
&len_value_type); &len_value_type);
len += len +=
decode_character_string(&apdu[len], len_value_type, password); decode_character_string(&apdu[len], len_value_type, password);
} else if (password) } else if (password) {
characterstring_init_ansi(password, NULL); characterstring_init_ansi(password, NULL);
}
} }
return (int) len; return (int) len;