diff --git a/bacnet-stack/datetime.c b/bacnet-stack/datetime.c index a324b57b..14339c8c 100644 --- a/bacnet-stack/datetime.c +++ b/bacnet-stack/datetime.c @@ -43,7 +43,14 @@ /* year = years since 1900 */ /* month 1=Jan */ /* day = day of month 1..31 */ -/* wday 1=Monday...7=Sunday */ +/* wday 1=Monday...7=Sunday */ + +/* Wildcards: + A value of X'FF' in any of the four octets + shall indicate that the value is unspecified. + If all four octets = X'FF', the corresponding + time or date may be interpreted as "any" or "don't care" +*/ static bool is_leap_year(uint16_t year) { @@ -327,12 +334,61 @@ void datetime_add_minutes(BACNET_DATE_TIME * bdatetime, uint32_t minutes) bdatetime->date.wday = day_of_week(bdatetime->date.year, bdatetime->date.month, bdatetime->date.day); } + +bool datetime_wildcard(BACNET_DATE_TIME * bdatetime) +{ + bool wildcard_present = false; + + if (bdatetime) { + if ((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)) { + wildcard_present = true; + } + } + + return wildcard_present; +} + +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; + } +} + #ifdef TEST #include #include #include "ctest.h" +void testBACnetDateTimeWildcard(Test * pTest) +{ + BACNET_DATE_TIME bdatetime; + bool status = false; + + datetime_set_values(&bdatetime, 1900, 1, 1, 0, 0, 0, 0); + status = datetime_wildcard(&bdatetime); + ct_test(pTest, status == false); + + datetime_wildcard_set(&bdatetime); + status = datetime_wildcard(&bdatetime); + ct_test(pTest, status == true); +} + void testBACnetDateTimeAdd(Test * pTest) { BACNET_DATE_TIME bdatetime, test_bdatetime; @@ -642,7 +698,9 @@ int main(void) rc = ct_addTestFunction(pTest, testBACnetDateTimeSeconds); assert(rc); rc = ct_addTestFunction(pTest, testBACnetDateTimeAdd); - assert(rc); + assert(rc); + rc = ct_addTestFunction(pTest, testBACnetDateTimeWildcard); + assert(rc); ct_setStream(pTest, stdout); ct_run(pTest); diff --git a/bacnet-stack/datetime.h b/bacnet-stack/datetime.h index 8cb86c4e..d293073d 100644 --- a/bacnet-stack/datetime.h +++ b/bacnet-stack/datetime.h @@ -90,8 +90,12 @@ extern "C" { /* utility add function */ void datetime_add_minutes(BACNET_DATE_TIME * bdatetime, - uint32_t minutes); - + uint32_t minutes); + + /* date and time wildcards */ + bool datetime_wildcard(BACNET_DATE_TIME * bdatetime); + void datetime_wildcard_set(BACNET_DATE_TIME * bdatetime); + #ifdef __cplusplus } #endif /* __cplusplus */ diff --git a/bacnet-stack/datetime.ide b/bacnet-stack/datetime.ide index cd384851..89b2b3f7 100644 Binary files a/bacnet-stack/datetime.ide and b/bacnet-stack/datetime.ide differ