瀏覽代碼

feat(core): Add UA_DateTime_fromStruct

Julius Pfrommer 5 年之前
父節點
當前提交
f582248132
共有 3 個文件被更改,包括 57 次插入0 次删除
  1. 1 0
      include/open62541/types.h
  2. 21 0
      src/ua_types.c
  3. 35 0
      tests/check_types_builtin.c

+ 1 - 0
include/open62541/types.h

@@ -225,6 +225,7 @@ typedef struct UA_DateTimeStruct {
 } UA_DateTimeStruct;
 
 UA_DateTimeStruct UA_EXPORT UA_DateTime_toStruct(UA_DateTime t);
+UA_DateTime UA_EXPORT UA_DateTime_fromStruct(UA_DateTimeStruct ts);
 
 /* The C99 standard (7.23.1) says: "The range and precision of times
  * representable in clock_t and time_t are implementation-defined." On most

+ 21 - 0
src/ua_types.c

@@ -195,6 +195,27 @@ UA_DateTime_toStruct(UA_DateTime t) {
     return dateTimeStruct;
 }
 
+UA_DateTime
+UA_DateTime_fromStruct(UA_DateTimeStruct ts) {
+    /* Seconds since the Unix epoch */
+    struct mytm tm;
+    memset(&tm, 0, sizeof(struct mytm));
+    tm.tm_year = ts.year - 1900;
+    tm.tm_mon = ts.month - 1;
+    tm.tm_mday = ts.day;
+    tm.tm_hour = ts.hour;
+    tm.tm_min = ts.min;
+    tm.tm_sec = ts.sec;
+    long long sec_epoch = __tm_to_secs(&tm);
+
+    UA_DateTime t = UA_DATETIME_UNIX_EPOCH;
+    t += sec_epoch * UA_DATETIME_SEC;
+    t += ts.milliSec * UA_DATETIME_MSEC;
+    t += ts.microSec * UA_DATETIME_USEC;
+    t += ts.nanoSec / 100;
+    return t;
+}
+
 /* Guid */
 UA_Boolean
 UA_Guid_equal(const UA_Guid *g1, const UA_Guid *g2) {

+ 35 - 0
tests/check_types_builtin.c

@@ -996,6 +996,40 @@ START_TEST(UA_DateTime_toStructShallWorkOnExample) {
 }
 END_TEST
 
+START_TEST(UA_DateTime_toStructAndBack) {
+    UA_DateTime src = 13974671891234567 + (11644473600 * 10000000);
+    UA_DateTime dst = UA_DateTime_fromStruct(UA_DateTime_toStruct(src));
+    ck_assert_int_eq(src, dst);
+
+    src = 0;
+    dst = UA_DateTime_fromStruct(UA_DateTime_toStruct(src));
+    ck_assert_int_eq(src, dst);
+
+    src = UA_DATETIME_UNIX_EPOCH;
+    dst = UA_DateTime_fromStruct(UA_DateTime_toStruct(src));
+    ck_assert_int_eq(src, dst);
+
+    src = -UA_DATETIME_UNIX_EPOCH;
+    dst = UA_DateTime_fromStruct(UA_DateTime_toStruct(src));
+    ck_assert_int_eq(src, dst);
+
+    /* Conversion to DateTimeStruct is currently broken for negative DateTimes.
+     * So dates before 1601! */
+
+    /* src = -UA_DATETIME_UNIX_EPOCH - UA_DATETIME_SEC - UA_DATETIME_MSEC - UA_DATETIME_USEC; */
+    /* dst = UA_DateTime_fromStruct(UA_DateTime_toStruct(src)); */
+    /* ck_assert_int_eq(src, dst); */
+
+    /* src = LLONG_MIN; */
+    /* dst = UA_DateTime_fromStruct(UA_DateTime_toStruct(src)); */
+    /* ck_assert_int_eq(src, dst); */
+
+    src = UA_INT64_MAX;
+    dst = UA_DateTime_fromStruct(UA_DateTime_toStruct(src));
+    ck_assert_int_eq(src, dst);
+}
+END_TEST
+
 START_TEST(UA_QualifiedName_equalShallWorkOnExample) {
     // given
     UA_QualifiedName qn1 = UA_QUALIFIEDNAME(5, "tEsT123!");
@@ -1518,6 +1552,7 @@ static Suite *testSuite_builtin(void) {
 
     TCase *tc_convert = tcase_create("convert");
     tcase_add_test(tc_convert, UA_DateTime_toStructShallWorkOnExample);
+    tcase_add_test(tc_convert, UA_DateTime_toStructAndBack);
     suite_add_tcase(s, tc_convert);
 
     TCase *tc_equal = tcase_create("equal");