Ver código fonte

2021.01.12 / Jerry Wang

Action:
1. modify OVP check function and EV board trigger OVP no status code issue.

Files:
Follow commit history.

Image version: V1.04.XX.XXXX.XX
Image checksum: XXXXXXXX
Jerry_Wang 4 anos atrás
pai
commit
1e3b73815c

+ 12 - 2
EVSE/Projects/DD360Audi/Apps/Module_EvComm.c

@@ -1016,8 +1016,13 @@ void ClearAbnormalStatus_CCS(byte gun_index)
         return;
     }
 
-    if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023701", 6) == EQUAL &&
-            ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsEvCommFail == YES) {
+    if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "012219", 6) == EQUAL &&
+            ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemCcsOutputOVP == YES) {
+        memcpy(code, "012219", 6);
+        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
+        isCleanCheck = true;
+    } else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023701", 6) == EQUAL &&
+               ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsEvCommFail == YES) {
         memcpy(code, "023701", 6);
         memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
         isCleanCheck = true;
@@ -1731,6 +1736,7 @@ void ClearAbnormalStatus_CCS(byte gun_index)
             if (index != gun_index || ShmSysConfigAndInfo->SysConfig.TotalConnectorCount == 1) {
                 PRINTF_FUNC("CCS clean error : index = %d, EvConnAlarmCode = %s, code = %s \n", index, _chargingData[index]->EvConnAlarmCode, code);
                 if (strncmp((char *)_chargingData[index]->EvConnAlarmCode, code, 6) != EQUAL) {
+                    if (strncmp(code, "012219", 6) == EQUAL) { ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemCcsOutputOVP = NO; }
                     if (strncmp(code, "023701", 6) == EQUAL) { ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsEvCommFail = NO; }
                     if (strncmp(code, "023737", 6) == EQUAL) { ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsRESTemperatureInhibit = NO; }
                     if (strncmp(code, "023738", 6) == EQUAL) { ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsEVShiftPosition = NO; }
@@ -1891,6 +1897,10 @@ void AbnormalStopAnalysis(byte gun_index, byte *errCode)
 
     memcpy(_chargingData[gun_index]->EvConnAlarmCode, string, 6);
     PRINTF_FUNC("NOTIFICATION_EV_STOP : EvConnAlarmCode = %s \n", _chargingData[gun_index]->EvConnAlarmCode);
+    //OVP error
+    if (strcmp(string, "012217") == EQUAL) { ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemChademoOutputOVP = YES; }
+    if (strcmp(string, "012219") == EQUAL) { ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemCcsOutputOVP = YES; }
+    if (strcmp(string, "012221") == EQUAL) { ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemGbOutputOVP = YES; }
 
     if (strcmp(string, "023700") == EQUAL) { ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoEvCommFail = YES; }
     if (strcmp(string, "023704") == EQUAL) { ShmStatusCodeData->InfoCode.InfoEvents.bits.ChademoBatteryMalfun = YES; }

+ 208 - 251
EVSE/Projects/DD360Audi/Apps/Module_EventLogging.c

@@ -1,41 +1,41 @@
-#include 	<sys/time.h>
-#include 	<sys/timeb.h>
+#include    <sys/time.h>
+#include    <sys/timeb.h>
 #include    <sys/types.h>
 #include    <sys/stat.h>
-#include 	<sys/types.h>
-#include 	<sys/ioctl.h>
-#include 	<sys/socket.h>
-#include 	<sys/ipc.h>
-#include 	<sys/shm.h>
-#include 	<sys/shm.h>
-#include 	<sys/mman.h>
-#include 	<linux/wireless.h>
-#include 	<arpa/inet.h>
-#include 	<netinet/in.h>
+#include    <sys/types.h>
+#include    <sys/ioctl.h>
+#include    <sys/socket.h>
+#include    <sys/ipc.h>
+#include    <sys/shm.h>
+#include    <sys/shm.h>
+#include    <sys/mman.h>
+#include    <linux/wireless.h>
+#include    <arpa/inet.h>
+#include    <netinet/in.h>
 
-#include 	<unistd.h>
-#include 	<stdarg.h>
-#include    <stdio.h>      /*標準輸入輸出定義*/
-#include    <stdlib.h>     /*標準函數庫定義*/
-#include    <unistd.h>     /*Unix 標準函數定義*/
-#include    <fcntl.h>      /*檔控制定義*/
-#include    <termios.h>    /*PPSIX 終端控制定義*/
-#include    <errno.h>      /*錯誤號定義*/
-#include 	<errno.h>
-#include 	<string.h>
-#include	<time.h>
-#include	<ctype.h>
-#include 	<ifaddrs.h>
-#include	"../../define.h"
+#include    <unistd.h>
+#include    <stdarg.h>
+#include    <stdio.h>      /*璅蹱�頛詨�頛詨枂摰𡁶儔*/
+#include    <stdlib.h>     /*璅蹱��賣彍摨怠�蝢�*/
+#include    <unistd.h>     /*Unix 璅蹱��賣彍摰𡁶儔*/
+#include    <fcntl.h>      /*瑼娍綉�嗅�蝢�*/
+#include    <termios.h>    /*PPSIX 蝯�垢�批�摰𡁶儔*/
+#include    <errno.h>      /*�航炊�笔�蝢�*/
+#include    <errno.h>
+#include    <string.h>
+#include    <time.h>
+#include    <ctype.h>
+#include    <ifaddrs.h>
+#include    "../../define.h"
 
-#define ARRAY_SIZE(A)		(sizeof(A) / sizeof(A[0]))
-#define PASS				1
-#define FAIL				-1
-#define YES					1
-#define NO					0
+#define ARRAY_SIZE(A)       (sizeof(A) / sizeof(A[0]))
+#define PASS                1
+#define FAIL                -1
+#define YES                 1
+#define NO                  0
 
-struct SysConfigAndInfo			*ShmSysConfigAndInfo;
-struct StatusCodeData 			*ShmStatusCodeData;
+struct SysConfigAndInfo         *ShmSysConfigAndInfo;
+struct StatusCodeData           *ShmStatusCodeData;
 
 void PRINTF_FUNC(char *string, ...);
 
@@ -46,74 +46,71 @@ int StoreLogMsg(const char *fmt, ...);
 
 int StoreLogMsg(const char *fmt, ...)
 {
-	char Buf[4096+256];
-	char buffer[4096];
-	va_list args;
-	struct timeb  SeqEndTime;
-	struct tm *tm;
+    char Buf[4096 + 256];
+    char buffer[4096];
+    va_list args;
+    struct timeb  SeqEndTime;
+    struct tm *tm;
 
-	va_start(args, fmt);
-	int rc = vsnprintf(buffer, sizeof(buffer), fmt, args);
-	va_end(args);
+    va_start(args, fmt);
+    int rc = vsnprintf(buffer, sizeof(buffer), fmt, args);
+    va_end(args);
 
-	memset(Buf,0,sizeof(Buf));
-	ftime(&SeqEndTime);
-	SeqEndTime.time = time(NULL);
-	tm=localtime(&SeqEndTime.time);
+    memset(Buf, 0, sizeof(Buf));
+    ftime(&SeqEndTime);
+    SeqEndTime.time = time(NULL);
+    tm = localtime(&SeqEndTime.time);
 
-	if (ShmSysConfigAndInfo->SysConfig.SwitchDebugFlag == YES)
-	{
-		sprintf(Buf,"%02d:%02d:%02d:%03d - %s",
-			tm->tm_hour,tm->tm_min,tm->tm_sec,SeqEndTime.millitm, buffer);
-		printf("%s \n", Buf);
-	}
-	else
-	{
-		sprintf(Buf,"echo \"%04d-%02d-%02d %02d:%02d:%02d:%03d - %s\" >> /Storage/SystemLog/[%04d.%02d]SystemLog",
-			tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,SeqEndTime.millitm,
-			buffer,
-			tm->tm_year+1900,tm->tm_mon+1);
-		system(Buf);
-	}
+    if (ShmSysConfigAndInfo->SysConfig.SwitchDebugFlag == YES) {
+        sprintf(Buf, "%02d:%02d:%02d:%03d - %s",
+                tm->tm_hour, tm->tm_min, tm->tm_sec, SeqEndTime.millitm, buffer);
+        printf("%s \n", Buf);
+    } else {
+        sprintf(Buf, "echo \"%04d-%02d-%02d %02d:%02d:%02d:%03d - %s\" >> /Storage/SystemLog/[%04d.%02d]SystemLog",
+                tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec, SeqEndTime.millitm,
+                buffer,
+                tm->tm_year + 1900, tm->tm_mon + 1);
+        system(Buf);
+    }
 
-	return rc;
+    return rc;
 }
 
 int DiffTimeb(struct timeb ST, struct timeb ET)
 {
-	//return milli-second
-	unsigned int StartTime,StopTime;
+    //return milli-second
+    unsigned int StartTime, StopTime;
 
-	StartTime=(unsigned int)ST.time;
-	StopTime=(unsigned int)ET.time;
-	return (StopTime-StartTime)*1000+ET.millitm-ST.millitm;
+    StartTime = (unsigned int)ST.time;
+    StopTime = (unsigned int)ET.time;
+    return (StopTime - StartTime) * 1000 + ET.millitm - ST.millitm;
 }
 
 void PRINTF_FUNC(char *string, ...)
 {
-	va_list args;
-	char buffer[4096];
-	va_start(args, string);
-	vsnprintf(buffer, sizeof(buffer), string, args);
-	va_end(args);
+    va_list args;
+    char buffer[4096];
+    va_start(args, string);
+    vsnprintf(buffer, sizeof(buffer), string, args);
+    va_end(args);
 
-	DEBUG_INFO("%s \n", buffer);
+    DEBUG_INFO("%s \n", buffer);
 }
 
 //=================================
 // Common routine
 //=================================
-char* getTimeString(void)
+char *getTimeString(void)
 {
-	char *result=malloc(21);
-	time_t timep;
-	struct tm *p;
-	time(&timep);
-	p=gmtime(&timep);
+    char *result = malloc(21);
+    time_t timep;
+    struct tm *p;
+    time(&timep);
+    p = gmtime(&timep);
 
-	sprintf(result, "[%04d-%02d-%02d %02d:%02d:%02d]", (1900+p->tm_year), (1+p->tm_mon), p->tm_mday, p->tm_hour, p->tm_hour, p->tm_sec);
+    sprintf(result, "[%04d-%02d-%02d %02d:%02d:%02d]", (1900 + p->tm_year), (1 + p->tm_mon), p->tm_mday, p->tm_hour, p->tm_hour, p->tm_sec);
 
-	return result;
+    return result;
 }
 
 //==========================================
@@ -121,43 +118,35 @@ char* getTimeString(void)
 //==========================================
 int InitShareMemory()
 {
-	int result = PASS;
-	int MeterSMId;
+    int result = PASS;
+    int MeterSMId;
 
-	//creat ShmSysConfigAndInfo
-	if ((MeterSMId = shmget(ShmSysConfigAndInfoKey, sizeof(struct SysConfigAndInfo),  0777)) < 0)
-    {
-		#ifdef SystemLogMessage
-		DEBUG_ERROR("shmget ShmSysConfigAndInfo NG\n");
-		#endif
-		result = FAIL;
-	}
-    else if ((ShmSysConfigAndInfo = shmat(MeterSMId, NULL, 0)) == (void *) -1)
-    {
-    	#ifdef SystemLogMessage
-    	DEBUG_ERROR("shmat ShmSysConfigAndInfo NG\n");
-		#endif
-    	result = FAIL;
-   	 }
-    else
+    //creat ShmSysConfigAndInfo
+    if ((MeterSMId = shmget(ShmSysConfigAndInfoKey, sizeof(struct SysConfigAndInfo),  0777)) < 0) {
+#ifdef SystemLogMessage
+        DEBUG_ERROR("shmget ShmSysConfigAndInfo NG\n");
+#endif
+        result = FAIL;
+    } else if ((ShmSysConfigAndInfo = shmat(MeterSMId, NULL, 0)) == (void *) - 1) {
+#ifdef SystemLogMessage
+        DEBUG_ERROR("shmat ShmSysConfigAndInfo NG\n");
+#endif
+        result = FAIL;
+    } else
     {}
 
-   	 //creat ShmStatusCodeData
-   	 if ((MeterSMId = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData),  0777)) < 0)
-    {
-		#ifdef SystemLogMessage
-   		DEBUG_ERROR("shmget ShmStatusCodeData NG\n");
-		#endif
-   		result = FAIL;
-	}
-    else if ((ShmStatusCodeData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
-    {
-    	#ifdef SystemLogMessage
-    	DEBUG_ERROR("shmat ShmStatusCodeData NG\n");
-		#endif
-    	result = FAIL;
-   	}
-    else
+    //creat ShmStatusCodeData
+    if ((MeterSMId = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData),  0777)) < 0) {
+#ifdef SystemLogMessage
+        DEBUG_ERROR("shmget ShmStatusCodeData NG\n");
+#endif
+        result = FAIL;
+    } else if ((ShmStatusCodeData = shmat(MeterSMId, NULL, 0)) == (void *) - 1) {
+#ifdef SystemLogMessage
+        DEBUG_ERROR("shmat ShmStatusCodeData NG\n");
+#endif
+        result = FAIL;
+    } else
     {}
 
     return result;
@@ -168,157 +157,125 @@ int InitShareMemory()
 //================================================
 void AddFaultCodeToBuf(unsigned char *Code)
 {
-	if(ShmSysConfigAndInfo->SysWarningInfo.WarningCount < 10)
-	{
-		memcpy(&ShmSysConfigAndInfo->SysWarningInfo.WarningCode[ShmSysConfigAndInfo->SysWarningInfo.WarningCount][0], Code, 7);
-		ShmSysConfigAndInfo->SysWarningInfo.WarningCount++;
-	}
+    if (ShmSysConfigAndInfo->SysWarningInfo.WarningCount < 10) {
+        memcpy(&ShmSysConfigAndInfo->SysWarningInfo.WarningCode[ShmSysConfigAndInfo->SysWarningInfo.WarningCount][0], Code, 7);
+        ShmSysConfigAndInfo->SysWarningInfo.WarningCount++;
+    }
 }
 
 void RemoveFaultCodeToBuf(unsigned char *Code)
 {
-	unsigned char find = 0x01;
-	char _code[7];
-	sprintf(_code,"%s", Code);
+    unsigned char find = 0x01;
+    char _code[7];
+    sprintf(_code, "%s", Code);
 
-	// 把相關的錯誤碼一次移除,避免重複顯示
-	while(find)
-	{
-		find = 0x00;
-		for(unsigned char i = 0; i < ShmSysConfigAndInfo->SysWarningInfo.WarningCount; i++)
-		{
-			if (find == 0x00)
-			{
-				if(memcmp(&ShmSysConfigAndInfo->SysWarningInfo.WarningCode[i][0], _code, 7) == 0)
-				{
-					find = 0x01;
-				}
-			}
-			else
-			{
-				memcpy(&ShmSysConfigAndInfo->SysWarningInfo.WarningCode[i - 1][0],
-					&ShmSysConfigAndInfo->SysWarningInfo.WarningCode[i][0], 7);
-			}
-		}
+    // �羓㮾�𦦵��航炊蝣潔�甈∠宏�歹��踹��滩�憿舐內
+    while (find) {
+        find = 0x00;
+        for (unsigned char i = 0; i < ShmSysConfigAndInfo->SysWarningInfo.WarningCount; i++) {
+            if (find == 0x00) {
+                if (memcmp(&ShmSysConfigAndInfo->SysWarningInfo.WarningCode[i][0], _code, 7) == 0) {
+                    find = 0x01;
+                }
+            } else {
+                memcpy(&ShmSysConfigAndInfo->SysWarningInfo.WarningCode[i - 1][0],
+                       &ShmSysConfigAndInfo->SysWarningInfo.WarningCode[i][0], 7);
+            }
+        }
 
-		if (find)
-		{
-			ShmSysConfigAndInfo->SysWarningInfo.WarningCount--;
-		}
-	}
+        if (find) {
+            ShmSysConfigAndInfo->SysWarningInfo.WarningCount--;
+        }
+    }
 }
 
 int main(void)
 {
-	int ByteCount,BitCount;
-	unsigned char tmp, EventCodeTmp[7];
+    int ByteCount, BitCount;
+    unsigned char tmp, EventCodeTmp[7];
 
-	if(InitShareMemory() == FAIL)
-	{
-		#ifdef SystemLogMessage
-		DEBUG_ERROR("InitShareMemory NG\n");
-		#endif
-		if(ShmStatusCodeData!=NULL)
-		{
-			ShmStatusCodeData->AlarmCode.AlarmEvents.bits.FailToCreateShareMemory=1;
-		}
-		sleep(5);
-		return 0;
-	}
+    if (InitShareMemory() == FAIL) {
+#ifdef SystemLogMessage
+        DEBUG_ERROR("InitShareMemory NG\n");
+#endif
+        if (ShmStatusCodeData != NULL) {
+            ShmStatusCodeData->AlarmCode.AlarmEvents.bits.FailToCreateShareMemory = 1;
+        }
+        sleep(5);
+        return 0;
+    }
 
-	for(;;)
-	{
-		//check Fault Status
-		for(ByteCount=0;ByteCount<sizeof(ShmStatusCodeData->FaultCode.PreviousFaultVal);ByteCount++)
-		{
-			if(ShmStatusCodeData->FaultCode.FaultEvents.FaultVal[ByteCount] != ShmStatusCodeData->FaultCode.PreviousFaultVal[ByteCount])
-			{
-				tmp=ShmStatusCodeData->FaultCode.FaultEvents.FaultVal[ByteCount]; //prevent be modified during following process
-				for(BitCount=0;BitCount<8;BitCount++)
-				{
-					if(((tmp>>BitCount)&0x01) != ((ShmStatusCodeData->FaultCode.PreviousFaultVal[ByteCount]>>BitCount)&0x01))
-					{
-						memset(EventCodeTmp,0,sizeof(EventCodeTmp));
-						memcpy(EventCodeTmp,FaultStatusCode[ByteCount*8+BitCount],sizeof(EventCodeTmp)-1);
-						if(((tmp>>BitCount)&0x01)==0)//Recovered
-						{
-							//EventCodeTmp[0]=1;
-							DEBUG_INFO("Recovery Fault Code = %s\n", EventCodeTmp);
-							ShmStatusCodeData->FaultCode.PreviousFaultVal[ByteCount] &= ~(1<<BitCount);
-							RemoveFaultCodeToBuf(EventCodeTmp);
-						}
-						else
-						{
-							DEBUG_INFO("Fault Code = %s\n", EventCodeTmp);
-							ShmStatusCodeData->FaultCode.PreviousFaultVal[ByteCount] |= (1<<BitCount);
-							AddFaultCodeToBuf(EventCodeTmp);
-						}
-					}
-				}
-			}
-		}
+    for (;;) {
+        //check Fault Status
+        for (ByteCount = 0; ByteCount < sizeof(ShmStatusCodeData->FaultCode.PreviousFaultVal); ByteCount++) {
+            if (ShmStatusCodeData->FaultCode.FaultEvents.FaultVal[ByteCount] != ShmStatusCodeData->FaultCode.PreviousFaultVal[ByteCount]) {
+                tmp = ShmStatusCodeData->FaultCode.FaultEvents.FaultVal[ByteCount]; //prevent be modified during following process
+                for (BitCount = 0; BitCount < 8; BitCount++) {
+                    if (((tmp >> BitCount) & 0x01) != ((ShmStatusCodeData->FaultCode.PreviousFaultVal[ByteCount] >> BitCount) & 0x01)) {
+                        memset(EventCodeTmp, 0, sizeof(EventCodeTmp));
+                        memcpy(EventCodeTmp, FaultStatusCode[ByteCount * 8 + BitCount], sizeof(EventCodeTmp) - 1);
+                        if (((tmp >> BitCount) & 0x01) == 0) { //Recovered
+                            //EventCodeTmp[0]=1;
+                            DEBUG_INFO("Recovery Fault Code = %s\n", EventCodeTmp);
+                            ShmStatusCodeData->FaultCode.PreviousFaultVal[ByteCount] &= ~(1 << BitCount);
+                            RemoveFaultCodeToBuf(EventCodeTmp);
+                        } else {
+                            DEBUG_INFO("Fault Code = %s\n", EventCodeTmp);
+                            ShmStatusCodeData->FaultCode.PreviousFaultVal[ByteCount] |= (1 << BitCount);
+                            AddFaultCodeToBuf(EventCodeTmp);
+                        }
+                    }
+                }
+            }
+        }
 
-		//check Alarm Status
-		for(ByteCount=0;ByteCount<sizeof(ShmStatusCodeData->AlarmCode.PreviousAlarmVal);ByteCount++)
-		{
-			if(ShmStatusCodeData->AlarmCode.AlarmEvents.AlarmVal[ByteCount] != ShmStatusCodeData->AlarmCode.PreviousAlarmVal[ByteCount])
-			{
-				tmp=ShmStatusCodeData->AlarmCode.AlarmEvents.AlarmVal[ByteCount]; //prevent be modified during following process
-				for(BitCount=0;BitCount<8;BitCount++)
-				{
-					if(((tmp>>BitCount)&0x01) != ((ShmStatusCodeData->AlarmCode.PreviousAlarmVal[ByteCount]>>BitCount)&0x01))
-					{
-						memset(EventCodeTmp,0,sizeof(EventCodeTmp));
-						memcpy(EventCodeTmp,AlarmStatusCode[ByteCount*8+BitCount],sizeof(EventCodeTmp)-1);
-						if(((tmp>>BitCount)&0x01)==0)//Recovered
-						{
-							//EventCodeTmp[0]=1;
-							DEBUG_INFO("Recovery Alarm Code = %s\n", EventCodeTmp);
-							ShmStatusCodeData->AlarmCode.PreviousAlarmVal[ByteCount] &= ~(1<<BitCount);
-							RemoveFaultCodeToBuf(EventCodeTmp);
-						}
-						else
-						{
-							DEBUG_INFO("Alarm Code = %s\n", EventCodeTmp);
-							ShmStatusCodeData->AlarmCode.PreviousAlarmVal[ByteCount] |= (1<<BitCount);
-							AddFaultCodeToBuf(EventCodeTmp);
-						}
-					}
-				}
-			}
-		}
+        //check Alarm Status
+        for (ByteCount = 0; ByteCount < sizeof(ShmStatusCodeData->AlarmCode.PreviousAlarmVal); ByteCount++) {
+            if (ShmStatusCodeData->AlarmCode.AlarmEvents.AlarmVal[ByteCount] != ShmStatusCodeData->AlarmCode.PreviousAlarmVal[ByteCount]) {
+                tmp = ShmStatusCodeData->AlarmCode.AlarmEvents.AlarmVal[ByteCount]; //prevent be modified during following process
+                for (BitCount = 0; BitCount < 8; BitCount++) {
+                    if (((tmp >> BitCount) & 0x01) != ((ShmStatusCodeData->AlarmCode.PreviousAlarmVal[ByteCount] >> BitCount) & 0x01)) {
+                        memset(EventCodeTmp, 0, sizeof(EventCodeTmp));
+                        memcpy(EventCodeTmp, AlarmStatusCode[ByteCount * 8 + BitCount], sizeof(EventCodeTmp) - 1);
+                        if (((tmp >> BitCount) & 0x01) == 0) { //Recovered
+                            //EventCodeTmp[0]=1;
+                            DEBUG_INFO("Recovery Alarm Code = %s\n", EventCodeTmp);
+                            ShmStatusCodeData->AlarmCode.PreviousAlarmVal[ByteCount] &= ~(1 << BitCount);
+                            RemoveFaultCodeToBuf(EventCodeTmp);
+                        } else {
+                            DEBUG_INFO("Alarm Code = %s\n", EventCodeTmp);
+                            ShmStatusCodeData->AlarmCode.PreviousAlarmVal[ByteCount] |= (1 << BitCount);
+                            AddFaultCodeToBuf(EventCodeTmp);
+                        }
+                    }
+                }
+            }
+        }
 
-		//check Info Status
-		for(ByteCount=0;ByteCount<sizeof(ShmStatusCodeData->InfoCode.PreviousInfoVal);ByteCount++)
-		{
-			if(ShmStatusCodeData->InfoCode.InfoEvents.InfoVal[ByteCount] != ShmStatusCodeData->InfoCode.PreviousInfoVal[ByteCount])
-			{
-				tmp=ShmStatusCodeData->InfoCode.InfoEvents.InfoVal[ByteCount]; //prevent be modified during following process
-				for(BitCount=0;BitCount<8;BitCount++)
-				{
-					if(((tmp>>BitCount)&0x01) != ((ShmStatusCodeData->InfoCode.PreviousInfoVal[ByteCount]>>BitCount)&0x01))
-					{
-						memset(EventCodeTmp,0,sizeof(EventCodeTmp));
-						memcpy(EventCodeTmp,InfoStatusCode[ByteCount*8+BitCount],sizeof(EventCodeTmp)-1);
-						if(((tmp>>BitCount)&0x01)==0)//Recovered
-						{
-							//EventCodeTmp[0]=1;
-							DEBUG_INFO("Recovery Info Code = %s\n", EventCodeTmp);
-							ShmStatusCodeData->InfoCode.PreviousInfoVal[ByteCount] &= ~(1<<BitCount);
-							RemoveFaultCodeToBuf(EventCodeTmp);
-						}
-						else
-						{
-							DEBUG_INFO("Info Code = %s\n", EventCodeTmp);
-							ShmStatusCodeData->InfoCode.PreviousInfoVal[ByteCount] |= (1<<BitCount);
-							AddFaultCodeToBuf(EventCodeTmp);
-						}
-					}
-				}
-			}
-		}
-		usleep(500000);
-	}
+        //check Info Status
+        for (ByteCount = 0; ByteCount < sizeof(ShmStatusCodeData->InfoCode.PreviousInfoVal); ByteCount++) {
+            if (ShmStatusCodeData->InfoCode.InfoEvents.InfoVal[ByteCount] != ShmStatusCodeData->InfoCode.PreviousInfoVal[ByteCount]) {
+                tmp = ShmStatusCodeData->InfoCode.InfoEvents.InfoVal[ByteCount]; //prevent be modified during following process
+                for (BitCount = 0; BitCount < 8; BitCount++) {
+                    if (((tmp >> BitCount) & 0x01) != ((ShmStatusCodeData->InfoCode.PreviousInfoVal[ByteCount] >> BitCount) & 0x01)) {
+                        memset(EventCodeTmp, 0, sizeof(EventCodeTmp));
+                        memcpy(EventCodeTmp, InfoStatusCode[ByteCount * 8 + BitCount], sizeof(EventCodeTmp) - 1);
+                        if (((tmp >> BitCount) & 0x01) == 0) { //Recovered
+                            //EventCodeTmp[0]=1;
+                            DEBUG_INFO("Recovery Info Code = %s\n", EventCodeTmp);
+                            ShmStatusCodeData->InfoCode.PreviousInfoVal[ByteCount] &= ~(1 << BitCount);
+                            RemoveFaultCodeToBuf(EventCodeTmp);
+                        } else {
+                            DEBUG_INFO("Info Code = %s\n", EventCodeTmp);
+                            ShmStatusCodeData->InfoCode.PreviousInfoVal[ByteCount] |= (1 << BitCount);
+                            AddFaultCodeToBuf(EventCodeTmp);
+                        }
+                    }
+                }
+            }
+        }
+        usleep(500000);
+    }
 
-	return FAIL;
+    return FAIL;
 }

+ 41 - 108
EVSE/Projects/DD360Audi/Apps/Module_InternalComm.c

@@ -39,6 +39,7 @@
 #define FAIL                -1
 #define YES                 1
 #define NO                  0
+#define OUTPUT_VOL_CHK_TIME    200     // ms
 #define TEN_MINUTES         600
 #define ENV_TEMP_MIN        45
 #define ENV_TEMP_MAX        50
@@ -129,6 +130,8 @@ struct timeval  _ac_charging_comp;
 struct timeval  _ac_preparing;
 struct timeb    _ac_startChargingTime;
 struct timeb    _ac_endChargingTime;
+bool _isOvpChkTimeFlag[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
+struct timeval _checkOutputVolProtectTimer[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
 
 unsigned short _setFanSpeed = 0;
 float _beforeChargingTotalEnergy = 0.0;
@@ -466,6 +469,7 @@ void GetPresentInputVol()
                 ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL3InputUVP = NO;
             }
         }
+#endif //!defined DD360 && !defined DD360Audi
         //********************************************************************************************************//
         // Vin (OVP)
         if (ShmSysConfigAndInfo->SysInfo.ChargerType == _CHARGER_TYPE_IEC) {
@@ -511,7 +515,6 @@ void GetPresentInputVol()
                 ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL3InputOVP = NO;
             }
         }
-#endif //!defined DD360 && !defined DD360Audi
     }
 }
 
@@ -1629,19 +1632,38 @@ void CableCheckDetected(byte index)
 void CheckOutputPowerOverCarReq(byte index)
 {
     float fireV = _chargingData[index]->FireChargingVoltage;
-    float carV = _chargingData[index]->EvBatterytargetVoltage * 10;
+    float carV = _chargingData[index]->EvBatteryMaxVoltage * 10;
 
     if ((_chargingData[index]->EvBatterytargetVoltage * 10) > 1500 &&
             (_chargingData[index]->Type == _Type_Chademo ||
              _chargingData[index]->Type == _Type_CCS_2 ||
              _chargingData[index]->Type == _Type_GB)) {
-        //printf("fireV = %.2f, %.2f\r\n", fireV, (carV + (carV * 0.1)));
-        if (fireV >= (carV + (carV * 0.1))) {
-            PRINTF_FUNC("[Module_InternalComm]CheckOutputPowerOverCarReq NG : fire = %f, battery = %f \n",
-                        _chargingData[index]->FireChargingVoltage, (_chargingData[index]->EvBatterytargetVoltage * 10));
-            DEBUG_ERROR("[Module_InternalComm]CheckOutputPowerOverCarReq NG : fire = %f, battery = %f \n",
-                        _chargingData[index]->FireChargingVoltage, (_chargingData[index]->EvBatterytargetVoltage * 10));
-            _chargingData[index]->StopChargeFlag = YES;
+        if (fireV >= (carV + (carV * 0.02))) {
+            if (!_isOvpChkTimeFlag[index]) {
+                if ((_chargingData[index]->PresentChargingVoltage * 10) >= VOUT_MIN_VOLTAGE * 10) {
+                    gettimeofday(&_checkOutputVolProtectTimer[index], NULL);
+                    _isOvpChkTimeFlag[index] = YES;
+                }
+            } else {
+                PRINTF_FUNC("[Module_InternalComm]CheckOutputPowerOverCarReq NG : fire = %f, battery = %f \n",
+                            _chargingData[index]->FireChargingVoltage, (_chargingData[index]->EvBatterytargetVoltage * 10));
+                DEBUG_ERROR("[Module_InternalComm]CheckOutputPowerOverCarReq NG : fire = %f, battery = %f \n",
+                            _chargingData[index]->FireChargingVoltage, (_chargingData[index]->EvBatterytargetVoltage * 10));
+                if ((GetTimeoutValue(_checkOutputVolProtectTimer[index]) / 1000) >= OUTPUT_VOL_CHK_TIME) {
+                    if (_chargingData[index]->Type == _Type_Chademo) {
+                        ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemChademoOutputOVP = YES;
+                    } else if (_chargingData[index]->Type == _Type_CCS_2) {
+                        ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemCcsOutputOVP = YES;
+                    } else if (_chargingData[index]->Type == _Type_GB) {
+                        ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemGbOutputOVP = YES;
+                    }
+                    _chargingData[index]->StopChargeFlag = YES;
+                }
+            }
+        } else {
+            if (_isOvpChkTimeFlag[index] == YES) {
+                _isOvpChkTimeFlag[index] = NO;
+            }
         }
     }
 }
@@ -2157,12 +2179,14 @@ int main(void)
     //bool printRelayStatus = true;
     for (;;) {
         bool isCharging = false;
+
         // 程序開始之前~ 必須先確定 FW 版本與硬體版本,確認後!!~ 該模組才算是真正的 Initial Comp.
         if (ShmRelayModuleData->SelfTest_Comp == NO) {
             GetFwAndHwVersion_Relay();
             SetRtcData_Relay();
             sleep(1);
         }
+
 #ifndef NO_FAN_BOARD
         if (ShmFanModuleData->SelfTest_Comp == NO) {
             GetFwAndHwVersion_Fan();
@@ -2171,7 +2195,8 @@ int main(void)
             sleep(1);
             gettimeofday(&_priority_time, NULL);
         }
-#endif
+#endif //NO_FAN_BOARD
+
         // 自檢階段處理,自檢階段如果讀不到版號則代表該系統沒有掛燈板
         if (ShmLedModuleData->SelfTest_Comp == NO) {
             // 自檢階段
@@ -2202,6 +2227,7 @@ int main(void)
             // 讀取當前 AC relay 狀態
             regRelay.relay_event.bits.AC_Contactor = ShmSysConfigAndInfo->SysInfo.AcContactorStatus;
 #endif //!defined DD360 && !defined DD360Audi
+
             //GetRelayOutputStatus();
 
             for (int i = 0; i < gunCount; i++) {
@@ -2220,11 +2246,12 @@ int main(void)
                 }
 
                 CheckAcInputOvpStatus(i);
-
 #endif //!defined DD360 && !defined DD360Audi
+
                 if (_chargingData[i]->SystemStatus == S_IDLE) {
                     _chargingData[i]->RelayWeldingCheck = NO;
                     _isRelayWelding[i] = NO;
+                    _isOvpChkTimeFlag[i] = NO;
                 }
 
                 if (_chargingData[i]->SystemStatus == S_BOOTING ||
@@ -2310,53 +2337,8 @@ int main(void)
 
                 }
             }
-
-
-//          if(IsNoneMatchRelayStatus())
-//          {
-//              if (printRelayStatus)
-//              {
-////                    PRINTF_FUNC("Match Relay Target, AC = %x, g1_p = %x, g1_n = %x, g2_p = %x, g2_n = %x, pre = %x, bri_p = %x, bri_n = %x \n",
-////                            outputRelay.relay_event.bits.AC_Contactor,
-////                            outputRelay.relay_event.bits.Gun1_P,
-////                            outputRelay.relay_event.bits.Gun1_N,
-////                            outputRelay.relay_event.bits.Gun2_P,
-////                            outputRelay.relay_event.bits.Gun2_N,
-////                            outputRelay.relay_event.bits.CCS_Precharge,
-////                            outputRelay.relay_event.bits.Gun1_Parallel_P,
-////                            outputRelay.relay_event.bits.Gun1_Parallel_N);
-//              }
-//              printRelayStatus = false;
-//              if (Config_Relay_Output(Uart5Fd, Addr.Relay, &outputRelay))
-//              {
-//                  PRINTF_FUNC("Match Relay Target, AC = %x, g1_p = %x, g1_n = %x, g2_p = %x, g2_n = %x, pre = %x, bri_p = %x, bri_n = %x \n",
-//                          outputRelay.relay_event.bits.AC_Contactor,
-//                          outputRelay.relay_event.bits.Gun1_P,
-//                          outputRelay.relay_event.bits.Gun1_N,
-//                          outputRelay.relay_event.bits.Gun2_P,
-//                          outputRelay.relay_event.bits.Gun2_N,
-//                          outputRelay.relay_event.bits.CCS_Precharge,
-//                          outputRelay.relay_event.bits.Gun1_Parallel_P,
-//                          outputRelay.relay_event.bits.Gun1_Parallel_N);
-//              }
-//          }
-//          else
-//          {
-//              if (!printRelayStatus)
-//              {
-//                  PRINTF_FUNC("Match Relay, AC = %x, g1_p = %x, g1_n = %x, g2_p = %x, g2_n = %x, pre = %x, bri_p = %x, bri_n = %x \n",
-//                          regRelay.relay_event.bits.AC_Contactor,
-//                          regRelay.relay_event.bits.Gun1_P,
-//                          regRelay.relay_event.bits.Gun1_N,
-//                          regRelay.relay_event.bits.Gun2_P,
-//                          regRelay.relay_event.bits.Gun2_N,
-//                          regRelay.relay_event.bits.CCS_Precharge,
-//                          regRelay.relay_event.bits.Gun1_Parallel_P,
-//                          regRelay.relay_event.bits.Gun1_Parallel_N);
-//              }
-//              printRelayStatus = true;
-//          }
         }
+
 #ifndef NO_FAN_BOARD
         if (ShmFanModuleData->SelfTest_Comp == YES) {
             if (GetTimeoutValue(_priority_time) / 1000 >= 1000) {
@@ -2371,61 +2353,12 @@ int main(void)
                 ShmFanModuleData->SetFan3Speed = ShmFanModuleData->TestFanSpeed;
                 ShmFanModuleData->SetFan4Speed = ShmFanModuleData->TestFanSpeed;
 
-//              if (isCharging)
-//              {
-////                    if (ShmFanModuleData->PresentFan1Speed < MAX_FAN_SPEED ||
-////                        ShmFanModuleData->PresentFan2Speed < MAX_FAN_SPEED ||
-////                        ShmFanModuleData->PresentFan3Speed < MAX_FAN_SPEED ||
-////                        ShmFanModuleData->PresentFan4Speed < MAX_FAN_SPEED)
-////                    {
-////                        ShmFanModuleData->SetFan1Speed = MAX_FAN_SPEED;
-////                        ShmFanModuleData->SetFan2Speed = MAX_FAN_SPEED;
-////                        ShmFanModuleData->SetFan3Speed = MAX_FAN_SPEED;
-////                        ShmFanModuleData->SetFan4Speed = MAX_FAN_SPEED;
-////                    }
-//
-//                  // 在還沒問到 PSU 溫度~ 還是要有個最小轉速
-//                  ShmFanModuleData->SetFan1Speed = MIN_FAN_SPEED;
-//                  ShmFanModuleData->SetFan2Speed = MIN_FAN_SPEED;
-//                  ShmFanModuleData->SetFan3Speed = MIN_FAN_SPEED;
-//                  ShmFanModuleData->SetFan4Speed = MIN_FAN_SPEED;
-//
-//                  if (ShmFanModuleData->TestFanSpeed > 0)
-//                  {
-//                      ShmFanModuleData->SetFan1Speed = ShmFanModuleData->TestFanSpeed;
-//                      ShmFanModuleData->SetFan2Speed = ShmFanModuleData->TestFanSpeed;
-//                      ShmFanModuleData->SetFan3Speed = ShmFanModuleData->TestFanSpeed;
-//                      ShmFanModuleData->SetFan4Speed = ShmFanModuleData->TestFanSpeed;
-//                  }
-//              }
-//              else
-//              {
-////                    if (ShmFanModuleData->PresentFan1Speed > MIN_FAN_SPEED ||
-////                        ShmFanModuleData->PresentFan2Speed > MIN_FAN_SPEED ||
-////                        ShmFanModuleData->PresentFan3Speed > MIN_FAN_SPEED ||
-////                        ShmFanModuleData->PresentFan4Speed > MIN_FAN_SPEED)
-////                    {
-//                      ShmFanModuleData->SetFan1Speed = MIN_FAN_SPEED;
-//                      ShmFanModuleData->SetFan2Speed = MIN_FAN_SPEED;
-//                      ShmFanModuleData->SetFan3Speed = MIN_FAN_SPEED;
-//                      ShmFanModuleData->SetFan4Speed = MIN_FAN_SPEED;
-////                    }
-//
-//                  // 停止時,如溫度還是很高,則需要維持該轉速直到溫度降低
-//                  if (ShmFanModuleData->TestFanSpeed >= MAX_FAN_SPEED)
-//                  {
-//                      ShmFanModuleData->SetFan1Speed = ShmFanModuleData->TestFanSpeed;
-//                      ShmFanModuleData->SetFan2Speed = ShmFanModuleData->TestFanSpeed;
-//                      ShmFanModuleData->SetFan3Speed = ShmFanModuleData->TestFanSpeed;
-//                      ShmFanModuleData->SetFan4Speed = ShmFanModuleData->TestFanSpeed;
-//                  }
-//              }
-
                 //PRINTF_FUNC("set fan = %d \n", ShmFanModuleData->SetFan1Speed);
                 SetFanModuleSpeed();
             }
         }
-#endif
+#endif //NO_FAN_BOARD
+
         if (ShmLedModuleData->SelfTest_Comp == YES) {
             if (GetTimeoutValue(_led_priority_time) / 1000 >= 1000) {
                 if (gunCount == 1) {

+ 5 - 5
EVSE/Projects/DD360Audi/Apps/Module_LcmControl.c

@@ -414,7 +414,7 @@ void ChangeQrCode_Idle(char *input)
     uint16_t urlLen = 0;
     uint8_t cmd[len];
     uint8_t tmpBuf[15] = {0};
-    uint8_t tmpLen = sizeof(tmpBuf) - 1;
+    //uint8_t tmpLen = sizeof(tmpBuf) - 1;
 
     strncpy((char *)cmd, " ", len);
 
@@ -490,7 +490,7 @@ void ChangeQrCode_Charge(char *input)
     uint16_t urlLen = 0;
     uint8_t cmd[len];
     uint8_t tmpBuf[15] = {0};
-    uint8_t tmpLen = sizeof(tmpBuf) - 1;
+    //uint8_t tmpLen = sizeof(tmpBuf) - 1;
 
     strncpy((char *)cmd, " ", len);
 
@@ -1327,7 +1327,7 @@ void ProcessPageInfo()
                     } else {
                         ChangeChargingPowerValue(0);
                     }
-#if 0
+#if 1
                     if (_chargingInfoData[i]->PresentChargedEnergy >= 0.1 &&
                             _chargingInfoData[i]->PresentChargedEnergy <= ENERGY_MAX_KWH) {
                         ChangeChargingEnergyValue(_chargingInfoData[i]->PresentChargedEnergy);
@@ -1344,7 +1344,7 @@ void ProcessPageInfo()
                             ChangeBalanceValue(__remain_balance, i);
                         }
                     }
-#endif // 0
+#else
                     ChangeChargingEnergyValue(_chargingInfoData[i]->PresentChargedEnergy);
 
                     if (ShmSysConfigAndInfo->SysConfig.BillingData.isBilling &&
@@ -1352,7 +1352,7 @@ void ProcessPageInfo()
                         ChangeChargingFeeValue(_chargingInfoData[i]->ChargingFee);
                         ChangeBalanceValue(__remain_balance, i);
                     }
-
+#endif // 0
                     if (!ShmSysConfigAndInfo->SysConfig.BillingData.isBilling) {
                         ChangeDisplay2Value(__charging_fee_map, _disappear);
                         ChangeDisplay2Value(__charging_fee_tx, _disappear);

+ 185 - 44
EVSE/Projects/DD360Audi/Apps/ReDoComm.c

@@ -25,6 +25,7 @@
 #include "Config.h"
 #include "ReDoComm.h"
 #include "AudiCust.h"
+#include "timeout.h"
 
 //------------------------------------------------------------------------------
 #define DEBUG_INFO(format, args...) StoreLogMsg("[%s:%d][%s][Info] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
@@ -295,36 +296,67 @@ static int doCommConnToServer(void)
 }
 
 //------------------------------------------------------------------------------
-//--- DoComm function ---
+//--- Audi select gun ---
 //------------------------------------------------------------------------------
-static int compareOpcode(uint8_t opCode)
+static void clearPricesInfo(uint8_t id)
 {
-    if (opCode != OP_WAIT_RESPONSE) {
-        //DEBUG_ERROR("response operative code fail\r\n");
-        return FAIL;
-    }
+    memset(&gAudiCustInfo->PricesInfo[id], 0, sizeof(PricesInfo));
+    gAudiCustInfo->PricesInfo[id].Balance = FAIL_BALANCE_PRICES;
+}
 
-    return PASS;
+static void ClearAuthorizedFlag(void)
+{
+    ShmOCPP16Data->SpMsg.bits.AuthorizeConf = NO;
+    ShmSysConfigAndInfo->SysInfo.AuthorizeFlag = NO;
 }
 
-static int compareResult(uint8_t result)
+static void ClearDetectPluginFlag(void)
 {
-    if (result != COMMAND_RESULT_OK) {
-        //DEBUG_ERROR("response result fail\r\n");
-        return FAIL;
+    ShmSysConfigAndInfo->SysInfo.WaitForPlugit = NO;
+}
+
+static bool isDetectPlugin(void)
+{
+    if (ShmSysConfigAndInfo->SysInfo.WaitForPlugit == YES) {
+        return YES;
     }
 
-    return PASS;
+    return NO;
 }
 
-static int compareRegister(uint8_t srcReg, uint8_t destReg)
+static void destroySelectGun(uint8_t curGun)
 {
-    if (srcReg != destReg) {
-        //DEBUG_ERROR("response register fail\r\n");
-        return FAIL;
+    uint8_t i = 0;
+    uint8_t totalGun = ShmSysConfigAndInfo->SysConfig.TotalConnectorCount;
+
+    if (curGun == DESTROY_ALL_SEL) {
+        gAudiCustInfo->SelGunInfo.RightGun = SEL_GUN_RELEASE;
+        gAudiCustInfo->SelGunInfo.LeftGun = SEL_GUN_RELEASE;
+
+        for (i = 0; i < totalGun; i++) {
+            ChargingData[i]->TimeoutFlag = Timeout_None;
+            clearPricesInfo(i);
+        }
+        ShmSysConfigAndInfo->SysInfo.CurGunSelected = 0;
+        strcpy((char *)ShmSysConfigAndInfo->SysConfig.UserId, "");
     }
 
-    return PASS;
+    //for charging timeout or complete
+    if ((curGun == LEFT_GUN_NUM) && (gAudiCustInfo->SelGunInfo.LeftGun != SEL_GUN_RELEASE)) {
+        gAudiCustInfo->SelGunInfo.LeftGun = SEL_GUN_RELEASE;
+        if (ShmOCPP16Data->SpMsg.bits.AuthorizeConf != NO) {
+            ClearAuthorizedFlag();
+        }
+        clearPricesInfo(curGun);
+    }
+
+    if ((curGun == RIGHT_GUN_NUM) && (gAudiCustInfo->SelGunInfo.RightGun != SEL_GUN_RELEASE)) {
+        if (ShmOCPP16Data->SpMsg.bits.AuthorizeConf != NO) {
+            ClearAuthorizedFlag();
+        }
+
+        clearPricesInfo(curGun);
+    }
 }
 
 static int getConfirmSelectedGun(uint8_t curSel)
@@ -361,6 +393,39 @@ static void setConfirmSelGun(uint8_t selGun)
     }
 }
 
+//------------------------------------------------------------------------------
+//--- DoComm function ---
+//------------------------------------------------------------------------------
+static int compareOpcode(uint8_t opCode)
+{
+    if (opCode != OP_WAIT_RESPONSE) {
+        //DEBUG_ERROR("response operative code fail\r\n");
+        return FAIL;
+    }
+
+    return PASS;
+}
+
+static int compareResult(uint8_t result)
+{
+    if (result != COMMAND_RESULT_OK) {
+        //DEBUG_ERROR("response result fail\r\n");
+        return FAIL;
+    }
+
+    return PASS;
+}
+
+static int compareRegister(uint8_t srcReg, uint8_t destReg)
+{
+    if (srcReg != destReg) {
+        //DEBUG_ERROR("response register fail\r\n");
+        return FAIL;
+    }
+
+    return PASS;
+}
+
 static float transPricesUnit(int prices)
 {
     //printf("prices = %.2f\r\n", prices * PRICES_UNIT);
@@ -375,7 +440,7 @@ static void clearMiscCommand(void)
 static int qrCodeUrlInfoHandle(uint8_t *data)
 {
     int len = 0;
-    char cmdBuf[128] = {0};
+    //char cmdBuf[128] = {0};
     char localTime[128] = {0};
     uint16_t timeLen = 0;
     struct timeb SeqEndTime;
@@ -599,27 +664,86 @@ static int miscCommandHandle(uint8_t dataLen, uint8_t id, uint8_t *data)
             }
             DEBUG_INFO("Remote start charging id = %d\r\n", id);
 
-            if (getConfirmSelectedGun(id - 1) == FAIL) {
-                DEBUG_INFO("Remote start not select gun\r\n");
+            //if (getConfirmSelectedGun(id - 1) == FAIL) {
+            //    DEBUG_INFO("Remote start not select gun\r\n");
+            //    break;
+            //}
+
+            if (getSelGunWaitToAuthor(id - 1) == FAIL) {
+                DEBUG_ERROR("Remote start gun already charging\r\n");
                 break;
             }
 
-            //if (getSelGunWaitToAuthor(id - 1) == FAIL) {
-            //    DEBUG_ERROR("Remote start gun already charging\r\n");
-            //    break;
-            //}
+            if (ShmSysConfigAndInfo->SysInfo.CurGunSelected != (id - 1)) {
+                if (ShmSysConfigAndInfo->SysInfo.CurGunSelected == LEFT_GUN_NUM &&
+                        (gAudiCustInfo->SelGunInfo.LeftGun == SEL_GUN_CONFIRM ||
+                         gAudiCustInfo->SelGunInfo.LeftGun == SEL_GUN_ATHOR)) {
+                    gAudiCustInfo->SelGunInfo.LeftGun = SEL_GUN_RELEASE;
+                    strcpy((char *)ShmSysConfigAndInfo->SysConfig.UserId, "");
+                    ShmSysConfigAndInfo->SysInfo.WaitForPlugit = NO;
+                    ShmSysConfigAndInfo->SysInfo.SystemPage = _LCM_SELECT_GUN;
+                    gettimeofday(&ShmSysConfigAndInfo->SysInfo.SystemTimeoutTimer, NULL);
+                    ShmSysConfigAndInfo->SysInfo.SystemTimeoutFlag = Timeout_None;
+                }
 
-            //if (ShmSysConfigAndInfo->SysInfo.CurGunSelected != (id - 1)) {
-            //    ShmSysConfigAndInfo->SysInfo.CurGunSelected = (id - 1);
-            //    ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc = NO_DEFINE;
-            //}
+                if (ShmSysConfigAndInfo->SysInfo.CurGunSelected == RIGHT_GUN_NUM &&
+                        (gAudiCustInfo->SelGunInfo.RightGun == SEL_GUN_CONFIRM ||
+                         gAudiCustInfo->SelGunInfo.RightGun == SEL_GUN_ATHOR)) {
+                    gAudiCustInfo->SelGunInfo.RightGun = SEL_GUN_RELEASE;
+                    strcpy((char *)ShmSysConfigAndInfo->SysConfig.UserId, "");
+                    ShmSysConfigAndInfo->SysInfo.WaitForPlugit = NO;
+                    ShmSysConfigAndInfo->SysInfo.SystemPage = _LCM_SELECT_GUN;
+                    gettimeofday(&ShmSysConfigAndInfo->SysInfo.SystemTimeoutTimer, NULL);
+                    ShmSysConfigAndInfo->SysInfo.SystemTimeoutFlag = Timeout_None;
+                }
+
+                ShmSysConfigAndInfo->SysInfo.CurGunSelected = (id - 1);
+                ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc = NO_DEFINE;
+            }
 
-            //setConfirmSelGun(ShmSysConfigAndInfo->SysInfo.CurGunSelected);
+            setConfirmSelGun(ShmSysConfigAndInfo->SysInfo.CurGunSelected);
 
             ShmOCPP16Data->CsMsg.bits[id - 1].RemoteStartTransactionReq = YES;
             gAudiCustInfo->PricesInfo[id - 1].Balance = 0.00;
-            if (id == 2) {
-                clearMiscCommand();
+            clearMiscCommand();
+            break;
+
+        case MISC_CMD_REMOTE_STOP_CHARGING:
+            if (value != YES) {
+                if (id == 2) {
+                    clearMiscCommand();
+                }
+                break;
+            }
+
+            strcpy((char *)ShmSysConfigAndInfo->SysConfig.UserId, "");
+            ShmSysConfigAndInfo->SysInfo.WaitForPlugit = NO;
+            ShmSysConfigAndInfo->SysInfo.SystemPage = _LCM_SELECT_GUN;
+            gettimeofday(&ShmSysConfigAndInfo->SysInfo.SystemTimeoutTimer, NULL);
+            ShmSysConfigAndInfo->SysInfo.SystemTimeoutFlag = Timeout_None;
+            destroySelectGun(id - 1);
+
+            clearMiscCommand();
+            break;
+
+        case MISC_CMD_REMOTE_UNLOCK:
+            if (value != YES) {
+                if (id == 2) {
+                    clearMiscCommand();
+                }
+                break;
+            }
+
+            if (isDetectPlugin() == YES) {
+                ClearDetectPluginFlag();
+                strcpy((char *)ShmSysConfigAndInfo->SysConfig.UserId, "");
+                ShmSysConfigAndInfo->SysInfo.WaitForPlugit = NO;
+                ShmSysConfigAndInfo->SysInfo.SystemPage = _LCM_SELECT_GUN;
+                gettimeofday(&ShmSysConfigAndInfo->SysInfo.SystemTimeoutTimer, NULL);
+                ShmSysConfigAndInfo->SysInfo.SystemTimeoutFlag = Timeout_None;
+                destroySelectGun(id - 1);
+            } else {
+                ChargingData[id - 1]->StopChargeFlag = YES;
             }
             break;
 
@@ -722,6 +846,7 @@ static void removeFaultCodeToBuf(uint8_t *Code)
         usleep(128);
         find = 0x00;
         for (i = 0; i < ShmSysConfigAndInfo->SysWarningInfo.WarningCount; i++) {
+            usleep(128);
             if (find == 0x00) {
                 if (memcmp(&ShmSysConfigAndInfo->SysWarningInfo.WarningCode[i][0], _code, 7) == 0) {
                     find = 0x01;
@@ -767,11 +892,14 @@ static int powerCabinetStatusProcess(uint8_t dataLen, uint8_t *data)
     }
 
     if (dataLen < WARNING_CODE_SIZE) {
-        DEBUG_ERROR("status code len < 6 = %d\r\n", dataLen);
+        DEBUG_ERROR("fail status code length = %d\r\n", dataLen);
+        Hexdump(data, dataLen);
         if (ShmSysConfigAndInfo->SysWarningInfo.WarningCount > 0) {
             for (i = 0; i < ShmSysConfigAndInfo->SysWarningInfo.WarningCount; i++) {
                 usleep(128);
-                if (ShmSysConfigAndInfo->SysWarningInfo.WarningCode[i][1] >= 0x33) { //from backend or power cabinet
+                if (ShmSysConfigAndInfo->SysWarningInfo.WarningCode[i][1] >= '3' ||  //from backend or power cabinet
+                        (ShmSysConfigAndInfo->SysWarningInfo.WarningCode[i][0] >= 'B' &&
+                         ShmSysConfigAndInfo->SysWarningInfo.WarningCode[i][1] >= '4')) {
                     memset(EventCodeTmp, 0, sizeof(EventCodeTmp));
                     memcpy(EventCodeTmp,
                            ShmSysConfigAndInfo->SysWarningInfo.WarningCode[i],
@@ -808,6 +936,7 @@ static int powerCabinetStatusProcess(uint8_t dataLen, uint8_t *data)
         }
 
         strncpy((char *)&StatusArray[count / WARNING_CODE_SIZE], (char *)&data[count], WARNING_CODE_SIZE);
+
         ret = 0;
         for (i = 0; i < ShmSysConfigAndInfo->SysWarningInfo.WarningCount; i++) {
             usleep(128);
@@ -827,7 +956,18 @@ static int powerCabinetStatusProcess(uint8_t dataLen, uint8_t *data)
 
     for (i = 0; i < ShmSysConfigAndInfo->SysWarningInfo.WarningCount; i++) {
         usleep(128);
-        if (ShmSysConfigAndInfo->SysWarningInfo.WarningCode[i][1] >= '3') { //from backend or power cabinet 0x33
+        //if (ShmSysConfigAndInfo->SysWarningInfo.WarningCode[i][0] >= 'B' &&
+        //        ShmSysConfigAndInfo->SysWarningInfo.WarningCode[i][1] >= '4') {
+        //    memset(EventCodeTmp, 0, sizeof(EventCodeTmp));
+        //    memcpy(EventCodeTmp,
+        //           ShmSysConfigAndInfo->SysWarningInfo.WarningCode[i],
+        //           sizeof(EventCodeTmp));
+        //    removeFaultCodeToBuf(EventCodeTmp);
+        //}
+
+        if (ShmSysConfigAndInfo->SysWarningInfo.WarningCode[i][1] >= '3' || //from backend or power cabinet 0x33
+                (ShmSysConfigAndInfo->SysWarningInfo.WarningCode[i][0] >= 'B' &&
+                 ShmSysConfigAndInfo->SysWarningInfo.WarningCode[i][1] >= '4')) {
             ret = 0;
 
             for (count = 0; count < (dataLen / WARNING_CODE_SIZE); count++) {
@@ -1707,14 +1847,14 @@ static int messageTrigger(int fd, uint8_t plugNum, uint8_t gunID, uint8_t curReg
     return ret;
 }
 
-static bool isDetectPlugin()
-{
-    if (ShmSysConfigAndInfo->SysInfo.WaitForPlugit == YES) {
-        return YES;
-    }
-
-    return NO;
-}
+//static bool isDetectPlugin()
+//{
+//    if (ShmSysConfigAndInfo->SysInfo.WaitForPlugit == YES) {
+//        return YES;
+//    }
+//
+//    return NO;
+//}
 
 static void systemStatusProcess(int fd, uint8_t plugNum, uint8_t gunID)
 {
@@ -1893,6 +2033,7 @@ static int networkCreatePorcess(void)
                ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthGatewayAddress);
 
     gDoCommGblData.DisConnCount = 0;
+    destroySelectGun(DESTROY_ALL_SEL);
 
     sleep(3);
 
@@ -1924,14 +2065,14 @@ int main(int argc, char *argv[])
         return 0;
     }
 
-    totalConnCount =  ShmSysConfigAndInfo->SysConfig.TotalConnectorCount;
+    totalConnCount = ShmSysConfigAndInfo->SysConfig.TotalConnectorCount;
 
     for (index = 0; index < totalConnCount; index++) {
         if (!FindChargingInfoData(index, &ChargingData[0])) {
             DEBUG_ERROR("FindChargingInfoData false \n");
             break;
         }
-        gAudiCustInfo->PricesInfo[index].Balance = FAIL_BALANCE_PRICES;
+        clearPricesInfo(index);
     }
 
     //initial trigger message timer

+ 3 - 1
EVSE/Projects/DD360Audi/Apps/ReDoComm.h

@@ -104,6 +104,8 @@
 #define MISC_CMD_HARDWARE_REBOOT                0x0101
 #define MISC_CMD_SOFTWARE_RESTART               0x0102
 #define MISC_CMD_REMOTE_START_CHARGING          0x0103
+#define MISC_CMD_REMOTE_STOP_CHARGING           0x0104
+#define MISC_CMD_REMOTE_UNLOCK                  0x0105
 
 #define ST_UPDATE_FIRMWARE                      0x01
 #define ST_NO_UPDATE_FIRMWARE                   0x02
@@ -117,7 +119,7 @@ typedef struct StDoCommGlobalVar {
     uint8_t DisConnCount;
     uint8_t ConnectorID[2]; //keep from power cabinet
     uint8_t MiscCmd;
-    uint8_t Reserved[4];
+    uint8_t Reserved[3];
 } DoCommGblData;
 
 typedef struct StCommnadHead {

+ 23 - 30
EVSE/Projects/DD360Audi/Apps/main.c

@@ -1119,7 +1119,7 @@ void InitEthernet()
     system(tmpbuf);
 
     pid_t pid = fork();
-
+    DEBUG_INFO_MSG("InitEthernet = %d\r\n", pid);
     if (pid == 0) {
         for (;;) {
 #if !defined DD360 && !defined DD360Audi
@@ -2567,32 +2567,6 @@ void CheckErrorOccurStatus(byte index)
             InformOcppErrOccur(6);
         }
     }
-
-    if (chargingInfo[index]->Type == _Type_Chademo) {
-        if (ShmStatusCodeData->FaultCode.FaultEvents.bits.ChademoOutputRelayWelding == YES) {
-            memcpy(chargingInfo[index]->ConnectorAlarmCode, "011011", 6);
-        } else if (ShmStatusCodeData->FaultCode.FaultEvents.bits.ChademoOutputRelayDrivingFault == YES) {
-            memcpy(chargingInfo[index]->ConnectorAlarmCode, "011012", 6);
-        } else if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemChademoOutputOVP == YES) {
-            memcpy(chargingInfo[index]->ConnectorAlarmCode, "012217", 6);
-        }
-    } else if (chargingInfo[index]->Type == _Type_GB) {
-        if (ShmStatusCodeData->FaultCode.FaultEvents.bits.GbOutputRelayWelding == YES) {
-            memcpy(chargingInfo[index]->ConnectorAlarmCode, "011015", 6);
-        } else if (ShmStatusCodeData->FaultCode.FaultEvents.bits.GbOutputRelayDrivingFault == YES) {
-            memcpy(chargingInfo[index]->ConnectorAlarmCode, "011016", 6);
-        } else if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemGbOutputOVP == YES) {
-            memcpy(chargingInfo[index]->ConnectorAlarmCode, "012221", 6);
-        }
-    } else if (chargingInfo[index]->Type == _Type_CCS_2) {
-        if (ShmStatusCodeData->FaultCode.FaultEvents.bits.CcsOutputRelayWelding == YES) {
-            memcpy(chargingInfo[index]->ConnectorAlarmCode, "011013", 6);
-        } else if (ShmStatusCodeData->FaultCode.FaultEvents.bits.CcsOutputRelayDrivingFault == YES) {
-            memcpy(chargingInfo[index]->ConnectorAlarmCode, "011014", 6);
-        } else if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemCcsOutputOVP == YES) {
-            memcpy(chargingInfo[index]->ConnectorAlarmCode, "012219", 6);
-        }
-    }
 }
 
 //===============================================
@@ -3412,6 +3386,7 @@ void CreateRfidFork()
     pid_t rfidRecPid;
 
     rfidRecPid = fork();
+    DEBUG_INFO_MSG("CreateRfidFork = %d\r\n", rfidRecPid);
     if (rfidRecPid == 0) {
         while (true) {
             // 刷卡判斷
@@ -3557,11 +3532,12 @@ void CreateTimeoutFork()
     pid_t timeoutPid;
 
     timeoutPid = fork();
-    if (timeoutPid > 0) {
+    DEBUG_INFO_MSG("CreateTimeoutFork = %d\r\n", timeoutPid);
+    if (timeoutPid == 0) {
         gettimeofday(&_cmdSubPriority_time, NULL);
         CheckConnectionTimeout();
 
-        while (true) {
+        while (1) {
             if ((GetTimeoutValue(_cmdSubPriority_time) / 1000) > 5000) {
                 CheckConnectionTimeout();
                 gettimeofday(&_cmdSubPriority_time, NULL);
@@ -4622,9 +4598,25 @@ bool GetStartChargingByAlterMode(byte _gun)
     return result;
 }
 
-int main(void)
+void ResetDetAlarmStatus(byte gun)
 {
+    if (chargingInfo[gun]->Type == _Type_Chademo) {
+        if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemChademoOutputOVP == YES) {
+            ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemChademoOutputOVP = NO;
+        }
+    } else if (chargingInfo[gun]->Type == _Type_GB) {
+        if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemGbOutputOVP == YES) {
+            ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemGbOutputOVP = NO;
+        }
+    } else if (chargingInfo[gun]->Type == _Type_CCS_2) {
+        if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemCcsOutputOVP == YES) {
+            ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemCcsOutputOVP = NO;
+        }
+    }
+}
 
+int main(void)
+{
     if (CreateShareMemory() == 0) {
 #ifdef SystemLogMessage
         DEBUG_ERROR_MSG("CreatShareMemory NG \n");
@@ -4766,6 +4758,7 @@ int main(void)
                     //Jerry add
                     memset(&gAudiCustInfo->PricesInfo[gun_index], 0, sizeof(PricesInfo));
                     gAudiCustInfo->PricesInfo[gun_index].Balance = FAIL_BALANCE_PRICES;
+                    ResetDetAlarmStatus(gun_index);
                 } else if (chargingInfo[gun_index]->SystemStatus == S_RESERVATION &&
                            isModeChange(gun_index)) {
                     DEBUG_INFO_MSG("S_RESERVATION....................%x \n", gun_index);

BIN
EVSE/Projects/DD360Audi/Images/ramdisk.gz


BIN
EVSE/Projects/DD360Audi/output/DoComm


BIN
EVSE/Projects/DD360Audi/output/Module_EvComm


BIN
EVSE/Projects/DD360Audi/output/Module_EventLogging


BIN
EVSE/Projects/DD360Audi/output/Module_InternalComm


BIN
EVSE/Projects/DD360Audi/output/Module_LcmControl


BIN
EVSE/Projects/DD360Audi/output/main


Diferenças do arquivo suprimidas por serem muito extensas
+ 730 - 846
EVSE/Projects/DS60-120/Apps/Module_InternalComm.c


BIN
EVSE/rootfs/root/OcppBackend20


Alguns arquivos não foram mostrados porque muitos arquivos mudaram nesse diff