Преглед изворни кода

2021-10-12 / Simon Xue

Action:
    1. Check System Task turn into Module Task.
    2. Verison 1.17
Simon Xue пре 3 година
родитељ
комит
be9e41e19b
69 измењених фајлова са 2824 додато и 693 уклоњено
  1. 114 91
      EVSE/Projects/DD360/Apps/CSU/main.c
  2. 1 0
      EVSE/Projects/DD360/Apps/CSU/main.h
  3. 1 0
      EVSE/Projects/DD360/Apps/Define/define.h
  4. 33 2
      EVSE/Projects/DD360/Apps/Makefile
  5. 238 0
      EVSE/Projects/DD360/Apps/ModuleChkSysTask/Module_ChkSysTask.c
  6. 62 0
      EVSE/Projects/DD360/Apps/ModuleChkSysTask/Module_ChkSysTask.h
  7. 205 198
      EVSE/Projects/DD360/Apps/ModuleEvComm/Ev_Comm.c
  8. 3 0
      EVSE/Projects/DD360/Apps/ModuleEvComm/Ev_Comm.h
  9. 24 0
      EVSE/Projects/DD360/Apps/ModuleEvComm/Module_EvRxComm.c
  10. 11 0
      EVSE/Projects/DD360/Apps/ModuleEvComm/Module_EvTxComm.c
  11. 6 16
      EVSE/Projects/DD360/Apps/ModulePrimary/Module_PrimaryComm.c
  12. 509 0
      EVSE/Projects/DD360/Apps/ModuleUpdateFW/Module_UpdateFW.c
  13. 2 0
      EVSE/Projects/DD360/Apps/Script/init.sh
  14. 2 0
      EVSE/Projects/DD360/Apps/Script/kill.sh
  15. BIN
      EVSE/Projects/DD360/Apps/UnsafetyOutputTask
  16. BIN
      EVSE/Projects/DD360/Images/ramdisk.gz
  17. BIN
      EVSE/Projects/DD360/output/FactoryConfig
  18. BIN
      EVSE/Projects/DD360/output/Module_ChkSysTask
  19. BIN
      EVSE/Projects/DD360/output/Module_DoComm
  20. BIN
      EVSE/Projects/DD360/output/Module_EvComm
  21. BIN
      EVSE/Projects/DD360/output/Module_EventLogging
  22. BIN
      EVSE/Projects/DD360/output/Module_InternalComm
  23. BIN
      EVSE/Projects/DD360/output/Module_LcmControl
  24. BIN
      EVSE/Projects/DD360/output/Module_PrimaryComm
  25. BIN
      EVSE/Projects/DD360/output/Module_UpdateFW
  26. BIN
      EVSE/Projects/DD360/output/ReadCmdline
  27. 2 0
      EVSE/Projects/DD360/output/init.sh
  28. 6 0
      EVSE/Projects/DD360/output/kill.sh
  29. BIN
      EVSE/Projects/DD360/output/main
  30. 66 74
      EVSE/Projects/DD360Audi/Apps/CSU/main.c
  31. 17 2
      EVSE/Projects/DD360Audi/Apps/Makefile
  32. 238 0
      EVSE/Projects/DD360Audi/Apps/ModuleChkSysTask/Module_ChkSysTask.c
  33. 62 0
      EVSE/Projects/DD360Audi/Apps/ModuleChkSysTask/Module_ChkSysTask.h
  34. 1 1
      EVSE/Projects/DD360Audi/Apps/ModuleUpdateFW/Module_UpdateFW.c
  35. BIN
      EVSE/Projects/DD360Audi/Images/ramdisk.gz
  36. BIN
      EVSE/Projects/DD360Audi/output/Module_ChkSysTask
  37. BIN
      EVSE/Projects/DD360Audi/output/Module_UpdateFW
  38. BIN
      EVSE/Projects/DD360Audi/output/main
  39. 0 0
      EVSE/Projects/DD360ComBox/Apps/.metadata/.lock
  40. 114 91
      EVSE/Projects/DD360ComBox/Apps/CSU/main.c
  41. 1 0
      EVSE/Projects/DD360ComBox/Apps/CSU/main.h
  42. 1 0
      EVSE/Projects/DD360ComBox/Apps/Define/define.h
  43. 33 2
      EVSE/Projects/DD360ComBox/Apps/Makefile
  44. 238 0
      EVSE/Projects/DD360ComBox/Apps/ModuleChkSysTask/Module_ChkSysTask.c
  45. 62 0
      EVSE/Projects/DD360ComBox/Apps/ModuleChkSysTask/Module_ChkSysTask.h
  46. 205 198
      EVSE/Projects/DD360ComBox/Apps/ModuleEvComm/Ev_Comm.c
  47. 3 0
      EVSE/Projects/DD360ComBox/Apps/ModuleEvComm/Ev_Comm.h
  48. 24 0
      EVSE/Projects/DD360ComBox/Apps/ModuleEvComm/Module_EvRxComm.c
  49. 11 0
      EVSE/Projects/DD360ComBox/Apps/ModuleEvComm/Module_EvTxComm.c
  50. 6 16
      EVSE/Projects/DD360ComBox/Apps/ModulePrimary/Module_PrimaryComm.c
  51. 509 0
      EVSE/Projects/DD360ComBox/Apps/ModuleUpdateFW/Module_UpdateFW.c
  52. 2 0
      EVSE/Projects/DD360ComBox/Apps/Script/init.sh
  53. 2 0
      EVSE/Projects/DD360ComBox/Apps/Script/kill.sh
  54. BIN
      EVSE/Projects/DD360ComBox/Apps/UnsafetyOutputTask
  55. BIN
      EVSE/Projects/DD360ComBox/Images/ramdisk.gz
  56. BIN
      EVSE/Projects/DD360ComBox/output/FactoryConfig
  57. BIN
      EVSE/Projects/DD360ComBox/output/Module_ChkSysTask
  58. BIN
      EVSE/Projects/DD360ComBox/output/Module_DoComm
  59. BIN
      EVSE/Projects/DD360ComBox/output/Module_EvComm
  60. BIN
      EVSE/Projects/DD360ComBox/output/Module_EventLogging
  61. BIN
      EVSE/Projects/DD360ComBox/output/Module_InternalComm
  62. BIN
      EVSE/Projects/DD360ComBox/output/Module_LcmControl
  63. BIN
      EVSE/Projects/DD360ComBox/output/Module_PrimaryComm
  64. BIN
      EVSE/Projects/DD360ComBox/output/Module_UpdateFW
  65. BIN
      EVSE/Projects/DD360ComBox/output/ReadCmdline
  66. 2 0
      EVSE/Projects/DD360ComBox/output/init.sh
  67. 6 0
      EVSE/Projects/DD360ComBox/output/kill.sh
  68. BIN
      EVSE/Projects/DD360ComBox/output/main
  69. 2 2
      EVSE/Projects/define.h

+ 114 - 91
EVSE/Projects/DD360/Apps/CSU/main.c

@@ -41,7 +41,7 @@
 #include "../Define/define.h"
 #include "../ShareMemory/shmMem.h"
 #include "../SelectGun/SelectGun.h"
-#include "CheckSystemTask.h"
+
 
 //------------------------------------------------------------------------------
 static struct SysInfoData *pSysInfo = NULL;
@@ -82,7 +82,7 @@ uint8_t bd0_2_status = 0;
 uint8_t bd1_1_status = 0;
 uint8_t bd1_2_status = 0;
 
-char *fwVersion = "V1.15.00.0000.00"; // "V0.16.00.0000.00";
+char *fwVersion = "V1.17.00.0000.00"; // "V0.16.00.0000.00";
 
 //sqlite3 *localDb;
 bool isDb_ready;
@@ -120,7 +120,7 @@ extern void SetIsCardScan(bool value);
 extern void SelfTestRun(void);
 
 //UpgradeFW.c
-extern void CheckFwUpdateFunction(void);
+/*extern void CheckFwUpdateFunction(void);*/
 
 //Ethernet.c
 extern void InitEthernet(void);
@@ -1637,12 +1637,14 @@ void _DetectPlugInTimeout(void)
     ClearDetectPluginFlag();
 
     sleep(1); //等待DoComm回報插槍訊號給主櫃
-#if defined DD360Audi || DD360 || DD360Combox
+#if defined DD360Audi
 	    //pSysInfo->SystemPage = _LCM_COMPLETE;
 		setChargerMode(pSysInfo->CurGunSelected, S_TERMINATING);
-	    return;
-#endif
+#elif DD360 || DD360Combox
+	setChargerMode(pSysInfo->CurGunSelected, S_COMPLETE);
     systemPageRestoreInit();
+#endif
+
 }
 
 void _DetectEvChargingEnableTimeout(uint8_t gunIndex)
@@ -1671,11 +1673,11 @@ void _DetectEvseChargingEnableTimeout(uint8_t gunIndex)
     log_info("*********** _DetectEvseChargingEnableTimeout (GFD timeout) ***********\n");
     //if (chargingInfo[gunIndex]->GroundFaultStatus != GFD_PASS)
     {
-#if defined DD360Audi || DD360 || DD360Combox
-        pSysInfo->SystemPage = _LCM_COMPLETE;
-        setChargerMode(gunIndex, S_TERMINATING);
-#else
-        setChargerMode(gunIndex, MODE_IDLE);
+#if defined DD360Audi
+	    //pSysInfo->SystemPage = _LCM_COMPLETE;
+		setChargerMode(pSysInfo->CurGunSelected, S_TERMINATING);
+#elif DD360 || DD360Combox
+	setChargerMode(pSysInfo->CurGunSelected, S_COMPLETE);
 #endif
         _AutoReturnTimeout();
     }
@@ -1684,11 +1686,11 @@ void _DetectEvseChargingEnableTimeout(uint8_t gunIndex)
 void _PrepareTimeout(uint8_t gunIndex)
 {
     log_info("*********** _PrepareTimeout ***********\n");
-#if defined DD360Audi || DD360 || DD360Combox
-        pSysInfo->SystemPage = _LCM_COMPLETE;
-        setChargerMode(gunIndex, S_TERMINATING);
-#else
-     setChargerMode(gunIndex, MODE_IDLE);
+#if defined DD360Audi
+	    //pSysInfo->SystemPage = _LCM_COMPLETE;
+		setChargerMode(pSysInfo->CurGunSelected, S_TERMINATING);
+#elif DD360 || DD360Combox
+	setChargerMode(pSysInfo->CurGunSelected, S_COMPLETE);
 #endif
     pAlarmCode->AlarmEvents.bits.PsuNoResource = YES;
     _AutoReturnTimeout();
@@ -1697,76 +1699,15 @@ void _PrepareTimeout(uint8_t gunIndex)
 void _CcsPrechargeTimeout(uint8_t gunIndex)
 {
     log_info("*********** _CcsPrechargeTimeout ***********\n");
-#if defined DD360Audi || DD360 || DD360Combox
-        pSysInfo->SystemPage = _LCM_COMPLETE;
-        setChargerMode(gunIndex, S_TERMINATING);
-#else
-     setChargerMode(gunIndex, MODE_IDLE);
+#if defined DD360Audi
+	    //pSysInfo->SystemPage = _LCM_COMPLETE;
+		setChargerMode(pSysInfo->CurGunSelected, S_TERMINATING);
+#elif DD360 || DD360Combox
+	setChargerMode(pSysInfo->CurGunSelected, S_COMPLETE);
 #endif
 }
 
-//===============================================
-// Check System Task alive
-// ==============================================
-void CheckSystemTaskAlive()
-{
-    unsigned char lostId = CheckSystemTask(ShmSysConfigAndInfo->SysInfo.SystemPage);
-    if (lostId != 0) {
-        log_info("Check task(%d) lost\n",lostId);
-        if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemTaskLost == NO) {
-           if (lostId == _SYSTEM_TASK_LOST_ITEM_MAIN)
-               log_info("System task lost (CSU). \n");
-           else if (lostId == _SYSTEM_TASK_LOST_ITEM_EVCOMM)
-               log_info("System task lost (EVComm). \n");
-//           else if (lostId == _SYSTEM_TASK_LOST_ITEM_PSUCOMM)
-//               PRINTF_FUNC("System task lost (PSU Task). \n");
-           else if (lostId == _SYSTEM_TASK_LOST_ITEM_EVENTLOG)
-               log_info("System task lost (Event log). \n");
-           else if (lostId == _SYSTEM_TASK_LOST_ITEM_PRIMARYCOMM)
-               log_info("System task lost (Primary). \n");
-           else if (lostId == _SYSTEM_TASK_LOST_ITEM_LCMCONTROL)
-               log_info("System task lost (LCM Comm). \n");
-           else if (lostId == _SYSTEM_TASK_LOST_ITEM_INTERCOMM)
-               log_info("System task lost (Internal Comm). \n");
-           else if (lostId == _SYSTEM_TASK_LOST_ITEM_DOCOMM)
-               log_info("System task lost (Do Comm). \n");
-           else if (lostId == _SYSTEM_TASK_LOST_ITEM_PRODUCTUTILS)
-               log_info("System task lost (ProcductUtils Comm). \n");
-           ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemTaskLost = YES;
-        }
-    } else
-        ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemTaskLost = NO;
-}
-
-void CreateCheckSystemTaskFork()
-{
-    pid_t taskPid;
-    taskPid = fork();
-    if (taskPid == 0)
-    {
-        while(true)
-        {
-			/*
-			for (int _index = 0; _index < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount; _index++)
-			{
-				if (chargingInfo[_index]->SystemStatus == SYS_MODE_UPDATE ||
-						chargingInfo[_index]->Type == 0x09)
-				{
-					stopToDet = true;
-					continue;
-				}
-			}
-			*/
-			for (uint8_t gun = 0; gun < pSysConfig->TotalConnectorCount; gun++) {
-				pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(gun);
-				if (pDcChargingInfo->SystemStatus == SYS_MODE_UPDATE )
-						continue;
-			}
-			CheckSystemTaskAlive();
-			sleep(5);
-		}
-	}
-}
+
 //===============================================
 // 取得卡號與卡號驗證
 //===============================================
@@ -2663,6 +2604,11 @@ int SpawnTask(void)
     system("/root/Module_LcmControl &");
     system("/root/Module_InternalComm &");
     system("/root/Module_ProduceUtils &");
+    system("/root/Module_UpdateFW &");
+
+    unsigned char count = GetProcessCount("Module_ChkSysTask");
+    if( count != 1)
+        system("/root/Module_ChkSysTask &");
 
 #if defined DD360 ||defined DD360Audi || defined DD360ComBox
     system("/root/Module_DoComm &");
@@ -2702,6 +2648,8 @@ void KillTask(void)
     system("killall Module_EvComm");
     system("killall Module_LcmControl");
     system("killall Module_InternalComm");
+    system("killall Module_UpdateFW");
+    system("killall Module_ChkSysTask");
     //system("killall Module_DoComm");
 #if defined DD360 || defined DD360Audi || defined DD360ComBox
     return ;
@@ -2738,6 +2686,8 @@ void KillAllTask(void)
     system("killall Module_EvComm");
     system("killall Module_LcmControl");
     system("killall Module_InternalComm");
+    system("killall Module_UpdateFW");
+    system("killall Module_ChkSysTask");
 
 #if defined DD360 || defined DD360Audi || defined DD360ComBox
     system("killall Module_DoComm");
@@ -2849,8 +2799,8 @@ void CreateTimeoutFork(void)
                         pAlarmCode->AlarmEvents.bits.DisconnectedFromDo = ABNORMAL;
                         log_error("Author timeout restart DoComm\r\n");
                         system("killall Module_DoComm");
-                        sleep(1);
-                        system("/root/Module_DoComm &");
+                        //sleep(1);
+                        //system("/root/Module_DoComm &");
                     }
                 }
                 break;
@@ -2865,8 +2815,8 @@ void CreateTimeoutFork(void)
                         pAlarmCode->AlarmEvents.bits.DisconnectedFromDo = ABNORMAL;
                         log_error("Author timeout restart DoComm\r\n");
                         system("killall Module_DoComm");
-                        sleep(1);
-                        system("/root/Module_DoComm &");
+                        //sleep(1);
+                        //system("/root/Module_DoComm &");
                     }
                 }
                 break;
@@ -3431,7 +3381,7 @@ void StopProcessingLoop()
 {
     for (;;) {
         CheckFactoryConfigFunction();
-        CheckFwUpdateFunction();
+        //CheckFwUpdateFunction();
         if (pSysWarning->Level == WARN_LV_ER) {
             ChkPrimaryStatus();
             if (pSysWarning->Level == WARN_LV_NL) {
@@ -3792,13 +3742,29 @@ static void autoStartChargingForComBox(uint8_t gunIndex)
     return ;
 #endif //!defined DD360ComBox
 
+    if ( (pSysInfo->SystemPage >= _LCM_AUTHORIZING && pSysInfo->SystemPage <= _LCM_AUTHORIZ_FAIL) ||
+        pDcChargingInfo->isVerify ) {
+        return;
+    }
     pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(gunIndex);
 
     if ((pDcChargingInfo->ConnectorPlugIn == YES) &&
             (pDcChargingInfo->SystemStatus == S_IDLE)
        ) {
-        pSysInfo->CurGunSelected = gunIndex;
+
+#if VERIFY_EVCCID
+        if (!pDcChargingInfo->isVerify ) {
+            strcpy((char *)pSysConfig->UserId, (char *)pDcChargingInfo->EVCCID);
+            if( strcmp( (char *)pSysConfig->UserId , "" ) != EQUAL ) {
+                pDcChargingInfo->isVerify = true;
+                log_info("Get User(%d) ID:%s\n",gunIndex,pSysConfig->UserId);
+                pSysInfo->CurGunSelected = gunIndex;
+                pSysInfo->SystemPage = _LCM_AUTHORIZING;
+            }
+        }
+#else
         strcpy((char *)&pSysConfig->UserId, "AutoStartCharging");
+#endif
     }
 }
 
@@ -4018,7 +3984,58 @@ static uint8_t distributionPsuModule(uint8_t *isRessign, uint8_t gunIndex)
 
     return NO;
 }
+bool Taskconutstring(char *src, char *taskname)
+{
+    bool result = false;
+
+    if (src == NULL || strlen(src) == 0)
+        return result;
+
+    if (strstr(src, taskname) != NULL &&
+        strstr(src, "grep") == NULL &&
+        strstr(src, "[") == NULL)
+    {
+        result = true;
+    }
+
+    return result;
+}
+
+int GetProcessCount(char *procName)
+{
+	int result = 0;
+	FILE *fp;
+	char cmd[256];
+	char buf[256];
+
+	sprintf(cmd, "ps -ef |grep %s", procName);
+	fp = popen(cmd, "r");
+	if(fp != NULL)
+	{
+		while(fgets(buf, sizeof(buf), fp) != NULL)
+		{
+			if (Taskconutstring(buf, procName))
+				result++;
+		}
+	}
+
+	pclose(fp);
 
+	return result;
+}
+void CheckTaskAlive()
+{
+    //log_info("Checking Task Alive\n");
+    unsigned char count = GetProcessCount("Module_ChkSysTask");
+    if( count != 1 ) {
+        system("killall Module_ChkSysTask");
+        sleep(3);
+        system("/root/Module_ChkSysTask");
+        log_info("System task lost (Check System Task) \n");
+        //ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemTaskLost = YES;
+    } //else
+        //ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemTaskLost = NO;
+}
 /**
  * [checkPileEndGfdResult 確認充電樁GFD狀態]
  * @Author   Jerry
@@ -4363,11 +4380,14 @@ int main(void)
 
     //signal(SIGCHLD,SIG_IGN);
 
-	CreateCheckSystemTaskFork();
+	//CreateCheckSystemTaskFork();
 
     CreateWatchdog();
 
     for (;;) {
+
+        CheckTaskAlive();
+
         CheckOcppStatus();
 
         ChkPrimaryStatus();
@@ -4378,7 +4398,7 @@ int main(void)
            ) {
             CheckFactoryConfigFunction();
 
-            CheckFwUpdateFunction();
+            //CheckFwUpdateFunction();
         }
 
         // OCPP 邏輯
@@ -5094,6 +5114,9 @@ int main(void)
                         GetTimeoutValue(pDcChargingInfo->TimeoutTimer) >= 10000000) {
                     setChargerMode(gunIndex, MODE_IDLE);
                     destroySelGun(gunIndex); //Jerry add
+#ifdef DD360 || DD3660ComBox
+					pSysInfo->SystemPage = _LCM_IDLE;
+#endif
                 }
 
                 if (pSysInfo->CurGunSelected == gunIndex) {

+ 1 - 0
EVSE/Projects/DD360/Apps/CSU/main.h

@@ -43,6 +43,7 @@
 #define GUN_PRECHARGING_TIMEOUT                 (60)
 
 #define WHILE_LOOP_TIME                         (10000)
+#define VERIFY_EVCCID                           0   // 0:Not verify 1:for verify
 
 //#define log_info(format, args...) StoreLogMsg_1("[%s:%d][%s][Info] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
 //#define log_warn(format, args...) StoreLogMsg_1("[%s:%d][%s][Warn] "format, __FILE__, __LINE__, __FUNCTION__, ##args)

+ 1 - 0
EVSE/Projects/DD360/Apps/Define/define.h

@@ -638,6 +638,7 @@ struct ChargingInfoData
     struct timespec     ConnectorTimeout;
     unsigned char       PantographFlag;                 // 0: normal gun type,  1: pantograph gun type
 	unsigned char 		Replug_flag;
+    unsigned char       isVerify;
 };
 
 typedef union

+ 33 - 2
EVSE/Projects/DD360/Apps/Makefile

@@ -19,6 +19,8 @@ INC_FLAGS += -I $(TOP)/CSU
 INC_FLAGS += -I $(TOP)/DataBase
 INC_FLAGS += -I $(TOP)/ModuleInternalComm
 INC_FLAGS += -I $(TOP)/ModuleEvComm
+INC_FLAGS += -I $(TOP)/ModuleUpdateFW
+INC_FLAGS += -I $(TOP)/ModuleChkSysTask
 INC_FLAGS += -I $(TOP)/ModulePrimary
 INC_FLAGS += -I $(TOP)/ModuleLcmCtrl
 INC_FLAGS += -I $(TOP)/ModuleDoComm
@@ -31,6 +33,8 @@ CSULib = $(TOP)/CSU
 DataBaseLib = $(TOP)/DataBase
 InternalCommLib = $(TOP)/ModuleInternalComm
 EvCommLib = $(TOP)/ModuleEvComm
+UpdateFWLib = $(TOP)/ModuleUpdateFW
+ChkSysTaskLib = $(TOP)/ModuleChkSysTask
 PrimaryLib = $(TOP)/ModulePrimary
 LcmLib = $(TOP)/ModuleLcmCtrl
 DoCommLib = $(TOP)/ModuleDoComm
@@ -70,7 +74,7 @@ COMMON_OBJ_FILES = common.o \
 MAIN_OBJ_FILES = $(COMMON_OBJ_FILES) $(DataBaseLib)/DataBase.o \
 					$(CSULib)/main.o  $(CSULib)/Primary.o $(CSULib)/WatchDog.o $(CSULib)/ZipFile.o \
 					$(CSULib)/RFID.o $(CSULib)/SelfTest.o $(CSULib)/UpgradeFW.o \
-					$(CSULib)/Ethernet.o $(CSULib)/CheckSystemTask.o
+					$(CSULib)/Ethernet.o 
 					
 MAIN_SRC_FILES = $(patsubst %.o, %.c, $(MAIN_OBJ_FILES))
 %.o: %.c
@@ -97,6 +101,18 @@ EVCOMM_SRC_FILES = $(patsubst %.o, %.c, $(EVCOMM_OBJ_FILES))
 %.o: %.c
 	$(CC) $(CFLAGS) -c $<
 
+#Update FW
+UPDATEFW_OBJ_FILES = $(COMMON_OBJ_FILES) $(UpdateFWLib)/Module_UpdateFW.o
+UPDATEFW_SRC_FILES = $(patsubst %.o, %.c, $(UPDATEFW_OBJ_FILES))
+%.o: %.c
+	$(CC) $(CFLAGS) -c $<
+
+#Check System Task
+CHKSYSTASK_OBJ_FILES = $(COMMON_OBJ_FILES) $(ChkSysTaskLib)/Module_ChkSysTask.o 
+CHKSYSTASK_SRC_FILES = $(patsubst %.o, %.c, $(CHKSYSTASK_OBJ_FILES))
+%.o: %.c
+	$(CC) $(CFLAGS) -c $<
+
 #Event Log
 EVENTLOG_OBJ_FILES = $(COMMON_OBJ_FILES) $(DataBaseLib)/DataBase.o \
 						$(EventLogLib)/Module_EventLogging.o
@@ -123,7 +139,7 @@ READCMDLINE_SRC_FILES = $(patsubst %.o, %.c, $(READCMDLINE_OBJ_FILES))
 
 all: CopyFile apps
 
-apps: MainTask DoCommTask EvCommTask \
+apps: MainTask DoCommTask EvCommTask UpdateFWTask ChkSysTask \
 		EventLoggingTask InternalCommTask LcmControlTask \
 			PrimaryCommTask ReadCmdlineTask UnsafetyOutputTool \
 				FactoryConfigApp OtherTools CleanExec
@@ -149,6 +165,15 @@ EvCommTask:
 	#$(CC) $(DEFINE) $(CFLAGS) $(RatedCurrent_H) -c -o Module_EvComm.o $(EvCommLib)/Module_EvComm.c
 	#$(CC) -o Module_EvComm Ev_Comm.o Module_EvComm.o $(Lib_Module_RatedCurrent)
 
+UpdateFWTask:
+	$(CC) $(DEFINE) $(UPDATEFW_SRC_FILES) $(CFLAGS) $(TFLAGS) $(INC_FLAGS) $(Lib_Module_Upgrade) $(ModuleUpgrade_H) -o Module_UpdateFW
+	#$(CC) $(DEFINE) $(CFLAGS) -c -o Module_UpdateFW.o $(UpdateFWLib)/Module_UpdateFW.c
+	#$(CC) -o Module_UpdateFW Module_UpdateFW.o
+ChkSysTask:
+	$(CC) $(DEFINE) $(CHKSYSTASK_SRC_FILES) $(CFLAGS) $(TFLAGS) $(INC_FLAGS) -o Module_ChkSysTask
+	#$(CC) $(DEFINE) $(CFLAGS) -c -o Module_ChkSysTask.o $(ChkSysTaskLib)/Module_ChkSysTask.c
+	#$(CC) -o Module_ChkSysTask Module_ChkSysTask.o 
+
 EventLoggingTask:
 	$(CC) $(DEFINE) $(EVENTLOG_SRC_FILES) $(CFLAGS) $(TFLAGS) $(INC_FLAGS) $(SQLite3_H) $(Lib_SQLite3) -o Module_EventLogging
 	#$(CC) $(DEFINE) $(CFLAGS) -c -o define.o $(DefineLib)/define.c
@@ -204,6 +229,8 @@ OtherTools:
 	cp -f main $(RootPath)
 	cp -f Module_DoComm $(RootPath)
 	cp -f Module_EvComm $(RootPath)
+	cp -f Module_UpdateFW $(RootPath)
+	cp -f Module_ChkSysTask $(RootPath)
 	cp -f Module_EventLogging $(RootPath)
 	cp -f Module_InternalComm $(RootPath)
 	cp -f Module_LcmControl $(RootPath)
@@ -221,6 +248,8 @@ OtherTools:
 	cp -f main $(OutputPath)
 	cp -f Module_DoComm $(OutputPath)
 	cp -f Module_EvComm $(OutputPath)
+	cp -f Module_UpdateFW $(OutputPath)
+	cp -f Module_ChkSysTask $(OutputPath)
 	cp -f Module_EventLogging $(OutputPath)
 	cp -f Module_InternalComm $(OutputPath)
 	cp -f Module_LcmControl $(OutputPath)
@@ -238,6 +267,8 @@ CleanExec:
 	rm -f *.o
 	rm main
 	rm Module_EvComm
+	rm Module_UpdateFW
+	rm Module_ChkSysTask
 	rm Module_EventLogging
 	rm Module_InternalComm
 	rm Module_LcmControl

+ 238 - 0
EVSE/Projects/DD360/Apps/ModuleChkSysTask/Module_ChkSysTask.c

@@ -0,0 +1,238 @@
+/*
+ * CheckTask.c
+ *
+ *  Created on: 2021年9月22日
+ *      Author: 8513
+ */
+#include <stdio.h>      /*標準輸入輸出定義*/
+#include <stdlib.h>     /*標準函數庫定義*/
+#include <string.h>
+#include <stdint.h>
+#include <sys/types.h>
+#include <dirent.h>
+#include "../Config.h"
+#include "../Log/log.h"
+#include "../Define/define.h"
+
+#include "../ShareMemory/shmMem.h"
+#include "Module_ChkSysTask.h"
+
+struct SysConfigData *pSysConfig = NULL;
+struct SysInfoData *pSysInfo = NULL;
+struct OCPP16Data *ShmOCPP16Data = NULL;
+struct ChargingInfoData *pAcChargingInfo = NULL;
+static struct ChargingInfoData *pDcChargingInfo = NULL;
+struct SysConfigAndInfo         *ShmSysConfigAndInfo;
+struct StatusCodeData           *ShmStatusCodeData;
+
+bool Taskconutstring(char *src, char *taskname)
+{
+    bool result = false;
+
+    if (src == NULL || strlen(src) == 0)
+        return result;
+
+    if (strstr(src, taskname) != NULL &&
+        strstr(src, "grep") == NULL &&
+        strstr(src, "[") == NULL)
+    {
+        result = true;
+    }
+
+    return result;
+}
+
+int GetProcessCount(char *procName)
+{
+	int result = 0;
+	FILE *fp;
+	char cmd[256];
+	char buf[256];
+
+	sprintf(cmd, "ps -ef |grep %s", procName);
+	fp = popen(cmd, "r");
+	if(fp != NULL)
+	{
+		while(fgets(buf, sizeof(buf), fp) != NULL)
+		{
+			if (Taskconutstring(buf, procName))
+				result++;
+		}
+	}
+
+	pclose(fp);
+
+	return result;
+}
+
+unsigned char CheckSystemTask(unsigned char systemPage)
+{
+	unsigned char result = 0;
+	unsigned char count_main 		= GetProcessCount("main");
+	unsigned char count_evComm 		= GetProcessCount("Module_EvComm");
+	unsigned char count_interComm	= GetProcessCount("Module_InternalComm");
+	unsigned char count_eventComm	= GetProcessCount("Module_EventLogging");
+	unsigned char count_primaryComm	= GetProcessCount("Module_PrimaryComm");
+	unsigned char count_lcmComm	    = GetProcessCount("Module_LcmControl");
+	unsigned char count_doComm	    = GetProcessCount("Module_DoComm");
+	unsigned char count_produceComm	= GetProcessCount("Module_ProduceUtils");
+	unsigned char count_updateFW	= GetProcessCount("Module_UpdateFW");
+
+//	if (systemPage == 0x09 || systemPage == 0x0A)
+	{
+		if (count_main < _SYSTEM_TASK_COUNT_MAIN )
+		{
+			system("killall Module_EventLogging");
+			system("killall Module_PrimaryComm");
+			system("killall Module_EvComm");
+			system("killall Module_LcmControl");
+			system("killall Module_InternalComm");
+			system("killall Module_DoComm");
+			system("killall Module_ProduceUtils");
+			system("killall Module_UpdateFW");
+			system("pkill main");
+            sleep(1);
+            system("echo V > /dev/watchdog");
+			system("/usr/bin/run_evse_restart.sh");
+            sleep(10);
+		}
+		else
+		{
+			if (count_evComm < _SYSTEM_TASK_COUNT_EVCOMM )
+			{
+				system("killall Module_EvComm");
+				sleep(1);
+				system("/root/Module_EvComm &");
+			}
+        	if (count_interComm < _SYSTEM_TASK_COUNT_INTERNALCOMM )
+			{
+				system("killall Module_InternalComm");
+				sleep(1);
+				system("/root/Module_InternalComm &");
+			}
+			if (count_eventComm < _SYSTEM_TASK_COUNT_EVENTLOGGING )
+			{
+				system("killall Module_EventLogging");
+				sleep(1);
+				system("/root/Module_EventLogging &");
+			}
+			if (count_primaryComm < _SYSTEM_TASK_COUNT_PRIMARYCOMM )
+			{
+				system("killall Module_PrimaryComm");
+				sleep(1);
+				system("/root/Module_PrimaryComm &");
+			}
+			if (count_lcmComm < _SYSTEM_TASK_COUNT_LCM )
+			{
+				system("killall Module_LcmControl");
+				sleep(1);
+				system("/root/Module_LcmControl &");
+			}
+			if (count_doComm < _SYSTEM_TASK_COUNT_DOCOMM )
+			{
+				system("killall Module_DoComm");
+				sleep(1);
+				system("/root/Module_DoComm &");
+			}
+			if (count_produceComm < _SYSTEM_TASK_COUNT_PRODUCEUTILS )
+			{
+				system("killall Module_ProduceUtils");
+				sleep(1);
+				system("/root/Module_ProduceUtils &");
+			}
+			if (count_updateFW < _SYSTEM_TASK_COUNT_UPDATEFW )
+			{
+				system("killall Module_UpdateFW");
+				sleep(1);
+				system("/root/Module_UpdateFW &");
+			}
+		}
+
+	}
+
+	if (count_main < _SYSTEM_TASK_COUNT_MAIN)
+		result = _SYSTEM_TASK_LOST_ITEM_MAIN;
+	else if (count_evComm < _SYSTEM_TASK_COUNT_EVCOMM)
+		result = _SYSTEM_TASK_LOST_ITEM_EVCOMM;
+/*	else if (count_psuComm < 2)
+		result = 3; */
+    else if (count_eventComm < _SYSTEM_TASK_COUNT_EVENTLOGGING )
+        result = _SYSTEM_TASK_LOST_ITEM_EVENTLOG;
+    else if (count_primaryComm < _SYSTEM_TASK_COUNT_PRIMARYCOMM)
+        result = _SYSTEM_TASK_LOST_ITEM_PRIMARYCOMM;
+    else if (count_lcmComm < _SYSTEM_TASK_COUNT_LCM)
+        result = _SYSTEM_TASK_LOST_ITEM_LCMCONTROL;
+    else if (count_interComm < _SYSTEM_TASK_COUNT_INTERNALCOMM )
+        result = _SYSTEM_TASK_LOST_ITEM_INTERCOMM;
+    else if (count_doComm < _SYSTEM_TASK_COUNT_DOCOMM)
+        result = _SYSTEM_TASK_LOST_ITEM_DOCOMM;
+    else if (count_produceComm < _SYSTEM_TASK_COUNT_PRODUCEUTILS)
+        result = _SYSTEM_TASK_LOST_ITEM_PRODUCTUTILS;
+    else if (count_updateFW < _SYSTEM_TASK_COUNT_UPDATEFW)
+        result = _SYSTEM_TASK_LOST_ITEM_UPDATEFW;
+
+
+	return result;
+}
+
+//===============================================
+// Check System Task alive
+// ==============================================
+void CheckSystemTaskAlive()
+{
+    unsigned char lostId = CheckSystemTask(ShmSysConfigAndInfo->SysInfo.SystemPage);
+    if (lostId != 0) {
+        log_info("Check task(%d) lost\n",lostId);
+        if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemTaskLost == NO) {
+           if (lostId == _SYSTEM_TASK_LOST_ITEM_MAIN)
+               log_info("System task lost (CSU). \n");
+           else if (lostId == _SYSTEM_TASK_LOST_ITEM_EVCOMM)
+               log_info("System task lost (EVComm). \n");
+//           else if (lostId == _SYSTEM_TASK_LOST_ITEM_PSUCOMM)
+//               PRINTF_FUNC("System task lost (PSU Task). \n");
+           else if (lostId == _SYSTEM_TASK_LOST_ITEM_EVENTLOG)
+               log_info("System task lost (Event log). \n");
+           else if (lostId == _SYSTEM_TASK_LOST_ITEM_PRIMARYCOMM)
+               log_info("System task lost (Primary). \n");
+           else if (lostId == _SYSTEM_TASK_LOST_ITEM_LCMCONTROL)
+               log_info("System task lost (LCM Comm). \n");
+           else if (lostId == _SYSTEM_TASK_LOST_ITEM_INTERCOMM)
+               log_info("System task lost (Internal Comm). \n");
+           else if (lostId == _SYSTEM_TASK_LOST_ITEM_DOCOMM)
+               log_info("System task lost (Do Comm). \n");
+           else if (lostId == _SYSTEM_TASK_LOST_ITEM_PRODUCTUTILS)
+               log_info("System task lost (ProcductUtils Comm). \n");
+           else if (lostId == _SYSTEM_TASK_LOST_ITEM_UPDATEFW)
+               log_info("System task lost (Update FW) \n");
+           ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemTaskLost = YES;
+        }
+    } else
+        ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemTaskLost = NO;
+}
+
+
+void main(void)
+{
+    if (CreateAllCsuShareMemory() == FAIL) {
+        log_error("create share memory error\r\n");
+        return FAIL;
+    }
+
+    pSysConfig = (struct SysConfigData *)GetShmSysConfigData();
+    pSysInfo = (struct SysInfoData *)GetShmSysInfoData();
+    ShmOCPP16Data = (struct OCPP16Data *)GetShmOCPP16Data();
+    ShmSysConfigAndInfo = (struct SysConfigAndInfo *)GetShmSysConfigAndInfo();
+    ShmStatusCodeData = (struct StatusCodeData *)GetShmStatusCodeData();	
+    MappingGunChargingInfo("CheckSystem Task");
+    sleep(20);
+    while(true)
+    {
+      	for (uint8_t gun = 0; gun < pSysConfig->TotalConnectorCount; gun++) {
+    		pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(gun);
+			if (pDcChargingInfo->SystemStatus == SYS_MODE_UPDATE )
+				continue;
+		}
+		CheckSystemTaskAlive();
+		sleep(3);
+    }
+}

+ 62 - 0
EVSE/Projects/DD360/Apps/ModuleChkSysTask/Module_ChkSysTask.h

@@ -0,0 +1,62 @@
+/*
+ * CheckTask.h
+ *
+ *  Created on: 2021年9月2日
+ *      Author: 7564
+ */
+
+#ifndef CHECKTASK_H_
+#define CHECKTASK_H_
+
+#include 	<sys/timeb.h>
+#include 	<sys/types.h>
+#include 	<sys/ioctl.h>
+#include 	<sys/socket.h>
+#include 	<sys/ipc.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 	<string.h>
+#include 	<stdint.h>
+#include	<time.h>
+#include	<ctype.h>
+#include 	<ifaddrs.h>
+#include 	<math.h>
+#include 	<stdbool.h>
+#include 	<dirent.h>
+
+#define _SYSTEM_TASK_LOST_ITEM_MAIN         1
+#define _SYSTEM_TASK_LOST_ITEM_EVCOMM       2
+#define _SYSTEM_TASK_LOST_ITEM_EVENTLOG     3
+#define _SYSTEM_TASK_LOST_ITEM_PRIMARYCOMM  4
+#define _SYSTEM_TASK_LOST_ITEM_LCMCONTROL   5
+#define _SYSTEM_TASK_LOST_ITEM_INTERCOMM    6
+#define _SYSTEM_TASK_LOST_ITEM_DOCOMM       7
+#define _SYSTEM_TASK_LOST_ITEM_PRODUCTUTILS 8
+#define _SYSTEM_TASK_LOST_ITEM_UPDATEFW     9
+
+#define _SYSTEM_TASK_COUNT_MAIN             4 
+#define _SYSTEM_TASK_COUNT_EVCOMM           2
+#define _SYSTEM_TASK_COUNT_INTERNALCOMM     2
+#define _SYSTEM_TASK_COUNT_EVENTLOGGING     1
+#define _SYSTEM_TASK_COUNT_PRIMARYCOMM      1
+#define _SYSTEM_TASK_COUNT_LCM              1
+#define _SYSTEM_TASK_COUNT_DOCOMM           1
+#define _SYSTEM_TASK_COUNT_PRODUCEUTILS     1
+#define _SYSTEM_TASK_COUNT_UPDATEFW         1
+
+
+unsigned char CheckSystemTask(unsigned char systemPage);
+
+#endif /* CHECKSYSTEMTASK_H_ */

+ 205 - 198
EVSE/Projects/DD360/Apps/ModuleEvComm/Ev_Comm.c

@@ -1,198 +1,205 @@
-#include <stdio.h>      /*標準輸入輸出定義*/
-#include <stdlib.h>     /*標準函數庫定義*/
-#include <stdint.h>
-#include <string.h>
-
-#include <linux/can.h>
-#include <linux/can/raw.h>
-
-#include <unistd.h>     /*Unix 標準函數定義*/
-#include <fcntl.h>      /*檔控制定義*/
-#include <termios.h>    /*PPSIX 終端控制定義*/
-#include <errno.h>      /*錯誤號定義*/
-
-#include "Ev_Comm.h"
-#include "Module_EvComm.h"
-
-//------------------------------------------------------------------------------
-int PackageIdCmd(int cmd)
-{
-    return cmd | 0x80000000;
-}
-
-void SendCmdToEvboard(int cmd, uint8_t *data, uint8_t dataLen)
-{
-    int fd = GetCanFd();
-    struct can_frame frame;
-
-    frame.can_id = cmd;
-    frame.can_dlc = dataLen;
-    memcpy(frame.data, data, sizeof(frame.data));
-
-    write(fd, &frame, sizeof(struct can_frame));
-}
-
-//------------------------------------------------------------------------------
-void SetTargetAddr(uint8_t *target_number, uint8_t index)
-{
-    int id = PackageIdCmd(CMD_ADDR_ASSIGNMENT + index);
-    //printf("intCmd = %x \n", cmd & CAN_EFF_MASK);
-    //cmd = cmd & CAN_EFF_MASK;
-
-    uint8_t data[8];
-
-    data[0] = *target_number;
-    data[1] = *(target_number + 1);
-    data[2] = *(target_number + 2);
-    data[3] = *(target_number + 3);
-    data[4] = index;
-
-    SendCmdToEvboard(id, data, 5);
-}
-
-void GetFirmwareVersion(uint8_t gunIndex, uint8_t toId)
-{
-    int id = PackageIdCmd(CMD_GET_FW_VER + toId);
-    uint8_t data[8];
-
-    SendCmdToEvboard(id, data, 0);
-}
-
-void GetHardwareVersion(uint8_t gunIndex, uint8_t toId)
-{
-    int id = PackageIdCmd(CMD_GET_HW_VER + toId);
-    uint8_t data[8];
-
-    SendCmdToEvboard(id, data, 0);
-}
-
-void SyncRtcInfo(uint8_t gunIndex, uint8_t toId, int epoch)
-{
-    int id = PackageIdCmd(CMD_SYNC_RTC + toId);
-    uint8_t data[8];
-
-    data[0] = epoch & 0xff;
-    data[1] = (epoch >> 8) & 0xff;
-    data[2] = (epoch >> 16) & 0xff;
-    data[3] = (epoch >> 24) & 0xff;
-
-    SendCmdToEvboard(id, data, 4);
-}
-
-void SetChargingPermission(uint8_t gunIndex, uint8_t permissionStatus, uint16_t aOutputPw, uint16_t aOutputCur, uint16_t aOutputVol, uint8_t toId)
-{
-    int id = PackageIdCmd(CMD_CHARGING_PERMISSION + toId);
-    uint8_t data[8];
-
-    data[0] = permissionStatus;
-    data[1] = aOutputPw & 0xff;
-    data[2] = (aOutputPw >> 8) & 0xff;
-    data[3] = aOutputCur & 0xff;
-    data[4] = (aOutputCur >> 8) & 0xff;
-    data[5] = aOutputVol & 0xff;
-    data[6] = (aOutputVol >> 8) & 0xff;
-    data[7] = 0xf0;
-
-    SendCmdToEvboard(id, data, sizeof(data));
-}
-
-void SetPresentOutputPower(uint16_t outputVol_b1, uint16_t outputCur_b1, uint16_t outputVol_b2, uint16_t outputCur_b2)
-{
-    int id = PackageIdCmd(CMD_PRESENT_OUTPUT_POWER);
-    uint8_t data[8];
-
-    data[0] = outputVol_b1 & 0xff;
-    data[1] = (outputVol_b1 >> 8) & 0xff;
-    data[2] = outputCur_b1 & 0xff;
-    data[3] = (outputCur_b1 >> 8) & 0xff;
-    data[4] = outputVol_b2 & 0xff;
-    data[5] = (outputVol_b2 >> 8) & 0xff;
-    data[6] = outputCur_b2 & 0xff;
-    data[7] = (outputCur_b2 >> 8) & 0xff;
-
-    SendCmdToEvboard(id, data, 8);
-}
-
-void SetPresentOutputCapacity(uint16_t aOutputPw_b1, uint16_t aOutputCur_b1, uint16_t aOutputPw_b2, uint16_t aOutputCur_b2)
-{
-    int id = PackageIdCmd(CMD_PRESENT_OUTPUT_CAPABILITIES);
-    uint8_t data[8];
-
-    data[0] = aOutputPw_b1 & 0xff;
-    data[1] = (aOutputPw_b1 >> 8) & 0xff;
-    data[2] = aOutputCur_b1 & 0xff;
-    data[3] = (aOutputCur_b1 >> 8) & 0xff;
-    data[4] = aOutputPw_b2 & 0xff;
-    data[5] = (aOutputPw_b2 >> 8) & 0xff;
-    data[6] = aOutputCur_b2 & 0xff;
-    data[7] = (aOutputCur_b2 >> 8) & 0xff;
-
-    SendCmdToEvboard(id, data, 8);
-}
-
-void GetOutputReq(uint8_t gunIndex, uint8_t toId)
-{
-    int id = PackageIdCmd(CMD_GET_OUTPUT_REQ + toId);
-    uint8_t data[8];
-
-    SendCmdToEvboard(id, data, 0);
-}
-
-void GetEvBatteryInfo(uint8_t gunIndex, uint8_t toId)
-{
-    int id = PackageIdCmd(CMD_GET_BATTERY_INFO + toId);
-    uint8_t data[8];
-
-    SendCmdToEvboard(id, data, 0);
-}
-
-void EvseStopChargingEvent(uint8_t stopResult, uint8_t *stopReason, uint8_t toId)
-{
-    int id = PackageIdCmd(CMD_EVSE_STOP_CHARGING + toId);
-    uint8_t data[8];
-
-    data[0] = stopResult;
-    data[1] = *stopReason;
-    data[2] = *(stopReason + 1);
-    data[3] = *(stopReason + 2);
-    data[4] = *(stopReason + 3);
-    data[5] = *(stopReason + 4);
-    data[6] = *(stopReason + 5);
-
-    SendCmdToEvboard(id, data, 7);
-}
-
-void GetMiscellaneousInfo(uint8_t gunIndex, uint8_t relayStatus, float power, float voltage, uint8_t toId)
-{
-    int id = PackageIdCmd(CMD_GET_MISC_INFO + toId);
-    uint8_t data[8];
-
-    int _power = power * 10;
-
-    data[0] = relayStatus;
-    data[1] = (int)_power & 0xff;
-    data[2] = ((int)_power >> 8) & 0xff;
-    data[3] = (int)voltage & 0xff;
-    data[4] = ((int)voltage >> 8) & 0xff;
-
-    SendCmdToEvboard(id, data, 5);
-}
-
-void SetIsolationStatus(uint8_t gunIndex, uint8_t result, uint8_t toId)
-{
-    int id = PackageIdCmd(CMD_ISOLATION_STATUS + toId);
-    uint8_t data[8];
-
-    data[0] = result;
-    SendCmdToEvboard(id, data, 1);
-}
-
-void SetEvsePrechargeInfo(uint8_t gunIndex, uint8_t result, uint8_t toId)
-{
-    int id = PackageIdCmd(CMD_EVSE_PRECHARGE + toId);
-    uint8_t data[8];
-
-    data[0] = result;
-    SendCmdToEvboard(id, data, 1);
-}
-
+#include <stdio.h>      /*標準輸入輸出定義*/
+#include <stdlib.h>     /*標準函數庫定義*/
+#include <stdint.h>
+#include <string.h>
+
+#include <linux/can.h>
+#include <linux/can/raw.h>
+
+#include <unistd.h>     /*Unix 標準函數定義*/
+#include <fcntl.h>      /*檔控制定義*/
+#include <termios.h>    /*PPSIX 終端控制定義*/
+#include <errno.h>      /*錯誤號定義*/
+
+#include "Ev_Comm.h"
+#include "Module_EvComm.h"
+
+//------------------------------------------------------------------------------
+int PackageIdCmd(int cmd)
+{
+    return cmd | 0x80000000;
+}
+
+void SendCmdToEvboard(int cmd, uint8_t *data, uint8_t dataLen)
+{
+    int fd = GetCanFd();
+    struct can_frame frame;
+
+    frame.can_id = cmd;
+    frame.can_dlc = dataLen;
+    memcpy(frame.data, data, sizeof(frame.data));
+
+    write(fd, &frame, sizeof(struct can_frame));
+}
+
+//------------------------------------------------------------------------------
+void SetTargetAddr(uint8_t *target_number, uint8_t index)
+{
+    int id = PackageIdCmd(CMD_ADDR_ASSIGNMENT + index);
+    //printf("intCmd = %x \n", cmd & CAN_EFF_MASK);
+    //cmd = cmd & CAN_EFF_MASK;
+
+    uint8_t data[8];
+
+    data[0] = *target_number;
+    data[1] = *(target_number + 1);
+    data[2] = *(target_number + 2);
+    data[3] = *(target_number + 3);
+    data[4] = index;
+
+    SendCmdToEvboard(id, data, 5);
+}
+
+void GetFirmwareVersion(uint8_t gunIndex, uint8_t toId)
+{
+    int id = PackageIdCmd(CMD_GET_FW_VER + toId);
+    uint8_t data[8];
+
+    SendCmdToEvboard(id, data, 0);
+}
+
+void GetHardwareVersion(uint8_t gunIndex, uint8_t toId)
+{
+    int id = PackageIdCmd(CMD_GET_HW_VER + toId);
+    uint8_t data[8];
+
+    SendCmdToEvboard(id, data, 0);
+}
+
+void SyncRtcInfo(uint8_t gunIndex, uint8_t toId, int epoch)
+{
+    int id = PackageIdCmd(CMD_SYNC_RTC + toId);
+    uint8_t data[8];
+
+    data[0] = epoch & 0xff;
+    data[1] = (epoch >> 8) & 0xff;
+    data[2] = (epoch >> 16) & 0xff;
+    data[3] = (epoch >> 24) & 0xff;
+
+    SendCmdToEvboard(id, data, 4);
+}
+
+void SetChargingPermission(uint8_t gunIndex, uint8_t permissionStatus, uint16_t aOutputPw, uint16_t aOutputCur, uint16_t aOutputVol, uint8_t toId)
+{
+    int id = PackageIdCmd(CMD_CHARGING_PERMISSION + toId);
+    uint8_t data[8];
+
+    data[0] = permissionStatus;
+    data[1] = aOutputPw & 0xff;
+    data[2] = (aOutputPw >> 8) & 0xff;
+    data[3] = aOutputCur & 0xff;
+    data[4] = (aOutputCur >> 8) & 0xff;
+    data[5] = aOutputVol & 0xff;
+    data[6] = (aOutputVol >> 8) & 0xff;
+    data[7] = 0xf0;
+
+    SendCmdToEvboard(id, data, sizeof(data));
+}
+
+void SetPresentOutputPower(uint16_t outputVol_b1, uint16_t outputCur_b1, uint16_t outputVol_b2, uint16_t outputCur_b2)
+{
+    int id = PackageIdCmd(CMD_PRESENT_OUTPUT_POWER);
+    uint8_t data[8];
+
+    data[0] = outputVol_b1 & 0xff;
+    data[1] = (outputVol_b1 >> 8) & 0xff;
+    data[2] = outputCur_b1 & 0xff;
+    data[3] = (outputCur_b1 >> 8) & 0xff;
+    data[4] = outputVol_b2 & 0xff;
+    data[5] = (outputVol_b2 >> 8) & 0xff;
+    data[6] = outputCur_b2 & 0xff;
+    data[7] = (outputCur_b2 >> 8) & 0xff;
+
+    SendCmdToEvboard(id, data, 8);
+}
+
+void SetPresentOutputCapacity(uint16_t aOutputPw_b1, uint16_t aOutputCur_b1, uint16_t aOutputPw_b2, uint16_t aOutputCur_b2)
+{
+    int id = PackageIdCmd(CMD_PRESENT_OUTPUT_CAPABILITIES);
+    uint8_t data[8];
+
+    data[0] = aOutputPw_b1 & 0xff;
+    data[1] = (aOutputPw_b1 >> 8) & 0xff;
+    data[2] = aOutputCur_b1 & 0xff;
+    data[3] = (aOutputCur_b1 >> 8) & 0xff;
+    data[4] = aOutputPw_b2 & 0xff;
+    data[5] = (aOutputPw_b2 >> 8) & 0xff;
+    data[6] = aOutputCur_b2 & 0xff;
+    data[7] = (aOutputCur_b2 >> 8) & 0xff;
+
+    SendCmdToEvboard(id, data, 8);
+}
+
+void GetOutputReq(uint8_t gunIndex, uint8_t toId)
+{
+    int id = PackageIdCmd(CMD_GET_OUTPUT_REQ + toId);
+    uint8_t data[8];
+
+    SendCmdToEvboard(id, data, 0);
+}
+
+void GetEvBatteryInfo(uint8_t gunIndex, uint8_t toId)
+{
+    int id = PackageIdCmd(CMD_GET_BATTERY_INFO + toId);
+    uint8_t data[8];
+
+    SendCmdToEvboard(id, data, 0);
+}
+
+void EvseStopChargingEvent(uint8_t stopResult, uint8_t *stopReason, uint8_t toId)
+{
+    int id = PackageIdCmd(CMD_EVSE_STOP_CHARGING + toId);
+    uint8_t data[8];
+
+    data[0] = stopResult;
+    data[1] = *stopReason;
+    data[2] = *(stopReason + 1);
+    data[3] = *(stopReason + 2);
+    data[4] = *(stopReason + 3);
+    data[5] = *(stopReason + 4);
+    data[6] = *(stopReason + 5);
+
+    SendCmdToEvboard(id, data, 7);
+}
+
+void GetMiscellaneousInfo(uint8_t gunIndex, uint8_t relayStatus, float power, float voltage, uint8_t toId)
+{
+    int id = PackageIdCmd(CMD_GET_MISC_INFO + toId);
+    uint8_t data[8];
+
+    int _power = power * 10;
+
+    data[0] = relayStatus;
+    data[1] = (int)_power & 0xff;
+    data[2] = ((int)_power >> 8) & 0xff;
+    data[3] = (int)voltage & 0xff;
+    data[4] = ((int)voltage >> 8) & 0xff;
+
+    SendCmdToEvboard(id, data, 5);
+}
+
+void SetIsolationStatus(uint8_t gunIndex, uint8_t result, uint8_t toId)
+{
+    int id = PackageIdCmd(CMD_ISOLATION_STATUS + toId);
+    uint8_t data[8];
+
+    data[0] = result;
+    SendCmdToEvboard(id, data, 1);
+}
+
+void SetEvsePrechargeInfo(uint8_t gunIndex, uint8_t result, uint8_t toId)
+{
+    int id = PackageIdCmd(CMD_EVSE_PRECHARGE + toId);
+    uint8_t data[8];
+
+    data[0] = result;
+    SendCmdToEvboard(id, data, 1);
+}
+
+void GetEVCCIDReq(uint8_t gunIndex, uint8_t toId)
+{
+    int id = PackageIdCmd(CMD_EVCCID_REQ + toId);
+    uint8_t data[8];
+
+    SendCmdToEvboard(id, data, 0);
+}

+ 3 - 0
EVSE/Projects/DD360/Apps/ModuleEvComm/Ev_Comm.h

@@ -27,6 +27,7 @@
 #define CMD_ISOLATION_STATUS                    (0x00001200)
 #define CMD_SYNC_RTC                            (0x00001400)
 #define CMD_EVSE_PRECHARGE                      (0x00001500)
+#define CMD_EVCCID_REQ                          (0x00001600)
 
 // 車端主動
 #define ADDRESS_REQ                             (0x080001FF)
@@ -41,6 +42,7 @@
 #define ACK_GET_MISCELLANEOUS_INFO              (0x08000D00)
 #define ACK_EVSE_ISOLATION_STATUS               (0x08001200)
 #define ACK_EVSE_PRECHAGE_INFO                  (0x08001500)
+#define ACK_EVCCID_REQ                          (0x08001600)
 
 //------------------------------------------------------------------------------
 // Send msg to can-bus
@@ -59,5 +61,6 @@ void SetIsolationStatus(uint8_t gunIndex, uint8_t result, uint8_t toId);
 void SetEvsePrechargeInfo(uint8_t gunIndex, uint8_t result, uint8_t toId);
 // 發送電樁主動停止充電結果及原因
 void EvseStopChargingEvent(uint8_t stopResult, uint8_t *stopReason, uint8_t toId);
+void GetEVCCIDReq(uint8_t gunIndex, uint8_t toId);
 
 #endif /* _EV_COMM_H_ */

+ 24 - 0
EVSE/Projects/DD360/Apps/ModuleEvComm/Module_EvRxComm.c

@@ -286,13 +286,16 @@ void CANReceiver(int fd)
             pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(targetGun);
             gunTypeIndex = pDcChargingInfo->type_index;
 
+
             switch (intCmd) {
             case NOTIFICATION_EV_STATUS:
                 if (pDcChargingInfo->ConnectorPlugIn != frame.data[0]) {
                     if (frame.data[0] == PLUG) {
                         log_info("Conn %d, Plugin. \n", targetGun);
+                        pDcChargingInfo->isVerify = false;
                     } else if (frame.data[0] == UNPLUG) {
                         log_info("Conn %d, Unplug. \n", targetGun);
+                        strcpy( (char *) pDcChargingInfo->EVCCID, "");
                     } else {
                         log_info("Conn %d, None Check. (%d) \n", targetGun, frame.data[0]);
                     }
@@ -591,7 +594,28 @@ void CANReceiver(int fd)
                     }
                 }
                 break;
+            case ACK_EVCCID_REQ:
 
+                        if (frame.can_dlc > 0 && strcmp ( pDcChargingInfo->EVCCID, "" ) == EQUAL)
+                        {
+                            if (pDcChargingInfo->Type == _Type_CCS_2)
+                            {
+                                memset (
+                                        ShmCcsData->V2GMessage_DIN70121 [pDcChargingInfo->type_index].SessionSetupRequest.EVCCID,
+                                        0,
+                                        sizeof(ShmCcsData->V2GMessage_DIN70121 [pDcChargingInfo->type_index].SessionSetupRequest.EVCCID) );
+                                memcpy (
+                                        ShmCcsData->V2GMessage_DIN70121 [pDcChargingInfo->type_index].SessionSetupRequest.EVCCID,
+                                        frame.data, frame.can_dlc );
+                            }
+
+                            sprintf ( (char *) pDcChargingInfo->EVCCID, "%.2x%.2x%.2x%.2x%.2x%.2x", frame.data [0],
+                                    frame.data [1], frame.data [2], frame.data [3], frame.data [4], frame.data [5] );
+
+                            pDcChargingInfo->EVCCID [17] = '\0';
+                            log_info( "******* Gun %d->EVCCID = %s ************* \n", targetGun, pDcChargingInfo->EVCCID );
+                        }
+                break;
             default:
                 log_info("EV board = %d, Ack none defined. intCmd = %d  \n", targetGun, intCmd);
                 break;

+ 11 - 0
EVSE/Projects/DD360/Apps/ModuleEvComm/Module_EvTxComm.c

@@ -24,6 +24,7 @@
 #include "../SelectGun/SelectGun.h"
 #include "Ev_Comm.h"
 #include "Module_EvComm.h"
+#include "../CSU/main.h"
 
 //------------------------------------------------------------------------------
 static struct SysConfigData *pSysConfig = NULL;
@@ -801,6 +802,16 @@ int main(int argc, char *argv[])
                     }
                 }
 
+#ifdef DD360ComBox
+                    // Set Ev board in communication mode
+                    // Get EVCCID for authorize when gun plug-in only for CCS
+                    if(pDcChargingInfo->Type == _Type_CCS_2 && priorityLow == 5) {
+                       if (pDcChargingInfo->ConnectorPlugIn && strcmp(pDcChargingInfo->EVCCID,"") == EQUAL) {
+                           GetEVCCIDReq(gunIndex,pDcChargingInfo->Evboard_id);
+                           SendCommunicationOnly(gunIndex);
+                        }
+                    }
+#endif 
                 if (priorityLow == 1) {
                     pDcChargingInfo->PresentChargedEnergy   = 0;
                     pDcChargingInfo->PresentChargingPower   = 0;

+ 6 - 16
EVSE/Projects/DD360/Apps/ModulePrimary/Module_PrimaryComm.c

@@ -185,31 +185,26 @@ void GetInputGpioStatus(int fd)
     }
 
     ShmPrimaryMcuData->InputDet.bits.SpdDetec = gpio_in.SPD;
-#if defined DD360ComBox
-    if (gpio_in.Emergency_Btn == 0 && (EmgBtn_flag == gpio_in.Emergency_Btn))
+#ifdef DD360ComBox
+    EmgBtn_flag = 0;
 #else
     if (gpio_in.Emergency_Btn && (EmgBtn_flag != gpio_in.Emergency_Btn))
-#endif //defined DD360ComBox
     {
             EmgBtn_count++;
         if (EmgBtn_count > SensorTrigCount) {
            EmgBtn_flag = 1;
            EmgBtn_count = 0; // Avoid Overflow
        }
-#ifdef DD360ComBox
-    } else if ( gpio_in.Emergency_Btn && EmgBtn_flag ) {
-#else
     } else if (EmgBtn_flag != gpio_in.Emergency_Btn ) {
-#endif    
         EmgBtn_count++;
         if (EmgBtn_count > SensorTrigCount) {
             EmgBtn_flag = 0;
             EmgBtn_count = 0;
         }
     }
- 
+#endif
     ShmPrimaryMcuData->InputDet.bits.EmergencyButton = EmgBtn_flag;
- 
+
     dispenserSwTmp |= (ShmPrimaryMcuData->InputDet.bits.Key0);
     dispenserSwTmp |= (ShmPrimaryMcuData->InputDet.bits.Key1 << 1);
     dispenserSwTmp |= (ShmPrimaryMcuData->InputDet.bits.Key2 << 2);
@@ -242,28 +237,23 @@ void GetInputGpioStatus(int fd)
     }
 
 #if defined DD360ComBox
-    if (gpio_in.Door_Open && (Door_flag != gpio_in.Door_Open))
+    Door_flag = 0;
 #else
     if (gpio_in.Door_Open == 0 && (Door_flag == gpio_in.Door_Open))
-#endif //defined DD360ComBox
     {
         Door_count++;
         if (Door_count > SensorTrigCount) {
             Door_flag = 1;
             Door_count = 0; // Avoid Overflow
        }
-#ifdef DD360ComBox
-    } else if (gpio_in.Door_Open == 0 && Door_flag) {
-#else
     } else if (gpio_in.Door_Open && Door_flag) {
-#endif
         Door_count++;
         if (Door_count > SensorTrigCount) {
             Door_flag = 0;
             Door_count = 0;
         }
     }
- 
+#endif 
     ShmPrimaryMcuData->InputDet.bits.DoorOpen = Door_flag;
 /*
     log_info("Emergency Button Count = %d , Emergency flag = %d\n",

+ 509 - 0
EVSE/Projects/DD360/Apps/ModuleUpdateFW/Module_UpdateFW.c

@@ -0,0 +1,509 @@
+#include <stdio.h>      /*標準輸入輸出定義*/
+#include <stdlib.h>     /*標準函數庫定義*/
+#include <string.h>
+#include <stdint.h>
+
+#include <sys/types.h>
+#include <dirent.h>
+
+#include "../Config.h"
+#include "../Log/log.h"
+#include "../Define/define.h"
+
+#include "../ShareMemory/shmMem.h"
+#include "../CSU/main.h"
+
+struct SysConfigData *pSysConfig = NULL;
+struct SysInfoData *pSysInfo = NULL;
+struct OCPP16Data *ShmOCPP16Data = NULL;
+struct ChargingInfoData *pAcChargingInfo = NULL;
+static struct ChargingInfoData *pDcChargingInfo = NULL;
+#define MODELNAME_FAIL                          (0)
+#define UPGRADE_FAN                             (0x02)
+#if defined DD360 || defined DD360Audi || defined DD360ComBox
+#define UPGRADE_RB                              (0x09) //0x09 for DD360 dispenser
+#else
+#define UPGRADE_RB                              (0x03) //other module use
+#endif //defined DD360 ||defined DD360Audi || defined DD360ComBox
+#define UPGRADE_PRI                             (0x04)
+#define UPGRADE_AC                              (0x05)
+#define UPGRADE_LED                             (0x06)
+
+//------------------------------------------------------------------------------
+static char *_priPortName = "/dev/ttyS1";
+static char *_485PortName = "/dev/ttyS5";
+
+//------------------------------------------------------------------------------
+
+void KillAllTask(void)
+{
+    pSysInfo->PageIndex = _LCM_FIX;
+
+    system("killall Module_EventLogging");
+    system("killall Module_PrimaryComm");
+    system("killall Module_EvComm");
+    system("killall Module_LcmControl");
+    system("killall Module_InternalComm");
+
+#if defined DD360 || defined DD360Audi || defined DD360ComBox
+    system("killall Module_DoComm");
+    return ;
+#endif //defined DD360 || defined DD360Audi || defined DD360ComBox
+
+    system("killall Module_PsuComm");
+    system("killall OcppBackend &");
+    system("killall Module_4g &");
+    system("killall Module_Wifi &");
+}
+
+void KillTask(void)
+{
+    pSysInfo->PageIndex = _LCM_FIX;
+
+    system("killall Module_EventLogging");
+    system("killall Module_PrimaryComm");
+    system("killall Module_EvComm");
+    system("killall Module_LcmControl");
+    system("killall Module_InternalComm");
+    //system("killall Module_DoComm");
+#if defined DD360 || defined DD360Audi || defined DD360ComBox
+    return ;
+#endif //defined DD360 || defined DD360Audi || defined DD360ComBox
+
+    system("killall Module_PsuComm");
+    system("killall OcppBackend &");
+    system("killall Module_4g &");
+    system("killall Module_Wifi &");
+}
+void setChargerMode(uint8_t gunIndex, uint8_t mode)
+{
+    pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(gunIndex);
+
+    pDcChargingInfo->SystemStatus = mode;
+}
+void TryCloseWatchdog()
+{
+    system("echo V > /dev/watchdog");
+}
+static int InitComPort(uint8_t target)
+{
+    int fd;
+    struct termios tios;
+
+    if (target == UPGRADE_PRI) {
+        fd = open(_priPortName, O_RDWR);
+    } else if (target == UPGRADE_FAN ||
+               target == UPGRADE_RB ||
+               target == UPGRADE_AC ||
+               target == UPGRADE_LED
+              ) {
+        fd = open(_485PortName, O_RDWR);
+    }
+
+    if (fd <= 0) {
+        log_error("open 407 Communication port NG \n");
+        return -1;
+    }
+
+    ioctl (fd, TCGETS, &tios);
+    tios.c_cflag = B115200 | CS8 | CLOCAL | CREAD;
+    tios.c_lflag = 0;
+    tios.c_iflag = 0;
+    tios.c_oflag = 0;
+    tios.c_cc[VMIN] = 0;
+    tios.c_cc[VTIME] = (uint8_t)1;
+    tios.c_lflag = 0;
+    tcflush(fd, TCIFLUSH);
+    ioctl (fd, TCSETS, &tios);
+
+    return fd;
+}
+bool IsConnectorWholeIdle()
+{
+    bool result = true;
+
+    for (uint8_t count = 0; count < pSysConfig->TotalConnectorCount; count++) {
+        pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(count);
+
+        if (pDcChargingInfo->SystemStatus != S_IDLE &&
+                pDcChargingInfo->SystemStatus != S_RESERVATION) {
+            result = false;
+            break;
+        }
+    }
+
+    for (uint8_t count = 0; count < pSysConfig->AcConnectorCount; count++) {
+        pAcChargingInfo = (struct ChargingInfoData *)GetAcChargingInfoData(count);
+
+        if (pAcChargingInfo->SystemStatus != S_IDLE &&
+                pAcChargingInfo->IsErrorOccur == NO) {
+            result = false;
+            break;
+        }
+    }
+
+    return result;
+}
+
+
+static int InitCanBus(void)
+{
+    int fd = -1;
+    int nbytes;
+    struct timeval tv;
+    struct ifreq ifr0;
+    struct sockaddr_can addr0;
+
+    system("/sbin/ip link set can0 down");
+    system("/sbin/ip link set can0 type can bitrate 500000 restart-ms 100");
+    system("/sbin/ip link set can0 up");
+
+    fd = socket(PF_CAN, SOCK_RAW, CAN_RAW);
+
+    tv.tv_sec = 0;
+    tv.tv_usec = 10000;
+    if (setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct  timeval)) < 0) {
+        log_error("Set SO_RCVTIMEO NG");
+    }
+    nbytes = 40960;
+    if (setsockopt(fd, SOL_SOCKET,  SO_RCVBUF, &nbytes, sizeof(int)) < 0) {
+        log_error("Set SO_RCVBUF NG");
+    }
+    nbytes = 40960;
+    if (setsockopt(fd, SOL_SOCKET, SO_SNDBUF, &nbytes, sizeof(int)) < 0) {
+        log_error("Set SO_SNDBUF NG");
+    }
+
+    strcpy(ifr0.ifr_name, "can0");
+    ioctl(fd, SIOCGIFINDEX, &ifr0); /* ifr.ifr_ifindex gets filled with that device's index */
+    addr0.can_family = AF_CAN;
+    addr0.can_ifindex = ifr0.ifr_ifindex;
+    bind(fd, (struct sockaddr *)&addr0, sizeof(addr0));
+
+    return fd;
+}
+
+static int CheckUpdateProcess(void)
+{
+    //bool isPass = true;
+    uint8_t retSucc = 0;
+    uint8_t retFail = 0;
+    uint8_t index = 0;
+    uint8_t target = 0;
+    char Buf[256];
+    char *new_str = NULL;
+    uint8_t *ptr = NULL;
+    int fd = 0;
+    int CanFd = 0;
+    int uartFd = 0;
+    unsigned int Type = 0;
+    long int MaxLen = 48 * 1024 * 1024, ImageLen = 0;
+    DIR *d;
+    struct dirent *dir;
+    DcCommonInfo *ShmDcCommonData = (DcCommonInfo *)GetShmDcCommonData();
+    struct ChargingInfoData *pDcChargingInfo = NULL;
+
+    pSysConfig = (struct SysConfigData *)GetShmSysConfigData();
+    d = opendir("/mnt/");
+    if (d) {
+        while ((dir = readdir(d)) != NULL) {
+            if (strcmp(dir->d_name, ".") == 0 || strcmp(dir->d_name, "..") == 0) {
+                continue;
+            }
+
+            new_str = calloc(strlen("/mnt/") + strlen(dir->d_name) + 1, sizeof(char));
+            //new_str[0] = '\0';
+            strcat(new_str, "/mnt/");
+            strcat(new_str, dir->d_name);
+            log_info("%s%s\r\n", "/mnt/", dir->d_name);
+            
+            fd = open(new_str, O_RDONLY);
+            if (fd < 0) {
+                return FAIL;
+            }
+
+            ptr = calloc(MaxLen, sizeof(char)); //-48 is take out the header
+            //memset(ptr, 0xFF, MaxLen);  //-48 is take out the header
+
+            //get the image length
+            ImageLen = read(fd, ptr, MaxLen);
+            for (uint8_t i = 0; i < 16; i++) {
+                if (pSysConfig->ModelName[i] != ptr[i]) {
+                    return FAIL;
+                }
+            }
+
+            log_info("model name check pass. \n");
+            if (ImageLen > 20) {
+                Type = (((unsigned int)ptr[16]) << 24 |
+                        ((unsigned int)ptr[17]) << 16 |
+                        ((unsigned int)ptr[18]) << 8  |
+                        ((unsigned int)ptr[19]));
+                log_info("Typed...%x \r\n", Type);
+
+                switch (Type) {
+                case 0x10000001:
+                case 0x10000002:
+                case 0x10000003:
+                case 0x10000004:
+                case 0x10000005:
+                    if (Upgrade_Flash(Type, new_str, (char *)pSysConfig->ModelName) == PASS) {
+                        //return PASS;
+                        retSucc++;
+                    } else {
+                        log_info("Upgrade %x Failed\r\n", Type);
+                        //return FAIL;
+                        retFail++;
+                    }
+                    break;
+
+                case 0x10000007:
+                case 0x10000008:
+                case 0x10000009:
+                case 0x1000000A:
+                    CanFd = InitCanBus();
+                    if (CanFd > 0) {
+                        for (index = 0; index < pSysConfig->TotalConnectorCount; index++) {
+                            pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(index);
+
+                            if (pDcChargingInfo->Type == _Type_CCS_2) {
+                                uint8_t targetID = pDcChargingInfo->Evboard_id;
+
+                                if (pSysConfig->TotalConnectorCount == 1 &&
+                                        ShmDcCommonData->CcsVersion == _CCS_VERSION_CHECK_TAG_V015S0) {
+                                    //targetID += 1;
+                                }
+
+                                system("echo 3 > /proc/sys/vm/drop_caches");
+                                sleep(2);
+                                log_info("Upgrade CCS Processing..target id = %d \n", targetID);
+                                if (Upgrade_CCS(CanFd,
+                                                Type,
+                                                targetID,
+                                                new_str,
+                                                (char *)pSysConfig->ModelName) == FAIL) {
+                                    log_info("Upgrade CCS Failed \n");
+                                    retFail++;
+                                } else {
+                                    retSucc++;
+                                }
+                            }
+                        }
+                        close(CanFd);
+                    }
+                    memset(Buf, 0, sizeof(Buf));
+                    sprintf(Buf, "rm -rvf /mnt/%s", new_str);
+                    system(Buf);
+                    //isPass = true;
+#if 0
+                    CanFd = InitCanBus();
+                    if (CanFd > 0) {
+                        for (index = 0; index < pSysConfig->TotalConnectorCount; index++) {
+                            //if (!isPass) {
+                            //    break;
+                            //}
+                            if (chargingInfo[index]->Type == _Type_CCS_2) {
+                                if (Upgrade_CCS(CanFd, Type, chargingInfo[index]->Evboard_id, new_str, (char *)pSysConfig->ModelName) == FAIL) {
+                                    //isPass = false;
+                                    log_info("Upgrade %x Failed\r\n", Type);
+                                    retFail++;
+                                }
+                            }
+                        }
+                    } else {
+                        log_error("Upgrade CCS open CAN FD fail.\n");
+                        //isPass = false;
+                        return FAIL;
+                    }
+
+                    if (retFail != 0) {
+                        break;
+                    } else {
+                        retSucc++;
+                    }
+                    //return isPass;
+#endif //0
+                    break;
+
+                case 0x10000006:
+                case 0x1000000D:
+                case 0x1000000E:
+                case 0x20000002:
+                case 0x10000014:
+                    // CSU_PRIMARY_CONTROLLER : 0x10000006
+                    target = 0x00;
+
+                    if (Type == 0x10000006) {
+                        target = UPGRADE_PRI;
+                    } else if (Type == 0x1000000D) {
+                        target = UPGRADE_RB;
+                    } else if (Type == 0x1000000E) {
+                        target = UPGRADE_FAN;
+                    } else if (Type == 0x20000002) {
+                        target = UPGRADE_AC;
+                    } else if (Type == 0x10000014) {
+                        target = UPGRADE_LED;
+                    }
+
+                    uartFd = InitComPort(target);
+
+                    if (Upgrade_UART(uartFd, Type, target, new_str, (char *)pSysConfig->ModelName) == PASS) {
+                        //return PASS;
+                        retSucc++;
+                    } else {
+                        log_info("Upgrade %x Failed\r\n", Type);
+                        //return FAIL;
+                        return FAIL;
+                    }
+
+                    if (uartFd > 0) {
+                        close(uartFd);
+                    }
+                    break;
+
+                case 0x1000000B:
+                case 0x1000000C:
+                    // CHAdeMO_BOARD : 0x1000000B, GBT : 0x1000000C
+                    //bool isPass = true;
+                    CanFd = InitCanBus();
+                    if (CanFd > 0) {
+                        for (index = 0; index < pSysConfig->TotalConnectorCount; index++) {
+                            pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(index);
+
+                            //if (!isPass) {
+                            //    break;
+                            //}
+
+                            if ((Type == 0x1000000B && pDcChargingInfo->Type == _Type_Chademo) ||
+                                    (Type == 0x1000000C && pDcChargingInfo->Type == _Type_GB)) {
+                                if (Upgrade_CAN(CanFd, Type, pDcChargingInfo->Evboard_id, new_str, (char *)pSysConfig->ModelName) == PASS) {
+                                    //isPass = PASS;
+                                    retSucc++;
+                                } else {
+                                    log_info("Upgrade %x Failed\r\n", Type);
+                                    //isPass = FAIL;
+                                    retFail++;
+                                }
+                            }
+                        }
+                    } else {
+                        log_info("Upgrad FD fail. \n");
+                        //isPass = false;
+                        return FAIL;
+                    }
+
+                    //return isPass;
+                    break;
+                }
+            }
+            free(new_str);
+            free(ptr);
+        }
+    }
+    free(dir);
+    closedir(d);
+
+    if (retFail != 0) {
+        return FAIL;
+    }
+
+    return PASS;
+}
+
+void CheckFwUpdateFunction(void)
+{
+    //log_info("pSysInfo->FirmwareUpdate = %d \n", pSysInfo->FirmwareUpdate);
+    if (pSysInfo->FirmwareUpdate == YES) {
+        log_info("ftp : update start. \n");
+        TryCloseWatchdog();
+
+        for (uint8_t gun_index = 0; gun_index < pSysConfig->TotalConnectorCount; gun_index++) {
+            setChargerMode(gun_index, MODE_UPDATE);
+        }
+        sleep(1);
+        uint8_t updateResult = CheckUpdateProcess();
+
+        if (updateResult == PASS) {
+            log_info("ftp : update complete. \n");
+        } else if (updateResult == MODELNAME_FAIL) {
+            log_info("ftp : model name is none match. \n");
+            KillAllTask();
+            pSysInfo->FirmwareUpdate = NO;
+            sleep(5);
+            system("/usr/bin/run_evse_restart.sh");
+            return;
+        } else {
+            log_info("ftp : update fail. \n");
+        }
+
+        pSysInfo->FirmwareUpdate = NO;
+        sleep(5);
+        system("reboot -f");
+    } else if (ShmOCPP16Data->MsMsg.bits.UpdateFirmwareReq == YES) {
+        ShmOCPP16Data->MsMsg.bits.UpdateFirmwareReq = NO;
+
+        if (strcmp((char *)ShmOCPP16Data->FirmwareStatusNotification.Status, "Downloaded") == EQUAL) {
+            log_info("Backend : update start. \n");
+            TryCloseWatchdog();
+            strcpy((char *)ShmOCPP16Data->FirmwareStatusNotification.Status, "");
+            strcpy((char *)ShmOCPP16Data->FirmwareStatusNotification.Status, "Installing");
+            ShmOCPP16Data->SpMsg.bits.FirmwareStatusNotificationReq = YES;
+            KillTask();
+
+            for (uint8_t _index = 0; _index < pSysConfig->TotalConnectorCount; _index++) {
+                setChargerMode(_index, MODE_UPDATE);
+            }
+
+            for (uint8_t _index = 0; _index < pSysConfig->AcConnectorCount; _index++) {
+                pAcChargingInfo = (struct ChargingInfoData *)GetAcChargingInfoData(_index);
+
+                pAcChargingInfo->SystemStatus = MODE_UPDATE;
+            }
+            sleep(1);
+
+            uint8_t updateResult = CheckUpdateProcess();
+
+            if (updateResult == PASS) {
+                log_info("Backend : update complete. \n");
+                strcpy((char *)ShmOCPP16Data->FirmwareStatusNotification.Status, "Installed");
+            } else if (updateResult == MODELNAME_FAIL) {
+                log_info("Backend : model name is none match. \n");
+                KillAllTask();
+                strcpy((char *)ShmOCPP16Data->FirmwareStatusNotification.Status, "InstallationFailed");
+                ShmOCPP16Data->SpMsg.bits.FirmwareStatusNotificationReq = YES;
+                sleep(5);
+                system("/usr/bin/run_evse_restart.sh");
+                return;
+            } else {
+                log_info("Backend : update fail. \n");
+                strcpy((char *)ShmOCPP16Data->FirmwareStatusNotification.Status, "InstallationFailed");
+            }
+
+            strcpy((char *)ShmOCPP16Data->FirmwareStatusNotification.Status, "Installed");
+            ShmOCPP16Data->SpMsg.bits.FirmwareStatusNotificationReq = YES;
+            sleep(5);
+            system("reboot -f");
+        }
+    }
+}
+
+int main(int argc, char *argv[])
+{
+    if (CreateAllCsuShareMemory() == FAIL) {
+        log_error("create share memory error\r\n");
+        return FAIL;
+    }
+    
+    MappingGunChargingInfo("Upgrade Task");
+
+    pSysConfig = (struct SysConfigData *)GetShmSysConfigData();
+    pSysInfo = (struct SysInfoData *)GetShmSysInfoData();
+    ShmOCPP16Data = (struct OCPP16Data *)GetShmOCPP16Data();
+   
+    while (1) {
+        if (IsConnectorWholeIdle() || (pSysInfo->PageIndex == _LCM_FIX) )
+            CheckFwUpdateFunction();
+        sleep(3);
+    } //while
+    return 0;
+}

+ 2 - 0
EVSE/Projects/DD360/Apps/Script/init.sh

@@ -5,6 +5,8 @@ chmod 777 Module_InternalComm
 chmod 777 Module_EventLogging
 chmod 777 Module_EvComm
 chmod 777 Module_PsuComm
+chmod 777 Module_UpdateFW
+chmod 777 Module_ChkSysTask
 chmod 777 OcppBackend
 chmod 777 kill.sh
 chmod 777 ReadCmdline

+ 2 - 0
EVSE/Projects/DD360/Apps/Script/kill.sh

@@ -5,6 +5,8 @@ pkill Module_InternalComm;
 pkill Module_EventLogging;
 pkill Module_EvComm;
 pkill Module_PsuComm;
+pkill Module_UpdateFW;
+pkill Module_ChkSysTask;
 pkill Module_4g;
 pkill Module_Wifi;
 pkill OcppBackend;

BIN
EVSE/Projects/DD360/Apps/UnsafetyOutputTask


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


BIN
EVSE/Projects/DD360/output/FactoryConfig


BIN
EVSE/Projects/DD360/output/Module_ChkSysTask


BIN
EVSE/Projects/DD360/output/Module_DoComm


BIN
EVSE/Projects/DD360/output/Module_EvComm


BIN
EVSE/Projects/DD360/output/Module_EventLogging


BIN
EVSE/Projects/DD360/output/Module_InternalComm


BIN
EVSE/Projects/DD360/output/Module_LcmControl


BIN
EVSE/Projects/DD360/output/Module_PrimaryComm


BIN
EVSE/Projects/DD360/output/Module_UpdateFW


BIN
EVSE/Projects/DD360/output/ReadCmdline


+ 2 - 0
EVSE/Projects/DD360/output/init.sh

@@ -5,6 +5,8 @@ chmod 777 Module_InternalComm
 chmod 777 Module_EventLogging
 chmod 777 Module_EvComm
 chmod 777 Module_PsuComm
+chmod 777 Module_UpdateFW
+chmod 777 Module_ChkSysTask
 chmod 777 OcppBackend
 chmod 777 kill.sh
 chmod 777 ReadCmdline

+ 6 - 0
EVSE/Projects/DD360/output/kill.sh

@@ -5,6 +5,8 @@ pkill Module_InternalComm;
 pkill Module_EventLogging;
 pkill Module_EvComm;
 pkill Module_PsuComm;
+pkill Module_UpdateFW;
+pkill Module_ChkSysTask;
 pkill Module_4g;
 pkill Module_Wifi;
 pkill OcppBackend;
@@ -12,6 +14,10 @@ pkill Module_ProduceUtils;
 pkill Module_DoComm;
 pkill main;
 
+sleep 1
+
+echo V > /dev/watchdog
+
 ipcrm -M 0x000003e9;
 ipcrm -M 0x000003ed;
 ipcrm -M 0x000003ea;

BIN
EVSE/Projects/DD360/output/main


+ 66 - 74
EVSE/Projects/DD360Audi/Apps/CSU/main.c

@@ -41,7 +41,7 @@
 #include "../Define/define.h"
 #include "../ShareMemory/shmMem.h"
 #include "../SelectGun/SelectGun.h"
-#include "CheckSystemTask.h"
+
 
 //------------------------------------------------------------------------------
 static struct SysInfoData *pSysInfo = NULL;
@@ -82,7 +82,7 @@ uint8_t bd0_2_status = 0;
 uint8_t bd1_1_status = 0;
 uint8_t bd1_2_status = 0;
 
-char *fwVersion = "V1.15.00.0000.00"; // "V0.16.00.0000.00";
+char *fwVersion = "V1.17.00.0000.00"; // "V0.16.00.0000.00";
 
 //sqlite3 *localDb;
 bool isDb_ready;
@@ -1642,10 +1642,9 @@ void _DetectPlugInTimeout(void)
 		setChargerMode(pSysInfo->CurGunSelected, S_TERMINATING);
 #elif DD360 || DD360Combox
 	setChargerMode(pSysInfo->CurGunSelected, S_COMPLETE);
-	pSysInfo->SystemPage = _LCM_COMPLETE;
-	return;
-#endif
     systemPageRestoreInit();
+#endif
+
 }
 
 void _DetectEvChargingEnableTimeout(uint8_t gunIndex)
@@ -1679,8 +1678,6 @@ void _DetectEvseChargingEnableTimeout(uint8_t gunIndex)
 		setChargerMode(pSysInfo->CurGunSelected, S_TERMINATING);
 #elif DD360 || DD360Combox
 	setChargerMode(pSysInfo->CurGunSelected, S_COMPLETE);
-	pSysInfo->SystemPage = _LCM_COMPLETE;
-	return;
 #endif
         _AutoReturnTimeout();
     }
@@ -1694,8 +1691,6 @@ void _PrepareTimeout(uint8_t gunIndex)
 		setChargerMode(pSysInfo->CurGunSelected, S_TERMINATING);
 #elif DD360 || DD360Combox
 	setChargerMode(pSysInfo->CurGunSelected, S_COMPLETE);
-	pSysInfo->SystemPage = _LCM_COMPLETE;
-	return;
 #endif
     pAlarmCode->AlarmEvents.bits.PsuNoResource = YES;
     _AutoReturnTimeout();
@@ -1709,73 +1704,10 @@ void _CcsPrechargeTimeout(uint8_t gunIndex)
 		setChargerMode(pSysInfo->CurGunSelected, S_TERMINATING);
 #elif DD360 || DD360Combox
 	setChargerMode(pSysInfo->CurGunSelected, S_COMPLETE);
-	pSysInfo->SystemPage = _LCM_COMPLETE;
-	return;
 #endif
 }
 
-//===============================================
-// Check System Task alive
-// ==============================================
-void CheckSystemTaskAlive()
-{
-    unsigned char lostId = CheckSystemTask(ShmSysConfigAndInfo->SysInfo.SystemPage);
-    if (lostId != 0) {
-        log_info("Check task(%d) lost\n",lostId);
-        if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemTaskLost == NO) {
-           if (lostId == _SYSTEM_TASK_LOST_ITEM_MAIN)
-               log_info("System task lost (CSU). \n");
-           else if (lostId == _SYSTEM_TASK_LOST_ITEM_EVCOMM)
-               log_info("System task lost (EVComm). \n");
-//           else if (lostId == _SYSTEM_TASK_LOST_ITEM_PSUCOMM)
-//               PRINTF_FUNC("System task lost (PSU Task). \n");
-           else if (lostId == _SYSTEM_TASK_LOST_ITEM_EVENTLOG)
-               log_info("System task lost (Event log). \n");
-           else if (lostId == _SYSTEM_TASK_LOST_ITEM_PRIMARYCOMM)
-               log_info("System task lost (Primary). \n");
-           else if (lostId == _SYSTEM_TASK_LOST_ITEM_LCMCONTROL)
-               log_info("System task lost (LCM Comm). \n");
-           else if (lostId == _SYSTEM_TASK_LOST_ITEM_INTERCOMM)
-               log_info("System task lost (Internal Comm). \n");
-           else if (lostId == _SYSTEM_TASK_LOST_ITEM_DOCOMM)
-               log_info("System task lost (Do Comm). \n");
-           else if (lostId == _SYSTEM_TASK_LOST_ITEM_PRODUCTUTILS)
-               log_info("System task lost (ProcductUtils Comm). \n");
-           ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemTaskLost = YES;
-        }
-    } else
-        ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemTaskLost = NO;
-}
-
-void CreateCheckSystemTaskFork()
-{
-    pid_t taskPid;
-    taskPid = fork();
-    if (taskPid == 0)
-    {
-        while(true)
-        {
-			/*
-			for (int _index = 0; _index < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount; _index++)
-			{
-				if (chargingInfo[_index]->SystemStatus == SYS_MODE_UPDATE ||
-						chargingInfo[_index]->Type == 0x09)
-				{
-					stopToDet = true;
-					continue;
-				}
-			}
-			*/
-			for (uint8_t gun = 0; gun < pSysConfig->TotalConnectorCount; gun++) {
-				pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(gun);
-				if (pDcChargingInfo->SystemStatus == SYS_MODE_UPDATE )
-						continue;
-			}
-			CheckSystemTaskAlive();
-			sleep(5);
-		}
-	}
-}
+
 //===============================================
 // 取得卡號與卡號驗證
 //===============================================
@@ -2674,6 +2606,10 @@ int SpawnTask(void)
     system("/root/Module_ProduceUtils &");
     system("/root/Module_UpdateFW &");
 
+    unsigned char count = GetProcessCount("Module_ChkSysTask");
+    if( count != 1)
+        system("/root/Module_ChkSysTask &");
+
 #if defined DD360 ||defined DD360Audi || defined DD360ComBox
     system("/root/Module_DoComm &");
 
@@ -2713,6 +2649,7 @@ void KillTask(void)
     system("killall Module_LcmControl");
     system("killall Module_InternalComm");
     system("killall Module_UpdateFW");
+    system("killall Module_ChkSysTask");
     //system("killall Module_DoComm");
 #if defined DD360 || defined DD360Audi || defined DD360ComBox
     return ;
@@ -2750,6 +2687,7 @@ void KillAllTask(void)
     system("killall Module_LcmControl");
     system("killall Module_InternalComm");
     system("killall Module_UpdateFW");
+    system("killall Module_ChkSysTask");
 
 #if defined DD360 || defined DD360Audi || defined DD360ComBox
     system("killall Module_DoComm");
@@ -4046,7 +3984,58 @@ static uint8_t distributionPsuModule(uint8_t *isRessign, uint8_t gunIndex)
 
     return NO;
 }
+bool Taskconutstring(char *src, char *taskname)
+{
+    bool result = false;
 
+    if (src == NULL || strlen(src) == 0)
+        return result;
+
+    if (strstr(src, taskname) != NULL &&
+        strstr(src, "grep") == NULL &&
+        strstr(src, "[") == NULL)
+    {
+        result = true;
+    }
+
+    return result;
+}
+
+int GetProcessCount(char *procName)
+{
+	int result = 0;
+	FILE *fp;
+	char cmd[256];
+	char buf[256];
+
+	sprintf(cmd, "ps -ef |grep %s", procName);
+	fp = popen(cmd, "r");
+	if(fp != NULL)
+	{
+		while(fgets(buf, sizeof(buf), fp) != NULL)
+		{
+			if (Taskconutstring(buf, procName))
+				result++;
+		}
+	}
+
+	pclose(fp);
+
+	return result;
+}
+void CheckTaskAlive()
+{
+    //log_info("Checking Task Alive\n");
+    unsigned char count = GetProcessCount("Module_ChkSysTask");
+    if( count != 1 ) {
+        system("killall Module_ChkSysTask");
+        sleep(3);
+        system("/root/Module_ChkSysTask");
+        log_info("System task lost (Check System Task) \n");
+        //ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemTaskLost = YES;
+    } //else
+        //ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemTaskLost = NO;
+}
 /**
  * [checkPileEndGfdResult 確認充電樁GFD狀態]
  * @Author   Jerry
@@ -4391,11 +4380,14 @@ int main(void)
 
     //signal(SIGCHLD,SIG_IGN);
 
-	CreateCheckSystemTaskFork();
+	//CreateCheckSystemTaskFork();
 
     CreateWatchdog();
 
     for (;;) {
+
+        CheckTaskAlive();
+
         CheckOcppStatus();
 
         ChkPrimaryStatus();

+ 17 - 2
EVSE/Projects/DD360Audi/Apps/Makefile

@@ -20,6 +20,7 @@ INC_FLAGS += -I $(TOP)/DataBase
 INC_FLAGS += -I $(TOP)/ModuleInternalComm
 INC_FLAGS += -I $(TOP)/ModuleEvComm
 INC_FLAGS += -I $(TOP)/ModuleUpdateFW
+INC_FLAGS += -I $(TOP)/ModuleChkSysTask
 INC_FLAGS += -I $(TOP)/ModulePrimary
 INC_FLAGS += -I $(TOP)/ModuleLcmCtrl
 INC_FLAGS += -I $(TOP)/ModuleDoComm
@@ -33,6 +34,7 @@ DataBaseLib = $(TOP)/DataBase
 InternalCommLib = $(TOP)/ModuleInternalComm
 EvCommLib = $(TOP)/ModuleEvComm
 UpdateFWLib = $(TOP)/ModuleUpdateFW
+ChkSysTaskLib = $(TOP)/ModuleChkSysTask
 PrimaryLib = $(TOP)/ModulePrimary
 LcmLib = $(TOP)/ModuleLcmCtrl
 DoCommLib = $(TOP)/ModuleDoComm
@@ -72,7 +74,7 @@ COMMON_OBJ_FILES = common.o \
 MAIN_OBJ_FILES = $(COMMON_OBJ_FILES) $(DataBaseLib)/DataBase.o \
 					$(CSULib)/main.o  $(CSULib)/Primary.o $(CSULib)/WatchDog.o $(CSULib)/ZipFile.o \
 					$(CSULib)/RFID.o $(CSULib)/SelfTest.o $(CSULib)/UpgradeFW.o \
-					$(CSULib)/Ethernet.o $(CSULib)/CheckSystemTask.o
+					$(CSULib)/Ethernet.o 
 					
 MAIN_SRC_FILES = $(patsubst %.o, %.c, $(MAIN_OBJ_FILES))
 %.o: %.c
@@ -105,6 +107,12 @@ UPDATEFW_SRC_FILES = $(patsubst %.o, %.c, $(UPDATEFW_OBJ_FILES))
 %.o: %.c
 	$(CC) $(CFLAGS) -c $<
 
+#Check System Task
+CHKSYSTASK_OBJ_FILES = $(COMMON_OBJ_FILES) $(ChkSysTaskLib)/Module_ChkSysTask.o 
+CHKSYSTASK_SRC_FILES = $(patsubst %.o, %.c, $(CHKSYSTASK_OBJ_FILES))
+%.o: %.c
+	$(CC) $(CFLAGS) -c $<
+
 #Event Log
 EVENTLOG_OBJ_FILES = $(COMMON_OBJ_FILES) $(DataBaseLib)/DataBase.o \
 						$(EventLogLib)/Module_EventLogging.o
@@ -131,7 +139,7 @@ READCMDLINE_SRC_FILES = $(patsubst %.o, %.c, $(READCMDLINE_OBJ_FILES))
 
 all: CopyFile apps
 
-apps: MainTask DoCommTask EvCommTask UpdateFWTask \
+apps: MainTask DoCommTask EvCommTask UpdateFWTask ChkSysTask \
 		EventLoggingTask InternalCommTask LcmControlTask \
 			PrimaryCommTask ReadCmdlineTask UnsafetyOutputTool \
 				FactoryConfigApp OtherTools CleanExec
@@ -161,6 +169,10 @@ UpdateFWTask:
 	$(CC) $(DEFINE) $(UPDATEFW_SRC_FILES) $(CFLAGS) $(TFLAGS) $(INC_FLAGS) $(Lib_Module_Upgrade) $(ModuleUpgrade_H) -o Module_UpdateFW
 	#$(CC) $(DEFINE) $(CFLAGS) -c -o Module_UpdateFW.o $(UpdateFWLib)/Module_UpdateFW.c
 	#$(CC) -o Module_UpdateFW Module_UpdateFW.o
+ChkSysTask:
+	$(CC) $(DEFINE) $(CHKSYSTASK_SRC_FILES) $(CFLAGS) $(TFLAGS) $(INC_FLAGS) -o Module_ChkSysTask
+	#$(CC) $(DEFINE) $(CFLAGS) -c -o Module_ChkSysTask.o $(ChkSysTaskLib)/Module_ChkSysTask.c
+	#$(CC) -o Module_ChkSysTask Module_ChkSysTask.o 
 
 EventLoggingTask:
 	$(CC) $(DEFINE) $(EVENTLOG_SRC_FILES) $(CFLAGS) $(TFLAGS) $(INC_FLAGS) $(SQLite3_H) $(Lib_SQLite3) -o Module_EventLogging
@@ -218,6 +230,7 @@ OtherTools:
 	cp -f Module_DoComm $(RootPath)
 	cp -f Module_EvComm $(RootPath)
 	cp -f Module_UpdateFW $(RootPath)
+	cp -f Module_ChkSysTask $(RootPath)
 	cp -f Module_EventLogging $(RootPath)
 	cp -f Module_InternalComm $(RootPath)
 	cp -f Module_LcmControl $(RootPath)
@@ -236,6 +249,7 @@ OtherTools:
 	cp -f Module_DoComm $(OutputPath)
 	cp -f Module_EvComm $(OutputPath)
 	cp -f Module_UpdateFW $(OutputPath)
+	cp -f Module_ChkSysTask $(OutputPath)
 	cp -f Module_EventLogging $(OutputPath)
 	cp -f Module_InternalComm $(OutputPath)
 	cp -f Module_LcmControl $(OutputPath)
@@ -254,6 +268,7 @@ CleanExec:
 	rm main
 	rm Module_EvComm
 	rm Module_UpdateFW
+	rm Module_ChkSysTask
 	rm Module_EventLogging
 	rm Module_InternalComm
 	rm Module_LcmControl

+ 238 - 0
EVSE/Projects/DD360Audi/Apps/ModuleChkSysTask/Module_ChkSysTask.c

@@ -0,0 +1,238 @@
+/*
+ * CheckTask.c
+ *
+ *  Created on: 2021年9月22日
+ *      Author: 8513
+ */
+#include <stdio.h>      /*標準輸入輸出定義*/
+#include <stdlib.h>     /*標準函數庫定義*/
+#include <string.h>
+#include <stdint.h>
+#include <sys/types.h>
+#include <dirent.h>
+#include "../Config.h"
+#include "../Log/log.h"
+#include "../Define/define.h"
+
+#include "../ShareMemory/shmMem.h"
+#include "Module_ChkSysTask.h"
+
+struct SysConfigData *pSysConfig = NULL;
+struct SysInfoData *pSysInfo = NULL;
+struct OCPP16Data *ShmOCPP16Data = NULL;
+struct ChargingInfoData *pAcChargingInfo = NULL;
+static struct ChargingInfoData *pDcChargingInfo = NULL;
+struct SysConfigAndInfo         *ShmSysConfigAndInfo;
+struct StatusCodeData           *ShmStatusCodeData;
+
+bool Taskconutstring(char *src, char *taskname)
+{
+    bool result = false;
+
+    if (src == NULL || strlen(src) == 0)
+        return result;
+
+    if (strstr(src, taskname) != NULL &&
+        strstr(src, "grep") == NULL &&
+        strstr(src, "[") == NULL)
+    {
+        result = true;
+    }
+
+    return result;
+}
+
+int GetProcessCount(char *procName)
+{
+	int result = 0;
+	FILE *fp;
+	char cmd[256];
+	char buf[256];
+
+	sprintf(cmd, "ps -ef |grep %s", procName);
+	fp = popen(cmd, "r");
+	if(fp != NULL)
+	{
+		while(fgets(buf, sizeof(buf), fp) != NULL)
+		{
+			if (Taskconutstring(buf, procName))
+				result++;
+		}
+	}
+
+	pclose(fp);
+
+	return result;
+}
+
+unsigned char CheckSystemTask(unsigned char systemPage)
+{
+	unsigned char result = 0;
+	unsigned char count_main 		= GetProcessCount("main");
+	unsigned char count_evComm 		= GetProcessCount("Module_EvComm");
+	unsigned char count_interComm	= GetProcessCount("Module_InternalComm");
+	unsigned char count_eventComm	= GetProcessCount("Module_EventLogging");
+	unsigned char count_primaryComm	= GetProcessCount("Module_PrimaryComm");
+	unsigned char count_lcmComm	    = GetProcessCount("Module_LcmControl");
+	unsigned char count_doComm	    = GetProcessCount("Module_DoComm");
+	unsigned char count_produceComm	= GetProcessCount("Module_ProduceUtils");
+	unsigned char count_updateFW	= GetProcessCount("Module_UpdateFW");
+
+//	if (systemPage == 0x09 || systemPage == 0x0A)
+	{
+		if (count_main < _SYSTEM_TASK_COUNT_MAIN )
+		{
+			system("killall Module_EventLogging");
+			system("killall Module_PrimaryComm");
+			system("killall Module_EvComm");
+			system("killall Module_LcmControl");
+			system("killall Module_InternalComm");
+			system("killall Module_DoComm");
+			system("killall Module_ProduceUtils");
+			system("killall Module_UpdateFW");
+			system("pkill main");
+            sleep(1);
+            system("echo V > /dev/watchdog");
+			system("/usr/bin/run_evse_restart.sh");
+            sleep(10);
+		}
+		else
+		{
+			if (count_evComm < _SYSTEM_TASK_COUNT_EVCOMM )
+			{
+				system("killall Module_EvComm");
+				sleep(1);
+				system("/root/Module_EvComm &");
+			}
+        	if (count_interComm < _SYSTEM_TASK_COUNT_INTERNALCOMM )
+			{
+				system("killall Module_InternalComm");
+				sleep(1);
+				system("/root/Module_InternalComm &");
+			}
+			if (count_eventComm < _SYSTEM_TASK_COUNT_EVENTLOGGING )
+			{
+				system("killall Module_EventLogging");
+				sleep(1);
+				system("/root/Module_EventLogging &");
+			}
+			if (count_primaryComm < _SYSTEM_TASK_COUNT_PRIMARYCOMM )
+			{
+				system("killall Module_PrimaryComm");
+				sleep(1);
+				system("/root/Module_PrimaryComm &");
+			}
+			if (count_lcmComm < _SYSTEM_TASK_COUNT_LCM )
+			{
+				system("killall Module_LcmControl");
+				sleep(1);
+				system("/root/Module_LcmControl &");
+			}
+			if (count_doComm < _SYSTEM_TASK_COUNT_DOCOMM )
+			{
+				system("killall Module_DoComm");
+				sleep(1);
+				system("/root/Module_DoComm &");
+			}
+			if (count_produceComm < _SYSTEM_TASK_COUNT_PRODUCEUTILS )
+			{
+				system("killall Module_ProduceUtils");
+				sleep(1);
+				system("/root/Module_ProduceUtils &");
+			}
+			if (count_updateFW < _SYSTEM_TASK_COUNT_UPDATEFW )
+			{
+				system("killall Module_UpdateFW");
+				sleep(1);
+				system("/root/Module_UpdateFW &");
+			}
+		}
+
+	}
+
+	if (count_main < _SYSTEM_TASK_COUNT_MAIN)
+		result = _SYSTEM_TASK_LOST_ITEM_MAIN;
+	else if (count_evComm < _SYSTEM_TASK_COUNT_EVCOMM)
+		result = _SYSTEM_TASK_LOST_ITEM_EVCOMM;
+/*	else if (count_psuComm < 2)
+		result = 3; */
+    else if (count_eventComm < _SYSTEM_TASK_COUNT_EVENTLOGGING )
+        result = _SYSTEM_TASK_LOST_ITEM_EVENTLOG;
+    else if (count_primaryComm < _SYSTEM_TASK_COUNT_PRIMARYCOMM)
+        result = _SYSTEM_TASK_LOST_ITEM_PRIMARYCOMM;
+    else if (count_lcmComm < _SYSTEM_TASK_COUNT_LCM)
+        result = _SYSTEM_TASK_LOST_ITEM_LCMCONTROL;
+    else if (count_interComm < _SYSTEM_TASK_COUNT_INTERNALCOMM )
+        result = _SYSTEM_TASK_LOST_ITEM_INTERCOMM;
+    else if (count_doComm < _SYSTEM_TASK_COUNT_DOCOMM)
+        result = _SYSTEM_TASK_LOST_ITEM_DOCOMM;
+    else if (count_produceComm < _SYSTEM_TASK_COUNT_PRODUCEUTILS)
+        result = _SYSTEM_TASK_LOST_ITEM_PRODUCTUTILS;
+    else if (count_updateFW < _SYSTEM_TASK_COUNT_UPDATEFW)
+        result = _SYSTEM_TASK_LOST_ITEM_UPDATEFW;
+
+
+	return result;
+}
+
+//===============================================
+// Check System Task alive
+// ==============================================
+void CheckSystemTaskAlive()
+{
+    unsigned char lostId = CheckSystemTask(ShmSysConfigAndInfo->SysInfo.SystemPage);
+    if (lostId != 0) {
+        log_info("Check task(%d) lost\n",lostId);
+        if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemTaskLost == NO) {
+           if (lostId == _SYSTEM_TASK_LOST_ITEM_MAIN)
+               log_info("System task lost (CSU). \n");
+           else if (lostId == _SYSTEM_TASK_LOST_ITEM_EVCOMM)
+               log_info("System task lost (EVComm). \n");
+//           else if (lostId == _SYSTEM_TASK_LOST_ITEM_PSUCOMM)
+//               PRINTF_FUNC("System task lost (PSU Task). \n");
+           else if (lostId == _SYSTEM_TASK_LOST_ITEM_EVENTLOG)
+               log_info("System task lost (Event log). \n");
+           else if (lostId == _SYSTEM_TASK_LOST_ITEM_PRIMARYCOMM)
+               log_info("System task lost (Primary). \n");
+           else if (lostId == _SYSTEM_TASK_LOST_ITEM_LCMCONTROL)
+               log_info("System task lost (LCM Comm). \n");
+           else if (lostId == _SYSTEM_TASK_LOST_ITEM_INTERCOMM)
+               log_info("System task lost (Internal Comm). \n");
+           else if (lostId == _SYSTEM_TASK_LOST_ITEM_DOCOMM)
+               log_info("System task lost (Do Comm). \n");
+           else if (lostId == _SYSTEM_TASK_LOST_ITEM_PRODUCTUTILS)
+               log_info("System task lost (ProcductUtils Comm). \n");
+           else if (lostId == _SYSTEM_TASK_LOST_ITEM_UPDATEFW)
+               log_info("System task lost (Update FW) \n");
+           ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemTaskLost = YES;
+        }
+    } else
+        ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemTaskLost = NO;
+}
+
+
+void main(void)
+{
+    if (CreateAllCsuShareMemory() == FAIL) {
+        log_error("create share memory error\r\n");
+        return FAIL;
+    }
+
+    pSysConfig = (struct SysConfigData *)GetShmSysConfigData();
+    pSysInfo = (struct SysInfoData *)GetShmSysInfoData();
+    ShmOCPP16Data = (struct OCPP16Data *)GetShmOCPP16Data();
+    ShmSysConfigAndInfo = (struct SysConfigAndInfo *)GetShmSysConfigAndInfo();
+    ShmStatusCodeData = (struct StatusCodeData *)GetShmStatusCodeData();	
+    MappingGunChargingInfo("CheckSystem Task");
+    sleep(20);
+    while(true)
+    {
+      	for (uint8_t gun = 0; gun < pSysConfig->TotalConnectorCount; gun++) {
+    		pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(gun);
+			if (pDcChargingInfo->SystemStatus == SYS_MODE_UPDATE )
+				continue;
+		}
+		CheckSystemTaskAlive();
+		sleep(3);
+    }
+}

+ 62 - 0
EVSE/Projects/DD360Audi/Apps/ModuleChkSysTask/Module_ChkSysTask.h

@@ -0,0 +1,62 @@
+/*
+ * CheckTask.h
+ *
+ *  Created on: 2021年9月2日
+ *      Author: 7564
+ */
+
+#ifndef CHECKTASK_H_
+#define CHECKTASK_H_
+
+#include 	<sys/timeb.h>
+#include 	<sys/types.h>
+#include 	<sys/ioctl.h>
+#include 	<sys/socket.h>
+#include 	<sys/ipc.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 	<string.h>
+#include 	<stdint.h>
+#include	<time.h>
+#include	<ctype.h>
+#include 	<ifaddrs.h>
+#include 	<math.h>
+#include 	<stdbool.h>
+#include 	<dirent.h>
+
+#define _SYSTEM_TASK_LOST_ITEM_MAIN         1
+#define _SYSTEM_TASK_LOST_ITEM_EVCOMM       2
+#define _SYSTEM_TASK_LOST_ITEM_EVENTLOG     3
+#define _SYSTEM_TASK_LOST_ITEM_PRIMARYCOMM  4
+#define _SYSTEM_TASK_LOST_ITEM_LCMCONTROL   5
+#define _SYSTEM_TASK_LOST_ITEM_INTERCOMM    6
+#define _SYSTEM_TASK_LOST_ITEM_DOCOMM       7
+#define _SYSTEM_TASK_LOST_ITEM_PRODUCTUTILS 8
+#define _SYSTEM_TASK_LOST_ITEM_UPDATEFW     9
+
+#define _SYSTEM_TASK_COUNT_MAIN             4 
+#define _SYSTEM_TASK_COUNT_EVCOMM           2
+#define _SYSTEM_TASK_COUNT_INTERNALCOMM     2
+#define _SYSTEM_TASK_COUNT_EVENTLOGGING     1
+#define _SYSTEM_TASK_COUNT_PRIMARYCOMM      1
+#define _SYSTEM_TASK_COUNT_LCM              1
+#define _SYSTEM_TASK_COUNT_DOCOMM           1
+#define _SYSTEM_TASK_COUNT_PRODUCEUTILS     1
+#define _SYSTEM_TASK_COUNT_UPDATEFW         1
+
+
+unsigned char CheckSystemTask(unsigned char systemPage);
+
+#endif /* CHECKSYSTEMTASK_H_ */

+ 1 - 1
EVSE/Projects/DD360Audi/Apps/ModuleUpdateFW/Module_UpdateFW.c

@@ -412,7 +412,7 @@ static int CheckUpdateProcess(void)
 
 void CheckFwUpdateFunction(void)
 {
-    log_info("pSysInfo->FirmwareUpdate = %d \n", pSysInfo->FirmwareUpdate);
+    //log_info("pSysInfo->FirmwareUpdate = %d \n", pSysInfo->FirmwareUpdate);
     if (pSysInfo->FirmwareUpdate == YES) {
         log_info("ftp : update start. \n");
         TryCloseWatchdog();

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


BIN
EVSE/Projects/DD360Audi/output/Module_ChkSysTask


BIN
EVSE/Projects/DD360Audi/output/Module_UpdateFW


BIN
EVSE/Projects/DD360Audi/output/main


+ 0 - 0
EVSE/Projects/DD360ComBox/Apps/.metadata/.lock


+ 114 - 91
EVSE/Projects/DD360ComBox/Apps/CSU/main.c

@@ -41,7 +41,7 @@
 #include "../Define/define.h"
 #include "../ShareMemory/shmMem.h"
 #include "../SelectGun/SelectGun.h"
-#include "CheckSystemTask.h"
+
 
 //------------------------------------------------------------------------------
 static struct SysInfoData *pSysInfo = NULL;
@@ -82,7 +82,7 @@ uint8_t bd0_2_status = 0;
 uint8_t bd1_1_status = 0;
 uint8_t bd1_2_status = 0;
 
-char *fwVersion = "V1.15.00.0000.00"; // "V0.16.00.0000.00";
+char *fwVersion = "V1.17.00.0000.00"; // "V0.16.00.0000.00";
 
 //sqlite3 *localDb;
 bool isDb_ready;
@@ -120,7 +120,7 @@ extern void SetIsCardScan(bool value);
 extern void SelfTestRun(void);
 
 //UpgradeFW.c
-extern void CheckFwUpdateFunction(void);
+/*extern void CheckFwUpdateFunction(void);*/
 
 //Ethernet.c
 extern void InitEthernet(void);
@@ -1637,12 +1637,14 @@ void _DetectPlugInTimeout(void)
     ClearDetectPluginFlag();
 
     sleep(1); //等待DoComm回報插槍訊號給主櫃
-#if defined DD360Audi || DD360 || DD360Combox
+#if defined DD360Audi
 	    //pSysInfo->SystemPage = _LCM_COMPLETE;
 		setChargerMode(pSysInfo->CurGunSelected, S_TERMINATING);
-	    return;
-#endif
+#elif DD360 || DD360Combox
+	setChargerMode(pSysInfo->CurGunSelected, S_COMPLETE);
     systemPageRestoreInit();
+#endif
+
 }
 
 void _DetectEvChargingEnableTimeout(uint8_t gunIndex)
@@ -1671,11 +1673,11 @@ void _DetectEvseChargingEnableTimeout(uint8_t gunIndex)
     log_info("*********** _DetectEvseChargingEnableTimeout (GFD timeout) ***********\n");
     //if (chargingInfo[gunIndex]->GroundFaultStatus != GFD_PASS)
     {
-#if defined DD360Audi || DD360 || DD360Combox
-        pSysInfo->SystemPage = _LCM_COMPLETE;
-        setChargerMode(gunIndex, S_TERMINATING);
-#else
-        setChargerMode(gunIndex, MODE_IDLE);
+#if defined DD360Audi
+	    //pSysInfo->SystemPage = _LCM_COMPLETE;
+		setChargerMode(pSysInfo->CurGunSelected, S_TERMINATING);
+#elif DD360 || DD360Combox
+	setChargerMode(pSysInfo->CurGunSelected, S_COMPLETE);
 #endif
         _AutoReturnTimeout();
     }
@@ -1684,11 +1686,11 @@ void _DetectEvseChargingEnableTimeout(uint8_t gunIndex)
 void _PrepareTimeout(uint8_t gunIndex)
 {
     log_info("*********** _PrepareTimeout ***********\n");
-#if defined DD360Audi || DD360 || DD360Combox
-        pSysInfo->SystemPage = _LCM_COMPLETE;
-        setChargerMode(gunIndex, S_TERMINATING);
-#else
-     setChargerMode(gunIndex, MODE_IDLE);
+#if defined DD360Audi
+	    //pSysInfo->SystemPage = _LCM_COMPLETE;
+		setChargerMode(pSysInfo->CurGunSelected, S_TERMINATING);
+#elif DD360 || DD360Combox
+	setChargerMode(pSysInfo->CurGunSelected, S_COMPLETE);
 #endif
     pAlarmCode->AlarmEvents.bits.PsuNoResource = YES;
     _AutoReturnTimeout();
@@ -1697,76 +1699,15 @@ void _PrepareTimeout(uint8_t gunIndex)
 void _CcsPrechargeTimeout(uint8_t gunIndex)
 {
     log_info("*********** _CcsPrechargeTimeout ***********\n");
-#if defined DD360Audi || DD360 || DD360Combox
-        pSysInfo->SystemPage = _LCM_COMPLETE;
-        setChargerMode(gunIndex, S_TERMINATING);
-#else
-     setChargerMode(gunIndex, MODE_IDLE);
+#if defined DD360Audi
+	    //pSysInfo->SystemPage = _LCM_COMPLETE;
+		setChargerMode(pSysInfo->CurGunSelected, S_TERMINATING);
+#elif DD360 || DD360Combox
+	setChargerMode(pSysInfo->CurGunSelected, S_COMPLETE);
 #endif
 }
 
-//===============================================
-// Check System Task alive
-// ==============================================
-void CheckSystemTaskAlive()
-{
-    unsigned char lostId = CheckSystemTask(ShmSysConfigAndInfo->SysInfo.SystemPage);
-    if (lostId != 0) {
-        log_info("Check task(%d) lost\n",lostId);
-        if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemTaskLost == NO) {
-           if (lostId == _SYSTEM_TASK_LOST_ITEM_MAIN)
-               log_info("System task lost (CSU). \n");
-           else if (lostId == _SYSTEM_TASK_LOST_ITEM_EVCOMM)
-               log_info("System task lost (EVComm). \n");
-//           else if (lostId == _SYSTEM_TASK_LOST_ITEM_PSUCOMM)
-//               PRINTF_FUNC("System task lost (PSU Task). \n");
-           else if (lostId == _SYSTEM_TASK_LOST_ITEM_EVENTLOG)
-               log_info("System task lost (Event log). \n");
-           else if (lostId == _SYSTEM_TASK_LOST_ITEM_PRIMARYCOMM)
-               log_info("System task lost (Primary). \n");
-           else if (lostId == _SYSTEM_TASK_LOST_ITEM_LCMCONTROL)
-               log_info("System task lost (LCM Comm). \n");
-           else if (lostId == _SYSTEM_TASK_LOST_ITEM_INTERCOMM)
-               log_info("System task lost (Internal Comm). \n");
-           else if (lostId == _SYSTEM_TASK_LOST_ITEM_DOCOMM)
-               log_info("System task lost (Do Comm). \n");
-           else if (lostId == _SYSTEM_TASK_LOST_ITEM_PRODUCTUTILS)
-               log_info("System task lost (ProcductUtils Comm). \n");
-           ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemTaskLost = YES;
-        }
-    } else
-        ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemTaskLost = NO;
-}
-
-void CreateCheckSystemTaskFork()
-{
-    pid_t taskPid;
-    taskPid = fork();
-    if (taskPid == 0)
-    {
-        while(true)
-        {
-			/*
-			for (int _index = 0; _index < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount; _index++)
-			{
-				if (chargingInfo[_index]->SystemStatus == SYS_MODE_UPDATE ||
-						chargingInfo[_index]->Type == 0x09)
-				{
-					stopToDet = true;
-					continue;
-				}
-			}
-			*/
-			for (uint8_t gun = 0; gun < pSysConfig->TotalConnectorCount; gun++) {
-				pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(gun);
-				if (pDcChargingInfo->SystemStatus == SYS_MODE_UPDATE )
-						continue;
-			}
-			CheckSystemTaskAlive();
-			sleep(5);
-		}
-	}
-}
+
 //===============================================
 // 取得卡號與卡號驗證
 //===============================================
@@ -2663,6 +2604,11 @@ int SpawnTask(void)
     system("/root/Module_LcmControl &");
     system("/root/Module_InternalComm &");
     system("/root/Module_ProduceUtils &");
+    system("/root/Module_UpdateFW &");
+
+    unsigned char count = GetProcessCount("Module_ChkSysTask");
+    if( count != 1)
+        system("/root/Module_ChkSysTask &");
 
 #if defined DD360 ||defined DD360Audi || defined DD360ComBox
     system("/root/Module_DoComm &");
@@ -2702,6 +2648,8 @@ void KillTask(void)
     system("killall Module_EvComm");
     system("killall Module_LcmControl");
     system("killall Module_InternalComm");
+    system("killall Module_UpdateFW");
+    system("killall Module_ChkSysTask");
     //system("killall Module_DoComm");
 #if defined DD360 || defined DD360Audi || defined DD360ComBox
     return ;
@@ -2738,6 +2686,8 @@ void KillAllTask(void)
     system("killall Module_EvComm");
     system("killall Module_LcmControl");
     system("killall Module_InternalComm");
+    system("killall Module_UpdateFW");
+    system("killall Module_ChkSysTask");
 
 #if defined DD360 || defined DD360Audi || defined DD360ComBox
     system("killall Module_DoComm");
@@ -2849,8 +2799,8 @@ void CreateTimeoutFork(void)
                         pAlarmCode->AlarmEvents.bits.DisconnectedFromDo = ABNORMAL;
                         log_error("Author timeout restart DoComm\r\n");
                         system("killall Module_DoComm");
-                        sleep(1);
-                        system("/root/Module_DoComm &");
+                        //sleep(1);
+                        //system("/root/Module_DoComm &");
                     }
                 }
                 break;
@@ -2865,8 +2815,8 @@ void CreateTimeoutFork(void)
                         pAlarmCode->AlarmEvents.bits.DisconnectedFromDo = ABNORMAL;
                         log_error("Author timeout restart DoComm\r\n");
                         system("killall Module_DoComm");
-                        sleep(1);
-                        system("/root/Module_DoComm &");
+                        //sleep(1);
+                        //system("/root/Module_DoComm &");
                     }
                 }
                 break;
@@ -3431,7 +3381,7 @@ void StopProcessingLoop()
 {
     for (;;) {
         CheckFactoryConfigFunction();
-        CheckFwUpdateFunction();
+        //CheckFwUpdateFunction();
         if (pSysWarning->Level == WARN_LV_ER) {
             ChkPrimaryStatus();
             if (pSysWarning->Level == WARN_LV_NL) {
@@ -3792,13 +3742,29 @@ static void autoStartChargingForComBox(uint8_t gunIndex)
     return ;
 #endif //!defined DD360ComBox
 
+    if ( (pSysInfo->SystemPage >= _LCM_AUTHORIZING && pSysInfo->SystemPage <= _LCM_AUTHORIZ_FAIL) ||
+        pDcChargingInfo->isVerify ) {
+        return;
+    }
     pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(gunIndex);
 
     if ((pDcChargingInfo->ConnectorPlugIn == YES) &&
             (pDcChargingInfo->SystemStatus == S_IDLE)
        ) {
-        pSysInfo->CurGunSelected = gunIndex;
+
+#if VERIFY_EVCCID
+        if (!pDcChargingInfo->isVerify ) {
+            strcpy((char *)pSysConfig->UserId, (char *)pDcChargingInfo->EVCCID);
+            if( strcmp( (char *)pSysConfig->UserId , "" ) != EQUAL ) {
+                pDcChargingInfo->isVerify = true;
+                log_info("Get User(%d) ID:%s\n",gunIndex,pSysConfig->UserId);
+                pSysInfo->CurGunSelected = gunIndex;
+                pSysInfo->SystemPage = _LCM_AUTHORIZING;
+            }
+        }
+#else
         strcpy((char *)&pSysConfig->UserId, "AutoStartCharging");
+#endif
     }
 }
 
@@ -4018,7 +3984,58 @@ static uint8_t distributionPsuModule(uint8_t *isRessign, uint8_t gunIndex)
 
     return NO;
 }
+bool Taskconutstring(char *src, char *taskname)
+{
+    bool result = false;
+
+    if (src == NULL || strlen(src) == 0)
+        return result;
+
+    if (strstr(src, taskname) != NULL &&
+        strstr(src, "grep") == NULL &&
+        strstr(src, "[") == NULL)
+    {
+        result = true;
+    }
+
+    return result;
+}
+
+int GetProcessCount(char *procName)
+{
+	int result = 0;
+	FILE *fp;
+	char cmd[256];
+	char buf[256];
+
+	sprintf(cmd, "ps -ef |grep %s", procName);
+	fp = popen(cmd, "r");
+	if(fp != NULL)
+	{
+		while(fgets(buf, sizeof(buf), fp) != NULL)
+		{
+			if (Taskconutstring(buf, procName))
+				result++;
+		}
+	}
+
+	pclose(fp);
 
+	return result;
+}
+void CheckTaskAlive()
+{
+    //log_info("Checking Task Alive\n");
+    unsigned char count = GetProcessCount("Module_ChkSysTask");
+    if( count != 1 ) {
+        system("killall Module_ChkSysTask");
+        sleep(3);
+        system("/root/Module_ChkSysTask");
+        log_info("System task lost (Check System Task) \n");
+        //ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemTaskLost = YES;
+    } //else
+        //ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemTaskLost = NO;
+}
 /**
  * [checkPileEndGfdResult 確認充電樁GFD狀態]
  * @Author   Jerry
@@ -4363,11 +4380,14 @@ int main(void)
 
     //signal(SIGCHLD,SIG_IGN);
 
-	CreateCheckSystemTaskFork();
+	//CreateCheckSystemTaskFork();
 
     CreateWatchdog();
 
     for (;;) {
+
+        CheckTaskAlive();
+
         CheckOcppStatus();
 
         ChkPrimaryStatus();
@@ -4378,7 +4398,7 @@ int main(void)
            ) {
             CheckFactoryConfigFunction();
 
-            CheckFwUpdateFunction();
+            //CheckFwUpdateFunction();
         }
 
         // OCPP 邏輯
@@ -5094,6 +5114,9 @@ int main(void)
                         GetTimeoutValue(pDcChargingInfo->TimeoutTimer) >= 10000000) {
                     setChargerMode(gunIndex, MODE_IDLE);
                     destroySelGun(gunIndex); //Jerry add
+#ifdef DD360 || DD3660ComBox
+					pSysInfo->SystemPage = _LCM_IDLE;
+#endif
                 }
 
                 if (pSysInfo->CurGunSelected == gunIndex) {

+ 1 - 0
EVSE/Projects/DD360ComBox/Apps/CSU/main.h

@@ -43,6 +43,7 @@
 #define GUN_PRECHARGING_TIMEOUT                 (60)
 
 #define WHILE_LOOP_TIME                         (10000)
+#define VERIFY_EVCCID                           0   // 0:Not verify 1:for verify
 
 //#define log_info(format, args...) StoreLogMsg_1("[%s:%d][%s][Info] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
 //#define log_warn(format, args...) StoreLogMsg_1("[%s:%d][%s][Warn] "format, __FILE__, __LINE__, __FUNCTION__, ##args)

+ 1 - 0
EVSE/Projects/DD360ComBox/Apps/Define/define.h

@@ -638,6 +638,7 @@ struct ChargingInfoData
     struct timespec     ConnectorTimeout;
     unsigned char       PantographFlag;                 // 0: normal gun type,  1: pantograph gun type
 	unsigned char 		Replug_flag;
+    unsigned char       isVerify;
 };
 
 typedef union

+ 33 - 2
EVSE/Projects/DD360ComBox/Apps/Makefile

@@ -19,6 +19,8 @@ INC_FLAGS += -I $(TOP)/CSU
 INC_FLAGS += -I $(TOP)/DataBase
 INC_FLAGS += -I $(TOP)/ModuleInternalComm
 INC_FLAGS += -I $(TOP)/ModuleEvComm
+INC_FLAGS += -I $(TOP)/ModuleUpdateFW
+INC_FLAGS += -I $(TOP)/ModuleChkSysTask
 INC_FLAGS += -I $(TOP)/ModulePrimary
 INC_FLAGS += -I $(TOP)/ModuleLcmCtrl
 INC_FLAGS += -I $(TOP)/ModuleDoComm
@@ -31,6 +33,8 @@ CSULib = $(TOP)/CSU
 DataBaseLib = $(TOP)/DataBase
 InternalCommLib = $(TOP)/ModuleInternalComm
 EvCommLib = $(TOP)/ModuleEvComm
+UpdateFWLib = $(TOP)/ModuleUpdateFW
+ChkSysTaskLib = $(TOP)/ModuleChkSysTask
 PrimaryLib = $(TOP)/ModulePrimary
 LcmLib = $(TOP)/ModuleLcmCtrl
 DoCommLib = $(TOP)/ModuleDoComm
@@ -70,7 +74,7 @@ COMMON_OBJ_FILES = common.o \
 MAIN_OBJ_FILES = $(COMMON_OBJ_FILES) $(DataBaseLib)/DataBase.o \
 					$(CSULib)/main.o  $(CSULib)/Primary.o $(CSULib)/WatchDog.o $(CSULib)/ZipFile.o \
 					$(CSULib)/RFID.o $(CSULib)/SelfTest.o $(CSULib)/UpgradeFW.o \
-					$(CSULib)/Ethernet.o $(CSULib)/CheckSystemTask.o
+					$(CSULib)/Ethernet.o 
 					
 MAIN_SRC_FILES = $(patsubst %.o, %.c, $(MAIN_OBJ_FILES))
 %.o: %.c
@@ -97,6 +101,18 @@ EVCOMM_SRC_FILES = $(patsubst %.o, %.c, $(EVCOMM_OBJ_FILES))
 %.o: %.c
 	$(CC) $(CFLAGS) -c $<
 
+#Update FW
+UPDATEFW_OBJ_FILES = $(COMMON_OBJ_FILES) $(UpdateFWLib)/Module_UpdateFW.o
+UPDATEFW_SRC_FILES = $(patsubst %.o, %.c, $(UPDATEFW_OBJ_FILES))
+%.o: %.c
+	$(CC) $(CFLAGS) -c $<
+
+#Check System Task
+CHKSYSTASK_OBJ_FILES = $(COMMON_OBJ_FILES) $(ChkSysTaskLib)/Module_ChkSysTask.o 
+CHKSYSTASK_SRC_FILES = $(patsubst %.o, %.c, $(CHKSYSTASK_OBJ_FILES))
+%.o: %.c
+	$(CC) $(CFLAGS) -c $<
+
 #Event Log
 EVENTLOG_OBJ_FILES = $(COMMON_OBJ_FILES) $(DataBaseLib)/DataBase.o \
 						$(EventLogLib)/Module_EventLogging.o
@@ -123,7 +139,7 @@ READCMDLINE_SRC_FILES = $(patsubst %.o, %.c, $(READCMDLINE_OBJ_FILES))
 
 all: CopyFile apps
 
-apps: MainTask DoCommTask EvCommTask \
+apps: MainTask DoCommTask EvCommTask UpdateFWTask ChkSysTask \
 		EventLoggingTask InternalCommTask LcmControlTask \
 			PrimaryCommTask ReadCmdlineTask UnsafetyOutputTool \
 				FactoryConfigApp OtherTools CleanExec
@@ -149,6 +165,15 @@ EvCommTask:
 	#$(CC) $(DEFINE) $(CFLAGS) $(RatedCurrent_H) -c -o Module_EvComm.o $(EvCommLib)/Module_EvComm.c
 	#$(CC) -o Module_EvComm Ev_Comm.o Module_EvComm.o $(Lib_Module_RatedCurrent)
 
+UpdateFWTask:
+	$(CC) $(DEFINE) $(UPDATEFW_SRC_FILES) $(CFLAGS) $(TFLAGS) $(INC_FLAGS) $(Lib_Module_Upgrade) $(ModuleUpgrade_H) -o Module_UpdateFW
+	#$(CC) $(DEFINE) $(CFLAGS) -c -o Module_UpdateFW.o $(UpdateFWLib)/Module_UpdateFW.c
+	#$(CC) -o Module_UpdateFW Module_UpdateFW.o
+ChkSysTask:
+	$(CC) $(DEFINE) $(CHKSYSTASK_SRC_FILES) $(CFLAGS) $(TFLAGS) $(INC_FLAGS) -o Module_ChkSysTask
+	#$(CC) $(DEFINE) $(CFLAGS) -c -o Module_ChkSysTask.o $(ChkSysTaskLib)/Module_ChkSysTask.c
+	#$(CC) -o Module_ChkSysTask Module_ChkSysTask.o 
+
 EventLoggingTask:
 	$(CC) $(DEFINE) $(EVENTLOG_SRC_FILES) $(CFLAGS) $(TFLAGS) $(INC_FLAGS) $(SQLite3_H) $(Lib_SQLite3) -o Module_EventLogging
 	#$(CC) $(DEFINE) $(CFLAGS) -c -o define.o $(DefineLib)/define.c
@@ -204,6 +229,8 @@ OtherTools:
 	cp -f main $(RootPath)
 	cp -f Module_DoComm $(RootPath)
 	cp -f Module_EvComm $(RootPath)
+	cp -f Module_UpdateFW $(RootPath)
+	cp -f Module_ChkSysTask $(RootPath)
 	cp -f Module_EventLogging $(RootPath)
 	cp -f Module_InternalComm $(RootPath)
 	cp -f Module_LcmControl $(RootPath)
@@ -221,6 +248,8 @@ OtherTools:
 	cp -f main $(OutputPath)
 	cp -f Module_DoComm $(OutputPath)
 	cp -f Module_EvComm $(OutputPath)
+	cp -f Module_UpdateFW $(OutputPath)
+	cp -f Module_ChkSysTask $(OutputPath)
 	cp -f Module_EventLogging $(OutputPath)
 	cp -f Module_InternalComm $(OutputPath)
 	cp -f Module_LcmControl $(OutputPath)
@@ -238,6 +267,8 @@ CleanExec:
 	rm -f *.o
 	rm main
 	rm Module_EvComm
+	rm Module_UpdateFW
+	rm Module_ChkSysTask
 	rm Module_EventLogging
 	rm Module_InternalComm
 	rm Module_LcmControl

+ 238 - 0
EVSE/Projects/DD360ComBox/Apps/ModuleChkSysTask/Module_ChkSysTask.c

@@ -0,0 +1,238 @@
+/*
+ * CheckTask.c
+ *
+ *  Created on: 2021年9月22日
+ *      Author: 8513
+ */
+#include <stdio.h>      /*標準輸入輸出定義*/
+#include <stdlib.h>     /*標準函數庫定義*/
+#include <string.h>
+#include <stdint.h>
+#include <sys/types.h>
+#include <dirent.h>
+#include "../Config.h"
+#include "../Log/log.h"
+#include "../Define/define.h"
+
+#include "../ShareMemory/shmMem.h"
+#include "Module_ChkSysTask.h"
+
+struct SysConfigData *pSysConfig = NULL;
+struct SysInfoData *pSysInfo = NULL;
+struct OCPP16Data *ShmOCPP16Data = NULL;
+struct ChargingInfoData *pAcChargingInfo = NULL;
+static struct ChargingInfoData *pDcChargingInfo = NULL;
+struct SysConfigAndInfo         *ShmSysConfigAndInfo;
+struct StatusCodeData           *ShmStatusCodeData;
+
+bool Taskconutstring(char *src, char *taskname)
+{
+    bool result = false;
+
+    if (src == NULL || strlen(src) == 0)
+        return result;
+
+    if (strstr(src, taskname) != NULL &&
+        strstr(src, "grep") == NULL &&
+        strstr(src, "[") == NULL)
+    {
+        result = true;
+    }
+
+    return result;
+}
+
+int GetProcessCount(char *procName)
+{
+	int result = 0;
+	FILE *fp;
+	char cmd[256];
+	char buf[256];
+
+	sprintf(cmd, "ps -ef |grep %s", procName);
+	fp = popen(cmd, "r");
+	if(fp != NULL)
+	{
+		while(fgets(buf, sizeof(buf), fp) != NULL)
+		{
+			if (Taskconutstring(buf, procName))
+				result++;
+		}
+	}
+
+	pclose(fp);
+
+	return result;
+}
+
+unsigned char CheckSystemTask(unsigned char systemPage)
+{
+	unsigned char result = 0;
+	unsigned char count_main 		= GetProcessCount("main");
+	unsigned char count_evComm 		= GetProcessCount("Module_EvComm");
+	unsigned char count_interComm	= GetProcessCount("Module_InternalComm");
+	unsigned char count_eventComm	= GetProcessCount("Module_EventLogging");
+	unsigned char count_primaryComm	= GetProcessCount("Module_PrimaryComm");
+	unsigned char count_lcmComm	    = GetProcessCount("Module_LcmControl");
+	unsigned char count_doComm	    = GetProcessCount("Module_DoComm");
+	unsigned char count_produceComm	= GetProcessCount("Module_ProduceUtils");
+	unsigned char count_updateFW	= GetProcessCount("Module_UpdateFW");
+
+//	if (systemPage == 0x09 || systemPage == 0x0A)
+	{
+		if (count_main < _SYSTEM_TASK_COUNT_MAIN )
+		{
+			system("killall Module_EventLogging");
+			system("killall Module_PrimaryComm");
+			system("killall Module_EvComm");
+			system("killall Module_LcmControl");
+			system("killall Module_InternalComm");
+			system("killall Module_DoComm");
+			system("killall Module_ProduceUtils");
+			system("killall Module_UpdateFW");
+			system("pkill main");
+            sleep(1);
+            system("echo V > /dev/watchdog");
+			system("/usr/bin/run_evse_restart.sh");
+            sleep(10);
+		}
+		else
+		{
+			if (count_evComm < _SYSTEM_TASK_COUNT_EVCOMM )
+			{
+				system("killall Module_EvComm");
+				sleep(1);
+				system("/root/Module_EvComm &");
+			}
+        	if (count_interComm < _SYSTEM_TASK_COUNT_INTERNALCOMM )
+			{
+				system("killall Module_InternalComm");
+				sleep(1);
+				system("/root/Module_InternalComm &");
+			}
+			if (count_eventComm < _SYSTEM_TASK_COUNT_EVENTLOGGING )
+			{
+				system("killall Module_EventLogging");
+				sleep(1);
+				system("/root/Module_EventLogging &");
+			}
+			if (count_primaryComm < _SYSTEM_TASK_COUNT_PRIMARYCOMM )
+			{
+				system("killall Module_PrimaryComm");
+				sleep(1);
+				system("/root/Module_PrimaryComm &");
+			}
+			if (count_lcmComm < _SYSTEM_TASK_COUNT_LCM )
+			{
+				system("killall Module_LcmControl");
+				sleep(1);
+				system("/root/Module_LcmControl &");
+			}
+			if (count_doComm < _SYSTEM_TASK_COUNT_DOCOMM )
+			{
+				system("killall Module_DoComm");
+				sleep(1);
+				system("/root/Module_DoComm &");
+			}
+			if (count_produceComm < _SYSTEM_TASK_COUNT_PRODUCEUTILS )
+			{
+				system("killall Module_ProduceUtils");
+				sleep(1);
+				system("/root/Module_ProduceUtils &");
+			}
+			if (count_updateFW < _SYSTEM_TASK_COUNT_UPDATEFW )
+			{
+				system("killall Module_UpdateFW");
+				sleep(1);
+				system("/root/Module_UpdateFW &");
+			}
+		}
+
+	}
+
+	if (count_main < _SYSTEM_TASK_COUNT_MAIN)
+		result = _SYSTEM_TASK_LOST_ITEM_MAIN;
+	else if (count_evComm < _SYSTEM_TASK_COUNT_EVCOMM)
+		result = _SYSTEM_TASK_LOST_ITEM_EVCOMM;
+/*	else if (count_psuComm < 2)
+		result = 3; */
+    else if (count_eventComm < _SYSTEM_TASK_COUNT_EVENTLOGGING )
+        result = _SYSTEM_TASK_LOST_ITEM_EVENTLOG;
+    else if (count_primaryComm < _SYSTEM_TASK_COUNT_PRIMARYCOMM)
+        result = _SYSTEM_TASK_LOST_ITEM_PRIMARYCOMM;
+    else if (count_lcmComm < _SYSTEM_TASK_COUNT_LCM)
+        result = _SYSTEM_TASK_LOST_ITEM_LCMCONTROL;
+    else if (count_interComm < _SYSTEM_TASK_COUNT_INTERNALCOMM )
+        result = _SYSTEM_TASK_LOST_ITEM_INTERCOMM;
+    else if (count_doComm < _SYSTEM_TASK_COUNT_DOCOMM)
+        result = _SYSTEM_TASK_LOST_ITEM_DOCOMM;
+    else if (count_produceComm < _SYSTEM_TASK_COUNT_PRODUCEUTILS)
+        result = _SYSTEM_TASK_LOST_ITEM_PRODUCTUTILS;
+    else if (count_updateFW < _SYSTEM_TASK_COUNT_UPDATEFW)
+        result = _SYSTEM_TASK_LOST_ITEM_UPDATEFW;
+
+
+	return result;
+}
+
+//===============================================
+// Check System Task alive
+// ==============================================
+void CheckSystemTaskAlive()
+{
+    unsigned char lostId = CheckSystemTask(ShmSysConfigAndInfo->SysInfo.SystemPage);
+    if (lostId != 0) {
+        log_info("Check task(%d) lost\n",lostId);
+        if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemTaskLost == NO) {
+           if (lostId == _SYSTEM_TASK_LOST_ITEM_MAIN)
+               log_info("System task lost (CSU). \n");
+           else if (lostId == _SYSTEM_TASK_LOST_ITEM_EVCOMM)
+               log_info("System task lost (EVComm). \n");
+//           else if (lostId == _SYSTEM_TASK_LOST_ITEM_PSUCOMM)
+//               PRINTF_FUNC("System task lost (PSU Task). \n");
+           else if (lostId == _SYSTEM_TASK_LOST_ITEM_EVENTLOG)
+               log_info("System task lost (Event log). \n");
+           else if (lostId == _SYSTEM_TASK_LOST_ITEM_PRIMARYCOMM)
+               log_info("System task lost (Primary). \n");
+           else if (lostId == _SYSTEM_TASK_LOST_ITEM_LCMCONTROL)
+               log_info("System task lost (LCM Comm). \n");
+           else if (lostId == _SYSTEM_TASK_LOST_ITEM_INTERCOMM)
+               log_info("System task lost (Internal Comm). \n");
+           else if (lostId == _SYSTEM_TASK_LOST_ITEM_DOCOMM)
+               log_info("System task lost (Do Comm). \n");
+           else if (lostId == _SYSTEM_TASK_LOST_ITEM_PRODUCTUTILS)
+               log_info("System task lost (ProcductUtils Comm). \n");
+           else if (lostId == _SYSTEM_TASK_LOST_ITEM_UPDATEFW)
+               log_info("System task lost (Update FW) \n");
+           ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemTaskLost = YES;
+        }
+    } else
+        ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemTaskLost = NO;
+}
+
+
+void main(void)
+{
+    if (CreateAllCsuShareMemory() == FAIL) {
+        log_error("create share memory error\r\n");
+        return FAIL;
+    }
+
+    pSysConfig = (struct SysConfigData *)GetShmSysConfigData();
+    pSysInfo = (struct SysInfoData *)GetShmSysInfoData();
+    ShmOCPP16Data = (struct OCPP16Data *)GetShmOCPP16Data();
+    ShmSysConfigAndInfo = (struct SysConfigAndInfo *)GetShmSysConfigAndInfo();
+    ShmStatusCodeData = (struct StatusCodeData *)GetShmStatusCodeData();	
+    MappingGunChargingInfo("CheckSystem Task");
+    sleep(20);
+    while(true)
+    {
+      	for (uint8_t gun = 0; gun < pSysConfig->TotalConnectorCount; gun++) {
+    		pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(gun);
+			if (pDcChargingInfo->SystemStatus == SYS_MODE_UPDATE )
+				continue;
+		}
+		CheckSystemTaskAlive();
+		sleep(3);
+    }
+}

+ 62 - 0
EVSE/Projects/DD360ComBox/Apps/ModuleChkSysTask/Module_ChkSysTask.h

@@ -0,0 +1,62 @@
+/*
+ * CheckTask.h
+ *
+ *  Created on: 2021年9月2日
+ *      Author: 7564
+ */
+
+#ifndef CHECKTASK_H_
+#define CHECKTASK_H_
+
+#include 	<sys/timeb.h>
+#include 	<sys/types.h>
+#include 	<sys/ioctl.h>
+#include 	<sys/socket.h>
+#include 	<sys/ipc.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 	<string.h>
+#include 	<stdint.h>
+#include	<time.h>
+#include	<ctype.h>
+#include 	<ifaddrs.h>
+#include 	<math.h>
+#include 	<stdbool.h>
+#include 	<dirent.h>
+
+#define _SYSTEM_TASK_LOST_ITEM_MAIN         1
+#define _SYSTEM_TASK_LOST_ITEM_EVCOMM       2
+#define _SYSTEM_TASK_LOST_ITEM_EVENTLOG     3
+#define _SYSTEM_TASK_LOST_ITEM_PRIMARYCOMM  4
+#define _SYSTEM_TASK_LOST_ITEM_LCMCONTROL   5
+#define _SYSTEM_TASK_LOST_ITEM_INTERCOMM    6
+#define _SYSTEM_TASK_LOST_ITEM_DOCOMM       7
+#define _SYSTEM_TASK_LOST_ITEM_PRODUCTUTILS 8
+#define _SYSTEM_TASK_LOST_ITEM_UPDATEFW     9
+
+#define _SYSTEM_TASK_COUNT_MAIN             4 
+#define _SYSTEM_TASK_COUNT_EVCOMM           2
+#define _SYSTEM_TASK_COUNT_INTERNALCOMM     2
+#define _SYSTEM_TASK_COUNT_EVENTLOGGING     1
+#define _SYSTEM_TASK_COUNT_PRIMARYCOMM      1
+#define _SYSTEM_TASK_COUNT_LCM              1
+#define _SYSTEM_TASK_COUNT_DOCOMM           1
+#define _SYSTEM_TASK_COUNT_PRODUCEUTILS     1
+#define _SYSTEM_TASK_COUNT_UPDATEFW         1
+
+
+unsigned char CheckSystemTask(unsigned char systemPage);
+
+#endif /* CHECKSYSTEMTASK_H_ */

+ 205 - 198
EVSE/Projects/DD360ComBox/Apps/ModuleEvComm/Ev_Comm.c

@@ -1,198 +1,205 @@
-#include <stdio.h>      /*標準輸入輸出定義*/
-#include <stdlib.h>     /*標準函數庫定義*/
-#include <stdint.h>
-#include <string.h>
-
-#include <linux/can.h>
-#include <linux/can/raw.h>
-
-#include <unistd.h>     /*Unix 標準函數定義*/
-#include <fcntl.h>      /*檔控制定義*/
-#include <termios.h>    /*PPSIX 終端控制定義*/
-#include <errno.h>      /*錯誤號定義*/
-
-#include "Ev_Comm.h"
-#include "Module_EvComm.h"
-
-//------------------------------------------------------------------------------
-int PackageIdCmd(int cmd)
-{
-    return cmd | 0x80000000;
-}
-
-void SendCmdToEvboard(int cmd, uint8_t *data, uint8_t dataLen)
-{
-    int fd = GetCanFd();
-    struct can_frame frame;
-
-    frame.can_id = cmd;
-    frame.can_dlc = dataLen;
-    memcpy(frame.data, data, sizeof(frame.data));
-
-    write(fd, &frame, sizeof(struct can_frame));
-}
-
-//------------------------------------------------------------------------------
-void SetTargetAddr(uint8_t *target_number, uint8_t index)
-{
-    int id = PackageIdCmd(CMD_ADDR_ASSIGNMENT + index);
-    //printf("intCmd = %x \n", cmd & CAN_EFF_MASK);
-    //cmd = cmd & CAN_EFF_MASK;
-
-    uint8_t data[8];
-
-    data[0] = *target_number;
-    data[1] = *(target_number + 1);
-    data[2] = *(target_number + 2);
-    data[3] = *(target_number + 3);
-    data[4] = index;
-
-    SendCmdToEvboard(id, data, 5);
-}
-
-void GetFirmwareVersion(uint8_t gunIndex, uint8_t toId)
-{
-    int id = PackageIdCmd(CMD_GET_FW_VER + toId);
-    uint8_t data[8];
-
-    SendCmdToEvboard(id, data, 0);
-}
-
-void GetHardwareVersion(uint8_t gunIndex, uint8_t toId)
-{
-    int id = PackageIdCmd(CMD_GET_HW_VER + toId);
-    uint8_t data[8];
-
-    SendCmdToEvboard(id, data, 0);
-}
-
-void SyncRtcInfo(uint8_t gunIndex, uint8_t toId, int epoch)
-{
-    int id = PackageIdCmd(CMD_SYNC_RTC + toId);
-    uint8_t data[8];
-
-    data[0] = epoch & 0xff;
-    data[1] = (epoch >> 8) & 0xff;
-    data[2] = (epoch >> 16) & 0xff;
-    data[3] = (epoch >> 24) & 0xff;
-
-    SendCmdToEvboard(id, data, 4);
-}
-
-void SetChargingPermission(uint8_t gunIndex, uint8_t permissionStatus, uint16_t aOutputPw, uint16_t aOutputCur, uint16_t aOutputVol, uint8_t toId)
-{
-    int id = PackageIdCmd(CMD_CHARGING_PERMISSION + toId);
-    uint8_t data[8];
-
-    data[0] = permissionStatus;
-    data[1] = aOutputPw & 0xff;
-    data[2] = (aOutputPw >> 8) & 0xff;
-    data[3] = aOutputCur & 0xff;
-    data[4] = (aOutputCur >> 8) & 0xff;
-    data[5] = aOutputVol & 0xff;
-    data[6] = (aOutputVol >> 8) & 0xff;
-    data[7] = 0xf0;
-
-    SendCmdToEvboard(id, data, sizeof(data));
-}
-
-void SetPresentOutputPower(uint16_t outputVol_b1, uint16_t outputCur_b1, uint16_t outputVol_b2, uint16_t outputCur_b2)
-{
-    int id = PackageIdCmd(CMD_PRESENT_OUTPUT_POWER);
-    uint8_t data[8];
-
-    data[0] = outputVol_b1 & 0xff;
-    data[1] = (outputVol_b1 >> 8) & 0xff;
-    data[2] = outputCur_b1 & 0xff;
-    data[3] = (outputCur_b1 >> 8) & 0xff;
-    data[4] = outputVol_b2 & 0xff;
-    data[5] = (outputVol_b2 >> 8) & 0xff;
-    data[6] = outputCur_b2 & 0xff;
-    data[7] = (outputCur_b2 >> 8) & 0xff;
-
-    SendCmdToEvboard(id, data, 8);
-}
-
-void SetPresentOutputCapacity(uint16_t aOutputPw_b1, uint16_t aOutputCur_b1, uint16_t aOutputPw_b2, uint16_t aOutputCur_b2)
-{
-    int id = PackageIdCmd(CMD_PRESENT_OUTPUT_CAPABILITIES);
-    uint8_t data[8];
-
-    data[0] = aOutputPw_b1 & 0xff;
-    data[1] = (aOutputPw_b1 >> 8) & 0xff;
-    data[2] = aOutputCur_b1 & 0xff;
-    data[3] = (aOutputCur_b1 >> 8) & 0xff;
-    data[4] = aOutputPw_b2 & 0xff;
-    data[5] = (aOutputPw_b2 >> 8) & 0xff;
-    data[6] = aOutputCur_b2 & 0xff;
-    data[7] = (aOutputCur_b2 >> 8) & 0xff;
-
-    SendCmdToEvboard(id, data, 8);
-}
-
-void GetOutputReq(uint8_t gunIndex, uint8_t toId)
-{
-    int id = PackageIdCmd(CMD_GET_OUTPUT_REQ + toId);
-    uint8_t data[8];
-
-    SendCmdToEvboard(id, data, 0);
-}
-
-void GetEvBatteryInfo(uint8_t gunIndex, uint8_t toId)
-{
-    int id = PackageIdCmd(CMD_GET_BATTERY_INFO + toId);
-    uint8_t data[8];
-
-    SendCmdToEvboard(id, data, 0);
-}
-
-void EvseStopChargingEvent(uint8_t stopResult, uint8_t *stopReason, uint8_t toId)
-{
-    int id = PackageIdCmd(CMD_EVSE_STOP_CHARGING + toId);
-    uint8_t data[8];
-
-    data[0] = stopResult;
-    data[1] = *stopReason;
-    data[2] = *(stopReason + 1);
-    data[3] = *(stopReason + 2);
-    data[4] = *(stopReason + 3);
-    data[5] = *(stopReason + 4);
-    data[6] = *(stopReason + 5);
-
-    SendCmdToEvboard(id, data, 7);
-}
-
-void GetMiscellaneousInfo(uint8_t gunIndex, uint8_t relayStatus, float power, float voltage, uint8_t toId)
-{
-    int id = PackageIdCmd(CMD_GET_MISC_INFO + toId);
-    uint8_t data[8];
-
-    int _power = power * 10;
-
-    data[0] = relayStatus;
-    data[1] = (int)_power & 0xff;
-    data[2] = ((int)_power >> 8) & 0xff;
-    data[3] = (int)voltage & 0xff;
-    data[4] = ((int)voltage >> 8) & 0xff;
-
-    SendCmdToEvboard(id, data, 5);
-}
-
-void SetIsolationStatus(uint8_t gunIndex, uint8_t result, uint8_t toId)
-{
-    int id = PackageIdCmd(CMD_ISOLATION_STATUS + toId);
-    uint8_t data[8];
-
-    data[0] = result;
-    SendCmdToEvboard(id, data, 1);
-}
-
-void SetEvsePrechargeInfo(uint8_t gunIndex, uint8_t result, uint8_t toId)
-{
-    int id = PackageIdCmd(CMD_EVSE_PRECHARGE + toId);
-    uint8_t data[8];
-
-    data[0] = result;
-    SendCmdToEvboard(id, data, 1);
-}
-
+#include <stdio.h>      /*標準輸入輸出定義*/
+#include <stdlib.h>     /*標準函數庫定義*/
+#include <stdint.h>
+#include <string.h>
+
+#include <linux/can.h>
+#include <linux/can/raw.h>
+
+#include <unistd.h>     /*Unix 標準函數定義*/
+#include <fcntl.h>      /*檔控制定義*/
+#include <termios.h>    /*PPSIX 終端控制定義*/
+#include <errno.h>      /*錯誤號定義*/
+
+#include "Ev_Comm.h"
+#include "Module_EvComm.h"
+
+//------------------------------------------------------------------------------
+int PackageIdCmd(int cmd)
+{
+    return cmd | 0x80000000;
+}
+
+void SendCmdToEvboard(int cmd, uint8_t *data, uint8_t dataLen)
+{
+    int fd = GetCanFd();
+    struct can_frame frame;
+
+    frame.can_id = cmd;
+    frame.can_dlc = dataLen;
+    memcpy(frame.data, data, sizeof(frame.data));
+
+    write(fd, &frame, sizeof(struct can_frame));
+}
+
+//------------------------------------------------------------------------------
+void SetTargetAddr(uint8_t *target_number, uint8_t index)
+{
+    int id = PackageIdCmd(CMD_ADDR_ASSIGNMENT + index);
+    //printf("intCmd = %x \n", cmd & CAN_EFF_MASK);
+    //cmd = cmd & CAN_EFF_MASK;
+
+    uint8_t data[8];
+
+    data[0] = *target_number;
+    data[1] = *(target_number + 1);
+    data[2] = *(target_number + 2);
+    data[3] = *(target_number + 3);
+    data[4] = index;
+
+    SendCmdToEvboard(id, data, 5);
+}
+
+void GetFirmwareVersion(uint8_t gunIndex, uint8_t toId)
+{
+    int id = PackageIdCmd(CMD_GET_FW_VER + toId);
+    uint8_t data[8];
+
+    SendCmdToEvboard(id, data, 0);
+}
+
+void GetHardwareVersion(uint8_t gunIndex, uint8_t toId)
+{
+    int id = PackageIdCmd(CMD_GET_HW_VER + toId);
+    uint8_t data[8];
+
+    SendCmdToEvboard(id, data, 0);
+}
+
+void SyncRtcInfo(uint8_t gunIndex, uint8_t toId, int epoch)
+{
+    int id = PackageIdCmd(CMD_SYNC_RTC + toId);
+    uint8_t data[8];
+
+    data[0] = epoch & 0xff;
+    data[1] = (epoch >> 8) & 0xff;
+    data[2] = (epoch >> 16) & 0xff;
+    data[3] = (epoch >> 24) & 0xff;
+
+    SendCmdToEvboard(id, data, 4);
+}
+
+void SetChargingPermission(uint8_t gunIndex, uint8_t permissionStatus, uint16_t aOutputPw, uint16_t aOutputCur, uint16_t aOutputVol, uint8_t toId)
+{
+    int id = PackageIdCmd(CMD_CHARGING_PERMISSION + toId);
+    uint8_t data[8];
+
+    data[0] = permissionStatus;
+    data[1] = aOutputPw & 0xff;
+    data[2] = (aOutputPw >> 8) & 0xff;
+    data[3] = aOutputCur & 0xff;
+    data[4] = (aOutputCur >> 8) & 0xff;
+    data[5] = aOutputVol & 0xff;
+    data[6] = (aOutputVol >> 8) & 0xff;
+    data[7] = 0xf0;
+
+    SendCmdToEvboard(id, data, sizeof(data));
+}
+
+void SetPresentOutputPower(uint16_t outputVol_b1, uint16_t outputCur_b1, uint16_t outputVol_b2, uint16_t outputCur_b2)
+{
+    int id = PackageIdCmd(CMD_PRESENT_OUTPUT_POWER);
+    uint8_t data[8];
+
+    data[0] = outputVol_b1 & 0xff;
+    data[1] = (outputVol_b1 >> 8) & 0xff;
+    data[2] = outputCur_b1 & 0xff;
+    data[3] = (outputCur_b1 >> 8) & 0xff;
+    data[4] = outputVol_b2 & 0xff;
+    data[5] = (outputVol_b2 >> 8) & 0xff;
+    data[6] = outputCur_b2 & 0xff;
+    data[7] = (outputCur_b2 >> 8) & 0xff;
+
+    SendCmdToEvboard(id, data, 8);
+}
+
+void SetPresentOutputCapacity(uint16_t aOutputPw_b1, uint16_t aOutputCur_b1, uint16_t aOutputPw_b2, uint16_t aOutputCur_b2)
+{
+    int id = PackageIdCmd(CMD_PRESENT_OUTPUT_CAPABILITIES);
+    uint8_t data[8];
+
+    data[0] = aOutputPw_b1 & 0xff;
+    data[1] = (aOutputPw_b1 >> 8) & 0xff;
+    data[2] = aOutputCur_b1 & 0xff;
+    data[3] = (aOutputCur_b1 >> 8) & 0xff;
+    data[4] = aOutputPw_b2 & 0xff;
+    data[5] = (aOutputPw_b2 >> 8) & 0xff;
+    data[6] = aOutputCur_b2 & 0xff;
+    data[7] = (aOutputCur_b2 >> 8) & 0xff;
+
+    SendCmdToEvboard(id, data, 8);
+}
+
+void GetOutputReq(uint8_t gunIndex, uint8_t toId)
+{
+    int id = PackageIdCmd(CMD_GET_OUTPUT_REQ + toId);
+    uint8_t data[8];
+
+    SendCmdToEvboard(id, data, 0);
+}
+
+void GetEvBatteryInfo(uint8_t gunIndex, uint8_t toId)
+{
+    int id = PackageIdCmd(CMD_GET_BATTERY_INFO + toId);
+    uint8_t data[8];
+
+    SendCmdToEvboard(id, data, 0);
+}
+
+void EvseStopChargingEvent(uint8_t stopResult, uint8_t *stopReason, uint8_t toId)
+{
+    int id = PackageIdCmd(CMD_EVSE_STOP_CHARGING + toId);
+    uint8_t data[8];
+
+    data[0] = stopResult;
+    data[1] = *stopReason;
+    data[2] = *(stopReason + 1);
+    data[3] = *(stopReason + 2);
+    data[4] = *(stopReason + 3);
+    data[5] = *(stopReason + 4);
+    data[6] = *(stopReason + 5);
+
+    SendCmdToEvboard(id, data, 7);
+}
+
+void GetMiscellaneousInfo(uint8_t gunIndex, uint8_t relayStatus, float power, float voltage, uint8_t toId)
+{
+    int id = PackageIdCmd(CMD_GET_MISC_INFO + toId);
+    uint8_t data[8];
+
+    int _power = power * 10;
+
+    data[0] = relayStatus;
+    data[1] = (int)_power & 0xff;
+    data[2] = ((int)_power >> 8) & 0xff;
+    data[3] = (int)voltage & 0xff;
+    data[4] = ((int)voltage >> 8) & 0xff;
+
+    SendCmdToEvboard(id, data, 5);
+}
+
+void SetIsolationStatus(uint8_t gunIndex, uint8_t result, uint8_t toId)
+{
+    int id = PackageIdCmd(CMD_ISOLATION_STATUS + toId);
+    uint8_t data[8];
+
+    data[0] = result;
+    SendCmdToEvboard(id, data, 1);
+}
+
+void SetEvsePrechargeInfo(uint8_t gunIndex, uint8_t result, uint8_t toId)
+{
+    int id = PackageIdCmd(CMD_EVSE_PRECHARGE + toId);
+    uint8_t data[8];
+
+    data[0] = result;
+    SendCmdToEvboard(id, data, 1);
+}
+
+void GetEVCCIDReq(uint8_t gunIndex, uint8_t toId)
+{
+    int id = PackageIdCmd(CMD_EVCCID_REQ + toId);
+    uint8_t data[8];
+
+    SendCmdToEvboard(id, data, 0);
+}

+ 3 - 0
EVSE/Projects/DD360ComBox/Apps/ModuleEvComm/Ev_Comm.h

@@ -27,6 +27,7 @@
 #define CMD_ISOLATION_STATUS                    (0x00001200)
 #define CMD_SYNC_RTC                            (0x00001400)
 #define CMD_EVSE_PRECHARGE                      (0x00001500)
+#define CMD_EVCCID_REQ                          (0x00001600)
 
 // 車端主動
 #define ADDRESS_REQ                             (0x080001FF)
@@ -41,6 +42,7 @@
 #define ACK_GET_MISCELLANEOUS_INFO              (0x08000D00)
 #define ACK_EVSE_ISOLATION_STATUS               (0x08001200)
 #define ACK_EVSE_PRECHAGE_INFO                  (0x08001500)
+#define ACK_EVCCID_REQ                          (0x08001600)
 
 //------------------------------------------------------------------------------
 // Send msg to can-bus
@@ -59,5 +61,6 @@ void SetIsolationStatus(uint8_t gunIndex, uint8_t result, uint8_t toId);
 void SetEvsePrechargeInfo(uint8_t gunIndex, uint8_t result, uint8_t toId);
 // 發送電樁主動停止充電結果及原因
 void EvseStopChargingEvent(uint8_t stopResult, uint8_t *stopReason, uint8_t toId);
+void GetEVCCIDReq(uint8_t gunIndex, uint8_t toId);
 
 #endif /* _EV_COMM_H_ */

+ 24 - 0
EVSE/Projects/DD360ComBox/Apps/ModuleEvComm/Module_EvRxComm.c

@@ -286,13 +286,16 @@ void CANReceiver(int fd)
             pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(targetGun);
             gunTypeIndex = pDcChargingInfo->type_index;
 
+
             switch (intCmd) {
             case NOTIFICATION_EV_STATUS:
                 if (pDcChargingInfo->ConnectorPlugIn != frame.data[0]) {
                     if (frame.data[0] == PLUG) {
                         log_info("Conn %d, Plugin. \n", targetGun);
+                        pDcChargingInfo->isVerify = false;
                     } else if (frame.data[0] == UNPLUG) {
                         log_info("Conn %d, Unplug. \n", targetGun);
+                        strcpy( (char *) pDcChargingInfo->EVCCID, "");
                     } else {
                         log_info("Conn %d, None Check. (%d) \n", targetGun, frame.data[0]);
                     }
@@ -591,7 +594,28 @@ void CANReceiver(int fd)
                     }
                 }
                 break;
+            case ACK_EVCCID_REQ:
 
+                        if (frame.can_dlc > 0 && strcmp ( pDcChargingInfo->EVCCID, "" ) == EQUAL)
+                        {
+                            if (pDcChargingInfo->Type == _Type_CCS_2)
+                            {
+                                memset (
+                                        ShmCcsData->V2GMessage_DIN70121 [pDcChargingInfo->type_index].SessionSetupRequest.EVCCID,
+                                        0,
+                                        sizeof(ShmCcsData->V2GMessage_DIN70121 [pDcChargingInfo->type_index].SessionSetupRequest.EVCCID) );
+                                memcpy (
+                                        ShmCcsData->V2GMessage_DIN70121 [pDcChargingInfo->type_index].SessionSetupRequest.EVCCID,
+                                        frame.data, frame.can_dlc );
+                            }
+
+                            sprintf ( (char *) pDcChargingInfo->EVCCID, "%.2x%.2x%.2x%.2x%.2x%.2x", frame.data [0],
+                                    frame.data [1], frame.data [2], frame.data [3], frame.data [4], frame.data [5] );
+
+                            pDcChargingInfo->EVCCID [17] = '\0';
+                            log_info( "******* Gun %d->EVCCID = %s ************* \n", targetGun, pDcChargingInfo->EVCCID );
+                        }
+                break;
             default:
                 log_info("EV board = %d, Ack none defined. intCmd = %d  \n", targetGun, intCmd);
                 break;

+ 11 - 0
EVSE/Projects/DD360ComBox/Apps/ModuleEvComm/Module_EvTxComm.c

@@ -24,6 +24,7 @@
 #include "../SelectGun/SelectGun.h"
 #include "Ev_Comm.h"
 #include "Module_EvComm.h"
+#include "../CSU/main.h"
 
 //------------------------------------------------------------------------------
 static struct SysConfigData *pSysConfig = NULL;
@@ -801,6 +802,16 @@ int main(int argc, char *argv[])
                     }
                 }
 
+#ifdef DD360ComBox
+                    // Set Ev board in communication mode
+                    // Get EVCCID for authorize when gun plug-in only for CCS
+                    if(pDcChargingInfo->Type == _Type_CCS_2 && priorityLow == 5) {
+                       if (pDcChargingInfo->ConnectorPlugIn && strcmp(pDcChargingInfo->EVCCID,"") == EQUAL) {
+                           GetEVCCIDReq(gunIndex,pDcChargingInfo->Evboard_id);
+                           SendCommunicationOnly(gunIndex);
+                        }
+                    }
+#endif 
                 if (priorityLow == 1) {
                     pDcChargingInfo->PresentChargedEnergy   = 0;
                     pDcChargingInfo->PresentChargingPower   = 0;

+ 6 - 16
EVSE/Projects/DD360ComBox/Apps/ModulePrimary/Module_PrimaryComm.c

@@ -185,31 +185,26 @@ void GetInputGpioStatus(int fd)
     }
 
     ShmPrimaryMcuData->InputDet.bits.SpdDetec = gpio_in.SPD;
-#if defined DD360ComBox
-    if (gpio_in.Emergency_Btn == 0 && (EmgBtn_flag == gpio_in.Emergency_Btn))
+#ifdef DD360ComBox
+    EmgBtn_flag = 0;
 #else
     if (gpio_in.Emergency_Btn && (EmgBtn_flag != gpio_in.Emergency_Btn))
-#endif //defined DD360ComBox
     {
             EmgBtn_count++;
         if (EmgBtn_count > SensorTrigCount) {
            EmgBtn_flag = 1;
            EmgBtn_count = 0; // Avoid Overflow
        }
-#ifdef DD360ComBox
-    } else if ( gpio_in.Emergency_Btn && EmgBtn_flag ) {
-#else
     } else if (EmgBtn_flag != gpio_in.Emergency_Btn ) {
-#endif    
         EmgBtn_count++;
         if (EmgBtn_count > SensorTrigCount) {
             EmgBtn_flag = 0;
             EmgBtn_count = 0;
         }
     }
- 
+#endif
     ShmPrimaryMcuData->InputDet.bits.EmergencyButton = EmgBtn_flag;
- 
+
     dispenserSwTmp |= (ShmPrimaryMcuData->InputDet.bits.Key0);
     dispenserSwTmp |= (ShmPrimaryMcuData->InputDet.bits.Key1 << 1);
     dispenserSwTmp |= (ShmPrimaryMcuData->InputDet.bits.Key2 << 2);
@@ -242,28 +237,23 @@ void GetInputGpioStatus(int fd)
     }
 
 #if defined DD360ComBox
-    if (gpio_in.Door_Open && (Door_flag != gpio_in.Door_Open))
+    Door_flag = 0;
 #else
     if (gpio_in.Door_Open == 0 && (Door_flag == gpio_in.Door_Open))
-#endif //defined DD360ComBox
     {
         Door_count++;
         if (Door_count > SensorTrigCount) {
             Door_flag = 1;
             Door_count = 0; // Avoid Overflow
        }
-#ifdef DD360ComBox
-    } else if (gpio_in.Door_Open == 0 && Door_flag) {
-#else
     } else if (gpio_in.Door_Open && Door_flag) {
-#endif
         Door_count++;
         if (Door_count > SensorTrigCount) {
             Door_flag = 0;
             Door_count = 0;
         }
     }
- 
+#endif 
     ShmPrimaryMcuData->InputDet.bits.DoorOpen = Door_flag;
 /*
     log_info("Emergency Button Count = %d , Emergency flag = %d\n",

+ 509 - 0
EVSE/Projects/DD360ComBox/Apps/ModuleUpdateFW/Module_UpdateFW.c

@@ -0,0 +1,509 @@
+#include <stdio.h>      /*標準輸入輸出定義*/
+#include <stdlib.h>     /*標準函數庫定義*/
+#include <string.h>
+#include <stdint.h>
+
+#include <sys/types.h>
+#include <dirent.h>
+
+#include "../Config.h"
+#include "../Log/log.h"
+#include "../Define/define.h"
+
+#include "../ShareMemory/shmMem.h"
+#include "../CSU/main.h"
+
+struct SysConfigData *pSysConfig = NULL;
+struct SysInfoData *pSysInfo = NULL;
+struct OCPP16Data *ShmOCPP16Data = NULL;
+struct ChargingInfoData *pAcChargingInfo = NULL;
+static struct ChargingInfoData *pDcChargingInfo = NULL;
+#define MODELNAME_FAIL                          (0)
+#define UPGRADE_FAN                             (0x02)
+#if defined DD360 || defined DD360Audi || defined DD360ComBox
+#define UPGRADE_RB                              (0x09) //0x09 for DD360 dispenser
+#else
+#define UPGRADE_RB                              (0x03) //other module use
+#endif //defined DD360 ||defined DD360Audi || defined DD360ComBox
+#define UPGRADE_PRI                             (0x04)
+#define UPGRADE_AC                              (0x05)
+#define UPGRADE_LED                             (0x06)
+
+//------------------------------------------------------------------------------
+static char *_priPortName = "/dev/ttyS1";
+static char *_485PortName = "/dev/ttyS5";
+
+//------------------------------------------------------------------------------
+
+void KillAllTask(void)
+{
+    pSysInfo->PageIndex = _LCM_FIX;
+
+    system("killall Module_EventLogging");
+    system("killall Module_PrimaryComm");
+    system("killall Module_EvComm");
+    system("killall Module_LcmControl");
+    system("killall Module_InternalComm");
+
+#if defined DD360 || defined DD360Audi || defined DD360ComBox
+    system("killall Module_DoComm");
+    return ;
+#endif //defined DD360 || defined DD360Audi || defined DD360ComBox
+
+    system("killall Module_PsuComm");
+    system("killall OcppBackend &");
+    system("killall Module_4g &");
+    system("killall Module_Wifi &");
+}
+
+void KillTask(void)
+{
+    pSysInfo->PageIndex = _LCM_FIX;
+
+    system("killall Module_EventLogging");
+    system("killall Module_PrimaryComm");
+    system("killall Module_EvComm");
+    system("killall Module_LcmControl");
+    system("killall Module_InternalComm");
+    //system("killall Module_DoComm");
+#if defined DD360 || defined DD360Audi || defined DD360ComBox
+    return ;
+#endif //defined DD360 || defined DD360Audi || defined DD360ComBox
+
+    system("killall Module_PsuComm");
+    system("killall OcppBackend &");
+    system("killall Module_4g &");
+    system("killall Module_Wifi &");
+}
+void setChargerMode(uint8_t gunIndex, uint8_t mode)
+{
+    pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(gunIndex);
+
+    pDcChargingInfo->SystemStatus = mode;
+}
+void TryCloseWatchdog()
+{
+    system("echo V > /dev/watchdog");
+}
+static int InitComPort(uint8_t target)
+{
+    int fd;
+    struct termios tios;
+
+    if (target == UPGRADE_PRI) {
+        fd = open(_priPortName, O_RDWR);
+    } else if (target == UPGRADE_FAN ||
+               target == UPGRADE_RB ||
+               target == UPGRADE_AC ||
+               target == UPGRADE_LED
+              ) {
+        fd = open(_485PortName, O_RDWR);
+    }
+
+    if (fd <= 0) {
+        log_error("open 407 Communication port NG \n");
+        return -1;
+    }
+
+    ioctl (fd, TCGETS, &tios);
+    tios.c_cflag = B115200 | CS8 | CLOCAL | CREAD;
+    tios.c_lflag = 0;
+    tios.c_iflag = 0;
+    tios.c_oflag = 0;
+    tios.c_cc[VMIN] = 0;
+    tios.c_cc[VTIME] = (uint8_t)1;
+    tios.c_lflag = 0;
+    tcflush(fd, TCIFLUSH);
+    ioctl (fd, TCSETS, &tios);
+
+    return fd;
+}
+bool IsConnectorWholeIdle()
+{
+    bool result = true;
+
+    for (uint8_t count = 0; count < pSysConfig->TotalConnectorCount; count++) {
+        pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(count);
+
+        if (pDcChargingInfo->SystemStatus != S_IDLE &&
+                pDcChargingInfo->SystemStatus != S_RESERVATION) {
+            result = false;
+            break;
+        }
+    }
+
+    for (uint8_t count = 0; count < pSysConfig->AcConnectorCount; count++) {
+        pAcChargingInfo = (struct ChargingInfoData *)GetAcChargingInfoData(count);
+
+        if (pAcChargingInfo->SystemStatus != S_IDLE &&
+                pAcChargingInfo->IsErrorOccur == NO) {
+            result = false;
+            break;
+        }
+    }
+
+    return result;
+}
+
+
+static int InitCanBus(void)
+{
+    int fd = -1;
+    int nbytes;
+    struct timeval tv;
+    struct ifreq ifr0;
+    struct sockaddr_can addr0;
+
+    system("/sbin/ip link set can0 down");
+    system("/sbin/ip link set can0 type can bitrate 500000 restart-ms 100");
+    system("/sbin/ip link set can0 up");
+
+    fd = socket(PF_CAN, SOCK_RAW, CAN_RAW);
+
+    tv.tv_sec = 0;
+    tv.tv_usec = 10000;
+    if (setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct  timeval)) < 0) {
+        log_error("Set SO_RCVTIMEO NG");
+    }
+    nbytes = 40960;
+    if (setsockopt(fd, SOL_SOCKET,  SO_RCVBUF, &nbytes, sizeof(int)) < 0) {
+        log_error("Set SO_RCVBUF NG");
+    }
+    nbytes = 40960;
+    if (setsockopt(fd, SOL_SOCKET, SO_SNDBUF, &nbytes, sizeof(int)) < 0) {
+        log_error("Set SO_SNDBUF NG");
+    }
+
+    strcpy(ifr0.ifr_name, "can0");
+    ioctl(fd, SIOCGIFINDEX, &ifr0); /* ifr.ifr_ifindex gets filled with that device's index */
+    addr0.can_family = AF_CAN;
+    addr0.can_ifindex = ifr0.ifr_ifindex;
+    bind(fd, (struct sockaddr *)&addr0, sizeof(addr0));
+
+    return fd;
+}
+
+static int CheckUpdateProcess(void)
+{
+    //bool isPass = true;
+    uint8_t retSucc = 0;
+    uint8_t retFail = 0;
+    uint8_t index = 0;
+    uint8_t target = 0;
+    char Buf[256];
+    char *new_str = NULL;
+    uint8_t *ptr = NULL;
+    int fd = 0;
+    int CanFd = 0;
+    int uartFd = 0;
+    unsigned int Type = 0;
+    long int MaxLen = 48 * 1024 * 1024, ImageLen = 0;
+    DIR *d;
+    struct dirent *dir;
+    DcCommonInfo *ShmDcCommonData = (DcCommonInfo *)GetShmDcCommonData();
+    struct ChargingInfoData *pDcChargingInfo = NULL;
+
+    pSysConfig = (struct SysConfigData *)GetShmSysConfigData();
+    d = opendir("/mnt/");
+    if (d) {
+        while ((dir = readdir(d)) != NULL) {
+            if (strcmp(dir->d_name, ".") == 0 || strcmp(dir->d_name, "..") == 0) {
+                continue;
+            }
+
+            new_str = calloc(strlen("/mnt/") + strlen(dir->d_name) + 1, sizeof(char));
+            //new_str[0] = '\0';
+            strcat(new_str, "/mnt/");
+            strcat(new_str, dir->d_name);
+            log_info("%s%s\r\n", "/mnt/", dir->d_name);
+            
+            fd = open(new_str, O_RDONLY);
+            if (fd < 0) {
+                return FAIL;
+            }
+
+            ptr = calloc(MaxLen, sizeof(char)); //-48 is take out the header
+            //memset(ptr, 0xFF, MaxLen);  //-48 is take out the header
+
+            //get the image length
+            ImageLen = read(fd, ptr, MaxLen);
+            for (uint8_t i = 0; i < 16; i++) {
+                if (pSysConfig->ModelName[i] != ptr[i]) {
+                    return FAIL;
+                }
+            }
+
+            log_info("model name check pass. \n");
+            if (ImageLen > 20) {
+                Type = (((unsigned int)ptr[16]) << 24 |
+                        ((unsigned int)ptr[17]) << 16 |
+                        ((unsigned int)ptr[18]) << 8  |
+                        ((unsigned int)ptr[19]));
+                log_info("Typed...%x \r\n", Type);
+
+                switch (Type) {
+                case 0x10000001:
+                case 0x10000002:
+                case 0x10000003:
+                case 0x10000004:
+                case 0x10000005:
+                    if (Upgrade_Flash(Type, new_str, (char *)pSysConfig->ModelName) == PASS) {
+                        //return PASS;
+                        retSucc++;
+                    } else {
+                        log_info("Upgrade %x Failed\r\n", Type);
+                        //return FAIL;
+                        retFail++;
+                    }
+                    break;
+
+                case 0x10000007:
+                case 0x10000008:
+                case 0x10000009:
+                case 0x1000000A:
+                    CanFd = InitCanBus();
+                    if (CanFd > 0) {
+                        for (index = 0; index < pSysConfig->TotalConnectorCount; index++) {
+                            pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(index);
+
+                            if (pDcChargingInfo->Type == _Type_CCS_2) {
+                                uint8_t targetID = pDcChargingInfo->Evboard_id;
+
+                                if (pSysConfig->TotalConnectorCount == 1 &&
+                                        ShmDcCommonData->CcsVersion == _CCS_VERSION_CHECK_TAG_V015S0) {
+                                    //targetID += 1;
+                                }
+
+                                system("echo 3 > /proc/sys/vm/drop_caches");
+                                sleep(2);
+                                log_info("Upgrade CCS Processing..target id = %d \n", targetID);
+                                if (Upgrade_CCS(CanFd,
+                                                Type,
+                                                targetID,
+                                                new_str,
+                                                (char *)pSysConfig->ModelName) == FAIL) {
+                                    log_info("Upgrade CCS Failed \n");
+                                    retFail++;
+                                } else {
+                                    retSucc++;
+                                }
+                            }
+                        }
+                        close(CanFd);
+                    }
+                    memset(Buf, 0, sizeof(Buf));
+                    sprintf(Buf, "rm -rvf /mnt/%s", new_str);
+                    system(Buf);
+                    //isPass = true;
+#if 0
+                    CanFd = InitCanBus();
+                    if (CanFd > 0) {
+                        for (index = 0; index < pSysConfig->TotalConnectorCount; index++) {
+                            //if (!isPass) {
+                            //    break;
+                            //}
+                            if (chargingInfo[index]->Type == _Type_CCS_2) {
+                                if (Upgrade_CCS(CanFd, Type, chargingInfo[index]->Evboard_id, new_str, (char *)pSysConfig->ModelName) == FAIL) {
+                                    //isPass = false;
+                                    log_info("Upgrade %x Failed\r\n", Type);
+                                    retFail++;
+                                }
+                            }
+                        }
+                    } else {
+                        log_error("Upgrade CCS open CAN FD fail.\n");
+                        //isPass = false;
+                        return FAIL;
+                    }
+
+                    if (retFail != 0) {
+                        break;
+                    } else {
+                        retSucc++;
+                    }
+                    //return isPass;
+#endif //0
+                    break;
+
+                case 0x10000006:
+                case 0x1000000D:
+                case 0x1000000E:
+                case 0x20000002:
+                case 0x10000014:
+                    // CSU_PRIMARY_CONTROLLER : 0x10000006
+                    target = 0x00;
+
+                    if (Type == 0x10000006) {
+                        target = UPGRADE_PRI;
+                    } else if (Type == 0x1000000D) {
+                        target = UPGRADE_RB;
+                    } else if (Type == 0x1000000E) {
+                        target = UPGRADE_FAN;
+                    } else if (Type == 0x20000002) {
+                        target = UPGRADE_AC;
+                    } else if (Type == 0x10000014) {
+                        target = UPGRADE_LED;
+                    }
+
+                    uartFd = InitComPort(target);
+
+                    if (Upgrade_UART(uartFd, Type, target, new_str, (char *)pSysConfig->ModelName) == PASS) {
+                        //return PASS;
+                        retSucc++;
+                    } else {
+                        log_info("Upgrade %x Failed\r\n", Type);
+                        //return FAIL;
+                        return FAIL;
+                    }
+
+                    if (uartFd > 0) {
+                        close(uartFd);
+                    }
+                    break;
+
+                case 0x1000000B:
+                case 0x1000000C:
+                    // CHAdeMO_BOARD : 0x1000000B, GBT : 0x1000000C
+                    //bool isPass = true;
+                    CanFd = InitCanBus();
+                    if (CanFd > 0) {
+                        for (index = 0; index < pSysConfig->TotalConnectorCount; index++) {
+                            pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(index);
+
+                            //if (!isPass) {
+                            //    break;
+                            //}
+
+                            if ((Type == 0x1000000B && pDcChargingInfo->Type == _Type_Chademo) ||
+                                    (Type == 0x1000000C && pDcChargingInfo->Type == _Type_GB)) {
+                                if (Upgrade_CAN(CanFd, Type, pDcChargingInfo->Evboard_id, new_str, (char *)pSysConfig->ModelName) == PASS) {
+                                    //isPass = PASS;
+                                    retSucc++;
+                                } else {
+                                    log_info("Upgrade %x Failed\r\n", Type);
+                                    //isPass = FAIL;
+                                    retFail++;
+                                }
+                            }
+                        }
+                    } else {
+                        log_info("Upgrad FD fail. \n");
+                        //isPass = false;
+                        return FAIL;
+                    }
+
+                    //return isPass;
+                    break;
+                }
+            }
+            free(new_str);
+            free(ptr);
+        }
+    }
+    free(dir);
+    closedir(d);
+
+    if (retFail != 0) {
+        return FAIL;
+    }
+
+    return PASS;
+}
+
+void CheckFwUpdateFunction(void)
+{
+    //log_info("pSysInfo->FirmwareUpdate = %d \n", pSysInfo->FirmwareUpdate);
+    if (pSysInfo->FirmwareUpdate == YES) {
+        log_info("ftp : update start. \n");
+        TryCloseWatchdog();
+
+        for (uint8_t gun_index = 0; gun_index < pSysConfig->TotalConnectorCount; gun_index++) {
+            setChargerMode(gun_index, MODE_UPDATE);
+        }
+        sleep(1);
+        uint8_t updateResult = CheckUpdateProcess();
+
+        if (updateResult == PASS) {
+            log_info("ftp : update complete. \n");
+        } else if (updateResult == MODELNAME_FAIL) {
+            log_info("ftp : model name is none match. \n");
+            KillAllTask();
+            pSysInfo->FirmwareUpdate = NO;
+            sleep(5);
+            system("/usr/bin/run_evse_restart.sh");
+            return;
+        } else {
+            log_info("ftp : update fail. \n");
+        }
+
+        pSysInfo->FirmwareUpdate = NO;
+        sleep(5);
+        system("reboot -f");
+    } else if (ShmOCPP16Data->MsMsg.bits.UpdateFirmwareReq == YES) {
+        ShmOCPP16Data->MsMsg.bits.UpdateFirmwareReq = NO;
+
+        if (strcmp((char *)ShmOCPP16Data->FirmwareStatusNotification.Status, "Downloaded") == EQUAL) {
+            log_info("Backend : update start. \n");
+            TryCloseWatchdog();
+            strcpy((char *)ShmOCPP16Data->FirmwareStatusNotification.Status, "");
+            strcpy((char *)ShmOCPP16Data->FirmwareStatusNotification.Status, "Installing");
+            ShmOCPP16Data->SpMsg.bits.FirmwareStatusNotificationReq = YES;
+            KillTask();
+
+            for (uint8_t _index = 0; _index < pSysConfig->TotalConnectorCount; _index++) {
+                setChargerMode(_index, MODE_UPDATE);
+            }
+
+            for (uint8_t _index = 0; _index < pSysConfig->AcConnectorCount; _index++) {
+                pAcChargingInfo = (struct ChargingInfoData *)GetAcChargingInfoData(_index);
+
+                pAcChargingInfo->SystemStatus = MODE_UPDATE;
+            }
+            sleep(1);
+
+            uint8_t updateResult = CheckUpdateProcess();
+
+            if (updateResult == PASS) {
+                log_info("Backend : update complete. \n");
+                strcpy((char *)ShmOCPP16Data->FirmwareStatusNotification.Status, "Installed");
+            } else if (updateResult == MODELNAME_FAIL) {
+                log_info("Backend : model name is none match. \n");
+                KillAllTask();
+                strcpy((char *)ShmOCPP16Data->FirmwareStatusNotification.Status, "InstallationFailed");
+                ShmOCPP16Data->SpMsg.bits.FirmwareStatusNotificationReq = YES;
+                sleep(5);
+                system("/usr/bin/run_evse_restart.sh");
+                return;
+            } else {
+                log_info("Backend : update fail. \n");
+                strcpy((char *)ShmOCPP16Data->FirmwareStatusNotification.Status, "InstallationFailed");
+            }
+
+            strcpy((char *)ShmOCPP16Data->FirmwareStatusNotification.Status, "Installed");
+            ShmOCPP16Data->SpMsg.bits.FirmwareStatusNotificationReq = YES;
+            sleep(5);
+            system("reboot -f");
+        }
+    }
+}
+
+int main(int argc, char *argv[])
+{
+    if (CreateAllCsuShareMemory() == FAIL) {
+        log_error("create share memory error\r\n");
+        return FAIL;
+    }
+    
+    MappingGunChargingInfo("Upgrade Task");
+
+    pSysConfig = (struct SysConfigData *)GetShmSysConfigData();
+    pSysInfo = (struct SysInfoData *)GetShmSysInfoData();
+    ShmOCPP16Data = (struct OCPP16Data *)GetShmOCPP16Data();
+   
+    while (1) {
+        if (IsConnectorWholeIdle() || (pSysInfo->PageIndex == _LCM_FIX) )
+            CheckFwUpdateFunction();
+        sleep(3);
+    } //while
+    return 0;
+}

+ 2 - 0
EVSE/Projects/DD360ComBox/Apps/Script/init.sh

@@ -5,6 +5,8 @@ chmod 777 Module_InternalComm
 chmod 777 Module_EventLogging
 chmod 777 Module_EvComm
 chmod 777 Module_PsuComm
+chmod 777 Module_UpdateFW
+chmod 777 Module_ChkSysTask
 chmod 777 OcppBackend
 chmod 777 kill.sh
 chmod 777 ReadCmdline

+ 2 - 0
EVSE/Projects/DD360ComBox/Apps/Script/kill.sh

@@ -5,6 +5,8 @@ pkill Module_InternalComm;
 pkill Module_EventLogging;
 pkill Module_EvComm;
 pkill Module_PsuComm;
+pkill Module_UpdateFW;
+pkill Module_ChkSysTask;
 pkill Module_4g;
 pkill Module_Wifi;
 pkill OcppBackend;

BIN
EVSE/Projects/DD360ComBox/Apps/UnsafetyOutputTask


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


BIN
EVSE/Projects/DD360ComBox/output/FactoryConfig


BIN
EVSE/Projects/DD360ComBox/output/Module_ChkSysTask


BIN
EVSE/Projects/DD360ComBox/output/Module_DoComm


BIN
EVSE/Projects/DD360ComBox/output/Module_EvComm


BIN
EVSE/Projects/DD360ComBox/output/Module_EventLogging


BIN
EVSE/Projects/DD360ComBox/output/Module_InternalComm


BIN
EVSE/Projects/DD360ComBox/output/Module_LcmControl


BIN
EVSE/Projects/DD360ComBox/output/Module_PrimaryComm


BIN
EVSE/Projects/DD360ComBox/output/Module_UpdateFW


BIN
EVSE/Projects/DD360ComBox/output/ReadCmdline


+ 2 - 0
EVSE/Projects/DD360ComBox/output/init.sh

@@ -5,6 +5,8 @@ chmod 777 Module_InternalComm
 chmod 777 Module_EventLogging
 chmod 777 Module_EvComm
 chmod 777 Module_PsuComm
+chmod 777 Module_UpdateFW
+chmod 777 Module_ChkSysTask
 chmod 777 OcppBackend
 chmod 777 kill.sh
 chmod 777 ReadCmdline

+ 6 - 0
EVSE/Projects/DD360ComBox/output/kill.sh

@@ -5,6 +5,8 @@ pkill Module_InternalComm;
 pkill Module_EventLogging;
 pkill Module_EvComm;
 pkill Module_PsuComm;
+pkill Module_UpdateFW;
+pkill Module_ChkSysTask;
 pkill Module_4g;
 pkill Module_Wifi;
 pkill OcppBackend;
@@ -12,6 +14,10 @@ pkill Module_ProduceUtils;
 pkill Module_DoComm;
 pkill main;
 
+sleep 1
+
+echo V > /dev/watchdog
+
 ipcrm -M 0x000003e9;
 ipcrm -M 0x000003ed;
 ipcrm -M 0x000003ea;

BIN
EVSE/Projects/DD360ComBox/output/main


+ 2 - 2
EVSE/Projects/define.h

@@ -637,8 +637,8 @@ struct ChargingInfoData
     float               CurrentOffered;                 //0~6553.5 amp
     struct timespec     ConnectorTimeout;
     unsigned char       PantographFlag;                 // 0: normal gun type,  1: pantograph gun type
-    unsigned char	Replug_flag;
-    unsigned char	isVerify;
+	unsigned char 		Replug_flag;
+    unsigned char       isVerify;
 };
 
 typedef union