浏览代码

[Improve][Modularization][Module_OcppBackend / Module_OcppBackend20 / rootfs]

2021.04.14 / Folus Wen

Actions:
1. roofs /etc/init.d/rcS add synchronize date time with public time server.
2. OCPP module parsing implement date time parsing time zone format(ISO-8601).

Files:
1. As follow commit history

Image version: D0.00.XX.XXXX.XX
Image checksum: XXXXXXXX

Hardware PWB P/N : XXXXXXX
Hardware Version : XXXXXXX
FolusWen 4 年之前
父节点
当前提交
a86d90dfbe

+ 112 - 29
EVSE/Modularization/ocpp20/MessageHandler.c

@@ -3053,6 +3053,115 @@ int getTimePassSinceToday()
 	return result;
 }
 
+int syncDateTimeRTC(uint8_t *data)
+{
+	struct ParsingResult
+	{
+		int result;
+		int scanedElement;
+		int year;
+		int month;
+		int mday;
+		int hour;
+		int min;
+		int sec;
+		int tz_hour;
+		int tz_min;
+		float minSec;
+	}result;
+	struct tm tmOrg;
+	struct tm *tmTarget;
+	struct timeb tbTarget;
+	char buf[128];
+
+	memset(&result, 0x00, sizeof(struct ParsingResult));
+	result.result = PASS;
+
+	if(strstr((char*)data, ".") != NULL)
+	{
+		// Original data with mini second
+		if(strstr((char*)data, "Z") != NULL)
+		{
+			// Original data with Z
+			result.scanedElement = sscanf((char*)data, "%d-%d-%dT%d:%d:%d.%fZ",
+														&result.year,
+														&result.month,
+														&result.mday,
+														&result.hour,
+														&result.min,
+														&result.sec,
+														&result.minSec);
+		}
+		else
+		{
+			// Original data without Z
+			result.scanedElement = sscanf((char*)data, "%d-%d-%dT%d:%d:%d.%f%d:%d",
+														&result.year,
+														&result.month,
+														&result.mday,
+														&result.hour,
+														&result.min,
+														&result.sec,
+														&result.minSec,
+														&result.tz_hour,
+														&result.tz_min);
+		}
+	}
+	else
+	{
+		// Original data without mini second
+		if(strstr((char*)data, "Z") != NULL)
+		{
+			// Original data with Z
+			result.scanedElement = sscanf((char*)data, "%d-%d-%dT%d:%d:%dZ",
+														&result.year,
+														&result.month,
+														&result.mday,
+														&result.hour,
+														&result.min,
+														&result.sec);
+		}
+		else
+		{
+			// Original data without Z
+			result.scanedElement = sscanf((char*)data, "%d-%d-%dT%d:%d:%d%d:%d",
+														&result.year,
+														&result.month,
+														&result.mday,
+														&result.hour,
+														&result.min,
+														&result.sec,
+														&result.tz_hour,
+														&result.tz_min);
+		}
+	}
+
+	tmOrg.tm_year = result.year - 1900;
+	tmOrg.tm_mon = result.month - 1;
+	tmOrg.tm_mday = result.mday;
+	tmOrg.tm_hour = result.hour;
+	tmOrg.tm_min = result.min;
+	tmOrg.tm_sec = result.sec;
+	tmOrg.tm_gmtoff = 0;
+	tbTarget.time = mktime(&tmOrg);
+	tbTarget.timezone = 0;
+
+	tbTarget.time -= (result.tz_hour*3600) + (result.tz_min*60*(result.tz_hour>=0?1:-1));
+	tmTarget = gmtime(&tbTarget.time);
+
+    sprintf(buf, "date -s '%04d-%02d-%02d %02d:%02d:%02d'", (tmTarget->tm_year+1900), (tmTarget->tm_mon+1), tmTarget->tm_mday, tmTarget->tm_hour, tmTarget->tm_min, tmTarget->tm_sec);
+    //DEBUG_INFO("  org date time: %s\n", data);
+    //DEBUG_INFO("parse date time: %s\n", buf);
+
+	system(buf);
+	system("/sbin/hwclock -w --systohc");
+
+	if(result.scanedElement < 6)
+		result.result = FAIL;
+
+	return result.result;
+}
+
 //==========================================
 // GetCompositeSchedule logic related function
 //==========================================
@@ -15450,9 +15559,6 @@ void handleBootNotificationResponse(char *payload, int gun_index)
 	char statusStr[12]={0};
 	char currentTimeStr[30]={0};
 	int intervalInt = 0;
-	struct tm tp;
-	char buf[28]={0};
-	char timebuf[50]={0};
 
 	DEBUG_INFO("handleBootNotificationResponse...\n");
 
@@ -15488,21 +15594,11 @@ void handleBootNotificationResponse(char *payload, int gun_index)
 		server_pending = TRUE;
 	}
 
-	strptime((const char *)ShmOCPP20Data->BootNotification.Response_currentTime, "%Y-%m-%dT%H:%M:%S", &tp);
-	tp.tm_isdst = -1;
-	//time_t utc = mktime(&tp);
-
-	strftime(buf, 28, "%Y-%m-%d %H:%M:%S", &tp);
-	memset(timebuf, 0, ARRAY_SIZE(timebuf));
-	sprintf(timebuf,"date -s '%s'",buf);
-	system(timebuf);
+	syncDateTimeRTC(ShmOCPP20Data->BootNotification.Response_currentTime);
 
 	srand(time(NULL));
 	clientTime.Heartbeat = time((time_t*)NULL) - (ShmOCPP20Data->BootNotification.Response_interval-((rand()%8)+3));
-	//==============================================
-	// RTC sync
-	//==============================================
-	system("/sbin/hwclock -w --systohc");
+
 
 	SetOcppConnStatus(TRUE);
 	ShmOCPP20Data->SpMsg.bits.BootNotificationConf = ON;
@@ -15609,9 +15705,6 @@ void hanldeGetCertificateStatusResponse(char *payload, int gun_index)
 void handleHeartbeatResponse(char *payload, int gun_index)
 {
 	mtrace();
-	struct tm tp;
-	char buf[28]={0};
-	char timebuf[128]={0};
 
 	DEBUG_INFO("handleHeartbeatResponse...\n");
 	json_object *Heartbeat;
@@ -15632,17 +15725,7 @@ void handleHeartbeatResponse(char *payload, int gun_index)
 	HeartBeatWithNOResponse = 0;
 	clientTime.Heartbeat=time((time_t*)NULL);
 
-	strptime((const char *)ShmOCPP20Data->Heartbeat.Response_currentTime, "%Y-%m-%dT%H:%M:%S", &tp);
-	tp.tm_isdst = -1;
-	strftime(buf, 28, "%Y-%m-%d %H:%M:%S", &tp);
-	memset(timebuf, 0, ARRAY_SIZE(timebuf));
-	sprintf(timebuf,"date -s '%s'",buf);
-	system(timebuf);
-
-	//==============================================
-	// RTC sync
-	//==============================================
-	system("/sbin/hwclock -w --systohc");
+	syncDateTimeRTC(ShmOCPP20Data->Heartbeat.Response_currentTime);
 }
 
 void hanldeLogStatusNotificationResponse(char *payload, int gun_index)

+ 111 - 31
EVSE/Modularization/ocppfiles/MessageHandler.c

@@ -760,6 +760,115 @@ void getNowDatetime(uint8_t *data)
 	sprintf((char*)data, "%04d-%02d-%02dT%02d:%02d:%02dZ", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);
 }
 
+int syncDateTimeRTC(uint8_t *data)
+{
+	struct ParsingResult
+	{
+		int result;
+		int scanedElement;
+		int year;
+		int month;
+		int mday;
+		int hour;
+		int min;
+		int sec;
+		int tz_hour;
+		int tz_min;
+		float minSec;
+	}result;
+	struct tm tmOrg;
+	struct tm *tmTarget;
+	struct timeb tbTarget;
+	char buf[128];
+
+	memset(&result, 0x00, sizeof(struct ParsingResult));
+	result.result = PASS;
+
+	if(strstr((char*)data, ".") != NULL)
+	{
+		// Original data with mini second
+		if(strstr((char*)data, "Z") != NULL)
+		{
+			// Original data with Z
+			result.scanedElement = sscanf((char*)data, "%d-%d-%dT%d:%d:%d.%fZ",
+														&result.year,
+														&result.month,
+														&result.mday,
+														&result.hour,
+														&result.min,
+														&result.sec,
+														&result.minSec);
+		}
+		else
+		{
+			// Original data without Z
+			result.scanedElement = sscanf((char*)data, "%d-%d-%dT%d:%d:%d.%f%d:%d",
+														&result.year,
+														&result.month,
+														&result.mday,
+														&result.hour,
+														&result.min,
+														&result.sec,
+														&result.minSec,
+														&result.tz_hour,
+														&result.tz_min);
+		}
+	}
+	else
+	{
+		// Original data without mini second
+		if(strstr((char*)data, "Z") != NULL)
+		{
+			// Original data with Z
+			result.scanedElement = sscanf((char*)data, "%d-%d-%dT%d:%d:%dZ",
+														&result.year,
+														&result.month,
+														&result.mday,
+														&result.hour,
+														&result.min,
+														&result.sec);
+		}
+		else
+		{
+			// Original data without Z
+			result.scanedElement = sscanf((char*)data, "%d-%d-%dT%d:%d:%d%d:%d",
+														&result.year,
+														&result.month,
+														&result.mday,
+														&result.hour,
+														&result.min,
+														&result.sec,
+														&result.tz_hour,
+														&result.tz_min);
+		}
+	}
+
+	tmOrg.tm_year = result.year - 1900;
+	tmOrg.tm_mon = result.month - 1;
+	tmOrg.tm_mday = result.mday;
+	tmOrg.tm_hour = result.hour;
+	tmOrg.tm_min = result.min;
+	tmOrg.tm_sec = result.sec;
+	tmOrg.tm_gmtoff = 0;
+	tbTarget.time = mktime(&tmOrg);
+	tbTarget.timezone = 0;
+
+	tbTarget.time -= (result.tz_hour*3600) + (result.tz_min*60*(result.tz_hour>=0?1:-1));
+	tmTarget = gmtime(&tbTarget.time);
+
+    sprintf(buf, "date -s '%04d-%02d-%02d %02d:%02d:%02d'", (tmTarget->tm_year+1900), (tmTarget->tm_mon+1), tmTarget->tm_mday, tmTarget->tm_hour, tmTarget->tm_min, tmTarget->tm_sec);
+    //DEBUG_INFO("  org date time: %s\n", data);
+    //DEBUG_INFO("parse date time: %s\n", buf);
+
+	system(buf);
+	system("/sbin/hwclock -w --systohc");
+
+	if(result.scanedElement < 6)
+		result.result = FAIL;
+
+	return result.result;
+}
+
 //==========================================
 // GetCompositeSchedule logic related function
 //==========================================
@@ -11529,9 +11638,6 @@ void handleBootNotificationResponse(char *payload, int gun_index)
 	char statusStr[12]={0};
 	char currentTimeStr[30]={0};
 	int intervalInt = 0;
-	struct tm tp;
-	char buf[28]={0};
-	char timebuf[50]={0};
 
 	DEBUG_INFO("handleBootNotificationResponse...\n");
 
@@ -11566,22 +11672,10 @@ void handleBootNotificationResponse(char *payload, int gun_index)
 	{
 		server_pending = TRUE;
 	}
-
-	strptime((const char *)ShmOCPP16Data->BootNotification.ResponseCurrentTime, "%Y-%m-%dT%H:%M:%S", &tp);
-	tp.tm_isdst = -1;
-	//time_t utc = mktime(&tp);
-
-	strftime(buf, 28, "%Y-%m-%d %H:%M:%S", &tp);
-	memset(timebuf, 0, ARRAY_SIZE(timebuf));
-	sprintf(timebuf,"date -s '%s'",buf);
-	system(timebuf);
+	syncDateTimeRTC(ShmOCPP16Data->BootNotification.ResponseCurrentTime);
 
 	srand(time(NULL));
 	clientTime.Heartbeat = time((time_t*)NULL) - (ShmOCPP16Data->BootNotification.ResponseHeartbeatInterval-((rand()%8)+3));
-	//==============================================
-	// RTC sync
-	//==============================================
-	system("/sbin/hwclock -w --systohc");
 
 	SetOcppConnStatus(TRUE);
 	ShmOCPP16Data->SpMsg.bits.BootNotificationConf = 1;
@@ -11632,9 +11726,6 @@ void handleFirmwareStatusNotificationResponse(char *payload, int gun_index)
 void handleHeartbeatResponse(char *payload, int gun_index)
 {
 	mtrace();
-	struct tm tp;
-	char buf[28]={0};
-	char timebuf[50]={0};
 
 	DEBUG_INFO("handleHeartbeatResponse...\n");
 	json_object *Heartbeat;
@@ -11655,18 +11746,7 @@ void handleHeartbeatResponse(char *payload, int gun_index)
 	HeartBeatWithNOResponse = 0;
 	clientTime.Heartbeat=time((time_t*)NULL);
 
-	strptime((const char *)ShmOCPP16Data->Heartbeat.ResponseCurrentTime, "%Y-%m-%dT%H:%M:%S", &tp);
-	tp.tm_isdst = -1;
-	//time_t utc = mktime(&tp);
-	strftime(buf, 28, "%Y-%m-%d %H:%M:%S", &tp);
-	memset(timebuf, 0, ARRAY_SIZE(timebuf));
-	sprintf(timebuf,"date -s '%s'",buf);
-	system(timebuf);
-
-	//==============================================
-	// RTC sync
-	//==============================================
-	system("/sbin/hwclock -w --systohc");
+	syncDateTimeRTC(ShmOCPP16Data->Heartbeat.ResponseCurrentTime);
 }
 
 void handleMeterValuesResponse(char *payload, int gun_index)

二进制
EVSE/Projects/AW-Regular/Images/root/Module_AlarmDetect


二进制
EVSE/Projects/AW-Regular/Images/root/Module_FactoryConfig


二进制
EVSE/Projects/AW-Regular/Images/root/Module_InternalComm


+ 4 - 0
EVSE/rootfs/etc/init.d/rcS

@@ -104,3 +104,7 @@ ln -sf libbz2.so.1.0.6 libbz2.so.1
 #   Start demo app
 #   ---------------------------------------------
 /root/main &
+/usr/sbin/ntpd -nqp time.windows.com &
+/usr/sbin/ntpd -nqp cn.ntp.org.cn &
+/usr/sbin/ntpd -nqp tock.stdtime.gov.tw &
+/usr/sbin/ntpd -nqp 0.europe.pool.ntp.org &