Merged revision(s) 2826 from branches/releases/bacnet-stack-0-8-0:

Expose some datetime internal functions in the API.
........
This commit is contained in:
skarg
2015-06-28 13:14:48 +00:00
parent bd7da666d9
commit fad91ca9ce
2 changed files with 118 additions and 6 deletions
+6
View File
@@ -101,6 +101,12 @@ extern "C" {
void datetime_days_since_epoch_into_date(
uint32_t days,
BACNET_DATE * bdate);
uint32_t datetime_day_of_year(
BACNET_DATE *bdate);
void datetime_day_of_year_into_date(
uint32_t days,
uint16_t year,
BACNET_DATE *bdate);
bool datetime_is_leap_year(
uint16_t year);
uint8_t datetime_month_days(
+112 -6
View File
@@ -113,6 +113,74 @@ bool datetime_date_is_valid(
return status;
}
static uint32_t day_of_year(
uint16_t year,
uint8_t month,
uint8_t day)
{
uint32_t days = 0; /* return value */
uint8_t months = 0; /* loop counter for months */
if (datetime_ymd_is_valid(year, month, day)) {
for (months = 1; months < month; months++) {
days += datetime_month_days(year, months);
}
days += day;
}
return (days);
}
void day_of_year_into_md(
uint32_t days,
uint16_t year,
uint8_t * pMonth,
uint8_t * pDay)
{
uint8_t month = 1;
uint8_t day = 0;
while (days > (uint32_t) datetime_month_days(year, month)) {
days -= datetime_month_days(year, month);
month++;
}
day = (uint8_t) (day + days);
if (pMonth) {
*pMonth = month;
}
if (pDay) {
*pDay = day;
}
return;
}
void datetime_day_of_year_into_date(
uint32_t days,
uint16_t year,
BACNET_DATE *bdate)
{
uint8_t month = 0;
uint8_t day = 0;
day_of_year_into_md(days, year, &month, &day);
datetime_set_date(bdate, year, month, day);
}
uint32_t datetime_day_of_year(
BACNET_DATE *bdate)
{
uint32_t days = 0;
if (bdate) {
days = day_of_year(bdate->year, bdate->month, bdate->day);
}
return days;
}
static uint32_t days_since_epoch(
uint16_t year,
uint8_t month,
@@ -120,7 +188,6 @@ static uint32_t days_since_epoch(
{
uint32_t days = 0; /* return value */
uint16_t years = 0; /* loop counter for years */
uint8_t months = 0; /* loop counter for months */
if (datetime_ymd_is_valid(year, month, day)) {
for (years = 1900; years < year; years++) {
@@ -128,10 +195,9 @@ static uint32_t days_since_epoch(
if (datetime_is_leap_year(years))
days++;
}
for (months = 1; months < month; months++) {
days += datetime_month_days(years, months);
}
days += (day - 1);
days += day_of_year(year, month, day);
/* 'days since' is one less */
days -= 1;
}
return (days);
@@ -149,7 +215,7 @@ uint32_t datetime_days_since_epoch(
return days;
}
static void days_since_epoch_into_ymd(
void days_since_epoch_into_ymd(
uint32_t days,
uint16_t * pYear,
uint8_t * pMonth,
@@ -957,6 +1023,44 @@ void testBACnetDateTime(
return;
}
void testDayOfYear(
Test * pTest)
{
uint32_t days = 0;
uint8_t month = 0, test_month = 0;
uint8_t day = 0, test_day = 0;
uint16_t year = 0;
BACNET_DATE bdate;
BACNET_DATE test_bdate;
days = day_of_year(1900, 1, 1);
ct_test(pTest, days == 1);
day_of_year_into_md(days, 1900, &month, &day);
ct_test(pTest, month == 1);
ct_test(pTest, day == 1);
for (year = 1900; year <= 2154; year++) {
for (month = 1; month <= 12; month++) {
for (day = 1; day <= datetime_month_days(year, month); day++) {
days = day_of_year(year, month, day);
day_of_year_into_md(days, year, &test_month, &test_day);
ct_test(pTest, month == test_month);
ct_test(pTest, day == test_day);
}
}
}
for (year = 1900; year <= 2154; year++) {
for (month = 1; month <= 12; month++) {
for (day = 1; day <= datetime_month_days(year, month); day++) {
datetime_set_date(&bdate, year, month, day);
days = datetime_day_of_year(&bdate);
datetime_day_of_year_into_date(days, year, &test_bdate);
ct_test(pTest, datetime_compare_date(&bdate, &test_bdate) == 0);
}
}
}
}
void testDateEpoch(
Test * pTest)
{
@@ -1080,6 +1184,8 @@ int main(
assert(rc);
rc = ct_addTestFunction(pTest, testDatetimeCodec);
assert(rc);
rc = ct_addTestFunction(pTest, testDayOfYear);
assert(rc);
ct_setStream(pTest, stdout);
ct_run(pTest);