فهرست منبع

2022-01-19 / Simon Xue

Action:
1.[bug] Can’t select second gun after one of the charging gun stop and return IDLE.
2.[Improve] Dispenser can set Model name power 000 after merge master.

Files
As the commit history

Image Version: V1.20.XX.XXXX.XX
Simon Xue 3 سال پیش
والد
کامیت
1d11a72b19
41فایلهای تغییر یافته به همراه3737 افزوده شده و 2959 حذف شده
  1. 109 2
      EVSE/Projects/DD360Tcci/Apps/CSU/Ethernet.c
  2. 466 60
      EVSE/Projects/DD360Tcci/Apps/CSU/Primary.c
  3. 108 89
      EVSE/Projects/DD360Tcci/Apps/CSU/RFID.c
  4. 28 5
      EVSE/Projects/DD360Tcci/Apps/CSU/SelfTest.c
  5. 445 106
      EVSE/Projects/DD360Tcci/Apps/CSU/main.c
  6. 7 9
      EVSE/Projects/DD360Tcci/Apps/CSU/main.h
  7. 26 74
      EVSE/Projects/DD360Tcci/Apps/Config.h
  8. 0 16
      EVSE/Projects/DD360Tcci/Apps/Define/define.h
  9. 8 4
      EVSE/Projects/DD360Tcci/Apps/Makefile
  10. 8 0
      EVSE/Projects/DD360Tcci/Apps/ModuleChkSysTask/Module_ChkSysTask.c
  11. 1 1
      EVSE/Projects/DD360Tcci/Apps/ModuleChkSysTask/Module_ChkSysTask.h
  12. 36 337
      EVSE/Projects/DD360Tcci/Apps/ModuleDoComm/DoComm.c
  13. 1 44
      EVSE/Projects/DD360Tcci/Apps/ModuleDoComm/DoComm.h
  14. 20 23
      EVSE/Projects/DD360Tcci/Apps/ModuleEvComm/Module_EvRxComm.c
  15. 29 30
      EVSE/Projects/DD360Tcci/Apps/ModuleEvComm/Module_EvTxComm.c
  16. 3 3
      EVSE/Projects/DD360Tcci/Apps/ModuleInternalComm/AcPlug.c
  17. 29 37
      EVSE/Projects/DD360Tcci/Apps/ModuleInternalComm/RelayBoard.c
  18. 1 1
      EVSE/Projects/DD360Tcci/Apps/ModuleInternalComm/internalComm.h
  19. 634 309
      EVSE/Projects/DD360Tcci/Apps/ModuleLcmCtrl/Module_LcmControl.c
  20. 30 314
      EVSE/Projects/DD360Tcci/Apps/ModuleLcmCtrl/Module_LcmControl.h
  21. 222 18
      EVSE/Projects/DD360Tcci/Apps/ModulePrimary/Module_PrimaryComm.c
  22. 5 9
      EVSE/Projects/DD360Tcci/Apps/ModuleUpdateFW/Module_UpdateFW.c
  23. 1493 1427
      EVSE/Projects/DD360Tcci/Apps/ReadCmdline.c
  24. 1 1
      EVSE/Projects/DD360Tcci/Apps/Script/copy_from_d.sh
  25. 1 1
      EVSE/Projects/DD360Tcci/Apps/Script/copy_to_D.sh
  26. 15 24
      EVSE/Projects/DD360Tcci/Apps/ShareMemory/shmMem.c
  27. 6 10
      EVSE/Projects/DD360Tcci/Apps/simulation.c
  28. 5 5
      EVSE/Projects/DD360Tcci/Apps/timeout.h
  29. BIN
      EVSE/Projects/DD360Tcci/Images/ramdisk.gz
  30. BIN
      EVSE/Projects/DD360Tcci/output/FactoryConfig
  31. BIN
      EVSE/Projects/DD360Tcci/output/Module_ChkSysTask
  32. BIN
      EVSE/Projects/DD360Tcci/output/Module_DoComm
  33. BIN
      EVSE/Projects/DD360Tcci/output/Module_EvComm
  34. BIN
      EVSE/Projects/DD360Tcci/output/Module_EventLogging
  35. BIN
      EVSE/Projects/DD360Tcci/output/Module_InternalComm
  36. BIN
      EVSE/Projects/DD360Tcci/output/Module_LcmControl
  37. BIN
      EVSE/Projects/DD360Tcci/output/Module_PrimaryComm
  38. BIN
      EVSE/Projects/DD360Tcci/output/Module_UpdateFW
  39. BIN
      EVSE/Projects/DD360Tcci/output/ReadCmdline
  40. BIN
      EVSE/Projects/DD360Tcci/output/main
  41. BIN
      EVSE/Projects/DD360Tcci/output/simulation

+ 109 - 2
EVSE/Projects/DD360Tcci/Apps/CSU/Ethernet.c

@@ -109,6 +109,7 @@ static int isReachableInternet(void)
 
     pclose(fp);
 
+#if defined DD360Tcci ||defined DD360Audi || defined DD360ComBox
     if (pAlarmCode->AlarmEvents.bits.DisconnectedFromDo == NORMAL) {
         result = FAIL;
     } else {
@@ -116,7 +117,31 @@ static int isReachableInternet(void)
     }
 
     return result;
+#endif //defined DD360Tcci || defined DD360Audi
+
+    memset(buf, 0x00, sizeof(buf));
+
+    for (idx = 0; idx < ARRAY_SIZE(valid_Internet); idx++) {
+        sprintf(cmd, "ping -c 1 -w 3 -I eth0 %s", valid_Internet[idx]);
+        fp = popen(cmd, "r");
+        if (fp != NULL) {
+            while (fgets(buf, sizeof(buf), fp) != NULL) {
+                if (strstr(buf, "transmitted") > 0) {
+                    //sscanf(buf, "%*s%*s%*s%*s%*s%*s%s", tmp);
+
+                    if (strstr(buf, "100%") != NULL) {
+                    } else {
+                        result = PASS;
+                    }
+                    //DEBUG_INFO("%s",buf);
+                    //DEBUG_INFO("%s",tmp);
+                }
+            }
+        }
+        pclose(fp);
+    }
 
+    return result;
 }
 
 void InitEthernet(void)
@@ -180,13 +205,95 @@ void InitEthernet(void)
 
     pid_t pid = fork();
     if (pid == 0) {
-        //log_info("InitEthernet = %d", pid);
+        log_info("InitEthernet = %d", pid);
 
         for (;;) {
-
+#if defined DD360Tcci || defined DD360Audi || defined DD360ComBox
             isReachableInternet();
             sleep(5);
             continue;
+#endif //!defined DD360Tcci && !defined DD360Tcci
+
+            if (isRouteFail()) {
+                //log_info("eth0 not in route, restart eht0. ");
+                system("/sbin/ifconfig eth0 down;/sbin/ifconfig eth0 up");
+
+                if (pSysConfig->Eth0Interface.EthDhcpClient == 0) {
+                    InitialDHCP();
+                }
+            }
+
+            if (isReachableInternet() == PASS) {
+                pSysInfo->ethInternetConn = YES;
+                cnt_pingDNS_Fail = 0;
+            } else {
+                if (++cnt_pingDNS_Fail > 3) {
+                    pSysInfo->ethInternetConn = NO;
+                }
+            }
+
+            ethResult = pSysInfo->ethInternetConn;
+
+            if (ethResult == YES) {
+                system("/sbin/ifmetric eth0 0");
+
+                if ((pSysConfig->ModelName[10] == 'W') ||
+                        (pSysConfig->ModelName[10] == 'D')) {
+                    system("/sbin/ifmetric mlan0 1");
+                }
+
+                if ((pSysConfig->ModelName[10] == 'T') ||
+                        (pSysConfig->ModelName[10] == 'D')) {
+                    system("/sbin/ifmetric ppp0 2");
+                }
+            }
+
+            if (!ethResult &&
+                    pSysConfig->AthInterface.WifiMode != _SYS_WIFI_MODE_DISABLE &&
+                    (pSysConfig->ModelName[10] == 'W' ||
+                     pSysConfig->ModelName[10] == 'D')) {
+                //ethResult = pSysConfig->AthInterface.WifiNetworkConn;
+                ethResult = pInfoCode->InfoEvents.bits.InternetDisconnectViaWiFi == YES ? NO : YES;
+
+                if (ethResult) {
+                    if ((pSysConfig->ModelName[10] == 'W') ||
+                            (pSysConfig->ModelName[10] == 'D')) {
+                        system("/sbin/ifmetric eth0 1");
+                        system("/sbin/ifmetric mlan0 0");
+                    }
+
+
+                    if ((pSysConfig->ModelName[10] == 'T') ||
+                            (pSysConfig->ModelName[10] == 'D')) {
+                        system("/sbin/ifmetric ppp0 2");
+                    }
+                }
+            }
+
+            if (!ethResult &&
+                    pSysConfig->TelecomInterface.TelcomEnabled == YES &&
+                    (pSysConfig->ModelName[10] == 'T' ||
+                     pSysConfig->ModelName[10] == 'D')) {
+                //ethResult = pSysConfig->TelecomInterface.TelcomNetworkConn;
+                ethResult = pInfoCode->InfoEvents.bits.InternetDisconnectVia4Gi == YES ? NO : YES;
+
+                if (ethResult) {
+                    if ((pSysConfig->ModelName[10] == 'W') ||
+                            (pSysConfig->ModelName[10] == 'D')) {
+                        system("/sbin/ifmetric mlan0 2");
+                    }
+
+                    if ((pSysConfig->ModelName[10] == 'T') ||
+                            (pSysConfig->ModelName[10] == 'D')) {
+                        system("/sbin/ifmetric eth0 1");
+                        system("/sbin/ifmetric ppp0 0");
+                    }
+                }
+            }
+
+            pSysInfo->InternetConn = ethResult;
+
+            sleep(5);
         }
     }
 

+ 466 - 60
EVSE/Projects/DD360Tcci/Apps/CSU/Primary.c

@@ -10,37 +10,324 @@
 
 #include "../SelectGun/SelectGun.h"
 #include "main.h"
-#include "../timeout.h"
-struct SysInfoData *pSysInfo = NULL;
-struct ChargingInfoData *pDcChargingInfo = NULL;
-struct SysConfigData *pSysConfig = NULL;
+
 //------------------------------------------------------------------------------
+typedef struct StLedConfig {
+    //OutputDrvValue[0]
+    uint8_t LeftButtonLed: 1;                   //bit 0,    H: ON,      L:OFF
+    uint8_t RightButtonLed: 1;                  //bit 1,    H: ON,      L:OFF
+    uint8_t GreenLED: 1;                        //bit 2,    H: ON,      L:OFF
+    uint8_t YellowLED: 1;                       //bit 3,    H: ON,      L:OFF
+    uint8_t RedLED: 1;                          //bit 4,    H: ON,      L:OFF
+    uint8_t SystemLed4: 1;                      //bit 5,    H: ON,      L:OFF
+    uint8_t AcContactor: 1;                     //bit 6,    H: ON,      L:OFF
+    uint8_t Reserved: 1;                        //bit 7 reserved
+} LedConfig;
 
 //------------------------------------------------------------------------------
-void ChangeLCM(uint8_t page)
+static uint8_t checkCabinetEthConnectState(LedConfig *ledConfig)
 {
-    pSysInfo->SystemPage = page;
+    uint8_t ret = NO;
+    LedConfig *pLedConfig = (LedConfig *)ledConfig;
+    struct AlarmCodeData *pAlarmCode = (struct AlarmCodeData *)GetShmAlarmCodeData();
+
+    if (pAlarmCode->AlarmEvents.bits.DisconnectedFromDo == YES) {
+        ret = YES;
+        if (pLedConfig->RedLED == YES ||
+                pLedConfig->YellowLED == YES ||
+                pLedConfig->GreenLED == YES) {
+            pLedConfig->RedLED = NO;
+            pLedConfig->YellowLED = NO;
+            pLedConfig->GreenLED = NO;
+        } else {
+            pLedConfig->RedLED = YES;
+            pLedConfig->YellowLED = YES;
+            pLedConfig->GreenLED = YES;
+        }
+    }
+
+    return ret;
 }
-// ***********************************
-// Enter LCM Page
-// ***********************************
 
-void CheckLeftButton()
+void PrimaryLedIndicatorCtrlFork(void)
 {
-    pSysInfo->CurGunSelected = LEFT_GUN_NUM;
+#if !defined DD360ComBox
+    return;
+#endif //!defined DD360ComBox
+
+    pid_t pid = fork();
+    if (pid == 0) {
+        uint8_t gunIndex = 0;
+        int isContinue = 1;
+
+        struct SysConfigData *pSysConfig = (struct SysConfigData *)GetShmSysConfigData();
+        struct SysInfoData *pSysInfo = (struct SysInfoData *)GetShmSysInfoData();
+        struct WARNING_CODE_INFO *pSysWarning = (struct WARNING_CODE_INFO *)GetShmSysWarningInfo();
+        struct PrimaryMcuData *ShmPrimaryMcuData = (struct PrimaryMcuData *)GetShmPrimaryMcuData();
+        struct ChargingInfoData *pDcChargingInfo = NULL;
+
+        LedConfig *pLedConfig = (LedConfig *)&ShmPrimaryMcuData->OutputDrv.OutputDrvValue[0];
+
+        while (isContinue) {
+            for (gunIndex = 0; gunIndex < pSysConfig->TotalConnectorCount; gunIndex++) {
+                pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(gunIndex);
+
+                if (pSysWarning->Level == WARN_LV_ER) {
+                    if (checkCabinetEthConnectState(pLedConfig) == YES) {
+                        usleep(500000);
+                        continue;
+                    }
+
+                    pLedConfig->YellowLED = NO;
+                    pLedConfig->GreenLED = NO;
+                    pLedConfig->RedLED = YES;
+                    usleep(500000);
+                    continue;
+                }
+
+                //log_info("led indicator status = %d", pDcChargingInfo->SystemStatus);
+                //printf("level = %d", pSysWarning->Level);
+                switch (pDcChargingInfo->SystemStatus) {
+                case S_BOOTING:
+                    if (pSysInfo->SelfTestSeq == _STEST_COMPLETE) {
+                        //Module_DoComm tcp disconnect
+                        if (pLedConfig->RedLED == YES ||
+                                pLedConfig->YellowLED == YES ||
+                                pLedConfig->GreenLED == YES) {
+                            pLedConfig->RedLED = NO;
+                            pLedConfig->YellowLED = NO;
+                            pLedConfig->GreenLED = NO;
+                        } else {
+                            pLedConfig->RedLED = YES;
+                            pLedConfig->YellowLED = YES;
+                            pLedConfig->GreenLED = YES;
+                        }
+                        break;
+                    }
+
+                    pLedConfig->RedLED = YES;
+                    pLedConfig->YellowLED = YES;
+                    pLedConfig->GreenLED = YES;
+                    break;
+
+                case S_IDLE:
+                    //Module_DoComm connected and system idle
+                    pLedConfig->RedLED = NO;
+                    pLedConfig->YellowLED = NO;
+                    pLedConfig->GreenLED = YES;
+                    break;
+
+                case S_RESERVATION:
+                case S_AUTHORIZING:
+                case S_REASSIGN_CHECK:
+                case S_REASSIGN:
+                case S_PREPARNING:
+                case S_PREPARING_FOR_EV:
+                case S_PREPARING_FOR_EVSE:
+                case S_CCS_PRECHARGE_ST0:
+                case S_CCS_PRECHARGE_ST1:
+                    //precharging status
+                    if (pLedConfig->GreenLED == YES) {
+                        pLedConfig->GreenLED = NO;
+                    } else {
+                        pLedConfig->GreenLED = YES;
+                    }
+                    break;
+
+                case S_CHARGING:
+                    pLedConfig->RedLED = NO;
+#ifdef DD360ComBox
+                    pLedConfig->YellowLED = YES;
+#else
+                    if (pLedConfig->YellowLED == YES) {
+                        pLedConfig->YellowLED = NO;
+                    } else {
+                        pLedConfig->YellowLED = YES;
+                    }
+#endif
+                    pLedConfig->GreenLED = NO;
+                    break;
+
+                case S_ALARM:
+                    pLedConfig->YellowLED = NO;
+                    pLedConfig->GreenLED = NO;
+
+                    if (checkCabinetEthConnectState(pLedConfig) == YES) {
+                        break;
+                    }
+
+                    pLedConfig->RedLED = YES;
+                    break;
+
+                case S_TERMINATING:
+                case S_COMPLETE:
+                    //if (pSysWarning->Level == WARN_LV_ER) {
+                    //    pLedConfig->YellowLED = NO;
+                    //    pLedConfig->GreenLED = NO;
+                    //    if (checkCabinetEthConnectState(pLedConfig) == YES) {
+                    //        break;
+                    //    }
+                    //    pLedConfig->RedLED = YES;
+                    //} else {
+                    pLedConfig->RedLED = NO;
+#ifdef DD360ComBox
+                    if (pLedConfig->YellowLED == YES) {
+                        pLedConfig->YellowLED = NO;
+                    } else {
+                        pLedConfig->YellowLED = YES;
+                    }
+#else
+                        pLedConfig->YellowLED = YES;
+#endif
+                    pLedConfig->GreenLED = NO;
+                    //}
+                    break;
+
+                case S_MAINTAIN:
+                case S_FAULT:
+                case S_UPDATE:
+                    pLedConfig->YellowLED = NO;
+                    pLedConfig->GreenLED = NO;
+                    pLedConfig->RedLED = YES;
+                    //if (pSysWarning->Level == WARN_LV_ER) {
+                    //    if (checkCabinetEthConnectState(pLedConfig) == YES) {
+                    //        break;
+                    //    }
+                    //    pLedConfig->RedLED = YES;
+                    //}
+                    break;
+
+                case S_BOOKING:
+                case S_DEBUG:
+                case S_NONE:
+                    break;
+                }//switch
+            }//for
+            usleep(500000);
+        }//while
+    }//fork
 }
-void CheckRightButton()
+
+//------------------------------------------------------------------------------
+static void checkChargingInfoByDC(uint8_t systemStatus)
 {
-    pSysInfo->CurGunSelected = RIGHT_GUN_NUM;
+    struct SysConfigData *pSysConfig = (struct SysConfigData *)GetShmSysConfigData();
+    struct SysInfoData *pSysInfo = (struct SysInfoData *)GetShmSysInfoData();
+    struct ChargingInfoData *pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(pSysInfo->CurGunSelected);
+
+    switch (systemStatus) {
+    case S_IDLE:
+        if (isDetectPlugin()) {
+            _DetectPlugInTimeout();
+            StopSystemTimeoutDet();
+            destroySelGun(pSysInfo->CurGunSelected);
+            
+        } else {
+            if( pSysConfig->isAuthrizeByEVCCID && pSysInfo->ConnectorPage == _LCM_PRE_CHARGE) {
+                _evccidlinktimeout(pSysInfo->CurGunSelected);
+                pDcChargingInfo->isEVCCIDVerify = true;
+                break;
+            }
+#if !defined DD360Audi
+            break;
+#endif //!defined DD360Audi
+
+            if (getConfirmSelectedGun(pSysInfo->CurGunSelected) == PASS) {
+                //printf("destroy gun = %d", pSysInfo->CurGunSelected);
+                destroySelGun(pSysInfo->CurGunSelected);
+            } else {
+                confirmSelGun(pSysInfo->CurGunSelected);
+                log_info("confirm select gun ............................... %d ",
+                         pSysInfo->CurGunSelected);
+            }
+        }
+        break;
+
+    case S_REASSIGN_CHECK:
+    case S_REASSIGN:
+    case S_PREPARNING:
+    case S_PREPARING_FOR_EV:
+    case S_PREPARING_FOR_EVSE:
+    case S_CCS_PRECHARGE_ST0:
+    case S_CCS_PRECHARGE_ST1:
+        // 取消充電
+        if (pSysInfo->CurGunSelectedByAc != NO_DEFINE) {
+            AcChargingTerminalProcess();
+        } else {
+            ChargingTerminalProcess(pSysInfo->CurGunSelected);
+        }
+        break;
+
+    case S_CHARGING:
+        if (pSysConfig->StopChargingByButton == YES ||
+                pSysConfig->AuthorisationMode == AUTH_MODE_DISABLE) {
+            // 停止充電
+            ChargingTerminalProcess(pSysInfo->CurGunSelected);
+        }
+        break;
+
+    case S_COMPLETE:
+        break;
+    }
 }
-void CheckPrimaryWarm(void)
+
+static void checkChargingInfoByAC(void)
 {
+    struct ChargingInfoData *pAcChargingInfo = NULL;
+    struct SysConfigData *pSysConfig = (struct SysConfigData *)GetShmSysConfigData();
+    struct SysInfoData *pSysInfo = (struct SysInfoData *)GetShmSysInfoData();
+
+    if (pSysInfo->CurGunSelectedByAc == NO_DEFINE) {
+        return;
+    }
+
+    pAcChargingInfo = (struct ChargingInfoData *)GetAcChargingInfoData(0);
+
+    switch (pAcChargingInfo->SystemStatus) {
+    case S_IDLE:
+        if (isDetectPlugin()) {
+            _DetectPlugInTimeout();
+            StopSystemTimeoutDet();
+        }
+        break;
+
+    case S_REASSIGN_CHECK:
+    case S_REASSIGN:
+    case S_PREPARNING:
+    case S_PREPARING_FOR_EV:
+    case S_PREPARING_FOR_EVSE:
+    case S_CCS_PRECHARGE_ST0:
+    case S_CCS_PRECHARGE_ST1:
+        // 取消充電
+        AcChargingTerminalProcess();
+        break;
+
+    case S_CHARGING:
+        if (pSysConfig->AuthorisationMode == AUTH_MODE_DISABLE) {
+            // 停止充電
+            AcChargingTerminalProcess();
+        }
+        break;
+
+    case S_COMPLETE:
+        break;
+    }
+}
+
+void ChkPrimaryStatus(void)
+{
+    static bool leftBtnPush = false;
+    static bool rightBtnPush = false;
     uint8_t i = 0;
     uint8_t Rtn = 0;
+    struct SysConfigData *pSysConfig = (struct SysConfigData *)GetShmSysConfigData();
+    struct SysInfoData *pSysInfo = (struct SysInfoData *)GetShmSysInfoData();
     struct WARNING_CODE_INFO *pSysWarning = (struct WARNING_CODE_INFO *)GetShmSysWarningInfo();
     struct PrimaryMcuData *ShmPrimaryMcuData = (struct PrimaryMcuData *)GetShmPrimaryMcuData();
     struct AlarmCodeData *pAlarmCode = (struct AlarmCodeData *)GetShmAlarmCodeData();
+    struct ChargingInfoData *pDcChargingInfo = NULL;
     DcCommonInfo *ShmDcCommonData = (DcCommonInfo *)GetShmDcCommonData();
+
     if (pSysWarning->WarningCount > 0) {
         Rtn = 0;
         for (i = 0; i < pSysWarning->WarningCount; i++) {
@@ -57,10 +344,10 @@ void CheckPrimaryWarm(void)
                 EmcOccureByString("042327");
                 Rtn = 1;
             } else if (memcmp(&pSysWarning->WarningCode[i][0], "042328", 6) == 0) {
-			   ShmDcCommonData->PowerAlarmState.StatusBit.DcInputUVP = YES;
-			   EmcOccureByString("042328");
-			   Rtn = 1;
-		    } else if (memcmp(&pSysWarning->WarningCode[i][0], "042200", 6) == 0) {
+                ShmDcCommonData->PowerAlarmState.StatusBit.DcInputUVP = YES;
+                EmcOccureByString("042328");
+                Rtn = 1;
+            }  else if (memcmp(&pSysWarning->WarningCode[i][0], "042200", 6) == 0) {
                 ShmDcCommonData->PowerAlarmState.StatusBit.SystemL1InputOVP = YES;
                 EmcOccureByString("042200");
                 Rtn = 1;
@@ -93,9 +380,9 @@ void CheckPrimaryWarm(void)
             ShmDcCommonData->PowerAlarmState.StatusBit.PsuFailure = NO;
             ReleaseEmsOccureByString(0, "042251");
             ReleaseEmsOccureByString(0, "042252");
-            ReleaseEmsOccureByString(0, "042200");
             ReleaseEmsOccureByString(0, "042327");
             ReleaseEmsOccureByString(0, "042328");
+            ReleaseEmsOccureByString(0, "042200");
             ReleaseEmsOccureByString(0, "042201");
             ReleaseEmsOccureByString(0, "042202");
             ReleaseEmsOccureByString(0, "042267");
@@ -112,9 +399,9 @@ void CheckPrimaryWarm(void)
         ShmDcCommonData->PowerAlarmState.StatusBit.PsuFailure = NO;
         ReleaseEmsOccureByString(0, "042251");
         ReleaseEmsOccureByString(0, "042252");
-        ReleaseEmsOccureByString(0, "042200");
         ReleaseEmsOccureByString(0, "042327");
         ReleaseEmsOccureByString(0, "042328");
+        ReleaseEmsOccureByString(0, "042200");
         ReleaseEmsOccureByString(0, "042201");
         ReleaseEmsOccureByString(0, "042202");
         ReleaseEmsOccureByString(0, "042267");
@@ -147,48 +434,167 @@ void CheckPrimaryWarm(void)
     } else {
         ReleaseEmsOccureByString(0, "012252");
     }
-}
-void ChkPrimaryStatus(void)
-{
-    static bool leftBtnPush = false;
-    static bool rightBtnPush = false;
-    pSysInfo = (struct SysInfoData *)GetShmSysInfoData();
-    struct PrimaryMcuData *ShmPrimaryMcuData = (struct PrimaryMcuData *)GetShmPrimaryMcuData();
-    struct ChargingInfoData *pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(pSysInfo->CurGunSelected);
-    pSysConfig = (struct SysConfigData *)GetShmSysConfigData();
-
-    // Check Primary Board status
-    CheckPrimaryWarm();
-    if ((pDcChargingInfo->SystemStatus == S_IDLE || pDcChargingInfo->SystemStatus == S_RESERVATION)
-            && pSysConfig->OfflinePolicy == _OFFLINE_POLICY_NO_CHARGING) {
-        log_info("Offline policy no charge");
-        return;;
-    }
 
-    // Show Version
+    //DS60-120 add
+    //if (ShmPrimaryMcuData->InputDet.bits.Button1 == BTN_PRESS &&
+    //        ShmPrimaryMcuData->InputDet.bits.Button2 == BTN_PRESS) {
+    //    pSysConfig->ShowInformation = YES;
+    //} else {
+    //    pSysConfig->ShowInformation = NO;
+    //}
+
     if (ShmPrimaryMcuData->InputDet.bits.Button1 == BTN_PRESS &&
-            ShmPrimaryMcuData->InputDet.bits.Button2 == BTN_PRESS )
-        pSysConfig->ShowInformation = YES;
-    else
-        pSysConfig->ShowInformation = NO;
-    if (pSysConfig->ShowInformation)
-        return;
-    // Press Left Button
-    if (ShmPrimaryMcuData->InputDet.bits.Button1 == BTN_PRESS && !leftBtnPush ) {
-        leftBtnPush = true;
-        CheckLeftButton();
-        log_info("left btn down...............................%x %x %x",
-                pSysInfo->CurGunSelected,pDcChargingInfo->SystemStatus,pSysInfo->SystemPage);
-    } else if (ShmPrimaryMcuData->InputDet.bits.Button1 == BTN_RELEASE && leftBtnPush) {
-        leftBtnPush = false;
+            !leftBtnPush &&
+            pSysInfo->SystemPage != _LCM_AUTHORIZING &&
+            pSysInfo->SystemPage != _LCM_AUTHORIZ_COMP &&
+            pSysInfo->SystemPage != _LCM_AUTHORIZ_FAIL
+       ) {
+        pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(pSysInfo->CurGunSelected);
+
+        if (!leftBtnPush) {
+            leftBtnPush = true;
+            log_info("left btn down...............................%x",
+                     pDcChargingInfo->SystemStatus);
+            checkChargingInfoByAC();
+            checkChargingInfoByDC(pDcChargingInfo->SystemStatus);
+#if 0
+            if (pSysInfo->CurGunSelectedByAc != NO_DEFINE) {
+                pAcChargingInfo = (struct ChargingInfoData *)GetAcChargingInfoData(0);
+
+                switch (pAcChargingInfo->SystemStatus) {
+                case S_IDLE:
+                    if (isDetectPlugin()) {
+                        _DetectPlugInTimeout();
+                        StopSystemTimeoutDet();
+                    }
+                    break;
+
+                case S_REASSIGN_CHECK:
+                case S_REASSIGN:
+                case S_PREPARNING:
+                case S_PREPARING_FOR_EV:
+                case S_PREPARING_FOR_EVSE:
+                case S_CCS_PRECHARGE_ST0:
+                case S_CCS_PRECHARGE_ST1:
+                    // 取消充電
+                    AcChargingTerminalProcess();
+                    break;
+
+                case S_CHARGING:
+                    if (pSysConfig->AuthorisationMode == AUTH_MODE_DISABLE) {
+                        // 停止充電
+                        AcChargingTerminalProcess();
+                    }
+                    break;
+
+                case S_COMPLETE:
+                    break;
+                }
+            }
+            switch (pDcChargingInfo->SystemStatus) {
+            case S_IDLE:
+                if (isDetectPlugin()) {
+                    _DetectPlugInTimeout();
+                    StopSystemTimeoutDet();
+                    destroySelGun(pSysInfo->CurGunSelected);
+                }             else {
+#if defined DD360Audi
+                    if (getConfirmSelectedGun(pSysInfo->CurGunSelected) == PASS) {
+                        //printf("destroy gun = %d", pSysInfo->CurGunSelected);
+                        destroySelGun(pSysInfo->CurGunSelected);
+                    } else {
+                        confirmSelGun(pSysInfo->CurGunSelected);
+                        log_info("confirm select gun ............................... %d ",
+                                 pSysInfo->CurGunSelected);
+                    }
+
+#endif //defined DD360Audi
+                }
+                break;
+
+            case S_REASSIGN_CHECK:
+            case S_REASSIGN:
+            case S_PREPARNING:
+            case S_PREPARING_FOR_EV:
+            case S_PREPARING_FOR_EVSE:
+            case S_CCS_PRECHARGE_ST0:
+            case S_CCS_PRECHARGE_ST1:
+                // 取消充電
+                if (pSysInfo->CurGunSelectedByAc != NO_DEFINE) {
+                    AcChargingTerminalProcess();
+                } else {
+                    ChargingTerminalProcess(pSysInfo->CurGunSelected);
+                }
+                break;
+
+            case S_CHARGING:
+                if (pSysConfig->StopChargingByButton == YES ||
+                        pSysConfig->AuthorisationMode == AUTH_MODE_DISABLE) {
+                    // 停止充電
+                    ChargingTerminalProcess(pSysInfo->CurGunSelected);
+                }
+                break;
+
+            case S_COMPLETE:
+                // 回 IDLE
+                //log_info("right btn down.................S_COMPLETE ");
+                //pDcChargingInfo->SystemStatus = S_IDLE;
+                break;
+            }
+#endif //0
+        }
+    } else if (ShmPrimaryMcuData->InputDet.bits.Button1 == BTN_RELEASE) {
+        if (leftBtnPush) {
+            leftBtnPush = false;
+            //log_info("left btn up............................... ");
+        }
     }
-    // Press Right Button
-    if (ShmPrimaryMcuData->InputDet.bits.Button2 == BTN_PRESS && !rightBtnPush ) {
-        rightBtnPush = true;
-        CheckRightButton();
-        log_info("right btn down...............................%x %x %x",
-               pSysInfo->CurGunSelected,pDcChargingInfo->SystemStatus, pSysInfo->SystemPage);
-    } else if (ShmPrimaryMcuData->InputDet.bits.Button2 == BTN_RELEASE && rightBtnPush) {
-        rightBtnPush = false;
+
+    if (ShmPrimaryMcuData->InputDet.bits.Button2 == BTN_PRESS &&
+            !rightBtnPush &&
+#if defined DD360Audi
+            pSysInfo->SystemPage != _LCM_IDLE &&
+#endif //defined DD360Audi
+            pSysInfo->SystemPage != _LCM_AUTHORIZING &&
+            pSysInfo->SystemPage != _LCM_AUTHORIZ_COMP &&
+            pSysInfo->SystemPage != _LCM_AUTHORIZ_FAIL &&
+            pSysInfo->SystemPage != _LCM_WAIT_FOR_PLUG
+       ) {
+        if (!rightBtnPush) {
+            rightBtnPush = true;
+            //log_info("right btn down............................... %d ", pSysInfo->CurGunSelected);
+            if (pSysInfo->CurGunSelected + 1 < pSysConfig->TotalConnectorCount &&
+                    pSysInfo->IsAlternatvieConf == NO) {
+                pSysInfo->CurGunSelected++;
+                ChangeGunSelectByIndex(pSysInfo->CurGunSelected);
+            } else if (pSysConfig->AcConnectorCount > 0 &&
+                       pSysInfo->CurGunSelectedByAc == NO_DEFINE) {
+                pSysInfo->CurGunSelectedByAc = DEFAULT_AC_INDEX;
+            } else if (pSysInfo->IsAlternatvieConf == YES) {
+                for (uint8_t _index = 0; _index < pSysConfig->TotalConnectorCount; _index++) {
+                    pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(_index);
+
+                    if (pDcChargingInfo->SystemStatus != S_BOOTING &&
+                            pDcChargingInfo->SystemStatus != S_IDLE &&
+                            pDcChargingInfo->SystemStatus != S_RESERVATION) {
+                        pSysInfo->CurGunSelected = _index;
+                        ChangeGunSelectByIndex(pSysInfo->CurGunSelected);
+                        return;
+                    }
+                }
+                pSysInfo->CurGunSelected = 0;
+                ChangeGunSelectByIndex(pSysInfo->CurGunSelected);
+            } else {
+                pSysInfo->CurGunSelected = 0;
+                ChangeGunSelectByIndex(pSysInfo->CurGunSelected);
+            }
+        }
+        log_info("current select gun ............................... %d ",
+                 pSysInfo->CurGunSelected);
+    } else if (ShmPrimaryMcuData->InputDet.bits.Button2 == BTN_RELEASE) {
+        if (rightBtnPush) {
+            rightBtnPush = false;
+            //log_info("right btn up............................... ");
+        }
     }
 }

+ 108 - 89
EVSE/Projects/DD360Tcci/Apps/CSU/RFID.c

@@ -38,24 +38,28 @@ static bool canStartCharging(void)
     return false;
 }
 
-bool isAutorCompleteHandle(/*uint8_t *authorizeIndex*/)
+static void isAutorCompleteHandle(uint8_t *authorizeIndex)
 {
-   // uint8_t i = 0;
+    uint8_t i = 0;
     struct SysConfigData *pSysConfig = (struct SysConfigData *)GetShmSysConfigData();
-    //struct ChargingInfoData *pDcChargingInfo = NULL;
-    //struct SysInfoData *pSysInfo = (struct SysInfoData *)GetShmSysInfoData();
+    struct ChargingInfoData *pDcChargingInfo = NULL;
 
     // 透過後臺停止充電的判斷
-    if (isAuthorizedComplete()) {
+    if (isAuthorizedComplete()
+#if !defined DD360Tcci && !defined DD360Audi && !defined DD360ComBox
+            || (pSysInfo->OcppConnStatus == NO &&
+                pSysConfig->OfflinePolicy == _OFFLINE_POLICY_FREE_CHARGING)
+#endif //!defined DD360Tcci && !defined DD360Audi
+       ) {
+
         // 判斷後台回覆狀態
         if (canStartCharging() == false) {
             strcpy((char *)pSysConfig->UserId, "");
             ClearAuthorizedFlag();
+
+            return;
         }
-        return true;
-    }
-    return false;
-/*
+
         if (*(authorizeIndex) != NO_DEFINE) {
             pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(*(authorizeIndex));
 
@@ -74,8 +78,7 @@ bool isAutorCompleteHandle(/*uint8_t *authorizeIndex*/)
         }
 
         ClearAuthorizedFlag();
-
-    } /*else if (pSysConfig->OfflinePolicy == _OFFLINE_POLICY_LOCAL_LIST) {
+    } else if (pSysConfig->OfflinePolicy == _OFFLINE_POLICY_LOCAL_LIST) {
         // 白名單驗證
         for (i = 0; i < 10; i++) {
             if (strcmp((char *)pSysConfig->LocalWhiteCard[i], "") == EQUAL) {
@@ -90,37 +93,9 @@ bool isAutorCompleteHandle(/*uint8_t *authorizeIndex*/)
                 break;
             }
         }
-    }*/
-}
-
-bool RfidStopCharging(void)
-{
-    //當前沒有選槍
-    struct SysConfigData *pSysConfig = (struct SysConfigData *)GetShmSysConfigData();
-    struct SysInfoData *pSysInfo = (struct SysInfoData *)GetShmSysInfoData();
-    if (getConfirmSelectedGun(pSysInfo->CurGunSelected) == FAIL ) {
-        strcpy((char *)pSysConfig->UserId, "");
-        return false;
-    }
-    struct ChargingInfoData *pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(pSysInfo->CurGunSelected);
-    if (pDcChargingInfo->isRemoteStart) {
-
-    } else {
-        if (strcmp((char *)pSysConfig->UserId, (char *)pDcChargingInfo->StartUserId) == EQUAL) {
-
-            ChargingTerminalProcess(pSysInfo->CurGunSelected);
-            strcpy((char *)pSysConfig->UserId, "");
-            log_info("index = %d, card number = %s, UserId = %s ",
-                     pSysInfo->CurGunSelected,
-                     pDcChargingInfo->StartUserId,
-                     pSysConfig->UserId);
-            return true;
-        } else {
-            return false;
-        }
     }
-    return false;
 }
+
 static void UserScanFunction(void)
 {
     bool idleReq = false;
@@ -136,7 +111,7 @@ static void UserScanFunction(void)
 
     // 當前非驗證的狀態
     if (IsAuthorizingMode()) {
-        isAutorCompleteHandle(/*&_authorizeIndex*/);
+        isAutorCompleteHandle(&_authorizeIndex);
     }
 
     //當前沒有選槍
@@ -144,16 +119,20 @@ static void UserScanFunction(void)
         strcpy((char *)pSysConfig->UserId, "");
         return;
     }
-
+    /*
+    if (pSysConfig->EVCCID_Authorize) {
+        pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(pSysInfo->CurGunSelected);
+        if (strcmp( (char *)pSysConfig->UserId, (char *) pDcChargingInfo->EVCCID) != EQUAL )
+            return;
+    }*/
     // 先判斷現在是否可以提供刷卡
     // 1. 如果當前沒有槍是閒置狀態,則無提供刷卡功能
     // 2. 停止充電
-    //if (pSysInfo->PageIndex == _LCM_ERROR) {
-    if (pSysInfo->SystemPage == _PAGE_MAINTAIN) {
+    if (pSysInfo->PageIndex == _LCM_FIX) {
         strcpy((char *)pSysConfig->UserId, "");
         return;
     }
-    /*
+
     for (i = 0; i < pSysConfig->TotalConnectorCount; i++) {
         pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(i);
 
@@ -161,10 +140,10 @@ static void UserScanFunction(void)
             stopReq = i;
         }
 
-        if ((pDcChargingInfo->SystemStatus == S_AUTHORIZING &&
+        if ((pDcChargingInfo->SystemStatus == S_IDLE &&
                 pDcChargingInfo->IsAvailable == YES) ||
                 (pGunIndexInfo->AcGunIndex > 0 &&
-                 pAcChargingInfo->SystemStatus == S_AUTHORIZING &&
+                 pAcChargingInfo->SystemStatus == S_IDLE &&
                  pAcChargingInfo->IsAvailable)
            ) {
             idleReq = true;
@@ -176,14 +155,14 @@ static void UserScanFunction(void)
             pAcChargingInfo->SystemStatus == S_CHARGING) {
         stopReq = DEFAULT_AC_INDEX;
     }
-     */
+
     if (strlen((char *)pSysConfig->UserId) <= 0) {
         return;
     }
 
     pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(pSysInfo->CurGunSelected);
-    // Stop Charging For AC
-    /*if (pGunIndexInfo->AcGunIndex > 0 &&
+
+    if (pGunIndexInfo->AcGunIndex > 0 &&
             stopReq == DEFAULT_AC_INDEX &&
             pSysInfo->CurGunSelectedByAc == DEFAULT_AC_INDEX) {
         log_info("ac stop charging ");
@@ -206,9 +185,26 @@ static void UserScanFunction(void)
                 (pGunIndexInfo->AcGunIndex > 0 &&
                  pSysInfo->CurGunSelectedByAc == NO_DEFINE))
               ) {
-    	// Stop Charging
-        if (RfidStopCharging())
+        log_info("stop charging ");
+        log_info("index = %d, card number = %s, UserId = %s ",
+                 pSysInfo->CurGunSelected,
+                 pDcChargingInfo->StartUserId,
+                 pSysConfig->UserId);
+
+        memset(value, 0, sizeof(value));
+        memcpy(value,
+               (uint8_t *)pDcChargingInfo->StartUserId,
+               ARRAY_SIZE(pDcChargingInfo->StartUserId));
+
+        // 同一張卡直接停掉
+        if (strcmp((char *)pSysConfig->UserId, value) == EQUAL) {
+            ChargingTerminalProcess(pSysInfo->CurGunSelected);
+            strcpy((char *)pSysConfig->UserId, "");
+
             return;
+        }
+
+        // 進驗證
         if (pGunIndexInfo->AcGunIndex > 0 &&
                 pSysInfo->CurGunSelectedByAc == DEFAULT_AC_INDEX) {
             _authorizeIndex = pSysInfo->CurGunSelectedByAc;
@@ -216,9 +212,15 @@ static void UserScanFunction(void)
             _authorizeIndex = pSysInfo->CurGunSelected;
         }
 
+#if defined DD360Tcci || defined DD360Audi || defined DD360ComBox
         strcpy((char *)pSysConfig->UserId, "");
+
         return;
+#endif //defined DD360Tcci || defined DD360Audi || defined DD360ComBox
+
+        StartSystemTimeoutDet(Timeout_AuthorizingForStop);
 
+        AuthorizingStart();
     } else if (idleReq) {
         if (pSysConfig->TotalConnectorCount > 1 &&
                 stopReq != 255 &&
@@ -227,17 +229,19 @@ static void UserScanFunction(void)
             strcpy((char *)pSysConfig->UserId, "");
         } else if ((pGunIndexInfo->AcGunIndex > 0 &&
                     pSysInfo->CurGunSelectedByAc == DEFAULT_AC_INDEX) ||
-                   pDcChargingInfo->SystemStatus == S_AUTHORIZING) {*/
-    if (pDcChargingInfo->SystemStatus == S_AUTHORIZING ) {
+                   pDcChargingInfo->SystemStatus == S_IDLE) {
             log_info("// LCM => Authorizing");
 
             setSelGunWaitToAuthor(pSysInfo->CurGunSelected);
 
             // LCM => Authorizing
-            pSysInfo->SystemPage = _PAGE_PLUGIN;
+            pSysInfo->SystemPage = _LCM_AUTHORIZING;
 
             // 進入確認卡號狀態
             AuthorizingStart();
+        } else {
+            strcpy((char *)pSysConfig->UserId, "");
+        }
     } else {
         strcpy((char *)pSysConfig->UserId, "");
     }
@@ -254,42 +258,17 @@ void SetIsCardScan(bool value)
 {
     isCardScan = value;
 }
-void AuthorizeToCharge()
-{
-    struct SysConfigData *pSysConfig = (struct SysConfigData *)GetShmSysConfigData();
-    struct SysInfoData *pSysInfo = (struct SysInfoData *)GetShmSysInfoData();
-    SelectGunInfo *ShmSelectGunInfo = (SelectGunInfo *)GetShmSelectGunInfo();
-    if(!isAuthorizedComplete())
-        StartSystemTimeoutDet(Timeout_Authorizing);
-    else {
-        //StopSystemTimeoutDet();
-        StartSystemTimeoutDet(Timeout_WaitBalance);
-        if (ShmSelectGunInfo->PricesInfo[pSysInfo->CurGunSelected].Balance != FAIL_BALANCE_PRICES) {
-            StopSystemTimeoutDet();
-            // 判斷後台回覆狀態
-            if (canStartCharging()) {
-            // LCM => Authorize complete
-                pSysInfo->SystemPage = _PAGE_PLUGIN;
-                log_info("Wait Gun(%d) plugin",pSysInfo->CurGunSelected);
-                DetectPluginStart();
-                log_info("Gun(%d) Balance: %f",pSysInfo->CurGunSelected,
-                        ShmSelectGunInfo->PricesInfo[pSysInfo->CurGunSelected].Balance);
-            } else {
-                // LCM => Authorize fail
-                pSysInfo->SystemPage = _PAGE_PAY_FAIL;
-                strcpy((char *)pSysConfig->UserId, "");
-            }
-        }
-        ClearAuthorizedFlag();
-    }
-}
+
 void ScannerCardProcess(void)
 {
+    int i = 0;
     struct SysConfigData *pSysConfig = (struct SysConfigData *)GetShmSysConfigData();
     struct SysInfoData *pSysInfo = (struct SysInfoData *)GetShmSysInfoData();
     struct WARNING_CODE_INFO *pSysWarning = (struct WARNING_CODE_INFO *)GetShmSysWarningInfo();
+    SelectGunInfo *ShmSelectGunInfo = (SelectGunInfo *)GetShmSelectGunInfo();
 
-    if (!isDetectPlugin() && pSysInfo->SystemPage == _PAGE_PLUGIN &&
+    if (!isDetectPlugin() &&
+            !isCardScan &&
             pSysWarning->Level != WARN_LV_ER /*&&
             pSysConfig->AuthorisationMode == AUTH_MODE_ENABLE*/) {
         isCardScan = true;
@@ -297,12 +276,52 @@ void ScannerCardProcess(void)
         UserScanFunction();
     }
 
-    /*if (pSysInfo->SystemPage == _PAGE_PLUGIN) {
-        AuthorizeToCharge();
-    } else if (pSysInfo->SystemPage == _PAGE_PLUGIN) {
+    if (pSysInfo->PageIndex == _LCM_AUTHORIZING) {
+        if(!isAuthorizedComplete())
+            StartSystemTimeoutDet(Timeout_Authorizing);
+
+        //printf("isAuthorizedComplete = %d, %f", isAuthorizedComplete(), ShmSelectGunInfo->PricesInfo[pSysInfo->CurGunSelected].Balance);
+        // 確認驗證卡號完成沒
+        if (isAuthorizedComplete()
+#if !defined DD360Tcci && !defined DD360Audi && !defined DD360ComBox
+                || pSysConfig->OfflinePolicy == _OFFLINE_POLICY_FREE_CHARGING
+#endif //!defined DD360Tcci && !defined DD360Audi && !defined DD360ComBox
+           ) {
+                //StopSystemTimeoutDet();
+                StartSystemTimeoutDet(Timeout_WaitBalance);
+                if (ShmSelectGunInfo->PricesInfo[pSysInfo->CurGunSelected].Balance != FAIL_BALANCE_PRICES) {
+                    StopSystemTimeoutDet();
+                    // 判斷後台回覆狀態
+                    if (canStartCharging()) {
+                    // LCM => Authorize complete
+                    pSysInfo->SystemPage = _LCM_AUTHORIZ_COMP;
+                    } else {
+                    // LCM => Authorize fail
+                    pSysInfo->SystemPage = _LCM_AUTHORIZ_FAIL;
+                    strcpy((char *)pSysConfig->UserId, "");
+                }
+
+            } ClearAuthorizedFlag();
+        } else if (pSysConfig->OfflinePolicy == _OFFLINE_POLICY_LOCAL_LIST) {
+            // 白名單驗證
+            for (i = 0; i < 10; i++) {
+                if (strcmp((char *)pSysConfig->LocalWhiteCard[i], "") == EQUAL) {
+                    continue;
+                }
+
+                if (strcmp((char *)pSysConfig->LocalWhiteCard[i], (char *)pSysConfig->UserId) == EQUAL) {
+                    pSysInfo->SystemPage = _LCM_AUTHORIZ_COMP;
+                    ClearAuthorizedFlag();
+                    break;
+                }
+            }
+        }
+    } else if (pSysInfo->PageIndex == _LCM_AUTHORIZ_FAIL) {
         StartSystemTimeoutDet(Timeout_VerifyFail);
         isCardScan = false;
-    } else */if (pSysInfo->SystemPage == _PAGE_PLUGIN) {
+    } else if (pSysInfo->PageIndex == _LCM_AUTHORIZ_COMP) {
+        StartSystemTimeoutDet(Timeout_VerifyComp);
+    } else if (pSysInfo->PageIndex == _LCM_WAIT_FOR_PLUG) {
         StartSystemTimeoutDet(Timeout_WaitPlug);
     } else {
         isCardScan = false;

+ 28 - 5
EVSE/Projects/DD360Tcci/Apps/CSU/SelfTest.c

@@ -74,7 +74,7 @@ void SelfTestRun(void)
         case _STEST_VERSION:
             if(isRelayBypass == YES && ShmRelayModuleData->SelfTest_Comp != YES)
             {
-                //log_info("Relay Board Bypass");
+                log_info("Relay Board Bypass");
                 ShmRelayModuleData->SelfTest_Comp = YES;
             }
             if ((strlen((char *)pSysInfo->RelayModuleFwRev) != 0 ||
@@ -147,9 +147,9 @@ void SelfTestRun(void)
                                     ShmCcsData->V2GMessage_DIN70121[pDcChargingInfo->type_index].version[0] != '\0')
                                     /*&&(ShmCcsData->V2GMessage_DIN70121[pDcChargingInfo->type_index].SelfTest_Comp != YES)*/
                                ) {
-                                //log_info("CCS[%d] FW Rev = %s",
-                                //         pDcChargingInfo->type_index,
-                                //         ShmCcsData->V2GMessage_DIN70121[pDcChargingInfo->type_index].version);
+                             //   log_info("CCS[%d] FW Rev = %s",
+                             //            pDcChargingInfo->type_index,
+                             //            ShmCcsData->V2GMessage_DIN70121[pDcChargingInfo->type_index].version);
                                 ShmCcsData->V2GMessage_DIN70121[pDcChargingInfo->type_index].SelfTest_Comp = YES;
                             } else {
                                 //log_info("CCS[%d] ccs fw lose...... %s \n",
@@ -169,7 +169,7 @@ void SelfTestRun(void)
                                 pAcChargingInfo->version[0] != '\0')
                                 && (pAcChargingInfo->SelfTest_Comp != YES)
                            ) {
-                            //log_info("AC connector[%d] FW Rev = %s", index, pAcChargingInfo->version);
+                            log_info("AC connector[%d] FW Rev = %s", index, pAcChargingInfo->version);
                             pAcChargingInfo->SelfTest_Comp = YES;
                         } else {
                             evInitFlag = NO;
@@ -190,24 +190,47 @@ void SelfTestRun(void)
         case _STEST_AC_CONTACTOR:
             //ShmPsuData->Work_Step = _TEST_COMPLETE;
             // 因為 30KW 以下沒有 Relay feedback 功能,所以暫時先直接跳過
+#if defined DD360Tcci || defined DD360Audi || defined DD360ComBox
             pSysInfo->SelfTestSeq = _STEST_PSU_DETECT;
             //log_info("Waiting for DO communication");
             break;
+#endif //defined DD360Tcci || defined DD360Audi || defined DD360ComBox
+
+            if (pSysInfo->AcContactorStatus == YES) {
+                pSysInfo->SelfTestSeq = _STEST_PSU_DETECT;
+                log_info("AC contactor self test OK");
+            }
+            break;
 
         case _STEST_PSU_DETECT:
+#if defined DD360Tcci || defined DD360Audi || defined DD360ComBox
             pSysInfo->SelfTestSeq = _STEST_PSU_CAP;
             break;
+#endif //defined DD360Tcci || defined DD360Audi || defined DD360ComBox
+
+            if (ShmPsuData->Work_Step >= GET_SYS_CAP) {
+                pSysInfo->SelfTestSeq = _STEST_PSU_CAP;
+            }
+            break;
 
         case _STEST_PSU_CAP:
             // 此測試是要確認當前總輸出能力
             // 如果沒有 PSU 模組請 bypass
 
+#if defined DD360Tcci || defined DD360Audi || defined DD360ComBox
             //check the power limit from DO
             pSysInfo->SelfTestSeq = _STEST_COMPLETE;
             pSysInfo->BootingStatus = BOOT_COMPLETE;
             log_info("Successful Self Test");
             break;
+#endif //defined DD360Tcci || defined DD360Audi || defined DD360ComBox
 
+            if (ShmPsuData->Work_Step == BOOTING_COMPLETE) {
+                sleep(1);
+                pSysInfo->SelfTestSeq = _STEST_COMPLETE;
+                pSysInfo->BootingStatus = BOOT_COMPLETE;
+            }
+            break;
         }
 
         usleep(100000);

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 445 - 106
EVSE/Projects/DD360Tcci/Apps/CSU/main.c


+ 7 - 9
EVSE/Projects/DD360Tcci/Apps/CSU/main.h

@@ -12,7 +12,11 @@
 #define MAX_BUF                                 (64)
 #define SYSFS_GPIO_DIR                          "/sys/class/gpio"
 #define UPGRADE_FAN                             (0x02)
+#if defined DD360Tcci || defined DD360Audi || defined DD360ComBox
 #define UPGRADE_RB                              (0x09) //0x09 for DD360Tcci dispenser
+#else
+#define UPGRADE_RB                              (0x03) //other module use
+#endif //defined DD360Tcci ||defined DD360Audi || defined DD360ComBox
 #define UPGRADE_PRI                             (0x04)
 #define UPGRADE_AC                              (0x05)
 #define UPGRADE_LED                             (0x06)
@@ -27,12 +31,11 @@
 
 #define uSEC_VAL                                (1000000)
 #define SELFTEST_TIMEOUT                        (60)//45
-#define RETURN_VIEWPAGE_TIMEOUT                 (120)
 #define AUTHORIZE_TIMEOUT                       (30)//30
 #define BALANCE_TIMEOUT                         (15)//15
-#define AUTHORIZE_FAIL_TIMEOUT                  (120)
+#define AUTHORIZE_COMP_TIMEOUT                  (3)
+#define AUTHORIZE_FAIL_TIMEOUT                  (3)
 #define AUTHORIZE_STOP_TIMEOUT                  (30)
-#define LINKERROR_TIMEOUT						(120)
 #define RETURN_TO_CHARGING_PAGE                 (30)
 #define GUN_PREPARE_TIMEOUT                     (30)
 #define GUN_EV_WAIT_TIMEOUT                     (120)
@@ -40,12 +43,8 @@
 #define GUN_COMP_WAIT_TIMEOUT                   (10)
 #define GUN_PRECHARGING_TIMEOUT                 (60)
 #define EVCCID_LINK_TIMEOUT                     (120)
-#define CONN_PLUG_TIMEOUT                       (40)
-#define DETAILVIEW_TIMEOUT                      (30)
-#define TERMINATING_TIMEOUT                     (120)
-#define WHILE_LOOP_TIME                         (10000)
 #define PRECHARGING_TTIMEOUT                    (60)
-#define PLUGOUTGUN_TIMEOUT                      (30)
+#define WHILE_LOOP_TIME                         (10000)
 
 //#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)
@@ -78,7 +77,6 @@ void AuthorizingStart(void);
 bool IsAuthorizingMode(void);
 bool isAuthorizedComplete(void);
 void ClearAuthorizedFlag(void);
-void ClearDetectPluginFlag(void);
 
 void ChargingAlarmProcess(uint8_t gunIndex);
 void StopChargingProcessByString(uint8_t level);

+ 26 - 74
EVSE/Projects/DD360Tcci/Apps/Config.h

@@ -135,43 +135,24 @@ enum _GUN_TYPE {
     _Type_GB,
     _Type_AC,
 };
-enum _CCS_GUN_TYPE {
-    _TYPE_CCS_NONE  = 0,
-    _TYPE_CCS1_Natural,
-    _TYPE_CCS1_Liquid,
-    _TYPE_CCS2_Natural,
-    _TYPE_CCS2_Liquid,
-};
 
-enum _PAGE_TCC_INDEX {
-    _PAGE_NONE                   = 0x00,
-    _PAGE_IDLE,
-    _PAGE_AUTHORIZE,
-    _PAGE_PLUGIN,
-    _PAGE_PRECHARGE,
-    _PAGE_CHARGING,
-    _PAGE_COMPLETE,
-	_PAGE_PLUGOUT,
-	_PAGE_EXIT,
-    _PAGE_FUNCTION_SELECT,
-    _PAGE_REFUND_SENSEING,
-    _PAGE_REFUNDING,
-    _PAGE_REFUND_COMPLETE,
-    _PAGE_REFUND_NONE,
-    _PAGE_MEMBER_SELECT,
-    _PAGE_MEMBER_QR,
-    _PAGE_DONATE,
-    _PAGE_DONATE_SELECT,
-    _PAGE_PAY_SENSING,
-    _PAGE_PAY_ETICKET_SUCCESS,
-    _PAGE_PAY_MPAY_SUCCESS,
-    _PAGE_PAY_FAIL,
-    _PAGE_MAINTAIN = 100,
-    _PAGE_ERROR,
-
-    __SHOW_CABIENT_VERSION,
-    __SHOW_DISPENSER_VERASION,
+enum _LCM_INDEX {
+    _LCM_INIT          = 0x00,
+    _LCM_IDLE          = 0x01,
+    _LCM_AUTHORIZING   = 0x02,
+    _LCM_AUTHORIZ_COMP = 0x03,
+    _LCM_AUTHORIZ_FAIL = 0x04,
+    _LCM_WAIT_FOR_PLUG = 0x05,
+    _LCM_PRE_CHARGE    = 0x06,
+    _LCM_CHARGING      = 0x07,
+    _LCM_COMPLETE      = 0x08,
+    _LCM_FIX           = 0x09,
+    _LCM_SELECT_GUN    = 0x0A,
+    _LCM_EMERGENCY     = 0x0B,
+    _LCM_DISCONNECT    = 0x0C,
+    _LCM_NONE          = 0xFF,
 };
+
 enum _SELF_TEST_SEQ {
     _STEST_VERSION      = 0x00,
     _STEST_AC_CONTACTOR = 0x01,
@@ -287,6 +268,11 @@ enum _CCS_TYPE {
     _CCS_TYPE_CCS2 = 1,
 };
 
+enum _LCM_UPGRADE_RESULT {
+    _LCM_UPGRADE_RESULT_WAIT = 0,
+    _LCM_UPGRADE_RESULT_PASS,
+    _LCM_UPGRADE_RESULT_FAIL,
+};
 //------------------------------------------------------------------------------
 //struct StructMeter {
 //    float curMeterValue;
@@ -352,8 +338,8 @@ typedef union {
     struct {
         uint8_t EmergencyStop: 1;    //Power cabinet emergency stop
         uint8_t DoorOpen: 1;         //Power cabinet emergency door open
-        uint8_t DcInputOVP: 1;
-        uint8_t DcInputUVP: 1;
+        uint8_t DcInputOVP: 1;      // Power cabient DC OVP
+        uint8_t DcInputUVP: 1;      // Power cabient DC UVP
         uint8_t SystemL1InputOVP: 1; //Power cabinet system L1 input OVP
         uint8_t SystemL2InputOVP: 1; //Power cabinet System L2 input OVP
         uint8_t SystemL3InputOVP: 1; //Power cabinet System L3 input OVP
@@ -382,18 +368,6 @@ typedef struct StPcPsuOutput { //from power cabinet PSU output
     uint16_t Current;
 } PcPsuOutput;
 
-typedef struct Psu_VersionInfo{
-	uint8_t n_PSU;
-	uint8_t DCVersion[32];
-	uint8_t FPCVersion[32];
-}PsuVerInfo;
-
-enum _LCM_UPGRADE_RESULT {
-    _LCM_UPGRADE_RESULT_WAIT = 0,
-    _LCM_UPGRADE_RESULT_PASS,
-    _LCM_UPGRADE_RESULT_FAIL,
-};
-
 typedef struct StDcCommonInfo {
     uint8_t RebootCount;
     uint8_t CcsVersion;
@@ -412,31 +386,9 @@ typedef struct StDcCommonInfo {
     PcPsuOutput PcPsuOutput[2];
     uint8_t _upgrade_lcm_flag;
     uint8_t _upgrade_lcm_result;
-    uint8_t Reserved[1];
-    // Power Cabinet Version
-    uint8_t CabinetModelName[32];
-    uint8_t CabinetBoolLoaderVersion[32];
-    uint8_t CabinetKernelVersion[32];
-    uint8_t CabinetRFSystemVersion[32];
-    uint8_t CabinetPrimaryVersion[32];
-    uint8_t CabinetIPAddr[32];
-    uint8_t CabinetRelay0Version[32];
-    uint8_t CabinetRelay1Version[32];
-    uint8_t CabinetFanVersion[32];
-    // PSU Version
-    uint8_t PSU_Number;
-    PsuVerInfo PsuVer[12];
-    // Touch press
-    uint8_t TouchId;
-    // TCC Using
-    uint8_t _ChangeLCMRequest;
-    uint8_t _RefundRequest;
-    uint8_t _RefundCancel;
-    uint8_t _InvoiceRequest;
-    // TCC Payment fail
-    int                 PaymentFailId;
-    unsigned char       PaymentFailString[32];
-
+    uint8_t chillerCtrl;
+    uint8_t debugflag;
+    uint8_t Reserved[7];
 } DcCommonInfo;
 
 #endif /* CONFIG_H_ */

+ 0 - 16
EVSE/Projects/DD360Tcci/Apps/Define/define.h

@@ -672,24 +672,8 @@ struct ChargingInfoData
     unsigned char       Replug_flag;
     unsigned char       isEVCCIDVerify;
     unsigned char       CCSGunType;
-    //Reservation
-    int                 ReservationTrigger;
-    // TCC
     struct timeval      PreChargeTimer;
     unsigned char       _SaftyDetect;
-    // TCC Change LCM Page
-    int                 ChangeLcmPage;
-    // TCC Refund
-    unsigned char       RefundDate[32];
-    float               Prepayment;
-    float               ActualCost;
-    float               RefundAmount;
-    // TCC Prepayment
-    unsigned char       CardType;                       // EasyCard or i-pass or icash
-    float               TopupMoney;
-    float               AccountAmount;
-    float               Balance;
-
 };
 
 typedef struct

+ 8 - 4
EVSE/Projects/DD360Tcci/Apps/Makefile

@@ -39,6 +39,7 @@ PrimaryLib = $(TOP)/ModulePrimary
 LcmLib = $(TOP)/ModuleLcmCtrl
 DoCommLib = $(TOP)/ModuleDoComm
 EventLogLib = $(TOP)/ModuleEventLog
+SelectGunLib = $(TOP)/SelectGun
 ScriptLib = $(TOP)/Script
 
 
@@ -66,7 +67,9 @@ InfypwrPsuComm_A = $(ModularizationPath)/libInfypwr_PsuCommObj.a
 COMMON_OBJ_FILES = common.o \
 					$(DefineLib)/define.o \
 					$(ShmMemLib)/shmMem.o \
-					$(LogLib)/log.o 
+					$(LogLib)/log.o \
+					$(SelectGunLib)/SelectGun.o \
+
 
 MAIN_OBJ_FILES = $(COMMON_OBJ_FILES) $(DataBaseLib)/DataBase.o \
 					$(CSULib)/main.o  $(CSULib)/Primary.o $(CSULib)/WatchDog.o $(CSULib)/ZipFile.o \
@@ -99,7 +102,7 @@ EVCOMM_SRC_FILES = $(patsubst %.o, %.c, $(EVCOMM_OBJ_FILES))
 	$(CC) $(CFLAGS) -c $<
 
 #Update FW
-UPDATEFW_OBJ_FILES = $(COMMON_OBJ_FILES) $(UpdateFWLib)/Module_UpdateFW.o 
+UPDATEFW_OBJ_FILES = $(COMMON_OBJ_FILES) $(UpdateFWLib)/Module_UpdateFW.o
 UPDATEFW_SRC_FILES = $(patsubst %.o, %.c, $(UPDATEFW_OBJ_FILES))
 %.o: %.c
 	$(CC) $(CFLAGS) -c $<
@@ -125,7 +128,7 @@ EVENTLOG_SRC_FILES = $(patsubst %.o, %.c, $(EVENTLOG_OBJ_FILES))
 
 #LCM Control
 LCM_OBJ_FILES = $(COMMON_OBJ_FILES) $(LcmLib)/Module_LcmControl.o \
-				$(LcmLib)/Lcm_Update.o $(LcmLib)/cbmp.o
+				$(LcmLib)/cbmp.o
 LCM_SRC_FILES = $(patsubst %.o, %.c, $(LCM_OBJ_FILES))
 %.o: %.c
 	$(CC) $(CFLAGS) -c $<
@@ -201,7 +204,8 @@ LcmControlTask:
 	$(CC) $(DEFINE) $(LCM_SRC_FILES) $(CFLAGS) $(TFLAGS) $(INC_FLAGS) -o Module_LcmControl
 	#$(CC) $(DEFINE) $(CFLAGS) -c -o define.o $(DefineLib)/define.c
 	#$(CC) $(DEFINE) $(CFLAGS) -c -o Module_LcmControl.o $(LcmLib)/Module_LcmControl.c
-	#$(CC) -o Module_LcmControl Module_LcmControl.o define.o
+	#$(CC) $(DEFINE) $(CFLAGS) -c -o cbmp.o $(LcmLib)/cbmp.c
+	#$(CC) -o Module_LcmControl Module_LcmControl.o define.o cbmp.o
 
 PrimaryCommTask:
 	$(CC) $(DEFINE) $(PRIMARY_SRC_FILES) $(CFLAGS) $(TFLAGS) $(INC_FLAGS) -o Module_PrimaryComm

+ 8 - 0
EVSE/Projects/DD360Tcci/Apps/ModuleChkSysTask/Module_ChkSysTask.c

@@ -24,6 +24,7 @@ struct ChargingInfoData *pAcChargingInfo = NULL;
 static struct ChargingInfoData *pDcChargingInfo = NULL;
 struct SysConfigAndInfo         *ShmSysConfigAndInfo;
 struct StatusCodeData           *ShmStatusCodeData;
+static DcCommonInfo *ShmDcCommonData = NULL;
 
 bool Taskconutstring(char *src, char *taskname)
 {
@@ -191,6 +192,7 @@ void CheckSystemTaskAlive()
 {
     unsigned char lostId = CheckSystemTask(ShmSysConfigAndInfo->SysInfo.SystemPage);
     if (lostId != 0) {
+        log_error("Check task(%d) lost",lostId);
         if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemTaskLost == NO) {
            if (lostId == _SYSTEM_TASK_LOST_ITEM_MAIN)
                log_error("System task lost (CSU). ");
@@ -231,6 +233,8 @@ void main(void)
     ShmOCPP16Data = (struct OCPP16Data *)GetShmOCPP16Data();
     ShmSysConfigAndInfo = (struct SysConfigAndInfo *)GetShmSysConfigAndInfo();
     ShmStatusCodeData = (struct StatusCodeData *)GetShmStatusCodeData();	
+    ShmDcCommonData = (DcCommonInfo *)GetShmDcCommonData();
+
     MappingGunChargingInfo("CheckSystem Task");
     while(true)
     {
@@ -239,6 +243,10 @@ void main(void)
 			if (pDcChargingInfo->SystemStatus == SYS_MODE_UPDATE )
 				continue;
 		}
+        if (ShmDcCommonData->debugflag == YES) {
+            sleep(3);
+            continue;
+        }
 		CheckSystemTaskAlive();
 		sleep(3);
     }

+ 1 - 1
EVSE/Projects/DD360Tcci/Apps/ModuleChkSysTask/Module_ChkSysTask.h

@@ -52,7 +52,7 @@
 #define _SYSTEM_TASK_COUNT_INTERNALCOMM     2
 #define _SYSTEM_TASK_COUNT_EVENTLOGGING     1
 #define _SYSTEM_TASK_COUNT_PRIMARYCOMM      1
-#define _SYSTEM_TASK_COUNT_LCM              2
+#define _SYSTEM_TASK_COUNT_LCM              1
 #define _SYSTEM_TASK_COUNT_DOCOMM           1
 #define _SYSTEM_TASK_COUNT_PRODUCEUTILS     1
 #define _SYSTEM_TASK_COUNT_UPDATEFW         1

+ 36 - 337
EVSE/Projects/DD360Tcci/Apps/ModuleDoComm/DoComm.c

@@ -49,7 +49,7 @@ static struct WARNING_CODE_INFO gPreSysWarningInfo = {0};
 
 // Hexdump
 char old_Hexdump[10240];
-uint8_t psu_num= 0;
+
 //------------------------------------------------------------------------------
 static void removeFaultCodeToBuf(uint8_t *Code);
 static void addFaultCodeToBuf(uint8_t *Code);
@@ -673,6 +673,7 @@ static int miscCommandHandle(uint8_t dataLen, uint8_t plugNum, uint8_t *data)
             }
             log_info("Remote start charging plugNum = %d", plugNum);
 
+#if defined DD360Audi
             if (getSelGunWaitToAuthor(plugNum) == FAIL) {
                 log_error("Remote start gun already charging");
                 break;
@@ -686,7 +687,7 @@ static int miscCommandHandle(uint8_t dataLen, uint8_t plugNum, uint8_t *data)
                     strcpy((char *)pSysConfig->UserId, "");
                     pSysInfo->WaitForPlugit = NO;
                     sleep(1); //Jerry add
-                    pSysInfo->SystemPage = _PAGE_AUTHORIZE;
+                    pSysInfo->SystemPage = _LCM_SELECT_GUN;
                     GetClockTime(&pSysInfo->SystemTimeoutTimer, NULL);
                     pSysInfo->SystemTimeoutFlag = Timeout_None;
                 }
@@ -698,15 +699,18 @@ static int miscCommandHandle(uint8_t dataLen, uint8_t plugNum, uint8_t *data)
                     strcpy((char *)pSysConfig->UserId, "");
                     pSysInfo->WaitForPlugit = NO;
                     sleep(1); //Jerry add
-                    pSysInfo->SystemPage = _PAGE_AUTHORIZE;
+                    pSysInfo->SystemPage = _LCM_SELECT_GUN;
                     GetClockTime(&pSysInfo->SystemTimeoutTimer, NULL);
                     pSysInfo->SystemTimeoutFlag = Timeout_None;
                 }
 
-                //pSysInfo->CurGunSelected = (plugNum);
+                pSysInfo->CurGunSelected = (plugNum);
                 pSysInfo->CurGunSelectedByAc = NO_DEFINE;
             }
-
+#else
+            pSysInfo->CurGunSelected = (plugNum);
+            pSysInfo->CurGunSelectedByAc = NO_DEFINE;
+#endif //DD360Audi
             setConfirmSelGun(pSysInfo->CurGunSelected);
 
             ShmOCPP16Data->CsMsg.bits[plugNum].RemoteStartTransactionReq = YES;
@@ -724,7 +728,7 @@ static int miscCommandHandle(uint8_t dataLen, uint8_t plugNum, uint8_t *data)
 
             strcpy((char *)pSysConfig->UserId, "");
             pSysInfo->WaitForPlugit = NO;
-            pSysInfo->SystemPage = _PAGE_COMPLETE;
+            pSysInfo->SystemPage = _LCM_SELECT_GUN;
             GetClockTime(&pSysInfo->SystemTimeoutTimer, NULL);
             pSysInfo->SystemTimeoutFlag = Timeout_None;
             destroySelectGun(plugNum);
@@ -744,7 +748,7 @@ static int miscCommandHandle(uint8_t dataLen, uint8_t plugNum, uint8_t *data)
                 ClearDetectPluginFlag();
                 strcpy((char *)pSysConfig->UserId, "");
                 pSysInfo->WaitForPlugit = NO;
-                pSysInfo->SystemPage = _PAGE_COMPLETE;
+                pSysInfo->SystemPage = _LCM_SELECT_GUN;
                 GetClockTime(&pSysInfo->SystemTimeoutTimer, NULL);
                 pSysInfo->SystemTimeoutFlag = Timeout_None;
                 destroySelectGun(plugNum);
@@ -764,16 +768,7 @@ static int miscCommandHandle(uint8_t dataLen, uint8_t plugNum, uint8_t *data)
             log_info("Authorize By EVCCID:%d",pSysConfig->isAuthrizeByEVCCID);
             //clearMiscCommand();
         	break;
-        case MISC_CMD_LED_INTENSITY:
-            pSysConfig->LedInfo.Intensity = value;
-            log_info("LED Intensity:%d",pSysConfig->LedInfo.Intensity);
-            break;
-        case MISC_CMD_RESERVATION:
-            pDcChargingInfo->ReservationTrigger = value;
-            break;
-        case MISC_CMD_CHANGELCM_INFO:
-            pDcChargingInfo->ChangeLcmPage = value;
-            break;
+
         default:
             clearMiscCommand();
             break;
@@ -917,7 +912,7 @@ static int powerCabinetStatusProcess(uint8_t dataLen, uint8_t *data)
     //uint8_t statusCodeError = 0;
 
     if (dataLen > 0) {
-        //Hexdump((uint8_t *)data, dataLen);
+        Hexdump((uint8_t *)data, dataLen);
 
         remaindLen = dataLen % WARNING_CODE_SIZE;
 
@@ -928,7 +923,7 @@ static int powerCabinetStatusProcess(uint8_t dataLen, uint8_t *data)
 
         if (dataLen < WARNING_CODE_SIZE) {
             log_error("fail status code length = %d", dataLen);
-            //Hexdump(data, dataLen);
+            Hexdump(data, dataLen);
             if (pSysWarning->WarningCount > 0) {
                 for (i = 0; i < pSysWarning->WarningCount; i++) {
                     usleep(128);
@@ -998,7 +993,7 @@ static int powerCabinetStatusProcess(uint8_t dataLen, uint8_t *data)
     } else {
         if (CompareArrayIsZero(data, WARNING_CODE_SIZE) == false) {
             log_error("power cabinet status code data length is zero, but have data");
-            //Hexdump((uint8_t *)data, WARNING_CODE_SIZE);
+            Hexdump((uint8_t *)data, WARNING_CODE_SIZE);
         }
     }
 
@@ -1032,29 +1027,7 @@ static int powerCabinetStatusProcess(uint8_t dataLen, uint8_t *data)
 
     return PASS;
 }
-void GetCabientDcmRevHandle(uint8_t *data)
-{
-	PCDCMVer *pVersion = (PCDCMVer *)&data[0];
-	strcpy(ShmDcCommonData->CabinetModelName , pVersion->CabinetModelName);
-	strcpy(ShmDcCommonData->CabinetBoolLoaderVersion, pVersion->CabinetBoolLoaderVersion);
-	strcpy(ShmDcCommonData->CabinetKernelVersion , pVersion->CabinetKernelVersion);
-	strcpy(ShmDcCommonData->CabinetRFSystemVersion , pVersion->CabinetRFSystemVersion);
-	strcpy(ShmDcCommonData->CabinetPrimaryVersion , pVersion->CabinetPrimaryVersion);
-	strcpy(ShmDcCommonData->CabinetIPAddr , pVersion->CabinetIPAddr);
-}
-void GetCabientOtherRevHandle(uint8_t *data)
-{
-	PCOthVer *pVersion = (PCOthVer *)&data[0];
-	strcpy(ShmDcCommonData->CabinetRelay0Version , pVersion->CabinetRelay0Version);
-	strcpy(ShmDcCommonData->CabinetRelay1Version , pVersion->CabinetRelay1Version);
-	strcpy(ShmDcCommonData->CabinetFanVersion , pVersion->CabinetFanVersion);
-}
-void GetCabientEachPsuRevHandle(uint8_t *data)
-{
-	PCnPsuVer *pVersion = (PCnPsuVer *)&data[0];
-	strcpy(ShmDcCommonData->PsuVer[pVersion->n_PSU].DCVersion, pVersion->DCVersion);
-	strcpy(ShmDcCommonData->PsuVer[pVersion->n_PSU].FPCVersion, pVersion->FPCVersion);
-}
+
 static int responsePackeHandle(int fd, uint8_t *pResult, uint8_t plugNum, uint8_t reg)
 {
     int ret = PASS;
@@ -1196,21 +1169,7 @@ static int responsePackeHandle(int fd, uint8_t *pResult, uint8_t plugNum, uint8_
             pDcChargingInfo->GroundFaultStatus = gfd->Status;
         }
         break;
-    case REG_GET_CABINET_DCM_VERSION:
-    	GetCabientDcmRevHandle(pCsuResult->Data.Data);
-        break;
-    case REG_GET_CABINET_OTHER_VERSION:
-    	GetCabientOtherRevHandle(pCsuResult->Data.Data);
-        break;
-    case REG_GET_CABINET_PSU_NUMBER:
-        if(ShmDcCommonData->PSU_Number == 0 || ShmDcCommonData->PSU_Number != pCsuResult->Data.Data[0]) {
-            ShmDcCommonData->PSU_Number = pCsuResult->Data.Data[0];
-            log_info("PSU Numbers:%d",ShmDcCommonData->PSU_Number);
-        }
-        break;
-    case REG_GET_CABINET_PSU_VERSION:
-    	GetCabientEachPsuRevHandle(pCsuResult->Data.Data);
-        break;
+
     default:
         break;
     }
@@ -1247,13 +1206,6 @@ static int composeSocketData(int fd,
 
     //Hexdump((uint8_t *)&csuCmdPkt, sendPktLen);
 
-    // Not Let ask cabinet version trasmit into FAIL Network
-
-    if (reg == REG_GET_CABINET_DCM_VERSION || reg == REG_GET_CABINET_OTHER_VERSION ||
-    		reg == REG_GET_CABINET_PSU_NUMBER || reg == REG_GET_CABINET_PSU_VERSION) {
-    	gDoCommGblData.DisConnCount = 0;
-    }
-
     //send command packet
     if ((size = sendTcpSocket(fd, (uint8_t *)&csuCmdPkt, sendPktLen)) < 0) {
         log_error("TCP socket send packet fail = %d", size);
@@ -1465,7 +1417,6 @@ static int writeConnectorState(int fd, uint8_t plugNum, uint8_t id)
 
     pConnState->ConnectorTemp = pDcChargingInfo->ConnectorTemp;
     pConnState->ChillerTemp = pDcChargingInfo->ChillerTemp;
-    pConnState->PlugIn = pDcChargingInfo->ConnectorPlugIn;
 
     if (pDcChargingInfo->SystemStatus <= S_AUTHORIZING) {
         pConnState->State = CONN_ST_IDLE;    //idle
@@ -1474,14 +1425,14 @@ static int writeConnectorState(int fd, uint8_t plugNum, uint8_t id)
                 sizeof(ShmOCPP16Data->StatusNotification[plugNum].VendorErrorCode));
 
         strncpy(&vendorErrorCodeTmp[plugNum][0], "", WARNING_CODE_SIZE);
-
     } else if ((pDcChargingInfo->SystemStatus <= S_PREPARING_FOR_EVSE) ||
                (pDcChargingInfo->SystemStatus == S_CCS_PRECHARGE_ST0) ||
                (pDcChargingInfo->SystemStatus == S_CCS_PRECHARGE_ST1)) {
         pConnState->State = CONN_ST_PREPARING;    //preparing
     } else if (pDcChargingInfo->SystemStatus == S_CHARGING) {
         pConnState->State = CONN_ST_CHARGING;    //charging
-    } else if (pDcChargingInfo->SystemStatus == S_TERMINATING) {
+    } else if (pDcChargingInfo->SystemStatus == S_TERMINATING ||
+            pDcChargingInfo->SystemStatus == S_COMPLETE) {
         pConnState->State = CONN_ST_TERMINATING;    //terminating
     } else if ((pDcChargingInfo->SystemStatus == S_ALARM) ||
                (pDcChargingInfo->SystemStatus == S_FAULT)) {
@@ -1495,12 +1446,9 @@ static int writeConnectorState(int fd, uint8_t plugNum, uint8_t id)
                     (char *)ShmOCPP16Data->StatusNotification[plugNum].VendorErrorCode,
                     WARNING_CODE_SIZE);
             vendorErrorCodeTmp[plugNum][6] = '\0';
-            /*
-                log_info("1 ID = %d, VendorErrorCode = %s",
-                         plugNum,
-                         (char *)ShmOCPP16Data->StatusNotification[plugNum].VendorErrorCode);
-                _VenderErrorCodeFlag = true;
-            */
+            log_info("1 ID = %d, VendorErrorCode = %s",
+                     plugNum,
+                     (char *)ShmOCPP16Data->StatusNotification[plugNum].VendorErrorCode);
         } else {
             if (strncmp(&vendorErrorCodeTmp[plugNum][0],
                         (char *)ShmOCPP16Data->StatusNotification[plugNum].VendorErrorCode,
@@ -1597,59 +1545,6 @@ static int readChargingCapability(int fd, uint8_t id)
     return ret;
 }
 
-static int readCabinetDCMVersion(int fd, uint8_t id)
-{
-    int ret = PASS;
-
-    ret = composeSocketData(fd,
-                            id,
-                            OP_READ_DATA,
-                            REG_GET_CABINET_DCM_VERSION,
-                            0,
-                            NULL);
-
-    return ret;
-}
-static int readCabinetOtherVersion(int fd, uint8_t id)
-{
-    int ret = PASS;
-
-    ret = composeSocketData(fd,
-                            id,
-                            OP_READ_DATA,
-							REG_GET_CABINET_OTHER_VERSION,
-                            0,
-                            NULL);
-
-    return ret;
-}
-static int readCabinetPSUNumber(int fd, uint8_t id)
-{
-    int ret = PASS;
-
-    ret = composeSocketData(fd,
-                            id,
-                            OP_READ_DATA,
-							REG_GET_CABINET_PSU_NUMBER,
-                            0,
-                            NULL);
-
-    return ret;
-}
-static int readCabinetEachPSUVersion(int fd, uint8_t id,uint8_t n_psu)
-{
-    int ret = PASS;
-    uint8_t data_buf[0] = {0};
-    data_buf[0] = n_psu;
-    ret = composeSocketData(fd,
-                            id,
-                            OP_READ_DATA,
-							REG_GET_CABINET_PSU_VERSION,
-							sizeof(data_buf),
-							&data_buf[0]);
-
-    return ret;
-}
 static int writeDispenserStatus(int fd, uint8_t gunID)
 {
     uint8_t warningCount = 0;
@@ -1714,62 +1609,7 @@ static int readConnectorID(int fd)
 
     return ret;
 }
-static int writeShowRefundPage(int fd, uint8_t id)
-{
-    int ret = PASS;
-    DispenserRequest* pDispenserRequest = NULL;
-
-    pDispenserRequest->Command = REQ_REFUND_REQUEST;
-    pDispenserRequest->Parameter = ntohl((uint32_t)ShmDcCommonData->_RefundRequest);
-
-    if ((ret = composeSocketData(fd,
-                                 id,
-                                 OP_WRITE_DATA,
-                                 REG_DISPENSER_REQUEST,
-                                 sizeof(DispenserRequest),
-                                 (uint8_t *)pDispenserRequest)) == FAIL) {
-        return ret;
-    }
-    ShmDcCommonData->_RefundRequest = FALSE;
-    return ret;
-}
-static int writeRefundCancelPage(int fd, uint8_t id)
-{
-    int ret = PASS;
-    DispenserRequest* pDispenserRequest = NULL;
-    pDispenserRequest->Command = REQ_REFUND_CANCEL;
-    pDispenserRequest->Parameter = ntohl((uint32_t)ShmDcCommonData->_RefundCancel);
-
-    if ((ret = composeSocketData(fd,
-                                 id,
-                                 OP_WRITE_DATA,
-                                 REG_DISPENSER_REQUEST,
-                                 sizeof(DispenserRequest),
-                                 (uint8_t *)pDispenserRequest)) == FAIL) {
-        return ret;
-    }
-    ShmDcCommonData->_RefundCancel = FALSE;
-    return ret;
-}
-static int writeShowInvociePage(int fd, uint8_t id)
-{
-    int ret = PASS;
-    DispenserRequest* pDispenserRequest = NULL;
-
-    pDispenserRequest->Command = REQ_INVOICE_REQUEST;
-    pDispenserRequest->Parameter = ntohl((uint32_t)ShmDcCommonData->_InvoiceRequest);
 
-    if ((ret = composeSocketData(fd,
-                                 id,
-                                 OP_WRITE_DATA,
-                                 REG_DISPENSER_REQUEST,
-                                 sizeof(DispenserRequest),
-                                 (uint8_t *)pDispenserRequest)) == FAIL) {
-        return ret;
-    }
-    ShmDcCommonData->_InvoiceRequest = FALSE;
-    return ret;
-}
 static int WriteModelName(int fd)
 {
     int ret = PASS;
@@ -1795,45 +1635,7 @@ static int WriteModelName(int fd)
 
     return ret;
 }
-static int readRefundAmount(int fd, uint8_t id)
-{
-    int ret = PASS;
-
-    ret = composeSocketData(fd,
-                            id,
-                            OP_READ_DATA,
-                            REG_GET_REFUND_AMOUNT,
-                            0,
-                            NULL);
-
-    return ret;
-}
-static int readPrepaymentInfo(int fd, uint8_t id)
-{
-    int ret = PASS;
-
-    ret = composeSocketData(fd,
-                            id,
-                            OP_READ_DATA,
-                            REG_GET_PREPAYMOUNT_INFO,
-                            0,
-                            NULL);
-
-    return ret;
-}
-static int readPrepaymentFail(int fd, uint8_t id)
-{
-    int ret = PASS;
 
-    ret = composeSocketData(fd,
-                            id,
-                            OP_READ_DATA,
-                            REG_GET_PREPAYMOUNT_FAIL_INFO,
-                            0,
-                            NULL);
-
-    return ret;
-}
 static void calDisconnectCount(uint8_t *pValue, uint8_t maxCount)
 {
     sleep(3); //wait 1 second
@@ -1907,7 +1709,7 @@ static void checkAuthorProcess(int fd, uint8_t plugNum)
 #if defined DD360Audi
     gunID = gDoCommGblData.ConnectorID[pSysInfo->CurGunSelected];
     //gunID = gDoCommGblData.ConnectorID[plugNum];
-    if (pSysConfig->AutoAuth_Disable) {
+    if (pSysConfig->AuthorisationMode) {
         gunID = ID_REGISTER;
         ShmSelectGunInfo->PricesInfo[pSysInfo->CurGunSelected].Balance = 0.0;
     }
@@ -2109,21 +1911,7 @@ static int messageTrigger(int fd, uint8_t plugNum, uint8_t gunID, uint8_t curReg
         //    }
         //    isContinue = 0;
         //    break;
-        case REG_GET_RESERVATION_IDTAG:
-            break;
-        case REG_DISPENSER_REQUEST:
-            break;
-        case REG_GET_REMOTESTART_WITHOUTID:
-            break;
-        case REG_GET_REFUND_AMOUNT:
-            ShmDcCommonData->_ChangeLCMRequest = TRUE;
-            break;
-        case REG_GET_PREPAYMOUNT_INFO:
-            ShmDcCommonData->_ChangeLCMRequest = TRUE;
-            break;
-        case REG_GET_PREPAYMOUNT_FAIL_INFO:
-            ShmDcCommonData->_ChangeLCMRequest = TRUE;
-            break;
+
         default:
             log_error("error curReg = %x", curReg);
             gDoCommGblData.MiscCmd = 0;
@@ -2148,96 +1936,12 @@ static int messageTrigger(int fd, uint8_t plugNum, uint8_t gunID, uint8_t curReg
 //
 //    return NO;
 //}
-void TccProcess(int fd,uint8_t plugNum, uint8_t gunID)
-{
-    struct timeb AuthNowTime = {0};
-    switch (pSysInfo->SystemPage) {
-    case _PAGE_REFUNDING:
-        // To Get Refund Amount result
-        break;
-    case _PAGE_PAY_SENSING:
-        // To Get Invoice result
-        break;
-    case _PAGE_FUNCTION_SELECT:
-        if (ShmDcCommonData->_RefundRequest) {
-            ftime(&AuthNowTime);
-            if (DiffTimeb(gRegTimeUp[plugNum][REG_DISPENSER_REQUEST], AuthNowTime) > (LOOP_RETRY_TIME / 10) ||
-                    DiffTimeb(gRegTimeUp[plugNum][REG_DISPENSER_REQUEST], AuthNowTime) < 0
-               ) {
-                writeShowRefundPage(fd, gunID);
-                ftime(&gRegTimeUp[plugNum][REG_DISPENSER_REQUEST]);
-            }
-        }
-        break;
-    case _PAGE_REFUND_SENSEING:
-        if (ShmDcCommonData->_RefundCancel) {
-            ftime(&AuthNowTime);
-            if (DiffTimeb(gRegTimeUp[plugNum][REG_DISPENSER_REQUEST], AuthNowTime) > (LOOP_RETRY_TIME / 10) ||
-                    DiffTimeb(gRegTimeUp[plugNum][REG_DISPENSER_REQUEST], AuthNowTime) < 0
-               ) {
-                writeRefundCancelPage(fd, gunID);
-                ftime(&gRegTimeUp[plugNum][REG_DISPENSER_REQUEST]);
-            }
-        }
-        break;
-    case _PAGE_DONATE_SELECT:
-        if (ShmDcCommonData->_InvoiceRequest) {
-            ftime(&AuthNowTime);
-            if (DiffTimeb(gRegTimeUp[plugNum][REG_DISPENSER_REQUEST], AuthNowTime) > (LOOP_RETRY_TIME / 10) ||
-                    DiffTimeb(gRegTimeUp[plugNum][REG_DISPENSER_REQUEST], AuthNowTime) < 0
-               ) {
-                writeShowInvociePage(fd, gunID);
-                ftime(&gRegTimeUp[plugNum][REG_DISPENSER_REQUEST]);
-            }
-        }
-        break;
-    }
-}
+
 static void systemStatusProcess(int fd, uint8_t totalGun, uint8_t plugNum, uint8_t gunID)
 {
     uint8_t i = 0;
     struct timeb AuthNowTime = {0};
-
     pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(plugNum);
-    // Get Power Cabinet Version information
-
-    if (pSysConfig->ShowInformation == YES && pSysInfo->SystemPage == _PAGE_AUTHORIZE) {
-    	// Get Power Cabinet DCM Version
-        ftime(&AuthNowTime);
-        if (DiffTimeb(gRegTimeUp[plugNum][REG_GET_CABINET_DCM_VERSION], AuthNowTime) > LOOP_RETRY_TIME ||
-                DiffTimeb(gRegTimeUp[plugNum][REG_GET_CABINET_DCM_VERSION], AuthNowTime) < 0
-           ) {
-            readCabinetDCMVersion(fd, gunID);
-            ftime(&gRegTimeUp[plugNum][REG_GET_CABINET_DCM_VERSION]);
-        }
-        // Get Power Cabinet Relay and Fan Version
-		ftime(&AuthNowTime);
-		if (DiffTimeb(gRegTimeUp[plugNum][REG_GET_CABINET_OTHER_VERSION], AuthNowTime) > LOOP_RETRY_TIME ||
-				DiffTimeb(gRegTimeUp[plugNum][REG_GET_CABINET_OTHER_VERSION], AuthNowTime) < 0
-		   ) {
-			readCabinetOtherVersion(fd, gunID);
-			ftime(&gRegTimeUp[plugNum][REG_GET_CABINET_OTHER_VERSION]);
-		}
-		// Get Power Cabinet PSU Numbers
-		ftime(&AuthNowTime);
-		if (DiffTimeb(gRegTimeUp[plugNum][REG_GET_CABINET_PSU_NUMBER], AuthNowTime) > LOOP_RETRY_TIME ||
-				DiffTimeb(gRegTimeUp[plugNum][REG_GET_CABINET_PSU_NUMBER], AuthNowTime) < 0
-		   ) {
-			readCabinetPSUNumber(fd, gunID);
-			ftime(&gRegTimeUp[plugNum][REG_GET_CABINET_PSU_NUMBER]);
-		}
-		// Get Power Cabinet each PSU Version
-		if (ShmDcCommonData->PSU_Number > 0) {
-			for(i = 0 ; i < ShmDcCommonData->PSU_Number ; i++) {
-				if (DiffTimeb(gRegTimeUp[plugNum][REG_GET_CABINET_PSU_VERSION], AuthNowTime) > LOOP_RETRY_TIME ||
-						DiffTimeb(gRegTimeUp[plugNum][REG_GET_CABINET_PSU_VERSION], AuthNowTime) < 0
-				   ) {
-					readCabinetEachPSUVersion(fd, gunID,i);
-					ftime(&gRegTimeUp[plugNum][REG_GET_CABINET_PSU_VERSION]);
-				}
-			}
-		}
-    }
 
     switch (pDcChargingInfo->SystemStatus) {
     case S_IDLE:
@@ -2246,14 +1950,11 @@ static void systemStatusProcess(int fd, uint8_t totalGun, uint8_t plugNum, uint8
     case S_ALARM:
     case S_AUTHORIZING:
         checkAuthorProcess(fd, plugNum);
-        if (pDcChargingInfo->SystemStatus == S_IDLE) {
-            TccProcess( fd, plugNum,  gunID);
-        }
+
         //authorization complete, write wait plug it state
         if (ShmSelectGunInfo->PricesInfo[plugNum].Balance == FAIL_BALANCE_PRICES) {
             break;
         }
-        // For TCC Using
 
         ftime(&AuthNowTime);
         if (DiffTimeb(gRegTimeUp[plugNum][REG_WAIT_PLUG_IT_STATE], AuthNowTime) > (LOOP_RETRY_TIME / 10) ||
@@ -2409,19 +2110,17 @@ static void systemStatusProcess(int fd, uint8_t totalGun, uint8_t plugNum, uint8
         }
 
         ftime(&AuthNowTime);
-        if (pDcChargingInfo->SystemStatus != S_TERMINATING) {
-            if (DiffTimeb(gRegTimeUp[plugNum][REG_CHARGING_PERMISSION], AuthNowTime) > LOOP_RETRY_TIME ||
-                    DiffTimeb(gRegTimeUp[plugNum][REG_CHARGING_PERMISSION], AuthNowTime) < 0
-               ) {
-                if (readChargePermission(fd, gunID) == 0) {
-                    log_info("Stop charging by power cabinet's permission = %d, %d",
-                             plugNum,
-                             REG_CHARGING_PERMISSION);
-                    pDcChargingInfo->StopChargeFlag = POWER_CABINET_STOP_CHARGING;
-                    //printf("%d StopChargeFlag = %d\n", plugNum, pDcChargingInfo->StopChargeFlag);
-                }
-                ftime(&gRegTimeUp[plugNum][REG_CHARGING_PERMISSION]);
+        if (DiffTimeb(gRegTimeUp[plugNum][REG_CHARGING_PERMISSION], AuthNowTime) > LOOP_RETRY_TIME ||
+                DiffTimeb(gRegTimeUp[plugNum][REG_CHARGING_PERMISSION], AuthNowTime) < 0
+           ) {
+            if (readChargePermission(fd, gunID) == 0) {
+                log_info("Stop charging by power cabinet's permission = %d, %d",
+                         plugNum,
+                         REG_CHARGING_PERMISSION);
+                pDcChargingInfo->StopChargeFlag = POWER_CABINET_STOP_CHARGING;
+                //printf("%d StopChargeFlag = %d\n", plugNum, pDcChargingInfo->StopChargeFlag);
             }
+            ftime(&gRegTimeUp[plugNum][REG_CHARGING_PERMISSION]);
         }
         writeChargingTarget(fd, plugNum, gunID);
 

+ 1 - 44
EVSE/Projects/DD360Tcci/Apps/ModuleDoComm/DoComm.h

@@ -80,16 +80,6 @@
 #define REG_QRCODE_URL_INFO                     0X10
 #define REG_WAIT_PLUG_IT_STATE                  0x11
 #define REG_Ground_Fault_Detection              0x12
-#define REG_GET_CABINET_DCM_VERSION             0x13
-#define REG_GET_CABINET_OTHER_VERSION           0x14
-#define REG_GET_CABINET_PSU_NUMBER              0x15
-#define REG_GET_CABINET_PSU_VERSION             0x16
-#define REG_GET_RESERVATION_IDTAG               0x17
-#define REG_DISPENSER_REQUEST                   0x18
-#define REG_GET_REMOTESTART_WITHOUTID           0x19
-#define REG_GET_REFUND_AMOUNT                   0x1A
-#define REG_GET_PREPAYMOUNT_INFO                0x1B
-#define REG_GET_PREPAYMOUNT_FAIL_INFO           0x1C
 
 //------------------------------------------------------------------------------
 //--- dispenser result ---
@@ -121,22 +111,16 @@
 #define MISC_CMD_WEB_STOP_CHARGING              (0x000B)
 #define MISC_CMD_AUTH_DISABLE					(0x000C)
 #define MISC_CMD_EVCCID_ENABLE					(0x000D)
-#define MISC_CMD_LED_INTENSITY                  (0x000E)
 
 #define MISC_CMD_HARDWARE_REBOOT                (0x0101)
 #define MISC_CMD_SOFTWARE_RESTART               (0x0102)
 #define MISC_CMD_REMOTE_START_CHARGING          (0x0103)
 #define MISC_CMD_REMOTE_STOP_CHARGING           (0x0104)
 #define MISC_CMD_REMOTE_UNLOCK                  (0x0105)
-#define MISC_CMD_RESERVATION                    (0x0106)
-#define MISC_CMD_CHANGELCM_INFO                 (0x0107)
 
 #define ST_UPDATE_FIRMWARE                      (0x01)
 #define ST_NO_UPDATE_FIRMWARE                   (0x02)
 
-#define REQ_REFUND_REQUEST                      (0x0001)
-#define REQ_REFUND_CANCEL                       (0x0002)
-#define REQ_INVOICE_REQUEST                     (0x0003)
 //------------------------------------------------------------------------------
 #pragma pack(push)
 #pragma pack(1)
@@ -146,8 +130,7 @@ typedef struct StConnectorState {
     uint8_t WarningCode[6];
     uint8_t ConnectorTemp;
     uint8_t ChillerTemp;
-    uint8_t PlugIn;
-    uint8_t Reserved[2];
+    uint8_t Reserved[3];
 } ConnectorState;
 
 typedef struct StConnectorIDTable {
@@ -251,32 +234,6 @@ typedef struct StAccountInfo {
     uint8_t Reserved[3];
 } AccountInfo;
 
-typedef struct stCabinetDCMVersion {
-    uint8_t CabinetModelName[32];
-    uint8_t CabinetBoolLoaderVersion[32];
-    uint8_t CabinetKernelVersion[32];
-    uint8_t CabinetRFSystemVersion[32];
-    uint8_t CabinetPrimaryVersion[32];
-    uint8_t CabinetIPAddr[32];
-}PCDCMVer;
-
-typedef struct stCabinetOtherVersion {
-    uint8_t CabinetRelay0Version[32];
-    uint8_t CabinetRelay1Version[32];
-    uint8_t CabinetFanVersion[32];
-}PCOthVer;
-
-typedef struct stCabinetEachPsuVersion {
-	uint8_t n_PSU;
-	uint8_t DCVersion[32];
-	uint8_t FPCVersion[32];
-}PCnPsuVer;
-
-typedef struct StDispenserRequest {
-    uint16_t Command;
-    uint32_t Parameter;
-} DispenserRequest;
-
 #pragma pack(pop)
 
 #endif /* _DO_COMM_H_ */

+ 20 - 23
EVSE/Projects/DD360Tcci/Apps/ModuleEvComm/Module_EvRxComm.c

@@ -337,7 +337,7 @@ void CANReceiver(int fd)
                         log_info("Conn %d, Plugin. ", targetGun);
                         pDcChargingInfo->isEVCCIDVerify = false;
 #ifdef DD360Audi                       
-                        if (pSysConfig->EVCCID_Authorize)
+                        if (pSysConfig->isAuthrizeByEVCCID)
                             pSysInfo->CurGunSelected = targetGun;
 #endif                        
                     } else if (frame.data[0] == UNPLUG) {
@@ -346,9 +346,6 @@ void CANReceiver(int fd)
                     } else {
                         log_info("Conn %d, None Check. (%d) ", targetGun, frame.data[0]);
                     }
-                    if(pDcChargingInfo->RemoteStartFlag == YES) {
-                        pSysInfo->CurGunSelected = targetGun;
-                    }
                 }
 
                 pDcChargingInfo->ConnectorPlugIn = frame.data[0];
@@ -648,25 +645,25 @@ void CANReceiver(int fd)
                 break;
             case ACK_EVCCID_REQ:
 
-                if (frame.can_dlc > 0 && strcmp ( (char *)pDcChargingInfo->EVCCID, "" ) == EQUAL &&
-                    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 ", targetGun, pDcChargingInfo->EVCCID );
-                }
+                        if (frame.can_dlc > 0 && strcmp ( (char *)pDcChargingInfo->EVCCID, "" ) == EQUAL &&
+                            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 ************* ", targetGun, pDcChargingInfo->EVCCID );
+                        }
                 break;
             default:
                 log_info("EV board = %d, Ack none defined. intCmd = %d  ", targetGun, intCmd);

+ 29 - 30
EVSE/Projects/DD360Tcci/Apps/ModuleEvComm/Module_EvTxComm.c

@@ -302,29 +302,6 @@ static void setCurrentOutput(void)
     }
 }
 
-static void GetMaxVolAndCurMethod(uint8_t index, float *vol, float *cur)
-{
-    struct ChargingInfoData *pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(index);
-
-    if (maxChargingVol[index] != 0 && maxChargingVol[index] <= *vol) {
-        *vol = maxChargingVol[index];
-    }
-
-    if (maxChargingCur[index] != 0 && maxChargingCur[index] <= *cur) {
-        *cur = maxChargingCur[index];
-    }
-
-    if (((pDcChargingInfo->SystemStatus >= S_PREPARING_FOR_EVSE &&
-            pDcChargingInfo->SystemStatus <= S_CHARGING) ||
-            (pDcChargingInfo->SystemStatus >= S_CCS_PRECHARGE_ST0 &&
-             pDcChargingInfo->SystemStatus <= S_CCS_PRECHARGE_ST1)) &&
-            pDcChargingInfo->ChargingProfileCurrent >= 0 &&
-            pDcChargingInfo->ChargingProfileCurrent <= *cur
-       ) {
-        *cur = pDcChargingInfo->ChargingProfileCurrent;
-    }
-}
-
 static void SetPresentChargingOutputCap(void)
 {
     float pow1 = 0, cur1 = 0;
@@ -340,17 +317,17 @@ static void SetPresentChargingOutputCap(void)
         chargingData_2 = (struct ChargingInfoData *)GetDcChargingInfoData(1);
     }
 
-#if !defined DD360Tcci && !defined DD360Audi && !defined DD360ComBox && !defined DD360UCar
+#if !defined DD360Tcci && !defined DD360Audi && !defined DD360ComBox
     float vol = 0;
 #endif //!defined DD360Tcci && !defined DD360Audi
 
     pow1 = chargingData_1->AvailableChargingPower;
     cur1 = chargingData_1->AvailableChargingCurrent;
 
-#if !defined DD360Tcci && !defined DD360Audi && !defined DD360ComBox && !defined DD360UCar
+#if !defined DD360Tcci && !defined DD360Audi && !defined DD360ComBox
     vol = chargingData_1->MaximumChargingVoltage;
     GetMaxVolAndCurMethod(chargingData_1->Index, &vol, &cur1);
-    //GetMaxPowerMethod(chargingData_1->Index, &pow1);
+    GetMaxPowerMethod(chargingData_1->Index, &pow1);
 #endif //!defined DD360Tcci && !defined DD360Audi
 
     //DS60-120 add
@@ -372,10 +349,10 @@ static void SetPresentChargingOutputCap(void)
     pow2 = chargingData_2->AvailableChargingPower;
     cur2 = chargingData_2->AvailableChargingCurrent;
 
-#if !defined DD360Tcci && !defined DD360Audi && !defined DD360ComBox && !defined DD360UCar
+#if !defined DD360Tcci && !defined DD360Audi && !defined DD360ComBox
     vol = chargingData_2->MaximumChargingVoltage;
     GetMaxVolAndCurMethod(chargingData_2->Index, &vol, &cur2);
-    //GetMaxPowerMethod(chargingData_2->Index, &pow2);
+    GetMaxPowerMethod(chargingData_2->Index, &pow2);
 #endif //!defined DD360Tcci && !defined DD360Audi
 
     //DS60-120 add
@@ -425,6 +402,29 @@ static void SetPresentChargingOutputCap(void)
     SetPresentOutputCapacity(pow1, cur1, pow2, cur2);
 }
 
+static void GetMaxVolAndCurMethod(uint8_t index, float *vol, float *cur)
+{
+    struct ChargingInfoData *pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(index);
+
+    if (maxChargingVol[index] != 0 && maxChargingVol[index] <= *vol) {
+        *vol = maxChargingVol[index];
+    }
+
+    if (maxChargingCur[index] != 0 && maxChargingCur[index] <= *cur) {
+        *cur = maxChargingCur[index];
+    }
+
+    if (((pDcChargingInfo->SystemStatus >= S_PREPARING_FOR_EVSE &&
+            pDcChargingInfo->SystemStatus <= S_CHARGING) ||
+            (pDcChargingInfo->SystemStatus >= S_CCS_PRECHARGE_ST0 &&
+             pDcChargingInfo->SystemStatus <= S_CCS_PRECHARGE_ST1)) &&
+            pDcChargingInfo->ChargingProfileCurrent >= 0 &&
+            pDcChargingInfo->ChargingProfileCurrent <= *cur
+       ) {
+        *cur = pDcChargingInfo->ChargingProfileCurrent;
+    }
+}
+
 static uint8_t waitPsuVolwithRealyVol(uint8_t gunIndex)
 {
     PcPsuOutput *pPcPsuOutput = (PcPsuOutput *)&ShmDcCommonData->PcPsuOutput[gunIndex];
@@ -778,12 +778,11 @@ int main(int argc, char *argv[])
 
             switch (pDcChargingInfo->SystemStatus) {
             case S_IDLE:
-            case S_AUTHORIZING:
             case S_RESERVATION:
                 if (pDcChargingInfo->Type == _Type_Chademo) {
 
                     ClearAbnormalStatus_Chademo(gunIndex);
-                    if (pSysInfo->PageIndex == _PAGE_PLUGIN) {
+                    if (pSysInfo->PageIndex == _LCM_WAIT_FOR_PLUG) {
                         if (!chkChademoPermission[gunIndex]) {
                             chkChademoPermission[gunIndex] = true;
                             gettimeofday(&_chk_chademo_permission_timeout[gunIndex], NULL);

+ 3 - 3
EVSE/Projects/DD360Tcci/Apps/ModuleInternalComm/AcPlug.c

@@ -363,8 +363,8 @@ void AcPlugTask(int uartFD)
         } else if ((acStatus.CpStatus == AC_SYS_B || pAcChargingInfo->ConnectorPlugIn == AC_SYS_B) &&
                    pAcChargingInfo->IsAvailable &&
                    !pAcChargingInfo->IsErrorOccur &&
-                   (pSysInfo->WaitForPlugit == YES ||
-                    pSysConfig->AuthorisationMode == AUTH_MODE_DISABLE)) {
+                   (pSysInfo->WaitForPlugit == YES /*||
+                    pSysConfig->AuthorisationMode == AUTH_MODE_DISABLE*/)) {
             if (pAcChargingInfo->RemoteStartFlag == YES) {
                 log_info("** AC Remote \n");
                 pAcChargingInfo->RemoteStartFlag = NO;
@@ -409,7 +409,7 @@ void AcPlugTask(int uartFD)
         break;
         case S_PREPARNING: {
             if (isModeChange()) {
-                pSysInfo->SystemPage = _PAGE_PRECHARGE;
+                pSysInfo->SystemPage = _LCM_NONE;
                 pSysInfo->CurGunSelectedByAc = DEFAULT_AC_INDEX;
                 if (pSysInfo->OrderCharging != NO_DEFINE) {
                     pSysInfo->OrderCharging = NO_DEFINE;

+ 29 - 37
EVSE/Projects/DD360Tcci/Apps/ModuleInternalComm/RelayBoard.c

@@ -31,13 +31,12 @@ static Relay regRelay = {0};
 static int Uart5Fd = 0;
 static struct timeval gFanBoardRunTimer;
 static uint16_t _setFanSpeed = 0;
-static uint16_t fanSpeedSmoothValue = 500;
+static uint16_t fanSpeedSmoothValue = 1000;
 
 static Led_Color cur_led_color = {COLOR_MIN_LV};
 static Led_Color led_color;
 static struct timeval _led_priority_time;
 
-bool _show_GFD_Warming[2] = {TRUE};
 //static bool _isRelayWelding[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
 //static struct timeval _checkRelayWeldingTimer[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
 
@@ -143,7 +142,7 @@ static bool IsNoneMatchRelayStatus(void)
     bool result = false;
 
     if (
-#if !defined DD360Tcci && !defined DD360Audi && !defined DD360ComBox && !defined DD360UCar
+#if !defined DD360Tcci && !defined DD360Audi && !defined DD360ComBox
         (regRelay.relay_event.bits.AC_Contactor != outputRelay.relay_event.bits.AC_Contactor) ||
         (regRelay.relay_event.bits.CCS_Precharge != outputRelay.relay_event.bits.CCS_Precharge) ||
 #endif //!defined DD360Tcci && !defined DD360Audi
@@ -151,7 +150,7 @@ static bool IsNoneMatchRelayStatus(void)
         (regRelay.relay_event.bits.Gun1_N != outputRelay.relay_event.bits.Gun1_N) ||
         (regRelay.relay_event.bits.Gun2_P != outputRelay.relay_event.bits.Gun2_P) ||
         (regRelay.relay_event.bits.Gun2_N != outputRelay.relay_event.bits.Gun2_N)
-#if !defined DD360Tcci && !defined DD360Audi && !defined DD360ComBox && !defined DD360UCar
+#if !defined DD360Tcci && !defined DD360Audi && !defined DD360ComBox
         ||
         (regRelay.relay_event.bits.Gun1_Parallel_P != outputRelay.relay_event.bits.Gun1_Parallel_P) ||
         (regRelay.relay_event.bits.Gun1_Parallel_N != outputRelay.relay_event.bits.Gun1_Parallel_N)
@@ -160,7 +159,7 @@ static bool IsNoneMatchRelayStatus(void)
         result = true;
     }
 
-#if !defined DD360Tcci && !defined DD360Audi && !defined DD360ComBox && !defined DD360UCar
+#if !defined DD360Tcci && !defined DD360Audi && !defined DD360ComBox
     if (regRelay.relay_event.bits.AC_Contactor != outputRelay.relay_event.bits.AC_Contactor) {
         log_info("AC Contact Relay none match. ");
     }
@@ -198,7 +197,7 @@ static bool IsNoneMatchRelayStatus(void)
         StopCheckRelayInfo(RELAY_SMR2_N_STATUS);
     }
 
-#if !defined DD360Tcci && !defined DD360Audi && !defined DD360ComBox && !defined DD360UCar
+#if !defined DD360Tcci && !defined DD360Audi && !defined DD360ComBox
     if (regRelay.relay_event.bits.Gun1_Parallel_P != outputRelay.relay_event.bits.Gun1_Parallel_P) {
         //log_info("Parallel:D+ Relay none match. ");
         StartCheckRelayInfo(RELAY_PARA_P_STATUS, outputRelay.relay_event.bits.Gun1_Parallel_P);
@@ -219,7 +218,7 @@ static bool IsNoneMatchRelayStatus(void)
 
 static void SetParalleRelayStatus(void)
 {
-#if defined DD360Tcci || defined DD360Audi || defined DD360ComBox || defined DD360UCar
+#if defined DD360Tcci || defined DD360Audi || defined DD360ComBox
     return;
 #endif //!defined  DD360Tcci || !defined DD360Audi || !defined DD360ComBox
 
@@ -324,13 +323,12 @@ static void GetGfdAdc(void)
                 } else if (pDcChargingInfo->GroundFaultStatus == GFD_PASS ||
                            pDcChargingInfo->GroundFaultStatus == GFD_WARNING
                           ) {
-                    if (pDcChargingInfo->GroundFaultStatus == GFD_WARNING && _show_GFD_Warming[gunIndex]) {
+                    if (pDcChargingInfo->GroundFaultStatus == GFD_WARNING) {
                         log_info("GFD Warning. index = %d, Result = %d, R = %d, Vol = %d ",
                                  gunIndex,
                                  pDcChargingInfo->GroundFaultStatus,
                                  gfd_adc.Resister_conn1,
                                  gfd_adc.voltage_conn1);
-                        _show_GFD_Warming[gunIndex] = FALSE;
                     }
                 }
             } else if (targetID == 0x02) {
@@ -347,13 +345,12 @@ static void GetGfdAdc(void)
                 } else if (pDcChargingInfo->GroundFaultStatus == GFD_PASS ||
                            pDcChargingInfo->GroundFaultStatus == GFD_WARNING
                           ) {
-                    if (pDcChargingInfo->GroundFaultStatus == GFD_WARNING && _show_GFD_Warming[gunIndex]) {
+                    if (pDcChargingInfo->GroundFaultStatus == GFD_WARNING) {
                         log_info("GFD Warning. index = %d, Result = %d, R = %d, Vol = %d ",
                                  gunIndex,
                                  pDcChargingInfo->GroundFaultStatus,
                                  gfd_adc.Resister_conn1,
                                  gfd_adc.voltage_conn1);
-                        _show_GFD_Warming[gunIndex] = FALSE;
                     }
                 }
             }
@@ -602,7 +599,7 @@ void SetK1K2RelayStatus(uint8_t index)
         break;
 
     case S_CCS_PRECHARGE_ST0:
-#if defined DD360Tcci || defined DD360Audi || defined DD360ComBox || defined DD360UCar
+#if defined DD360Tcci || defined DD360Audi || defined DD360ComBox
         break;
 #endif //defined DD360Tcci || defined DD360Audi || defined DD360ComBox
 
@@ -620,7 +617,7 @@ void SetK1K2RelayStatus(uint8_t index)
         break;
 
     case S_CCS_PRECHARGE_ST1:
-#if defined DD360Tcci || defined DD360Audi || defined DD360ComBox || defined DD360UCar
+#if defined DD360Tcci || defined DD360Audi || defined DD360ComBox
         break;
 #endif //defined DD360Tcci || defined DD360Audi || defined DD360ComBox
 
@@ -656,7 +653,7 @@ void CheckK1K2RelayOutput(uint8_t index)
         }
 
         if (pDcChargingInfo->Type == _Type_CCS_2) {
-#if !defined DD360Tcci && !defined DD360Audi && !defined DD360ComBox && !defined DD360UCar
+#if !defined DD360Tcci && !defined DD360Audi && !defined DD360ComBox
             if (regRelay.relay_event.bits.Gun1_N == YES && regRelay.relay_event.bits.CCS_Precharge == YES) {
                 pDcChargingInfo->RelayKPK2Status = YES;
             } else {
@@ -681,7 +678,7 @@ void CheckK1K2RelayOutput(uint8_t index)
         }
 
         if (pDcChargingInfo->Type == _Type_CCS_2) {
-#if !defined DD360Tcci && !defined DD360Audi && !defined DD360ComBox && !defined DD360UCar
+#if !defined DD360Tcci && !defined DD360Audi && !defined DD360ComBox
             if (regRelay.relay_event.bits.Gun2_N == YES &&
                     regRelay.relay_event.bits.CCS_Precharge == YES) {
                 pDcChargingInfo->RelayKPK2Status = YES;
@@ -699,7 +696,7 @@ void CheckK1K2RelayOutput(uint8_t index)
         break;
     }
 
-#if !defined DD360Tcci && !defined DD360Audi && !defined DD360ComBox && !defined DD360UCar
+#if !defined DD360Tcci && !defined DD360Audi && !defined DD360ComBox
     //DS60-120 add
     if (pSysInfo->BridgeRelayStatus == YES) {
         if (regRelay.relay_event.bits.Gun1_Parallel_N == NO &&
@@ -801,7 +798,7 @@ void CableCheckDetected(uint8_t index)
 void GetRelayOutputStatus(void)
 {
     if (Query_Relay_Output(Uart5Fd, ADDR_RELAY, &regRelay) == PASS) {
-#if !defined DD360Tcci && !defined DD360Audi && !defined DD360ComBox && !defined DD360UCar
+#if !defined DD360Tcci && !defined DD360Audi && !defined DD360ComBox
         regRelay.relay_event.bits.AC_Contactor = pSysInfo->AcContactorStatus;
 #endif //!defined DD360Tcci && !defined DD360Audi
     }
@@ -1053,7 +1050,7 @@ void GetPersentOutputVol(void)
 
         switch (targetID) {
         case 0x01:
-#if defined DD360Tcci || defined DD360Audi || defined DD360ComBox || defined DD360UCar
+#if defined DD360Tcci || defined DD360Audi || defined DD360ComBox
             pDcChargingInfo->FireChargingVoltage = ShmRelayModuleData->Gun1RelayOutputVolt;
             pDcChargingInfo->PresentChargingCurrent = ((float)ShmRelayModuleData->Gun1FuseOutputVolt) / 10;
             pDcChargingInfo->PresentChargingVoltage = ((float)pDcChargingInfo->FireChargingVoltage) / 10;
@@ -1240,7 +1237,7 @@ static void GetFanSpeed(void)
 
 static void GetFanSpeedByFunction(void)
 {
-    if (pSysConfig->SwitchDebugFlag == YES) {
+    if (ShmDcCommonData->debugflag== YES) {
         return;
     }
 
@@ -1463,6 +1460,7 @@ static void SetLedColor(void)
     static uint8_t _checkLedChanged = 3;
     struct ChargingInfoData *chargingData_1 = NULL;
     struct ChargingInfoData *chargingData_2 = NULL;
+    uint8_t _colorBuf = COLOR_MAX_LV * LED_INTENSITY_BRIGHTEST;
 
     if (pSysConfig->TotalConnectorCount == 1) {
         chargingData_1 = (struct ChargingInfoData *)GetDcChargingInfoData(0);
@@ -1471,14 +1469,11 @@ static void SetLedColor(void)
         chargingData_1 = (struct ChargingInfoData *)GetDcChargingInfoData(0);
         chargingData_2 = (struct ChargingInfoData *)GetDcChargingInfoData(1);
     }
-    uint8_t _colorBuf = COLOR_MAX_LV * LED_INTENSITY_BRIGHTEST;
 
     if (pSysConfig->LedInfo.Intensity == _LED_INTENSITY_DARKEST) {
         _colorBuf = COLOR_MAX_LV * LED_INTENSITY_DARKEST;
     } else if (pSysConfig->LedInfo.Intensity == _LED_INTENSITY_MEDIUM) {
         _colorBuf = COLOR_MAX_LV * LED_INTENSITY_MEDIUM;
-    } else if (pSysConfig->LedInfo.Intensity == LED_INTENSITY_BRIGHTEST) {
-        _colorBuf = COLOR_MAX_LV * LED_INTENSITY_BRIGHTEST;
     }
 
     //printf("chargingData_1->SystemStatus=%d\n",chargingData_1->SystemStatus);
@@ -1539,7 +1534,8 @@ static void SetLedColor(void)
         } else {
             if (chargingData_1->SystemStatus == S_BOOTING ||
                     chargingData_1->SystemStatus == S_IDLE ||
-                    chargingData_1->SystemStatus == S_RESERVATION) {
+                    chargingData_1->SystemStatus == S_RESERVATION ||
+                    chargingData_1->SystemStatus == S_MAINTAIN) {
 
                 if (chargingData_1->IsAvailable == NO) { //For Audi
                     led_color.Connect_1_Green = COLOR_MIN_LV;
@@ -1563,9 +1559,7 @@ static void SetLedColor(void)
                 led_color.Connect_1_Green = COLOR_MIN_LV;
                 led_color.Connect_1_Blue = _colorBuf;
                 led_color.Connect_1_Red = COLOR_MIN_LV;
-            }else if ( chargingData_1->SystemStatus == S_UPDATE ||
-                    chargingData_1->SystemStatus == S_MAINTAIN ||
-                    chargingData_1->SystemStatus == S_ALARM ) {
+            }else if ( chargingData_1->SystemStatus == S_UPDATE ) {
                 led_color.Connect_1_Green = COLOR_MIN_LV;
                 led_color.Connect_1_Blue = COLOR_MIN_LV;
                 led_color.Connect_1_Red = _colorBuf;
@@ -1575,7 +1569,8 @@ static void SetLedColor(void)
             // --------------------------------------------------------------------------
             if (chargingData_2->SystemStatus == S_BOOTING ||
                     chargingData_2->SystemStatus == S_IDLE ||
-                    chargingData_2->SystemStatus == S_RESERVATION ) {
+                    chargingData_2->SystemStatus == S_RESERVATION ||
+                    chargingData_2->SystemStatus == S_MAINTAIN) {
                 if (chargingData_2->IsAvailable == NO) {
                     led_color.Connect_2_Green = COLOR_MIN_LV;
                     led_color.Connect_2_Blue = COLOR_MIN_LV;
@@ -1598,9 +1593,7 @@ static void SetLedColor(void)
                 led_color.Connect_2_Green = COLOR_MIN_LV;
                 led_color.Connect_2_Blue = _colorBuf;
                 led_color.Connect_2_Red = COLOR_MIN_LV;
-            }else if ( chargingData_2->SystemStatus == S_UPDATE ||
-                    chargingData_2->SystemStatus == S_MAINTAIN ||
-                    chargingData_2->SystemStatus == S_ALARM) {
+            }else if ( chargingData_2->SystemStatus == S_UPDATE ) {
                 led_color.Connect_2_Green = COLOR_MIN_LV;
                 led_color.Connect_2_Blue = COLOR_MIN_LV;
                 led_color.Connect_2_Red = _colorBuf;
@@ -1631,7 +1624,7 @@ static void LEDBoardSelfTest(void)
         return;
     }
 
-#if defined DD360Tcci ||defined DD360Audi || defined DD360UCar
+#if defined DD360Tcci ||defined DD360Audi
     GetFwAndHwVersion_Led();
     sleep(1);
     gettimeofday(&_led_priority_time, NULL);
@@ -1660,7 +1653,7 @@ static void LEDBoardProcess(void)
     if (ShmLedModuleData->SelfTest_Comp == NO) {
         return;
     }
-    pSysConfig->LedInfo.Intensity = LED_INTENSITY_BRIGHTEST;
+
     if (GetTimeoutValue(_led_priority_time) / 1000 >= 1000) {
 
         //if (pSysConfig->TotalConnectorCount == 1) {
@@ -1747,7 +1740,7 @@ void RelayBoardTask(int uartFD)
                 // 輸出電壓
                 GetPersentOutputVol();
 
-    #if !defined DD360Tcci && !defined DD360Audi && !defined DD360ComBox && !defined DD360UCar
+    #if !defined DD360Tcci && !defined DD360Audi && !defined DD360ComBox
                 // 三相輸入電壓
                 GetPresentInputVol();
     #endif //!defined DD360Tcci && !defined DD360Audi
@@ -1771,7 +1764,7 @@ void RelayBoardTask(int uartFD)
                     // 依據當前各槍的狀態選擇 搭上/放開 Relay
                     SetK1K2RelayStatus(i);
 
-#if !defined DD360Tcci && !defined DD360Audi && !defined DD360ComBox && !defined DD360UCar
+#if !defined DD360Tcci && !defined DD360Audi && !defined DD360ComBox
                     if (pSysConfig->PhaseLossPolicy == YES) {
                         CheckPhaseLossStatus(i);
                     }
@@ -1785,7 +1778,6 @@ void RelayBoardTask(int uartFD)
                         //pDcChargingInfo->RelayWeldingCheck = NO;
                         //_isRelayWelding[i] = NO;
                         _isOvpChkTimeFlag[i] = NO;
-                        _show_GFD_Warming[i] = TRUE;
                         //ResetDetAlarmStatus(i); //DS60-120 add
                     }
 
@@ -1795,8 +1787,8 @@ void RelayBoardTask(int uartFD)
                             (pDcChargingInfo->SystemStatus >= S_CCS_PRECHARGE_ST0 &&
                              pDcChargingInfo->SystemStatus <= S_CCS_PRECHARGE_ST1) ||
                             pSysInfo->WaitForPlugit == YES ||
-                            (pSysInfo->PageIndex >=  _PAGE_AUTHORIZE &&
-                             pSysInfo->PageIndex <= _PAGE_PLUGIN)
+                            (pSysInfo->PageIndex >= _LCM_AUTHORIZING &&
+                             pSysInfo->PageIndex <= _LCM_WAIT_FOR_PLUG)
                        ) {
                         pDcChargingInfo->IsReadyToCharging = YES;
                         isCharging = true;

+ 1 - 1
EVSE/Projects/DD360Tcci/Apps/ModuleInternalComm/internalComm.h

@@ -15,7 +15,7 @@
 //address
 #define ADDR_AUX                                (0x01)
 #define ADDR_FAN                                (0x02)
-#if defined DD360Tcci || defined DD360Audi || defined DD360ComBox || defined DD360UCar
+#if defined DD360Tcci || defined DD360Audi || defined DD360ComBox
 #define ADDR_RELAY                              (0x09)
 #else
 #define ADDR_RELAY                              (0x03)

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 634 - 309
EVSE/Projects/DD360Tcci/Apps/ModuleLcmCtrl/Module_LcmControl.c


+ 30 - 314
EVSE/Projects/DD360Tcci/Apps/ModuleLcmCtrl/Module_LcmControl.h

@@ -1,12 +1,7 @@
 #ifndef MODULE_LCM_CTRL_H_
 #define MODULE_LCM_CTRL_H_
-#include <stdint.h>
-#include <stdbool.h>
-#include "../Define/define.h"
 
 //------------------------------------------------------------------------------
-
-#define RETURNIDLE_Timeout					30
 #define DEFAULT_AC_INDEX                        (2)
 
 #define TIME_MAX_SEC                            (2592000) // 一個月,秒數
@@ -23,318 +18,39 @@
 #define CMD_BACKLIGHT                           (0x01)
 #define CMD_REGISTER                            (0x03)
 
-#define CMD_HEADER_1                        0x5A
-#define CMD_HEADER_2                        0xA5
-#define CMD_REG_WRITE                       0x80
-#define CMD_REG_READ                        0x81
-#define CMD_REG_WRITE_DATA                  0x82
-#define CMD_REG_READ_DATA                   0x83
-
-#define REG_ADDRESS_READ_VERSION            0x0F
-#define REG_ADDRESS_READ_RTC                0x10
-#define REG_ADDRESS_READ_PAGE_ID            0x14
-#define REG_ADDRESS_READ_BRIGHTNESS         0x31
-#define REG_ADDRESS_WRITE_BRIGHTNESS        0X82
-#define REG_ADDRESS_SET_PAGE_ID             0x84
-#define REG_ADDRESS_SET_RTC                 0x9C
-#define REG_TYPE_CONTROL                    0x00
-#define REG_TYPE_RAM                        0x01
-#define REG_TYPE_SPECIAL_CONTROL            0x02
-
-#define _CHANGE_REMOTESTART     0x01
-#define _CHANGE_REFUNDING       0x02
-#define _CHANGE_REFUNDAMOUNT    0x03
-#define _CHANGE_NOREFUND        0x04
-#define _CHANGE_PREPAYMENTINFO  0x05
-#define _CHANGE_PAYMENT_OK      0x06
-#define _CHANGE_PAYMENT_FAIL    0x07
-
+#define CMD_HEADER_1						0x5A
+#define CMD_HEADER_2						0xA5
+#define CMD_REG_WRITE						0x80
+#define CMD_REG_READ						0x81
+#define CMD_REG_WRITE_DATA					0x82
+#define CMD_REG_READ_DATA					0x83
+
+#define REG_ADDRESS_READ_VERSION			0x0F
+#define REG_ADDRESS_READ_RTC				0x10
+#define REG_ADDRESS_READ_PAGE_ID			0x14
+#define REG_ADDRESS_READ_BRIGHTNESS       	0x31
+#define REG_ADDRESS_WRITE_BRIGHTNESS		0X82
+#define REG_ADDRESS_SET_PAGE_ID				0x84
+#define REG_ADDRESS_SET_RTC					0x9C
+
+//=======================================
+// Register Control type
+//=======================================
+#define REG_TYPE_CONTROL					0x00
+#define REG_TYPE_RAM						0x01
+#define REG_TYPE_SPECIAL_CONTROL			0x02
 
 //#define NOODOE_QR_CODE_URL                    "https://ev-alpha-test.noodoe.com/station?id=" ////For Audi
-#define _StatuIcon				0x1000
-#define	_TccareIcon				0x1004
-#define _StartTouchIcon			0x1006
-#define _FurthureIcon			0x1010
-#define _WeatherIcon			0x1012
-#define	_WelcomeIcon			0x1014
-#define _QRCodeIcon				0x1016
-#define _ExclamIcon				0x1018
-#define _PluginIcon				0x101A
-#define _PlugoutIcon			0x101C
-#define _ReturnIcon				0x101E
-#define _PrechargeIcon			0x1020
-#define _MinuteIcon				0x1026
-#define _Rate13Icon				0x1028
-#define _CompleteIcon			0x102A
-#define _KgIcon					0x102C
-#define _Rate14Icon				0x102E
-#define _ExitIcon				0x1030
-#define _FarewellIcon			0x1032
-#define _ChargingIcon			0x1034
-// Circle Battery Setting Icon
-#define _Battery_Circle			0x1036
-// Energy Bar
-#define _EnergyBar				0x1038
-// Prepare Bar
-#define _PrepareBar				0x103A
-
-// QRCode
-#define _QRCode_Authorize		0x1040
-#define _QRCode_Replug			0x1050
-#define _QRCode_Complete		0x1060
-
-#define _LeftGun_status			0x1070
-#define _RightGun_status		0x1072
-// Touch
-#define _Touch_LeftGun			0x1080
-#define _Touch_RightGun			0x1082
-#define _Touch_Return			0x1084
-#define _Touch_IDLE				0x1086
-// Text String
-#define _Text_Power				0x1090
-#define _Text_Time				0x10A0
-#define _Text_Energy			0x10B0
-#define _Text_Money				0x10C0
-#define _Text_BatterySoc		0x10D0
-#define _Text_Carbon			0x10E0
-
-// ICON Map Address
-enum _LCM_TCC_INDEX {
-    _LCM_NONE                   = 0x00,
-    _LCM_INIT,
-    _LCM_AUTHORIZE_LEFT,
-    _LCM_PLUGIN_LEFT,
-    _LCM_PRECHARGE_LEFT,
-    _LCM_CHARGING_LEFT,
-    _LCM_COMPLETE_LEFT,
-    _LCM_FUNCTION_SELECT_LEFT,
-    _LCM_REFUND_SENSEING_LEFT,
-    _LCM_REFUNDING_LEFT,
-    _LCM_REFUND_COMPLETE_LEFT,
-    _LCM_REFUND_NONE_LEFT,
-    _LCM_MEMBER_SELECT_LEFT,
-    _LCM_MEMBER_QR_LFET,
-    _LCM_DONATE_LEFT,
-    _LCM_DONATE_SELECT_LEFT,
-    _LCM_PAY_SENSING_LEFT,
-    _LCM_PAY_ETICKET_SUCCESS_LEFT,
-    _LCM_PAY_MPAY_SUCCESS_LEFT,
-    _LCM_PAY_FAIL_LEFT,
-    _LCM_AUTHORIZE_RIGHT         = 32,
-    _LCM_PLUGIN_RIGHT,
-    _LCM_PRECHARGE_RIGHT,
-    _LCM_CHARGING_RIGHT,
-    _LCM_COMPLETE_RIGHT,
-    _LCM_FUNCTION_SELECT_RIGHT,
-    _LCM_REFUND_SENSEING_RIGHT,
-    _LCM_REFUNDING_RIGHT,
-    _LCM_REFUND_COMPLETE_RIGHT,
-    _LCM_REFUND_NONE_RIGHT,
-    _LCM_MEMBER_SELECT_RIGHT,
-    _LCM_MEMBER_QR_RIGHT,
-    _LCM_DONATE_RIGHT,
-    _LCM_DONATE_SELECT_RIGHT,
-    _LCM_PAY_SENSING_RIGHT,
-    _LCM_PAY_ETICKET_SUCCESS_RIGHT,
-    _LCM_PAY_MPAY_SUCCESS_RIGHT,
-    _LCM_PAY_FAIL_RIGHT,
-};
-
-enum _ICON_LIST_ {
-    _ICON_Empty 			= 0,
-	_ICON_StatusInit,
-	_ICON_StatusAuthorize,
-	_ICON_StatusCharge,
-	_ICON_StatusComplete,
-	_ICON_AllIdle,
-	_ICON_LeftGunSelect,
-	_ICON_RightGunSelect,
-	_ICON_AllSelect,
-	_ICON_TCCare,
-	_ICON_StartTouch,
-
-	_ICON_Furthure 			= 15,
-	_ICON_Weather,
-	_ICON_Welcome,
-	_ICON_QRCode,
-	_ICON_exclamation,
-	_ICON_plugin,
-	_ICON_Plugout,
-	_ICON_Return,
-	_ICON_PrepareCharge,
+#define NOODOE_QR_CODE_URL                      "https://ev.noodoe.com/station?id=" ////For Audi
 
-	_ICON_min 				= 26,
-	_ICON_Rate_13,
-	_ICON_Complete,
-	_ICON_kg,
-	_ICON_Rate_14,
-	_ICON_Exit,
-	_ICON_HaveANiceDay,
-	_ICON_HaveANiceTrip,
-	_ICON_SaftDrive,
-	_ICON_Charging,
-
-	_ICON_Battery_0 		= 40,
-	_ICON_Battery_1,
-	_ICON_Battery_2,
-	_ICON_Battery_3,
-	_ICON_Battery_4,
-	_ICON_Battery_5,
-	_ICON_Battery_6,
-	_ICON_Battery_7,
-	_ICON_Battery_8,
-	_ICON_Battery_9,
-	_ICON_Battery_10,
-	_ICON_Battery_11,
-	_ICON_Battery_12,
-	_ICON_Battery_13,
-	_ICON_Battery_14,
-	_ICON_Battery_15,
-	_ICON_Battery_16,
-	_ICON_Battery_17,
-	_ICON_Battery_18,
-	_ICON_Battery_19,
-	_ICON_Battery_20,
-	_ICON_Battery_21,
-	_ICON_Battery_22,
-	_ICON_Battery_23,
-	_ICON_Battery_24,
-	_ICON_Battery_25,
-	_ICON_Battery_26,
-	_ICON_Battery_27,
-	_ICON_Battery_28,
-	_ICON_Battery_29,
-	_ICON_Battery_30,
-	_ICON_Battery_31,
-	_ICON_Battery_32,
-	_ICON_Battery_33,
-	_ICON_Battery_34,
-	_ICON_Battery_35,
-	_ICON_Bar_1,
-	_ICON_Bar_2,
-	_ICON_Bar_3,
-	_ICON_Bar_4,
-	_ICON_Bar_5,
-	_ICON_Bar_6,
-	_ICON_Bar_7,
-	_ICON_Bar_8,
-	_ICON_Bar_9,
-	_ICON_Bar_10,
-	_ICON_PrePare_1,
-	_ICON_PrePare_2,
-	_ICON_PrePare_3,
-	_ICON_PrePare_4,
-	_ICON_PrePare_5,
-	_ICON_PrePare_6,
-	_ICON_PrePare_7,
-	_ICON_PrePare_8,
-	_ICON_PrePare_9,
-	_ICON_PrePare_10,
-	_ICON_PrePare_11,
-	_ICON_PrePare_12,
-	_ICON_PrePare_13,
-	_ICON_PrePare_14,
-	_ICON_Left_CCS1_Off,
-	_ICON_Left_CCS2_Off,
-	_ICON_Left_CHAdeMO_Off,
-	_ICON_Left_CCS1_ON,
-	_ICON_Left_CCS2_ON,
-	_ICON_Left_CHAdeMO_ON,
-	_ICON_Right_CCS1_Off,
-	_ICON_Right_CCS2_Off,
-	_ICON_Right_CHAdeMo_Off,
-	_ICON_Right_CCS1_ON,
-	_ICON_Right_CCS2_ON,
-	_ICON_Right_CHAdeMO_ON,
+//------------------------------------------------------------------------------
+enum _BATTERY_LEVEL_FOR_MAP {
+    _BATTERY_LEVEL_FOR_MAP_EMP = 0x00,
+    _BATTERY_LEVEL_FOR_MAP_LV1 = 0x01,
+    _BATTERY_LEVEL_FOR_MAP_LV2 = 0x02,
+    _BATTERY_LEVEL_FOR_MAP_LV3 = 0x03,
+    _BATTERY_LEVEL_FOR_MAP_LV4 = 0x04,
+    _BATTERY_LEVEL_FOR_MAP_LV5 = 0x05,
 };
 
-
-/* Show Version */
-
-#define _Version_Cabient_Name_Text          0x0500
-#define _Version_Cabient_BootLoader_Text    0x0510
-#define _Version_Cabient_Kernel_Text        0x0520
-#define _Version_Cabient_CSU_Text           0x0530
-#define _Version_Cabient_Priamry_Text       0x0540
-#define _Version_Cabient_Relay0_Text        0x0550
-#define _Version_Cabient_Relay1_Text        0x0560
-#define _Version_Cabient_Fan_Text           0x0570
-#define _Version_Cabient_IPAddr_Text        0x0580
-#define _Version_Cabient_PSU1_Text          0x0590
-#define _Version_Cabient_PSU2_Text          0x05A0
-#define _Version_Cabient_PSU3_Text          0x05B0
-#define _Version_Cabient_PSU4_Text          0x05C0
-#define _Version_Cabient_PSU5_Text          0x05D0
-#define _Version_Cabient_PSU6_Text          0x05E0
-#define _Version_Cabient_PSU7_Text          0x05F0
-#define _Version_Cabient_PSU8_Text          0x0600
-#define _Version_Cabient_PSU9_Text          0x0610
-#define _Version_Cabient_PSU10_Text         0x0620
-#define _Version_Cabient_PSU11_Text         0x0630
-#define _Version_Cabient_PSU12_Text         0x0640
-
-#define _Version_Cabient_Primary_Text       0x0920
-#define _Version_Cabient_Secondary_Text     0x0930
-
-#define _Version_Cabient_Model_value        0x0650
-#define _Version_Cabient_BootLoader_value   0x0660
-#define _Version_Cabient_Kernel_value       0x0670
-#define _Version_Cabient_CSU_value          0x0680
-#define _Version_Cabient_Priamry_value      0x0690
-#define _Version_Cabient_Relay0_value       0x06A0
-#define _Version_Cabient_Relay1_value       0x06B0
-#define _Version_Cabient_Fan_value          0x06C0
-#define _Version_Cabient_IPAddr_value       0x06D0
-#define _Version_Cabient_PSU_Prim1_value    0x06E0
-#define _Version_Cabient_PSU_Prim2_value    0x06F0
-#define _Version_Cabient_PSU_Prim3_value    0x0700
-#define _Version_Cabient_PSU_Prim4_value    0x0710
-#define _Version_Cabient_PSU_Prim5_value    0x0720
-#define _Version_Cabient_PSU_Prim6_value    0x0730
-#define _Version_Cabient_PSU_Sec1_value     0x0740
-#define _Version_Cabient_PSU_Sec2_value     0x0750
-#define _Version_Cabient_PSU_Sec3_value     0x0760
-#define _Version_Cabient_PSU_Sec4_value     0x0770
-#define _Version_Cabient_PSU_Sec5_value     0x0780
-#define _Version_Cabient_PSU_Sec6_value     0x0790
-
-#define _Version_Cabient_PSU_Prim7_value    0x09E0
-#define _Version_Cabient_PSU_Prim8_value    0x09F0
-#define _Version_Cabient_PSU_Prim9_value    0x1000
-#define _Version_Cabient_PSU_Prim10_value   0x1010
-#define _Version_Cabient_PSU_Prim11_value   0x1020
-#define _Version_Cabient_PSU_Prim12_value   0x1030
-#define _Version_Cabient_PSU_Sec7_value     0x1040
-#define _Version_Cabient_PSU_Sec8_value     0x1050
-#define _Version_Cabient_PSU_Sec9_value     0x1060
-#define _Version_Cabient_PSU_Sec10_value    0x1070
-#define _Version_Cabient_PSU_Sec11_value    0x1080
-#define _Version_Cabient_PSU_Sec12_value    0x1090
-
-#define _Version_Dispenser_Name_Text        0x07A0
-#define _Version_Dispenser_BootLoader_Text  0x07B0
-#define _Version_Dispenser_Kernel_Text      0x07C0
-#define _Version_Dispenser_CSU_Text         0x07D0
-#define _Version_Dispenser_Relay_Text       0x07E0
-#define _Version_Dispenser_Fan_Text         0x07F0
-#define _Version_Dispenser_Priamry_Text     0x0800
-#define _Version_Dispenser_LCM_Text         0x0810
-#define _Version_Dispenser_LED_Text         0x0820
-#define _Version_Dispenser_Connector0_Text  0x0830
-#define _Version_Dispenser_Connector1_Text  0x0840
-#define _Version_Dispenser_IPAddr_Text      0x0850
-
-#define _Version_Dispenser_Model_value      0x0860
-#define _Version_Dispenser_BootLoader_value 0x0870
-#define _Version_Dispenser_Kernel_value     0x0880
-#define _Version_Dispenser_CSU_value        0x0890
-#define _Version_Dispenser_Relay_value      0x08A0
-#define _Version_Dispenser_Fan_value        0x08B0
-#define _Version_Dispenser_Priamry_value    0x08C0
-#define _Version_Dispenser_LCM_value        0x08D0
-#define _Version_Dispenser_LED_value        0x08E0
-#define _Version_Dispenser_Connector0_value 0x08F0
-#define _Version_Dispenser_Connector1_value 0x0900
-#define _Version_Dispenser_IPAddr_value     0x0910
-
 #endif //MODULE_LCM_CTRL_H_

+ 222 - 18
EVSE/Projects/DD360Tcci/Apps/ModulePrimary/Module_PrimaryComm.c

@@ -44,6 +44,7 @@ static struct SysInfoData *pSysInfo = NULL;
 static struct AlarmCodeData *pAlarmCode = NULL;
 static struct FaultCodeData *pFaultCode = NULL;
 static struct PrimaryMcuData *ShmPrimaryMcuData;
+static DcCommonInfo *ShmDcCommonData = NULL;
 
 const char *priPortName = "/dev/ttyS1";
 uint8_t gun_count; //DS60-120 add
@@ -53,6 +54,108 @@ uint8_t Door_count = 0;
 uint8_t EmgBtn_flag = 0;
 uint8_t Door_flag = 0;
 
+//struct ChargingInfoData *ChargingData[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
+
+//------------------------------------------------------------------------------
+/*int StoreLogMsg(const char *fmt, ...)
+{
+    char Buf[4096 + 256];
+    char buffer[4096];
+    va_list args;
+    struct timeb  SeqEndTime;
+    struct tm *tm;
+
+    va_start(args, fmt);
+    int rc = vsnprintf(buffer, sizeof(buffer), fmt, args);
+    va_end(args);
+
+    memset(Buf, 0, sizeof(Buf));
+    ftime(&SeqEndTime);
+    SeqEndTime.time = time(NULL);
+    tm = localtime(&SeqEndTime.time);
+
+    if (pSysConfig->SwitchDebugFlag == YES) {
+        sprintf(Buf, "%02d:%02d:%02d:%03d - %s",
+                tm->tm_hour, tm->tm_min, tm->tm_sec, SeqEndTime.millitm, buffer);
+        printf("%s ", Buf);
+    } else {
+        sprintf(Buf, "echo \"%04d-%02d-%02d %02d:%02d:%02d:%03d - %s\" >> /Storage/SystemLog/[%04d.%02d]SystemLog",
+                tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec, SeqEndTime.millitm,
+                buffer,
+                tm->tm_year + 1900, tm->tm_mon + 1);
+        system(Buf);
+    }
+
+    return rc;
+}
+*/
+
+#if 0 //non use
+int DiffTimeb(struct timeb ST, struct timeb ET)
+{
+    //return milli-second
+    unsigned int StartTime, StopTime;
+
+    StartTime = (unsigned int)ST.time;
+    StopTime = (unsigned int)ET.time;
+    return (StopTime - StartTime) * 1000 + ET.millitm - ST.millitm;
+}
+
+//=================================
+// Common routine
+//=================================
+char *getTimeString(void)
+{
+    char *result = malloc(21);
+    time_t timep;
+    struct tm *p;
+    time(&timep);
+    p = gmtime(&timep);
+
+    sprintf(result, "[%04d-%02d-%02d %02d:%02d:%02d]",
+            (1900 + p->tm_year),
+            (1 + p->tm_mon),
+            p->tm_mday,
+            p->tm_hour,
+            p->tm_hour,
+            p->tm_sec);
+
+    return result;
+}
+#endif //0
+
+//==========================================
+// Init all share memory
+//==========================================
+/*int InitShareMemory()
+{
+    int result = PASS;
+    int MeterSMId;
+
+    //creat ShmSysConfigAndInfo
+    if ((MeterSMId = shmget(ShmSysConfigAndInfoKey, sizeof(struct SysConfigAndInfo),  0777)) < 0) {
+        result = FAIL;
+    } else if ((ShmSysConfigAndInfo = shmat(MeterSMId, NULL, 0)) == (void *) - 1) {
+        result = FAIL;
+    }
+
+    //creat ShmStatusCodeData
+    if ((MeterSMId = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData),  0777)) < 0) {
+        result = FAIL;
+    } else if ((ShmStatusCodeData = shmat(MeterSMId, NULL, 0)) == (void *) - 1) {
+        result = FAIL;
+    }
+
+    //creat ShmStatusCodeData
+    if ((MeterSMId = shmget(ShmPrimaryMcuKey, sizeof(struct PrimaryMcuData), 0777)) < 0) {
+        result = FAIL;
+    } else if ((ShmPrimaryMcuData = shmat(MeterSMId, NULL, 0)) == (void *) - 1) {
+        result = FAIL;
+    }
+
+    return result;
+}
+*/
 
 //================================================
 // Function
@@ -83,7 +186,9 @@ void GetInputGpioStatus(int fd)
     }
 
     ShmPrimaryMcuData->InputDet.bits.SpdDetec = gpio_in.SPD;
-
+#ifdef DD360ComBox
+    EmgBtn_flag = 0;
+#else
     if (gpio_in.Emergency_Btn && (EmgBtn_flag != gpio_in.Emergency_Btn))
     {
             EmgBtn_count++;
@@ -98,7 +203,7 @@ void GetInputGpioStatus(int fd)
             EmgBtn_count = 0;
         }
     }
-
+#endif
     ShmPrimaryMcuData->InputDet.bits.EmergencyButton = EmgBtn_flag;
 
     dispenserSwTmp |= (ShmPrimaryMcuData->InputDet.bits.Key0);
@@ -119,7 +224,7 @@ void GetInputGpioStatus(int fd)
     ShmPrimaryMcuData->InputDet.bits.Button1 = gpio_in.Button[0];
     ShmPrimaryMcuData->InputDet.bits.Button2 = gpio_in.Button[1];
 
-
+#if defined DD360Tcci || defined DD360Audi || defined DD360ComBox
     if ((strncmp((char *)&pSysConfig->ModelName[7], "V", 1) == 0) ||
             (strncmp((char *)&pSysConfig->ModelName[9], "V", 1) == 0) ||
             (strncmp((char *)&pSysConfig->ModelName[7], "F", 1) == 0) ||
@@ -132,13 +237,16 @@ void GetInputGpioStatus(int fd)
         pFaultCode->FaultEvents.bits.CcsLiquidChillerWaterLevelFault = gpio_in.AC_MainBreaker;
     }
 
+#if defined DD360ComBox
+    Door_flag = 0;
+#else
     if (Door_flag == gpio_in.Door_Open) {
         Door_count++;
         if (Door_count == 3 ) {
             Door_count = 0;
             Door_flag = gpio_in.Door_Open;
         }
-    } else {
+    } else { 
         Door_flag = gpio_in.Door_Open;
         Door_count = 0;
     }
@@ -158,10 +266,12 @@ void GetInputGpioStatus(int fd)
         }
     }
     */
-
-
+#endif 
+#if defined DD360ComBox
+    ShmPrimaryMcuData->InputDet.bits.DoorOpen = Door_flag;
+#else
     ShmPrimaryMcuData->InputDet.bits.DoorOpen = ~Door_flag;
-
+#endif
 
 /*
     log_info("Emergency Button Count = %d , Emergency flag = %d",
@@ -176,8 +286,56 @@ void GetInputGpioStatus(int fd)
     ShmPrimaryMcuData->InputDet.bits.Key3 = ~gpio_in.Key[3] & 0x01;
 
     return;
+#endif //defined DD360Tcci || defined DD360Audi || defined DD360ComBox
+
+    static uint8_t _curDeviceStatus[3] = {0};
+    static uint8_t _reCheckCount[3] = {0};
+
+    //DS60-120 add
+    if (_curDeviceStatus[_PRIMARY_CHECK_TAG_AC_CONTACT] != gpio_in.AC_Connector) {
+        if (_reCheckCount[_PRIMARY_CHECK_TAG_AC_CONTACT] >= 3) {
+            _curDeviceStatus[_PRIMARY_CHECK_TAG_AC_CONTACT] = gpio_in.AC_Connector;
+            pSysInfo->AcContactorStatus =
+                ShmPrimaryMcuData->InputDet.bits.AcContactorDetec =
+                    gpio_in.AC_Connector;
+        } else {
+            _reCheckCount[_PRIMARY_CHECK_TAG_AC_CONTACT]++;
+        }
+    } else {
+        _reCheckCount[_PRIMARY_CHECK_TAG_AC_CONTACT] = 0;
+    }
 
-
+    if (_curDeviceStatus[_PRIMARY_CHECK_TAG_MAIN_BREAKER] != gpio_in.AC_MainBreaker) {
+        if (_reCheckCount[_PRIMARY_CHECK_TAG_MAIN_BREAKER] >= 3) {
+            _curDeviceStatus[_PRIMARY_CHECK_TAG_MAIN_BREAKER] = gpio_in.AC_MainBreaker;
+            ShmPrimaryMcuData->InputDet.bits.AcMainBreakerDetec = gpio_in.AC_MainBreaker;
+        } else {
+            _reCheckCount[_PRIMARY_CHECK_TAG_MAIN_BREAKER]++;
+        }
+    } else {
+        _reCheckCount[_PRIMARY_CHECK_TAG_MAIN_BREAKER] = 0;
+    }
+    //pSysInfo->AcContactorStatus = ShmPrimaryMcuData->InputDet.bits.AcContactorDetec = gpio_in.AC_Connector;
+    //ShmPrimaryMcuData->InputDet.bits.AcMainBreakerDetec = gpio_in.AC_MainBreaker;
+
+    ShmPrimaryMcuData->InputDet.bits.Key0 = gpio_in.Key[0] & 0x01;
+    ShmPrimaryMcuData->InputDet.bits.Key1 = gpio_in.Key[1] & 0x01;
+    ShmPrimaryMcuData->InputDet.bits.Key2 = gpio_in.Key[2] & 0x01;
+    ShmPrimaryMcuData->InputDet.bits.Key3 = gpio_in.Key[3] & 0x01;
+    ShmPrimaryMcuData->InputDet.bits.DoorOpen = gpio_in.Door_Open;
+
+    /*printf(" gpio_in.Key[0]~ gpio_in.Key[3]=%d, %d, %d, %d",
+    ShmPrimaryMcuData->InputDet.bits.Key0 , ShmPrimaryMcuData->InputDet.bits.Key1,
+    ShmPrimaryMcuData->InputDet.bits.Key2,ShmPrimaryMcuData->InputDet.bits.Key3);
+    printf("pAlarmCode->AlarmEvents.bits.CcsLiquidChillerWaterLevelWarning=%d", pAlarmCode->AlarmEvents.bits.CcsLiquidChillerWaterLevelWarning);
+    printf("pFaultCode->FaultEvents.bits.CcsLiquidChillerWaterLevelFault=%d", pFaultCode->FaultEvents.bits.CcsLiquidChillerWaterLevelFault);
+    */
+    //log_info("left = %d ", ShmPrimaryMcuData->InputDet.bits.Button1);
+    //log_info("right = %d ", ShmPrimaryMcuData->InputDet.bits.Button2);
+    //log_info("pSysInfo->AcContactorStatus = %d ", pSysInfo->AcContactorStatus);
+    if (ShmPrimaryMcuData->InputDet.bits.AcMainBreakerDetec == YES) {
+        log_error("AC Mainbreaker occur. ");
+    }
 }
 
 static void checkChillerStatus(Gpio_out *gpio)
@@ -208,7 +366,7 @@ static void checkChillerStatus(Gpio_out *gpio)
         pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(gunIndex);
         pChillerInfo = (ChillerInfo *)&fChillerInfo[gunIndex];
 
-        if((pDcChargingInfo->SystemStatus > S_AUTHORIZING && pDcChargingInfo->SystemStatus < S_TERMINATING) ||
+        if((pDcChargingInfo->SystemStatus > S_IDLE && pDcChargingInfo->SystemStatus < S_TERMINATING) ||
             (pDcChargingInfo->SystemStatus >= S_CCS_PRECHARGE_ST0 && pDcChargingInfo->SystemStatus <= S_CCS_PRECHARGE_ST1))
         {
             pChillerInfo->ChillerSwitch = YES;
@@ -229,7 +387,7 @@ static void checkChillerStatus(Gpio_out *gpio)
                 pChillerInfo->ChillerSwitch = NO;
             }
         }
-/*
+#if 0
         if ((pDcChargingInfo->PresentChargingCurrent) >= 150) { //當前電壓於150A,打開水冷機
             pChillerInfo->ChillerSwitch = YES;
             pChillerInfo->ChillerOnTime = time((time_t *)NULL);
@@ -249,7 +407,7 @@ static void checkChillerStatus(Gpio_out *gpio)
                 pChillerInfo->ChillerSwitch = NO;
             }
         }
-*/
+#endif
     }
 
     uint8_t _chillerNeedOn = NO;
@@ -262,6 +420,9 @@ static void checkChillerStatus(Gpio_out *gpio)
         }
     }
 
+    if (ShmDcCommonData->debugflag == YES)
+        _chillerNeedOn = ShmDcCommonData->chillerCtrl;
+
     if(_chiller.ChillerSwitch != _chillerNeedOn)
     {
         log_info("Chiller Need Turn %s", _chillerNeedOn == YES ? "ON" : "OFF");
@@ -365,7 +526,9 @@ int InitComPort()
 
     fd = open(priPortName, O_RDWR);
     if (fd <= 0) {
+#ifdef SystemLogMessage
         log_error("open 407 Communication port NG ");
+#endif
         return -1;
     }
     ioctl (fd, TCGETS, &tios);
@@ -390,6 +553,48 @@ unsigned long GetTimeoutValue(struct timeval _sour_time)
     return 1000000 * (_end_time.tv_sec - _sour_time.tv_sec) + _end_time.tv_usec - _sour_time.tv_usec;
 }
 
+//int FindChargingInfoData(uint8_t target, struct ChargingInfoData **chargingData)
+//{
+//    for (uint8_t index = 0; index < CHAdeMO_QUANTITY; index++) {
+//        if (pSysInfo->ChademoChargingData[index].Index == target) {
+//            chargingData[target] = &pSysInfo->ChademoChargingData[index];
+//            return 1;
+//        }
+//    }
+//
+//    for (uint8_t index = 0; index < CCS_QUANTITY; index++) {
+//        if (pSysInfo->CcsChargingData[index].Index == target) {
+//            chargingData[target] = &pSysInfo->CcsChargingData[index];
+//            return 1;
+//        }
+//    }
+//
+//    for (uint8_t index = 0; index < GB_QUANTITY; index++) {
+//        if (pSysInfo->GbChargingData[index].Index == target) {
+//            chargingData[target] = &pSysInfo->GbChargingData[index];
+//            return 1;
+//        }
+//    }
+//
+//    return 0;
+//}
+
+//void Initialization() //DS60-120 add
+//{
+//    bool isPass = false;
+//    while (!isPass) {
+//        isPass = true;
+//        for (uint8_t _index = 0; _index < gun_count; _index++) {
+//            if (!FindChargingInfoData(_index, &ChargingData[0])) {
+//                log_error("EvComm (main) : FindChargingInfoData false ");
+//                isPass = false;
+//                break;
+//            }
+//        }
+//        sleep(1);
+//    }
+//}
+
 static bool IsPrimaryProcessNeedPause(void)
 {
     bool _pause = false;
@@ -438,6 +643,7 @@ int main(void)
     pAlarmCode = (struct AlarmCodeData *)GetShmAlarmCodeData();
     pFaultCode = (struct FaultCodeData *)GetShmFaultCodeData();
     ShmPrimaryMcuData = (struct PrimaryMcuData *)GetShmPrimaryMcuData();
+    ShmDcCommonData = (DcCommonInfo *)GetShmDcCommonData();
 
     Uart1Fd = InitComPort();
     //log_info("407 Port id = %d ", Uart1Fd);
@@ -463,12 +669,6 @@ int main(void)
     for (;;) {
         // 程序開始之前~ 必須先確定 FW 版本與硬體版本,確認後!!~ 該模組才算是真正的 Initial Comp.
         // 模組更新 FW 後,需重新做
-        if(IsPrimaryProcessNeedPause() == true)
-        {
-            sleep(1);
-            continue;
-        }
-
         if (ShmPrimaryMcuData->SelfTest_Comp != PASS) {
             //log_info("(407) Get Fw and Hw Ver. ");
             GetFwAndHwVersion(Uart1Fd);
@@ -479,7 +679,11 @@ int main(void)
 
             GetInputGpioStatus(Uart1Fd);
         }
-
+        if(IsPrimaryProcessNeedPause() == true)
+        {
+            sleep(1);
+            continue;
+        }
 
         usleep(50000);
     }

+ 5 - 9
EVSE/Projects/DD360Tcci/Apps/ModuleUpdateFW/Module_UpdateFW.c

@@ -39,7 +39,7 @@ static char *_485PortName = "/dev/ttyS5";
 
 void KillAllTask(void)
 {
-    pSysInfo->PageIndex = _PAGE_MAINTAIN;
+    pSysInfo->PageIndex = _LCM_FIX;
 
     system("killall Module_EventLogging");
     system("killall Module_PrimaryComm");
@@ -60,7 +60,7 @@ void KillAllTask(void)
 
 void KillTask(void)
 {
-    pSysInfo->PageIndex = _PAGE_MAINTAIN;
+    pSysInfo->PageIndex = _LCM_FIX;
 
     system("killall Module_EventLogging");
     system("killall Module_PrimaryComm");
@@ -248,7 +248,6 @@ static int CheckUpdateProcess(void)
     pSysConfig = (struct SysConfigData *)GetShmSysConfigData();
     d = opendir("/mnt/");
     if (d) {
-        log_info("Open /mnt success");
         while ((dir = readdir(d)) != NULL) {
             if (strcmp(dir->d_name, ".") == 0 || strcmp(dir->d_name, "..") == 0) {
                 continue;
@@ -272,7 +271,6 @@ static int CheckUpdateProcess(void)
             ImageLen = read(fd, ptr, MaxLen);
             for (uint8_t i = 0; i < 16; i++) {
                 if (pSysConfig->ModelName[i] != ptr[i]) {
-                    log_info("model name check fail. ");
                     return FAIL;
                 }
             }
@@ -451,8 +449,6 @@ static int CheckUpdateProcess(void)
                             retSucc++;
                         } else
                             retFail++;
-                    } else {
-                        log_info("CreateBufferForLcmFile fail");
                     }
                     break;
                 }
@@ -477,7 +473,7 @@ void CheckFwUpdateFunction(void)
     if (pSysInfo->FirmwareUpdate == YES) {
         log_info("ftp : update start. ");
         TryCloseWatchdog();
-        pSysInfo->SystemPage = _PAGE_MAINTAIN;
+        pSysInfo->SystemPage = _LCM_FIX;
         for (uint8_t gun_index = 0; gun_index < pSysConfig->TotalConnectorCount; gun_index++) {
             setChargerMode(gun_index, MODE_UPDATE);
         }
@@ -499,7 +495,7 @@ void CheckFwUpdateFunction(void)
 
         pSysInfo->FirmwareUpdate = NO;
         sleep(5);
-        //system("reboot -f");
+        system("reboot -f");
     } else if (ShmOCPP16Data->MsMsg.bits.UpdateFirmwareReq == YES) {
         ShmOCPP16Data->MsMsg.bits.UpdateFirmwareReq = NO;
 
@@ -566,7 +562,7 @@ int main(int argc, char *argv[])
     ShmDcCommonData->_upgrade_lcm_result = _LCM_UPGRADE_RESULT_WAIT;
 
     while (1) {
-        //if (IsConnectorWholeIdle() || (pSysInfo->PageIndex == _PAGE_MAINTAIN) )
+        if (IsConnectorWholeIdle() || (pSysInfo->PageIndex == _LCM_FIX) )
             CheckFwUpdateFunction();
         sleep(3);
     } //while

+ 1493 - 1427
EVSE/Projects/DD360Tcci/Apps/ReadCmdline.c

@@ -1,1427 +1,1493 @@
-/*
- * Main.c
- *
- *  Created on: 2019年8月6日
- *      Author: 7564
- */
-
-
-#include <sys/time.h>
-#include <sys/timeb.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <sys/ioctl.h>
-#include <sys/socket.h>
-#include <sys/ipc.h>
-#include <sys/shm.h>
-#include <sys/shm.h>
-#include <sys/mman.h>
-#include <linux/wireless.h>
-#include <arpa/inet.h>
-#include <netinet/in.h>
-
-#include <unistd.h>
-#include <stdarg.h>
-#include <stdio.h>      /*標準輸入輸出定義*/
-#include <stdlib.h>     /*標準函數庫定義*/
-#include <stdint.h>
-#include <unistd.h>     /*Unix 標準函數定義*/
-#include <fcntl.h>      /*檔控制定義*/
-#include <termios.h>    /*PPSIX 終端控制定義*/
-#include <errno.h>      /*錯誤號定義*/
-#include <errno.h>
-#include <string.h>
-#include <time.h>
-#include <ctype.h>
-#include <ifaddrs.h>
-#include <math.h>
-#include <stdbool.h>
-
-#include "./ShareMemory/shmMem.h"
-#include "./Define/define.h"
-#include "./SelectGun/SelectGun.h"
-#include "Config.h"
-#include "./CSU/main.h"
-
-//------------------------------------------------------------------------------
-#define CMD_KEY_WAIT                                (1)
-#define CMD_KEY_DONT_WAIT                           (0)
-
-#define DEFAULT_AC_INDEX                            (2)
-
-#define AUTORUN_STEP1_TIME_START                    (140)             // Minutes
-#define AUTORUN_STEP1_TIME_END                      (150)
-#define AUTORUN_STEP2_TIME_START                    (210)
-#define AUTORUN_STEP2_TIME_END                      (410)
-#define AUTORUN_END_TIME                            (480)
-#define AUTORUN_CYCLE_COUNT                         (30)
-
-#define TTY_PATH                                    "/dev/tty"
-#define STTY_US                                     "stty raw -echo -F "
-#define STTY_DEF                                    "stty -raw echo -F "
-
-//------------------------------------------------------------------------------
-uint8_t _curAutoRunCount = 0;
-uint8_t _usingAutoRun = 0;
-struct timeval _autoTime;
-
-static struct SysConfigData *pSysConfig = NULL;
-static struct SysInfoData *pSysInfo = NULL;
-static struct WARNING_CODE_INFO *pSysWarning = NULL;
-
-static struct AlarmCodeData *pAlarmCode = NULL;
-
-static struct PrimaryMcuData *ShmPrimaryMcuData = NULL;
-static struct CHAdeMOData *ShmCHAdeMOData = NULL;
-static struct CcsData *ShmCcsData = NULL;
-static struct GBTData *ShmGBTData = NULL;
-static struct FanModuleData *ShmFanModuleData = NULL;
-static struct RelayModuleData *ShmRelayModuleData = NULL;
-static struct LedModuleData *ShmLedModuleData = NULL;
-static struct PsuData *ShmPsuData = NULL;
-static struct OCPP16Data *ShmOCPP16Data = NULL;
-static SelectGunInfo *ShmSelectGunInfo = NULL;
-static DcCommonInfo *ShmDcCommonData = NULL;
-
-static struct ChargingInfoData *pDcChargingInfo = NULL;
-static struct ChargingInfoData *pAcChargingInfo = NULL;
-
-static char newString[8][16] = {0};
-
-//------------------------------------------------------------------------------
-static int DiffTimeb(struct timeb ST, struct timeb ET)
-{
-    //return milli-second
-    unsigned int StartTime, StopTime;
-
-    StartTime = (unsigned int)ST.time;
-    StopTime = (unsigned int)ET.time;
-
-    return (StopTime - StartTime) * 1000 + ET.millitm - ST.millitm;
-}
-
-static void get_char(char *word)
-{
-    fd_set rfds;
-    struct timeval tv;
-
-    FD_ZERO(&rfds);
-    FD_SET(0, &rfds);
-    tv.tv_sec = 0;
-    tv.tv_usec = 10; //wait input timout time
-
-    //if input
-    if (select(1, &rfds, NULL, NULL, &tv) > 0) {
-        fgets(word, 128, stdin);
-    }
-}
-
-static uint8_t helpCmd(void)
-{
-    if (strcmp(newString[0], "?") == 0 ||
-            strcmp(newString[0], "help") == 0 ||
-            strcmp(newString[0], "h") == 0) {
-        return YES;
-    }
-
-    return NO;
-}
-
-static uint8_t exitCmd(void)
-{
-    if (strcmp(newString[0], "c") == EQUAL ||
-            strcmp(newString[0], "C") == EQUAL ||
-            strncmp(&newString[0][0], "exit", 4) == EQUAL
-       ) {
-        return YES;
-    }
-
-    return NO;
-}
-
-static uint8_t readCmdKey(uint8_t state)
-{
-    char word[128] = {0};
-    int i = 0, j = 0, ctr = 0;
-
-    memset(word, 0, sizeof(word));
-    if (state == CMD_KEY_WAIT) {
-        fgets(word, sizeof(word), stdin);
-    } else if (state == CMD_KEY_DONT_WAIT) {
-        get_char(word);
-
-        if (strlen(word) == 0) {
-            //usleep(50000);
-            return NO;
-        }
-    }
-
-    memset(newString, 0, sizeof(newString));
-
-    strcpy(newString[1], "-1");
-    strcpy(newString[2], "-1");
-    for (i = 0; i <= (strlen(word)); i++) {
-        if (word[i] == ' ' ||
-                word[i] == '\0' ||
-                word[i] == '\r' ||
-                word[i] == '\n' ||
-                word[i] == 10) {
-            newString[ctr][j] = '\0';
-            ctr++;
-            j = 0;
-        } else {
-            newString[ctr][j] = word[i];
-            j++;
-        }
-    }
-
-    return YES;
-}
-
-unsigned long GetTimeoutValue(struct timeval _sour_time)
-{
-    struct timeval _end_time;
-    gettimeofday(&_end_time, NULL);
-
-    return (_end_time.tv_sec - _sour_time.tv_sec);
-}
-
-void RunStatusProc(char *v1, char *v2)
-{
-    printf("OrderCharging = %d \n", pSysInfo->OrderCharging);
-    printf("WaitForPlugit = %d \n", pSysInfo->WaitForPlugit);
-    if (strcmp(v1, "ac") == 0) {
-        pAcChargingInfo = (struct ChargingInfoData *)GetAcChargingInfoData(0);
-        //if (!FindAcChargingInfoData(0, &ac_chargingInfo[0])) {
-        //    printf("FindChargingInfoData (AC) false \n");
-        //}
-        printf("AC Status = %d \n", pAcChargingInfo->ConnectorPlugIn);
-        return;
-    }
-
-    int _index = atoi(v1);
-
-    if (_index <= 1) {
-        //if (!FindChargingInfoData(_index, &_chargingData[0])) {
-        //    printf ("FindChargingInfoData error\n");
-        //    return;
-        //}
-        pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(_index);
-
-        if (strcmp(v2, "-1") == 0 || strcmp(v2, "") == 0) {
-            // get
-            printf ("index = %x, status = %x (%d)\n",
-                    _index,
-                    pDcChargingInfo->SystemStatus,
-                    pDcChargingInfo->IsAvailable);
-            printf ("SystemTimeoutFlag = %d, PageIndex = %d\n",
-                    pSysInfo->SystemTimeoutFlag, pSysInfo->PageIndex);
-        } else {
-            // set
-            pDcChargingInfo->SystemStatus = atoi(v2);
-        }
-    } else {
-        //if (!FindAcChargingInfoData(0, &ac_chargingInfo[0])) {
-        //    printf("FindChargingInfoData (AC) false \n");
-        //}
-        pAcChargingInfo = (struct ChargingInfoData *)GetAcChargingInfoData(0);
-
-        if (strcmp(v2, "-1") == 0 || strcmp(v2, "") == 0) {
-            // get
-            printf ("AC Type, status = %x (%d)\n",
-                    pAcChargingInfo->SystemStatus,
-                    pAcChargingInfo->IsAvailable);
-        } else {
-            // set
-            pAcChargingInfo->SystemStatus = atoi(v2);
-        }
-    }
-}
-
-void RunCardProc(char *v1, char *v2)
-{
-    if (strcmp(v1, "-1") == 0 || strcmp(v1, "") == 0) {
-        if (pSysInfo->WaitForPlugit) {
-            pSysInfo->WaitForPlugit = 0x00;
-            printf ("SysInfo.WaitForPlugit = %x \n", pSysInfo->WaitForPlugit);
-        } else {
-            pSysInfo->WaitForPlugit = 0x01;
-            printf ("SysInfo.WaitForPlugit = %x \n", pSysInfo->WaitForPlugit);
-        }
-    } else {
-        strcpy((char *)pSysConfig->UserId, "");
-        memcpy((char *)pSysConfig->UserId, v1, strlen(v1));
-        pSysConfig->UserId[strlen(v1)] = '\0';
-        printf("StartUserId = %s \n", pSysConfig->UserId);
-    }
-}
-
-void RunGunPlugitProc(char *v1, char *v2)
-{
-    if (strcmp(v1, "ac") == 0) {
-        //if (!FindAcChargingInfoData(0, &ac_chargingInfo[0])) {
-        //    printf("FindChargingInfoData (AC) false \n");
-        //}
-        pAcChargingInfo = (struct ChargingInfoData *)GetAcChargingInfoData(0);
-
-        if (strcmp(v2, "-1") == 0 || strcmp(v2, "") == 0) {
-            // get
-            printf("ConnectorPlugIn = %d \n", pAcChargingInfo->ConnectorPlugIn);
-        } else {
-            // set
-            pAcChargingInfo->ConnectorPlugIn = atoi(v2);
-        }
-        return;
-    }
-
-    int _index = atoi(v1);
-    //if (!FindChargingInfoData(_index, &_chargingData[0])) {
-    //    printf("FindChargingInfoData error\n");
-    //    return;
-    //}
-    pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(_index);
-
-    if (strcmp(v2, "-1") == 0 || strcmp(v2, "") == 0) {
-        // get
-        printf("index = %x, plug it = %x\n",
-               _index,
-               pDcChargingInfo->ConnectorPlugIn);
-    } else {
-        // set
-        pDcChargingInfo->ConnectorPlugIn = atoi(v2);
-    }
-}
-
-void GetGunLockStatusProc(char *v1, char *v2)
-{
-    int _index = atoi(v1);
-    //if (!FindChargingInfoData(_index, &_chargingData[0])) {
-    //    printf("FindChargingInfoData error\n");
-    //    return;
-    //}
-    pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(_index);
-
-    if (strcmp(v2, "-1") != 0 && strcmp(v2, "") != 0) {
-        pDcChargingInfo->GunLocked = atoi(v2);
-    }
-
-    printf("Gun Locked Status = %d \n", pDcChargingInfo->GunLocked);
-}
-
-void SetSystemIDProc()
-{
-    char *systemId = "Alston_Test";
-    memcpy(&pSysConfig->SystemId, systemId, strlen(systemId));
-}
-
-void RunSelfProc()
-{
-    printf("self test status = %x\n", pSysInfo->SelfTestSeq);
-}
-
-void GetFwVerProc(void)
-{
-    int _index = 0;
-    int isContinue = 1;
-    char *usageMsg = "Usage:\n"
-                     "      model\n"
-                     "      407\n"
-                     "      conn index, ex: conn 0 | 1\n"
-                     "      relay\n"
-                     "      fan\n"
-                     "      dc\n"
-                     "      led\n"
-                     "      ac\n"
-                     "      exit | c | C\n"
-                     "      help | ? | h\n";
-
-    while (isContinue) {
-        if (readCmdKey(CMD_KEY_WAIT) == NO) {
-            continue;
-        }
-
-        if (strcmp(newString[0], "407") == 0) {
-            printf("407 FW Version = %s\n", ShmPrimaryMcuData->version);
-        } else if (strcmp(newString[0], "model") == 0) {
-            printf("ModelName = %s\r\n", pSysConfig->ModelName);
-        } else if (strcmp(newString[0], "conn") == 0) {
-            if (strcmp(newString[1], "-1") == 0  ||
-                    strcmp(newString[1], "") == 0 ||
-                    atoi(newString[1]) >= pSysConfig->TotalConnectorCount
-               ) {
-                printf("index over flow\r\n");
-                continue;
-            }
-
-            _index = atoi(newString[1]);
-
-            if (_index == 0) {
-                printf("Gun 0 FW Version = %s \n", pSysInfo->Connector1FwRev);
-            } else if (_index == 1) {
-                printf("Gun 1 FW Version = %s \n", pSysInfo->Connector2FwRev);
-            }
-        } else if (strcmp(newString[0], "relay") == 0) {
-            printf("RB Version = %s \n", pSysInfo->RelayModuleFwRev);
-        } else if (strcmp(newString[0], "fan") == 0) {
-            printf("FAN Version = %s \n", pSysInfo->FanModuleFwRev);
-        } else if (strcmp(newString[0], "dc") == 0) {
-            printf("DC Main Version = %s \n", pSysInfo->CsuRootFsFwRev);
-        } else if (strcmp(newString[0], "led") == 0) {
-            printf("LED Version = %s \n", pSysInfo->LedModuleFwRev);
-        } else if (strcmp(newString[0], "ac") == 0) {
-            pAcChargingInfo = (struct ChargingInfoData *)GetAcChargingInfoData(0);
-
-            printf("AC Version = %s \n", pAcChargingInfo->version);
-        } else if (exitCmd() == YES) {
-            return;
-        } else if (helpCmd() == YES) {
-            printf ("%s\n", usageMsg);
-        }
-
-    }//while
-}
-
-void CreateOneError(char *v1)
-{
-    int value = atoi(v1);
-
-    pAlarmCode->AlarmEvents.bits.SystemL1InputOVP = value;
-    pSysConfig->BillingData.isBilling = value;
-}
-
-void GetAuthorizeFlag(char *v1)
-{
-    if (strcmp(v1, "-1") == 0 || strcmp(v1, "") == 0) {
-        printf("AuthorizeFlag = %d \n", pSysInfo->AuthorizeFlag);
-    } else {
-        pSysInfo->AuthorizeFlag = atoi(v1);
-    }
-}
-
-void GetRelayStatus(char *v1)
-{
-    int _index = atoi(v1);
-    //if (!FindChargingInfoData(_index, &_chargingData[0])) {
-    //    printf("FindChargingInfoData error\n");
-    //    return;
-    //}
-    pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(_index);
-
-    printf("RelayK1K2Status = %d \n", pDcChargingInfo->RelayK1K2Status);
-    printf("RelayKPK2Status = %d \n", pDcChargingInfo->RelayKPK2Status);
-}
-
-void FwUpdateFlagProc()
-{
-    pSysInfo->FirmwareUpdate = 0x01;
-}
-
-void CheckAcStatus(char *v1)
-{
-    if (strcmp(v1, "-1") == 0 || strcmp(v1, "") == 0) {
-        printf("AC Status = %d \n", pSysInfo->AcContactorStatus);
-    }
-}
-
-void SetCableChkStatus(char *v1, char *v2)
-{
-    int _index = atoi(v1);
-    //if (!FindChargingInfoData(_index, &_chargingData[0])) {
-    //    printf ("FindChargingInfoData error\n");
-    //    return;
-    //}
-    pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(_index);
-
-    pDcChargingInfo->GroundFaultStatus = atoi(v2);
-}
-
-void SetChargingInfoCCID(char *v1, char *v2)
-{
-    int _index = atoi(v1);
-    //if (!FindChargingInfoData(_index, &_chargingData[0])) {
-    //    printf ("FindChargingInfoData error\n");
-    //    return;
-    //}
-    pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(_index);
-
-    memcpy(pDcChargingInfo->EVCCID, v2, 8);
-    pDcChargingInfo->EVCCID[8] = '\0';
-}
-
-void SetPowerValue(char *v1, char *v2)
-{
-    int _index = atoi(v1);
-    float _Current = atof(v2);
-
-    //if (!FindChargingInfoData(_index, &_chargingData[0])) {
-    //    printf ("FindChargingInfoData error\n");
-    //    return;
-    //}
-    pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(_index);
-
-    // 盲沖的時候才允許使用~
-    if (pDcChargingInfo->Type != 9) {
-        return;
-    }
-
-    pDcChargingInfo->EvBatterytargetCurrent = _Current;
-}
-
-void GetSystemInfo()
-{
-    printf ("ModelName = %s \n", pSysConfig->ModelName);
-    printf ("SerialNumber = %s \n", pSysConfig->SerialNumber);
-    printf ("InternetConn = %d \n", pSysInfo->InternetConn);
-
-    printf ("MaxChargingPower = %d, MaxChargingCurrent = %d \n",
-            pSysConfig->MaxChargingPower,
-            pSysConfig->MaxChargingCurrent);
-}
-
-void ChangeGunNum()
-{
-    if (pSysInfo->CurGunSelected + 1 < pSysConfig->TotalConnectorCount) {
-        pSysInfo->CurGunSelected += 1;
-        pSysInfo->CurGunSelectedByAc = NO_DEFINE;
-    } else if (pSysConfig->AcConnectorCount > 0 &&
-               pSysInfo->CurGunSelectedByAc == NO_DEFINE) {
-        pSysInfo->CurGunSelectedByAc = DEFAULT_AC_INDEX;
-    } else {
-        pSysInfo->CurGunSelected = 0;
-        pSysInfo->CurGunSelectedByAc = NO_DEFINE;
-    }
-}
-
-void GetGunSelectedNum(char *v1)
-{
-    if (strcmp(v1, "-1") == 0 || strcmp(v1, "") == 0) {
-        if (AC_QUANTITY > 0 &&
-                pSysInfo->CurGunSelectedByAc != NO_DEFINE) {
-            printf("connector select changed = AC \n");
-        } else {
-            printf("connector selected = %d \n", pSysInfo->CurGunSelected);
-        }
-    } else {
-        int _index = atoi(v1);
-        if (_index <= 1) {
-            pSysInfo->CurGunSelected = _index;
-            pSysInfo->CurGunSelectedByAc = NO_DEFINE;
-            printf("connector select changed = %d \n", _index);
-        } else if (AC_QUANTITY > 0) {
-            pSysInfo->CurGunSelectedByAc = DEFAULT_AC_INDEX;
-            printf("connector select changed = AC \n");
-        }
-    }
-}
-
-void SetFanSpeed(char *v1)
-{
-    int speed = atoi(v1);
-
-    ShmFanModuleData->TestFanSpeed = speed;
-}
-
-void GetFanSpeed()
-{
-    printf("ShmFanModuleData->PresentFan1Speed = %d \n", ShmFanModuleData->PresentFan1Speed);
-    printf("ShmFanModuleData->PresentFan2Speed = %d \n", ShmFanModuleData->PresentFan2Speed);
-    printf("ShmFanModuleData->PresentFan3Speed = %d \n", ShmFanModuleData->PresentFan3Speed);
-    printf("ShmFanModuleData->PresentFan4Speed = %d \n", ShmFanModuleData->PresentFan4Speed);
-}
-
-void SetDebugMode(char *v1)
-{
-    int mode = atoi(v1);
-
-    pSysConfig->SwitchDebugFlag = mode;
-}
-
-void SetGFDMode(char *v1)
-{
-    int mode = atoi(v1);
-
-    pSysConfig->AlwaysGfdFlag = mode;
-}
-
-void GetPsuTemp()
-{
-    for (uint8_t index = 0; index < ShmPsuData->GroupCount; index++) {
-        for (uint8_t count = 0; count < ShmPsuData->PsuGroup[index].GroupPresentPsuQuantity; count++) {
-            printf("PSU Temp = %d \n", ShmPsuData->PsuGroup[index].PsuModule[count].ExletTemp);
-        }
-    }
-}
-
-void GetAcInputVol()
-{
-    printf("L1N_L12 = %f, L2N_L23 = %f, L3N_L31 = %f \n",
-           pSysInfo->InputVoltageR,
-           pSysInfo->InputVoltageS,
-           pSysInfo->InputVoltageT);
-}
-
-void GetPsuInformation(char *v1, char *v2, char *v3)
-{
-    printf("**********************AC Contact needed*************************\n");
-    if (strcmp(v1, "count") == 0) {
-        for (int i = 0; i < 4; i++) {
-            printf("Group Index = %d, Module Count = %d \n",
-                   i,
-                   ShmPsuData->PsuGroup[i].GroupPresentPsuQuantity);
-        }
-    } else if (strcmp(v1, "ver") == 0) {
-        for (int i = 0; i < ShmPsuData->SystemPresentPsuQuantity; i++) {
-            printf("Psu Index = %d, PriVersion = %s, SecVersion = %s \n",
-                   i, ShmPsuData->PsuVersion[i].FwPrimaryVersion,
-                   ShmPsuData->PsuVersion[i].FwSecondVersion);
-        }
-
-        for (int i = 0; i < ShmPsuData->GroupCount; i++) {
-            for (int j = 0; j < ShmPsuData->PsuGroup[i].GroupPresentPsuQuantity; j++) {
-                printf("Group Index = %d, Psu Index = %d, Version = %s \n",
-                       i,
-                       j,
-                       ShmPsuData->PsuGroup[i].PsuModule[j].FwVersion);
-            }
-        }
-    } else if (strcmp(v1, "cap") == 0) {
-        for (int i = 0; i < ShmPsuData->GroupCount; i++) {
-            printf("Group Index = %d, MaxCur = %d, Power = %d \n",
-                   i,
-                   ShmPsuData->PsuGroup[i].GroupAvailableCurrent,
-                   ShmPsuData->PsuGroup[i].GroupAvailablePower);
-        }
-    } else if (strcmp(v1, "input") == 0) {
-        for (int i = 0; i < ShmPsuData->GroupCount; i++) {
-            for (uint8_t count = 0; count < ShmPsuData->PsuGroup[i].GroupPresentPsuQuantity; count++) {
-                printf("gp = %d, Index = %d, volR = %d, volS = %d, volT = %d \n",
-                       i,
-                       count,
-                       ShmPsuData->PsuGroup[i].PsuModule[count].InputVoltageL1,
-                       ShmPsuData->PsuGroup[i].PsuModule[count].InputVoltageL2,
-                       ShmPsuData->PsuGroup[i].PsuModule[count].InputVoltageL3);
-            }
-        }
-    } else if (strcmp(v1, "output") == 0) {
-        for (int i = 0; i < ShmPsuData->GroupCount; i++) {
-            printf("Group Index = %d, OutputV = %d, OutputC = %d \n",
-                   i,
-                   ShmPsuData->PsuGroup[i].GroupPresentOutputVoltage,
-                   ShmPsuData->PsuGroup[i].GroupPresentOutputCurrent);
-        }
-
-        for (int i = 0; i < pSysConfig->TotalConnectorCount; i++) {
-            //if (!FindChargingInfoData(i, &_chargingData[0])) {
-            //    printf ("FindChargingInfoData error\n");
-            //    continue;
-            //}
-            pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(i);
-
-            printf("Form RB : Group Index = %d, OutputV = %f \n",
-                   i,
-                   pDcChargingInfo->FireChargingVoltage);
-        }
-    } else if (strcmp(v1, "test") == 0) {
-        int mode = atoi(v2);
-
-        if (mode >= _TEST_MODE && mode <= _TEST_MODE) {
-            ShmPsuData->Work_Step = mode;
-        }
-    } else if (strcmp(v1, "out") == 0) {
-        float vol = atof(v2);
-        float cur = atof(v3);
-
-        if (ShmPsuData->Work_Step >= _TEST_MODE && ShmPsuData->Work_Step <= _TEST_MODE) {
-            //if (!FindChargingInfoData(0, &_chargingData[0])) {
-            //    printf ("FindChargingInfoData error\n");
-            //    return;
-            //}
-            pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(0);
-
-            pDcChargingInfo->EvBatterytargetVoltage = vol;
-            pDcChargingInfo->EvBatterytargetCurrent = cur;
-        }
-    }
-    printf("*************************************************\n");
-}
-
-void GetConnectorCapInfo(char *v1)
-{
-    int _GunIndex = atoi(v1);
-
-    //if (!FindChargingInfoData(_GunIndex, &_chargingData[0])) {
-    //    printf ("FindChargingInfoData error\n");
-    //    return;
-    //}
-    pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(_GunIndex);
-
-    printf ("Charger Max Current = %d, Max Power = %d \n",
-            pSysConfig->MaxChargingCurrent * 10,
-            pSysConfig->MaxChargingPower * 10);
-
-    printf ("Index = %d, MaxPow = %f, MaxVol = %f, MaxCur = %f\n",
-            _GunIndex,
-            pDcChargingInfo->RealMaxPower,
-            pDcChargingInfo->RealMaxVoltage,
-            pDcChargingInfo->RealMaxCurrent);
-}
-
-static void setConfirmSelGun(uint8_t selGun)
-{
-    if (selGun == LEFT_GUN_NUM && ShmSelectGunInfo->SelGunInfo.LeftGun == SEL_GUN_RELEASE) {
-        ShmSelectGunInfo->SelGunInfo.LeftGun = SEL_GUN_CONFIRM;
-        //printf("confirmSelGun left\r\n");
-    } else if (selGun == RIGHT_GUN_NUM && ShmSelectGunInfo->SelGunInfo.RightGun == SEL_GUN_RELEASE) {
-        ShmSelectGunInfo->SelGunInfo.RightGun = SEL_GUN_CONFIRM;
-        //printf("confirmSelGun right\r\n");
-    }
-}
-
-void RunUnconditionalChargeIndex1(char *v1, char *v2, char *v3)
-{
-    int _GunIndex;
-    uint8_t gunIndex = 0;
-    uint8_t stopChg = 0;
-    uint8_t curGun = 0;
-    int isContinue = 1;
-    float _Voltage;
-    float _Current;
-    uint8_t PreviousSystemStatus[2] = {0xff};
-    char *usageMsg = "Usage:\n"
-                     "       strchg <index> <voltage> <current>    ex: strchg 0 150 2\n"
-                     "       chg    <voltage> <current>            ex: chg 500 100\n"
-                     "       c      <index>                        ex: c 0\n"
-                     "       help | ? | h\n"
-                     "\r\n";
-
-    if (strcmp(v1, "auto") == EQUAL) {
-        _usingAutoRun = 0x01;
-        _GunIndex = 0;
-        _Voltage = 500;
-        _Current = (pSysConfig->MaxChargingPower * 1000) / _Voltage;
-    } else {
-        _usingAutoRun = 0x00;
-        _GunIndex = atoi(v1);
-        _Voltage = atof(v2);
-        _Current = atof(v3);
-    }
-
-    pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(_GunIndex);
-
-    printf("Power = %d, ReqVoltage = %f, ReqCurrent = %f\n",
-           pSysConfig->MaxChargingPower,
-           _Voltage,
-           _Current);
-
-    if (_Voltage > 1000 || _Voltage < 50) {
-        printf ("Input Voltage over range\n");
-        return;
-    }
-
-    //kill ev task
-    system("killall Module_EvComm");
-
-    pSysInfo->CurGunSelected = _GunIndex;
-
-    while (isContinue) {
-
-        curGun = pSysInfo->CurGunSelected;
-        pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(curGun);
-
-        //fix gun 1
-        switch (pDcChargingInfo->SystemStatus) {
-        case S_IDLE:
-            if (PreviousSystemStatus[curGun] != pDcChargingInfo->SystemStatus) {
-                PreviousSystemStatus[curGun] = pDcChargingInfo->SystemStatus;
-#if defined DD360Audi
-                setConfirmSelGun(curGun);
-#endif //defined DD360Audi
-
-                strcpy((char *)pSysConfig->UserId, "AutoStartCharging");
-                pDcChargingInfo->ConnectorPlugIn = 1;
-                printf ("[UnconditionalCharge - S_IDLE]\n");
-                pDcChargingInfo->Type = 9;
-
-            }
-            if (ShmOCPP16Data->SpMsg.bits.AuthorizeConf == 1) {
-                pSysInfo->StartToChargingFlag = 0x01;
-                pDcChargingInfo->SystemStatus = S_PREPARNING;
-            }
-            break;
-
-        case S_PREPARNING:
-            if (PreviousSystemStatus[curGun] != pDcChargingInfo->SystemStatus) {
-                PreviousSystemStatus[curGun] = pDcChargingInfo->SystemStatus;
-
-                printf ("[UnconditionalCharge - S_PREPARNIN]\n");
-
-                //等待 AC Relay 搭上且找到模組 (main 在此 statue 其它 task 會去做完)
-                printf ("wait find module\n");
-
-            }
-            //main 會在此階段判斷以下資料跳到下一個 state
-            //用來得知 AC 是否有搭上 (搭上模組的資訊才會出來) 因為每次  AC_Contactor
-            //ShmPsuData->SystemPresentPsuQuantity;
-            //ShmPsuData->PsuGroup[gun_index].GroupPresentPsuQuantity;
-            //ShmPsuData->PsuGroup[gun_index].GroupAvailablePower;
-            //_chargingData[gun_index]->AvailableChargingPower;
-
-            //等待 AC Relay 搭上且找到模組 (main 在此 statue 其它 task 會去做完)
-            //sleep(10);
-
-            //清除 main timeout 機制
-            pDcChargingInfo->TimeoutFlag = 0;
-            //不論是什麼 type 的槍都固意設成 Chademo 不跑 Prechage step
-            pDcChargingInfo->Type = 9;
-            break;
-
-        case S_PREPARING_FOR_EV:
-            if (PreviousSystemStatus[curGun] != pDcChargingInfo->SystemStatus) {
-                PreviousSystemStatus[curGun] = pDcChargingInfo->SystemStatus;
-
-                printf ("[UnconditionalCharge - S_PREPARING_FOR_EV]\n");
-                printf ("ReqVoltage = %f, ReqCurrent = %f \n", _Voltage * 10, _Current * 10);
-
-            }
-            //清除 main timeout 機制
-            pDcChargingInfo->TimeoutFlag = 0;
-            //不論是什麼 type 的槍都固意設成 Chademo 不跑 Prechage step
-            pDcChargingInfo->Type = 9;
-
-            //充電電壓電流
-            pDcChargingInfo->EvBatterySoc             = 50;
-            pDcChargingInfo->EvBatterytargetVoltage   = 500;
-            pDcChargingInfo->EvBatterytargetCurrent   = 2;
-            pDcChargingInfo->AvailableChargingCurrent = 1000;
-
-            //****** 注意~此行為是防止 K1K2 先開導到無法升壓 ( Relay Board 在此 state 還未搭上 K1K2 )
-            //確定模組己升壓完成
-            //if(pDcChargingInfo->PresentChargingVoltage <=  (3000+500) &&
-            //  pDcChargingInfo->PresentChargingVoltage >=  (3000-500) )
-            {
-                printf ("Precharge Done = %f \n",
-                        pDcChargingInfo->PresentChargingVoltage);
-                //EV done
-                pDcChargingInfo->SystemStatus = S_PREPARING_FOR_EVSE;
-            }
-            break;
-
-        case S_PREPARING_FOR_EVSE:
-            if (PreviousSystemStatus[curGun] != pDcChargingInfo->SystemStatus) {
-                PreviousSystemStatus[curGun] = pDcChargingInfo->SystemStatus;
-
-                printf ("[UnconditionalCharge - S_PREPARING_FOR_EVSE]\n");
-
-            }
-            //printf ("tar vol = %d \n", _Voltage);
-            //printf ("tar cur = %d \n", _Current);
-
-            //清除 main timeout 機制
-            pDcChargingInfo->TimeoutFlag = 0;
-            //不論是什麼 type 的槍都固意設成 Chademo 不跑 Prechage step
-            pDcChargingInfo->Type = 9;
-
-            //充電電壓電流
-            pDcChargingInfo->EvBatterySoc = 50;
-            pDcChargingInfo->EvBatterytargetVoltage = 500;
-            pDcChargingInfo->EvBatterytargetCurrent = 2;
-            pDcChargingInfo->AvailableChargingCurrent = 1000;
-
-            //printf ("tar vol_ = %d \n", pDcChargingInfo->EvBatterytargetVoltage);
-            // printf ("tar cur_ = %d \n", pDcChargingInfo->EvBatterytargetCurrent);
-
-            //****** 注意~此行為是防止 K1K2 先開導到無法升壓 ( Relay Board 在此 state 還未搭上 K1K2 )
-            //確定模組己升壓完成
-            if (pDcChargingInfo->GroundFaultStatus == 0x01 ||
-                    pDcChargingInfo->GroundFaultStatus == 0x03) {
-                printf ("First Ground Fault State (%d)\n",
-                        pDcChargingInfo->GroundFaultStatus);
-                printf ("Wait K1K2 = %f \n", pDcChargingInfo->PresentChargingVoltage);
-                sleep(5);
-                //EV done
-                pDcChargingInfo->SystemStatus = S_CHARGING;
-            } else if (pDcChargingInfo->GroundFaultStatus > 0x02) {
-                printf ("First Ground Fault check Fail (%d)\n",
-                        pDcChargingInfo->GroundFaultStatus);
-                pDcChargingInfo->SystemStatus = S_TERMINATING;
-            }
-            break;
-
-        case S_CHARGING:
-            if (PreviousSystemStatus[curGun] != pDcChargingInfo->SystemStatus) {
-                PreviousSystemStatus[curGun] = pDcChargingInfo->SystemStatus;
-
-                if (_usingAutoRun == 0x00) {
-                    //充電電壓電流
-                    pDcChargingInfo->EvBatterytargetVoltage = _Voltage;
-                    pDcChargingInfo->EvBatterytargetCurrent = _Current;
-                } else {
-                    _curAutoRunCount = 0;
-                    gettimeofday(&_autoTime, NULL);
-                }
-
-                pDcChargingInfo->EvBatterySoc = 50;
-                pDcChargingInfo->AvailableChargingCurrent = 1000;
-
-                printf ("[UnconditionalCharge - S_CHARGING]\n");
-            }
-
-            if (_usingAutoRun == 0x01) {
-                if (((GetTimeoutValue(_autoTime)) >= AUTORUN_STEP1_TIME_START * 60 &&
-                        (GetTimeoutValue(_autoTime)) <= AUTORUN_STEP1_TIME_END * 60) ||
-                        ((GetTimeoutValue(_autoTime)) >= AUTORUN_STEP2_TIME_START * 60 &&
-                         (GetTimeoutValue(_autoTime)) <= AUTORUN_STEP2_TIME_END * 60)
-                   ) {
-                    pDcChargingInfo->EvBatterytargetVoltage = _Voltage;
-                    pDcChargingInfo->EvBatterytargetCurrent = _Current;
-                } else if ((GetTimeoutValue(_autoTime)) >= AUTORUN_END_TIME * 60) {
-                    _curAutoRunCount++;
-                    if (_curAutoRunCount >= AUTORUN_CYCLE_COUNT) {
-                        pDcChargingInfo->SystemStatus = S_TERMINATING;
-                    } else {
-                        gettimeofday(&_autoTime, NULL);
-                    }
-                } else {
-                    pDcChargingInfo->EvBatterytargetVoltage = 0;
-                    pDcChargingInfo->EvBatterytargetCurrent = 0;
-                }
-            }
-
-//              printf("out : vol = %f, cur = %f \n",
-//                      pDcChargingInfo->EvBatterytargetVoltage,
-//                      pDcChargingInfo->EvBatterytargetCurrent);
-            //ev task do this
-            pDcChargingInfo->PresentChargingPower =
-                ((float)((pDcChargingInfo->PresentChargingVoltage) *
-                         (pDcChargingInfo->PresentChargingCurrent)) / 1000);
-
-            if (pDcChargingInfo->GroundFaultStatus == 0x02) {
-                printf ("Charging Ground Fault check Fail (%d)\n",
-                        pDcChargingInfo->GroundFaultStatus);
-                pDcChargingInfo->SystemStatus = S_TERMINATING;
-            }
-            break;
-
-        case S_TERMINATING:
-            if (PreviousSystemStatus[curGun] != pDcChargingInfo->SystemStatus) {
-                PreviousSystemStatus[curGun] = pDcChargingInfo->SystemStatus;
-
-                printf ("[UnconditionalCharge - S_TERMINATING]\n");
-                //無阻塞偵測 keybaord 結束
-                system(STTY_DEF TTY_PATH);
-            }
-
-            pDcChargingInfo->SystemStatus = S_COMPLETE;
-            break;
-
-        case S_COMPLETE:
-            if (PreviousSystemStatus[curGun] != pDcChargingInfo->SystemStatus) {
-                PreviousSystemStatus[curGun] = pDcChargingInfo->SystemStatus;
-
-                printf ("[UnconditionalCharge - S_COMPLETE]\n");
-            }
-
-            PreviousSystemStatus[curGun] = 0xFF;
-            stopChg = 0;
-            for (gunIndex = 0; gunIndex < pSysConfig->TotalConnectorCount; gunIndex++) {
-                if (PreviousSystemStatus[gunIndex] == 0xFF) {
-                    pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(curGun);
-                    pDcChargingInfo->SystemStatus = S_IDLE;
-                } else {
-                    pSysInfo->CurGunSelected = gunIndex;
-                }
-
-                pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(gunIndex);
-                if (pDcChargingInfo->SystemStatus == S_IDLE) {
-                    stopChg++;
-                }
-            }
-
-            pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(curGun);
-            pDcChargingInfo->PresentChargingPower = 0;
-
-            if (stopChg == pSysConfig->TotalConnectorCount) {
-                system("/root/Module_EvComm &");
-                sleep(3);
-
-                for (_GunIndex = 0; _GunIndex < pSysConfig->TotalConnectorCount; _GunIndex++) {
-                    pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(_GunIndex);
-
-                    pDcChargingInfo->SystemStatus = S_IDLE;
-                }
-                return;
-            }
-            break;
-        }
-
-        if (readCmdKey(CMD_KEY_DONT_WAIT) == NO) {
-            continue;
-        }
-
-        if (strcmp(newString[0], "strchg") == 0) {
-            if (strcmp(newString[1], "-1") == 0 ||
-                    strcmp(newString[1], "") == 0 ||
-                    strcmp(newString[2], "-1") == 0 ||
-                    strcmp(newString[2], "") == 0
-               ) {
-                printf ("Input cmd fail ------  strchg [vol 150-1000] [cru 2-100]\n");
-                continue;
-            }
-
-            if (atoi(newString[1]) == pSysInfo->CurGunSelected) {
-                continue;
-            }
-
-            _GunIndex = atoi((char *)newString[1]);
-            _Voltage = atof((char *)newString[2]);
-            _Current = atof((char *)newString[3]);
-
-            printf ("Power = %d, ReqVoltage = %f, ReqCurrent = %f\n",
-                    pSysConfig->MaxChargingPower,
-                    _Voltage,
-                    _Current);
-
-            if (_Voltage > 1000 || _Voltage < 50) {
-                _Voltage = 200;
-                printf ("Input Voltage over range\n");
-                continue;
-            }
-
-            pSysInfo->CurGunSelected = _GunIndex;
-            strcpy((char *)pSysConfig->UserId, "");
-        } else if (strcmp(newString[0], "chg") == 0) {
-            if (strcmp(newString[1], "-1") == 0) {
-                continue;
-            }
-
-            if (strcmp(newString[2], "-1") == 0 ||
-                    strcmp(newString[2], "") == 0) {
-                continue;
-            }
-
-            if (strcmp(newString[3], "-1") == 0 ||
-                    strcmp(newString[3], "") == 0) {
-                continue;
-            }
-
-            _GunIndex = atoi((char *)newString[1]);
-            float _vol = atof(newString[2]);
-            float _cur = atof(newString[3]);
-
-            if (_cur <= 0 || _cur <= 0) {
-                continue;
-            }
-
-            pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(_GunIndex);
-
-            printf("reset vol = %f, cur = %f \n", _vol, _cur);
-            pDcChargingInfo->EvBatterytargetVoltage = _vol;
-            pDcChargingInfo->EvBatterytargetCurrent = _cur;
-        } else if (strcmp(newString[0], "c") == 0) {
-            if (strcmp(newString[1], "-1") == 0 ||
-                    strcmp(newString[1], "") == 0) {
-                printf("argc 1 is error parameter\r\n");
-                continue;
-            }
-
-            if (atoi((char *)newString[1]) != -1) {
-                pSysInfo->CurGunSelected = atoi((char *)newString[1]);
-            }
-            printf("stop \n\r");
-
-            pSysInfo->StartToChargingFlag = 0x00;
-
-            pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData( pSysInfo->CurGunSelected);
-
-            pDcChargingInfo->SystemStatus = S_TERMINATING;
-        } else if (helpCmd() == YES) {
-            printf("%s\n", usageMsg);
-        }
-
-        usleep(100000);
-    }
-}
-
-int printTimeMsg(const char *fmt, ...)
-{
-    char Buf[4096 + 256] = {0};
-    char buffer[4096] = {0};
-    int rc = -1;
-    va_list args;
-    struct timeb  SeqEndTime;
-    struct tm *tm;
-    struct SysConfigData *pSysConfig = (struct SysConfigData *)GetShmSysConfigData();
-
-    va_start(args, fmt);
-    rc = vsnprintf(buffer, sizeof(buffer), fmt, args);
-    va_end(args);
-
-    ftime(&SeqEndTime);
-    SeqEndTime.time = time(NULL);
-    tm = localtime(&SeqEndTime.time);
-
-    sprintf(Buf, "%02d:%02d:%02d:%03d - %s",
-            tm->tm_hour,
-            tm->tm_min,
-            tm->tm_sec,
-            SeqEndTime.millitm,
-            buffer);
-    printf("%s", Buf);
-
-    return rc;
-}
-
-static void resdGunAndChillerTemp(void)
-{
-    int isContinue = 1;
-    uint8_t i = 0;
-    uint32_t sleepTime = 500000;
-    uint32_t loopTime = 1000;
-    struct timeb showTime;
-    struct timeb nowTime;
-
-    char *usageMsg = "Usage:\n"
-                     "       t <index>: loop time, ex: t 1\n"
-                     "       exit | c | C: exit test\n"
-                     "       h | help | ?: show usage message\n"
-                     "\r\n";
-
-    ftime(&showTime);
-
-    while (isContinue) {
-        ftime(&nowTime);
-
-        if (DiffTimeb(showTime, nowTime) > loopTime ||
-                DiffTimeb(showTime, nowTime) < 0) {
-            for (i = 0; i < pSysConfig->TotalConnectorCount; i++) {
-
-                pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(i);
-
-                printTimeMsg("get gun %d temp = %3d, chiller = %3d, ConnTemp = %3d, %3d,SysTemp = %3d, %3d, %3d, %3d\r\n",
-                             i,
-                             pDcChargingInfo->ConnectorTemp,
-                             pDcChargingInfo->ChillerTemp,
-                             ShmDcCommonData->ConnectorTemp[i][0],
-                             ShmDcCommonData->ConnectorTemp[i][1],
-                             ShmDcCommonData->SystemTemp[0],
-                             ShmDcCommonData->SystemTemp[1],
-                             ShmDcCommonData->SystemTemp[2],
-                             ShmDcCommonData->SystemTemp[3]);
-            }//for
-            ftime(&showTime);
-        }
-
-        if (readCmdKey(CMD_KEY_DONT_WAIT) == NO) {
-            usleep(sleepTime);
-            continue;
-        }
-
-        if (strcmp(newString[0], "t") == 0) {
-            if (strcmp(newString[1], "-1") == 0 ||
-                    strcmp(newString[1], "") == 0 ||
-                    atoi((char *)newString[1]) > 255
-               ) {
-                printf("argc 1 is error parameter\r\n");
-                continue;
-            }
-
-            loopTime = ((atoi((char *)newString[1])) * 1000);
-            printf("loopTime = %d\r\n", loopTime);
-            ftime(&showTime);
-            continue;
-        } else if (exitCmd() == YES) {
-            return;
-        } else if (helpCmd() == YES) {
-            printf ("%s\n", usageMsg);
-        }
-
-        usleep(sleepTime);
-    }//while
-}
-
-static void writeGunAndChillerTemp(void)
-{
-    uint8_t _GunIndex = 0;
-    int isContinue = 1;
-    uint32_t sleepTime = 500000;
-    char *usageMsg = "Usage:\n"
-                     "       conn    <index> <temp>, ex: conn 0 150\n"
-                     "       chiller <index> <temp>, ex: chiller 0 150\n"
-                     "       tempR\n"
-                     "       exit | c | C\n"
-                     "       help | ? | h\n"
-                     "\r\n";
-
-    ShmDcCommonData->TestTemperature = YES;
-
-    while (isContinue) {
-        if (readCmdKey(CMD_KEY_WAIT) == NO) {
-            sleep(sleepTime);
-            continue;
-        }
-
-        if (helpCmd() == YES) {
-            printf ("%s\n", usageMsg);
-            continue;
-        } else if (exitCmd() == YES) {
-            ShmDcCommonData->TestTemperature = NO;
-            sleep(1);
-            return;
-        } else if (strcmp(newString[0], "tempR") == 0) {
-            resdGunAndChillerTemp();
-        }
-
-        if ((strcmp(newString[0], "chiller") != 0) &&
-                (strcmp(newString[1], "-1") == 0 ||
-                 strcmp(newString[1], "") == 0)
-           ) {
-            printf("argc 1 is error parameter\r\n");
-            continue;
-        }
-
-        if (atoi(newString[2]) > 255 ||
-                atoi(newString[2]) == -1) {
-            printf("temperature value overflow\r\n");
-            continue;
-        }
-
-        _GunIndex = atoi((char *)newString[1]);
-
-        if (_GunIndex >= pSysConfig->TotalConnectorCount) {
-            printf("gun index over total connector\r\n");
-            continue;
-        }
-
-        if (strcmp(newString[0], "chiller") == 0) {//修改水冷機溫度值
-            if (_GunIndex >= 1) {
-                _GunIndex = 0; //只會有一個水冷機
-            }
-
-            pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(_GunIndex);
-            pDcChargingInfo->ChillerTemp = atoi(newString[2]);
-            printf("set %d chiller temperature = %d\r\n",
-                   _GunIndex,
-                   pDcChargingInfo->ChillerTemp);
-        } else if (strcmp(newString[0], "conn") == 0) {//修改槍頭溫度值
-            pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(_GunIndex);
-
-            pDcChargingInfo->ConnectorTemp = atoi(newString[2]);
-            printf("set %d connector temp = %d\r\n",
-                   _GunIndex,
-                   pDcChargingInfo->ConnectorTemp);
-        }
-
-        usleep(sleepTime);
-    }//while
-}
-
-int main(void)
-{
-    uint8_t _GunIndex = 0;
-    int isContinue = 1;
-    char *usageMsg = "Usage:\n"
-                     "       state <index>                     : get gun state\n"
-                     "       card                              : scanning card (x)\n"
-                     "       gun <index>                       : get gun plugit state\n"
-                     "       lock <index>                      : get gun locked state\n"
-                     "       sysid                             : test system ID\n"
-                     "       self                              : self test state (x)\n"
-                     "       version | v | -v                  : version of board (407 or relay or other)\n"
-                     "       update                            : update firmware\n"
-                     "       ac                                : get ac relay state (x) \n"
-                     "       cable <index> <state>             : set ground fault state\n"
-                     "       pow <index> <power>               : set power value\n"
-                     "       model                             : get system information\n"
-                     "       temp                              : get PSU temperature\n"
-                     "       fan <speed>                       : set fan board speed\n"
-                     "       strchg <auto>                     : auto test charging\n"
-                     "       strchg <index> <voltage <current> : select gun test charging\n"
-                     "       tempW                             : write connector header and Chiller temperature\r\n"
-                     "       tempR                             : print connector header and chiller temperature\r\n"
-    			     "       btnl                              : press left button\n"
-    			  	 "       btnr                              : press right button\n"
-                     "\r\n";
-
-    if (CreateAllCsuShareMemory() == FAIL) {
-        printf("create share memory error\r\n");
-        return FAIL;
-    }
-
-    MappingGunChargingInfo("ReadCmdline Task");
-
-    pSysConfig = (struct SysConfigData *)GetShmSysConfigData();
-    pSysInfo = (struct SysInfoData *)GetShmSysInfoData();
-    pSysWarning = (struct WARNING_CODE_INFO *)GetShmSysWarningInfo();
-
-    pAlarmCode = (struct AlarmCodeData *)GetShmAlarmCodeData();
-
-    ShmCHAdeMOData = (struct CHAdeMOData *)GetShmCHAdeMOData();
-    ShmGBTData = (struct GBTData *)GetShmGBTData();
-    ShmCcsData = (struct CcsData *)GetShmCcsData();
-
-    ShmPrimaryMcuData = (struct PrimaryMcuData *)GetShmPrimaryMcuData();
-    ShmFanModuleData = (struct FanModuleData *)GetShmFanModuleData();
-    ShmRelayModuleData = (struct RelayModuleData *)GetShmRelayModuleData();
-    ShmLedModuleData = (struct LedModuleData *)GetShmLedModuleData();
-    ShmPsuData = (struct PsuData *)GetShmPsuData();
-    ShmOCPP16Data = (struct OCPP16Data *)GetShmOCPP16Data();
-    ShmSelectGunInfo = (SelectGunInfo *)GetShmSelectGunInfo();
-    ShmDcCommonData = (DcCommonInfo *)GetShmDcCommonData();
-
-//    for (_GunIndex = 0; _GunIndex < pSysConfig->TotalConnectorCount; _GunIndex++) {
-//        pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(_GunIndex);
-
-//        pDcChargingInfo->SystemStatus = S_IDLE;
-//    }
-
-    while (isContinue) {
-        if (readCmdKey(CMD_KEY_WAIT) == NO) {
-            continue;
-        }
-
-        if (strcmp(newString[0], "state") == 0) {
-            if (strcmp(newString[1], "-1") == 0 ||
-                    strcmp(newString[1], "") == 0) {
-                continue;
-            }
-
-            // 槍狀態
-            RunStatusProc(newString[1], newString[2]);
-        } else if (strcmp(newString[0], "card") == 0) {
-            // 刷卡狀態
-            RunCardProc(newString[1], newString[2]);
-        } else if (strcmp(newString[0], "gun") == 0) {
-            if (strcmp(newString[1], "-1") == 0 || strcmp(newString[1], "") == 0) {
-                continue;
-            }
-
-            // 插槍狀態
-            RunGunPlugitProc(newString[1], newString[2]);
-        } else if (strcmp(newString[0], "lock") == 0) {
-            if (strcmp(newString[1], "-1") == 0 || strcmp(newString[1], "") == 0) {
-                continue;
-            }
-
-            // 插槍狀態
-            GetGunLockStatusProc(newString[1], newString[2]);
-        } else if (strcmp(newString[0], "sysid") == 0) {
-            // 測試 sys id
-            SetSystemIDProc();
-        } else if (strcmp(newString[0], "self") == 0) {
-            // CSU 自我檢測狀態
-            RunSelfProc(newString[1]);
-        } else if (strcmp(newString[0], "version") == 0 ||
-                   strcmp(newString[0], "v") == 0 ||
-                   strcmp(newString[0], "-v") == 0) {
-            //if (strcmp(newString[1], "-1") == 0 || strcmp(newString[1], "") == 0) {
-            //    continue;
-            //}
-            // 取 FW 版號
-            GetFwVerProc();
-        } else if (strcmp(newString[0], "update") == 0) {
-            // 更新
-            FwUpdateFlagProc(newString[1]);
-        } else if (strcmp(newString[0], "ac") == 0) {
-            // AC contactor 狀態
-            CheckAcStatus(newString[1]);
-        } else if (strcmp(newString[0], "cable") == 0) {
-            if (strcmp(newString[1], "-1") == 0 || strcmp(newString[1], "") == 0) {
-                continue;
-            }
-
-            // cable check pass
-            SetCableChkStatus(newString[1], newString[2]);
-        } else if (strcmp(newString[0], "pow") == 0) {
-            if (strcmp(newString[1], "-1") == 0 ||
-                    strcmp(newString[1], "") == 0) {
-                continue;
-            }
-            // cable check pass
-            SetPowerValue(newString[1], newString[2]);
-        } else if (strcmp(newString[0], "model") == 0) {
-            GetSystemInfo();
-        } else if (strcmp(newString[0], "select") == 0) {
-            // 取得 / 設定 當前選的槍號
-            GetGunSelectedNum(newString[1]);
-        } else if (strcmp(newString[0], "change") == 0) {
-            // 模擬按鈕改變選槍
-            ChangeGunNum();
-        } else if (strcmp(newString[0], "fan") == 0) {
-            // 設定風扇速度
-            SetFanSpeed(newString[1]);
-        } else if (strcmp(newString[0], "speed") == 0) {
-            // 取得風扇速度
-            GetFanSpeed();
-        } else if (strcmp(newString[0], "debug") == 0) {
-            // 設定 debug mode
-            SetDebugMode(newString[1]);
-        } else if (strcmp(newString[0], "gfd") == 0) {
-            // 設定盲沖使用 GFD 功能
-            SetGFDMode(newString[1]);
-        } else if (strcmp(newString[0], "temp") == 0) {
-            // 取得 PSU 溫度
-            GetPsuTemp();
-        } else if (strcmp(newString[0], "acin") == 0) {
-            // 取得三向輸入電壓
-            GetAcInputVol();
-        } else if (strcmp(newString[0], "psu") == 0) {
-            //如果連一個參數都沒有 (此命令不理會) 加上判斷第二參數
-            if (strcmp(newString[1], "-1") == 0 ||
-                    strcmp(newString[1], "") == 0) {
-                printf ("PSU : Param fail..Please retry again......\n");
-                continue;
-            }
-            // 取得 PSU 資訊
-            GetPsuInformation(newString[1], newString[2], newString[3]);
-        } else if (strcmp(newString[0], "cap") == 0) {
-            GetConnectorCapInfo(newString[1]);
-        } else if (strcmp(newString[0], "error") == 0) {
-            CreateOneError(newString[1]);
-        } else if (strcmp(newString[0], "auth") == 0) {
-            GetAuthorizeFlag(newString[1]);
-        } else if (strcmp(newString[0], "relay") == 0) {
-            GetRelayStatus(newString[1]);
-        } else if (strcmp(newString[0], "ccid") == 0) {
-            if (strcmp(newString[1], "-1") == 0 || strcmp(newString[1], "") == 0 ||
-                    strcmp(newString[2], "-1") == 0 || strcmp(newString[2], "") == 0) {
-                printf ("Input ccid fail.\n");
-                continue;
-            }
-            SetChargingInfoCCID(newString[1], newString[2]);
-        } else if (strcmp(newString[0], "strchg") == 0) {
-            //如果連一個參數都沒有 (此命令不理會) 加上判斷第二參數
-            if (strcmp(newString[1], "auto") == 0) {
-                newString[2][0] = 0;
-                newString[3][0] = 0;
-            } else if (strcmp(newString[1], "-1") == 0 ||
-                       strcmp(newString[1], "") == 0   ||
-                       strcmp(newString[2], "-1") == 0 ||
-                       strcmp(newString[2], "") == 0) {
-                printf ("Input cmd fail ------  strchg [vol 150-1000] [cru 2-100]\n");
-                continue;
-            }
-
-            // 槍狀態
-            RunUnconditionalChargeIndex1(newString[1], newString[2], newString[3]);
-        } else if (strcmp(newString[0], "tempW") == 0) { //測試槍頭和水冷機溫度
-            writeGunAndChillerTemp();
-        } else if (strcmp(newString[0], "tempR") == 0) { //讀取槍頭和水冷機溫度
-            resdGunAndChillerTemp();
-        } else if (strcmp(newString[0], "btnl") == 0) {
-        	ShmPrimaryMcuData->InputDet.bits.Button1 = BTN_PRESS;
-        	sleep(1);
-        	ShmPrimaryMcuData->InputDet.bits.Button1 = BTN_RELEASE;
-        } else if (strcmp(newString[0], "btnr") == 0) {
-        	ShmPrimaryMcuData->InputDet.bits.Button2 = BTN_PRESS;
-        	sleep(1);
-        	ShmPrimaryMcuData->InputDet.bits.Button2 = BTN_RELEASE;
-        } else {
-            printf("%s\n", usageMsg);
-        }
-
-        sleep(1);
-    }//while
-
-    return 0;
-}
+/*
+ * Main.c
+ *
+ *  Created on: 2019年8月6日
+ *      Author: 7564
+ */
+
+
+#include <sys/time.h>
+#include <sys/timeb.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+#include <sys/ipc.h>
+#include <sys/shm.h>
+#include <sys/shm.h>
+#include <sys/mman.h>
+#include <linux/wireless.h>
+#include <arpa/inet.h>
+#include <netinet/in.h>
+
+#include <unistd.h>
+#include <stdarg.h>
+#include <stdio.h>      /*標準輸入輸出定義*/
+#include <stdlib.h>     /*標準函數庫定義*/
+#include <stdint.h>
+#include <unistd.h>     /*Unix 標準函數定義*/
+#include <fcntl.h>      /*檔控制定義*/
+#include <termios.h>    /*PPSIX 終端控制定義*/
+#include <errno.h>      /*錯誤號定義*/
+#include <errno.h>
+#include <string.h>
+#include <time.h>
+#include <ctype.h>
+#include <ifaddrs.h>
+#include <math.h>
+#include <stdbool.h>
+
+#include "./ShareMemory/shmMem.h"
+#include "./Define/define.h"
+#include "./SelectGun/SelectGun.h"
+#include "Config.h"
+
+//------------------------------------------------------------------------------
+#define CMD_KEY_WAIT                                (1)
+#define CMD_KEY_DONT_WAIT                           (0)
+
+#define DEFAULT_AC_INDEX                            (2)
+
+#define AUTORUN_STEP1_TIME_START                    (140)             // Minutes
+#define AUTORUN_STEP1_TIME_END                      (150)
+#define AUTORUN_STEP2_TIME_START                    (210)
+#define AUTORUN_STEP2_TIME_END                      (410)
+#define AUTORUN_END_TIME                            (480)
+#define AUTORUN_CYCLE_COUNT                         (30)
+
+#define TTY_PATH                                    "/dev/tty"
+#define STTY_US                                     "stty raw -echo -F "
+#define STTY_DEF                                    "stty -raw echo -F "
+
+//------------------------------------------------------------------------------
+uint8_t _curAutoRunCount = 0;
+uint8_t _usingAutoRun = 0;
+struct timeval _autoTime;
+
+static struct SysConfigData *pSysConfig = NULL;
+static struct SysInfoData *pSysInfo = NULL;
+static struct WARNING_CODE_INFO *pSysWarning = NULL;
+
+static struct AlarmCodeData *pAlarmCode = NULL;
+
+static struct PrimaryMcuData *ShmPrimaryMcuData = NULL;
+static struct CHAdeMOData *ShmCHAdeMOData = NULL;
+static struct CcsData *ShmCcsData = NULL;
+static struct GBTData *ShmGBTData = NULL;
+static struct FanModuleData *ShmFanModuleData = NULL;
+static struct RelayModuleData *ShmRelayModuleData = NULL;
+static struct LedModuleData *ShmLedModuleData = NULL;
+static struct PsuData *ShmPsuData = NULL;
+static struct OCPP16Data *ShmOCPP16Data = NULL;
+static SelectGunInfo *ShmSelectGunInfo = NULL;
+static DcCommonInfo *ShmDcCommonData = NULL;
+
+static struct ChargingInfoData *pDcChargingInfo = NULL;
+static struct ChargingInfoData *pAcChargingInfo = NULL;
+
+static char newString[8][16] = {0};
+
+//------------------------------------------------------------------------------
+static int DiffTimeb(struct timeb ST, struct timeb ET)
+{
+    //return milli-second
+    unsigned int StartTime, StopTime;
+
+    StartTime = (unsigned int)ST.time;
+    StopTime = (unsigned int)ET.time;
+
+    return (StopTime - StartTime) * 1000 + ET.millitm - ST.millitm;
+}
+
+static void get_char(char *word)
+{
+    fd_set rfds;
+    struct timeval tv;
+
+    FD_ZERO(&rfds);
+    FD_SET(0, &rfds);
+    tv.tv_sec = 0;
+    tv.tv_usec = 10; //wait input timout time
+
+    //if input
+    if (select(1, &rfds, NULL, NULL, &tv) > 0) {
+        fgets(word, 128, stdin);
+    }
+}
+
+static uint8_t helpCmd(void)
+{
+    if (strcmp(newString[0], "?") == 0 ||
+            strcmp(newString[0], "help") == 0 ||
+            strcmp(newString[0], "h") == 0) {
+        return YES;
+    }
+
+    return NO;
+}
+
+static uint8_t exitCmd(void)
+{
+    if (strcmp(newString[0], "c") == EQUAL ||
+            strcmp(newString[0], "C") == EQUAL ||
+            strncmp(&newString[0][0], "exit", 4) == EQUAL
+       ) {
+        return YES;
+    }
+
+    return NO;
+}
+
+static uint8_t readCmdKey(uint8_t state)
+{
+    char word[128] = {0};
+    int i = 0, j = 0, ctr = 0;
+
+    memset(word, 0, sizeof(word));
+    if (state == CMD_KEY_WAIT) {
+        fgets(word, sizeof(word), stdin);
+    } else if (state == CMD_KEY_DONT_WAIT) {
+        get_char(word);
+
+        if (strlen(word) == 0) {
+            //usleep(50000);
+            return NO;
+        }
+    }
+
+    memset(newString, 0, sizeof(newString));
+
+    strcpy(newString[1], "-1");
+    strcpy(newString[2], "-1");
+    for (i = 0; i <= (strlen(word)); i++) {
+        if (word[i] == ' ' ||
+                word[i] == '\0' ||
+                word[i] == '\r' ||
+                word[i] == '\n' ||
+                word[i] == 10) {
+            newString[ctr][j] = '\0';
+            ctr++;
+            j = 0;
+        } else {
+            newString[ctr][j] = word[i];
+            j++;
+        }
+    }
+
+    return YES;
+}
+
+unsigned long GetTimeoutValue(struct timeval _sour_time)
+{
+    struct timeval _end_time;
+    gettimeofday(&_end_time, NULL);
+
+    return (_end_time.tv_sec - _sour_time.tv_sec);
+}
+
+void RunStatusProc(char *v1, char *v2)
+{
+    printf("OrderCharging = %d \n", pSysInfo->OrderCharging);
+    printf("WaitForPlugit = %d \n", pSysInfo->WaitForPlugit);
+    if (strcmp(v1, "ac") == 0) {
+        pAcChargingInfo = (struct ChargingInfoData *)GetAcChargingInfoData(0);
+        //if (!FindAcChargingInfoData(0, &ac_chargingInfo[0])) {
+        //    printf("FindChargingInfoData (AC) false \n");
+        //}
+        printf("AC Status = %d \n", pAcChargingInfo->ConnectorPlugIn);
+        return;
+    }
+
+    int _index = atoi(v1);
+
+    if (_index <= 1) {
+        //if (!FindChargingInfoData(_index, &_chargingData[0])) {
+        //    printf ("FindChargingInfoData error\n");
+        //    return;
+        //}
+        pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(_index);
+
+        if (strcmp(v2, "-1") == 0 || strcmp(v2, "") == 0) {
+            // get
+            printf ("index = %x, status = %x (%d)\n",
+                    _index,
+                    pDcChargingInfo->SystemStatus,
+                    pDcChargingInfo->IsAvailable);
+            printf ("SystemTimeoutFlag = %d, PageIndex = %d\n",
+                    pSysInfo->SystemTimeoutFlag, pSysInfo->PageIndex);
+        } else {
+            // set
+            pDcChargingInfo->SystemStatus = atoi(v2);
+        }
+    } else {
+        //if (!FindAcChargingInfoData(0, &ac_chargingInfo[0])) {
+        //    printf("FindChargingInfoData (AC) false \n");
+        //}
+        pAcChargingInfo = (struct ChargingInfoData *)GetAcChargingInfoData(0);
+
+        if (strcmp(v2, "-1") == 0 || strcmp(v2, "") == 0) {
+            // get
+            printf ("AC Type, status = %x (%d)\n",
+                    pAcChargingInfo->SystemStatus,
+                    pAcChargingInfo->IsAvailable);
+        } else {
+            // set
+            pAcChargingInfo->SystemStatus = atoi(v2);
+        }
+    }
+}
+
+void RunCardProc(char *v1, char *v2)
+{
+    if (strcmp(v1, "-1") == 0 || strcmp(v1, "") == 0) {
+        if (pSysInfo->WaitForPlugit) {
+            pSysInfo->WaitForPlugit = 0x00;
+            printf ("SysInfo.WaitForPlugit = %x \n", pSysInfo->WaitForPlugit);
+        } else {
+            pSysInfo->WaitForPlugit = 0x01;
+            printf ("SysInfo.WaitForPlugit = %x \n", pSysInfo->WaitForPlugit);
+        }
+    } else {
+        strcpy((char *)pSysConfig->UserId, "");
+        memcpy((char *)pSysConfig->UserId, v1, strlen(v1));
+        pSysConfig->UserId[strlen(v1)] = '\0';
+        printf("StartUserId = %s \n", pSysConfig->UserId);
+    }
+}
+
+void RunGunPlugitProc(char *v1, char *v2)
+{
+    if (strcmp(v1, "ac") == 0) {
+        //if (!FindAcChargingInfoData(0, &ac_chargingInfo[0])) {
+        //    printf("FindChargingInfoData (AC) false \n");
+        //}
+        pAcChargingInfo = (struct ChargingInfoData *)GetAcChargingInfoData(0);
+
+        if (strcmp(v2, "-1") == 0 || strcmp(v2, "") == 0) {
+            // get
+            printf("ConnectorPlugIn = %d \n", pAcChargingInfo->ConnectorPlugIn);
+        } else {
+            // set
+            pAcChargingInfo->ConnectorPlugIn = atoi(v2);
+        }
+        return;
+    }
+
+    int _index = atoi(v1);
+    //if (!FindChargingInfoData(_index, &_chargingData[0])) {
+    //    printf("FindChargingInfoData error\n");
+    //    return;
+    //}
+    pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(_index);
+
+    if (strcmp(v2, "-1") == 0 || strcmp(v2, "") == 0) {
+        // get
+        printf("index = %x, plug it = %x\n",
+               _index,
+               pDcChargingInfo->ConnectorPlugIn);
+    } else {
+        // set
+        pDcChargingInfo->ConnectorPlugIn = atoi(v2);
+    }
+}
+
+void GetGunLockStatusProc(char *v1, char *v2)
+{
+    int _index = atoi(v1);
+    //if (!FindChargingInfoData(_index, &_chargingData[0])) {
+    //    printf("FindChargingInfoData error\n");
+    //    return;
+    //}
+    pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(_index);
+
+    if (strcmp(v2, "-1") != 0 && strcmp(v2, "") != 0) {
+        pDcChargingInfo->GunLocked = atoi(v2);
+    }
+
+    printf("Gun Locked Status = %d \n", pDcChargingInfo->GunLocked);
+}
+
+void SetSystemIDProc()
+{
+    char *systemId = "Alston_Test";
+    memcpy(&pSysConfig->SystemId, systemId, strlen(systemId));
+}
+
+void RunSelfProc()
+{
+    printf("self test status = %x\n", pSysInfo->SelfTestSeq);
+}
+
+void GetFwVerProc(void)
+{
+    int _index = 0;
+    int isContinue = 1;
+    char *usageMsg = "Usage:\n"
+                     "      model\n"
+                     "      407\n"
+                     "      conn index, ex: conn 0 | 1\n"
+                     "      relay\n"
+                     "      fan\n"
+                     "      dc\n"
+                     "      led\n"
+                     "      ac\n"
+                     "      exit | c | C\n"
+                     "      help | ? | h\n";
+
+    while (isContinue) {
+        if (readCmdKey(CMD_KEY_WAIT) == NO) {
+            continue;
+        }
+
+        if (strcmp(newString[0], "407") == 0) {
+            printf("407 FW Version = %s\n", ShmPrimaryMcuData->version);
+        } else if (strcmp(newString[0], "model") == 0) {
+            printf("ModelName = %s\r\n", pSysConfig->ModelName);
+        } else if (strcmp(newString[0], "conn") == 0) {
+            if (strcmp(newString[1], "-1") == 0  ||
+                    strcmp(newString[1], "") == 0 ||
+                    atoi(newString[1]) >= pSysConfig->TotalConnectorCount
+               ) {
+                printf("index over flow\r\n");
+                continue;
+            }
+
+            _index = atoi(newString[1]);
+
+            if (_index == 0) {
+                printf("Gun 0 FW Version = %s \n", pSysInfo->Connector1FwRev);
+            } else if (_index == 1) {
+                printf("Gun 1 FW Version = %s \n", pSysInfo->Connector2FwRev);
+            }
+        } else if (strcmp(newString[0], "relay") == 0) {
+            printf("RB Version = %s \n", pSysInfo->RelayModuleFwRev);
+        } else if (strcmp(newString[0], "fan") == 0) {
+            printf("FAN Version = %s \n", pSysInfo->FanModuleFwRev);
+        } else if (strcmp(newString[0], "dc") == 0) {
+            printf("DC Main Version = %s \n", pSysInfo->CsuRootFsFwRev);
+        } else if (strcmp(newString[0], "led") == 0) {
+            printf("LED Version = %s \n", pSysInfo->LedModuleFwRev);
+        } else if (strcmp(newString[0], "ac") == 0) {
+            pAcChargingInfo = (struct ChargingInfoData *)GetAcChargingInfoData(0);
+
+            printf("AC Version = %s \n", pAcChargingInfo->version);
+        } else if (exitCmd() == YES) {
+            return;
+        } else if (helpCmd() == YES) {
+            printf ("%s\n", usageMsg);
+        }
+
+    }//while
+}
+
+void CreateOneError(char *v1)
+{
+    int value = atoi(v1);
+
+    pAlarmCode->AlarmEvents.bits.SystemL1InputOVP = value;
+    pSysConfig->BillingData.isBilling = value;
+}
+
+void GetAuthorizeFlag(char *v1)
+{
+    if (strcmp(v1, "-1") == 0 || strcmp(v1, "") == 0) {
+        printf("AuthorizeFlag = %d \n", pSysInfo->AuthorizeFlag);
+    } else {
+        pSysInfo->AuthorizeFlag = atoi(v1);
+    }
+}
+
+void GetRelayStatus(char *v1)
+{
+    int _index = atoi(v1);
+    //if (!FindChargingInfoData(_index, &_chargingData[0])) {
+    //    printf("FindChargingInfoData error\n");
+    //    return;
+    //}
+    pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(_index);
+
+    printf("RelayK1K2Status = %d \n", pDcChargingInfo->RelayK1K2Status);
+    printf("RelayKPK2Status = %d \n", pDcChargingInfo->RelayKPK2Status);
+}
+
+void FwUpdateFlagProc()
+{
+    pSysInfo->FirmwareUpdate = 0x01;
+}
+
+void CheckAcStatus(char *v1)
+{
+    if (strcmp(v1, "-1") == 0 || strcmp(v1, "") == 0) {
+        printf("AC Status = %d \n", pSysInfo->AcContactorStatus);
+    }
+}
+
+void SetCableChkStatus(char *v1, char *v2)
+{
+    int _index = atoi(v1);
+    //if (!FindChargingInfoData(_index, &_chargingData[0])) {
+    //    printf ("FindChargingInfoData error\n");
+    //    return;
+    //}
+    pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(_index);
+
+    pDcChargingInfo->GroundFaultStatus = atoi(v2);
+}
+
+void SetChargingInfoCCID(char *v1, char *v2)
+{
+    int _index = atoi(v1);
+    //if (!FindChargingInfoData(_index, &_chargingData[0])) {
+    //    printf ("FindChargingInfoData error\n");
+    //    return;
+    //}
+    pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(_index);
+
+    memcpy(pDcChargingInfo->EVCCID, v2, 8);
+    pDcChargingInfo->EVCCID[8] = '\0';
+}
+
+void SetPowerValue(char *v1, char *v2)
+{
+    int _index = atoi(v1);
+    float _Current = atof(v2);
+
+    //if (!FindChargingInfoData(_index, &_chargingData[0])) {
+    //    printf ("FindChargingInfoData error\n");
+    //    return;
+    //}
+    pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(_index);
+
+    // 盲沖的時候才允許使用~
+    if (pDcChargingInfo->Type != 9) {
+        return;
+    }
+
+    pDcChargingInfo->EvBatterytargetCurrent = _Current;
+}
+
+void GetSystemInfo()
+{
+    printf ("ModelName = %s \n", pSysConfig->ModelName);
+    printf ("SerialNumber = %s \n", pSysConfig->SerialNumber);
+    printf ("InternetConn = %d \n", pSysInfo->InternetConn);
+
+    printf ("MaxChargingPower = %d, MaxChargingCurrent = %d \n",
+            pSysConfig->MaxChargingPower,
+            pSysConfig->MaxChargingCurrent);
+}
+
+void ChangeGunNum()
+{
+    if (pSysInfo->CurGunSelected + 1 < pSysConfig->TotalConnectorCount) {
+        pSysInfo->CurGunSelected += 1;
+        pSysInfo->CurGunSelectedByAc = NO_DEFINE;
+    } else if (pSysConfig->AcConnectorCount > 0 &&
+               pSysInfo->CurGunSelectedByAc == NO_DEFINE) {
+        pSysInfo->CurGunSelectedByAc = DEFAULT_AC_INDEX;
+    } else {
+        pSysInfo->CurGunSelected = 0;
+        pSysInfo->CurGunSelectedByAc = NO_DEFINE;
+    }
+}
+
+void GetGunSelectedNum(char *v1)
+{
+    if (strcmp(v1, "-1") == 0 || strcmp(v1, "") == 0) {
+        if (AC_QUANTITY > 0 &&
+                pSysInfo->CurGunSelectedByAc != NO_DEFINE) {
+            printf("connector select changed = AC \n");
+        } else {
+            printf("connector selected = %d \n", pSysInfo->CurGunSelected);
+        }
+    } else {
+        int _index = atoi(v1);
+        if (_index <= 1) {
+            pSysInfo->CurGunSelected = _index;
+            pSysInfo->CurGunSelectedByAc = NO_DEFINE;
+            printf("connector select changed = %d \n", _index);
+        } else if (AC_QUANTITY > 0) {
+            pSysInfo->CurGunSelectedByAc = DEFAULT_AC_INDEX;
+            printf("connector select changed = AC \n");
+        }
+    }
+}
+
+void SetFanSpeed(char *v1)
+{
+    int speed = atoi(v1);
+    if(ShmDcCommonData->debugflag == YES) {
+        ShmFanModuleData->TestFanSpeed = speed;
+        printf("Set Fan speed: %d \n",ShmFanModuleData->TestFanSpeed);
+    }
+    else
+        printf("Please open debug mode\n");
+}
+
+void GetFanSpeed()
+{
+    printf("ShmFanModuleData->PresentFan1Speed = %d \n", ShmFanModuleData->PresentFan1Speed);
+    printf("ShmFanModuleData->PresentFan2Speed = %d \n", ShmFanModuleData->PresentFan2Speed);
+    printf("ShmFanModuleData->PresentFan3Speed = %d \n", ShmFanModuleData->PresentFan3Speed);
+    printf("ShmFanModuleData->PresentFan4Speed = %d \n", ShmFanModuleData->PresentFan4Speed);
+}
+
+void SetDebugMode(char *v1)
+{
+    int mode = atoi(v1);
+
+    ShmDcCommonData->debugflag = mode;
+    printf("Set Debug Mode:%d\n" , ShmDcCommonData->debugflag);
+}
+
+void SetGFDMode(char *v1)
+{
+    int mode = atoi(v1);
+
+    pSysConfig->AlwaysGfdFlag = mode;
+}
+
+void GetPsuTemp()
+{
+    for (uint8_t index = 0; index < ShmPsuData->GroupCount; index++) {
+        for (uint8_t count = 0; count < ShmPsuData->PsuGroup[index].GroupPresentPsuQuantity; count++) {
+            printf("PSU Temp = %d \n", ShmPsuData->PsuGroup[index].PsuModule[count].ExletTemp);
+        }
+    }
+}
+
+void GetAcInputVol()
+{
+    printf("L1N_L12 = %f, L2N_L23 = %f, L3N_L31 = %f \n",
+           pSysInfo->InputVoltageR,
+           pSysInfo->InputVoltageS,
+           pSysInfo->InputVoltageT);
+}
+
+void GetPsuInformation(char *v1, char *v2, char *v3)
+{
+    printf("**********************AC Contact needed*************************\n");
+    if (strcmp(v1, "count") == 0) {
+        for (int i = 0; i < 4; i++) {
+            printf("Group Index = %d, Module Count = %d \n",
+                   i,
+                   ShmPsuData->PsuGroup[i].GroupPresentPsuQuantity);
+        }
+    } else if (strcmp(v1, "ver") == 0) {
+        for (int i = 0; i < ShmPsuData->SystemPresentPsuQuantity; i++) {
+            printf("Psu Index = %d, PriVersion = %s, SecVersion = %s \n",
+                   i, ShmPsuData->PsuVersion[i].FwPrimaryVersion,
+                   ShmPsuData->PsuVersion[i].FwSecondVersion);
+        }
+
+        for (int i = 0; i < ShmPsuData->GroupCount; i++) {
+            for (int j = 0; j < ShmPsuData->PsuGroup[i].GroupPresentPsuQuantity; j++) {
+                printf("Group Index = %d, Psu Index = %d, Version = %s \n",
+                       i,
+                       j,
+                       ShmPsuData->PsuGroup[i].PsuModule[j].FwVersion);
+            }
+        }
+    } else if (strcmp(v1, "cap") == 0) {
+        for (int i = 0; i < ShmPsuData->GroupCount; i++) {
+            printf("Group Index = %d, MaxCur = %d, Power = %d \n",
+                   i,
+                   ShmPsuData->PsuGroup[i].GroupAvailableCurrent,
+                   ShmPsuData->PsuGroup[i].GroupAvailablePower);
+        }
+    } else if (strcmp(v1, "input") == 0) {
+        for (int i = 0; i < ShmPsuData->GroupCount; i++) {
+            for (uint8_t count = 0; count < ShmPsuData->PsuGroup[i].GroupPresentPsuQuantity; count++) {
+                printf("gp = %d, Index = %d, volR = %d, volS = %d, volT = %d \n",
+                       i,
+                       count,
+                       ShmPsuData->PsuGroup[i].PsuModule[count].InputVoltageL1,
+                       ShmPsuData->PsuGroup[i].PsuModule[count].InputVoltageL2,
+                       ShmPsuData->PsuGroup[i].PsuModule[count].InputVoltageL3);
+            }
+        }
+    } else if (strcmp(v1, "output") == 0) {
+        for (int i = 0; i < ShmPsuData->GroupCount; i++) {
+            printf("Group Index = %d, OutputV = %d, OutputC = %d \n",
+                   i,
+                   ShmPsuData->PsuGroup[i].GroupPresentOutputVoltage,
+                   ShmPsuData->PsuGroup[i].GroupPresentOutputCurrent);
+        }
+
+        for (int i = 0; i < pSysConfig->TotalConnectorCount; i++) {
+            //if (!FindChargingInfoData(i, &_chargingData[0])) {
+            //    printf ("FindChargingInfoData error\n");
+            //    continue;
+            //}
+            pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(i);
+
+            printf("Form RB : Group Index = %d, OutputV = %f \n",
+                   i,
+                   pDcChargingInfo->FireChargingVoltage);
+        }
+    } else if (strcmp(v1, "test") == 0) {
+        int mode = atoi(v2);
+
+        if (mode >= _TEST_MODE && mode <= _TEST_MODE) {
+            ShmPsuData->Work_Step = mode;
+        }
+    } else if (strcmp(v1, "out") == 0) {
+        float vol = atof(v2);
+        float cur = atof(v3);
+
+        if (ShmPsuData->Work_Step >= _TEST_MODE && ShmPsuData->Work_Step <= _TEST_MODE) {
+            //if (!FindChargingInfoData(0, &_chargingData[0])) {
+            //    printf ("FindChargingInfoData error\n");
+            //    return;
+            //}
+            pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(0);
+
+            pDcChargingInfo->EvBatterytargetVoltage = vol;
+            pDcChargingInfo->EvBatterytargetCurrent = cur;
+        }
+    }
+    printf("*************************************************\n");
+}
+
+void GetConnectorCapInfo(char *v1)
+{
+    int _GunIndex = atoi(v1);
+
+    //if (!FindChargingInfoData(_GunIndex, &_chargingData[0])) {
+    //    printf ("FindChargingInfoData error\n");
+    //    return;
+    //}
+    pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(_GunIndex);
+
+    printf ("Charger Max Current = %d, Max Power = %d \n",
+            pSysConfig->MaxChargingCurrent * 10,
+            pSysConfig->MaxChargingPower * 10);
+
+    printf ("Index = %d, MaxPow = %f, MaxVol = %f, MaxCur = %f\n",
+            _GunIndex,
+            pDcChargingInfo->RealMaxPower,
+            pDcChargingInfo->RealMaxVoltage,
+            pDcChargingInfo->RealMaxCurrent);
+}
+
+static void setConfirmSelGun(uint8_t selGun)
+{
+    if (selGun == LEFT_GUN_NUM && ShmSelectGunInfo->SelGunInfo.LeftGun == SEL_GUN_RELEASE) {
+        ShmSelectGunInfo->SelGunInfo.LeftGun = SEL_GUN_CONFIRM;
+        //printf("confirmSelGun left\r\n");
+    } else if (selGun == RIGHT_GUN_NUM && ShmSelectGunInfo->SelGunInfo.RightGun == SEL_GUN_RELEASE) {
+        ShmSelectGunInfo->SelGunInfo.RightGun = SEL_GUN_CONFIRM;
+        //printf("confirmSelGun right\r\n");
+    }
+}
+
+void RunUnconditionalChargeIndex1(char *v1, char *v2, char *v3)
+{
+    int _GunIndex;
+    uint8_t gunIndex = 0;
+    uint8_t stopChg = 0;
+    uint8_t curGun = 0;
+    int isContinue = 1;
+    float _Voltage;
+    float _Current;
+    uint8_t PreviousSystemStatus[2] = {0xff};
+    char *usageMsg = "Usage:\n"
+                     "       strchg <index> <voltage> <current>    ex: strchg 0 150 2\n"
+                     "       chg    <voltage> <current>            ex: chg 500 100\n"
+                     "       c      <index>                        ex: c 0\n"
+                     "       help | ? | h\n"
+                     "\r\n";
+
+    if (strcmp(v1, "auto") == EQUAL) {
+        _usingAutoRun = 0x01;
+        _GunIndex = 0;
+        _Voltage = 500;
+        _Current = (pSysConfig->MaxChargingPower * 1000) / _Voltage;
+    } else {
+        _usingAutoRun = 0x00;
+        _GunIndex = atoi(v1);
+        _Voltage = atof(v2);
+        _Current = atof(v3);
+    }
+
+    pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(_GunIndex);
+
+    printf("Power = %d, ReqVoltage = %f, ReqCurrent = %f\n",
+           pSysConfig->MaxChargingPower,
+           _Voltage,
+           _Current);
+
+    if (_Voltage > 1000 || _Voltage < 50) {
+        printf ("Input Voltage over range\n");
+        return;
+    }
+    //kill ev task
+    system("killall Module_EvComm");
+
+    pSysInfo->CurGunSelected = _GunIndex;
+
+    while (isContinue) {
+
+        curGun = pSysInfo->CurGunSelected;
+        pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(curGun);
+
+        //fix gun 1
+        switch (pDcChargingInfo->SystemStatus) {
+        case S_IDLE:
+            if (PreviousSystemStatus[curGun] != pDcChargingInfo->SystemStatus) {
+                PreviousSystemStatus[curGun] = pDcChargingInfo->SystemStatus;
+#if defined DD360Audi
+                setConfirmSelGun(curGun);
+#endif //defined DD360Audi
+
+                strcpy((char *)pSysConfig->UserId, "AutoStartCharging");
+                pDcChargingInfo->ConnectorPlugIn = 1;
+                printf ("[UnconditionalCharge - S_IDLE]\n");
+                pDcChargingInfo->Type = 9;
+
+            }
+            if (ShmOCPP16Data->SpMsg.bits.AuthorizeConf == 1) {
+                pSysInfo->StartToChargingFlag = 0x01;
+                pDcChargingInfo->SystemStatus = S_PREPARNING;
+            }
+            break;
+
+        case S_PREPARNING:
+            if (PreviousSystemStatus[curGun] != pDcChargingInfo->SystemStatus) {
+                PreviousSystemStatus[curGun] = pDcChargingInfo->SystemStatus;
+
+                printf ("[UnconditionalCharge - S_PREPARNIN]\n");
+
+                //等待 AC Relay 搭上且找到模組 (main 在此 statue 其它 task 會去做完)
+                printf ("wait find module\n");
+
+            }
+            //main 會在此階段判斷以下資料跳到下一個 state
+            //用來得知 AC 是否有搭上 (搭上模組的資訊才會出來) 因為每次  AC_Contactor
+            //ShmPsuData->SystemPresentPsuQuantity;
+            //ShmPsuData->PsuGroup[gun_index].GroupPresentPsuQuantity;
+            //ShmPsuData->PsuGroup[gun_index].GroupAvailablePower;
+            //_chargingData[gun_index]->AvailableChargingPower;
+
+            //等待 AC Relay 搭上且找到模組 (main 在此 statue 其它 task 會去做完)
+            //sleep(10);
+
+            //清除 main timeout 機制
+            pDcChargingInfo->TimeoutFlag = 0;
+            pSysInfo->SystemTimeoutFlag = 0;
+            pSysInfo->SystemPage = _LCM_NONE;
+            //不論是什麼 type 的槍都固意設成 Chademo 不跑 Prechage step
+            pDcChargingInfo->Type = 9;
+            break;
+
+        case S_PREPARING_FOR_EV:
+            if (PreviousSystemStatus[curGun] != pDcChargingInfo->SystemStatus) {
+                PreviousSystemStatus[curGun] = pDcChargingInfo->SystemStatus;
+
+                printf ("[UnconditionalCharge - S_PREPARING_FOR_EV]\n");
+                printf ("ReqVoltage = %f, ReqCurrent = %f \n", _Voltage * 10, _Current * 10);
+
+            }
+            //清除 main timeout 機制
+            pDcChargingInfo->TimeoutFlag = 0;
+            //不論是什麼 type 的槍都固意設成 Chademo 不跑 Prechage step
+            pDcChargingInfo->Type = 9;
+
+            //充電電壓電流
+            pDcChargingInfo->EvBatterySoc             = 50;
+            pDcChargingInfo->EvBatterytargetVoltage   = 500;
+            pDcChargingInfo->EvBatterytargetCurrent   = 2;
+            pDcChargingInfo->AvailableChargingCurrent = 1000;
+
+            //****** 注意~此行為是防止 K1K2 先開導到無法升壓 ( Relay Board 在此 state 還未搭上 K1K2 )
+            //確定模組己升壓完成
+            //if(pDcChargingInfo->PresentChargingVoltage <=  (3000+500) &&
+            //  pDcChargingInfo->PresentChargingVoltage >=  (3000-500) )
+            {
+                printf ("Precharge Done = %f \n",
+                        pDcChargingInfo->PresentChargingVoltage);
+                //EV done
+                pDcChargingInfo->SystemStatus = S_PREPARING_FOR_EVSE;
+            }
+            break;
+
+        case S_PREPARING_FOR_EVSE:
+            if (PreviousSystemStatus[curGun] != pDcChargingInfo->SystemStatus) {
+                PreviousSystemStatus[curGun] = pDcChargingInfo->SystemStatus;
+
+                printf ("[UnconditionalCharge - S_PREPARING_FOR_EVSE]\n");
+
+            }
+            //printf ("tar vol = %d \n", _Voltage);
+            //printf ("tar cur = %d \n", _Current);
+
+            //清除 main timeout 機制
+            pDcChargingInfo->TimeoutFlag = 0;
+            //不論是什麼 type 的槍都固意設成 Chademo 不跑 Prechage step
+            pDcChargingInfo->Type = 9;
+
+            //充電電壓電流
+            pDcChargingInfo->EvBatterySoc = 50;
+            pDcChargingInfo->EvBatterytargetVoltage = 500;
+            pDcChargingInfo->EvBatterytargetCurrent = 2;
+            pDcChargingInfo->AvailableChargingCurrent = 1000;
+
+            //printf ("tar vol_ = %d \n", pDcChargingInfo->EvBatterytargetVoltage);
+            // printf ("tar cur_ = %d \n", pDcChargingInfo->EvBatterytargetCurrent);
+
+            //****** 注意~此行為是防止 K1K2 先開導到無法升壓 ( Relay Board 在此 state 還未搭上 K1K2 )
+            //確定模組己升壓完成
+            if (pDcChargingInfo->GroundFaultStatus == 0x01 ||
+                    pDcChargingInfo->GroundFaultStatus == 0x03) {
+                printf ("First Ground Fault State (%d)\n",
+                        pDcChargingInfo->GroundFaultStatus);
+                printf ("Wait K1K2 = %f \n", pDcChargingInfo->PresentChargingVoltage);
+                sleep(5);
+                //EV done
+                pDcChargingInfo->SystemStatus = S_CHARGING;
+            } else if (pDcChargingInfo->GroundFaultStatus > 0x02) {
+                printf ("First Ground Fault check Fail (%d)\n",
+                        pDcChargingInfo->GroundFaultStatus);
+                pDcChargingInfo->SystemStatus = S_TERMINATING;
+            }
+            break;
+
+        case S_CHARGING:
+            if (PreviousSystemStatus[curGun] != pDcChargingInfo->SystemStatus) {
+                PreviousSystemStatus[curGun] = pDcChargingInfo->SystemStatus;
+
+                if (_usingAutoRun == 0x00) {
+                    //充電電壓電流
+                    pDcChargingInfo->EvBatterytargetVoltage = _Voltage;
+                    pDcChargingInfo->EvBatterytargetCurrent = _Current;
+                } else {
+                    _curAutoRunCount = 0;
+                    gettimeofday(&_autoTime, NULL);
+                }
+
+                pDcChargingInfo->EvBatterySoc = 50;
+                pDcChargingInfo->AvailableChargingCurrent = 1000;
+
+                printf ("[UnconditionalCharge - S_CHARGING]\n");
+            }
+
+            if (_usingAutoRun == 0x01) {
+                if (((GetTimeoutValue(_autoTime)) >= AUTORUN_STEP1_TIME_START * 60 &&
+                        (GetTimeoutValue(_autoTime)) <= AUTORUN_STEP1_TIME_END * 60) ||
+                        ((GetTimeoutValue(_autoTime)) >= AUTORUN_STEP2_TIME_START * 60 &&
+                         (GetTimeoutValue(_autoTime)) <= AUTORUN_STEP2_TIME_END * 60)
+                   ) {
+                    pDcChargingInfo->EvBatterytargetVoltage = _Voltage;
+                    pDcChargingInfo->EvBatterytargetCurrent = _Current;
+                } else if ((GetTimeoutValue(_autoTime)) >= AUTORUN_END_TIME * 60) {
+                    _curAutoRunCount++;
+                    if (_curAutoRunCount >= AUTORUN_CYCLE_COUNT) {
+                        pDcChargingInfo->SystemStatus = S_TERMINATING;
+                    } else {
+                        gettimeofday(&_autoTime, NULL);
+                    }
+                } else {
+                    pDcChargingInfo->EvBatterytargetVoltage = 0;
+                    pDcChargingInfo->EvBatterytargetCurrent = 0;
+                }
+            }
+
+//              printf("out : vol = %f, cur = %f \n",
+//                      pDcChargingInfo->EvBatterytargetVoltage,
+//                      pDcChargingInfo->EvBatterytargetCurrent);
+            //ev task do this
+            pDcChargingInfo->PresentChargingPower =
+                ((float)((pDcChargingInfo->PresentChargingVoltage) *
+                         (pDcChargingInfo->PresentChargingCurrent)) / 1000);
+
+            if (pDcChargingInfo->GroundFaultStatus == 0x02) {
+                printf ("Charging Ground Fault check Fail (%d)\n",
+                        pDcChargingInfo->GroundFaultStatus);
+                pDcChargingInfo->SystemStatus = S_TERMINATING;
+            }
+            break;
+
+        case S_TERMINATING:
+            if (PreviousSystemStatus[curGun] != pDcChargingInfo->SystemStatus) {
+                PreviousSystemStatus[curGun] = pDcChargingInfo->SystemStatus;
+
+                printf ("[UnconditionalCharge - S_TERMINATING]\n");
+                //無阻塞偵測 keybaord 結束
+                system(STTY_DEF TTY_PATH);
+            }
+
+            pDcChargingInfo->SystemStatus = S_COMPLETE;
+            break;
+
+        case S_COMPLETE:
+            if (PreviousSystemStatus[curGun] != pDcChargingInfo->SystemStatus) {
+                PreviousSystemStatus[curGun] = pDcChargingInfo->SystemStatus;
+
+                printf ("[UnconditionalCharge - S_COMPLETE]\n");
+            }
+
+            PreviousSystemStatus[curGun] = 0xFF;
+            stopChg = 0;
+            for (gunIndex = 0; gunIndex < pSysConfig->TotalConnectorCount; gunIndex++) {
+                if (PreviousSystemStatus[gunIndex] == 0xFF) {
+                    pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(curGun);
+                    pDcChargingInfo->SystemStatus = S_IDLE;
+                } else {
+                    pSysInfo->CurGunSelected = gunIndex;
+                }
+
+                pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(gunIndex);
+                if (pDcChargingInfo->SystemStatus == S_IDLE) {
+                    stopChg++;
+                }
+            }
+
+            pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(curGun);
+            pDcChargingInfo->PresentChargingPower = 0;
+
+            if (stopChg == pSysConfig->TotalConnectorCount) {
+
+                system("/root/Module_EvComm &");
+                sleep(3);
+
+                for (_GunIndex = 0; _GunIndex < pSysConfig->TotalConnectorCount; _GunIndex++) {
+                    pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(_GunIndex);
+
+                    pDcChargingInfo->SystemStatus = S_IDLE;
+                }
+                return;
+            }
+            break;
+        }
+
+        if (readCmdKey(CMD_KEY_DONT_WAIT) == NO) {
+            continue;
+        }
+
+        if (strcmp(newString[0], "strchg") == 0) {
+            if (strcmp(newString[1], "-1") == 0 ||
+                    strcmp(newString[1], "") == 0 ||
+                    strcmp(newString[2], "-1") == 0 ||
+                    strcmp(newString[2], "") == 0
+               ) {
+                printf ("Input cmd fail ------  strchg [vol 150-1000] [cru 2-100]\n");
+                continue;
+            }
+
+            if (atoi(newString[1]) == pSysInfo->CurGunSelected) {
+                continue;
+            }
+
+            _GunIndex = atoi((char *)newString[1]);
+            _Voltage = atof((char *)newString[2]);
+            _Current = atof((char *)newString[3]);
+
+            printf ("Power = %d, ReqVoltage = %f, ReqCurrent = %f\n",
+                    pSysConfig->MaxChargingPower,
+                    _Voltage,
+                    _Current);
+
+            if (_Voltage > 1000 || _Voltage < 50) {
+                _Voltage = 200;
+                printf ("Input Voltage over range\n");
+                continue;
+            }
+
+            pSysInfo->CurGunSelected = _GunIndex;
+            strcpy((char *)pSysConfig->UserId, "");
+        } else if (strcmp(newString[0], "chg") == 0) {
+            if (strcmp(newString[1], "-1") == 0) {
+                continue;
+            }
+
+            if (strcmp(newString[2], "-1") == 0 ||
+                    strcmp(newString[2], "") == 0) {
+                continue;
+            }
+
+            if (strcmp(newString[3], "-1") == 0 ||
+                    strcmp(newString[3], "") == 0) {
+                continue;
+            }
+
+            _GunIndex = atoi((char *)newString[1]);
+            float _vol = atof(newString[2]);
+            float _cur = atof(newString[3]);
+
+            if (_cur <= 0 || _cur <= 0) {
+                continue;
+            }
+
+            pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(_GunIndex);
+
+            printf("reset vol = %f, cur = %f \n", _vol, _cur);
+            pDcChargingInfo->EvBatterytargetVoltage = _vol;
+            pDcChargingInfo->EvBatterytargetCurrent = _cur;
+        } else if (strcmp(newString[0], "c") == 0) {
+            if (strcmp(newString[1], "-1") == 0 ||
+                    strcmp(newString[1], "") == 0) {
+                printf("argc 1 is error parameter\r\n");
+                continue;
+            }
+
+            if (atoi((char *)newString[1]) != -1) {
+                pSysInfo->CurGunSelected = atoi((char *)newString[1]);
+            }
+            printf("stop \n\r");
+
+            pSysInfo->StartToChargingFlag = 0x00;
+
+            pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData( pSysInfo->CurGunSelected);
+
+            pDcChargingInfo->SystemStatus = S_TERMINATING;
+        } else if (helpCmd() == YES) {
+            printf("%s\n", usageMsg);
+        }
+
+        usleep(100000);
+    }
+}
+
+int printTimeMsg(const char *fmt, ...)
+{
+    char Buf[4096 + 256] = {0};
+    char buffer[4096] = {0};
+    int rc = -1;
+    va_list args;
+    struct timeb  SeqEndTime;
+    struct tm *tm;
+    struct SysConfigData *pSysConfig = (struct SysConfigData *)GetShmSysConfigData();
+
+    va_start(args, fmt);
+    rc = vsnprintf(buffer, sizeof(buffer), fmt, args);
+    va_end(args);
+
+    ftime(&SeqEndTime);
+    SeqEndTime.time = time(NULL);
+    tm = localtime(&SeqEndTime.time);
+
+    sprintf(Buf, "%02d:%02d:%02d:%03d - %s",
+            tm->tm_hour,
+            tm->tm_min,
+            tm->tm_sec,
+            SeqEndTime.millitm,
+            buffer);
+    printf("%s", Buf);
+
+    return rc;
+}
+
+static void resdGunAndChillerTemp(void)
+{
+    int isContinue = 1;
+    uint8_t i = 0;
+    uint32_t sleepTime = 500000;
+    uint32_t loopTime = 1000;
+    struct timeb showTime;
+    struct timeb nowTime;
+
+    char *usageMsg = "Usage:\n"
+                     "       t <index>: loop time, ex: t 1\n"
+                     "       exit | c | C: exit test\n"
+                     "       h | help | ?: show usage message\n"
+                     "\r\n";
+
+    ftime(&showTime);
+
+    while (isContinue) {
+        ftime(&nowTime);
+
+        if (DiffTimeb(showTime, nowTime) > loopTime ||
+                DiffTimeb(showTime, nowTime) < 0) {
+            for (i = 0; i < pSysConfig->TotalConnectorCount; i++) {
+
+                pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(i);
+
+                printTimeMsg("get gun %d temp = %3d, chiller = %3d, ConnTemp = %3d, %3d,SysTemp = %3d, %3d, %3d, %3d\r\n",
+                             i,
+                             pDcChargingInfo->ConnectorTemp,
+                             pDcChargingInfo->ChillerTemp,
+                             ShmDcCommonData->ConnectorTemp[i][0],
+                             ShmDcCommonData->ConnectorTemp[i][1],
+                             ShmDcCommonData->SystemTemp[0],
+                             ShmDcCommonData->SystemTemp[1],
+                             ShmDcCommonData->SystemTemp[2],
+                             ShmDcCommonData->SystemTemp[3]);
+            }//for
+            ftime(&showTime);
+        }
+
+        if (readCmdKey(CMD_KEY_DONT_WAIT) == NO) {
+            usleep(sleepTime);
+            continue;
+        }
+
+        if (strcmp(newString[0], "t") == 0) {
+            if (strcmp(newString[1], "-1") == 0 ||
+                    strcmp(newString[1], "") == 0 ||
+                    atoi((char *)newString[1]) > 255
+               ) {
+                printf("argc 1 is error parameter\r\n");
+                continue;
+            }
+
+            loopTime = ((atoi((char *)newString[1])) * 1000);
+            printf("loopTime = %d\r\n", loopTime);
+            ftime(&showTime);
+            continue;
+        } else if (exitCmd() == YES) {
+            return;
+        } else if (helpCmd() == YES) {
+            printf ("%s\n", usageMsg);
+        }
+
+        usleep(sleepTime);
+    }//while
+}
+static void writeOTPTemp(void)
+{
+    uint8_t _GunIndex = 0;
+    int isContinue = 1;
+    uint32_t sleepTime = 500000;
+    char *usageMsg = "Usage:\n"
+                     "       OTP  <temp_recovery>  <temp>, ex: OTP 140 150\n"
+                     "       exit | c | C\n"
+                     "       help | ? | h\n"
+                     "\r\n";
+
+    while (isContinue) {
+        if (readCmdKey(CMD_KEY_WAIT) == NO) {
+            sleep(sleepTime);
+            continue;
+        }
+
+        if (helpCmd() == YES) {
+            printf ("%s\n", usageMsg);
+            continue;
+        } else if (exitCmd() == YES) {
+            sleep(1);
+            return;
+        } 
+        if (strcmp(newString[0], "OTP") != 0) {
+            printf("argc 1 is error parameter\r\n");
+            continue;
+        }
+
+        if (atoi(newString[1]) > 255 ||
+                atoi(newString[1]) == -1) {
+            printf("Recovey temperature value overflow\r\n");
+            continue;
+        }
+
+        if (atoi(newString[2]) > 255 ||
+                atoi(newString[2]) == -1) {
+            printf("Recovey temperature value overflow\r\n");
+            continue;
+        }
+
+        pSysInfo->OTPTempR = atoi(newString[1]);
+        pSysInfo->OTPTemp = atoi(newString[2]);
+
+        printf("OTP Recovery Temp set:%d\n",pSysInfo->OTPTempR);
+        printf("OTP Temp set:%d\n",pSysInfo->OTPTemp);
+        usleep(sleepTime);
+    }//while
+}
+void writeChillerStatus(char *v1)
+{
+    if (ShmDcCommonData->debugflag == YES) {
+        ShmDcCommonData->chillerCtrl = atoi(newString[1]);
+        if (ShmDcCommonData->chillerCtrl)
+            printf("Chiller set on\n");
+        else
+            printf("Chiller set off\n");
+    } else
+        printf("Please open Debug mode\n");
+}
+static void writeGunAndChillerTemp(void)
+{
+    uint8_t _GunIndex = 0;
+    int isContinue = 1;
+    uint32_t sleepTime = 500000;
+    char *usageMsg = "Usage:\n"
+                     "       conn    <index> <temp>, ex: conn 0 150\n"
+                     "       chiller <index> <temp>, ex: chiller 0 150\n"
+                     "       tempR\n"
+                     "       exit | c | C\n"
+                     "       help | ? | h\n"
+                     "\r\n";
+
+    ShmDcCommonData->TestTemperature = YES;
+
+    while (isContinue) {
+        if (readCmdKey(CMD_KEY_WAIT) == NO) {
+            sleep(sleepTime);
+            continue;
+        }
+
+        if (helpCmd() == YES) {
+            printf ("%s\n", usageMsg);
+            continue;
+        } else if (exitCmd() == YES) {
+            ShmDcCommonData->TestTemperature = NO;
+            sleep(1);
+            return;
+        } else if (strcmp(newString[0], "tempR") == 0) {
+            resdGunAndChillerTemp();
+        }
+
+        if ((strcmp(newString[0], "chiller") != 0) &&
+                (strcmp(newString[1], "-1") == 0 ||
+                 strcmp(newString[1], "") == 0)
+           ) {
+            printf("argc 1 is error parameter\r\n");
+            continue;
+        }
+
+        if (atoi(newString[2]) > 255 ||
+                atoi(newString[2]) == -1) {
+            printf("temperature value overflow\r\n");
+            continue;
+        }
+
+        _GunIndex = atoi((char *)newString[1]);
+
+        if (_GunIndex >= pSysConfig->TotalConnectorCount) {
+            printf("gun index over total connector\r\n");
+            continue;
+        }
+
+        if (strcmp(newString[0], "chiller") == 0) {//修改水冷機溫度值
+            if (_GunIndex >= 1) {
+                _GunIndex = 0; //只會有一個水冷機
+            }
+
+            pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(_GunIndex);
+            pDcChargingInfo->ChillerTemp = atoi(newString[2]);
+            printf("set %d chiller temperature = %d\r\n",
+                   _GunIndex,
+                   pDcChargingInfo->ChillerTemp);
+        } else if (strcmp(newString[0], "conn") == 0) {//修改槍頭溫度值
+            pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(_GunIndex);
+
+            pDcChargingInfo->ConnectorTemp = atoi(newString[2]);
+            printf("set %d connector temp = %d\r\n",
+                   _GunIndex,
+                   pDcChargingInfo->ConnectorTemp);
+        }
+
+        usleep(sleepTime);
+    }//while
+}
+
+int main(void)
+{
+    uint8_t _GunIndex = 0;
+    int isContinue = 1;
+    char *usageMsg = "Usage:\n"
+                     "       state <index>                     : get gun state\n"
+                     "       card                              : scanning card (x)\n"
+                     "       gun <index>                       : get gun plugit state\n"
+                     "       lock <index>                      : get gun locked state\n"
+                     "       sysid                             : test system ID\n"
+                     "       self                              : self test state (x)\n"
+                     "       version | v | -v                  : version of board (407 or relay or other)\n"
+                     "       update                            : update firmware\n"
+                     "       ac                                : get ac relay state (x) \n"
+                     "       cable <index> <state>             : set ground fault state\n"
+                     "       pow <index> <power>               : set power value\n"
+                     "       model                             : get system information\n"
+                     "       temp                              : get PSU temperature\n"
+                     "       fan <speed>                       : set fan board speed\n"
+                     "       strchg <auto>                     : auto test charging\n"
+                     "       strchg <index> <voltage <current> : select gun test charging\n"
+                     "       tempW                             : write connector header and Chiller temperature\r\n"
+                     "       tempR                             : print connector header and chiller temperature\r\n"
+                     "       OTP                               : Write OTP temperature\r\n"
+                     "       chiller                           : set chiller on/off"
+                     "\r\n";
+
+    if (CreateAllCsuShareMemory() == FAIL) {
+        printf("create share memory error\r\n");
+        return FAIL;
+    }
+
+    MappingGunChargingInfo("ReadCmdline Task");
+
+    pSysConfig = (struct SysConfigData *)GetShmSysConfigData();
+    pSysInfo = (struct SysInfoData *)GetShmSysInfoData();
+    pSysWarning = (struct WARNING_CODE_INFO *)GetShmSysWarningInfo();
+
+    pAlarmCode = (struct AlarmCodeData *)GetShmAlarmCodeData();
+
+    ShmCHAdeMOData = (struct CHAdeMOData *)GetShmCHAdeMOData();
+    ShmGBTData = (struct GBTData *)GetShmGBTData();
+    ShmCcsData = (struct CcsData *)GetShmCcsData();
+
+    ShmPrimaryMcuData = (struct PrimaryMcuData *)GetShmPrimaryMcuData();
+    ShmFanModuleData = (struct FanModuleData *)GetShmFanModuleData();
+    ShmRelayModuleData = (struct RelayModuleData *)GetShmRelayModuleData();
+    ShmLedModuleData = (struct LedModuleData *)GetShmLedModuleData();
+    ShmPsuData = (struct PsuData *)GetShmPsuData();
+    ShmOCPP16Data = (struct OCPP16Data *)GetShmOCPP16Data();
+    ShmSelectGunInfo = (SelectGunInfo *)GetShmSelectGunInfo();
+    ShmDcCommonData = (DcCommonInfo *)GetShmDcCommonData();
+
+//    for (_GunIndex = 0; _GunIndex < pSysConfig->TotalConnectorCount; _GunIndex++) {
+//        pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(_GunIndex);
+
+//        pDcChargingInfo->SystemStatus = S_IDLE;
+//    }
+
+    while (isContinue) {
+
+        if (readCmdKey(CMD_KEY_WAIT) == NO) {
+            continue;
+        }
+
+        if (strcmp(newString[0], "state") == 0) {
+            if (strcmp(newString[1], "-1") == 0 ||
+                    strcmp(newString[1], "") == 0) {
+                continue;
+            }
+
+            // 槍狀態
+            RunStatusProc(newString[1], newString[2]);
+        } else if (strcmp(newString[0], "card") == 0) {
+            // 刷卡狀態
+            RunCardProc(newString[1], newString[2]);
+        } else if (strcmp(newString[0], "gun") == 0) {
+            if (strcmp(newString[1], "-1") == 0 || strcmp(newString[1], "") == 0) {
+                continue;
+            }
+
+            // 插槍狀態
+            RunGunPlugitProc(newString[1], newString[2]);
+        } else if (strcmp(newString[0], "lock") == 0) {
+            if (strcmp(newString[1], "-1") == 0 || strcmp(newString[1], "") == 0) {
+                continue;
+            }
+
+            // 插槍狀態
+            GetGunLockStatusProc(newString[1], newString[2]);
+        } else if (strcmp(newString[0], "sysid") == 0) {
+            // 測試 sys id
+            SetSystemIDProc();
+        } else if (strcmp(newString[0], "self") == 0) {
+            // CSU 自我檢測狀態
+            RunSelfProc(newString[1]);
+        } else if (strcmp(newString[0], "version") == 0 ||
+                   strcmp(newString[0], "v") == 0 ||
+                   strcmp(newString[0], "-v") == 0) {
+            //if (strcmp(newString[1], "-1") == 0 || strcmp(newString[1], "") == 0) {
+            //    continue;
+            //}
+            // 取 FW 版號
+            GetFwVerProc();
+        } else if (strcmp(newString[0], "update") == 0) {
+            // 更新
+            FwUpdateFlagProc(newString[1]);
+        } else if (strcmp(newString[0], "ac") == 0) {
+            // AC contactor 狀態
+            CheckAcStatus(newString[1]);
+        } else if (strcmp(newString[0], "cable") == 0) {
+            if (strcmp(newString[1], "-1") == 0 || strcmp(newString[1], "") == 0) {
+                continue;
+            }
+
+            // cable check pass
+            SetCableChkStatus(newString[1], newString[2]);
+        } else if (strcmp(newString[0], "pow") == 0) {
+            if (strcmp(newString[1], "-1") == 0 ||
+                    strcmp(newString[1], "") == 0) {
+                continue;
+            }
+            // cable check pass
+            SetPowerValue(newString[1], newString[2]);
+        } else if (strcmp(newString[0], "model") == 0) {
+            GetSystemInfo();
+        } else if (strcmp(newString[0], "select") == 0) {
+            // 取得 / 設定 當前選的槍號
+            GetGunSelectedNum(newString[1]);
+        } else if (strcmp(newString[0], "change") == 0) {
+            // 模擬按鈕改變選槍
+            ChangeGunNum();
+        } else if (strcmp(newString[0], "fan") == 0) {
+            // 設定風扇速度
+            SetFanSpeed(newString[1]);
+        } else if (strcmp(newString[0], "speed") == 0) {
+            // 取得風扇速度
+            GetFanSpeed();
+        } else if (strcmp(newString[0], "debug") == 0) {
+            // 設定 debug mode
+            SetDebugMode(newString[1]);
+        } else if (strcmp(newString[0], "gfd") == 0) {
+            // 設定盲沖使用 GFD 功能
+            SetGFDMode(newString[1]);
+        } else if (strcmp(newString[0], "temp") == 0) {
+            // 取得 PSU 溫度
+            GetPsuTemp();
+        } else if (strcmp(newString[0], "acin") == 0) {
+            // 取得三向輸入電壓
+            GetAcInputVol();
+        } else if (strcmp(newString[0], "psu") == 0) {
+            //如果連一個參數都沒有 (此命令不理會) 加上判斷第二參數
+            if (strcmp(newString[1], "-1") == 0 ||
+                    strcmp(newString[1], "") == 0) {
+                printf ("PSU : Param fail..Please retry again......\n");
+                continue;
+            }
+            // 取得 PSU 資訊
+            GetPsuInformation(newString[1], newString[2], newString[3]);
+        } else if (strcmp(newString[0], "cap") == 0) {
+            GetConnectorCapInfo(newString[1]);
+        } else if (strcmp(newString[0], "error") == 0) {
+            CreateOneError(newString[1]);
+        } else if (strcmp(newString[0], "auth") == 0) {
+            GetAuthorizeFlag(newString[1]);
+        } else if (strcmp(newString[0], "relay") == 0) {
+            GetRelayStatus(newString[1]);
+        } else if (strcmp(newString[0], "ccid") == 0) {
+            if (strcmp(newString[1], "-1") == 0 || strcmp(newString[1], "") == 0 ||
+                    strcmp(newString[2], "-1") == 0 || strcmp(newString[2], "") == 0) {
+                printf ("Input ccid fail.\n");
+                continue;
+            }
+            SetChargingInfoCCID(newString[1], newString[2]);
+        } else if (strcmp(newString[0], "strchg") == 0) {
+            if (ShmDcCommonData->debugflag == NO ) {
+                printf("Please Open debug mode\n");
+                continue;
+            }
+            //如果連一個參數都沒有 (此命令不理會) 加上判斷第二參數
+            if (strcmp(newString[1], "auto") == 0) {
+                newString[2][0] = 0;
+                newString[3][0] = 0;
+            } else if (strcmp(newString[1], "-1") == 0 ||
+                       strcmp(newString[1], "") == 0   ||
+                       strcmp(newString[2], "-1") == 0 ||
+                       strcmp(newString[2], "") == 0) {
+                printf ("Input cmd fail ------  strchg [vol 150-1000] [cru 2-100]\n");
+                continue;
+            }
+
+            // 槍狀態
+            RunUnconditionalChargeIndex1(newString[1], newString[2], newString[3]);
+        } else if (strcmp(newString[0], "tempW") == 0) { //測試槍頭和水冷機溫度
+            writeGunAndChillerTemp();
+        } else if (strcmp(newString[0], "tempR") == 0) { //讀取槍頭和水冷機溫度
+            resdGunAndChillerTemp();
+        } else if (strcmp(newString[0], "OTP") == 0) { //測試槍頭和水冷機溫度
+            writeOTPTemp();
+        } else if (strcmp(newString[0], "chiller") == 0) { //測試槍頭和水冷機溫度
+            writeChillerStatus(newString[1]);
+        } else {
+            printf("%s\n", usageMsg);
+        }
+
+        sleep(1);
+    }//while
+
+    return 0;
+}

+ 1 - 1
EVSE/Projects/DD360Tcci/Apps/Script/copy_from_d.sh

@@ -1,2 +1,2 @@
 #!/bin/bash
-sudo cp -r /mnt/d/Phihong/Project/DD360Tcci/Apps/* /opt/ti-processor-sdk-linux-am335x-evm-04.02.00.09/EVSE/Projects/DD360Tcci/Apps/ 
+sudo cp -r /mnt/d/Phihong/Project/DD360Tcci_Test/Apps/* /opt/ti-processor-sdk-linux-am335x-evm-04.02.00.09/EVSE/Projects/DD360Tcci/Apps/ 

+ 1 - 1
EVSE/Projects/DD360Tcci/Apps/Script/copy_to_D.sh

@@ -1,2 +1,2 @@
 #!/bin/bash
-sudo cp -r /opt/ti-processor-sdk-linux-am335x-evm-04.02.00.09/EVSE/Projects/DD360Tcci/Apps/* /mnt/d/Phihong/Project/DD360Tcci/Apps/
+sudo cp -r /opt/ti-processor-sdk-linux-am335x-evm-04.02.00.09/EVSE/Projects/DD360Tcci/Apps/* /mnt/d/Phihong/Project/DD360Tcci_Test/Apps/

+ 15 - 24
EVSE/Projects/DD360Tcci/Apps/ShareMemory/shmMem.c

@@ -504,9 +504,11 @@ void InitialShareMemoryInfo(void)
 
     memset(pSysInfo->FanModuleFwRev, 0, ARRAY_SIZE(pSysInfo->FanModuleFwRev));
     memset(pSysInfo->RelayModuleFwRev, 0, ARRAY_SIZE(pSysInfo->RelayModuleFwRev));
-
-    pSysInfo->SystemPage = _PAGE_AUTHORIZE;
-
+#if defined DD360Audi
+    pSysInfo->SystemPage = _LCM_SELECT_GUN;
+#else
+    pSysInfo->SystemPage = _LCM_NONE;
+#endif //defined DD360Audi
     pSysInfo->MainChargingMode = _MAIN_CHARGING_MODE_MAX;
     pSysInfo->ReAssignedFlag = _REASSIGNED_NONE;
     pSysInfo->CurGunSelectedByAc = NO_DEFINE;
@@ -548,7 +550,7 @@ int InitSelectGunShmMem(void)
 {
     int MeterSMId = FAIL;
 
-#if !defined DD360Tcci && !defined DD360Audi && !defined DD360ComBox && !defined DD360UCar
+#if !defined DD360Tcci && !defined DD360Audi && !defined DD360ComBox
     return;
 #endif //!defined DD360Tcci && !defined DD360Audi && !defined DD360ComBox
 
@@ -763,7 +765,7 @@ void ClearAllShmMemParameter(void)
     //memset(ShmCsuMeterInfo, 0, sizeof(struct MeterInformation));
     memset(ShmDcCommonData, 0, sizeof(DcCommonInfo));
 
-#if defined DD360Tcci || defined DD360Audi || defined DD360ComBox || defined DD360UCar
+#if defined DD360Tcci || defined DD360Audi || defined DD360ComBox
     memset(ShmSelectGunInfo, 0, sizeof(SelectGunInfo));
 
     for (i = 0; i < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount; i++) {
@@ -878,10 +880,7 @@ static bool addGunInfoByConnector(uint8_t typeValue, uint8_t slots,char *whichta
 
     case '6': // GB/T AC Socket
         break;
-    case '7': // CCS2 AC plug
-        break;
-    case '8': // Type E Socket
-        break;
+
     //DC Gun Type --------------------------------------------------------------
     case 'J':  // CHAdeMO
     case 'K':  // CHAdeMO 200A
@@ -906,15 +905,16 @@ static bool addGunInfoByConnector(uint8_t typeValue, uint8_t slots,char *whichta
         }
         break;
 
-    case 'V': // Liquid CCS1 combo
-    case 'F': // Liquid CCS2 combo
     case 'T': // Rema CCS1
     case 'D': // Rema CCS2
     case 'U': // CCS1 combo
     case 'E': // CCS2 combo
+    case 'V': // Liquid CCS1 combo
+    case 'F': // Liquid CCS2 combo
     case 'M': // 80A CCS2
     case 'N': // 80A CCS1
-    case 'P': // 急電弓
+    case 'P': // Phoenix CCS2 500A 水冷
+    case 'R': // Phoenix CCS1 500A 水冷
         if (CCS_QUANTITY > gGunIndexInfo.CcsIndex) {
             pDcChargingInfo = (struct ChargingInfoData *)&pSysInfo->CcsChargingData[gGunIndexInfo.CcsIndex];
 
@@ -934,25 +934,16 @@ static bool addGunInfoByConnector(uint8_t typeValue, uint8_t slots,char *whichta
                 gGunIndexInfo.CcsIndex++;
                 gGunIndexInfo.DcGunIndex++;
             }
-            if(typeValue == 'P') {
+            if(typeValue == 'P')
+            {
                 pDcChargingInfo->PantographFlag = YES;
-            } else if (typeValue == 'V') {
-                pDcChargingInfo->CCSGunType = _TYPE_CCS1_Liquid;
-            } else if (typeValue == 'F') {
-                pDcChargingInfo->CCSGunType = _TYPE_CCS2_Liquid;
-            } else if (typeValue == 'T' || typeValue == 'U' || typeValue == 'N') {
-                pDcChargingInfo->CCSGunType = _TYPE_CCS1_Natural;
-            } else if (typeValue == 'D' || typeValue == 'E' || typeValue == 'M') {
-                pDcChargingInfo->CCSGunType = _TYPE_CCS2_Natural;
-            } else
-                pDcChargingInfo->CCSGunType = _TYPE_CCS_NONE;
+            }
         } else {
             result = false;
         }
         break;
 
     case 'G':  // GBT DC
-    case 'B': // GBT YG PT100
         if (GB_QUANTITY > gGunIndexInfo.GbIndex) {
             pDcChargingInfo = (struct ChargingInfoData *)&pSysInfo->GbChargingData[gGunIndexInfo.GbIndex];
 

+ 6 - 10
EVSE/Projects/DD360Tcci/Apps/simulation.c

@@ -53,7 +53,6 @@ void SetFaultTest()
 {
     pAlarmCode->AlarmEvents.bits.CcsLiquidChillerWaterLevelWarning = NO;
     pFaultCode->FaultEvents.bits.CcsLiquidChillerWaterLevelFault = NO;
-    pAlarmCode->AlarmEvents.bits.DisconnectedFromDo = NORMAL;
     pSysWarning->Level = WARN_LV_NL;
 
 }
@@ -62,18 +61,22 @@ void SetSelfTest(bool status)
     uint8_t index = 0;
     struct SysConfigData *pSysConfig = (struct SysConfigData *)GetShmSysConfigData();
     struct SysInfoData *pSysInfo = (struct SysInfoData *)GetShmSysInfoData();
+    struct WARNING_CODE_INFO *pSysWarning = (struct WARNING_CODE_INFO *)GetShmSysWarningInfo();
 
+    struct PsuData *ShmPsuData = (struct PsuData *)GetShmPsuData();
     struct CHAdeMOData *ShmCHAdeMOData = (struct CHAdeMOData *)GetShmCHAdeMOData();
     struct GBTData *ShmGBTData = (struct GBTData *)GetShmGBTData();
     struct CcsData *ShmCcsData = (struct CcsData *)GetShmCcsData();
 
+    struct PrimaryMcuData *ShmPrimaryMcuData = (struct PrimaryMcuData *)GetShmPrimaryMcuData();
+    struct FanModuleData *ShmFanModuleData = (struct FanModuleData *)GetShmFanModuleData();
     struct RelayModuleData *ShmRelayModuleData = (struct RelayModuleData *)GetShmRelayModuleData();
     ShmRelayModuleData->SelfTest_Comp = status;
 
     if (status) {
         strcpy((char*)pSysInfo->RelayModuleFwRev,SIM_VERSION);
         strcpy((char*)pSysInfo->FanModuleFwRev,SIM_VERSION);
-        strcpy((char*)pSysInfo->CsuPrimFwRev,SIM_VERSION);
+        strcpy((char*)ShmPrimaryMcuData->version,SIM_VERSION);
         for (index = 0; index < pSysConfig->TotalConnectorCount; index++) {
             pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(index);
             if (pDcChargingInfo->Type == _Type_Chademo) {
@@ -95,7 +98,7 @@ void main()
 
     if (CreateAllCsuShareMemory() == FAIL) {
         printf("create share memory error");
-        return;
+        return FAIL;
     }
 
     MappingGunChargingInfo("Simulation Task");
@@ -125,20 +128,13 @@ void main()
             case S_REASSIGN:
                 break;
             case S_PREPARNING:
-                //ShmPsuData->SystemPresentPsuQuantity = 500;
-                //ShmPsuData->SystemAvailablePower = 500;
                 break;
             case S_PREPARING_FOR_EV:
-                pDcChargingInfo->GunLocked = START;
                 break;
             case S_PREPARING_FOR_EVSE:
-                pDcChargingInfo->GroundFaultStatus = GFD_PASS;
                 break;
             case S_CCS_PRECHARGE_ST0:
             case S_CCS_PRECHARGE_ST1:
-                ShmCcsData->V2GMessage_DIN70121[pDcChargingInfo->type_index].PresentMsgFlowStatus = 45;
-                sleep(1);
-                pDcChargingInfo->RelayK1K2Status = YES;
                 break;
 
             case S_CHARGING:

+ 5 - 5
EVSE/Projects/DD360Tcci/Apps/timeout.h

@@ -32,14 +32,18 @@
 #include    <ctype.h>
 #include    <ifaddrs.h>
 
+//------------------------------------------------------------------------------
+#define CONN_PLUG_TIME_OUT                      (40)
+
 //------------------------------------------------------------------------------
 enum Timeout_flag {
     Timeout_None                   = 0,
     Timeout_SelftestChk            = 1,
     Timeout_Authorizing            = 2,
     Timeout_VerifyFail             = 3,
-    Timeout_ReturnViewPage         = 4,
+    Timeout_VerifyComp             = 4,
     Timeout_WaitPlug               = 5,
+
     Timeout_Preparing              = 6,
     Timeout_EvChargingDet          = 7,
     Timeout_EvseChargingDet        = 8,
@@ -50,10 +54,6 @@ enum Timeout_flag {
     Timeout_SelectGun              = 13,
     Timeout_WaitBalance            = 14,
     Timeout_EVCCID_Link            = 15,
-	Timeout_LinkError              = 16,
-	Timeout_DetailView             = 17,
-	Timeout_Terminating            = 18,
-	Timeout_PlugOutGun             = 19,
 };
 
 //------------------------------------------------------------------------------

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


BIN
EVSE/Projects/DD360Tcci/output/FactoryConfig


BIN
EVSE/Projects/DD360Tcci/output/Module_ChkSysTask


BIN
EVSE/Projects/DD360Tcci/output/Module_DoComm


BIN
EVSE/Projects/DD360Tcci/output/Module_EvComm


BIN
EVSE/Projects/DD360Tcci/output/Module_EventLogging


BIN
EVSE/Projects/DD360Tcci/output/Module_InternalComm


BIN
EVSE/Projects/DD360Tcci/output/Module_LcmControl


BIN
EVSE/Projects/DD360Tcci/output/Module_PrimaryComm


BIN
EVSE/Projects/DD360Tcci/output/Module_UpdateFW


BIN
EVSE/Projects/DD360Tcci/output/ReadCmdline


BIN
EVSE/Projects/DD360Tcci/output/main


BIN
EVSE/Projects/DD360Tcci/output/simulation


برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است