From f9a03866141ce15479dc1063564766ca8d261ce2 Mon Sep 17 00:00:00 2001 From: GauiStori Date: Thu, 19 Feb 2026 22:03:52 +0100 Subject: [PATCH] Schedule sets the correct value but only in the schedule object. References are not set yet. (#1236) Add device_moc.c to tests cmake. Thanks Steve --- src/bacnet/basic/object/device.c | 2 +- src/bacnet/basic/object/schedule.c | 58 ++++++++++++++----- src/bacnet/basic/object/schedule.h | 3 + .../basic/object/schedule/CMakeLists.txt | 1 + 4 files changed, 49 insertions(+), 15 deletions(-) diff --git a/src/bacnet/basic/object/device.c b/src/bacnet/basic/object/device.c index 9d9250ca..539a2bcc 100644 --- a/src/bacnet/basic/object/device.c +++ b/src/bacnet/basic/object/device.c @@ -406,7 +406,7 @@ static object_functions_t My_Object_Table[] = { NULL /* Value_Lists */, NULL /* COV */, NULL /* COV Clear */, NULL /* Intrinsic Reporting */, NULL /* Add_List_Element */, NULL /* Remove_List_Element */, NULL /* Create */, NULL /* Delete */, - NULL /* Timer */, Schedule_Writable_Property_List }, + Schedule_Timer /* Timer */, Schedule_Writable_Property_List }, { OBJECT_STRUCTURED_VIEW, Structured_View_Init, Structured_View_Count, Structured_View_Index_To_Instance, Structured_View_Valid_Instance, Structured_View_Object_Name, Structured_View_Read_Property, diff --git a/src/bacnet/basic/object/schedule.c b/src/bacnet/basic/object/schedule.c index e180928f..9d8742a7 100644 --- a/src/bacnet/basic/object/schedule.c +++ b/src/bacnet/basic/object/schedule.c @@ -16,9 +16,11 @@ #include "bacnet/timestamp.h" #include "bacnet/basic/services.h" #include "bacnet/basic/sys/debug.h" -#include "bacnet/basic/object/device.h" +#include "bacnet/basic/object/device.h" /* me */ #include "bacnet/basic/object/schedule.h" +#define UNUSED(v) (void)(v) + #ifndef MAX_SCHEDULES #define MAX_SCHEDULES 4 #endif @@ -1027,30 +1029,58 @@ bool Schedule_In_Effective_Period( void Schedule_Recalculate_PV( SCHEDULE_DESCR *desc, BACNET_WEEKDAY wday, const BACNET_TIME *time) { - int i; + int i, current, diff; + BACNET_TIME *tmptime; desc->Present_Value.tag = BACNET_APPLICATION_TAG_NULL; /* for future development, here should be the loop for Exception Schedule */ /* Note to developers: please ping Edward at info@connect-ex.com for a more complete schedule object implementation. */ - for (i = 0; i < desc->Weekly_Schedule[wday - 1].TV_Count && - desc->Present_Value.tag == BACNET_APPLICATION_TAG_NULL; - i++) { - int diff = datetime_wildcard_compare_time( + current = -1; + tmptime = NULL; + for (i = 0; i < desc->Weekly_Schedule[wday - 1].TV_Count; i++) { + diff = datetime_wildcard_compare_time( time, &desc->Weekly_Schedule[wday - 1].Time_Values[i].Time); - if (diff >= 0 && - desc->Weekly_Schedule[wday - 1].Time_Values[i].Value.tag != - BACNET_APPLICATION_TAG_NULL) { - bacnet_primitive_to_application_data_value( - &desc->Present_Value, - &desc->Weekly_Schedule[wday - 1].Time_Values[i].Value); + if (diff >= 0) { + if (tmptime == NULL) { + tmptime = &desc->Weekly_Schedule[wday - 1].Time_Values[i].Time; + current = i; + } else { + diff = datetime_wildcard_compare_time( + &desc->Weekly_Schedule[wday - 1].Time_Values[i].Time, + tmptime); + if (diff >= 0) { + tmptime = + &desc->Weekly_Schedule[wday - 1].Time_Values[i].Time; + current = i; + } + } } } - - if (desc->Present_Value.tag == BACNET_APPLICATION_TAG_NULL) { + if (current >= 0) { + bacnet_primitive_to_application_data_value( + &desc->Present_Value, + &desc->Weekly_Schedule[wday - 1].Time_Values[current].Value); + } else { memcpy( &desc->Present_Value, &desc->Schedule_Default, sizeof(desc->Present_Value)); } } + +/** + * @brief Updates the Present Value of the Schedule object + * @param object_instance - object-instance number of the object + * @param milliseconds - Unused parameter + */ +void Schedule_Timer(uint32_t object_instance, uint16_t milliseconds) +{ + BACNET_DATE_TIME bdatetime; + UNUSED(milliseconds); + + Device_getCurrentDateTime(&bdatetime); + + Schedule_Recalculate_PV( + Schedule_Object(object_instance), bdatetime.date.wday, &bdatetime.time); +} diff --git a/src/bacnet/basic/object/schedule.h b/src/bacnet/basic/object/schedule.h index 3880be65..855456b4 100644 --- a/src/bacnet/basic/object/schedule.h +++ b/src/bacnet/basic/object/schedule.h @@ -147,6 +147,9 @@ BACNET_STACK_EXPORT void Schedule_Recalculate_PV( SCHEDULE_DESCR *desc, BACNET_WEEKDAY wday, const BACNET_TIME *time); +BACNET_STACK_EXPORT +void Schedule_Timer(uint32_t object_instance, uint16_t milliseconds); + #ifdef __cplusplus } #endif /* __cplusplus */ diff --git a/test/bacnet/basic/object/schedule/CMakeLists.txt b/test/bacnet/basic/object/schedule/CMakeLists.txt index 8577590f..c1575f7f 100644 --- a/test/bacnet/basic/object/schedule/CMakeLists.txt +++ b/test/bacnet/basic/object/schedule/CMakeLists.txt @@ -69,6 +69,7 @@ add_executable(${PROJECT_NAME} # Test and test library files ./src/main.c ${TST_DIR}/bacnet/basic/object/test/property_test.c + ${TST_DIR}/bacnet/basic/object/test/device_mock.c ${ZTST_DIR}/ztest_mock.c ${ZTST_DIR}/ztest.c )