Feature/basic-schedule-object-write-properties (#1000)

* Added schedule object WriteProperty handling for effective-period, list-of-object-property-references and exception-schedule properties.
This commit is contained in:
Steve Karg
2025-05-20 15:04:14 -05:00
committed by GitHub
parent b5b2fd5b7b
commit 524fd162f9
9 changed files with 656 additions and 11 deletions
+78 -8
View File
@@ -28,30 +28,100 @@ static void testSchedule(void)
unsigned count = 0;
uint32_t object_instance = 0;
const int skip_fail_property_list[] = { -1 };
BACNET_DAILY_SCHEDULE *daily_schedule;
size_t tv = 0, day = 0;
BACNET_DAILY_SCHEDULE daily_schedule = { 0 }, *test_daily_schedule;
BACNET_SPECIAL_EVENT special_event = { 0 }, *test_special_event;
BACNET_DEVICE_OBJECT_PROPERTY_REFERENCE object_property_reference = { 0 },
test_object_property_reference = {
0
};
BACNET_DATE start_date = { 2023, 1, 1, 0 }, test_start_date = { 0 };
BACNET_DATE end_date = { 2023, 12, 31, 0 }, test_end_date = { 0 };
BACNET_TIME time_of_day = { 0 };
size_t tv = 0, day = 0, i = 0;
int diff;
bool status = false;
Schedule_Init();
count = Schedule_Count();
zassert_true(count > 0, NULL);
object_instance = Schedule_Index_To_Instance(0);
status = Schedule_Valid_Instance(object_instance);
zassert_true(status, NULL);
/* fill the weekly schedule with some data */
for (day = 0; day < BACNET_WEEKLY_SCHEDULE_SIZE; day++) {
daily_schedule = Schedule_Weekly_Schedule(object_instance, day);
daily_schedule->TV_Count = BACNET_DAILY_SCHEDULE_TIME_VALUES_SIZE;
for (tv = 0; tv < daily_schedule->TV_Count; tv++) {
daily_schedule.TV_Count = BACNET_DAILY_SCHEDULE_TIME_VALUES_SIZE;
for (tv = 0; tv < daily_schedule.TV_Count; tv++) {
datetime_set_time(
&daily_schedule->Time_Values[tv].Time, tv % 24, 0, 0, 0);
daily_schedule->Time_Values[tv].Value.tag =
&daily_schedule.Time_Values[tv].Time, tv % 24, 0, 0, 0);
daily_schedule.Time_Values[tv].Value.tag =
BACNET_APPLICATION_TAG_REAL;
daily_schedule->Time_Values[tv].Value.type.Real = 1.0f + tv;
daily_schedule.Time_Values[tv].Value.type.Real = 1.0f + tv;
}
Schedule_Weekly_Schedule_Set(object_instance, day, &daily_schedule);
test_daily_schedule = Schedule_Weekly_Schedule(object_instance, day);
status =
bacnet_dailyschedule_same(&daily_schedule, test_daily_schedule);
zassert_true(status, NULL);
}
for (i = 0; i < BACNET_EXCEPTION_SCHEDULE_SIZE; i++) {
special_event.periodTag = BACNET_SPECIAL_EVENT_PERIOD_CALENDAR_ENTRY;
special_event.timeValues.TV_Count =
BACNET_DAILY_SCHEDULE_TIME_VALUES_SIZE;
for (tv = 0; tv < special_event.timeValues.TV_Count; tv++) {
datetime_set_time(
&special_event.timeValues.Time_Values[tv].Time, tv % 24, 0, 0,
0);
special_event.timeValues.Time_Values[tv].Value.tag =
BACNET_APPLICATION_TAG_REAL;
special_event.timeValues.Time_Values[tv].Value.type.Real =
1.0f + tv;
special_event.priority = tv % (BACNET_MAX_PRIORITY + 1);
}
Schedule_Exception_Schedule_Set(object_instance, i, &special_event);
test_special_event = Schedule_Exception_Schedule(object_instance, i);
status = bacnet_special_event_same(&special_event, test_special_event);
zassert_true(status, NULL);
}
/* fill the object property reference with some data */
for (i = 0; i <
Schedule_List_Of_Object_Property_References_Capacity(object_instance);
i++) {
object_property_reference.objectIdentifier.type = OBJECT_ANALOG_VALUE;
object_property_reference.objectIdentifier.instance = i + 1;
object_property_reference.propertyIdentifier = PROP_PRESENT_VALUE;
object_property_reference.arrayIndex = BACNET_ARRAY_ALL;
Schedule_List_Of_Object_Property_References_Set(
object_instance, i, &object_property_reference);
Schedule_List_Of_Object_Property_References(
object_instance, i, &test_object_property_reference);
status = bacnet_device_object_property_reference_same(
&object_property_reference, &test_object_property_reference);
zassert_true(status, NULL);
}
status =
Schedule_Effective_Period_Set(object_instance, &start_date, &end_date);
zassert_true(status, NULL);
status = Schedule_Effective_Period(
object_instance, &test_start_date, &test_end_date);
zassert_true(status, NULL);
diff = datetime_compare_date(&start_date, &test_start_date);
zassert_equal(diff, 0, NULL);
diff = datetime_compare_date(&end_date, &test_end_date);
zassert_equal(diff, 0, NULL);
status = Schedule_In_Effective_Period(
Schedule_Object(object_instance), &start_date);
zassert_true(status, NULL);
status = Schedule_In_Effective_Period(
Schedule_Object(object_instance), &end_date);
zassert_true(status, NULL);
/* general purpose test */
bacnet_object_properties_read_write_test(
OBJECT_SCHEDULE, object_instance, Schedule_Property_Lists,
Schedule_Read_Property, Schedule_Write_Property,
skip_fail_property_list);
Schedule_Recalculate_PV(
Schedule_Object(object_instance), BACNET_WEEKDAY_SUNDAY, &time_of_day);
}
/**
* @}