diff --git a/bacnet-stack/datetime.c b/bacnet-stack/datetime.c index 50812b50..14226fa6 100644 --- a/bacnet-stack/datetime.c +++ b/bacnet-stack/datetime.c @@ -354,18 +354,32 @@ bool datetime_wildcard(BACNET_DATE_TIME * bdatetime) return wildcard_present; } + +void datetime_date_wildcard_set(BACNET_DATE * bdate) +{ + if (bdate) { + bdate->year = 1900 + 0xFF; + bdate->month = 0xFF; + bdate->day = 0xFF; + bdate->wday = 0xFF; + } +} + +void datetime_time_wildcard_set(BACNET_TIME * btime) +{ + if (btime) { + btime->hour = 0xFF; + btime->min = 0xFF; + btime->sec = 0xFF; + btime->hundredths = 0xFF; + } +} void datetime_wildcard_set(BACNET_DATE_TIME * bdatetime) { if (bdatetime) { - bdatetime->date.year = 1900 + 0xFF; - bdatetime->date.month = 0xFF; - bdatetime->date.day = 0xFF; - bdatetime->date.wday = 0xFF; - bdatetime->time.hour = 0xFF; - bdatetime->time.min = 0xFF; - bdatetime->time.sec = 0xFF; - bdatetime->time.hundredths = 0xFF; + datetime_date_wildcard_set(&bdatetime->date); + datetime_time_wildcard_set(&bdatetime->time); } } diff --git a/bacnet-stack/datetime.h b/bacnet-stack/datetime.h index c2145b6c..dc3f7fcf 100644 --- a/bacnet-stack/datetime.h +++ b/bacnet-stack/datetime.h @@ -104,7 +104,9 @@ extern "C" { /* date and time wildcards */ bool datetime_wildcard(BACNET_DATE_TIME * bdatetime); - void datetime_wildcard_set(BACNET_DATE_TIME * bdatetime); + void datetime_wildcard_set(BACNET_DATE_TIME * bdatetime); + void datetime_date_wildcard_set(BACNET_DATE * bdate); + void datetime_time_wildcard_set(BACNET_TIME * btime); #ifdef __cplusplus } diff --git a/bacnet-stack/demo/handler/s_wp.c b/bacnet-stack/demo/handler/s_wp.c index 7643289a..9d7e7ec8 100644 --- a/bacnet-stack/demo/handler/s_wp.c +++ b/bacnet-stack/demo/handler/s_wp.c @@ -130,6 +130,12 @@ uint8_t Send_Write_Property_Request(uint32_t device_id, int apdu_len = 0, len = 0; while (object_value) { +#if PRINT_ENABLED_DEBUG + fprintf(stderr, "WriteProperty service: " + "%s tag=%d\n", + (object_value->context_specific?"context":"application"), + (int)(object_value->context_specific?object_value->context_tag:object_value->tag) ); +#endif len = bacapp_encode_data(&application_data[apdu_len], object_value); if ((len + apdu_len) < MAX_APDU) { diff --git a/bacnet-stack/demo/object/lc.c b/bacnet-stack/demo/object/lc.c index 5defd857..7521d276 100644 --- a/bacnet-stack/demo/object/lc.c +++ b/bacnet-stack/demo/object/lc.c @@ -390,9 +390,15 @@ void Load_Control_State_Machine(int object_index) { unsigned i = 0; /* loop counter */ int diff = 0; /* used for datetime comparison */ - + + /* is the state machine enabled? */ + if (!Load_Control_Enable[object_index]) { + Load_Control_State[object_index] = SHED_INACTIVE; + return; + } + switch (Load_Control_State[object_index]) { - case SHED_REQUEST_PENDING: + case SHED_REQUEST_PENDING: if (Load_Control_Request_Written[object_index]) { Load_Control_Request_Written[object_index] = false; } @@ -432,7 +438,6 @@ void Load_Control_State_Machine(int object_index) break; } /* cancel because current time is after start time + duration? */ - Update_Current_Time(&Current_Time); datetime_copy(&End_Time[object_index], &Start_Time[object_index]); datetime_add_minutes(&End_Time[object_index], Shed_Duration[object_index]); @@ -479,7 +484,6 @@ void Load_Control_State_Machine(int object_index) } break; case SHED_NON_COMPLIANT: - Update_Current_Time(&Current_Time); datetime_copy(&End_Time[object_index], &Start_Time[object_index]); datetime_add_minutes(&End_Time[object_index], Shed_Duration[object_index]); @@ -516,7 +520,6 @@ void Load_Control_State_Machine(int object_index) } break; case SHED_COMPLIANT: - Update_Current_Time(&Current_Time); datetime_copy(&End_Time[object_index], &Start_Time[object_index]); datetime_add_minutes(&End_Time[object_index], Shed_Duration[object_index]); @@ -582,6 +585,7 @@ void Load_Control_State_Machine_Handler(void) Load_Control_State_Previously[i] = SHED_INACTIVE; } } + Update_Current_Time(&Current_Time); for (i = 0; i < MAX_LOAD_CONTROLS; i++) { Load_Control_State_Machine(i); if (Load_Control_State[i] != Load_Control_State_Previously[i]) { @@ -956,16 +960,75 @@ bool Load_Control_Write_Property(BACNET_WRITE_PROPERTY_DATA * wp_data, void testLoadControlStateMachine(Test * pTest) { - unsigned i = 0, j = 0; + unsigned i = 0, j = 0; + bool status = false; + BACNET_APPLICATION_DATA_VALUE value; + BACNET_WRITE_PROPERTY_DATA wp_data; + BACNET_ERROR_CLASS error_class; + BACNET_ERROR_CODE error_code; + int len = 0; Load_Control_Init(); /* validate the triggers for each state change */ for (j = 0; j < 20; j++) { - Load_Control_State_Machine_Handler(); + Load_Control_State_Machine(0); for (i = 0; i < MAX_LOAD_CONTROLS; i++) { ct_test(pTest, Load_Control_State[i] == SHED_INACTIVE); } - } + } + /* SHED_REQUEST_PENDING */ + wp_data.object_type = OBJECT_LOAD_CONTROL; + wp_data.object_instance = 0; + wp_data.array_index = BACNET_ARRAY_ALL; + wp_data.priority = BACNET_NO_PRIORITY; + /* Set Enable=TRUE */ + wp_data.object_property = PROP_ENABLE; + value.context_specific = false; + value.context_tag = 0; + value.tag = BACNET_APPLICATION_TAG_BOOLEAN; + value.type.Boolean = true; + wp_data.application_data_len = + bacapp_encode_data(&wp_data.application_data[0], &value); + ct_test(pTest, wp_data.application_data_len > 0); + status = Load_Control_Write_Property(&wp_data, + &error_class, &error_code); + ct_test(pTest, status == true); + /* Set Shed_Duration=60 */ + wp_data.object_property = PROP_SHED_DURATION; + value.context_specific = false; + value.context_tag = 0; + value.tag = BACNET_APPLICATION_TAG_UNSIGNED_INT; + value.type.Unsigned_Int = 60; + wp_data.application_data_len = + bacapp_encode_data(&wp_data.application_data[0], &value); + ct_test(pTest, wp_data.application_data_len > 0); + status = Load_Control_Write_Property(&wp_data, + &error_class, &error_code); + ct_test(pTest, status == true); + /* Set Start_Time=wildcards */ + wp_data.object_property = PROP_START_TIME; + value.context_specific = false; + value.context_tag = 0; + value.tag = BACNET_APPLICATION_TAG_DATE; + datetime_date_wildcard_set(&value.type.Date); + wp_data.application_data_len = + bacapp_encode_data(&wp_data.application_data[0], &value); + ct_test(pTest, wp_data.application_data_len > 0); + len = wp_data.application_data_len; + value.tag = BACNET_APPLICATION_TAG_TIME; + datetime_time_wildcard_set(&value.type.Time); + wp_data.application_data_len = + bacapp_encode_data(&wp_data.application_data[len], &value); + ct_test(pTest, wp_data.application_data_len > 0); + wp_data.application_data_len += len; + status = Load_Control_Write_Property(&wp_data, + &error_class, &error_code); + ct_test(pTest, status == true); + /* run the state machine */ + Load_Control_State_Machine(0); + ct_test(pTest, Load_Control_State[i] == SHED_REQUEST_PENDING); + Load_Control_State_Machine(0); + ct_test(pTest, Load_Control_State[i] == SHED_INACTIVE); } void testLoadControl(Test * pTest) diff --git a/bacnet-stack/demo/object/lc.ide b/bacnet-stack/demo/object/lc.ide index 682eafcb..2992dfd6 100644 Binary files a/bacnet-stack/demo/object/lc.ide and b/bacnet-stack/demo/object/lc.ide differ