Browse Source

DateTime_toString and DateTime_toStruct added

MaximilianBauer 11 years ago
parent
commit
f2c5ce58e9
3 changed files with 107 additions and 0 deletions
  1. 15 0
      include/ua_basictypes.h
  2. 37 0
      src/ua_basictypes.c
  3. 55 0
      tests/check_builtin.c

+ 15 - 0
include/ua_basictypes.h

@@ -265,6 +265,21 @@ UA_Int32 UA_Guid_compare(UA_Guid *g1, UA_Guid *g2);
 typedef UA_Int64 UA_DateTime; //100 nanosecond resolution
 UA_TYPE_METHOD_PROTOTYPES (UA_DateTime)
 UA_DateTime UA_DateTime_now();
+typedef struct T_UA_DateTimeStruct
+{
+	UA_Int16 nanoSec;
+	UA_Int16 microSec;
+	UA_Int16 milliSec;
+	UA_Int16 sec;
+	UA_Int16 min;
+	UA_Int16 hour;
+	UA_Int16 day;
+	UA_Int16 mounth;
+	UA_Int16 year;
+} UA_DateTimeStruct;
+UA_DateTimeStruct UA_DateTime_toStruct(UA_DateTime time);
+UA_Int32 UA_DateTime_toString(UA_DateTime time, UA_String* timeString);
+
 
 typedef struct T_UA_NodeId
 {

+ 37 - 0
src/ua_basictypes.c

@@ -2,6 +2,7 @@
 #include <stdlib.h>	// alloc, free, vsnprintf
 #include <string.h>
 #include <stdarg.h> // va_start, va_end
+#include <time.h>
 #include "opcua.h"
 #include "ua_basictypes.h"
 
@@ -1126,7 +1127,43 @@ UA_DateTime UA_DateTime_now() {
 			* HUNDRED_NANOSEC_PER_SEC + tv.tv_usec * HUNDRED_NANOSEC_PER_USEC;
 	return dateTime;
 }
+//toDo
+UA_DateTimeStruct UA_DateTime_toStruct(UA_DateTime time){
+	UA_DateTimeStruct dateTimeStruct;
+	//calcualting the the milli-, micro- and nanoseconds
+	UA_DateTime timeTemp;
+	timeTemp = (time-((time/10)*10))*100; //getting the last digit -> *100 for the 100 nanaseconds resolution
+	dateTimeStruct.nanoSec  = timeTemp;			//123 456 7 -> 700 nanosec;
+	timeTemp = (time-((time/10000)*10000))/10;
+	dateTimeStruct.microSec = timeTemp; 		//123 456 7 -> 456 microsec
+	timeTemp = (time-((time/10000000)*10000000))/10000;
+	dateTimeStruct.milliSec = timeTemp;				//123 456 7 -> 123 millisec
+
+	//calculating the unix time with #include <time.h>
+	time_t timeInSec = time/10000000; //converting the nanoseconds time in unixtime
+	struct tm ts;
+	ts = *gmtime(&timeInSec);
+	//strftime(buf, sizeof(buf), "%a %Y-%m-%d %H:%M:%S %Z", &ts);
+	//printf("%s\n", buf);
+	dateTimeStruct.sec = ts.tm_sec;
+	dateTimeStruct.min = ts.tm_min;
+	dateTimeStruct.hour = ts.tm_hour;
+	dateTimeStruct.day = ts.tm_mday;
+	dateTimeStruct.mounth = ts.tm_mon+1;
+	dateTimeStruct.year = ts.tm_year + 1900;
+
+	return dateTimeStruct;
+}
+
+UA_Int32 UA_DateTime_toString(UA_DateTime time, UA_String* timeString){
+	char *charBuf = (char*)(*timeString).data;
+
+	UA_DateTimeStruct tSt = UA_DateTime_toStruct(time);
+
+	sprintf(charBuf, "%2d/%2d/%4d %2d:%2d:%2d.%3d.%3d.%3d", tSt.mounth, tSt.day, tSt.year, tSt.hour, tSt.min, tSt.sec, tSt.milliSec, tSt.microSec, tSt.nanoSec);
 
+	return UA_SUCCESS;
+}
 
 UA_TYPE_METHOD_PROTOTYPES_AS(UA_XmlElement, UA_ByteString)
 UA_TYPE_METHOD_NEW_DEFAULT(UA_XmlElement)

+ 55 - 0
tests/check_builtin.c

@@ -1426,6 +1426,54 @@ START_TEST(UA_DataValue_encodeShallWorkOnExampleWithVariant)
 	ck_assert_int_eq(retval, UA_SUCCESS);
 }
 END_TEST
+START_TEST(UA_DateTime_toStructShallWorkOnExample)
+{
+	// given
+	UA_DateTime src = 13974671891234567;
+	//1397467189... is Mon, 14 Apr 2014 09:19:49 GMT
+	//...1234567 are the milli-, micro- and nanoseconds
+	UA_DateTimeStruct dst;
+
+	// when
+	dst = UA_DateTime_toStruct(src);
+	// then
+	ck_assert_int_eq(dst.nanoSec, 700);
+	ck_assert_int_eq(dst.microSec, 456);
+	ck_assert_int_eq(dst.milliSec, 123);
+
+	ck_assert_int_eq(dst.sec, 49);
+	ck_assert_int_eq(dst.min, 19);
+	ck_assert_int_eq(dst.hour, 9);
+
+	ck_assert_int_eq(dst.day, 14);
+	ck_assert_int_eq(dst.mounth, 4);
+	ck_assert_int_eq(dst.year, 2014);
+}
+END_TEST
+START_TEST(UA_DateTime_toStingShallWorkOnExample)
+{
+	// given
+	UA_DateTime src = 13974671891234567;
+	//1397467189... is Mon, 14 Apr 2014 09:19:49 GMT
+	//...1234567 are the milli-, micro- and nanoseconds
+
+	char buf[80] = "80";
+	UA_Byte *byteBuf = (UA_Byte*)buf;
+	UA_String dst = {80, byteBuf};
+
+	// when
+	UA_DateTime_toString(src, &dst);
+	// then
+	ck_assert_int_eq(dst.length, 80);
+	char df = 'a';
+	UA_String_printf(&df, &dst);
+	ck_assert_int_eq(dst.data[0], ' ');
+	ck_assert_int_eq(dst.data[1], '4');
+	ck_assert_int_eq(dst.data[2], '/');
+	ck_assert_int_eq(dst.data[3], '1');
+	ck_assert_int_eq(dst.data[4], '4');
+}
+END_TEST
 
 Suite *testSuite_builtin(void)
 {
@@ -1532,6 +1580,13 @@ Suite *testSuite_builtin(void)
 	tcase_add_test(tc_encode, UA_DataValue_encodeShallWorkOnExampleWithVariant);
 	suite_add_tcase(s,tc_encode);
 
+
+
+	TCase *tc_convert = tcase_create("convert");
+	tcase_add_test(tc_convert, UA_DateTime_toStructShallWorkOnExample);
+	tcase_add_test(tc_convert, UA_DateTime_toStingShallWorkOnExample);
+	suite_add_tcase(s,tc_convert);
+
 	return s;
 }