Răsfoiți Sursa

Merge remote-tracking branch 'origin/DD360Tcci'

FolusWen 3 ani în urmă
părinte
comite
fed9353e2b
46 a modificat fișierele cu 811 adăugiri și 5218 ștergeri
  1. 4 4
      EVSE/Projects/DD360Tcci/Apps/CSU/Ethernet.c
  2. 11 7
      EVSE/Projects/DD360Tcci/Apps/CSU/Primary.c
  3. 6 6
      EVSE/Projects/DD360Tcci/Apps/CSU/RFID.c
  4. 6 6
      EVSE/Projects/DD360Tcci/Apps/CSU/SelfTest.c
  5. 64 48
      EVSE/Projects/DD360Tcci/Apps/CSU/main.c
  6. 4 4
      EVSE/Projects/DD360Tcci/Apps/CSU/main.h
  7. 4 2
      EVSE/Projects/DD360Tcci/Apps/Config.h
  8. 7 7
      EVSE/Projects/DD360Tcci/Apps/Define/define.c
  9. 55 29
      EVSE/Projects/DD360Tcci/Apps/Define/define.h
  10. 7 0
      EVSE/Projects/DD360Tcci/Apps/ModuleChkSysTask/Module_ChkSysTask.c
  11. 2 1
      EVSE/Projects/DD360Tcci/Apps/ModuleDoComm/DoComm.c
  12. 2 1
      EVSE/Projects/DD360Tcci/Apps/ModuleEvComm/Module_EvRxComm.c
  13. 6 6
      EVSE/Projects/DD360Tcci/Apps/ModuleEvComm/Module_EvTxComm.c
  14. 2 2
      EVSE/Projects/DD360Tcci/Apps/ModuleInternalComm/LEDlight.c
  15. 30 30
      EVSE/Projects/DD360Tcci/Apps/ModuleInternalComm/Module_InternalCommOrg.c
  16. 32 32
      EVSE/Projects/DD360Tcci/Apps/ModuleInternalComm/RelayBoard.c
  17. 2 2
      EVSE/Projects/DD360Tcci/Apps/ModuleInternalComm/internalComm.h
  18. 415 0
      EVSE/Projects/DD360Tcci/Apps/ModuleLcmCtrl/Lcm_Update.c
  19. 93 8
      EVSE/Projects/DD360Tcci/Apps/ModuleLcmCtrl/Module_LcmControl.c
  20. 0 2393
      EVSE/Projects/DD360Tcci/Apps/ModuleLcmCtrl/Module_LcmControl.c.Ph
  21. 0 2339
      EVSE/Projects/DD360Tcci/Apps/ModuleLcmCtrl/Module_LcmControl.c.test
  22. 0 34
      EVSE/Projects/DD360Tcci/Apps/ModuleLcmCtrl/Module_LcmControl.h.Ph
  23. 0 234
      EVSE/Projects/DD360Tcci/Apps/ModuleLcmCtrl/Module_LcmControl.h.test
  24. 7 2
      EVSE/Projects/DD360Tcci/Apps/ModulePrimary/Module_PrimaryComm.c
  25. 7 7
      EVSE/Projects/DD360Tcci/Apps/ModuleUpdateFW/Module_UpdateFW.c
  26. 30 5
      EVSE/Projects/DD360Tcci/Apps/ReadCmdline.c
  27. 1 1
      EVSE/Projects/DD360Tcci/Apps/Readme.md
  28. 2 0
      EVSE/Projects/DD360Tcci/Apps/Script/copy_from_d.sh
  29. 2 0
      EVSE/Projects/DD360Tcci/Apps/Script/copy_to_D.sh
  30. 2 0
      EVSE/Projects/DD360Tcci/Apps/Script/copy_to_d.sh
  31. 4 4
      EVSE/Projects/DD360Tcci/Apps/Script/replaceOtherDD360Project.sh
  32. 4 4
      EVSE/Projects/DD360Tcci/Apps/ShareMemory/shmMem.c
  33. BIN
      EVSE/Projects/DD360Tcci/Apps/UnsafetyOutputTask
  34. BIN
      EVSE/Projects/DD360Tcci/Images/ramdisk.gz
  35. BIN
      EVSE/Projects/DD360Tcci/output/FactoryConfig
  36. BIN
      EVSE/Projects/DD360Tcci/output/Module_ChkSysTask
  37. BIN
      EVSE/Projects/DD360Tcci/output/Module_DoComm
  38. BIN
      EVSE/Projects/DD360Tcci/output/Module_EvComm
  39. BIN
      EVSE/Projects/DD360Tcci/output/Module_EventLogging
  40. BIN
      EVSE/Projects/DD360Tcci/output/Module_InternalComm
  41. BIN
      EVSE/Projects/DD360Tcci/output/Module_LcmControl
  42. BIN
      EVSE/Projects/DD360Tcci/output/Module_PrimaryComm
  43. BIN
      EVSE/Projects/DD360Tcci/output/Module_UpdateFW
  44. BIN
      EVSE/Projects/DD360Tcci/output/ReadCmdline
  45. BIN
      EVSE/Projects/DD360Tcci/output/main
  46. BIN
      EVSE/Projects/DD360Tcci/output/simulation

+ 4 - 4
EVSE/Projects/DD360Tcci/Apps/CSU/Ethernet.c

@@ -109,7 +109,7 @@ static int isReachableInternet(void)
 
     pclose(fp);
 
-#if defined DD360 ||defined DD360Audi || defined DD360ComBox
+#if defined DD360Tcci ||defined DD360Audi || defined DD360ComBox
     if (pAlarmCode->AlarmEvents.bits.DisconnectedFromDo == NORMAL) {
         result = FAIL;
     } else {
@@ -117,7 +117,7 @@ static int isReachableInternet(void)
     }
 
     return result;
-#endif //defined DD360 || defined DD360Audi
+#endif //defined DD360Tcci || defined DD360Audi
 
     memset(buf, 0x00, sizeof(buf));
 
@@ -208,11 +208,11 @@ void InitEthernet(void)
         log_info("InitEthernet = %d", pid);
 
         for (;;) {
-#if defined DD360 || defined DD360Audi || defined DD360ComBox
+#if defined DD360Tcci || defined DD360Audi || defined DD360ComBox
             isReachableInternet();
             sleep(5);
             continue;
-#endif //!defined DD360 && !defined DD360
+#endif //!defined DD360Tcci && !defined DD360Tcci
 
             if (isRouteFail()) {
                 //log_info("eth0 not in route, restart eht0. ");

+ 11 - 7
EVSE/Projects/DD360Tcci/Apps/CSU/Primary.c

@@ -343,6 +343,10 @@ void ChkPrimaryStatus(void)
                 ShmDcCommonData->PowerAlarmState.StatusBit.DcInputOVP = YES;
                 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.SystemL1InputOVP = YES;
                 EmcOccureByString("042200");
@@ -369,6 +373,7 @@ void ChkPrimaryStatus(void)
             ShmDcCommonData->PowerAlarmState.StatusBit.EmergencyStop = NO;
             ShmDcCommonData->PowerAlarmState.StatusBit.DoorOpen = NO;
             ShmDcCommonData->PowerAlarmState.StatusBit.DcInputOVP = NO;
+            ShmDcCommonData->PowerAlarmState.StatusBit.DcInputUVP = NO;
             ShmDcCommonData->PowerAlarmState.StatusBit.SystemL1InputOVP = NO;
             ShmDcCommonData->PowerAlarmState.StatusBit.SystemL2InputOVP = NO;
             ShmDcCommonData->PowerAlarmState.StatusBit.SystemL3InputOVP = NO;
@@ -376,6 +381,7 @@ void ChkPrimaryStatus(void)
             ReleaseEmsOccureByString(0, "042251");
             ReleaseEmsOccureByString(0, "042252");
             ReleaseEmsOccureByString(0, "042327");
+            ReleaseEmsOccureByString(0, "042328");
             ReleaseEmsOccureByString(0, "042200");
             ReleaseEmsOccureByString(0, "042201");
             ReleaseEmsOccureByString(0, "042202");
@@ -386,6 +392,7 @@ void ChkPrimaryStatus(void)
         ShmDcCommonData->PowerAlarmState.StatusBit.EmergencyStop = NO;
         ShmDcCommonData->PowerAlarmState.StatusBit.DoorOpen = NO;
         ShmDcCommonData->PowerAlarmState.StatusBit.DcInputOVP = NO;
+        ShmDcCommonData->PowerAlarmState.StatusBit.DcInputUVP = NO;
         ShmDcCommonData->PowerAlarmState.StatusBit.SystemL1InputOVP = NO;
         ShmDcCommonData->PowerAlarmState.StatusBit.SystemL2InputOVP = NO;
         ShmDcCommonData->PowerAlarmState.StatusBit.SystemL3InputOVP = NO;
@@ -393,6 +400,7 @@ void ChkPrimaryStatus(void)
         ReleaseEmsOccureByString(0, "042251");
         ReleaseEmsOccureByString(0, "042252");
         ReleaseEmsOccureByString(0, "042327");
+        ReleaseEmsOccureByString(0, "042328");
         ReleaseEmsOccureByString(0, "042200");
         ReleaseEmsOccureByString(0, "042201");
         ReleaseEmsOccureByString(0, "042202");
@@ -436,13 +444,10 @@ void ChkPrimaryStatus(void)
     //}
 
     if (ShmPrimaryMcuData->InputDet.bits.Button1 == BTN_PRESS &&
-            !leftBtnPush
-#if defined DD360Audi
-            &&
+            !leftBtnPush &&
             pSysInfo->SystemPage != _LCM_AUTHORIZING &&
             pSysInfo->SystemPage != _LCM_AUTHORIZ_COMP &&
             pSysInfo->SystemPage != _LCM_AUTHORIZ_FAIL
-#endif //defined DD360Audi
        ) {
         pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(pSysInfo->CurGunSelected);
 
@@ -546,15 +551,14 @@ void ChkPrimaryStatus(void)
     }
 
     if (ShmPrimaryMcuData->InputDet.bits.Button2 == BTN_PRESS &&
-            !rightBtnPush
+            !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
-#endif //defined DD360Audi
        ) {
         if (!rightBtnPush) {
             rightBtnPush = true;

+ 6 - 6
EVSE/Projects/DD360Tcci/Apps/CSU/RFID.c

@@ -46,10 +46,10 @@ static void isAutorCompleteHandle(uint8_t *authorizeIndex)
 
     // 透過後臺停止充電的判斷
     if (isAuthorizedComplete()
-#if !defined DD360 && !defined DD360Audi && !defined DD360ComBox
+#if !defined DD360Tcci && !defined DD360Audi && !defined DD360ComBox
             || (pSysInfo->OcppConnStatus == NO &&
                 pSysConfig->OfflinePolicy == _OFFLINE_POLICY_FREE_CHARGING)
-#endif //!defined DD360 && !defined DD360Audi
+#endif //!defined DD360Tcci && !defined DD360Audi
        ) {
 
         // 判斷後台回覆狀態
@@ -212,11 +212,11 @@ static void UserScanFunction(void)
             _authorizeIndex = pSysInfo->CurGunSelected;
         }
 
-#if defined DD360 || defined DD360Audi || defined DD360ComBox
+#if defined DD360Tcci || defined DD360Audi || defined DD360ComBox
         strcpy((char *)pSysConfig->UserId, "");
 
         return;
-#endif //defined DD360 || defined DD360Audi || defined DD360ComBox
+#endif //defined DD360Tcci || defined DD360Audi || defined DD360ComBox
 
         StartSystemTimeoutDet(Timeout_AuthorizingForStop);
 
@@ -283,9 +283,9 @@ void ScannerCardProcess(void)
         //printf("isAuthorizedComplete = %d, %f", isAuthorizedComplete(), ShmSelectGunInfo->PricesInfo[pSysInfo->CurGunSelected].Balance);
         // 確認驗證卡號完成沒
         if (isAuthorizedComplete()
-#if !defined DD360 && !defined DD360Audi && !defined DD360ComBox
+#if !defined DD360Tcci && !defined DD360Audi && !defined DD360ComBox
                 || pSysConfig->OfflinePolicy == _OFFLINE_POLICY_FREE_CHARGING
-#endif //!defined DD360 && !defined DD360Audi && !defined DD360ComBox
+#endif //!defined DD360Tcci && !defined DD360Audi && !defined DD360ComBox
            ) {
                 //StopSystemTimeoutDet();
                 StartSystemTimeoutDet(Timeout_WaitBalance);

+ 6 - 6
EVSE/Projects/DD360Tcci/Apps/CSU/SelfTest.c

@@ -190,11 +190,11 @@ void SelfTestRun(void)
         case _STEST_AC_CONTACTOR:
             //ShmPsuData->Work_Step = _TEST_COMPLETE;
             // 因為 30KW 以下沒有 Relay feedback 功能,所以暫時先直接跳過
-#if defined DD360 || defined DD360Audi || defined DD360ComBox
+#if defined DD360Tcci || defined DD360Audi || defined DD360ComBox
             pSysInfo->SelfTestSeq = _STEST_PSU_DETECT;
             //log_info("Waiting for DO communication");
             break;
-#endif //defined DD360 || defined DD360Audi || defined DD360ComBox
+#endif //defined DD360Tcci || defined DD360Audi || defined DD360ComBox
 
             if (pSysInfo->AcContactorStatus == YES) {
                 pSysInfo->SelfTestSeq = _STEST_PSU_DETECT;
@@ -203,10 +203,10 @@ void SelfTestRun(void)
             break;
 
         case _STEST_PSU_DETECT:
-#if defined DD360 || defined DD360Audi || defined DD360ComBox
+#if defined DD360Tcci || defined DD360Audi || defined DD360ComBox
             pSysInfo->SelfTestSeq = _STEST_PSU_CAP;
             break;
-#endif //defined DD360 || defined DD360Audi || defined DD360ComBox
+#endif //defined DD360Tcci || defined DD360Audi || defined DD360ComBox
 
             if (ShmPsuData->Work_Step >= GET_SYS_CAP) {
                 pSysInfo->SelfTestSeq = _STEST_PSU_CAP;
@@ -217,13 +217,13 @@ void SelfTestRun(void)
             // 此測試是要確認當前總輸出能力
             // 如果沒有 PSU 模組請 bypass
 
-#if defined DD360 || defined DD360Audi || defined DD360ComBox
+#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 DD360 || defined DD360Audi || defined DD360ComBox
+#endif //defined DD360Tcci || defined DD360Audi || defined DD360ComBox
 
             if (ShmPsuData->Work_Step == BOOTING_COMPLETE) {
                 sleep(1);

+ 64 - 48
EVSE/Projects/DD360Tcci/Apps/CSU/main.c

@@ -82,8 +82,8 @@ uint8_t bd0_2_status = 0;
 uint8_t bd1_1_status = 0;
 uint8_t bd1_2_status = 0;
 
-char *fwVersion = "V1.19.00.0000.00"; // "V0.16.00.0000.00";
-char* DebugVersion = "v1.19.0";
+char *fwVersion = "V1.20.00.0000.00"; // "V0.16.00.0000.00";
+char* DebugVersion = "v1.20.1";
 //sqlite3 *localDb;
 bool isDb_ready;
 
@@ -466,6 +466,15 @@ static void checkGunOTPState(uint8_t gunIndex)
             //ResetChargerAlarmCode(gunIndex, "012229");
             ShmDcCommonData->ConnectErrList[gunIndex].GunBits.ChaConnectOTP = NO;
             ShmDcCommonData->ConnectErrList[gunIndex].GunBits.ChaConnectTempSensorFail = YES;
+            if  ((gunIndex == 0) &&
+                    (strncmp((char *)&pSysConfig->ModelName[7], "J", 1) == 0)) {
+            	ShmDcCommonData->ConnectErrList[gunIndex].GunBits.ChaConnectOTP = NO;
+            	ShmDcCommonData->ConnectErrList[gunIndex].GunBits.ChaConnectTempSensorFail = NO;
+            } else if ((gunIndex == 1) &&
+                    ((strncmp((char *)&pSysConfig->ModelName[9], "J", 1) == 0) )) {
+            	ShmDcCommonData->ConnectErrList[gunIndex].GunBits.ChaConnectOTP = NO;
+            	ShmDcCommonData->ConnectErrList[gunIndex].GunBits.ChaConnectTempSensorFail = NO;
+            }
         }
         break;
 
@@ -970,9 +979,9 @@ void InitGPIO()
 
     log_info("Initial GPIO OK");
 
-#if defined DD360 || defined DD360Audi || defined DD360ComBox
+#if defined DD360Tcci || defined DD360Audi || defined DD360ComBox
     return ;
-#endif //defined DD360 || defined DD360Audi || defined DD360ComBox
+#endif //defined DD360Tcci || defined DD360Audi || defined DD360ComBox
 
     /* (C14) EMU0.gpio3[7] */  /*CP open/short feature enable/disable, pull low for default enable*/
     system("echo 103 > /sys/class/gpio/export");
@@ -1318,11 +1327,11 @@ bool DisplaySelfTestFailReason()
     }
 
     if (pSysInfo->AcContactorStatus == NO) {
-#if !defined DD360 && !defined DD360Audi && !defined DD360ComBox
+#if !defined DD360Tcci && !defined DD360Audi && !defined DD360ComBox
         // AC Contact 未搭上
         pAlarmCode->AlarmEvents.bits.AcContactStestFail = true;
         result = true;
-#endif // !defined DD360 && !defined DD360Audi && !defined DD360ComBox
+#endif // !defined DD360Tcci && !defined DD360Audi && !defined DD360ComBox
     }
     //else if (pAlarmCode->AlarmEvents.bits.PsuDipSwitchStestFail == YES) { //DS60-120 add
     //    result = true;
@@ -1642,7 +1651,7 @@ void _DetectPlugInTimeout(void)
 #if defined DD360Audi
 	//pSysInfo->SystemPage = _LCM_COMPLETE;
 	setChargerMode(pSysInfo->CurGunSelected, S_TERMINATING);
-#elif DD360 || DD360Combox
+#elif DD360Tcci || DD360Combox
  	setChargerMode(pSysInfo->CurGunSelected, S_COMPLETE);
     systemPageRestoreInit();
    
@@ -1680,7 +1689,7 @@ void _DetectEvseChargingEnableTimeout(uint8_t gunIndex)
 #if defined DD360Audi
 	    //pSysInfo->SystemPage = _LCM_COMPLETE;
 		setChargerMode(pSysInfo->CurGunSelected, S_TERMINATING);
-#elif DD360 || DD360Combox
+#elif DD360Tcci || DD360Combox
 	setChargerMode(pSysInfo->CurGunSelected, S_COMPLETE);
 #endif
     _AutoReturnTimeout();
@@ -1693,7 +1702,7 @@ void _PrepareTimeout(uint8_t gunIndex)
 #if defined DD360Audi
 	    //pSysInfo->SystemPage = _LCM_COMPLETE;
 		setChargerMode(pSysInfo->CurGunSelected, S_TERMINATING);
-#elif DD360 || DD360Combox
+#elif DD360Tcci || DD360Combox
 	setChargerMode(pSysInfo->CurGunSelected, S_COMPLETE);
 #endif
     pAlarmCode->AlarmEvents.bits.PsuNoResource = YES;
@@ -1706,7 +1715,7 @@ void _CcsPrechargeTimeout(uint8_t gunIndex)
 #if defined DD360Audi
 	    //pSysInfo->SystemPage = _LCM_COMPLETE;
 		setChargerMode(pSysInfo->CurGunSelected, S_TERMINATING);
-#elif DD360 || DD360Combox
+#elif DD360Tcci || DD360Combox
 	setChargerMode(pSysInfo->CurGunSelected, S_COMPLETE);
 	pSysInfo->SystemPage = _LCM_COMPLETE;
 	return;
@@ -2086,7 +2095,7 @@ void EmcOccureByString(char *code)
     // 嚴重的急停有以下幾種 : EMC 按鈕、Mainbreak、Dooropen
     // 其錯誤等級為 2
 
-#if defined DD360 ||defined DD360Audi || defined DD360ComBox
+#if defined DD360Tcci ||defined DD360Audi || defined DD360ComBox
     //DS60-120 remove
     if (strncmp(code, "012251", 6) == EQUAL ||
             strncmp(code, "012252", 6) == EQUAL ||
@@ -2099,7 +2108,7 @@ void EmcOccureByString(char *code)
             strncmp(code, "042201", 6) == EQUAL ||
             strncmp(code, "042202", 6) == EQUAL ||
             strncmp(code, "042267", 6) == EQUAL)
-#endif //defined DD360 || defined DD360Audi
+#endif //defined DD360Tcci || defined DD360Audi
     {
         for (uint8_t gun = 0; gun < pSysConfig->TotalConnectorCount; gun++) {
             pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(gun);
@@ -2117,10 +2126,10 @@ void EmcOccureByString(char *code)
                 ChargingAlarmProcess(gun);
             }
         }
-#if defined DD360 ||defined DD360Audi || defined DD360ComBox
+#if defined DD360Tcci ||defined DD360Audi || defined DD360ComBox
         StopChargingProcessByString(level);
         InformOcppErrOccur(4);
-#endif //defined DD360 || defined DD360Audi
+#endif //defined DD360Tcci || defined DD360Audi
     }
 }
 
@@ -2227,6 +2236,7 @@ void CheckErrorOccurStatus(uint8_t index)
     }
 
     if (pAlarmCode->AlarmEvents.bits.DcInputOVP == YES ||
+            pAlarmCode->AlarmEvents.bits.DcInputUVP == YES ||
             pAlarmCode->AlarmEvents.bits.SystemL1InputOVP == YES ||
             pAlarmCode->AlarmEvents.bits.SystemL2InputOVP == YES ||
             pAlarmCode->AlarmEvents.bits.SystemL3InputOVP == YES) {
@@ -2240,6 +2250,8 @@ void CheckErrorOccurStatus(uint8_t index)
         if (strncmp((char *)pDcChargingInfo->ConnectorAlarmCode, "", 6) == EQUAL) {
             if (pAlarmCode->AlarmEvents.bits.DcInputOVP == YES) {
                 memcpy(pDcChargingInfo->ConnectorAlarmCode, "042327", 6);
+            } else if (pAlarmCode->AlarmEvents.bits.DcInputUVP == YES) {
+                memcpy(pDcChargingInfo->ConnectorAlarmCode, "042328", 6);
             } else if (pAlarmCode->AlarmEvents.bits.SystemL1InputOVP == YES) {
                 memcpy(pDcChargingInfo->ConnectorAlarmCode, "042200", 6);
             } else if (pAlarmCode->AlarmEvents.bits.SystemL2InputOVP == YES) {
@@ -2618,11 +2630,11 @@ int SpawnTask(void)
     system("/root/Module_ProduceUtils &");
     system("/root/Module_UpdateFW &");
 
-    #if defined DD360 ||defined DD360Audi || defined DD360ComBox
+    #if defined DD360Tcci ||defined DD360Audi || defined DD360ComBox
     system("/root/Module_DoComm &");
 
     return PASS;
-#endif //defined DD360 ||defined DD360Audi || defined DD360ComBox
+#endif //defined DD360Tcci ||defined DD360Audi || defined DD360ComBox
 
     system("/root/Module_PsuComm &");
 
@@ -2659,9 +2671,9 @@ void KillTask(void)
     system("killall Module_UpdateFW");
     system("killall Module_ChkSysTask");
     //system("killall Module_DoComm");
-#if defined DD360 || defined DD360Audi || defined DD360ComBox
+#if defined DD360Tcci || defined DD360Audi || defined DD360ComBox
     return ;
-#endif //defined DD360 || defined DD360Audi || defined DD360ComBox
+#endif //defined DD360Tcci || defined DD360Audi || defined DD360ComBox
 
     system("killall Module_PsuComm");
     system("killall OcppBackend &");
@@ -2676,9 +2688,9 @@ void KillTaskExceptPrimary(void)
     system("killall Module_EvComm");
     system("killall Module_InternalComm");
 
-#if defined DD360 || defined DD360Audi || defined DD360ComBox
+#if defined DD360Tcci || defined DD360Audi || defined DD360ComBox
     return;
-#endif //defined DD360 || defined DD360Audi || defined DD360ComBox
+#endif //defined DD360Tcci || defined DD360Audi || defined DD360ComBox
 
     system("killall Module_PsuComm");
     system("killall Module_4g &");
@@ -2697,10 +2709,10 @@ void KillAllTask(void)
     system("killall Module_UpdateFW");
     system("killall Module_ChkSysTask");
 
-#if defined DD360 || defined DD360Audi || defined DD360ComBox
+#if defined DD360Tcci || defined DD360Audi || defined DD360ComBox
     system("killall Module_DoComm");
     return ;
-#endif //defined DD360 || defined DD360Audi || defined DD360ComBox
+#endif //defined DD360Tcci || defined DD360Audi || defined DD360ComBox
 
     system("killall Module_PsuComm");
     system("killall OcppBackend &");
@@ -2745,7 +2757,7 @@ void StopGunInfoTimeoutDet(uint8_t gunIndex)
 
 void CheckConnectionTimeout(void)
 {
-#if defined DD360 || defined DD360Audi || defined DD360ComBox
+#if defined DD360Tcci || defined DD360Audi || defined DD360ComBox
     if (ShmSelectGunInfo->RemoteSetup.ConnectionTimeout != 0) { //Jerry add
         _connectionTimeout = ShmSelectGunInfo->RemoteSetup.ConnectionTimeout;
     } else {
@@ -2753,7 +2765,7 @@ void CheckConnectionTimeout(void)
     }
 
     return;
-#endif //defined DD360 || defined DD360Audi || defined DD360ComBox
+#endif //defined DD360Tcci || defined DD360Audi || defined DD360ComBox
 
     if (system("pidof -s OcppBackend > /dev/null") != 0) {
         _connectionTimeout = CONN_PLUG_TIME_OUT;
@@ -3056,9 +3068,9 @@ void CheckOcppStatus(void)
 
 void OcppStartTransation(uint8_t gunIndex)
 {
-#if defined DD360 || defined DD360Audi || defined DD360ComBox
+#if defined DD360Tcci || defined DD360Audi || defined DD360ComBox
     return;
-#endif //defined DD360 || defined DD360Audi || defined DD360ComBox
+#endif //defined DD360Tcci || defined DD360Audi || defined DD360ComBox
 
     uint8_t _OcppGunIndex = gunIndex;
     pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(gunIndex);
@@ -3476,7 +3488,7 @@ void ClearAlarmCodeWhenAcOff()
 //==========================================
 void CheckTask()
 {
-    /*+++ 20200908, vern, disable it for DD360 +++*/
+    /*+++ 20200908, vern, disable it for DD360Tcci +++*/
 #if 0
     if (pSysConfig->ModelName[10] == 'T') {
         if (system("pidof -s Module_4g > /dev/null") != 0) {
@@ -3499,7 +3511,7 @@ void CheckTask()
     }
 #endif //0
 
-    /*--- 20200908, vern, disable it for DD360 ---*/
+    /*--- 20200908, vern, disable it for DD360Tcci ---*/
     /*
     if (system("pidof -s Module_ProduceUtils > /dev/null") != 0) {
         log_error("Module_ProduceUtils not running, restart it.");
@@ -3854,6 +3866,7 @@ static void ReviewCriticalAlarm(void)
             ShmDcCommonData->PowerAlarmState.StatusBit.EmergencyStop == YES ||
             ShmDcCommonData->PowerAlarmState.StatusBit.DoorOpen == YES ||
             ShmDcCommonData->PowerAlarmState.StatusBit.DcInputOVP == YES ||
+            ShmDcCommonData->PowerAlarmState.StatusBit.DcInputUVP == YES ||
             ShmDcCommonData->PowerAlarmState.StatusBit.SystemL1InputOVP == YES ||
             ShmDcCommonData->PowerAlarmState.StatusBit.SystemL2InputOVP == YES ||
             ShmDcCommonData->PowerAlarmState.StatusBit.SystemL3InputOVP == YES ||
@@ -3969,12 +3982,12 @@ static void isChargingAverageState(void)
         return;
     }
 
-#if !defined DD360 && !defined DD360Audi && !defined DD360ComBox
+#if !defined DD360Tcci && !defined DD360Audi && !defined DD360ComBox
     if (pSysInfo->AcContactorStatus != YES) {
         pSysInfo->MainChargingMode = _MAIN_CHARGING_MODE_MAX;
         pSysInfo->ReAssignedFlag = _REASSIGNED_NONE;
     }
-#endif //!defined DD360 && !defined DD360Audi
+#endif //!defined DD360Tcci && !defined DD360Audi
 
     // 均充 -> 最大充
     if (pSysInfo->BridgeRelayStatus == NO) {
@@ -3994,9 +4007,9 @@ static void isChargingAverageState(void)
 
 static uint8_t distributionPsuModule(uint8_t *isRessign, uint8_t gunIndex)
 {
-#if defined DD360 || defined DD360Audi || defined DD360ComBox
+#if defined DD360Tcci || defined DD360Audi || defined DD360ComBox
     return NO;
-#endif // defined DD360 || defined DD360Audi || defined DD360ComBox
+#endif // defined DD360Tcci || defined DD360Audi || defined DD360ComBox
 
     uint8_t index = 0;
     struct ChargingInfoData *pDcChargingInfo = NULL;
@@ -4128,10 +4141,10 @@ static void checkPileEndGfdResult(uint8_t gunIndex, uint8_t gunType, uint8_t sys
         //if ((sysStatus == S_ALARM ||
         //        sysStatus == S_TERMINATING) &&
         //        isEvStopCharging_chademo(gunIndex) == YES) {
-        //    /*+++ 20200908, vern, disable it for DD360 +++*/
+        //    /*+++ 20200908, vern, disable it for DD360Tcci +++*/
         //    if (strcmp((char *)ShmOCPP16Data->StopTransaction[gunIndex].StopReason, "") == EQUAL) {
         //        strcpy((char *)ShmOCPP16Data->StopTransaction[gunIndex].StopReason, "Local");
-        //        /*--- 20200908, vern, disable it for DD360 ---*/
+        //        /*--- 20200908, vern, disable it for DD360Tcci ---*/
         //    }
         //}
 
@@ -4173,14 +4186,14 @@ static void checkPileEndGfdResult(uint8_t gunIndex, uint8_t gunType, uint8_t sys
 
         // 非車端的停止 : 需等待小板送出停止指令,讓車端解除槍
         //if (isEvStopCharging_chademo(gunIndex) == YES) {
-        //    /*+++ 20200908, vern, disable it for DD360 +++*/
+        //    /*+++ 20200908, vern, disable it for DD360Tcci +++*/
         //    if ((sysStatus == S_ALARM ||
         //            sysStatus == S_TERMINATING) &&
         //            strcmp((char *)ShmOCPP16Data->StopTransaction[gunIndex].StopReason, "") == EQUAL
         //       ) {
         //        strcpy((char *)ShmOCPP16Data->StopTransaction[gunIndex].StopReason, "Local");
         //    }
-        //    /*--- 20200908, vern, disable it for DD360 ---*/
+        //    /*--- 20200908, vern, disable it for DD360Tcci ---*/
         //}
 
         if (pDcChargingInfo->GroundFaultStatus == GFD_FAIL) {
@@ -4223,14 +4236,14 @@ static void checkPileEndGfdResult(uint8_t gunIndex, uint8_t gunType, uint8_t sys
 
         // 非車端的停止 : 需等待小板送出停止指令,讓車端解除槍
         //if (isEvStopCharging_chademo(gunIndex) == YES) {
-        //    /*+++ 20200908, vern, disable it for DD360 +++*/
+        //    /*+++ 20200908, vern, disable it for DD360Tcci +++*/
         //    if ((sysStatus == S_ALARM ||
         //            sysStatus == S_TERMINATING) &&
         //            (strcmp((char *)ShmOCPP16Data->StopTransaction[gunIndex].StopReason, "") == EQUAL)
         //       ) {
         //        strcpy((char *)ShmOCPP16Data->StopTransaction[gunIndex].StopReason, "Local");
         //    }
-        //    /*--- 20200908, vern, disable it for DD360 ---*/
+        //    /*--- 20200908, vern, disable it for DD360Tcci ---*/
         //}
 
         if (pDcChargingInfo->GroundFaultStatus == GFD_FAIL) {
@@ -4366,8 +4379,8 @@ int main(void)
     log_info(" ********************************************************");
     log_info(" ******************  FileSystem Boot up *****************");
     log_info(" ********************************************************");
-#if defined DD360
-    log_info("Customer:DD360");
+#if defined DD360Tcci
+    log_info("Customer:DD360Tcci");
 #elif defined DD360Audi
     log_info("Customer:DD360Audi");
 #elif defined DD360ComBox
@@ -4802,6 +4815,8 @@ int main(void)
                         pSysInfo->OrderCharging = NO_DEFINE;
                     }
                     StopSystemTimeoutDet();
+                    gettimeofday(&pDcChargingInfo->PreChargeTimer, NULL);
+                    pDcChargingInfo->_SaftyDetect = false;
                 }
 
                 isRessign = NO;
@@ -5133,10 +5148,10 @@ int main(void)
                 if (pDcChargingInfo->Type == _Type_Chademo) {
                     // 非車端的停止 : 需等待小板送出停止指令,讓車端解除槍
                     //if (isEvStopCharging_chademo(gunIndex) == YES) {
-                    //    /*+++ 20200908, vern, disable it for DD360 +++*/
+                    //    /*+++ 20200908, vern, disable it for DD360Tcci +++*/
                     //    /*if (strcmp((char *)ShmOCPP16Data->StopTransaction[gunIndex].StopReason, "") == EQUAL)
                     //        strcpy((char *)ShmOCPP16Data->StopTransaction[gunIndex].StopReason, "Local");*/
-                    //    /*--- 20200908, vern, disable it for DD360 ---*/
+                    //    /*--- 20200908, vern, disable it for DD360Tcci ---*/
                     //}
 
                     if (pDcChargingInfo->GroundFaultStatus == GFD_FAIL) {
@@ -5158,10 +5173,10 @@ int main(void)
 
                     // 非車端的停止 : 需等待小板送出停止指令,讓車端解除槍
                     //if (isEvStopCharging_chademo(gunIndex) == YES) {
-                    //    /*+++ 20200908, vern, disable it for DD360 +++*/
+                    //    /*+++ 20200908, vern, disable it for DD360Tcci +++*/
                     //    /*if (strcmp((char *)ShmOCPP16Data->StopTransaction[gunIndex].StopReason, "") == EQUAL)
                     //            strcpy((char *)ShmOCPP16Data->StopTransaction[gunIndex].StopReason, "Local");*/
-                    //    /*--- 20200908, vern, disable it for DD360 ---*/
+                    //    /*--- 20200908, vern, disable it for DD360Tcci ---*/
                     //}
 
                     if (pDcChargingInfo->GroundFaultStatus == GFD_FAIL) {
@@ -5179,10 +5194,10 @@ int main(void)
                 } else if (pDcChargingInfo->Type == _Type_CCS_2) {
                     // 非車端的停止 : 需等待小板送出停止指令,讓車端解除槍
                     //if (isEvStopCharging_chademo(gunIndex) == YES) {
-                    //    /*+++ 20200908, vern, disable it for DD360 +++*/
+                    //    /*+++ 20200908, vern, disable it for DD360Tcci +++*/
                     //    /*if (strcmp((char *)ShmOCPP16Data->StopTransaction[gunIndex].StopReason, "") == EQUAL)
                     //            strcpy((char *)ShmOCPP16Data->StopTransaction[gunIndex].StopReason, "Local");*/
-                    //    /*--- 20200908, vern, disable it for DD360 ---*/
+                    //    /*--- 20200908, vern, disable it for DD360Tcci ---*/
                     //}
 
                     if (pDcChargingInfo->GroundFaultStatus == GFD_FAIL) {
@@ -5250,8 +5265,9 @@ int main(void)
                         GetTimeoutValue(pDcChargingInfo->TimeoutTimer) >= 10000000) {
                     setChargerMode(gunIndex, MODE_IDLE);
                     destroySelGun(gunIndex); //Jerry add
-#ifdef DD360 || DD3660ComBox
-					pSysInfo->SystemPage = _LCM_IDLE;
+#ifdef DD360Tcci || DD3660ComBox
+					//pSysInfo->SystemPage = _LCM_IDLE;
+                    connectorPageRestoreIdle();
 #endif
                 }
 

+ 4 - 4
EVSE/Projects/DD360Tcci/Apps/CSU/main.h

@@ -12,11 +12,11 @@
 #define MAX_BUF                                 (64)
 #define SYSFS_GPIO_DIR                          "/sys/class/gpio"
 #define UPGRADE_FAN                             (0x02)
-#if defined DD360 || defined DD360Audi || defined DD360ComBox
-#define UPGRADE_RB                              (0x09) //0x09 for DD360 dispenser
+#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 DD360 ||defined DD360Audi || defined DD360ComBox
+#endif //defined DD360Tcci ||defined DD360Audi || defined DD360ComBox
 #define UPGRADE_PRI                             (0x04)
 #define UPGRADE_AC                              (0x05)
 #define UPGRADE_LED                             (0x06)
@@ -43,7 +43,7 @@
 #define GUN_COMP_WAIT_TIMEOUT                   (10)
 #define GUN_PRECHARGING_TIMEOUT                 (60)
 #define EVCCID_LINK_TIMEOUT                     (120)
-
+#define PRECHARGING_TTIMEOUT                    (60)
 #define WHILE_LOOP_TIME                         (10000)
 
 //#define log_info(format, args...) StoreLogMsg_1("[%s:%d][%s][Info] "format, __FILE__, __LINE__, __FUNCTION__, ##args)

+ 4 - 2
EVSE/Projects/DD360Tcci/Apps/Config.h

@@ -339,11 +339,11 @@ typedef union {
         uint8_t EmergencyStop: 1;    //Power cabinet emergency stop
         uint8_t DoorOpen: 1;         //Power cabinet emergency door open
         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
         uint8_t PsuFailure: 1;       //Power cabinet PSU Failure Alarm
-        uint8_t Reserved: 1;
     } StatusBit;
 } PowerAlarmState;
 
@@ -386,7 +386,9 @@ typedef struct StDcCommonInfo {
     PcPsuOutput PcPsuOutput[2];
     uint8_t _upgrade_lcm_flag;
     uint8_t _upgrade_lcm_result;
-    uint8_t Reserved[1];
+    uint8_t chillerCtrl;
+    uint8_t debugflag;
+    uint8_t Reserved[7];
 } DcCommonInfo;
 
 #endif /* CONFIG_H_ */

+ 7 - 7
EVSE/Projects/DD360Tcci/Apps/Define/define.c

@@ -103,8 +103,8 @@ char FaultStatusCode[40][6]=
 "011036", //Rotary switch fault
 "011037", //CCS liquid chiller water level fault
 "011038", //Chiller temperature sensor broken
-"011039", //Reserved
-"011040" //Reserved
+"011039", //Parallel relay welding
+"011040"  //Parallel output relay driving fault
 };
 
 char AlarmStatusCode[160][6]=
@@ -233,11 +233,11 @@ char AlarmStatusCode[160][6]=
 "012321", // System CCS output UCP
 "012322", // System GBT output UCP
 "012323", // System Chiller output OTP
-"012324", // reserved
-"012325", // reserved
-"012326", // reserved
-"012327", // reserved
-"012328",   // reserved
+"012324", // Connector 1 detects abnormal voltage on the output line
+"012325", // Connector 2 detects abnormal voltage on the output line
+"012326", // System task is lost
+"012327", // DC input ovp
+"012328", // DC input uvp
 "012329",   // reserved
 "012330",   // reserved
 "012331",   // reserved

+ 55 - 29
EVSE/Projects/DD360Tcci/Apps/Define/define.h

@@ -63,6 +63,15 @@ Storage							0x0A200000-0x7FFFFFFF		1886 MB
     #define GENERAL_GUN_QUANTITY    0
     #define PSU_QUANTITY            0
     #define ONE_CONNECTOR_USE       0
+#elif defined NoodoeAX
+    #define MAX_PSU_QUANTITY        62
+    #define CHAdeMO_QUANTITY        1
+    #define CCS_QUANTITY            1
+    #define GB_QUANTITY             0
+    #define AC_QUANTITY             1
+    #define GENERAL_GUN_QUANTITY    0
+    #define PSU_QUANTITY            0
+    #define ONE_CONNECTOR_USE       0
 #elif defined AX80
     #define MAX_PSU_QUANTITY        62
     #define CHAdeMO_QUANTITY        1
@@ -117,7 +126,7 @@ Storage							0x0A200000-0x7FFFFFFF		1886 MB
     #define GENERAL_GUN_QUANTITY	0
     #define PSU_QUANTITY            2
     #define ONE_CONNECTOR_USE       0
-#elif defined DD360 || defined DD360Audi || defined DD360ComBox || defined DD360UCar
+#elif defined DD360 || defined DD360Audi || defined DD360ComBox || defined DD360UCar || defined DD360Tcci
     #define MAX_PSU_QUANTITY        62
     #define CHAdeMO_QUANTITY        2
     #define CCS_QUANTITY            2
@@ -312,6 +321,8 @@ enum CoreProfile {
      TimeOffsetNextTransition,
      SystemUptimeSec,
      FreeVend,
+     OcppServer,
+     MaintainServer,
      ConfigurationVersion,
 	 _CoreProfile_CNT
 };
@@ -450,7 +461,10 @@ typedef union
         unsigned int AlarmStop:1;                   // 0: no effect,    1: alarm stop
         unsigned int BackendStop:1;                 // 0: no effect,    1: backend stop
         unsigned int ManualStop:1;                  // 0: no effect,    1: manual stop
-        unsigned int res:28;
+        unsigned int HardResetStop:1;               // 0: no effect,    1: hard reset stop
+        unsigned int SoftResetStop:1;               // 0: no effect,    1: soft reset stop
+        unsigned int InvalidIdStop:1;               // 0: no effect,    1: invalid stop when StopTransactionOnInvalidId is true
+        unsigned int res:25;
     }bits;
 }ChargingStop;
 
@@ -658,8 +672,22 @@ struct ChargingInfoData
     unsigned char       Replug_flag;
     unsigned char       isEVCCIDVerify;
     unsigned char       CCSGunType;
+    struct timeval      PreChargeTimer;
+    unsigned char       _SaftyDetect;
 };
 
+typedef struct
+{
+    unsigned char       AuthId[32];
+                                                        // 0: Authorize idle, 1: Authorize wait,   2: Authorizing
+    unsigned char       AuthStatus;                     // 3: Authorize done, 4: Authorize end
+    unsigned char       AuthTarget;                     // Authorize Target Connector ID: 1 ~ 4, AutoSelection: 0xFF
+    unsigned char       AuthType;                       // 0: _AuthType_None,   1: _AuthType_RFID, 2: _AuthType_RemoteStart
+    unsigned char       AuthResult;                     // 0: _AuthResult_None, 1: _AuthResult_Valid,   2: _AuthResult_Invalid
+    unsigned char       AuthRequest;                    // 0: no request, 1: authorize request
+    unsigned char       res;
+}AuthorizingInfoData;
+
 typedef union
 {
     unsigned int SettingValue;
@@ -670,7 +698,6 @@ typedef union
         unsigned int DispenserConfigSync:1;             // 0: not synced,   1: synced
         unsigned int MiscNeedAnnouncement:1;            // 0: no need,      1: need send misc command
         unsigned int NeedDispenserVerInfo:1;            // 0: no need,      1: need dispenser to report it's version info
-        unsigned int EnableAutoGunSelection:1;          // 0: disable,      1: enable auto gun selection
         unsigned int AuthorizeRequest:1;                // 0: idle,         1: requesting                           ( dispenser -> cabinet)
         unsigned int ConnectorTimeoutConfigRequest:1;   // 0: no request,   1: connector timeout setting            (    ocpp   -> cabinet -> dispenser)
         unsigned int DefaultPriceConfigRequest:1;       // 0: no request,   1: default price setting                (    ocpp   -> cabinet -> dispenser)
@@ -690,6 +717,7 @@ typedef union
         unsigned int StopButtonStatusRequest:1;         // 0: no request,   1: stop charging button status has changed          ( cabinet -> dispenser)
         unsigned int AuthModeConfigRequest:1;           // 0: no request,   1: AuthMode Config has changed                      ( cabinet -> dispenser)
         unsigned int EVCCIDConfigRequest:1;             // 0: no request,   1: EVCCID Config has changed                        ( cabinet -> dispenser)
+        unsigned int LEDIntensityRequest:1;             // 0: no request,   1: LED Intensity has changed                        ( cabinet -> dispenser)
         unsigned int res:7;
     }bits;
 }DispenserSettingFlag;
@@ -727,11 +755,7 @@ struct DispenserModule
     unsigned char   Connector2FwRev[32];        //Connector2 module firmware version
     struct   LED    LedInfo;                    // LED configuration info
 
-                                                // 0: Authorize idle, 1: Authorize wait,   2: Authorizing
-    unsigned char           AuthStatus;         // 3: Authorize done, 4: Authorize end
-    unsigned char           AuthTarget;         // Authorize Target Connector ID: 1 ~ 4, AutoSelection: 0xFF
-    unsigned char           AuthType;           // 0: _AuthType_None, 1: _AuthType_RFID, 2: _AuthType_RemoteStart
-    unsigned char           AuthResult;         // 0: _AuthResult_None, 1: _AuthResult_Valid,   2: _AuthResult_Invalid
+    AuthorizingInfoData     AuthInfo;
     DispenserSettingFlag    Setting;
     char                    FwFileName[128];
     unsigned char           ConnectionChannel;
@@ -812,7 +836,8 @@ typedef union
         unsigned int  FaultStatusRequest:1;
         unsigned int  Disconnection:1;
         unsigned int  GfdDetection:1;                   // 0: stop,         1: start
-        unsigned int  res:9;
+        unsigned int  GetStartChargingSoc:1;            // 0: no effect,    1: get start soc
+        unsigned int  res:8;
     }bits;
 }ConnectorParameter;
 
@@ -824,8 +849,7 @@ struct ConnectorInfoData
     unsigned char ParentDispensetIndex;                 // Parent Dispenser Index: 0 ~ 3
     ConnectorParameter       Parameter;
 
-    unsigned char            AuthorizingType;
-    unsigned char            AuthorizingResult;         // 0: _AuthResult_None, 1: _AuthResult_Valid,   2: _AuthResult_Invalid
+    AuthorizingInfoData      AuthInfo;
     struct ChargingInfoData  GeneralChargingData;
     struct WARNING_CODE_INFO WarningInfo;
 
@@ -844,8 +868,11 @@ struct ConnectorInfoData
 
     unsigned short          MaxTotalChargingCurrent;        // max total output current, unit: 0.1A
     unsigned short          MaxTotalChargingPower;          // max total output power, unit: 0.1kw
-    unsigned short          MaxOutputEnergy;                //0: no limit,  1 ~ 65535   kWh
-    unsigned short          MaxOutputDuration;              //0: no limit,  1 ~ 65535   minutes
+    unsigned short          MaxOutputEnergy;                // 0: no limit,  1 ~ 65535   kWh
+    unsigned short          MaxOutputDuration;              // 0: no limit,  1 ~ 65535   minutes
+    float                   CapabilityVoltage;              // unit 0.1V
+    float                   CapabilityCurrent;              // unit 0.1A
+    float                   CapabilityPower;                // unit 0.1kW
 
     unsigned int            UserPrice;                      // connector user's user price, unit: 0.01 (dollar / kWh)
     unsigned int            TotalCost;                      // connector user's total cost, unit: 0.01 dollar
@@ -857,14 +884,11 @@ typedef union
     unsigned int SettingValue;
     struct
     {
-        unsigned int StartAuthorize:1;          // 0: idle,    1: authorizing
-        unsigned int AuthorizingCompleted:1;    // 0: not yet, 1: authorizing completed
         unsigned int DispenserDisconnection:1;  // 0: no connection,  1: dispenser connected
-        unsigned int BackendAuthorized:1;       // 0: local authorized, 1: backend authorized
         unsigned int FlashConfigChanged:1;      // 0: no effect, 1: flash config has changed
         unsigned int EnableWriteFlash:1;        // 0: no effect, 1: enable to write flash after timeout
         unsigned int CleanWiringInfo:1;         // 0: no effect, 1: clean wiring info
-        unsigned int res:25;
+        unsigned int res:28;
     }bits;
 }CabinetSettingFlag;
 
@@ -990,7 +1014,7 @@ struct SysInfoData
     CabinetMiscCommand      CabinetMicsStatus;
     struct LocalSharingInfo localSharingInfo;           // Local power sharing info structure
     DC_Meter_Info DcMeterInfo[4];
-    unsigned char           OTPTemp;                    // OTP Temperature 
+    unsigned char           OTPTemp;                    // OTP Temperature
     unsigned char           OTPTempR;                   // OTP Recovery Temperature
 };
 
@@ -1116,8 +1140,8 @@ char FaultStatusCode[40][6]=
 	"011036",	//Rotary switch fault
 	"011037",	//CCS liquid chiller water level fault
 	"011038",	//Chiller temperature sensor broken
-	"011039",	//Reserved
-	"011040"	//Reserved
+	"011039",	//Parallel relay welding
+	"011040"	//Parallel output relay driving fault
 };
 */
 
@@ -1172,7 +1196,8 @@ struct FaultCodeData
 			unsigned char RotarySwitchFault:1;					//bit 3 
 			unsigned char CcsLiquidChillerWaterLevelFault:1;    //bit 4
             unsigned char ChillerTempSensorBroken:1;            //bit 5
-            unsigned char :2;                                   //bit 6 ~ 7 reserved
+            unsigned char ParallelRelayWelding:1;               //bit 6
+            unsigned char ParallelRelayDriving:1;               //bit 7
 		}bits;
 	}FaultEvents;
 };
@@ -1308,7 +1333,7 @@ char AlarmStatusCode[160][6]=
     "012325",   // Connector 2 detects abnormal voltage on the output line
     "012326",   // System task is lost
     "012327",   // DC input ovp
-    "012328",   // reserved
+    "012328",   // DC input uvp
     "012329",   // reserved
     "012330",   // reserved
     "012331",   // reserved
@@ -1495,7 +1520,8 @@ struct AlarmCodeData
             unsigned char SystemTaskLost:1;                         //bit 6
             unsigned char DcInputOVP:1;                             //bit 7
             //AlarmVal[16]
-            unsigned char :8;                                       //reserved bit 0 ~ bit 7
+            unsigned char DcInputUVP:1;                             //bit 0
+            unsigned char :7;                                       //reserved bit 1 ~ bit 7
             //AlarmVal[17]
             unsigned char :8;                                       //reserved bit 0 ~ bit 7
             //AlarmVal[18]
@@ -4387,7 +4413,7 @@ struct OCPP16ConfigurationItem
 {
 	unsigned char 		ItemName[64];
 	unsigned char 		ItemAccessibility;//0:RO, 1:RW
-	unsigned char 		ItemData[500];
+	unsigned char 		ItemData[501];//value should be limited in 500 bytes
 };
 
 struct OCPP16ConfigurationTable
@@ -4567,9 +4593,9 @@ struct StructSignedFirmwareStatusNotification
 
 struct StructSessionTarget
 {
-	unsigned char		targetSoc;			// Unit: %,   		0 is unlimit
-	unsigned short		targetEnergy;		// Unit: KWH		0 is unlimit
-	unsigned short		targetDuration;		// Unit: Minutes	0 is unlimit
+    unsigned char       targetSoc;          // Unit: %,         0 is unlimit
+    unsigned short      targetEnergy;       // Unit: KWH        0 is unlimit
+    unsigned short      targetDuration;     // Unit: Minutes    0 is unlimit
 };
 
 struct OCPP16Data
@@ -4760,7 +4786,7 @@ struct OCPP16Data
     struct StructSecurityEventNotification          SecurityEventNotification;
     struct StructSignCertificate                    SignCertificate;
     struct StructSignedFirmwareStatusNotification   SignedFirmwareStatusNotification;
-    struct StructSessionTarget	                    SessionTarget[CONNECTOR_QUANTITY];
+    struct StructSessionTarget                      SessionTarget[CONNECTOR_QUANTITY];
 };
 
 
@@ -6139,7 +6165,7 @@ struct OCPP20Data
 	struct UpdateFirmware_20					UpdateFirmware;
 	struct ChargingProfileType                  SmartChargingProfile[CONNECTOR_QUANTITY];
 	struct ChargingProfileType                  MaxChargingProfile;
-	struct StructSessionTarget	                SessionTarget[CONNECTOR_QUANTITY];
+	struct StructSessionTarget                  SessionTarget[CONNECTOR_QUANTITY];
 };
 
 

+ 7 - 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)
 {
@@ -232,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)
     {
@@ -240,6 +243,10 @@ void main(void)
 			if (pDcChargingInfo->SystemStatus == SYS_MODE_UPDATE )
 				continue;
 		}
+        if (ShmDcCommonData->debugflag == YES) {
+            sleep(3);
+            continue;
+        }
 		CheckSystemTaskAlive();
 		sleep(3);
     }

+ 2 - 1
EVSE/Projects/DD360Tcci/Apps/ModuleDoComm/DoComm.c

@@ -1431,7 +1431,8 @@ static int writeConnectorState(int fd, uint8_t plugNum, uint8_t id)
         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)) {

+ 2 - 1
EVSE/Projects/DD360Tcci/Apps/ModuleEvComm/Module_EvRxComm.c

@@ -417,7 +417,8 @@ void CANReceiver(int fd)
                         (pDcChargingInfo->SystemStatus >= S_CCS_PRECHARGE_ST0 &&
                          pDcChargingInfo->SystemStatus <= S_CCS_PRECHARGE_ST1)
                    ) {
-                    if (pDcChargingInfo->EvBatteryStartSoc <= 0) {
+                    if (pDcChargingInfo->EvBatteryStartSoc <= 0 &&
+                            pDcChargingInfo->SystemStatus >= S_PREPARING_FOR_EVSE) {
                         pDcChargingInfo->EvBatteryStartSoc = frame.data[1];
                     }
 

+ 6 - 6
EVSE/Projects/DD360Tcci/Apps/ModuleEvComm/Module_EvTxComm.c

@@ -317,18 +317,18 @@ static void SetPresentChargingOutputCap(void)
         chargingData_2 = (struct ChargingInfoData *)GetDcChargingInfoData(1);
     }
 
-#if !defined DD360 && !defined DD360Audi && !defined DD360ComBox
+#if !defined DD360Tcci && !defined DD360Audi && !defined DD360ComBox
     float vol = 0;
-#endif //!defined DD360 && !defined DD360Audi
+#endif //!defined DD360Tcci && !defined DD360Audi
 
     pow1 = chargingData_1->AvailableChargingPower;
     cur1 = chargingData_1->AvailableChargingCurrent;
 
-#if !defined DD360 && !defined DD360Audi && !defined DD360ComBox
+#if !defined DD360Tcci && !defined DD360Audi && !defined DD360ComBox
     vol = chargingData_1->MaximumChargingVoltage;
     GetMaxVolAndCurMethod(chargingData_1->Index, &vol, &cur1);
     GetMaxPowerMethod(chargingData_1->Index, &pow1);
-#endif //!defined DD360 && !defined DD360Audi
+#endif //!defined DD360Tcci && !defined DD360Audi
 
     //DS60-120 add
     if (pow1 <= 0) {
@@ -349,11 +349,11 @@ static void SetPresentChargingOutputCap(void)
     pow2 = chargingData_2->AvailableChargingPower;
     cur2 = chargingData_2->AvailableChargingCurrent;
 
-#if !defined DD360 && !defined DD360Audi && !defined DD360ComBox
+#if !defined DD360Tcci && !defined DD360Audi && !defined DD360ComBox
     vol = chargingData_2->MaximumChargingVoltage;
     GetMaxVolAndCurMethod(chargingData_2->Index, &vol, &cur2);
     GetMaxPowerMethod(chargingData_2->Index, &pow2);
-#endif //!defined DD360 && !defined DD360Audi
+#endif //!defined DD360Tcci && !defined DD360Audi
 
     //DS60-120 add
     if (pow2 <= 0) {

+ 2 - 2
EVSE/Projects/DD360Tcci/Apps/ModuleInternalComm/LEDlight.c

@@ -266,13 +266,13 @@ static void LEDBoardSelfTest(void)
         return;
     }
 
-#if defined DD360 ||defined DD360Audi
+#if defined DD360Tcci ||defined DD360Audi
     GetFwAndHwVersion_Led();
     sleep(1);
     gettimeofday(&_led_priority_time, NULL);
 
     return;
-#endif //defined DD360 || defined DD360Audi
+#endif //defined DD360Tcci || defined DD360Audi
 
     // 自檢階段
     if (pSysInfo->SelfTestSeq <= _STEST_PSU_CAP) {

+ 30 - 30
EVSE/Projects/DD360Tcci/Apps/ModuleInternalComm/Module_InternalCommOrg.c

@@ -601,26 +601,26 @@ void GetPersentOutputVol(void)
 
         switch (targetID) {
         case 0x01:
-#if defined DD360 || defined DD360Audi || defined DD360ComBox
+#if defined DD360Tcci || defined DD360Audi || defined DD360ComBox
             _chargingData[index]->FireChargingVoltage = ShmRelayModuleData->Gun1RelayOutputVolt;
             _chargingData[index]->PresentChargingCurrent = ShmRelayModuleData->Gun1FuseOutputVolt / 10;
             _chargingData[index]->PresentChargingVoltage = _chargingData[index]->FireChargingVoltage / 10;
             _chargingData[index]->FuseChargingVoltage = _chargingData[index]->FireChargingVoltage;
             break;
-#endif //defined DD360 || defined DD360Audi || defined DD360ComBox
+#endif //defined DD360Tcci || defined DD360Audi || defined DD360ComBox
 
             _chargingData[index]->FireChargingVoltage = ShmRelayModuleData->Gun1RelayOutputVolt;
             _chargingData[index]->FuseChargingVoltage = ShmRelayModuleData->Gun1FuseOutputVolt;
             break;
 
         case 0x02:
-#if defined DD360 || defined DD360Audi || defined DD360ComBox
+#if defined DD360Tcci || defined DD360Audi || defined DD360ComBox
             _chargingData[index]->FireChargingVoltage = ShmRelayModuleData->Gun2RelayOutputVolt;
             _chargingData[index]->PresentChargingCurrent = ShmRelayModuleData->Gun2FuseOutputVolt / 10;
             _chargingData[index]->PresentChargingVoltage = _chargingData[index]->FireChargingVoltage / 10;
             _chargingData[index]->FuseChargingVoltage = _chargingData[index]->FireChargingVoltage;
             break;
-#endif //defined DD360 || defined DD360Audi || defined DD360ComBox
+#endif //defined DD360Tcci || defined DD360Audi || defined DD360ComBox
 
             _chargingData[index]->FireChargingVoltage = ShmRelayModuleData->Gun2RelayOutputVolt;
             _chargingData[index]->FuseChargingVoltage = ShmRelayModuleData->Gun2FuseOutputVolt;
@@ -661,9 +661,9 @@ void GetFanSpeed()
 void GetRelayOutputStatus(void)
 {
     if (Query_Relay_Output(Uart5Fd, ADDR_RELAY, &regRelay) == PASS) {
-#if !defined DD360 && !defined DD360Audi && !defined DD360ComBox
+#if !defined DD360Tcci && !defined DD360Audi && !defined DD360ComBox
         regRelay.relay_event.bits.AC_Contactor = ShmSysConfigAndInfo->SysInfo.AcContactorStatus;
-#endif //!defined DD360 && !defined DD360Audi
+#endif //!defined DD360Tcci && !defined DD360Audi
     }
 }
 
@@ -683,7 +683,7 @@ void CheckK1K2RelayOutput(uint8_t index)
         }
 
         if (_chargingData[index]->Type == _Type_CCS_2) {
-#if !defined DD360 && !defined DD360Audi && !defined DD360ComBox
+#if !defined DD360Tcci && !defined DD360Audi && !defined DD360ComBox
             if (regRelay.relay_event.bits.Gun1_N == YES && regRelay.relay_event.bits.CCS_Precharge == YES) {
                 _chargingData[index]->RelayKPK2Status = YES;
             } else {
@@ -695,7 +695,7 @@ void CheckK1K2RelayOutput(uint8_t index)
             } else {
                 _chargingData[index]->RelayKPK2Status = NO;
             }
-#endif //!defined DD360 && !defined DD360Audi
+#endif //!defined DD360Tcci && !defined DD360Audi
         }
         break;
 
@@ -708,7 +708,7 @@ void CheckK1K2RelayOutput(uint8_t index)
         }
 
         if (_chargingData[index]->Type == _Type_CCS_2) {
-#if !defined DD360 && !defined DD360Audi && !defined DD360ComBox
+#if !defined DD360Tcci && !defined DD360Audi && !defined DD360ComBox
             if (regRelay.relay_event.bits.Gun2_N == YES &&
                     regRelay.relay_event.bits.CCS_Precharge == YES) {
                 _chargingData[index]->RelayKPK2Status = YES;
@@ -721,12 +721,12 @@ void CheckK1K2RelayOutput(uint8_t index)
             } else {
                 _chargingData[index]->RelayKPK2Status = NO;
             }
-#endif //!defined DD360 && !defined DD360Audi
+#endif //!defined DD360Tcci && !defined DD360Audi
         }
         break;
     }
 
-#if !defined DD360 && !defined DD360Audi && !defined DD360ComBox
+#if !defined DD360Tcci && !defined DD360Audi && !defined DD360ComBox
     //DS60-120 add
     if (ShmSysConfigAndInfo->SysInfo.BridgeRelayStatus == YES) {
         if (regRelay.relay_event.bits.Gun1_Parallel_N == NO &&
@@ -741,7 +741,7 @@ void CheckK1K2RelayOutput(uint8_t index)
     }
 #else
     ShmSysConfigAndInfo->SysInfo.BridgeRelayStatus = YES;
-#endif //!defined DD360 && !defined DD360Audi
+#endif //!defined DD360Tcci && !defined DD360Audi
 }
 
 void GetGfdAdc()
@@ -1008,9 +1008,9 @@ void SetK1K2RelayStatus(uint8_t index)
         break;
 
     case S_CCS_PRECHARGE_ST0:
-#if defined DD360 || defined DD360Audi || defined DD360ComBox
+#if defined DD360Tcci || defined DD360Audi || defined DD360ComBox
         break;
-#endif //defined DD360 || defined DD360Audi || defined DD360ComBox
+#endif //defined DD360Tcci || defined DD360Audi || defined DD360ComBox
 
         if (pDcChargingInfo->Type == _Type_CCS_2 && targetID == 0x02) {
             if (pRegPreChargingState->CcsPrecharge == NO) {
@@ -1022,9 +1022,9 @@ void SetK1K2RelayStatus(uint8_t index)
         break;
 
     case S_CCS_PRECHARGE_ST1:
-#if defined DD360 || defined DD360Audi || defined DD360ComBox
+#if defined DD360Tcci || defined DD360Audi || defined DD360ComBox
         break;
-#endif //defined DD360 || defined DD360Audi || defined DD360ComBox
+#endif //defined DD360Tcci || defined DD360Audi || defined DD360ComBox
 
         if (pDcChargingInfo->Type == _Type_CCS_2 && targetID == 0x02) {
             if (pRegGunPNState->GunP == NO) {
@@ -1087,9 +1087,9 @@ void CheckPhaseLossStatus(uint8_t index)
 
 void SetParalleRelayStatus(void)
 {
-#if defined  DD360 || defined DD360Audi || defined DD360ComBox
+#if defined  DD360Tcci || defined DD360Audi || defined DD360ComBox
     return;
-#endif //!defined  DD360 || !defined DD360Audi || !defined DD360ComBox
+#endif //!defined  DD360Tcci || !defined DD360Audi || !defined DD360ComBox
 
     // 之後雙槍單模機種,橋接都會上
     if (gunCount >= 2) {
@@ -1532,19 +1532,19 @@ bool IsNoneMatchRelayStatus()
     bool result = false;
 
     if (
-#if !defined DD360 && !defined DD360Audi && !defined DD360ComBox
+#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 DD360 && !defined DD360Audi
+#endif //!defined DD360Tcci && !defined DD360Audi
         (regRelay.relay_event.bits.Gun1_P != outputRelay.relay_event.bits.Gun1_P) ||
         (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 DD360 && !defined DD360Audi && !defined DD360ComBox
+#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)
-#endif //!defined DD360 && !defined DD360Audi
+#endif //!defined DD360Tcci && !defined DD360Audi
     ) {
         /*if (regRelay.relay_event.bits.AC_Contactor != outputRelay.relay_event.bits.AC_Contactor) {
             log_info("AC Contact Relay none match. \n");
@@ -1588,9 +1588,9 @@ void MatchRelayStatus()
 {
     // 因為 AC Contactor 沒有 Feedback,所以暫時先這樣處理
     //regRelay.relay_event.bits.AC_Contactor = outputRelay.relay_event.bits.AC_Contactor;
-#if !defined DD360 && !defined DD360Audi && !defined DD360ComBox
+#if !defined DD360Tcci && !defined DD360Audi && !defined DD360ComBox
     ShmSysConfigAndInfo->SysInfo.AcContactorStatus  = regRelay.relay_event.bits.AC_Contactor = outputRelay.relay_event.bits.AC_Contactor;
-#endif //!defined DD360 && !defined DD360Audi
+#endif //!defined DD360Tcci && !defined DD360Audi
 
     regRelay.relay_event.bits.CCS_Precharge = outputRelay.relay_event.bits.CCS_Precharge;
     regRelay.relay_event.bits.Gun1_P = outputRelay.relay_event.bits.Gun1_P;
@@ -2293,7 +2293,7 @@ int main(void)
 #if !defined DD360ComBox
         // 自檢階段處理,自檢階段如果讀不到版號則代表該系統沒有掛燈板
         if (ShmLedModuleData->SelfTest_Comp == NO) {
-#if defined DD360 ||defined DD360Audi
+#if defined DD360Tcci ||defined DD360Audi
             GetFwAndHwVersion_Led();
             sleep(1);
             gettimeofday(&_led_priority_time, NULL);
@@ -2309,7 +2309,7 @@ int main(void)
                     ShmStatusCodeData->AlarmCode.AlarmEvents.bits.LedboardStestFail = YES;
                 }
             }
-#endif //defined DD360 || defined DD360Audi
+#endif //defined DD360Tcci || defined DD360Audi
         }
 #endif //!defined DD360ComBox
 
@@ -2320,14 +2320,14 @@ int main(void)
             // 輸出電壓
             GetPersentOutputVol();
 
-#if !defined DD360 && !defined DD360Audi && !defined DD360ComBox
+#if !defined DD360Tcci && !defined DD360Audi && !defined DD360ComBox
             // 三相輸入電壓
             GetPresentInputVol();
             // 讀取當前 AC relay 狀態
             regRelay.relay_event.bits.AC_Contactor = ShmSysConfigAndInfo->SysInfo.AcContactorStatus;
 
             GetRelayOutputStatus();
-#endif //!defined DD360 && !defined DD360Audi
+#endif //!defined DD360Tcci && !defined DD360Audi
 
             for (i = 0; i < gunCount; i++) {
                 // Cable check (Set)
@@ -2339,13 +2339,13 @@ int main(void)
                 // 依據當前各槍的狀態選擇 搭上/放開 Relay
                 SetK1K2RelayStatus(i);
 
-#if !defined DD360 && !defined DD360Audi && !defined DD360ComBox
+#if !defined DD360Tcci && !defined DD360Audi && !defined DD360ComBox
                 if (ShmSysConfigAndInfo->SysConfig.PhaseLossPolicy == YES) {
                     CheckPhaseLossStatus(i);
                 }
 
                 CheckAcInputOvpStatus(i);
-#endif //!defined DD360 && !defined DD360Audi
+#endif //!defined DD360Tcci && !defined DD360Audi
 
                 if (_chargingData[i]->SystemStatus == S_IDLE) {
                     _chargingData[i]->RelayWeldingCheck = NO;

+ 32 - 32
EVSE/Projects/DD360Tcci/Apps/ModuleInternalComm/RelayBoard.c

@@ -31,7 +31,7 @@ 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;
@@ -142,24 +142,24 @@ static bool IsNoneMatchRelayStatus(void)
     bool result = false;
 
     if (
-#if !defined DD360 && !defined DD360Audi && !defined DD360ComBox
+#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 DD360 && !defined DD360Audi
+#endif //!defined DD360Tcci && !defined DD360Audi
         (regRelay.relay_event.bits.Gun1_P != outputRelay.relay_event.bits.Gun1_P) ||
         (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 DD360 && !defined DD360Audi && !defined DD360ComBox
+#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)
-#endif //!defined DD360 && !defined DD360Audi
+#endif //!defined DD360Tcci && !defined DD360Audi
     ) {
         result = true;
     }
 
-#if !defined DD360 && !defined DD360Audi && !defined DD360ComBox
+#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. ");
     }
@@ -197,7 +197,7 @@ static bool IsNoneMatchRelayStatus(void)
         StopCheckRelayInfo(RELAY_SMR2_N_STATUS);
     }
 
-#if !defined DD360 && !defined DD360Audi && !defined DD360ComBox
+#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);
@@ -218,9 +218,9 @@ static bool IsNoneMatchRelayStatus(void)
 
 static void SetParalleRelayStatus(void)
 {
-#if defined DD360 || defined DD360Audi || defined DD360ComBox
+#if defined DD360Tcci || defined DD360Audi || defined DD360ComBox
     return;
-#endif //!defined  DD360 || !defined DD360Audi || !defined DD360ComBox
+#endif //!defined  DD360Tcci || !defined DD360Audi || !defined DD360ComBox
 
     struct ChargingInfoData *pDcChargingInfo0 = (struct ChargingInfoData *)GetDcChargingInfoData(0);
     struct ChargingInfoData *pDcChargingInfo1 = (struct ChargingInfoData *)GetDcChargingInfoData(1);
@@ -599,9 +599,9 @@ void SetK1K2RelayStatus(uint8_t index)
         break;
 
     case S_CCS_PRECHARGE_ST0:
-#if defined DD360 || defined DD360Audi || defined DD360ComBox
+#if defined DD360Tcci || defined DD360Audi || defined DD360ComBox
         break;
-#endif //defined DD360 || defined DD360Audi || defined DD360ComBox
+#endif //defined DD360Tcci || defined DD360Audi || defined DD360ComBox
 
         //if (pDcChargingInfo->Type == _Type_CCS_2 && targetID == 0x02) {
         //    if (pRegPreChargingState->CcsPrecharge == NO) {
@@ -617,9 +617,9 @@ void SetK1K2RelayStatus(uint8_t index)
         break;
 
     case S_CCS_PRECHARGE_ST1:
-#if defined DD360 || defined DD360Audi || defined DD360ComBox
+#if defined DD360Tcci || defined DD360Audi || defined DD360ComBox
         break;
-#endif //defined DD360 || defined DD360Audi || defined DD360ComBox
+#endif //defined DD360Tcci || defined DD360Audi || defined DD360ComBox
 
         //if (pDcChargingInfo->Type == _Type_CCS_2 && targetID == 0x02) {
         //    if (pRegGunPNState->GunP == NO) {
@@ -653,7 +653,7 @@ void CheckK1K2RelayOutput(uint8_t index)
         }
 
         if (pDcChargingInfo->Type == _Type_CCS_2) {
-#if !defined DD360 && !defined DD360Audi && !defined DD360ComBox
+#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 {
@@ -665,7 +665,7 @@ void CheckK1K2RelayOutput(uint8_t index)
             } else {
                 pDcChargingInfo->RelayKPK2Status = NO;
             }
-#endif //!defined DD360 && !defined DD360Audi
+#endif //!defined DD360Tcci && !defined DD360Audi
         }
         break;
 
@@ -678,7 +678,7 @@ void CheckK1K2RelayOutput(uint8_t index)
         }
 
         if (pDcChargingInfo->Type == _Type_CCS_2) {
-#if !defined DD360 && !defined DD360Audi && !defined DD360ComBox
+#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;
@@ -691,12 +691,12 @@ void CheckK1K2RelayOutput(uint8_t index)
             } else {
                 pDcChargingInfo->RelayKPK2Status = NO;
             }
-#endif //!defined DD360 && !defined DD360Audi
+#endif //!defined DD360Tcci && !defined DD360Audi
         }
         break;
     }
 
-#if !defined DD360 && !defined DD360Audi && !defined DD360ComBox
+#if !defined DD360Tcci && !defined DD360Audi && !defined DD360ComBox
     //DS60-120 add
     if (pSysInfo->BridgeRelayStatus == YES) {
         if (regRelay.relay_event.bits.Gun1_Parallel_N == NO &&
@@ -711,7 +711,7 @@ void CheckK1K2RelayOutput(uint8_t index)
     }
 #else
     pSysInfo->BridgeRelayStatus = YES;
-#endif //!defined DD360 && !defined DD360Audi
+#endif //!defined DD360Tcci && !defined DD360Audi
 }
 
 void SetGfdConfig(uint8_t index, uint8_t resister)
@@ -798,9 +798,9 @@ void CableCheckDetected(uint8_t index)
 void GetRelayOutputStatus(void)
 {
     if (Query_Relay_Output(Uart5Fd, ADDR_RELAY, &regRelay) == PASS) {
-#if !defined DD360 && !defined DD360Audi && !defined DD360ComBox
+#if !defined DD360Tcci && !defined DD360Audi && !defined DD360ComBox
         regRelay.relay_event.bits.AC_Contactor = pSysInfo->AcContactorStatus;
-#endif //!defined DD360 && !defined DD360Audi
+#endif //!defined DD360Tcci && !defined DD360Audi
     }
 }
 
@@ -1050,26 +1050,26 @@ void GetPersentOutputVol(void)
 
         switch (targetID) {
         case 0x01:
-#if defined DD360 || defined DD360Audi || defined DD360ComBox
+#if defined DD360Tcci || defined DD360Audi || defined DD360ComBox
             pDcChargingInfo->FireChargingVoltage = ShmRelayModuleData->Gun1RelayOutputVolt;
             pDcChargingInfo->PresentChargingCurrent = ((float)ShmRelayModuleData->Gun1FuseOutputVolt) / 10;
             pDcChargingInfo->PresentChargingVoltage = ((float)pDcChargingInfo->FireChargingVoltage) / 10;
             pDcChargingInfo->FuseChargingVoltage = pDcChargingInfo->FireChargingVoltage;
             break;
-#endif //defined DD360 || defined DD360Audi || defined DD360ComBox
+#endif //defined DD360Tcci || defined DD360Audi || defined DD360ComBox
 
             pDcChargingInfo->FireChargingVoltage = ShmRelayModuleData->Gun1RelayOutputVolt;
             pDcChargingInfo->FuseChargingVoltage = ShmRelayModuleData->Gun1FuseOutputVolt;
             break;
 
         case 0x02:
-#if defined DD360 || defined DD360Audi || defined DD360ComBox
+#if defined DD360Tcci || defined DD360Audi || defined DD360ComBox
             pDcChargingInfo->FireChargingVoltage = ShmRelayModuleData->Gun2RelayOutputVolt;
             pDcChargingInfo->PresentChargingCurrent = ((float)ShmRelayModuleData->Gun2FuseOutputVolt) / 10;
             pDcChargingInfo->PresentChargingVoltage = ((float)pDcChargingInfo->FireChargingVoltage) / 10;
             pDcChargingInfo->FuseChargingVoltage = pDcChargingInfo->FireChargingVoltage;
             break;
-#endif //defined DD360 || defined DD360Audi || defined DD360ComBox
+#endif //defined DD360Tcci || defined DD360Audi || defined DD360ComBox
 
             pDcChargingInfo->FireChargingVoltage = ShmRelayModuleData->Gun2RelayOutputVolt;
             pDcChargingInfo->FuseChargingVoltage = ShmRelayModuleData->Gun2FuseOutputVolt;
@@ -1237,7 +1237,7 @@ static void GetFanSpeed(void)
 
 static void GetFanSpeedByFunction(void)
 {
-    if (pSysConfig->SwitchDebugFlag == YES) {
+    if (ShmDcCommonData->debugflag== YES) {
         return;
     }
 
@@ -1624,13 +1624,13 @@ static void LEDBoardSelfTest(void)
         return;
     }
 
-#if defined DD360 ||defined DD360Audi
+#if defined DD360Tcci ||defined DD360Audi
     GetFwAndHwVersion_Led();
     sleep(1);
     gettimeofday(&_led_priority_time, NULL);
 
     return;
-#endif //defined DD360 || defined DD360Audi
+#endif //defined DD360Tcci || defined DD360Audi
 
     // 自檢階段
     if (pSysInfo->SelfTestSeq <= _STEST_PSU_CAP) {
@@ -1740,10 +1740,10 @@ void RelayBoardTask(int uartFD)
                 // 輸出電壓
                 GetPersentOutputVol();
 
-    #if !defined DD360 && !defined DD360Audi && !defined DD360ComBox
+    #if !defined DD360Tcci && !defined DD360Audi && !defined DD360ComBox
                 // 三相輸入電壓
                 GetPresentInputVol();
-    #endif //!defined DD360 && !defined DD360Audi
+    #endif //!defined DD360Tcci && !defined DD360Audi
 
                 // 讀取當前 AC relay 狀態
                 regRelay.relay_event.bits.AC_Contactor = pSysInfo->AcContactorStatus;
@@ -1764,13 +1764,13 @@ void RelayBoardTask(int uartFD)
                     // 依據當前各槍的狀態選擇 搭上/放開 Relay
                     SetK1K2RelayStatus(i);
 
-#if !defined DD360 && !defined DD360Audi && !defined DD360ComBox
+#if !defined DD360Tcci && !defined DD360Audi && !defined DD360ComBox
                     if (pSysConfig->PhaseLossPolicy == YES) {
                         CheckPhaseLossStatus(i);
                     }
 
                     CheckAcInputOvpStatus(i);
-#endif //!defined DD360 && !defined DD360Audi
+#endif //!defined DD360Tcci && !defined DD360Audi
 
                     if (pDcChargingInfo->SystemStatus == S_IDLE ||
                             pDcChargingInfo->SystemStatus == S_RESERVATION ||

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

@@ -15,11 +15,11 @@
 //address
 #define ADDR_AUX                                (0x01)
 #define ADDR_FAN                                (0x02)
-#if defined DD360 || defined DD360Audi || defined DD360ComBox
+#if defined DD360Tcci || defined DD360Audi || defined DD360ComBox
 #define ADDR_RELAY                              (0x09)
 #else
 #define ADDR_RELAY                              (0x03)
-#endif //defined DD360 || defined DD360Audi || defined DD360ComBox
+#endif //defined DD360Tcci || defined DD360Audi || defined DD360ComBox
 #define ADDR_AC_PLUG                            (0x05)
 #define ADDR_LED                                (0x06)
 #define ADDR_BROADCAST                          (0xFF)

+ 415 - 0
EVSE/Projects/DD360Tcci/Apps/ModuleLcmCtrl/Lcm_Update.c

@@ -0,0 +1,415 @@
+/*
+ * Lcm_Update.c
+ *
+ *  Created on: 2022年1月3日
+ *      Author: 8513
+ */
+#include <stdio.h>      /*標準輸入輸出定義*/
+#include <stdlib.h>     /*標準函數庫定義*/
+#include <stdint.h>
+#include <string.h>
+#include <unistd.h>
+#include <termios.h>
+#include <fcntl.h>
+#include <time.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/ioctl.h>
+#include <sys/timeb.h>
+#include <dirent.h>
+#include "cbmp.h"
+
+#include "Module_LcmControl.h"
+#include "../Log/log.h"
+#include "../ShareMemory/shmMem.h"
+#include "../Define/define.h"
+#include "../Config.h"
+#include "../SelectGun/SelectGun.h"
+#include "../CSU/main.h"
+
+DcCommonInfo *ShmDcCommonData = NULL;
+int _port;
+void displayMessageDgus(uint8_t *data, uint16_t len, uint8_t isRX)
+{
+    uint8_t output[8192];
+
+    memset(output, 0x00, ARRAY_SIZE(output));
+    sprintf((char*)output, "%s", (isRX?"RX: ":"TX: "));
+    for(uint16_t idx = 0;idx<len;idx++)
+    {
+        sprintf((char*)output, "%s%02x ", output, data[idx]);
+    }
+
+    #ifdef isDebugPrint
+    log_info("%s\n", output);
+    #endif
+}
+int transceiverDgus(int32_t fd, uint8_t *tx, uint16_t tx_len, uint8_t *rx, uint16_t rx_len)
+{
+    int result = FAIL;
+    int len;
+
+    tcflush(fd,TCIOFLUSH);
+
+    #ifdef isDebugPrint
+    displayMessageDgus(tx, tx_len, NO);
+    #endif
+
+    usleep(10000);
+
+    if(write(fd, tx, tx_len) >= ARRAY_SIZE(tx))
+    {
+        if(tx[3] == CMD_REG_WRITE_DATA)
+        {
+            len = read(fd, rx, rx_len);
+            if(len > 0)
+            {
+                if((rx[0] == CMD_HEADER_1) && (rx[1] == CMD_HEADER_2))
+                {
+                    if((rx[3] == CMD_REG_WRITE_DATA) && (rx[4] == 0x4f) && (rx[5] == 0x4b))
+                    {
+                        displayMessageDgus(rx, len, YES);
+                        result = PASS;
+                    }
+                }
+            }
+        }
+        else if(tx[3] == CMD_REG_READ_DATA)
+        {
+            len = read(fd, rx, rx_len);
+            if(len > 0)
+            {
+                if((rx[0] == CMD_HEADER_1) && (rx[1] == CMD_HEADER_2))
+                {
+                    if(rx[3] == CMD_REG_READ_DATA)
+                    {
+
+                        displayMessageDgus(rx, len, YES);
+
+                        result = PASS;
+                    }
+                    else
+                    {}
+                }
+                else
+                {}
+            }
+            else
+            {}
+        }
+        else
+        {}
+    }
+    else
+    {}
+
+    return result;
+}
+
+int8_t lcdRegisterWrite(int32_t fd, uint8_t regType, uint16_t address, uint8_t *data, uint16_t dataLen)
+{
+    int8_t result = FAIL;
+    uint8_t tx[(regType == REG_TYPE_CONTROL? 8 : 6) + dataLen];
+    uint8_t rx[6];
+
+    memset(tx, 0x00, sizeof(tx));
+    memset(rx, 0x00, sizeof(rx));
+
+    tx[0] = CMD_HEADER_1;
+    tx[1] = CMD_HEADER_2;
+    tx[2] = (regType == REG_TYPE_CONTROL? 7 : (3 + dataLen));
+    tx[3] = CMD_REG_WRITE_DATA;
+    tx[4] = (address >> 8) & 0xff;
+    tx[5] = (address >> 0) & 0xff;
+
+    if(regType == REG_TYPE_CONTROL)
+    {
+        if(address == REG_ADDRESS_SET_PAGE_ID)
+        {
+            tx[6] = 0x5A;
+            tx[7] = 0x01;
+
+            memcpy(&tx[8], data, dataLen);
+        }
+    }
+    else
+    {
+        memcpy(&tx[6], data, dataLen);
+    }
+
+    if(fd > 0)
+    {
+        if(transceiverDgus(fd, tx, ARRAY_SIZE(tx), rx, ARRAY_SIZE(rx)) == PASS)
+        {
+            result = PASS;
+        }
+        else
+        {}
+    }
+    else
+    {}
+
+    return result;
+}
+//=======================================
+// LCD upgrade
+//=======================================
+int downloadBMP(uint8_t picIdx, char *filename)
+{
+    int result = PASS;
+    BMP *bmp;
+    struct stat fileSt;
+    uint32_t pageSize = 0xf0;
+    uint32_t pixelSize;
+    uint32_t transferedByte=0;
+    uint16_t bufferRamAddr = 0x8000;
+    uint32_t dataLen = 0;
+    uint32_t startAddr=0;
+
+    // Reset LCD
+    ResetLCM();
+
+    // Get image file size
+    stat(filename, &fileSt);
+    bmp = bopen(filename);
+    uint8_t buf[bmp->width*bmp->height*2];
+
+    log_info("Target address: %d\n", picIdx);
+    log_info("Image filename: %s\n", filename);
+    log_info("Image width: %d height: %d\n", bmp->width, bmp->height);
+    log_info("Image data size: %d\n", ARRAY_SIZE(buf));
+
+    // Get bmp pixel data and convert to 16 bit color
+    for(uint16_t idxY=0 ; idxY<bmp->height ; idxY++)
+    {
+        for(uint16_t idxX=0 ; idxX<bmp->width ; idxX++)
+        {
+            uint8_t r, g, b;
+            get_pixel_rgb(bmp, idxX, (bmp->height-idxY-1), &r, &g, &b);
+            buf[(2*((idxY*bmp->width) + idxX)) + 0] = ((((r>>3)<<11) | ((g>>2)<<5) | (b>>3)) >> 8) & 0xff;
+            buf[(2*((idxY*bmp->width) + idxX)) + 1] = ((((r>>3)<<11) | ((g>>2)<<5) | (b>>3)) >> 0) & 0xff;
+        }
+    }
+    bclose(bmp);
+
+    // Transfer pixel to screen page
+    pixelSize = ARRAY_SIZE(buf);
+    for(uint16_t idxSrcData=0;idxSrcData<(((pixelSize%pageSize)==0)?(pixelSize/pageSize):(pixelSize/pageSize)+1);idxSrcData++)
+    {
+        //log_info("Buffer start data address: 0x%08X\n", (idxSrcData*pageSize));
+        //log_info("  Image start ram address: 0x%08X\n", ((idxSrcData*pageSize) >> 1));
+        uint8_t display_cmd[] ={0x5a, (bufferRamAddr>>8)&0xff, (bufferRamAddr>>0)&0xff, 0x00, 0x00, 0x00, 0x00, 0x00};
+
+        if((idxSrcData+1) != (((pixelSize%pageSize)==0)?(pixelSize/pageSize):(pixelSize/pageSize)+1))
+        {
+            // Data transfer
+            while(lcdRegisterWrite(_port, REG_TYPE_RAM, (bufferRamAddr+(dataLen>>1)), &buf[(idxSrcData*pageSize)], pageSize) != PASS)
+            {
+                log_info("Transfer data to ram 0x%04X fail.\n", transferedByte);
+            }
+            transferedByte += pageSize;
+            dataLen += pageSize;
+        }
+        else
+        {
+            // Last data transfer
+            while(lcdRegisterWrite(_port, REG_TYPE_RAM, (bufferRamAddr+(dataLen>>1)), &buf[(idxSrcData*pageSize)], (pixelSize-(idxSrcData*pageSize))) != PASS)
+            {
+                log_info("Transfer data to ram 0x%04X fail.\n", transferedByte);
+            }
+            transferedByte += (pixelSize-(idxSrcData*pageSize));
+            dataLen += (pixelSize-(idxSrcData*pageSize));
+        }
+
+        // Move data from ram to flash
+        if((dataLen >= (pageSize*10)) || (idxSrcData == (((pixelSize%pageSize)==0)?(pixelSize/pageSize):(pixelSize/pageSize)+1)-1))
+        {
+            display_cmd[3] = ((dataLen>>1) >> 8) & 0xff;                            // Data length high byte
+            display_cmd[4] = ((dataLen>>1) >> 0) & 0xff;                            // Data length low byte
+            display_cmd[5] = (((startAddr)>>1) >> 16) & 0xff;               // Screen on ram address 1st byte
+            display_cmd[6] = (((startAddr)>>1) >> 8) & 0xff;                // Screen on ram address 2nd byte
+            display_cmd[7] = (((startAddr)>>1) >> 0) & 0xff;                // Screen on ram address 3th byte
+
+            while(lcdRegisterWrite(_port, REG_TYPE_RAM, 0xa2, display_cmd, ARRAY_SIZE(display_cmd)) != PASS)
+            {
+                log_info("Write data to display buffer 0x%04X fail.\n", transferedByte);
+            }
+            startAddr += dataLen;
+            dataLen = 0;
+        }
+    }
+
+    // Save image to target address
+    uint8_t save_cmd[] ={0x5a, 0x02, ((picIdx>>8)&0xff), (picIdx&0xff)};
+    while(lcdRegisterWrite(_port, REG_TYPE_RAM, 0x84, save_cmd, ARRAY_SIZE(save_cmd)) != PASS)
+    {
+        log_info("Save image fail.\n");
+    }
+    log_info("Save image success.\n");
+    sleep(1);
+
+    return result;
+}
+
+int downloadBIN(uint8_t targetAddr, char *filename)
+{
+    int result = PASS;
+    int fd;
+    struct stat fileSt;
+    uint32_t pageSize = 128;
+    uint32_t blocklSize = 32768;
+    uint32_t transferedByte=0;
+    uint16_t bufferRamAddr = 0x8000;
+
+    // Reset LCD
+    ResetLCM();
+
+    // Get image file size
+    stat(filename, &fileSt);
+    if(S_ISDIR(fileSt.st_mode))
+    {
+        return FAIL;
+    }
+    uint8_t buf[(fileSt.st_size%32768==0?(fileSt.st_size/32768)*32768:(fileSt.st_size/32768)+1)*32768];
+
+    log_info("Target address: %d\n", targetAddr);
+    log_info("Bin filename: %s\n", filename);
+    log_info("Bin data size: %ld\n", fileSt.st_size);
+
+    fd = open(filename, O_RDWR);
+    if (fd < 0)
+    {
+        log_info("Bin can not be open.\n");
+        result = FAIL;
+    }
+    else
+    {
+        // Read data from bin file
+        memset(buf, 0x00, ARRAY_SIZE(buf));
+        read(fd, buf, ARRAY_SIZE(buf));
+        close(fd);
+
+        for(uint8_t idxBinSrc=0;idxBinSrc<(fileSt.st_size%32768==0?fileSt.st_size/32768:(fileSt.st_size/32768)+1);idxBinSrc++)
+        {
+            // Transfer data to ram
+            for(uint16_t idxSrcData=0;idxSrcData<(((blocklSize%pageSize)==0)?(blocklSize/pageSize):(blocklSize/pageSize)+1);idxSrcData++)
+            {
+                //log_info("Buffer start data address: 0x%08X\n", (idxBinSrc*blocklSize)+(idxSrcData*pageSize));
+                //log_info("  Image start ram address: 0x%08X\n", ((idxSrcData*pageSize) >> 1));
+                if((idxSrcData+1) != (((blocklSize%pageSize)==0)?(blocklSize/pageSize):(blocklSize/pageSize)+1))
+                {
+                    // Data transfer
+                    while(lcdRegisterWrite(_port, REG_TYPE_RAM, bufferRamAddr+((idxSrcData*pageSize)>>1), &buf[(idxBinSrc*blocklSize)+(idxSrcData*pageSize)], pageSize) != PASS)
+                    {
+                        log_info("Transfer data to ram 0x%04X fail.\n", transferedByte);
+                    }
+                    transferedByte += pageSize;
+                }
+                else
+                {
+                    // Last data transfer
+                    while(lcdRegisterWrite(_port, REG_TYPE_RAM, bufferRamAddr+((idxSrcData*pageSize)>>1), &buf[(idxBinSrc*blocklSize)+(idxSrcData*pageSize)], (blocklSize-(idxSrcData*pageSize)))!= PASS)
+                    {
+                        log_info("Transfer data to ram 0x%04X fail.\n", transferedByte);
+                    }
+                    transferedByte += (blocklSize-(idxSrcData*pageSize));
+                }
+            }
+
+            // Move data from ram to flash
+            uint8_t save_cmd[] ={0x5a, 0x02, ((((targetAddr*8)+idxBinSrc)>>8)&0xff), ((((targetAddr*8)+idxBinSrc)>>0)&0xff), ((bufferRamAddr>>8)&0xff), ((bufferRamAddr>>0)&0xff), 0x00, 0x01, 0x00, 0x00, 0x00, 0x00};
+            while(lcdRegisterWrite(_port, REG_TYPE_RAM, 0xaa, save_cmd, ARRAY_SIZE(save_cmd)) != PASS)
+            {
+                log_info("Save bin file to 0x%04X fail.\n", ((targetAddr*8)+idxBinSrc));
+            }
+            //log_info("Save bin file on 0x%04X success.\n", ((targetAddr*8)+idxBinSrc));
+            sleep(1);
+        }
+    }
+
+    return result;
+}
+uint8_t lcdUpgrade(char *forlder)
+{
+    int result = _LCM_UPGRADE_RESULT_PASS;
+    DIR *dir;
+    struct dirent *file;
+    struct stat fileSt;
+
+    log_info("forlder = %s \n", forlder);
+    if ((dir = opendir (forlder)) != NULL)
+    {
+        /* print all the files and directories within directory */
+        while ((file = readdir (dir)) != NULL)
+        {
+            //log_error("file->d_name = %s \n", file->d_name);
+            if((strlen(file->d_name) > 2) && (file->d_type == DT_REG))
+            {
+                int targetAddr;
+                stat(file->d_name, &fileSt);
+
+                if(sscanf(file->d_name, "%d", &targetAddr) == 1)
+                {
+                    char targetFile[384];
+
+                    sprintf(targetFile, "/mnt/lcd/DWIN_SET/%s", file->d_name);
+                    log_info("targetFile = %s \n", targetFile);
+                    if(strstr(file->d_name, ".bmp") != NULL)
+                    {
+                        downloadBMP(targetAddr, targetFile);
+                    }
+                    else
+                    {
+                        downloadBIN(targetAddr, targetFile);
+                    }
+                }
+                else
+                {
+                    log_error("%s can not parse target address.\n", file->d_name);
+                }
+            }
+            else
+            {
+                if(strlen(file->d_name) >= 3)
+                {
+                    log_error("File name error.\n");
+                    result = _LCM_UPGRADE_RESULT_FAIL;
+                }
+                else
+                {
+                    log_error("Searching file.\n");
+                }
+            }
+            sleep(1);
+        }
+        closedir (dir);
+    }
+    else
+    {
+        log_error("%s does not valid.\n", forlder);
+        result = _LCM_UPGRADE_RESULT_FAIL;
+    }
+
+    return result;
+}
+void ResetLCM()
+{
+    uint8_t cmd_reset [] = { 0x55, 0xaa, 0x5a, 0xa5 };
+    while (lcdRegisterWrite ( _port, REG_TYPE_RAM, 0x04, cmd_reset, ARRAY_SIZE( cmd_reset ) ) != PASS)
+    {
+        log_error( "LCD reset fail.\n" );
+    }
+    sleep ( 1 );
+}
+void UpdateLcmFunction(DcCommonInfo *ShmDcCommonData,int _lcmport)
+{
+    _port = _lcmport;
+    if(ShmDcCommonData->_upgrade_lcm_flag)
+    {
+        log_info("Update LCM Start");
+        // 固定路徑 /mnt/lcd/DWIN_SET
+        ShmDcCommonData->_upgrade_lcm_result = lcdUpgrade("/mnt/lcd/DWIN_SET");
+        ResetLCM();
+        ShmDcCommonData->_upgrade_lcm_flag = NO;
+    }
+}

+ 93 - 8
EVSE/Projects/DD360Tcci/Apps/ModuleLcmCtrl/Module_LcmControl.c

@@ -19,7 +19,7 @@
 #include "../Define/define.h"
 #include "../Config.h"
 #include "../SelectGun/SelectGun.h"
-
+#include "../CSU/main.h"
 DcCommonInfo *ShmDcCommonData = NULL; 
 //------------------------------------------------------------------------------
 //struct SysConfigAndInfo         *ShmSysConfigAndInfo;
@@ -221,7 +221,7 @@ uint8_t _logo_cmp               = 62;
 uint8_t _battery_eng_trp_map    = 63;
 uint8_t _money_trp_map          = 64;
 uint8_t _elapse_time_trp_map    = 65;
-
+#if defined DD360Audi
 ////For Audi
 uint8_t _left_gun_disable_map   = 66;
 uint8_t _left_gun_enable_map    = 67;
@@ -238,6 +238,7 @@ uint8_t _showfulltarget_1       = 73;
 uint8_t _showfulltarget_2       = 74;
 uint8_t _showReplugStr_1        = 75;
 uint8_t _showReplugStr_2        = 76;
+
 // Select Gun for Audi
 short __show_selectgun_value    = 0x0464;
 uint8_t _showselectgun_left     = 77;
@@ -247,6 +248,19 @@ short __show_waitgunplug_value    = 0x0468;
 uint8_t _showwaitgunplug_left     = 80;
 uint8_t _showwaitgunplug_right    = 81;
 
+
+#elif defined DD360Tcci
+short __show_handshark_value    = 0x1464;
+short __show_GFD_value          = 0x1466;
+short __show_precharge_value    = 0x1468;
+
+uint8_t _show_handshark_dark    = 67;
+uint8_t _show_handshark_light   = 68;
+uint8_t _show_GFD_dark          = 69;
+uint8_t _show_GFD_light         = 70;
+uint8_t _show_precharge_dark    = 71;
+uint8_t _show_precharge_light   = 72;
+#endif
 //#define log_info(format, args...) StoreLogMsg("[%s:%d][%s][Info] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
 //#define log_warn(format, args...) StoreLogMsg("[%s:%d][%s][Warn] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
 //#define log_error(format, args...) StoreLogMsg("[%s:%d][%s][Error] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
@@ -362,6 +376,14 @@ int InitShareMemory()
     return result;
 }
 #endif //0
+unsigned long GetPreChargeTimeoutValue(struct timeval _sour_time)
+{
+    struct timeval _end_time;
+    gettimeofday(&_end_time, NULL);
+
+    return 1000000 * (_end_time.tv_sec - _sour_time.tv_sec) + _end_time.tv_usec - _sour_time.tv_usec;
+}
+
 void displayMessageDgus(uint8_t *data, uint16_t len, uint8_t isRX)
 {
 	uint8_t output[8192];
@@ -377,6 +399,18 @@ void displayMessageDgus(uint8_t *data, uint16_t len, uint8_t isRX)
 	log_info("%s\n", output);
 	#endif
 }
+
+void ChangeTimeValue(uint8_t time)
+{
+    uint8_t cmd[2];
+    uint8_t value[2];
+
+    memset(cmd, 0x00, sizeof(cmd));
+    sprintf((char *) value, "%d", time);
+    string2ByteArray(value, cmd);
+    DisplayValueToLcm(0x1290, cmd, sizeof(cmd));
+}
+
 int transceiverDgus(int32_t fd, uint8_t *tx, uint16_t tx_len, uint8_t *rx, uint16_t rx_len)
 {
 	int result = FAIL;
@@ -830,7 +864,7 @@ void ChangeWarningFunc()
     // 最多一次五筆
     //log_info("LCM PageIndex = %d ", pSysWarning->PageIndex);
     //log_info("WarningCount = %d ", pSysWarning->WarningCount);
-//#if !defined DD360 && !defined DD360Audi && !defined DD360ComBox
+//#if !defined DD360Tcci && !defined DD360Audi && !defined DD360ComBox
     for (i = 0; (i + pSysWarning->PageIndex * 5) < pSysWarning->WarningCount; i++) {
         memset(cmd, 0x00, sizeof(cmd));
         if ((i) >= 5) {
@@ -895,7 +929,7 @@ void ChangeWarningFunc()
             DisplayValueToLcm(0x0002 + ((i) * 2), cmd, 2);
         }
 
-    #endif //!defined DD360 && !defined DD360Audi
+    #endif //!defined DD360Tcci && !defined DD360Audi
     */
 }
 
@@ -1150,7 +1184,7 @@ void GetTimespecFunc(struct timespec *time)
 {
     clock_gettime(CLOCK_MONOTONIC_COARSE, time);
 }
-
+#if defined DD360Audi
 void RunReplugStringFunction(bool isRun)
 {
     if (isRun) {
@@ -1169,6 +1203,7 @@ void RunReplugStringFunction(bool isRun)
         ChangeDisplay2Value(__show_StatusString_value_2, _disappear);
     }
 }
+
 void RunFullTargetFunction(bool isRun)
 {
     if (isRun) {
@@ -1188,7 +1223,7 @@ void RunFullTargetFunction(bool isRun)
         ChangeDisplay2Value(__show_StatusString_value_2, _disappear);
     }
 }
-
+#endif
 /**
  * [ChangeBalanceValue :print balance information]
  * @Author
@@ -1468,7 +1503,7 @@ void RefreshPageAnimation(uint8_t value)
 void RefreshConnStatus()
 {
     // Wifi priority is higher than Ethernet
-#if defined DD360 ||defined DD360Audi || defined DD360ComBox
+#if defined DD360Tcci ||defined DD360Audi || defined DD360ComBox
     uint8_t i = 0;
     uint8_t ethstatus = 0;
 
@@ -1700,7 +1735,7 @@ void RefreshConnStatus()
         ChangeDisplay2Value(__conn_status, _disconnect);
     }
     */
-#endif //defined DD360 || defined DD360Audi
+#endif //defined DD360Tcci || defined DD360Audi
 }
 
 uint8_t FirstPageChanged()
@@ -2150,6 +2185,7 @@ void ProcessPageInfo()
     case _LCM_COMPLETE: {
         bool isShowAc = false;
         uint8_t gunTargetIndex = 0;
+
 		if (_totalCount >= 2 )
 			ChangeDisplay2Value(__sel_gun_btn, _sel_gun_btn);
         if (acgunCount > 0) {
@@ -2311,6 +2347,55 @@ void ProcessPageInfo()
             if (_currentPage == _LCM_PRE_CHARGE && !isShowAc) {
                 if (pSysInfo->CurGunSelected == i) {
                     ChangeBattMapAndValue(_currentPage, pDcChargingInfo->EvBatterySoc);
+                    uint8_t precharg_time = (GetPreChargeTimeoutValue(pDcChargingInfo->PreChargeTimer)/1) / uSEC_VAL;
+                    if (precharg_time > PRECHARGING_TTIMEOUT)
+                        precharg_time = PRECHARGING_TTIMEOUT;
+                    ChangeTimeValue(PRECHARGING_TTIMEOUT- precharg_time);
+
+                    if (pDcChargingInfo->SystemStatus >= S_REASSIGN_CHECK &&
+                            pDcChargingInfo->SystemStatus <= S_PREPARING_FOR_EV) {
+                        ChangeDisplay2Value(__show_handshark_value, _show_handshark_light);
+                        ChangeDisplay2Value(__show_GFD_value, _show_GFD_dark);
+                        ChangeDisplay2Value(__show_precharge_value, _show_precharge_dark);
+                    } else if (pDcChargingInfo->SystemStatus == S_PREPARING_FOR_EVSE) {
+                        // Detect GFD finish and into precharge mode
+                        if (pDcChargingInfo->Type == _Type_Chademo || pDcChargingInfo->Type == _Type_GB) {
+                            if (pDcChargingInfo->_SaftyDetect == false ) {
+                                ChangeDisplay2Value(__show_handshark_value, _show_handshark_dark);
+                                ChangeDisplay2Value(__show_GFD_value, _show_GFD_light);
+                                ChangeDisplay2Value(__show_precharge_value, _show_precharge_dark);
+                                if (pDcChargingInfo->EvBatterytargetVoltage == 0)
+                                    pDcChargingInfo->_SaftyDetect = true;
+                            } else {
+                                ChangeDisplay2Value(__show_handshark_value, _show_handshark_dark);
+                                ChangeDisplay2Value(__show_GFD_value, _show_GFD_dark);
+                                ChangeDisplay2Value(__show_precharge_value, _show_precharge_light);
+                            }
+                        } else {
+                            ChangeDisplay2Value(__show_handshark_value, _show_handshark_dark);
+                            ChangeDisplay2Value(__show_GFD_value, _show_GFD_light);
+                            ChangeDisplay2Value(__show_precharge_value, _show_precharge_dark);
+                        }
+                    } else if (pDcChargingInfo->SystemStatus == S_CCS_PRECHARGE_ST0 ||
+                            pDcChargingInfo->SystemStatus == S_CCS_PRECHARGE_ST1) {
+                        if (pDcChargingInfo->_SaftyDetect == false ) {
+                            ChangeDisplay2Value(__show_handshark_value, _show_handshark_dark);
+                            ChangeDisplay2Value(__show_GFD_value, _show_GFD_light);
+                            ChangeDisplay2Value(__show_precharge_value, _show_precharge_dark);
+                            if (pDcChargingInfo->EvBatterytargetVoltage == 0)
+                                pDcChargingInfo->_SaftyDetect = true;
+                        } else {
+                            ChangeDisplay2Value(__show_handshark_value, _show_handshark_dark);
+                            ChangeDisplay2Value(__show_GFD_value, _show_GFD_dark);
+                            ChangeDisplay2Value(__show_precharge_value, _show_precharge_light);
+                        }
+                    } else {
+                        ChangeDisplay2Value(__show_handshark_value, _disappear);
+                        ChangeDisplay2Value(__show_GFD_value, _disappear);
+                        ChangeDisplay2Value(__show_precharge_value, _disappear);
+                    }
+
+
                 }
             } else if (_currentPage == _LCM_CHARGING && !isShowAc) {
                 if (pSysInfo->CurGunSelected == i) {

+ 0 - 2393
EVSE/Projects/DD360Tcci/Apps/ModuleLcmCtrl/Module_LcmControl.c.Ph

@@ -1,2393 +0,0 @@
-#include <stdio.h>      /*標準輸入輸出定義*/
-#include <stdlib.h>     /*標準函數庫定義*/
-#include <stdint.h>
-#include <string.h>
-#include <unistd.h>
-#include <termios.h>
-#include <fcntl.h>
-#include <time.h>
-
-#include <sys/ioctl.h>
-#include <sys/timeb.h>
-
-#include "Module_LcmControl.h"
-#include "../Log/log.h"
-#include "../ShareMemory/shmMem.h"
-#include "../Define/define.h"
-#include "../Config.h"
-#include "../SelectGun/SelectGun.h"
-
-//------------------------------------------------------------------------------
-//struct SysConfigAndInfo         *ShmSysConfigAndInfo;
-//struct StatusCodeData           *ShmStatusCodeData;
-static struct SysConfigData *pSysConfig = NULL;
-static struct SysInfoData *pSysInfo = NULL;
-static struct WARNING_CODE_INFO *pSysWarning = NULL;
-
-static struct FanModuleData *ShmFanModuleData;
-static struct PrimaryMcuData *ShmPrimaryMcuData;
-static SelectGunInfo *ShmSelectGunInfo = NULL;
-static struct ChargingInfoData *pDcChargingInfo = NULL;
-static struct ChargingInfoData *pAcChargingInfo = NULL;
-
-bool needReloadQr = true;
-
-bool _isShow = false; //DS60-120 add
-uint8_t _showInformIndex = 0; //DS60-120 add
-
-int _port;
-//char* pPortName         = "/dev/ttyO2";
-char *pPortName           = "/dev/ttyS3";
-char *moduleName          = "DMT80480T070_09WT";
-uint8_t _totalCount;
-uint8_t acgunCount;
-//struct ChargingInfoData *_chargingInfoData[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
-//struct ChargingInfoData *ac_chargingInfo[AC_QUANTITY];
-
-uint8_t ac_ani_battery_level    = _BATTERY_LEVEL_FOR_MAP_LV5;
-uint8_t isDiffStatus            = false;
-uint8_t isChangeBattMap         = false;
-// 當前選擇的槍號
-#if defined DD360Audi
-short _currentPage              = _LCM_SELECT_GUN;
-short _oldPage                  = _LCM_SELECT_GUN;
-#else
-short _currentPage              = _LCM_NONE;
-short _oldPage                  = _LCM_NONE;
-#endif //defined DD360Audi
-uint8_t _gunIndex               = 0;
-bool _wifi_conn_status          = false;
-bool _battery_display_ani       = false;
-uint8_t _curPage_index          = 0;
-bool _page_reload               = false;
-
-// LCM - HW
-uint8_t _everyPageRollChange    = 0;
-short __conn_status             = 0x0030;
-short __ethernet_status         = 0x0032;
-short __3G4G_status             = 0x0036;
-short __3G4G_status1            = 0x0037;
-short __3G4G_move_status        = 0x0038;
-short __wifi_status             = 0x003C;
-
-short __sel_gun_btn             = 0x0040;
-short __ret_home_btn            = 0x0042;
-short __stop_method_btn         = 0x0044;
-
-short __qr_code                 = 0x0250;
-short __main_rfid               = 0x0052;
-short __main_qr                 = 0x0054;
-short __main_app                = 0x0056;
-
-short __plug_in_arrow           = 0x0060;
-
-short __conn_line               = 0x0066;
-
-short __gun_type_index          = 0x0070;
-short __cmp_gun_type_index      = 0x0080; ////For Audi
-short __batt_map_empty          = 0x0090; ////For Audi
-short __qr_code_pre             = 0x0280;
-
-short __side_top                = 0x0090;
-short __side_down               = 0x0092;
-short __side_mid                = 0x0094;
-
-short __conn_line_chag          = 0x0096;
-short __batt_map                = 0x0100;
-short __soc_value_charging      = 0x0102;
-short __remain_time_map         = 0x0106;
-short __power_map               = 0x0108;
-short __energy_map              = 0x010A;
-short __remain_time_tx          = 0x0110;
-
-short __trp_remain_time_map     = 0x0116;
-short __trp_power_map           = 0x0118;
-short __trp_energy_map          = 0x011A;
-
-short __output_eng_tx           = 0x0120;
-short __total_out_eng_tx        = 0x0130;
-short __conn_line_comp          = 0x0140;
-short __charging_fee_map        = 0x0146;
-short __charging_fee_tx         = 0x0150;
-
-short __money_by_rate           = 0x0200;
-short __money_rate              = 0x0220;
-short __money_rate_map          = 0x0230;
-
-//DS60-120 add
-short __csu_ver_string          = 0x0300;
-short __csu_ver_value           = 0x0310;
-short __fan_speed_string        = 0x0390;
-short __fan_speed_value         = 0x0400;
-
-short __dc1_ver_string          = 0x0320;
-short __dc1_ver_value           = 0x0330;
-short __dc2_ver_string          = 0x0340;
-short __dc2_ver_value           = 0x0350;
-short __eth0_ip_string          = 0x0360;
-short __eth0_ip_value           = 0x0370;
-short __sn_string               = 0x0410;
-short __sn_value                = 0x0420;
-
-//For Audi, for select gun
-short __left_gun_map            = 0x0260;
-short __right_gun_map           = 0x0262;
-short __add_chk_btn             = 0x0264;
-//short __station_id            = 0x0270;
-short __balance                 = 0x0270;
-short __remain_balance          = 0x0280;
-short __custStationIdL1         = 0x0450;
-//short __custStationIdL2       = 0x0470;
-short _emergency_map            = 0x011C;
-
-// ICON ID
-uint8_t _disappear              = 0;
-uint8_t _disconnect             = 1;
-uint8_t _connect                = 2;
-uint8_t _warning                = 3;
-uint8_t _arrow_dark             = 4;
-uint8_t _arrow_light            = 5;
-uint8_t _3G4G_disconnect        = 6;
-uint8_t __3G4G_connect          = 7;
-uint8_t _wifi_disconnect        = 8;
-uint8_t _wifi_connect           = 9;
-uint8_t _logo                   = 10;
-uint8_t _conn_map1              = 11;
-uint8_t _conn_map2              = 12;
-uint8_t _sel_gun_btn            = 13;
-uint8_t _back_home_btn          = 14;
-uint8_t _stop_charging_btn      = 15;
-uint8_t _stop_charging_btn_scan = 16;
-uint8_t _chademo_dark           = 17;
-uint8_t _ccs_dark               = 18;
-uint8_t _gbt_dark               = 19;
-uint8_t _actype_dark            = 20;
-uint8_t _chademo_light          = 21;
-uint8_t _ccs_light              = 22;
-uint8_t _gbt_light              = 23;
-uint8_t _actype_light           = 24;
-uint8_t _main_none_rfid         = 25;
-uint8_t _main_rfid              = 26;
-uint8_t _main_none_app          = 27;
-uint8_t _main_app               = 28;
-uint8_t _main_none_qr           = 29;
-uint8_t _main_qr                = 30;
-uint8_t _charging_map1          = 31;
-uint8_t _charging_map2          = 32;
-uint8_t _battery_empty          = 33;
-uint8_t _battery_cap_20         = 34;
-uint8_t _battery_cap_40         = 35;
-uint8_t _battery_cap_60         = 36;
-uint8_t _battery_cap_80         = 37;
-uint8_t _battery_cap_100        = 38;
-uint8_t _battery_map            = 39;
-uint8_t _power_map              = 40;
-uint8_t _time_map               = 41;
-uint8_t _complete_map           = 42;
-uint8_t _battery_soc_20         = 43;
-uint8_t _battery_soc_40         = 44;
-uint8_t _battery_soc_60         = 45;
-uint8_t _battery_soc_80         = 46;
-uint8_t _battery_soc_100        = 47;
-uint8_t _battery_eng_map        = 48;
-uint8_t _money_map              = 49;
-uint8_t _elapse_time_map        = 50;
-uint8_t _charging_money         = 51;
-//uint8_t _side_none_rfid       = 52;
-//uint8_t _side_rfid            = 53;
-//uint8_t _side_none_app        = 54;
-//uint8_t _side_app             = 55;
-//uint8_t _side_none_qr         = 56;
-//uint8_t _side_qr              = 57;
-uint8_t _eth_disconnect         = 52; //58;
-uint8_t _eth_connect            = 53; //59;
-
-uint8_t _chademo_dark_cmp       = 54;
-uint8_t _ccs_dark_cmp           = 55;
-uint8_t _gbt_dark_cmp           = 56;
-uint8_t _actype_dark_cmp        = 57;
-uint8_t _chademo_light_cmp      = 58;
-uint8_t _ccs_light_cmp          = 59;
-uint8_t _gbt_light_cmp          = 60;
-uint8_t _actype_light_cmp       = 61;
-
-uint8_t _logo_cmp               = 62;
-uint8_t _battery_eng_trp_map    = 63;
-uint8_t _money_trp_map          = 64;
-uint8_t _elapse_time_trp_map    = 65;
-
-////For Audi
-uint8_t _left_gun_disable_map   = 66;
-uint8_t _left_gun_enable_map    = 67;
-uint8_t _right_gun_disable_map  = 68;
-uint8_t _right_gun_enable_map   = 69;
-uint8_t _select_gun_btn         = 70;
-uint8_t _emergency_disable_map  = 72;
-// For replug
-struct timespec showReplugStrTimer;
-struct timespec showFullTargetTimer;
-short __show_StatusString_value_1 = 0x0460;
-short __show_StatusString_value_2 = 0x0462;
-uint8_t _showfulltarget_1       = 73;
-uint8_t _showfulltarget_2       = 74;
-uint8_t _showReplugStr_1        = 75;
-uint8_t _showReplugStr_2        = 76;
-// Select Gun for Audi
-short __show_selectgun_value    = 0x0464;
-uint8_t _showselectgun_left     = 77;
-uint8_t _showselectgun_right    = 78;
-// Wait for gun plugin Audi
-short __show_waitgunplug_value    = 0x0468;
-uint8_t _showwaitgunplug_left     = 80;
-uint8_t _showwaitgunplug_right    = 81;
-
-//#define log_info(format, args...) StoreLogMsg("[%s:%d][%s][Info] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
-//#define log_warn(format, args...) StoreLogMsg("[%s:%d][%s][Warn] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
-//#define log_error(format, args...) StoreLogMsg("[%s:%d][%s][Error] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
-
-//=================================
-// Common routine
-//=================================
-/*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;
-}
-
-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;
-}
-*/
-
-#if 0
-//==========================================
-// Init all share memory
-//==========================================
-int InitShareMemory()
-{
-    int result = PASS;
-    int MeterSMId;
-
-    //creat ShmSysConfigAndInfo
-    if ((MeterSMId = shmget(ShmSysConfigAndInfoKey, sizeof(struct SysConfigAndInfo),  0777)) < 0) {
-#ifdef SystemLogMessage
-        log_error("shmget ShmSysConfigAndInfo NG");
-#endif
-        result = FAIL;
-    } else if ((ShmSysConfigAndInfo = shmat(MeterSMId, NULL, 0)) == (void *) - 1) {
-#ifdef SystemLogMessage
-        log_error("shmat ShmSysConfigAndInfo NG");
-#endif
-        result = FAIL;
-    } else
-    {}
-
-    //creat ShmStatusCodeData
-    if ((MeterSMId = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData),  0777)) < 0) {
-#ifdef SystemLogMessage
-        log_error("shmget ShmStatusCodeData NG");
-#endif
-        result = FAIL;
-    } else if ((ShmStatusCodeData = shmat(MeterSMId, NULL, 0)) == (void *) - 1) {
-#ifdef SystemLogMessage
-        log_error("shmat ShmStatusCodeData NG");
-#endif
-        result = FAIL;
-    } else
-    {}
-
-    //creat Audi customization info
-    if ((MeterSMId = shmget(ShmSelectGunInfoKey, sizeof(SelectGunInfo), IPC_CREAT | 0777)) < 0) {
-        log_error("[main]CreatShareMemory:shmget select gun info NG ");
-        return 0;
-    } else if ((ShmSelectGunInfo = shmat(MeterSMId, NULL, 0)) == (void *) - 1) {
-        log_error("[main]CreatShareMemory:shmat shmget select gun info ");
-        return 0;
-    }
-
-    //creat ShmStatusCodeData
-    if ((MeterSMId = shmget(ShmPrimaryMcuKey, sizeof(struct PrimaryMcuData), 0777)) < 0) {
-#ifdef SystemLogMessage
-        log_error("shmget ShmPrimaryMcuData NG");
-#endif
-        result = FAIL;
-    } else if ((ShmPrimaryMcuData = shmat(MeterSMId, NULL, 0)) == (void *) - 1) {
-#ifdef ShmPrimaryMcuData
-        log_error("shmat ShmPrimaryMcuData NG");
-#endif
-        result = FAIL;
-    }
-
-    return result;
-}
-#endif //0
-
-//==========================================
-// Open and Close RS232 and R/W
-//==========================================
-int CreateCommunicationLcmPort()
-{
-    int fd;
-    struct termios tios;
-
-    fd = open(pPortName, O_RDWR);
-    if (fd <= 0) {
-#ifdef SystemLogMessage
-        log_error("open /dev/ttyS3 NG ");
-#endif
-        return -1;
-    }
-    ioctl(fd, TCGETS, &tios);
-    tios.c_cflag = B115200 | CS8 | CLOCAL | CREAD;
-    tios.c_lflag = 0;
-    tios.c_iflag = 0;
-    tios.c_oflag = 0;
-    tios.c_cc[VMIN] = 0;
-    tios.c_cc[VTIME] = (uint8_t) 5;
-    tios.c_lflag = 0;
-    tcflush(fd, TCIFLUSH);
-    ioctl(fd, TCSETS, &tios);
-
-    return fd;
-}
-
-void CloseCommunicationLcmPort()
-{
-    close(_port);
-}
-
-void WriteCmdToLcm(uint8_t *cmd, uint8_t cmdLen)
-{
-    int len = write(_port, cmd, cmdLen);
-    if (len >= sizeof(cmd)) {
-        //log_info("Write cmd to LCM successfully. ");
-    }
-}
-
-void ReadMsgFromLcm(uint8_t *msg, uint8_t readLen)
-{
-    read(_port, msg, readLen);
-
-    if (*msg == CMD_TITLE_1 && *(msg + 1) == CMD_TITLE_2) {
-        if (*(msg + 3) == CMD_WRITE) {
-            switch (*(msg + 4)) {
-            case CMD_REGISTER: {
-                // 頁面
-                strcpy((char *)pSysInfo->LcmHwRev, moduleName);
-            }
-            break;
-            }
-        } else if (*(msg + 3) == CMD_MULTI_READ) {
-//          switch ((unsigned short) (*(msg + 4) << 8) + (unsigned short) *(msg + 5))
-//          {
-//              case BUTTON_GUN_INDEX:
-//              {
-//                  // 當前選的槍號
-//                  _curGunIndex = (*(msg + 8));
-//              }
-//              break;
-//          }
-        }
-    }
-}
-
-//================================================
-// Function
-//================================================
-void ChangeToOtherPage(short newPage)
-{
-    uint8_t cmd[7];
-    memset(cmd, 0x00, sizeof(cmd));
-
-    cmd[0] = CMD_TITLE_1;
-    cmd[1] = CMD_TITLE_2;
-    cmd[2] = 0x02 + sizeof(newPage);
-    cmd[3] = CMD_READ;
-    cmd[4] = CMD_REGISTER;
-    cmd[5] = newPage >> 8;
-    cmd[6] = newPage & 0x00FF;
-
-    WriteCmdToLcm(cmd, ARRAY_SIZE(cmd));
-    usleep(100000);
-}
-
-void ChangeBackLight(bool islight)
-{
-    uint8_t value = 0x01;
-
-    if (islight) {
-        value = 0x20;
-    }
-    uint8_t cmd[7];
-    memset(cmd, 0x00, sizeof(cmd));
-
-    cmd[0] = CMD_TITLE_1;
-    cmd[1] = CMD_TITLE_2;
-    cmd[2] = 0x03;
-    cmd[3] = CMD_READ;
-    cmd[4] = CMD_BACKLIGHT;
-    cmd[5] = value;
-
-    WriteCmdToLcm(cmd, ARRAY_SIZE(cmd));
-    usleep(100000);
-}
-
-void GetCurrentPage()
-{
-    uint8_t cmd[6];
-    memset(cmd, 0x00, sizeof(cmd));
-    uint8_t msg[8];
-    memset(msg, 0x00, sizeof(msg));
-
-    cmd[0] = CMD_TITLE_1;
-    cmd[1] = CMD_TITLE_2;
-    cmd[2] = 0x03;              // 底下總長度
-    cmd[3] = CMD_WRITE;
-    cmd[4] = CMD_REGISTER;
-    cmd[5] = 0x02;
-
-    WriteCmdToLcm(cmd, ARRAY_SIZE(cmd));
-    usleep(100000);
-    ReadMsgFromLcm(msg, ARRAY_SIZE(msg));
-}
-
-void DisplayValueToLcm(short address, uint8_t *data, uint8_t len)
-{
-    uint8_t cmd[256];
-    memset(cmd, 0x00, sizeof(cmd));
-
-    cmd[0] = CMD_TITLE_1;
-    cmd[1] = CMD_TITLE_2;
-    cmd[2] = 0x03 + len;
-    cmd[3] = CMD_MULTI_WRITE;
-    cmd[4] = address >> 8;
-    cmd[5] = address & 0x00FF;
-
-    for (uint8_t count = 0; count < len; count++) {
-        cmd[6 + count] = *(data + count);
-    }
-
-    WriteCmdToLcm(cmd, cmd[2] + 3);
-}
-
-void ChangeDisplay2Value(short address, short value)
-{
-    uint8_t data[2];
-    data[0] = value >> 8;
-    data[1] = value & 0x00FF;
-
-    DisplayValueToLcm(address, data, sizeof(data));
-}
-
-void GetBtnStatus(short address, uint8_t len)
-{
-    uint8_t cmd[8];
-    memset(cmd, 0x00, sizeof(cmd));
-    uint8_t msg[8];
-    memset(msg, 0x00, sizeof(msg));
-
-    cmd[0] = CMD_TITLE_1;
-    cmd[1] = CMD_TITLE_2;
-    cmd[2] = 0x03 + len;
-    cmd[3] = CMD_MULTI_READ;
-    cmd[4] = address >> 8;
-    cmd[5] = address & 0x00FF;
-    cmd[6] = 0x00 + len;
-
-    WriteCmdToLcm(cmd, cmd[2] + 3);
-    usleep(100000);
-    ReadMsgFromLcm(msg, (len * 2) + sizeof(msg));
-}
-
-//================================================
-// Warning process
-//================================================
-void string2ByteArray(uint8_t *input, uint8_t *output)
-{
-    int loop;
-    int i;
-
-    loop = 0;
-    i = 0;
-
-    while (input[loop] != '\0') {
-        output[i++] = input[loop++];
-    }
-    output[loop] = '\0';
-}
-
-void ChangeWarningFunc()
-{
-    uint8_t cmd[7] = {0};
-    uint8_t i = 0;
-    //uint8_t j = 0;
-    //log_info("ChangeWarningFunc ");
-    // 最多一次五筆
-    //log_info("LCM PageIndex = %d ", pSysWarning->PageIndex);
-    //log_info("WarningCount = %d ", pSysWarning->WarningCount);
-//#if !defined DD360 && !defined DD360Audi && !defined DD360ComBox
-    for (i = 0; (i + pSysWarning->PageIndex * 5) < pSysWarning->WarningCount; i++) {
-        memset(cmd, 0x00, sizeof(cmd));
-        if ((i) >= 5) {
-            break;
-        }
-
-        //error code
-        string2ByteArray(&pSysWarning->WarningCode[i + pSysWarning->PageIndex * 5][0], cmd);
-        DisplayValueToLcm(0x0010 + ((i) * 6), cmd, sizeof(cmd));
-        //警告標示
-        memset(cmd, 0x00, sizeof(cmd));
-
-        cmd[0] = 0x00;
-        cmd[1] = 0x01;
-        DisplayValueToLcm(0x0002 + ((i) * 2), cmd, 2);
-    }
-
-    memset(cmd, 0x00, sizeof(cmd));
-    for (; i < 5; i++) {
-        DisplayValueToLcm(0x0010 + ((i) * 6), cmd, sizeof(cmd));
-        DisplayValueToLcm(0x0002 + ((i) * 2), cmd, 2);
-    }
-
-    /*#else
-        for (i = 0; (i + pSysWarning->PageIndex * 5) < pSysWarning->WarningCount; i++) {
-            memset(cmd, 0x00, sizeof(cmd));
-            if ((i - j) >= 5) {
-                break;
-            }
-            if (
-                (memcmp(&pSysWarning->WarningCode[i + pSysWarning->PageIndex * 5][0], "033900", 6) == 0) ||
-                (memcmp(&pSysWarning->WarningCode[i + pSysWarning->PageIndex * 5][0], "033901", 6) == 0) ||
-                (memcmp(&pSysWarning->WarningCode[i + pSysWarning->PageIndex * 5][0], "033902", 6) == 0) ||
-                (memcmp(&pSysWarning->WarningCode[i + pSysWarning->PageIndex * 5][0], "043627", 6) == 0) ||
-                (memcmp(&pSysWarning->WarningCode[i + pSysWarning->PageIndex * 5][0], "043628", 6) == 0) ||
-                (memcmp(&pSysWarning->WarningCode[i + pSysWarning->PageIndex * 5][0], "043622", 6) == 0) ||
-                (memcmp(&pSysWarning->WarningCode[i + pSysWarning->PageIndex * 5][0], "043623", 6) == 0) ||
-                (memcmp(&pSysWarning->WarningCode[i + pSysWarning->PageIndex * 5][0], "043624", 6) == 0) ||
-                (memcmp(&pSysWarning->WarningCode[i + pSysWarning->PageIndex * 5][0], "043625", 6) == 0) ||
-                (memcmp(&pSysWarning->WarningCode[i + pSysWarning->PageIndex * 5][0], "043626", 6) == 0) ||
-                (memcmp(&pSysWarning->WarningCode[i + pSysWarning->PageIndex * 5][0], "042241", 6) == 0) ||
-                (memcmp(&pSysWarning->WarningCode[i + pSysWarning->PageIndex * 5][0], "042242", 6) == 0)
-            ) {
-                j++;
-                continue;
-            }
-            //error code
-            string2ByteArray(&pSysWarning->WarningCode[i + pSysWarning->PageIndex * 5][0], cmd);
-            DisplayValueToLcm(0x0010 + ((i - j) * 6), cmd, sizeof(cmd));
-            //警告標示
-            memset(cmd, 0x00, sizeof(cmd));
-
-            cmd[0] = 0x00;
-            cmd[1] = 0x01;
-            DisplayValueToLcm(0x0002 + ((i - j) * 2), cmd, 2);
-        }
-
-        memset(cmd, 0x00, sizeof(cmd));
-        i = i - j;
-        for (; (i) < 5; i++) {
-            DisplayValueToLcm(0x0010 + ((i) * 6), cmd, sizeof(cmd));
-            DisplayValueToLcm(0x0002 + ((i) * 2), cmd, 2);
-        }
-
-    #endif //!defined DD360 && !defined DD360Audi
-    */
-}
-
-//================================================
-// QR Code process
-//================================================
-void ChangeQrCode_Idle(char *input)
-{
-#if defined DD360Audi
-    int len = strlen(input) + 3;
-    int loop = 0;
-    int i = 0, j = 0, k = 0, l = 0;
-    uint8_t qrUrl[128] = {0};
-    uint16_t urlLen = 0;
-    uint8_t cmd[len];
-    uint8_t tmpBuf[15] = {0};
-    //uint8_t tmpLen = sizeof(tmpBuf) - 1;
-
-    strncpy((char *)cmd, " ", len);
-
-    while (input[loop] != '\0') {
-        cmd[i++] = input[loop++];
-        l = loop - 1;
-        if (len >= 25) {
-            if (i >= 16 && i <= 19) {
-                tmpBuf[k++] = input[l];
-                //printf("tmpBuf = %s", tmpBuf);
-            } else if (i >= 21 && i <= 23) {
-                tmpBuf[k++] = input[l];
-            }
-        }
-    }
-    tmpBuf[k] = '\0';
-    //printf("tmpBuf = %s", tmpBuf);
-    j += sprintf((char *)&cmd[i], ":%d", pSysInfo->CurGunSelected); ////For Audi
-    cmd[len - 1] = '\0';
-    urlLen = sprintf((char *)qrUrl, "%s%s", NOODOE_QR_CODE_URL, cmd);
-    qrUrl[urlLen] = '\0';
-    //printf("qr url = %s", qrUrl);
-    DisplayValueToLcm(__qr_code, qrUrl, urlLen);
-
-    j = 0;
-    j += sprintf((char *)&tmpBuf[k], "0%d", pSysInfo->CurGunSelected); ////For Audi
-    tmpBuf[k + j] = '\0';
-
-    //if (len < 25) {
-    //    strncpy((char *)tmpBuf, (char *)cmd, sizeof(tmpBuf));
-    //}
-    //tmpBuf[tmpLen] = '\0';
-    DisplayValueToLcm(__custStationIdL1, tmpBuf, sizeof(tmpBuf));
-
-    /*if (len > sizeof(tmpBuf)) {
-        strncpy((char *)tmpBuf, (char *)cmd, sizeof(tmpBuf));
-        tmpBuf[tmpLen] = '\0';
-        DisplayValueToLcm(__custStationIdL1, tmpBuf, sizeof(tmpBuf));
-
-        memset(tmpBuf, 0, sizeof(tmpBuf));
-        strncpy((char *)tmpBuf, (char *)&cmd[tmpLen], sizeof(tmpBuf));
-        tmpBuf[tmpLen] = '\0';
-        DisplayValueToLcm(__custStationIdL2, tmpBuf, sizeof(tmpBuf));
-    } else {
-        DisplayValueToLcm(__custStationIdL1, cmd, len);
-
-        strncpy((char *)tmpBuf, " ", sizeof(tmpBuf));
-        tmpBuf[tmpLen] = '\0';
-        DisplayValueToLcm(__custStationIdL2, tmpBuf, sizeof(tmpBuf));
-    }*/
-
-#else
-    int len = strlen(input);
-    uint8_t cmd[len];
-
-    int loop = 0;
-    int i = 0;
-
-    while (input[loop] != '\0') {
-        cmd[i++] = input[loop++];
-    }
-
-    DisplayValueToLcm(__qr_code, cmd, len + 1);
-#endif //defined DD360Audi
-}
-
-void ChangeQrCode_Charge(char *input)
-{
-#if defined DD360Audi
-    int len = strlen(input) + 3;
-    int loop = 0;
-    int i = 0, j = 0, k = 0, l = 0;
-    uint8_t qrUrl[128] = {0};
-    uint16_t urlLen = 0;
-    uint8_t cmd[len];
-    uint8_t tmpBuf[15] = {0};
-    //uint8_t tmpLen = sizeof(tmpBuf) - 1;
-
-    strncpy((char *)cmd, " ", len);
-
-    while (input[loop] != '\0') {
-        cmd[i++] = input[loop++];
-        l = loop - 1;
-        if (len >= 25) {
-            if (i >= 16 && i <= 19) {
-                tmpBuf[k++] = input[l];
-                //printf("tmpBuf = %s", tmpBuf);
-            } else if (i >= 21 && i <= 23) {
-                tmpBuf[k++] = input[l];
-            }
-        }
-    }
-    tmpBuf[k] = '\0';
-    //printf("tmpBuf = %s", tmpBuf);
-    j += sprintf((char *)&cmd[i], ":%d", pSysInfo->CurGunSelected); ////For Audi
-    cmd[len - 1] = '\0';
-    urlLen = sprintf((char *)qrUrl, "%s%s", NOODOE_QR_CODE_URL, cmd);
-    qrUrl[urlLen] = '\0';
-    DisplayValueToLcm(__qr_code, qrUrl, urlLen);
-
-    j = 0;
-    j += sprintf((char *)&tmpBuf[k], "0%d", pSysInfo->CurGunSelected); ////For Audi
-    tmpBuf[k + j] = '\0';
-
-    if (len < 25) {
-        strncpy((char *)tmpBuf, (char *)cmd, sizeof(tmpBuf));
-    }
-    //tmpBuf[tmpLen] = '\0';
-    DisplayValueToLcm(__custStationIdL1, tmpBuf, sizeof(tmpBuf));
-    /*if (len > sizeof(tmpBuf)) {
-        strncpy((char *)tmpBuf, (char *)cmd, sizeof(tmpBuf));
-        tmpBuf[tmpLen] = '\0';
-        DisplayValueToLcm(__custStationIdL1, tmpBuf, sizeof(tmpBuf));
-
-        memset(tmpBuf, 0, sizeof(tmpBuf));
-        strncpy((char *)tmpBuf, (char *)&cmd[tmpLen], sizeof(tmpBuf));
-        tmpBuf[tmpLen] = '\0';
-        DisplayValueToLcm(__custStationIdL2, tmpBuf, sizeof(tmpBuf));
-    } else {
-        DisplayValueToLcm(__custStationIdL1, cmd, len);
-
-        strncpy((char *)tmpBuf, " ", sizeof(tmpBuf));
-        tmpBuf[tmpLen] = '\0';
-        DisplayValueToLcm(__custStationIdL2, tmpBuf, sizeof(tmpBuf));
-    }*/
-
-#else
-    int len = strlen(input);
-    uint8_t cmd[len];
-
-    int loop = 0;
-    int i = 0;
-
-    while (input[loop] != '\0') {
-        cmd[i++] = input[loop++];
-    }
-
-    DisplayValueToLcm(__qr_code_pre, cmd, len + 1);
-#endif //defined DD360Audi
-}
-
-//================================================
-// Change current page
-//================================================
-void ChangeCurPage()
-{
-    //log_info("cur = %d, new = %d ", _currentPage, pSysInfo->PageIndex);
-    if (_currentPage != pSysInfo->PageIndex) {
-        _currentPage = pSysInfo->PageIndex;
-        ChangeToOtherPage(_currentPage);
-        _everyPageRollChange = 0;
-    }
-}
-
-//================================================
-// Main process
-//================================================
-uint8_t demoCount = 0;
-void DemoFunction()
-{
-    if (demoCount == 0) {
-        pSysWarning->WarningCount = 6;
-        memcpy(&pSysWarning->WarningCode[0][0], "000001", 7);
-        memcpy(&pSysWarning->WarningCode[1][0], "000002", 7);
-        memcpy(&pSysWarning->WarningCode[2][0], "000003", 7);
-        memcpy(&pSysWarning->WarningCode[3][0], "000004", 7);
-        memcpy(&pSysWarning->WarningCode[4][0], "000005", 7);
-        memcpy(&pSysWarning->WarningCode[5][0], "000006", 7);
-    } else {
-        if (demoCount == 20) {
-            pSysInfo->PageIndex = _LCM_IDLE;
-        } else if (demoCount == 80) {
-            pSysInfo->PageIndex = _LCM_AUTHORIZING;
-        } else if (demoCount == 100) {
-            pSysInfo->PageIndex = _LCM_AUTHORIZ_COMP;
-        } else if (demoCount == 120) {
-            pSysInfo->PageIndex = _LCM_AUTHORIZ_FAIL;
-        } else if (demoCount == 140) {
-            pSysInfo->PageIndex = _LCM_PRE_CHARGE;
-        } else if (demoCount == 180) {
-            pSysInfo->PageIndex = _LCM_CHARGING;
-        }
-    }
-
-    if (demoCount < 180) {
-        demoCount++;
-    }
-}
-
-//================================================
-// Main process
-//================================================
-bool 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 true;
-        }
-    }
-
-    for (uint8_t index = 0; index < CCS_QUANTITY; index++) {
-        if (pSysInfo->CcsChargingData[index].Index == target) {
-            _chargingData[target] = &pSysInfo->CcsChargingData[index];
-            return true;
-        }
-    }
-
-    for (uint8_t index = 0; index < GB_QUANTITY; index++) {
-        if (pSysInfo->GbChargingData[index].Index == target) {
-            _chargingData[target] = &pSysInfo->GbChargingData[index];
-            return true;
-        }
-    }
-
-    return false;
-}
-
-bool FindAcChargingInfoData(uint8_t target, struct ChargingInfoData **acChargingData)
-{
-    if (target < AC_QUANTITY) {
-        acChargingData[target] = &pSysInfo->AcChargingData[target];
-        return true;
-    }
-
-    return false;
-}
-int GetTimeoutValue(struct timespec *startTime)
-{
-    struct timespec endTime;
-    clock_gettime(CLOCK_MONOTONIC_COARSE, &endTime);
-    return endTime.tv_sec - startTime->tv_sec;
-}
-void GetTimespecFunc(struct timespec *time)
-{
-    clock_gettime(CLOCK_MONOTONIC_COARSE, time);
-}
-
-void RunReplugStringFunction(bool isRun)
-{
-    if (isRun) {
-        int time = GetTimeoutValue(&showReplugStrTimer);
-        if (time >=1 && time <2) {
-            ChangeDisplay2Value(__show_StatusString_value_1, _showReplugStr_1);
-            ChangeDisplay2Value(__show_StatusString_value_2, _showReplugStr_2);
-        } else if (time < 1) {
-            ChangeDisplay2Value(__show_StatusString_value_1, _disappear);
-            ChangeDisplay2Value(__show_StatusString_value_2, _disappear);
-        } else
-            GetTimespecFunc(&showReplugStrTimer);
-
-    } else {
-        ChangeDisplay2Value(__show_StatusString_value_1, _disappear);
-        ChangeDisplay2Value(__show_StatusString_value_2, _disappear);
-    }
-}
-void RunFullTargetFunction(bool isRun)
-{
-    if (isRun) {
-        int time = GetTimeoutValue(&showFullTargetTimer);
-        if (time >=1 && time <2) {
-            ChangeDisplay2Value(__show_StatusString_value_1, _showfulltarget_1 );
-            ChangeDisplay2Value(__show_StatusString_value_2, _showfulltarget_2);
-        } else if (time < 1) {
-            ChangeDisplay2Value(__show_StatusString_value_1, _disappear);
-            ChangeDisplay2Value(__show_StatusString_value_2, _disappear);
-
-        } else
-            GetTimespecFunc(&showFullTargetTimer);
-
-    } else {
-        ChangeDisplay2Value(__show_StatusString_value_1, _disappear);
-        ChangeDisplay2Value(__show_StatusString_value_2, _disappear);
-    }
-}
-
-/**
- * [ChangeBalanceValue :print balance information]
- * @Author
- * @DateTime 2020-11-26
- */
-static void ChangeBalanceValue(uint16_t addr, uint8_t index) ////For Audi
-{
-    uint8_t cmd[10] = {0};
-    uint8_t value[10] = {0};
-    uint8_t len = 0;
-    float balance = ShmSelectGunInfo->PricesInfo[index].Balance;
-
-    if ((balance) == (FAIL_BALANCE_PRICES)) {
-        balance = 0.00;
-    }
-
-    len += sprintf((char *) value, "%.2f", balance);
-    if (len < 6) {
-        sprintf((char *)&value[len], "%s",
-                (uint8_t *)GetCurrency(pSysConfig->BillingData.Currency));
-    }
-
-    value[sizeof(value) - 1] = '\0';
-
-    string2ByteArray(value, cmd);
-    DisplayValueToLcm(addr, cmd, sizeof(cmd));
-}
-
-void ChangeAcBattMapAndValue(short page)
-{
-    pAcChargingInfo = (struct ChargingInfoData *)GetAcChargingInfoData(0);
-
-    if (page == _LCM_CHARGING) {
-        if (isDiffStatus != _battery_display_ani) {
-            isChangeBattMap = false;
-            isDiffStatus = _battery_display_ani;
-        }
-
-        if (pAcChargingInfo->IsCharging && !isChangeBattMap) {
-            isChangeBattMap = true;
-            if (ac_ani_battery_level == _BATTERY_LEVEL_FOR_MAP_LV5) {
-                ChangeDisplay2Value(__batt_map, _battery_empty);
-                ac_ani_battery_level = _BATTERY_LEVEL_FOR_MAP_EMP;
-            } else if (ac_ani_battery_level == _BATTERY_LEVEL_FOR_MAP_EMP) {
-                ChangeDisplay2Value(__batt_map, _battery_cap_20);
-                ac_ani_battery_level = _BATTERY_LEVEL_FOR_MAP_LV1;
-            } else if (ac_ani_battery_level == _BATTERY_LEVEL_FOR_MAP_LV1) {
-                ChangeDisplay2Value(__batt_map, _battery_cap_40);
-                ac_ani_battery_level = _BATTERY_LEVEL_FOR_MAP_LV2;
-            } else if (ac_ani_battery_level == _BATTERY_LEVEL_FOR_MAP_LV2) {
-                ChangeDisplay2Value(__batt_map, _battery_cap_60);
-                ac_ani_battery_level = _BATTERY_LEVEL_FOR_MAP_LV3;
-            } else if (ac_ani_battery_level == _BATTERY_LEVEL_FOR_MAP_LV3) {
-                ChangeDisplay2Value(__batt_map, _battery_cap_80);
-                ac_ani_battery_level = _BATTERY_LEVEL_FOR_MAP_LV4;
-            } else if (ac_ani_battery_level == _BATTERY_LEVEL_FOR_MAP_LV4) {
-                ChangeDisplay2Value(__batt_map, _battery_cap_100);
-                ac_ani_battery_level = _BATTERY_LEVEL_FOR_MAP_LV5;
-            }
-        }
-    } else if (page == _LCM_COMPLETE) {
-        if (ac_ani_battery_level == _BATTERY_LEVEL_FOR_MAP_LV5) {
-            ChangeDisplay2Value(__batt_map, _battery_soc_20);
-        } else if (ac_ani_battery_level == _BATTERY_LEVEL_FOR_MAP_EMP) {
-            ChangeDisplay2Value(__batt_map, _battery_soc_20);
-        } else if (ac_ani_battery_level == _BATTERY_LEVEL_FOR_MAP_LV1) {
-            ChangeDisplay2Value(__batt_map, _battery_soc_40);
-        } else if (ac_ani_battery_level == _BATTERY_LEVEL_FOR_MAP_LV2) {
-            ChangeDisplay2Value(__batt_map, _battery_soc_60);
-        } else if (ac_ani_battery_level == _BATTERY_LEVEL_FOR_MAP_LV3) {
-            ChangeDisplay2Value(__batt_map, _battery_soc_80);
-        } else if (ac_ani_battery_level == _BATTERY_LEVEL_FOR_MAP_LV4) {
-            ChangeDisplay2Value(__batt_map, _battery_soc_100);
-        }
-    }
-
-    ChangeDisplay2Value(__soc_value_charging, _disappear);
-}
-
-void ChangeBattMapAndValue(short page, int soc)
-{
-//  srand(time(NULL));
-//  int min = 10;
-//  int max = 90;
-//  soc = rand() % (max - min + 1) + min;
-
-    if (page == _LCM_PRE_CHARGE) {
-        ChangeDisplay2Value(__batt_map_empty, _battery_empty);
-    } else if (page == _LCM_CHARGING) {
-        if (soc < 20) {
-            if (_battery_display_ani) {
-                ChangeDisplay2Value(__batt_map, _battery_empty);
-            } else {
-                ChangeDisplay2Value(__batt_map, _battery_cap_20);
-            }
-        } else if (soc >= 20 && soc < 40) {
-            if (_battery_display_ani) {
-                ChangeDisplay2Value(__batt_map, _battery_cap_20);
-            } else {
-                ChangeDisplay2Value(__batt_map, _battery_cap_40);
-            }
-        } else if (soc >= 40 && soc < 60) {
-            if (_battery_display_ani) {
-                ChangeDisplay2Value(__batt_map, _battery_cap_40);
-            } else {
-                ChangeDisplay2Value(__batt_map, _battery_cap_60);
-            }
-        } else if (soc >= 60 && soc < 80) {
-            if (_battery_display_ani) {
-                ChangeDisplay2Value(__batt_map, _battery_cap_60);
-            } else {
-                ChangeDisplay2Value(__batt_map, _battery_cap_80);
-            }
-        } else if (soc >= 80 && soc <= 100) {
-            if (_battery_display_ani) {
-                ChangeDisplay2Value(__batt_map, _battery_cap_80); //DS60-120 add
-            } else {
-                ChangeDisplay2Value(__batt_map, _battery_cap_100);
-            }
-        }
-    } else if (page == _LCM_COMPLETE) {
-        if (soc < 20) {
-            ChangeDisplay2Value(__batt_map, _battery_soc_20);
-        } else if (soc >= 20 && soc < 40) {
-            ChangeDisplay2Value(__batt_map, _battery_soc_40);
-        } else if (soc >= 40 && soc < 60) {
-            ChangeDisplay2Value(__batt_map, _battery_soc_60);
-        } else if (soc >= 60 && soc < 80) {
-            ChangeDisplay2Value(__batt_map, _battery_soc_80);
-        } else if (soc >= 80 && soc <= 100) {
-            ChangeDisplay2Value(__batt_map, _battery_soc_100);
-        }
-    }
-
-    uint8_t cmd[5];
-    uint8_t value[5];
-
-    memset(cmd, 0x00, sizeof(cmd));
-    memset(value, 0x00, sizeof(value));
-    sprintf((char *)value, "%d%%", soc);
-    string2ByteArray(value, cmd);
-    DisplayValueToLcm(__soc_value_charging, cmd, sizeof(cmd));
-}
-
-void ChangeRemainTime(int sec)
-{
-    int h, m, s;
-    uint8_t cmd[10];
-    uint8_t value[10];
-
-    memset(cmd, 0x00, sizeof(cmd));
-
-//  srand(time(NULL));
-//  int min = 0;
-//  int max = 65536;
-//  sec = rand() % (max - min + 1) + min;
-
-    h = (sec / 3600);
-    m = (sec - (3600 * h)) / 60;
-    s = (sec - (3600 * h) - (m * 60));
-    sprintf((char *)value, "%02d:%02d:%02d", h, m, s);
-    string2ByteArray(value, cmd);
-    DisplayValueToLcm(__remain_time_tx, cmd, sizeof(cmd));
-}
-
-void ChangeChargingEnergyValue(float energy)
-{
-    uint8_t cmd[10];
-    uint8_t value[10];
-
-    memset(cmd, 0x00, sizeof(cmd));
-    if (energy >= 0.05) {
-        energy -= 0.05;
-    }
-    sprintf((char *) value, "%.1f kWh", energy);
-    string2ByteArray(value, cmd);
-    DisplayValueToLcm(__total_out_eng_tx, cmd, sizeof(cmd));
-}
-
-void ChangeChargingPowerValue(float pow)
-{
-    uint8_t cmd[10];
-    uint8_t value[10];
-
-    memset(cmd, 0x00, sizeof(cmd));
-
-//  float min = 0.0;
-//  float max = 50;
-//  pow = (max - min) * rand() / (RAND_MAX + 1.0) + min;
-    sprintf((char *) value, "%.1f kW", pow);
-    string2ByteArray(value, cmd);
-    DisplayValueToLcm(__output_eng_tx, cmd, sizeof(cmd));
-}
-
-void ChangeChargingFeeValue(float fee)
-{
-    uint8_t cmd[10];
-    uint8_t value[10];
-
-    memset(cmd, 0x00, sizeof(cmd));
-
-    sprintf((char *) value, "%.2f", fee);
-    string2ByteArray(value, cmd);
-    DisplayValueToLcm(__charging_fee_tx, cmd, sizeof(cmd));
-}
-
-void DisplayMoneyRate(float money)
-{
-    uint8_t cmd[8];
-    uint8_t value[8];
-
-    memset(cmd, 0x00, sizeof(cmd));
-
-    sprintf((char *) value, "%.2f", money);
-    string2ByteArray(value, cmd);
-    DisplayValueToLcm(__money_by_rate, cmd, sizeof(cmd));
-}
-
-void DisplayMoneyCur(uint8_t *cur)
-{
-    uint8_t cmd[10] = {0};
-    uint8_t buf[10] = {0};
-    uint8_t len = 0;
-
-    *(cur + 3) = '\0';
-    memset(cmd, 0x00, sizeof(cmd));
-    len = sprintf((char *) buf, "%s/kWh", cur);
-    buf[len] = '\0';
-    string2ByteArray(buf, cmd);
-    DisplayValueToLcm(__money_rate, cmd, sizeof(cmd));
-}
-
-void RefreshPageAnimation(uint8_t value)
-{
-    switch (_currentPage) {
-    case _LCM_IDLE: {
-
-    }
-    break;
-    case _LCM_WAIT_FOR_PLUG: {
-        if (_everyPageRollChange == 0) {
-            ChangeDisplay2Value(__plug_in_arrow, _arrow_dark);
-        } else if (_everyPageRollChange == 15) {
-            ChangeDisplay2Value(__plug_in_arrow, _arrow_light);
-        }
-
-        _everyPageRollChange > 30 ? _everyPageRollChange = 0 : _everyPageRollChange++;
-    }
-    break;
-    case _LCM_PRE_CHARGE:
-    case _LCM_CHARGING:
-    case _LCM_COMPLETE: {
-        if (_currentPage == _LCM_PRE_CHARGE) {
-            if (_everyPageRollChange == 0 || _everyPageRollChange == 22) {
-                ChangeDisplay2Value(__conn_line, _conn_map1);
-            } else if (_everyPageRollChange == 11 || _everyPageRollChange == 33) {
-                ChangeDisplay2Value(__conn_line, _conn_map2);
-            }
-        } else if (_currentPage == _LCM_CHARGING) {
-            if (_everyPageRollChange == 0 || _everyPageRollChange == 22) {
-                ChangeDisplay2Value(__conn_line_chag, _charging_map1);
-            } else if (_everyPageRollChange == 11 || _everyPageRollChange == 33) {
-                ChangeDisplay2Value(__conn_line_chag, _charging_map2);
-            }
-        } else if (_currentPage == _LCM_COMPLETE) {
-            if (_everyPageRollChange == 0) {
-                ChangeDisplay2Value(__conn_line_comp, _complete_map);
-            }
-        }
-
-        _everyPageRollChange >= 45 ? _everyPageRollChange = 0 : _everyPageRollChange++;
-    }
-    break;
-    }
-}
-
-void RefreshConnStatus()
-{
-    // Wifi priority is higher than Ethernet
-#if defined DD360 ||defined DD360Audi || defined DD360ComBox
-    uint8_t i = 0;
-    uint8_t ethstatus = 0;
-
-    for (i = 0; i < pSysWarning->WarningCount; i++) {
-        if (memcmp(&pSysWarning->WarningCode[i][0], "012304", 6) == 0) {
-            ethstatus = 1;
-            //if (ShmSelectGunInfo->EthDevStatus.Ethernet != DEV_ST_DISABLE) {
-            //    ShmSelectGunInfo->EthDevStatus.Ethernet = DEV_ST_ENABLE_NO_USE;
-            //}
-            break;
-        }
-    }
-
-    if (ShmSelectGunInfo->EthDevStatus.Backend == DEV_ST_DISABLE) {
-        ChangeDisplay2Value(__conn_status, _disappear);
-    } else if (ShmSelectGunInfo->EthDevStatus.Backend == DEV_ST_ENABLE_USE) {
-        ChangeDisplay2Value(__conn_status, _connect);
-    } else if (ShmSelectGunInfo->EthDevStatus.Backend == DEV_ST_ENABLE_NO_USE) {
-        ChangeDisplay2Value(__conn_status, _disconnect);
-    }
-
-    if (ethstatus == 1) {
-        if (ShmSelectGunInfo->EthDevStatus.Ethernet != DEV_ST_DISABLE) {
-            ChangeDisplay2Value(__ethernet_status, _eth_disconnect);
-        }
-    } else {
-        if (ShmSelectGunInfo->EthDevStatus.Ethernet != DEV_ST_DISABLE) {
-            ChangeDisplay2Value(__ethernet_status, _eth_connect);
-        }
-        //if (ShmSelectGunInfo->EthDevStatus.Ethernet == DEV_ST_DISABLE) {
-        //} else if (ShmSelectGunInfo->EthDevStatus.Ethernet == DEV_ST_ENABLE_USE) {
-        //    ChangeDisplay2Value(__ethernet_status, _eth_connect);
-        //} else if (ShmSelectGunInfo->EthDevStatus.Ethernet == DEV_ST_ENABLE_NO_USE) {
-        //    ChangeDisplay2Value(__ethernet_status, _eth_disconnect);
-        //}
-    }
-
-    if (ShmSelectGunInfo->EthDevStatus.Wifi == DEV_ST_DISABLE) {
-        ChangeDisplay2Value(__wifi_status, _disappear);
-
-        ChangeDisplay2Value(__3G4G_status, _disappear);
-        if (ShmSelectGunInfo->EthDevStatus.FourG == DEV_ST_DISABLE) {
-            ChangeDisplay2Value(__3G4G_move_status, _disappear);
-        } else if (ShmSelectGunInfo->EthDevStatus.FourG == DEV_ST_ENABLE_USE) {
-            ChangeDisplay2Value(__3G4G_move_status, __3G4G_connect);
-        } else if (ShmSelectGunInfo->EthDevStatus.FourG == DEV_ST_ENABLE_NO_USE) {
-            ChangeDisplay2Value(__3G4G_move_status, _3G4G_disconnect);
-        }
-    } else if (ShmSelectGunInfo->EthDevStatus.Wifi == DEV_ST_ENABLE_USE) {
-        ChangeDisplay2Value(__3G4G_move_status, _disappear);
-        ChangeDisplay2Value(__wifi_status, _wifi_connect);
-    } else if (ShmSelectGunInfo->EthDevStatus.Wifi == DEV_ST_ENABLE_NO_USE) {
-        ChangeDisplay2Value(__3G4G_move_status, _disappear);
-        ChangeDisplay2Value(__wifi_status, _wifi_disconnect);
-    }
-
-    if (ShmSelectGunInfo->EthDevStatus.Wifi != DEV_ST_DISABLE) {
-        if (ShmSelectGunInfo->EthDevStatus.FourG == DEV_ST_DISABLE) {
-            ChangeDisplay2Value(__3G4G_status, _disappear);
-        } else if (ShmSelectGunInfo->EthDevStatus.FourG == DEV_ST_ENABLE_USE) {
-            ChangeDisplay2Value(__3G4G_status, __3G4G_connect);
-        } else if (ShmSelectGunInfo->EthDevStatus.FourG == DEV_ST_ENABLE_NO_USE) {
-            ChangeDisplay2Value(__3G4G_status, _3G4G_disconnect);
-        }
-    }
-
-    //uint8_t flag[4] = {0};
-
-    /*for (i = 0; i < pSysWarning->WarningCount; i++) {
-        //printf("status code = %s", &pSysWarning->WarningCode[i][0]);
-        if (memcmp(&pSysWarning->WarningCode[i][0], "012304", 6) == 0) {
-            flag[0] = 1;
-            continue;
-        }
-
-        if (memcmp(&pSysWarning->WarningCode[i][0], "043625", 6) == 0) {
-            //disconnected from AP through WiFi
-            flag[1] = 1;
-            continue;
-        }
-
-        if (memcmp(&pSysWarning->WarningCode[i][0], "043627", 6) == 0) { //wifi disabled
-            flag[1] = 2;
-            continue;
-        }
-
-        if ((memcmp(&pSysWarning->WarningCode[i][0], "033900", 6) == 0) ||
-                (memcmp(&pSysWarning->WarningCode[i][0], "033901", 6) == 0) ||
-                (memcmp(&pSysWarning->WarningCode[i][0], "033902", 6) == 0)) {
-            flag[2] = 1;
-            continue;
-        }
-
-        if (memcmp(&pSysWarning->WarningCode[i][0], "043626", 6) == 0) {
-            //disconnected from APN through 3G/4G
-            flag[3] = 1;
-            continue;
-        }
-
-        if (memcmp(&pSysWarning->WarningCode[i][0], "043628", 6) == 0) { //4g disabled
-            flag[3] = 2;
-            continue;
-        }
-    }
-
-
-    if (flag[0] == 1) {
-        ChangeDisplay2Value(__ethernet_status, _eth_disconnect);
-    } else {
-        ChangeDisplay2Value(__ethernet_status, _eth_connect);
-    }
-
-    //ChangeDisplay2Value(__wifi_status, _disappear);
-    //ChangeDisplay2Value(__conn_status, _disappear);
-    //ChangeDisplay2Value(__3G4G_status, _disappear);
-
-    if (flag[1] == 1) {
-        ChangeDisplay2Value(__3G4G_move_status, _disappear);
-        ChangeDisplay2Value(__wifi_status, _wifi_disconnect);
-    } else if (flag[1] == 2) {
-        ChangeDisplay2Value(__wifi_status, _disappear);
-    } else {
-        ChangeDisplay2Value(__3G4G_move_status, _disappear);
-        ChangeDisplay2Value(__wifi_status, _wifi_connect);
-    }
-
-    if (flag[2] == 1) {
-        ChangeDisplay2Value(__conn_status, _disconnect);
-    } else {
-        ChangeDisplay2Value(__conn_status, _connect);
-    }
-
-    if (flag[1] == 2) {
-        ChangeDisplay2Value(__3G4G_status, _disappear);
-        if (flag[3] == 1) {
-            ChangeDisplay2Value(__3G4G_move_status, _3G4G_disconnect);
-        } else if (flag[3] == 2) {
-            ChangeDisplay2Value(__3G4G_move_status, _disappear);
-        } else {
-            ChangeDisplay2Value(__3G4G_move_status, __3G4G_connect);
-        }
-    } else {
-        if (flag[3] == 1) {
-            ChangeDisplay2Value(__3G4G_status, _3G4G_disconnect);
-        } else if (flag[3] == 2) {
-            ChangeDisplay2Value(__3G4G_status, _disappear);
-        } else {
-            ChangeDisplay2Value(__3G4G_status, __3G4G_connect);
-        }
-    }
-    */
-#else
-// eth
-    if (pSysInfo->ethInternetConn == YES) {
-        ChangeDisplay2Value(__ethernet_status, _ethernet_connect);
-    } else {
-        ChangeDisplay2Value(__ethernet_status, _ethernet_disconnect);
-    }
-
-    // Wifi
-    if ((pSysConfig->ModelName[10] == 'W' ||
-            pSysConfig->ModelName[10] == 'D') &&
-            pSysConfig->AthInterface.WifiMode != _SYS_WIFI_MODE_DISABLE) {
-        if (pSysConfig->AthInterface.WifiNetworkConn == YES ||
-                pSysConfig->AthInterface.WifiMode == _SYS_WIFI_MODE_AP) {
-            ChangeDisplay2Value(__wifi_status, _wifi_connect);
-        } else {
-            ChangeDisplay2Value(__wifi_status, _wifi_disconnect);
-        }
-    } else {
-        ChangeDisplay2Value(__wifi_status, _disappear);
-    }
-
-    if ((pSysConfig->ModelName[10] == 'T' ||
-            pSysConfig->ModelName[10] == 'D') &&
-            pSysConfig->TelecomInterface.TelcomEnabled != NO) {
-        if (pSysConfig->AthInterface.WifiMode == _SYS_WIFI_MODE_DISABLE) {
-            ChangeDisplay2Value(__3G4G_status, _disappear);
-            // 3G/4G
-            if (pSysConfig->TelecomInterface.TelcomNetworkConn == YES)
-            { ChangeDisplay2Value(__3G4G_move_status, _3G4G_disconnect); }
-            else
-            { ChangeDisplay2Value(__3G4G_move_status, _3G4G_disconnect); }
-        } else {
-            ChangeDisplay2Value(__3G4G_move_status, _disappear);
-            // 3G/4G
-            if (pSysConfig->TelecomInterface.TelcomNetworkConn == YES)
-            { ChangeDisplay2Value(__3G4G_status, _3G4G_disconnect); }
-
-            else
-            { ChangeDisplay2Value(__3G4G_status, _3G4G_disconnect); }
-        }
-    } else {
-        ChangeDisplay2Value(__3G4G_status, _disappear);
-
-        ChangeDisplay2Value(__3G4G_move_status, _disappear);
-    }
-
-    // 連線到後台
-    if (pSysInfo->OcppConnStatus == YES) {
-        ChangeDisplay2Value(__conn_status, _connect);
-    } else {
-        ChangeDisplay2Value(__conn_status, _disconnect);
-    }
-
-    /*if (pSysConfig->AthInterface.WifiNetworkConn == YES ||
-            pSysConfig->AthInterface.WifiMode == _SYS_WIFI_MODE_AP) {
-        _wifi_conn_status = true;
-        ChangeDisplay2Value(__wifi_status, _wifi_connect);
-        ChangeDisplay2Value(__ethernet_status, _disappear);
-    } else {
-        _wifi_conn_status = false;
-        ChangeDisplay2Value(__wifi_status, _disappear);
-    }
-
-    if (!_wifi_conn_status) {
-        if (pSysConfig->TelecomInterface.TelcomNetworkConn == YES ||
-                pSysInfo->InternetConn == YES) {
-            ChangeDisplay2Value(__ethernet_status, _ethernet_connect);
-        } else {
-            ChangeDisplay2Value(__ethernet_status, _ethernet_disconnect);
-        }
-    }
-
-    // 連線到後台
-    if (pSysInfo->OcppConnStatus == YES) {
-        ChangeDisplay2Value(__conn_status, _connect);
-    } else {
-        ChangeDisplay2Value(__conn_status, _disconnect);
-    }
-    */
-#endif //defined DD360 || defined DD360Audi
-}
-
-uint8_t FirstPageChanged()
-{
-    uint8_t result = NO;
-
-    if (_currentPage != _oldPage) {
-        result = YES;
-        _oldPage = _currentPage;
-    }
-
-    return result;
-}
-
-bool IsPageReloadChk()
-{
-    bool result = false;
-
-    if (pSysInfo->CurGunSelectedByAc == NO_DEFINE) {
-        if (_curPage_index != pSysInfo->CurGunSelected) {
-            _curPage_index = pSysInfo->CurGunSelected;
-            result = true;
-        }
-    } else {
-        if (_curPage_index != pSysInfo->CurGunSelectedByAc) {
-            _curPage_index = pSysInfo->CurGunSelectedByAc;
-            result = true;
-        }
-    }
-
-    return result;
-}
-
-void ClearDisplayInfo()
-{
-    ChangeDisplay2Value(__csu_ver_string, _disappear);
-    ChangeDisplay2Value(__csu_ver_value, _disappear);
-
-    ChangeDisplay2Value(__eth0_ip_string, _disappear);
-    ChangeDisplay2Value(__eth0_ip_value, _disappear);
-
-    ChangeDisplay2Value(__sn_string, _disappear);
-    ChangeDisplay2Value(__sn_value, _disappear);
-
-    ChangeDisplay2Value(__dc1_ver_string, _disappear);
-    ChangeDisplay2Value(__dc1_ver_value, _disappear);
-
-    ChangeDisplay2Value(__dc2_ver_string, _disappear);
-    ChangeDisplay2Value(__dc2_ver_value, _disappear);
-
-    ChangeDisplay2Value(__fan_speed_string, _disappear);
-    ChangeDisplay2Value(__fan_speed_value, _disappear);
-}
-
-void DisplayInfoCsuVer(bool isShow, uint8_t *modelName)
-{
-    if (isShow) {
-        uint8_t value[10];
-
-        memset(value, 0x00, sizeof(value));
-        strcpy((char *)value, "CSU Ver >");
-        DisplayValueToLcm(__csu_ver_string, value, sizeof(value));
-        memset(value, 0x00, sizeof(value));
-        strncpy((char *)value, (char *)modelName, 5);
-        DisplayValueToLcm(__csu_ver_value, value, sizeof(value));
-    } else {
-        ChangeDisplay2Value(__csu_ver_string, _disappear);
-        ChangeDisplay2Value(__csu_ver_value, _disappear);
-    }
-}
-
-void ShowWifiMode(bool isShow, uint8_t mode)
-{
-    if (isShow) {
-        uint8_t value[20];
-
-        memset(value, 0x00, sizeof(value));
-        strcpy((char *) value, "Wifi Mo. >");
-        DisplayValueToLcm(__csu_ver_string, value, sizeof(value));
-        memset(value, 0x00, sizeof(value));
-        if (mode == 0) {
-            sprintf((char *)value, "disable");
-        } else if (mode == 1) {
-            sprintf((char *)value, "station");
-        } else if (mode == 2) {
-            sprintf((char *)value, "AP");
-        }
-
-        DisplayValueToLcm(__csu_ver_value, value, sizeof(value));
-    } else {
-        ChangeDisplay2Value(__csu_ver_string, _disappear);
-        ChangeDisplay2Value(__csu_ver_value, _disappear);
-    }
-}
-
-void DisplayInfoEthIp(bool isShow, uint8_t *ip)
-{
-    if (isShow) {
-        uint8_t value[20];
-
-        memset(value, 0x00, sizeof(value));
-        strcpy((char *) value, "Eth IP >");
-        DisplayValueToLcm(__eth0_ip_string, value, sizeof(value));
-        memset(value, 0x00, sizeof(value));
-        strcpy((char *) value, (char *) ip);
-        DisplayValueToLcm(__eth0_ip_value, value, sizeof(value));
-    } else {
-        ChangeDisplay2Value(__eth0_ip_string, _disappear);
-        ChangeDisplay2Value(__eth0_ip_value, _disappear);
-    }
-}
-
-void Show4GRssi(bool isShow, int dbValue)
-{
-    if (isShow) {
-        uint8_t value[20];
-
-        memset(value, 0x00, sizeof(value));
-        strcpy((char *) value, "RSSI >");
-        DisplayValueToLcm(__eth0_ip_string, value, sizeof(value));
-        memset(value, 0x00, sizeof(value));
-        sprintf((char *)value, "%d dBm", dbValue);
-        DisplayValueToLcm(__eth0_ip_value, value, sizeof(value));
-    } else {
-        ChangeDisplay2Value(__eth0_ip_string, _disappear);
-        ChangeDisplay2Value(__eth0_ip_value, _disappear);
-    }
-}
-
-void DisplayInfoSN(bool isShow, uint8_t *sn)
-{
-    if (isShow) {
-        uint8_t value[30];
-
-        memset(value, 0x00, sizeof(value));
-        strcpy((char *) value, "SN >");
-        DisplayValueToLcm(__sn_string, value, sizeof(value));
-        memset(value, 0x00, sizeof(value));
-        strcpy((char *) value, (char *) sn);
-        DisplayValueToLcm(__sn_value, value, sizeof(value));
-    } else {
-        ChangeDisplay2Value(__sn_string, _disappear);
-        ChangeDisplay2Value(__sn_value, _disappear);
-    }
-}
-
-void ShowWifiRssi(bool isShow, int dbValue)
-{
-    if (isShow) {
-        uint8_t value[20];
-
-        memset(value, 0x00, sizeof(value));
-        strcpy((char *) value, "RSSI >");
-        DisplayValueToLcm(__sn_string, value, sizeof(value));
-        memset(value, 0x00, sizeof(value));
-        sprintf((char *)value, "%d dBm", dbValue);
-        DisplayValueToLcm(__sn_value, value, sizeof(value));
-    } else {
-        ChangeDisplay2Value(__sn_string, _disappear);
-        ChangeDisplay2Value(__sn_value, _disappear);
-    }
-}
-
-void DisplayInfoGun1Ver(bool isShow, uint8_t *version)
-{
-    if (isShow) {
-        uint8_t value[10];
-
-        memset(value, 0x00, sizeof(value));
-        strcpy((char *) value, "Ct1 Ver >");
-        DisplayValueToLcm(__dc1_ver_string, value, sizeof(value));
-        memset(value, 0x00, sizeof(value));
-        strcpy((char *) value, (char *) version);
-        DisplayValueToLcm(__dc1_ver_value, value, sizeof(value));
-    } else {
-        ChangeDisplay2Value(__dc1_ver_string, _disappear);
-        ChangeDisplay2Value(__dc1_ver_value, _disappear);
-    }
-}
-
-void Show4GMode(bool isShow, uint8_t mode)
-{
-    if (isShow) {
-        uint8_t value[20];
-
-        memset(value, 0x00, sizeof(value));
-        strcpy((char *) value, "3/4G Mo. >");
-        DisplayValueToLcm(__dc1_ver_string, value, sizeof(value));
-        memset(value, 0x00, sizeof(value));
-        if (mode == 0) {
-            sprintf((char *)value, "disable");
-        } else if (mode == 1) {
-            sprintf((char *)value, "enable");
-        }
-
-        DisplayValueToLcm(__dc1_ver_value, value, sizeof(value));
-    } else {
-        ChangeDisplay2Value(__dc1_ver_string, _disappear);
-        ChangeDisplay2Value(__dc1_ver_value, _disappear);
-    }
-}
-
-void DisplayInfoGun2Ver(bool isShow, uint8_t *version)
-{
-    if (isShow) {
-        uint8_t value[10];
-
-        memset(value, 0x00, sizeof(value));
-        strcpy((char *) value, "Ct2 Ver >");
-        DisplayValueToLcm(__dc2_ver_string, value, sizeof(value));
-        memset(value, 0x00, sizeof(value));
-        strcpy((char *) value, (char *) version);
-        DisplayValueToLcm(__dc2_ver_value, value, sizeof(value));
-    } else {
-        ChangeDisplay2Value(__dc2_ver_string, _disappear);
-        ChangeDisplay2Value(__dc2_ver_value, _disappear);
-    }
-}
-
-void Show4GIP(bool isShow, uint8_t *ip)
-{
-    if (isShow) {
-        uint8_t value[20];
-
-        memset(value, 0x00, sizeof(value));
-        strcpy((char *) value, "3/4G IP >");
-        DisplayValueToLcm(__dc2_ver_string, value, sizeof(value));
-        memset(value, 0x00, sizeof(value));
-        strcpy((char *) value, (char *) ip);
-        DisplayValueToLcm(__dc2_ver_value, value, sizeof(value));
-    } else {
-        ChangeDisplay2Value(__dc2_ver_string, _disappear);
-        ChangeDisplay2Value(__dc2_ver_value, _disappear);
-    }
-}
-
-void DisplayInfoSpeed(bool isShow, unsigned int fan)
-{
-    if (isShow) {
-        uint8_t value[10];
-
-        memset(value, 0x00, sizeof(value));
-        strcpy((char *) value, "Fan Spd >");
-        DisplayValueToLcm(__fan_speed_string, value, sizeof(value));
-        memset(value, 0x00, sizeof(value));
-        sprintf((char *)value, "%d", fan);
-        DisplayValueToLcm(__fan_speed_value, value, sizeof(value));
-    } else {
-        ChangeDisplay2Value(__fan_speed_string, _disappear);
-        ChangeDisplay2Value(__fan_speed_value, _disappear);
-    }
-}
-
-void ShowWifiIP(bool isShow, uint8_t *ip)
-{
-    if (isShow) {
-        uint8_t value[20];
-
-        memset(value, 0x00, sizeof(value));
-        strcpy((char *) value, "Wifi IP >");
-        DisplayValueToLcm(__fan_speed_string, value, sizeof(value));
-        memset(value, 0x00, sizeof(value));
-        strcpy((char *) value, (char *) ip);
-        DisplayValueToLcm(__fan_speed_value, value, sizeof(value));
-    } else {
-        ChangeDisplay2Value(__fan_speed_string, _disappear);
-        ChangeDisplay2Value(__fan_speed_value, _disappear);
-    }
-}
-
-void InformationShow()
-{
-    if (pSysConfig->ShowInformation == YES) {
-        bool show = _isShow = true;
-        if (_showInformIndex == 0) {
-            DisplayInfoCsuVer(show, pSysInfo->CsuRootFsFwRev);
-            DisplayInfoSpeed(show, pSysInfo->SystemFanRotaSpeed);
-            DisplayInfoSN(show, pSysConfig->SerialNumber);
-
-            DisplayInfoEthIp(show, pSysConfig->Eth0Interface.EthIpAddress);
-            DisplayInfoGun1Ver(show, pSysInfo->Connector1FwRev);
-            if (_totalCount > 1) {
-                DisplayInfoGun2Ver(show, pSysInfo->Connector2FwRev);
-            } else {
-                DisplayInfoGun2Ver(false, pSysInfo->Connector2FwRev);
-            }
-        } else if (_showInformIndex == 1) {
-            ShowWifiMode(show, pSysConfig->AthInterface.WifiMode);
-            ShowWifiIP(show, pSysConfig->AthInterface.WifiIpAddress);
-            ShowWifiRssi(show, pSysConfig->AthInterface.WifiRssi);
-
-            Show4GMode(show, pSysConfig->TelecomInterface.TelcomEnabled);
-            Show4GIP(show, pSysConfig->TelecomInterface.TelcomIpAddress);
-            Show4GRssi(show, pSysConfig->TelecomInterface.TelcomRssi);
-        }
-    } else {
-        ClearDisplayInfo();
-
-        if (_isShow) {
-            _isShow = false;
-            _showInformIndex++;
-            if (_showInformIndex >= 2) {
-                _showInformIndex = 0;
-            }
-        }
-    }
-}
-
-void ProcessPageInfo()
-{
-    _page_reload = IsPageReloadChk();
-    pAcChargingInfo = (struct ChargingInfoData *)GetAcChargingInfoData(0);
-    struct InfoCodeData *pInfoCode = (struct InfoCodeData *)GetShmInfoCodeData();
-    struct AlarmCodeData *pAlarmCode = (struct AlarmCodeData *)GetShmAlarmCodeData();
-    uint8_t i;
-
-    // 隨插即充 - 可省略該按鈕 //DS60-120 add
-    if (pSysConfig->AuthorisationMode == AUTH_MODE_ENABLE) {
-        ChangeDisplay2Value(__ret_home_btn, _back_home_btn);
-        if (_totalCount >= 2 && pSysInfo->IsAlternatvieConf == NO) {
-            ChangeDisplay2Value(__sel_gun_btn, _sel_gun_btn);
-        } else {
-            ChangeDisplay2Value(__sel_gun_btn, _disappear);
-        }
-    }
-
-    switch (_currentPage) {
-#if defined DD360Audi
-    case _LCM_SELECT_GUN: ////For Audi
-        if (pSysInfo->CurGunSelected == 0) {
-            ChangeDisplay2Value(__left_gun_map, _left_gun_enable_map);
-            ChangeDisplay2Value(__right_gun_map, _right_gun_disable_map);
-        } else if (pSysInfo->CurGunSelected == 1) {
-            ChangeDisplay2Value(__left_gun_map, _left_gun_disable_map);
-            ChangeDisplay2Value(__right_gun_map, _right_gun_enable_map);
-        }
-        ChangeDisplay2Value(__add_chk_btn, _select_gun_btn);
-        break;
-#endif //defined DD360Audi
-
-    case _LCM_IDLE: {
-        if (pSysConfig->isRFID) {
-            ChangeDisplay2Value(__main_rfid, _main_rfid);
-        } else {
-            ChangeDisplay2Value(__main_rfid, _main_none_rfid);
-        }
-
-        if (pSysConfig->isQRCode) {
-            ChangeDisplay2Value(__main_qr, _main_qr);
-        } else {
-            ChangeDisplay2Value(__qr_code, _disappear);
-            ChangeDisplay2Value(__main_qr, _main_none_qr);
-            needReloadQr = true;
-        }
-
-        if (pSysConfig->isAPP) {
-            ChangeDisplay2Value(__main_app, _main_app);
-        } else {
-            ChangeDisplay2Value(__main_app, _main_none_app);
-        }
-#if defined DD360Audi
-        if(pSysInfo->CurGunSelected == LEFT_GUN_NUM )
-            ChangeDisplay2Value(__show_selectgun_value, _showselectgun_left);
-        else if (pSysInfo->CurGunSelected == RIGHT_GUN_NUM )
-            ChangeDisplay2Value(__show_selectgun_value, _showselectgun_right);
-#endif
-        //if (FirstPageChanged() == YES || needReloadQr || _page_reload) {
-        if (pSysConfig->isQRCode) {
-            needReloadQr = false;
-            if (pSysConfig->QRCodeMadeMode == NO) {
-                //uint8_t len = strlen((char *)pSysConfig->SystemId);
-                ChangeQrCode_Idle((char *)pSysConfig->SystemId);
-            } else {
-                //uint8_t len = strlen((char *)pSysConfig->QRCodeContent);
-                ChangeQrCode_Idle((char *)pSysConfig->QRCodeContent);
-            }
-            //ChangeQrCode_Idle((char *)pSysConfig->SystemId);
-        }
-        //}
-
-        //DS60-120 add
-        bool isCharging = false;
-        for (uint8_t i = 0; i < _totalCount; i++) {
-            pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(i);
-
-            if (pDcChargingInfo->SystemStatus == S_IDLE) {
-                continue;
-            }
-
-            isCharging = true;
-            break;
-        }
-        if (isCharging && pSysInfo->IsAlternatvieConf == NO) {
-            ChangeDisplay2Value(__sel_gun_btn, _sel_gun_btn);
-        } else {
-            ChangeDisplay2Value(__sel_gun_btn, _disappear);
-        }
-    }
-    break;
-    case _LCM_AUTHORIZING:
-    case _LCM_AUTHORIZ_COMP:
-    case _LCM_AUTHORIZ_FAIL: {
-        //case _LCM_WAIT_FOR_PLUG: {
-        FirstPageChanged();
-#if defined DD360Audi
-        if (_currentPage == _LCM_AUTHORIZ_COMP) { ////For Audi
-            ChangeBalanceValue(__balance, pSysInfo->CurGunSelected);
-        }
-#endif //defined DD360Audi
-    }
-    break;
-    case _LCM_WAIT_FOR_PLUG: {
- #if defined DD360Audi
-        if(pSysInfo->CurGunSelected == LEFT_GUN_NUM )
-            ChangeDisplay2Value(__show_waitgunplug_value, _showwaitgunplug_left);
-        else if (pSysInfo->CurGunSelected == RIGHT_GUN_NUM )
-            ChangeDisplay2Value(__show_waitgunplug_value, _showwaitgunplug_right);
-#endif
-        FirstPageChanged();
-        if (pSysConfig->AuthorisationMode == AUTH_MODE_DISABLE) {
-            // 新增隨插即充功能預設在等待插槍頁面在開啟
-            ChangeDisplay2Value(__ret_home_btn, _disappear);
-            bool isCharging = false;
-            for (uint8_t i = 0; i < _totalCount; i++) {
-                pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(i);
-
-                if (pDcChargingInfo->SystemStatus == S_IDLE) {
-                    continue;
-                }
-
-                isCharging = true;
-                break;
-            }
-
-            if (isCharging && pSysInfo->IsAlternatvieConf == NO) {
-                ChangeDisplay2Value(__sel_gun_btn, _sel_gun_btn);
-            } else {
-                ChangeDisplay2Value(__sel_gun_btn, _disappear);
-            }
-        } else {
-            ChangeDisplay2Value(__sel_gun_btn, _disappear);
-        }
-    }
-    break;
-    case _LCM_PRE_CHARGE:
-    case _LCM_CHARGING:
-    case _LCM_COMPLETE: {
-        bool isShowAc = false;
-        uint8_t gunTargetIndex = 0;
-
-        if (acgunCount > 0) {
-            gunTargetIndex = 2;
-            if (pSysInfo->CurGunSelectedByAc != NO_DEFINE) {
-                isShowAc = true;
-                //ChangeDisplay2Value(__gun_type_index + (2 * 2), _actype_light); //DS60-120 remove
-                if (_currentPage == _LCM_COMPLETE) {
-                    ChangeDisplay2Value(__cmp_gun_type_index + (gunTargetIndex * 2), _actype_light_cmp);
-                } else {
-                    ChangeDisplay2Value(__gun_type_index + (gunTargetIndex * 2), _actype_light);
-                }
-
-                if (_currentPage == _LCM_CHARGING) {
-                    ChangeAcBattMapAndValue(_LCM_CHARGING);
-                    if (pAcChargingInfo->PresentChargedDuration >= 0 &&
-                            pAcChargingInfo->PresentChargedDuration <= TIME_MAX_SEC) {
-                        ChangeRemainTime(pAcChargingInfo->PresentChargedDuration);
-                    } else {
-                        ChangeRemainTime(0);
-                    }
-
-                    if (pAcChargingInfo->PresentChargingPower >= 0.1 &&
-                            pAcChargingInfo->PresentChargingPower <= POWER_MAX_KW) {
-                        ChangeChargingPowerValue(pAcChargingInfo->PresentChargingPower);
-                    } else {
-                        ChangeChargingPowerValue(0);
-                    }
-
-                    if (pAcChargingInfo->PresentChargedEnergy >= 0.1 &&
-                            pAcChargingInfo->PresentChargedEnergy <= ENERGY_MAX_KWH) {
-                        ChangeChargingEnergyValue(pAcChargingInfo->PresentChargedEnergy);
-                    } else {
-                        ChangeChargingEnergyValue(0);
-                    }
-
-                    if (strcmp((char *)pAcChargingInfo->StartUserId, "") == 0 ||
-                            pSysConfig->StopChargingByButton == YES) {
-                        ChangeDisplay2Value(__stop_method_btn, _stop_charging_btn);
-                    } else {
-                        ChangeDisplay2Value(__stop_method_btn, _stop_charging_btn_scan);
-                    }
-                } else if (_currentPage == _LCM_COMPLETE) {
-                    ChangeAcBattMapAndValue(_LCM_COMPLETE);
-                    if (pAcChargingInfo->PresentChargedDuration >= 0 &&
-                            pAcChargingInfo->PresentChargedDuration <= TIME_MAX_SEC) {
-                        ChangeRemainTime(pAcChargingInfo->PresentChargedDuration);
-                    } else {
-                        ChangeRemainTime(0);
-                    }
-
-                    if (pAcChargingInfo->PresentChargingPower >= 0.1 &&
-                            pAcChargingInfo->PresentChargingPower <= POWER_MAX_KW) {
-                        ChangeChargingPowerValue(pAcChargingInfo->PresentChargingPower);
-                    } else {
-                        ChangeChargingPowerValue(0);
-                    }
-
-                    if (pAcChargingInfo->PresentChargedEnergy >= 0.1 &&
-                            pAcChargingInfo->PresentChargedEnergy <= ENERGY_MAX_KWH) {
-                        ChangeChargingEnergyValue(pAcChargingInfo->PresentChargedEnergy);
-
-                        if (pSysConfig->BillingData.isBilling &&
-                                pAcChargingInfo->ChargingFee >= 0) {
-                            ChangeChargingFeeValue(pAcChargingInfo->ChargingFee);
-                        }
-                    } else {
-                        ChangeChargingEnergyValue(0);
-                        if (pSysConfig->BillingData.isBilling) {
-                            ChangeChargingFeeValue(0);
-                        }
-                    }
-
-                    if (!pSysConfig->BillingData.isBilling) {
-                        ChangeDisplay2Value(__charging_fee_map, _disappear);
-                        ChangeDisplay2Value(__charging_fee_tx, _disappear);
-                    } else {
-                        ChangeDisplay2Value(__charging_fee_map, _money_map);
-                    }
-                }
-            } else {
-                //ChangeDisplay2Value(__gun_type_index + (2 * 2), _actype_dark); //DS60-120 remove
-                if (_currentPage == _LCM_COMPLETE) {
-                    ChangeDisplay2Value(__cmp_gun_type_index + (gunTargetIndex * 2), _actype_dark_cmp);
-                } else {
-                    ChangeDisplay2Value(__gun_type_index + (gunTargetIndex * 2), _actype_dark);
-                }
-            }
-        } else {
-            //ChangeDisplay2Value(__gun_type_index + (2 * 2), _disappear); //DS60-120 remove
-            if (_totalCount > 1) {
-                gunTargetIndex = 2;
-                ChangeDisplay2Value(__cmp_gun_type_index + (gunTargetIndex * 2), _disappear);
-                ChangeDisplay2Value(__gun_type_index + (gunTargetIndex * 2), _disappear);
-            }
-        }
-
-        gunTargetIndex = 0; //DS60-120 add
-        for (uint8_t i = 0; i < _totalCount; i++) {
-            if (_totalCount == 1 && acgunCount <= 0) { //DS60-120 add
-                gunTargetIndex = 2;
-            } else {
-                gunTargetIndex = i;
-            }
-
-            pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(i);
-
-            switch (pDcChargingInfo->Type) {
-            case _Type_Chademo: {
-                if (pSysInfo->CurGunSelected == i && !isShowAc) {
-                    if (_currentPage == _LCM_COMPLETE) {
-                        ChangeDisplay2Value(__cmp_gun_type_index + (i * 2), _chademo_light_cmp);
-                    } else {
-                        ChangeDisplay2Value(__gun_type_index + (i * 2), _chademo_light);
-                    }
-                } else {
-                    if (_currentPage == _LCM_COMPLETE) {
-                        ChangeDisplay2Value(__cmp_gun_type_index + (i * 2), _chademo_dark_cmp);
-                    } else {
-                        ChangeDisplay2Value(__gun_type_index + (i * 2), _chademo_dark);
-                    }
-                }
-            }
-            break;
-            case _Type_GB: {
-                if (pSysInfo->CurGunSelected == i && !isShowAc) {
-                    if (_currentPage == _LCM_COMPLETE) {
-                        ChangeDisplay2Value(__cmp_gun_type_index + (i * 2), _gbt_light_cmp);
-                    } else {
-                        ChangeDisplay2Value(__gun_type_index + (i * 2), _gbt_light);
-                    }
-                } else {
-                    if (_currentPage == _LCM_COMPLETE) {
-                        ChangeDisplay2Value(__cmp_gun_type_index + (i * 2), _gbt_dark_cmp);
-                    } else {
-                        ChangeDisplay2Value(__gun_type_index + (i * 2), _gbt_dark);
-                    }
-                }
-            }
-            break;
-            case _Type_CCS_2: {
-                if (pSysInfo->CurGunSelected == i && !isShowAc) {
-                    if (_currentPage == _LCM_COMPLETE) {
-                        ChangeDisplay2Value(__cmp_gun_type_index + (i * 2), _ccs_light_cmp);
-                    } else {
-                        ChangeDisplay2Value(__gun_type_index + (i * 2), _ccs_light);
-                    }
-                } else {
-                    if (_currentPage == _LCM_COMPLETE) {
-                        ChangeDisplay2Value(__cmp_gun_type_index + (i * 2), _ccs_dark_cmp);
-                    } else {
-                        ChangeDisplay2Value(__gun_type_index + (i * 2), _ccs_dark);
-                    }
-                }
-            }
-            break;
-            }
-
-            if (_currentPage == _LCM_PRE_CHARGE && !isShowAc) {
-                if (pSysInfo->CurGunSelected == i) {
-                    ChangeBattMapAndValue(_currentPage, pDcChargingInfo->EvBatterySoc);
-                }
-            } else if (_currentPage == _LCM_CHARGING && !isShowAc) {
-                if (pSysInfo->CurGunSelected == i) {
-                    ChangeBattMapAndValue(_LCM_CHARGING, pDcChargingInfo->EvBatterySoc);
-                    if (pDcChargingInfo->PresentChargedDuration >= 0 &&
-                            pDcChargingInfo->PresentChargedDuration <= TIME_MAX_SEC) {
-                        ChangeRemainTime(pDcChargingInfo->PresentChargedDuration);
-                    } else {
-                        ChangeRemainTime(0);
-                    }
-
-                    if (pDcChargingInfo->PresentChargingPower >= 0 &&
-                            pDcChargingInfo->PresentChargingPower <= POWER_MAX_KW) {
-                        ChangeChargingPowerValue(pDcChargingInfo->PresentChargingPower);
-                    } else {
-                        ChangeChargingPowerValue(0);
-                    }
-
-                    if (pDcChargingInfo->PresentChargedEnergy >= 0.1 &&
-                            pDcChargingInfo->PresentChargedEnergy <= ENERGY_MAX_KWH) {
-                        ChangeChargingEnergyValue(pDcChargingInfo->PresentChargedEnergy);
-                    } else {
-                        ChangeChargingEnergyValue(0);
-                    }
-
-                    if (strcmp((char *)pDcChargingInfo->StartUserId, "") == 0 ||
-                            pSysConfig->StopChargingByButton == YES) {
-                        ChangeDisplay2Value(__stop_method_btn, _stop_charging_btn);
-                    } else {
-                        ChangeDisplay2Value(__stop_method_btn, _stop_charging_btn_scan);
-                    }
-                }
-            } else if (_currentPage == _LCM_COMPLETE && !isShowAc) {
-                if (pSysInfo->CurGunSelected == i) {
-                    ChangeBattMapAndValue(_LCM_COMPLETE, pDcChargingInfo->EvBatterySoc);
-                    if (pDcChargingInfo->PresentChargedDuration >= 0 &&
-                            pDcChargingInfo->PresentChargedDuration <= TIME_MAX_SEC) {
-                        ChangeRemainTime(pDcChargingInfo->PresentChargedDuration);
-                    } else {
-                        ChangeRemainTime(0);
-                    }
-
-                    if (pDcChargingInfo->PresentChargingPower >= 0 &&
-                            pDcChargingInfo->PresentChargingPower <= POWER_MAX_KW) {
-                        ChangeChargingPowerValue(pDcChargingInfo->PresentChargingPower);
-                    } else {
-                        ChangeChargingPowerValue(0);
-                    }
-#if 1
-                    if (pDcChargingInfo->PresentChargedEnergy >= 0.1 &&
-                            pDcChargingInfo->PresentChargedEnergy <= ENERGY_MAX_KWH) {
-                        ChangeChargingEnergyValue(pDcChargingInfo->PresentChargedEnergy);
-
-                        if (pSysConfig->BillingData.isBilling &&
-                                pDcChargingInfo->ChargingFee >= 0) {
-                            ChangeChargingFeeValue(pDcChargingInfo->ChargingFee);
-                            ChangeBalanceValue(__remain_balance, i);
-                        }
-                    } else {
-                        ChangeChargingEnergyValue(0);
-                        if (pSysConfig->BillingData.isBilling) {
-                            ChangeChargingFeeValue(0);
-                            ChangeBalanceValue(__remain_balance, i);
-                        }
-                    }
-#else
-                    ChangeChargingEnergyValue(pDcChargingInfo->PresentChargedEnergy);
-
-                    if (pSysConfig->BillingData.isBilling &&
-                            pDcChargingInfo->ChargingFee >= 0) {
-                        ChangeChargingFeeValue(pDcChargingInfo->ChargingFee);
-                        ChangeBalanceValue(__remain_balance, i);
-                    }
-#endif // 0
-                    if (!pSysConfig->BillingData.isBilling) {
-                        ChangeDisplay2Value(__charging_fee_map, _disappear);
-                        ChangeDisplay2Value(__charging_fee_tx, _disappear);
-                    } else {
-                        ChangeDisplay2Value(__charging_fee_map, _money_map);
-                    }
-#ifdef DD360Audi
-                    // Warming Occur in prepare or precharing state, turn into complete mode
-                    if (pInfoCode->InfoEvents.bits.Stop_by_EV_with_unknow_reason) {
-                        RunFullTargetFunction(true);
-                    } else {
-                        RunFullTargetFunction(false);
-                        if (pDcChargingInfo->Replug_flag) {
-                            RunReplugStringFunction(true);
-                        } else {
-                            RunReplugStringFunction(false);
-                        }
-                    }
-#endif					
-                }
-            }
-        }
-
-        // gun btn and QR code
-        if (_totalCount + acgunCount >= 2 && _currentPage) {
-            uint8_t index = 0;
-            for (index = 0; index < _totalCount; index++) {
-                if (pSysInfo->CurGunSelected != index) {
-                    break;
-                }
-            }
-
-            pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(index);
-
-            if (pDcChargingInfo->SystemStatus == S_IDLE ||
-                    pDcChargingInfo->SystemStatus == S_RESERVATION ||
-                    pDcChargingInfo->SystemStatus == S_BOOTING) {
-                if (FirstPageChanged() == YES || needReloadQr || _page_reload) {
-                    if (pSysConfig->isQRCode) {
-                        needReloadQr = false;
-                        //ChangeQrCode_Charge((char *)pSysConfig->SystemId); //DS60-120 remove
-                        if (pSysConfig->QRCodeMadeMode == NO) {
-                            //uint8_t len = strlen((char *)pSysConfig->SystemId);
-                            ChangeQrCode_Charge((char *)pSysConfig->SystemId);
-                        } else {
-                            //uint8_t len = strlen((char *)pSysConfig->QRCodeContent);
-                            ChangeQrCode_Charge((char *)pSysConfig->QRCodeContent);
-                        }
-                    }
-                }
-            }
-        }
-    }
-    break;
-    case _LCM_FIX:
-#if defined DD360Audi
-        // For Emergency Button
-        if (ShmPrimaryMcuData->InputDet.bits.EmergencyButton == 1) {
-            ChangeToOtherPage(_LCM_EMERGENCY);
-            break;
-        }
-        // For Network Disconnect
-        for (i = 0; i < pSysWarning->WarningCount; i++) {
-            if (memcmp(&pSysWarning->WarningCode[i][0], "012304", 6) == 0 || 
-                memcmp(&pSysWarning->WarningCode[i][0], "042304", 6) == 0) {
-                ChangeToOtherPage(_LCM_DISCONNECT);
-            break;
-            }
-        }
-#endif
-
-        break;
-    }
-}
-
-void ChangeDisplayMoneyInfo()
-{
-    uint8_t curGun = pSysInfo->CurGunSelected;
-
-    if (pSysConfig->BillingData.isBilling) {
-        struct timeb csuTime;
-        struct tm *tmCSU;
-
-        ftime(&csuTime);
-        tmCSU = localtime(&csuTime.time);
-
-        ChangeDisplay2Value(__money_rate_map, _charging_money);
-#if defined DD360Audi
-        if (ShmSelectGunInfo->PricesInfo[curGun].UserPrices != 0.00) { //Jerry add
-            DisplayMoneyRate(ShmSelectGunInfo->PricesInfo[curGun].UserPrices);
-        } else {
-#endif //defined DD360Audi
-            if (tmCSU->tm_hour <= 23) {
-                pSysConfig->BillingData.Cur_fee = pSysConfig->BillingData.Fee[tmCSU->tm_hour];
-                DisplayMoneyRate(pSysConfig->BillingData.Cur_fee);
-            }
-
-            if (pSysConfig->BillingData.Currency <= 53) {
-                DisplayMoneyCur((uint8_t *)GetCurrency(pSysConfig->BillingData.Currency));
-            }
-#if defined DD360Audi
-        }
-#endif //defined DD360Audi
-    } else {
-        ChangeDisplay2Value(__money_rate_map, _disappear);
-        ChangeDisplay2Value(__money_by_rate, _disappear);
-        ChangeDisplay2Value(__money_rate, _disappear);
-    }
-}
-
-/*void Initialization()
-{
-    bool isPass = false;
-    uint8_t count = 5;
-    while (!isPass && count > 0) {
-        isPass = true;
-        for (uint8_t _index = 0; _index < _totalCount; _index++) {
-            if (!FindChargingInfoData(_index, &_chargingInfoData[0])) {
-                log_error("LcmComm (main) : FindChargingInfoData false ");
-                isPass = false;
-                count--;
-                break;
-            }
-        }
-
-        sleep(1);
-    }
-
-    isPass = false;
-
-    if (acgunCount > 0) {
-        while (!isPass) {
-            isPass = true;
-            for (uint8_t _index = 0; _index < acgunCount; _index++) {
-                if (!FindAcChargingInfoData(_index, &ac_chargingInfo[0])) {
-                    log_error("LcmComm : FindAcChargingInfoData false ");
-                    isPass = false;
-                    break;
-                }
-            }
-
-            sleep(1);
-        }
-    }
-
-    if (count == 0) {
-        log_info("LCM Initialization Gun Fail.............");
-    }
-}
-*/
-
-//DS60-120 add
-void DefaultIconStatus()
-{
-    for (uint8_t i = 0; i < 3; i++) {
-        ChangeDisplay2Value(__gun_type_index + (i * 2), _disappear);
-    }
-
-    if (pSysInfo->IsAlternatvieConf == YES || _totalCount == 1) {
-        ChangeDisplay2Value(__sel_gun_btn, _disappear);
-    } else {
-        ChangeDisplay2Value(__sel_gun_btn, _sel_gun_btn);
-    }
-}
-
-int main(void)
-{
-
-    //if (InitShareMemory() == FAIL) {
-    //    log_error("InitShareMemory NG");
-    //
-    //    if (ShmStatusCodeData != NULL) {
-    //        ShmStatusCodeData->AlarmCode.AlarmEvents.bits.FailToCreateShareMemory = 1;
-    //    }
-    //    sleep(5);
-    //    return 0;
-    //}
-
-    if (CreateAllCsuShareMemory() == FAIL) {
-        log_error("create share memory error");
-        return FAIL;
-    }
-
-    MappingGunChargingInfo("LCM Control Task");
-
-    pSysConfig = (struct SysConfigData *)GetShmSysConfigData();
-    pSysInfo = (struct SysInfoData *)GetShmSysInfoData();
-    pSysWarning = (struct WARNING_CODE_INFO *)GetShmSysWarningInfo();
-    ShmFanModuleData = (struct FanModuleData *)GetShmFanModuleData();;
-    ShmPrimaryMcuData = (struct PrimaryMcuData *)GetShmPrimaryMcuData();
-    ShmSelectGunInfo = (SelectGunInfo *)GetShmSelectGunInfo();
-    struct StatusCodeData *ShmStatusCodeData = (struct StatusCodeData *)GetShmStatusCodeData();;
- 
-
-    _port = CreateCommunicationLcmPort();
-    uint8_t changeWarningPriority = 0;
-    uint8_t curWarningCount = 255;
-    ChangeBackLight(true);
-    _totalCount = pSysConfig->TotalConnectorCount;
-    acgunCount = pSysConfig->AcConnectorCount;
-    //Initialization();
-
-    //printf("_LCM_COMPLETE ");
-    //ChangeToOtherPage(_LCM_COMPLETE);
-    //return 0;
-
-    for (uint8_t i = 0; i < 3; i++) {
-        ChangeDisplay2Value(__gun_type_index + (i * 2), _disappear);
-    }
-
-    DefaultIconStatus(); //DS60-120 add
-
-    while (_port != -1) {
-        if (strcmp((char *)pSysInfo->LcmHwRev, moduleName) != 0x00) {
-            GetCurrentPage();
-            sleep(1);
-#ifndef DD360ComBox
-            ShmStatusCodeData->AlarmCode.AlarmEvents.bits.LcmModuleCommFail = true;
-#endif
-
-        } else {
-            //DemoFunction();
-#ifndef DD360ComBox
-            ShmStatusCodeData->AlarmCode.AlarmEvents.bits.LcmModuleCommFail = false;
-#endif
-
-            // Warning 處理
-            if (curWarningCount != pSysWarning->WarningCount) {
-                changeWarningPriority = 0;
-                pSysWarning->PageIndex = 0;
-                curWarningCount = pSysWarning->WarningCount;
-                ChangeWarningFunc();
-            } else if (pSysWarning->WarningCount > 5 && changeWarningPriority == 0) {
-                // 當有兩頁 Warning 則每隔三秒改變一次
-                if (pSysWarning->PageIndex == 0) {
-                    pSysWarning->PageIndex = 1;
-                } else {
-                    pSysWarning->PageIndex = 0;
-                }
-
-                ChangeWarningFunc();
-            }
-            // 頁面資訊處理
-            ProcessPageInfo();
-
-            // 網路 - wifi - 連線訊號處理
-            RefreshConnStatus();
-
-            // 換頁處理
-            GetCurrentPage(); //DS60-120 add
-            ChangeCurPage();
-
-            RefreshPageAnimation(_everyPageRollChange);
-
-#if defined DD360Audi
-            ChangeDisplayMoneyInfo();
-#else
-            if (changeWarningPriority == 0) { ////For Audi
-                ChangeDisplayMoneyInfo();
-                InformationShow();
-            }
-#endif //defined DD360Audi
-
-            changeWarningPriority >= 15 ? (_battery_display_ani = true) : (_battery_display_ani = false);
-            changeWarningPriority >= 30 ? changeWarningPriority = 0 : changeWarningPriority++;
-            usleep(100000);
-        }
-    }
-
-#ifndef DD360ComBox
-    ShmStatusCodeData->AlarmCode.AlarmEvents.bits.LcmModuleCommFail = true;
-#endif
-    log_info("Close LCM Uart Port");
-    CloseCommunicationLcmPort();
-
-    return FAIL;
-}

+ 0 - 2339
EVSE/Projects/DD360Tcci/Apps/ModuleLcmCtrl/Module_LcmControl.c.test

@@ -1,2339 +0,0 @@
-#include "Module_LcmControl.h"
-#include "../Log/log.h"
-//#include "cbmp.h"
-
-#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
-
-bool needReloadQr = true;
-
-bool _isShow = false;
-byte _showInformIndex = 0;
-
-byte _btn_pressed = 0xF0;
-
-void PRINTF_FUNC(char *string, ...);
-
-//int StoreLogMsg(const char *fmt, ...);
-//#define DEBUG_INFO(format, args...) StoreLogMsg("[%s:%d][%s][Info] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
-//#define DEBUG_WARN(format, args...) StoreLogMsg("[%s:%d][%s][Warn] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
-//#define DEBUG_ERROR(format, args...) StoreLogMsg("[%s:%d][%s][Error] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
-
-char* getTimeString(void);
-struct SysInfoData *pSysInfo = NULL;
-static struct SysConfigData *pSysConfig = NULL;
-//=================================
-// Common routine
-//=================================
-#if 0
-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 (ShmSysConfigAndInfo->SysConfig.SwitchDebugFlag == YES)
-	{
-		sprintf(Buf,"%02d:%02d:%02d:%03d - %s",
-			tm->tm_hour,tm->tm_min,tm->tm_sec,SeqEndTime.millitm, buffer);
-		printf("%s \n", Buf);
-	}
-	else
-	{
-		sprintf(Buf,"echo \"%04d-%02d-%02d %02d:%02d:%02d:%03d - %s\" >> /Storage/SystemLog/[%04d.%02d]SystemLog_%s",
-			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,
-			ShmSysConfigAndInfo->SysConfig.SerialNumber);
-		system(Buf);
-	}
-
-	return rc;
-}
-#endif
-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;
-}
-
-void PRINTF_FUNC(char *string, ...)
-{
-	va_list args;
-	char buffer[4096];
-	va_start(args, string);
-	vsnprintf(buffer, sizeof(buffer), string, args);
-	va_end(args);
-
-	log_info("%s ", buffer);
-}
-
-//==========================================
-// Init all share memory
-//==========================================
-int InitShareMemory()
-{
-	int result = PASS;
-	int MeterSMId;
-
-	//creat ShmSysConfigAndInfo
-	if ((MeterSMId = shmget(ShmSysConfigAndInfoKey, sizeof(struct SysConfigAndInfo),  0777)) < 0)
-    {
-		#ifdef SystemLogMessage
-		log_error("shmget ShmSysConfigAndInfo NG\n");
-		#endif
-		result = FAIL;
-	}
-    else if ((ShmSysConfigAndInfo = shmat(MeterSMId, NULL, 0)) == (void *) -1)
-    {
-    	#ifdef SystemLogMessage
-    	log_error("shmat ShmSysConfigAndInfo NG\n");
-		#endif
-    	result = FAIL;
-   	}
-
-   	//creat ShmStatusCodeData
-   	if ((MeterSMId = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData),  0777)) < 0)
-    {
-		#ifdef SystemLogMessage
-   		log_error("shmget ShmStatusCodeData NG\n");
-		#endif
-   		result = FAIL;
-	}
-    else if ((ShmStatusCodeData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
-    {
-    	#ifdef SystemLogMessage
-    	log_error("shmat ShmStatusCodeData NG\n");
-		#endif
-    	result = FAIL;
-   	}
-/*
- 	if ((MeterSMId = shmget(ShmCommonKey, sizeof(struct DcCommonInformation), IPC_CREAT | 0777)) < 0)
-    {
-    	#ifdef SystemLogMessage
-    	log_error("shmget ShmCommonKey NG \n");
-    	#endif
-    	return 0;
-    }
-    else if ((ShmDcCommonData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
-    {
-    	#ifdef SystemLogMessage
-    	log_error("shmat ShmCommonKey NG \n");
-    	#endif
-    	return 0;
-    }
-*/
-    return result;
-}
-
-//==========================================
-// Open and Close RS232 and R/W
-//==========================================
-int CreateCommunicationLcmPort()
-{
-	int fd;
-	struct termios tios;
-
-	fd = open(pPortName, O_RDWR);
-	if (fd <= 0) {
-		#ifdef SystemLogMessage
-		log_error("open /dev/ttyS3 NG \n");
-		#endif
-		return -1;
-	}
-	ioctl(fd, TCGETS, &tios);
-	tios.c_cflag = B115200 | CS8 | CLOCAL | CREAD;
-	tios.c_lflag = 0;
-	tios.c_iflag = 0;
-	tios.c_oflag = 0;
-	tios.c_cc[VMIN] = 0;
-	tios.c_cc[VTIME] = (unsigned char) 5;
-	tios.c_lflag = 0;
-	tcflush(fd, TCIFLUSH);
-	ioctl(fd, TCSETS, &tios);
-
-	return fd;
-}
-
-void CloseCommunicationLcmPort()
-{
-	close(Uart1Fd);
-}
-
-void WriteCmdToLcm(byte *cmd, byte cmdLen)
-{
-	int len = write(Uart1Fd, cmd, cmdLen);
-	if(len >= sizeof(cmd))
-	{
-		//PRINTF_FUNC("Write cmd to LCM successfully. \n");
-	}
-}
-
-void ReadMsgFromLcm(byte *msg, byte readLen)
-{
-	read(Uart1Fd, msg, readLen);
-
-//	5a : CMD_TITLE_1
-//	a5 : CMD_TITLE_2
-//	5
-//	81 : CMD_WRITE
-//	3  : CMD_REGISTER
-//	2  : Data length
-//	0  : High byte
-//	1  : Low byte
-
-//	printf("-------------------------------------------- \n");
-//	printf("msg = %x \n", *msg);			// A5
-//	printf("msg = %x \n", *(msg + 1));		// 5A
-//	printf("msg = %x \n", *(msg + 2));		// Len : [3] ~ [6] + Data Len
-//	printf("msg = %x \n", *(msg + 3));		// cmd : 0x83
-//	printf("msg = %x \n", *(msg + 4));		// addr : H
-//	printf("msg = %x \n", *(msg + 5));		// addr : L
-//	printf("msg = %x \n", *(msg + 6));		// Data Len
-//
-//	printf("msg = %x \n", *(msg + 7));
-//	printf("msg = %x \n", *(msg + 8));
-//	printf("msg = %x \n", *(msg + 9));
-//	printf("msg = %x \n", *(msg + 10));
-//	printf("msg = %x \n", *(msg + 11));
-//	printf("msg = %x \n", *(msg + 12));
-//	printf("msg = %x \n", *(msg + 13));
-//	printf("msg = %x \n", *(msg + 14));
-
-	if(*msg == CMD_TITLE_1 && *(msg + 1) == CMD_TITLE_2)
-	{
-		if(*(msg + 3) == CMD_WRITE)
-		{
-			switch (*(msg + 4))
-			{
-				case CMD_REGISTER:
-				{
-					// 頁面
-					if(strcmp((char *)ShmSysConfigAndInfo->SysInfo.LcmHwRev, "") != EQUAL)
-						strcpy((char *)ShmSysConfigAndInfo->SysInfo.LcmHwRev, moduleName);
-
-					_currentPage = *(msg + 7);
-//					if (_currentPage != 1 && _currentPage != 5 && _currentPage != 6 && _currentPage != 7 && _currentPage != 8)
-//						printf("_currentPage = %d \n", _currentPage);
-				}
-				break;
-			}
-		}
-		else if (*(msg + 3) == CMD_MULTI_READ)
-		{
-			short key = ((short)(*(msg + 4) << 8) + *(msg + 5));
-			if (key == __lcm_version)
-			{
-				if(strcmp((char *)ShmSysConfigAndInfo->SysInfo.LcmHwRev, "") != EQUAL)
-						strcpy((char *)ShmSysConfigAndInfo->SysInfo.LcmHwRev, moduleName);
-
-				//pSysInfo->LcmFwRev = atoi((char *)(msg + 7));
-				printf("msg = %d \n", atoi((char *)(msg + 7)));
-//				printf("msg = %x \n", *(msg + 7));
-//				printf("msg = %x \n", *(msg + 8));
-//				printf("msg = %x \n", *(msg + 9));
-			}
-			else if (key == 0x0014)
-			{
-				//printf("page = %d \n", *(msg + 8));
-				_currentPage = *(msg + 8);
-			}
-			else if (key == 0x0600)
-			{
-				if (_btn_pressed != *(msg + 8))
-				{
-					if (_btn_pressed == 0x0A)
-						printf("NotPressed \n");
-					else
-						printf("Pressed \n");
-
-					_btn_pressed = *(msg + 8);
-				}
-
-				//printf("msg = %x \n", *(msg + 7));
-			}
-
-//			switch ((unsigned short) (*(msg + 4) << 8) + (unsigned short) *(msg + 5))
-//			{
-//				case BUTTON_GUN_INDEX:
-//				{
-//					// 當前選的槍號
-//					_curGunIndex = (*(msg + 8));
-//				}
-//				break;
-//			}
-		}
-	}
-}
-
-//================================================
-// Function
-//================================================
-//void ChangeToOtherPage(short newPage)
-//{
-//	byte cmd[7];
-//	memset(cmd, 0x00, sizeof(cmd));
-//
-//	cmd[0] = CMD_TITLE_1;
-//	cmd[1] = CMD_TITLE_2;
-//	cmd[2] = 0x02 + sizeof(newPage);
-//	cmd[3] = CMD_READ;
-//	cmd[4] = CMD_REGISTER;
-//	cmd[5] = newPage >> 8;
-//	cmd[6] = newPage & 0x00FF;
-//
-//	WriteCmdToLcm(cmd, ARRAY_SIZE(cmd));
-//	usleep(100000);
-//}
-
-void ChangeToOtherPage(short newPage)
-{
-	byte cmd[10];
-	memset(cmd, 0x00, sizeof(cmd));
-	byte msg[9];
-	memset(msg, 0x00, sizeof(msg));
-
-	cmd[0] = CMD_TITLE_1;
-	cmd[1] = CMD_TITLE_2;
-	cmd[2] = 0x07;
-	cmd[3] = 0x82;
-	cmd[4] = 0x00;
-	cmd[5] = 0x84;
-	cmd[6] = 0x5A;
-	cmd[7] = 0x01;
-	cmd[8] = newPage >> 8;
-	cmd[9] = newPage & 0x00FF;
-
-	WriteCmdToLcm(cmd, ARRAY_SIZE(cmd));
-	usleep(10000);
-	ReadMsgFromLcm(msg, ARRAY_SIZE(msg));
-}
-
-void ChangeBackLight(bool islight)
-{
-	byte value = 0x01;
-	byte msg[9];
-	memset(msg, 0x00, sizeof(msg));
-
-	// 0x00 ~ 0x40
-	if (islight)
-	{
-		value = 0x20;
-	}
-	byte cmd[7];
-	memset(cmd, 0x00, sizeof(cmd));
-
-	cmd[0] = CMD_TITLE_1;
-	cmd[1] = CMD_TITLE_2;
-	cmd[2] = 0x03;
-	cmd[3] = CMD_READ;
-	cmd[4] = CMD_BACKLIGHT;
-	cmd[5] = value;
-
-	WriteCmdToLcm(cmd, ARRAY_SIZE(cmd));
-	usleep(10000);
-	ReadMsgFromLcm(msg, ARRAY_SIZE(msg));
-}
-
-//void GetCurrentPage()
-//{
-//	byte cmd[6];
-//	memset(cmd, 0x00, sizeof(cmd));
-//	byte msg[8];
-//	memset(msg, 0x00, sizeof(msg));
-//
-//	cmd[0] = CMD_TITLE_1;
-//	cmd[1] = CMD_TITLE_2;
-//	cmd[2] = 0x03;				// 底下總長度
-//	cmd[3] = CMD_WRITE;
-//	cmd[4] = CMD_REGISTER;
-//	cmd[5] = 0x02;
-//
-//	WriteCmdToLcm(cmd, ARRAY_SIZE(cmd));
-//	usleep(10000);
-//	ReadMsgFromLcm(msg, ARRAY_SIZE(msg));
-//}
-
-void GetCurrentPage()
-{
-	byte cmd[7];
-	memset(cmd, 0x00, sizeof(cmd));
-	byte msg[9];
-	memset(msg, 0x00, sizeof(msg));
-
-	cmd[0] = CMD_TITLE_1;
-	cmd[1] = CMD_TITLE_2;
-	cmd[2] = 0x04;				// 底下總長度
-	cmd[3] = 0x83;
-	cmd[4] = 0x00;
-	cmd[5] = 0x14;
-	cmd[6] = 0x01;
-
-	WriteCmdToLcm(cmd, ARRAY_SIZE(cmd));
-	usleep(10000);
-	ReadMsgFromLcm(msg, ARRAY_SIZE(msg));
-}
-
-
-void DisplayValueToLcm(short address, byte *data, byte len)
-{
-	byte cmd[256];
-	memset(cmd, 0x00, sizeof(cmd));
-	byte msg[9];
-	memset(msg, 0x00, sizeof(msg));
-
-	cmd[0] = CMD_TITLE_1;
-	cmd[1] = CMD_TITLE_2;
-	cmd[2] = 0x03 + len;
-	cmd[3] = CMD_MULTI_WRITE;
-	cmd[4] = address >> 8;
-	cmd[5] = address & 0x00FF;
-
-	for(byte count = 0; count < len; count++)
-	{
-		cmd[6 + count] = *(data + count);
-	}
-
-	WriteCmdToLcm(cmd, cmd[2] + 3);
-	usleep(10000);
-	ReadMsgFromLcm(msg, ARRAY_SIZE(msg));
-}
-
-void ChangeDisplay2Value(short address, short value)
-{
-	byte data[2];
-	data[0] = value >> 8;
-	data[1] = value & 0x00FF;
-
-	DisplayValueToLcm(address, data, sizeof(data));
-}
-
-void GetDeviceInfoStatus(short address, byte len)
-{
-	byte cmd[8];
-	memset(cmd, 0x00, sizeof(cmd));
-	byte msg[11];
-	memset(msg, 0x00, sizeof(msg));
-
-	cmd[0] = CMD_TITLE_1;
-	cmd[1] = CMD_TITLE_2;
-	cmd[2] = 0x04;
-	cmd[3] = CMD_MULTI_READ;
-	cmd[4] = (address >> 8) & 0xff;
-	cmd[5] = (address >> 0) & 0xff;
-	cmd[6] = len;
-
-	WriteCmdToLcm(cmd, ARRAY_SIZE(cmd));
-	usleep(10000);
-	ReadMsgFromLcm(msg, ARRAY_SIZE(msg));
-}
-
-//================================================
-// Warning process
-//================================================
-void string2ByteArray(unsigned char *input, byte *output)
-{
-    int loop;
-    int i;
-
-    loop = 0;
-    i = 0;
-
-    while(input[loop] != '\0')
-    {
-        output[i++] = input[loop++];
-    }
-    output[loop] = '\0';
-}
-
-void ChangeWarningFunc()
-{
-	byte cmd[7];
-	byte i = 0;
-	//PRINTF_FUNC("ChangeWarningFunc \n");
-	// 最多一次五筆
-	//PRINTF_FUNC("LCM PageIndex = %d \n", ShmSysConfigAndInfo->SysWarningInfo.PageIndex);
-	//PRINTF_FUNC("WarningCount = %d \n", ShmSysConfigAndInfo->SysWarningInfo.WarningCount);
-	for(i = 0; (i + ShmSysConfigAndInfo->SysWarningInfo.PageIndex * 5) < ShmSysConfigAndInfo->SysWarningInfo.WarningCount; i++)
-	{
-		memset(cmd, 0x00, sizeof(cmd));
-		if(i >= 5)
-		{
-			break;
-		}
-		//error code
-		string2ByteArray(&ShmSysConfigAndInfo->SysWarningInfo.WarningCode[i + ShmSysConfigAndInfo->SysWarningInfo.PageIndex * 5][0], cmd);
-		DisplayValueToLcm(0x1010 + (i * 6), cmd, sizeof(cmd));
-		//警告標示
-		memset(cmd, 0x00, sizeof(cmd));
-
-		cmd[0] = 0x00;
-		cmd[1] = 0x01;
-		DisplayValueToLcm(0x1002 + (i * 2), cmd, 2);
-	}
-
-	memset(cmd, 0x00, sizeof(cmd));
-	for(; i < 5; i++)
-	{
-		DisplayValueToLcm(0x1010 + (i * 6), cmd, sizeof(cmd));
-		DisplayValueToLcm(0x1002 + (i * 2), cmd, 2);
-	}
-}
-
-//================================================
-// QR Code process
-//================================================
-void ChangeQrCode_Idle(char *input, byte len)
-{
-	byte cmd[len];
-	int loop = 0;
-
-	input[len] = '\0';
-	cmd[len] = '\0';
-	while(input[loop] != '\0')
-	{
-		cmd[loop] = input[loop];
-		loop++;
-	}
-
-	//printf("cmd = %s, len = %d \n", cmd, len + 1);
-	DisplayValueToLcm(__qr_code, cmd, len + 1);
-}
-
-void ChangeQrCode_Charge(char *input, byte len)
-{
-	byte cmd[len];
-	int loop = 0;
-
-	input[len] = '\0';
-	cmd[len] = '\0';
-	while(input[loop] != '\0')
-	{
-		cmd[loop] = input[loop];
-		loop++;
-	}
-
-	//printf("2 - cmd = %s, len = %d \n", cmd, len + 1);
-	DisplayValueToLcm(__qr_code_pre, cmd, len + 1);
-}
-
-//================================================
-// Change current page
-//================================================
-void ChangeCurPage()
-{
-	//PRINTF_FUNC("cur = %d, new = %d \n", _currentPage, ShmSysConfigAndInfo->SysInfo.PageIndex);
-	if (_currentPage != ShmSysConfigAndInfo->SysInfo.PageIndex)
-	{
-		//_currentPage = ShmSysConfigAndInfo->SysInfo.PageIndex;
-		ChangeToOtherPage(ShmSysConfigAndInfo->SysInfo.PageIndex);
-		_everyPageRollChange = 0;
-	}
-}
-
-//================================================
-// Main process
-//================================================
-byte demoCount = 0;
-void DemoFunction()
-{
-	if (demoCount == 0)
-	{
-		ShmSysConfigAndInfo->SysWarningInfo.WarningCount = 6;
-		memcpy(&ShmSysConfigAndInfo->SysWarningInfo.WarningCode[0][0], "000001", 7);
-		memcpy(&ShmSysConfigAndInfo->SysWarningInfo.WarningCode[1][0], "000002", 7);
-		memcpy(&ShmSysConfigAndInfo->SysWarningInfo.WarningCode[2][0], "000003", 7);
-		memcpy(&ShmSysConfigAndInfo->SysWarningInfo.WarningCode[3][0], "000004", 7);
-		memcpy(&ShmSysConfigAndInfo->SysWarningInfo.WarningCode[4][0], "000005", 7);
-		memcpy(&ShmSysConfigAndInfo->SysWarningInfo.WarningCode[5][0], "000006", 7);
-	}
-	else
-	{
-		if (demoCount == 20) {
-			ShmSysConfigAndInfo->SysInfo.PageIndex = _LCM_IDLE;
-		} else if (demoCount == 80) {
-			ShmSysConfigAndInfo->SysInfo.PageIndex = _LCM_AUTHORIZING;
-		} else if (demoCount == 100) {
-			ShmSysConfigAndInfo->SysInfo.PageIndex = _LCM_AUTHORIZ_COMP;
-		} else if (demoCount == 120) {
-			ShmSysConfigAndInfo->SysInfo.PageIndex = _LCM_AUTHORIZ_FAIL;
-		} else if (demoCount == 140) {
-			ShmSysConfigAndInfo->SysInfo.PageIndex = _LCM_PRE_CHARGE;
-		} else if (demoCount == 180) {
-			ShmSysConfigAndInfo->SysInfo.PageIndex = _LCM_CHARGING;
-		}
-	}
-
-	if (demoCount < 180)
-		demoCount++;
-}
-
-//================================================
-// Main process
-//================================================
-bool FindChargingInfoData(byte target, struct ChargingInfoData **_chargingData)
-{
-	for (byte index = 0; index < CHAdeMO_QUANTITY; index++)
-	{
-		if (ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index].Index == target)
-		{
-			_chargingData[target] = &ShmSysConfigAndInfo->SysInfo.ChademoChargingData[index];
-			return true;
-		}
-	}
-
-	for (byte index = 0; index < CCS_QUANTITY; index++)
-	{
-		if (ShmSysConfigAndInfo->SysInfo.CcsChargingData[index].Index == target)
-		{
-			_chargingData[target] = &ShmSysConfigAndInfo->SysInfo.CcsChargingData[index];
-			return true;
-		}
-	}
-
-	for (byte index = 0; index < GB_QUANTITY; index++)
-	{
-		if (ShmSysConfigAndInfo->SysInfo.GbChargingData[index].Index == target)
-		{
-			_chargingData[target] = &ShmSysConfigAndInfo->SysInfo.GbChargingData[index];
-			return true;
-		}
-	}
-
-	return false;
-}
-
-bool FindAcChargingInfoData(byte target, struct ChargingInfoData **acChargingData)
-{
-	if (target < AC_QUANTITY)
-	{
-		acChargingData[target] = &ShmSysConfigAndInfo->SysInfo.AcChargingData[target];
-		return true;
-	}
-
-	return false;
-}
-
-void ChangeAcBattMapAndValue(short page)
-{
-	if (page == _LCM_CHARGING)
-	{
-		if (isDiffStatus != _battery_display_ani)
-		{
-			isChangeBattMap = false;
-			isDiffStatus = _battery_display_ani;
-		}
-
-		if (ac_chargingInfo[0]->IsCharging && !isChangeBattMap)
-		{
-			isChangeBattMap = true;
-			if (ac_ani_battery_level == _BATTERY_LEVEL_FOR_MAP_LV5)
-			{
-				ChangeDisplay2Value(__batt_map, _battery_empty);
-				ac_ani_battery_level = _BATTERY_LEVEL_FOR_MAP_EMP;
-			}
-			else if (ac_ani_battery_level == _BATTERY_LEVEL_FOR_MAP_EMP)
-			{
-				ChangeDisplay2Value(__batt_map, _battery_cap_20);
-				ac_ani_battery_level = _BATTERY_LEVEL_FOR_MAP_LV1;
-			}
-			else if (ac_ani_battery_level == _BATTERY_LEVEL_FOR_MAP_LV1)
-			{
-				ChangeDisplay2Value(__batt_map, _battery_cap_40);
-				ac_ani_battery_level = _BATTERY_LEVEL_FOR_MAP_LV2;
-			}
-			else if (ac_ani_battery_level == _BATTERY_LEVEL_FOR_MAP_LV2)
-			{
-				ChangeDisplay2Value(__batt_map, _battery_cap_60);
-				ac_ani_battery_level = _BATTERY_LEVEL_FOR_MAP_LV3;
-			}
-			else if (ac_ani_battery_level == _BATTERY_LEVEL_FOR_MAP_LV3)
-			{
-				ChangeDisplay2Value(__batt_map, _battery_cap_80);
-				ac_ani_battery_level = _BATTERY_LEVEL_FOR_MAP_LV4;
-			}
-			else if (ac_ani_battery_level == _BATTERY_LEVEL_FOR_MAP_LV4)
-			{
-				ChangeDisplay2Value(__batt_map, _battery_cap_100);
-				ac_ani_battery_level = _BATTERY_LEVEL_FOR_MAP_LV5;
-			}
-		}
-	}
-	else if (page == _LCM_COMPLETE)
-	{
-		if (ac_ani_battery_level == _BATTERY_LEVEL_FOR_MAP_LV5)
-			ChangeDisplay2Value(__batt_map, _battery_soc_20);
-		else if (ac_ani_battery_level == _BATTERY_LEVEL_FOR_MAP_EMP)
-			ChangeDisplay2Value(__batt_map, _battery_soc_20);
-		else if (ac_ani_battery_level == _BATTERY_LEVEL_FOR_MAP_LV1)
-			ChangeDisplay2Value(__batt_map, _battery_soc_40);
-		else if (ac_ani_battery_level == _BATTERY_LEVEL_FOR_MAP_LV2)
-			ChangeDisplay2Value(__batt_map, _battery_soc_60);
-		else if (ac_ani_battery_level == _BATTERY_LEVEL_FOR_MAP_LV3)
-			ChangeDisplay2Value(__batt_map, _battery_soc_80);
-		else if (ac_ani_battery_level == _BATTERY_LEVEL_FOR_MAP_LV4)
-			ChangeDisplay2Value(__batt_map, _battery_soc_100);
-	}
-
-	ChangeDisplay2Value(__soc_value_charging, _disappear);
-}
-
-void ChangeBattMapAndValue(short page, int soc)
-{
-//	srand(time(NULL));
-//	int min = 10;
-//	int max = 90;
-//	soc = rand() % (max - min + 1) + min;
-
-	if (page == _LCM_PRE_CHARGE)
-	{
-		ChangeDisplay2Value(__batt_map_empty, _battery_empty);
-	}
-	else if (page == _LCM_CHARGING)
-	{
-		if (soc < 20)
-		{
-			if (_battery_display_ani)
-				ChangeDisplay2Value(__batt_map, _battery_empty);
-			else
-				ChangeDisplay2Value(__batt_map, _battery_cap_20);
-		}
-		else if (soc >= 20 && soc < 40)
-		{
-			if (_battery_display_ani)
-				ChangeDisplay2Value(__batt_map, _battery_cap_20);
-			else
-				ChangeDisplay2Value(__batt_map, _battery_cap_40);
-		}
-		else if (soc >= 40 && soc < 60)
-		{
-			if (_battery_display_ani)
-				ChangeDisplay2Value(__batt_map, _battery_cap_40);
-			else
-				ChangeDisplay2Value(__batt_map, _battery_cap_60);
-		}
-		else if (soc >= 60 && soc < 80)
-		{
-			if (_battery_display_ani)
-				ChangeDisplay2Value(__batt_map, _battery_cap_60);
-			else
-				ChangeDisplay2Value(__batt_map, _battery_cap_80);
-		}
-		else if (soc >= 80 && soc < 100)
-		{
-			if (_battery_display_ani)
-				ChangeDisplay2Value(__batt_map, _battery_cap_80);
-			else
-				ChangeDisplay2Value(__batt_map, _battery_cap_100);
-		}
-		else if (soc == 100)
-			ChangeDisplay2Value(__batt_map, _battery_cap_100);
-	}
-	else if (page == _LCM_COMPLETE)
-	{
-		if (soc < 20)
-			ChangeDisplay2Value(__batt_map, _battery_soc_20);
-		else if (soc >= 20 && soc < 40)
-			ChangeDisplay2Value(__batt_map, _battery_soc_40);
-		else if (soc >= 40 && soc < 60)
-			ChangeDisplay2Value(__batt_map, _battery_soc_60);
-		else if (soc >= 60 && soc < 80)
-			ChangeDisplay2Value(__batt_map, _battery_soc_80);
-		else if (soc >= 80 && soc <= 100)
-			ChangeDisplay2Value(__batt_map, _battery_soc_100);
-	}
-
-	byte cmd[5];
-	byte value[5];
-
-	memset(cmd, 0x00, sizeof(cmd));
-	memset(value, 0x00, sizeof(value));
-	sprintf((char *)value, "%d%%", soc);
-	string2ByteArray(value, cmd);
-	DisplayValueToLcm(__soc_value_charging, cmd, sizeof(cmd));
-}
-
-void ChangeRemainTime(int sec)
-{
-	int h, m, s;
-	byte cmd[10];
-	byte value[10];
-
-	memset(cmd, 0x00, sizeof(cmd));
-
-//	srand(time(NULL));
-//	int min = 0;
-//	int max = 65536;
-//	sec = rand() % (max - min + 1) + min;
-
-	h = (sec / 3600);
-	m = (sec - (3600 * h)) / 60;
-	s = (sec - (3600 * h) - (m * 60));
-	sprintf((char *)value, "%02d:%02d:%02d", h, m, s);
-	string2ByteArray(value, cmd);
-	DisplayValueToLcm(__remain_time_tx, cmd, sizeof(cmd));
-}
-
-void ChangeChargingEnergyValue(float energy)
-{
-	byte cmd[10];
-	byte value[10];
-
-	memset(cmd, 0x00, sizeof(cmd));
-	if (energy >= 0.05)
-		energy -= 0.05;
-	sprintf((char *) value, "%.1f kWh", energy);
-	string2ByteArray(value, cmd);
-	DisplayValueToLcm(__total_out_eng_tx, cmd, sizeof(cmd));
-}
-
-void ChangeChargingPowerValue(float pow)
-{
-	byte cmd[10];
-	byte value[10];
-
-	memset(cmd, 0x00, sizeof(cmd));
-
-//	float min = 0.0;
-//	float max = 50;
-//	pow = (max - min) * rand() / (RAND_MAX + 1.0) + min;
-	sprintf((char *) value, "%.1f kW", pow);
-	string2ByteArray(value, cmd);
-	DisplayValueToLcm(__output_eng_tx, cmd, sizeof(cmd));
-}
-
-void ChangeChargingFeeValue(float fee)
-{
-	byte cmd[10];
-	byte value[10];
-
-	memset(cmd, 0x00, sizeof(cmd));
-
-	sprintf((char *) value, "%.2f", fee);
-	string2ByteArray(value, cmd);
-	DisplayValueToLcm(__charging_fee_tx, cmd, sizeof(cmd));
-}
-
-void DisplayMoneyRate(float money)
-{
-	byte cmd[8];
-	byte value[8];
-
-	memset(cmd, 0x00, sizeof(cmd));
-
-	sprintf((char *) value, "%.2f", money);
-	string2ByteArray(value, cmd);
-	DisplayValueToLcm(__money_by_rate, cmd, sizeof(cmd));
-}
-
-void DisplayMoneyCur(byte *cur)
-{
-	byte cmd[8];
-	byte buf[8];
-
-	memset(cmd, 0x00, sizeof(cmd));
-	memcpy((char *) buf, cur, 3);
-	memcpy((char *) buf + 3, "/kWh", 4);
-	buf[7] = '\0';
-	string2ByteArray(buf, cmd);
-	DisplayValueToLcm(__money_rate, cmd, sizeof(cmd));
-}
-
-void RefreshPageAnimation(byte value)
-{
-	switch(_currentPage)
-	{
-		case _LCM_IDLE:
-		{
-
-		}
-			break;
-		case _LCM_WAIT_FOR_PLUG:
-		{
-			if(_everyPageRollChange == 0)
-				ChangeDisplay2Value(__plug_in_arrow, _arrow_dark);
-			else if(_everyPageRollChange == 15)
-				ChangeDisplay2Value(__plug_in_arrow, _arrow_light);
-
-			_everyPageRollChange > 30 ? _everyPageRollChange = 0 : _everyPageRollChange++;
-		}
-			break;
-		case _LCM_PRE_CHARGE:
-		case _LCM_CHARGING:
-		case _LCM_COMPLETE:
-		{
-			if (_currentPage == _LCM_PRE_CHARGE)
-			{
-				if (_everyPageRollChange == 0 || _everyPageRollChange == 22)
-					ChangeDisplay2Value(__conn_line, _conn_map1);
-				else if (_everyPageRollChange == 11 || _everyPageRollChange == 33)
-					ChangeDisplay2Value(__conn_line, _conn_map2);
-			}
-			else if (_currentPage == _LCM_CHARGING)
-			{
-				if (_everyPageRollChange == 0 || _everyPageRollChange == 22)
-					ChangeDisplay2Value(__conn_line_chag, _charging_map1);
-				else if (_everyPageRollChange == 11 || _everyPageRollChange == 33)
-					ChangeDisplay2Value(__conn_line_chag, _charging_map2);
-			}
-			else if (_currentPage == _LCM_COMPLETE)
-			{
-				if (_everyPageRollChange == 0)
-					ChangeDisplay2Value(__conn_line_comp, _complete_map);
-			}
-
-			_everyPageRollChange >= 45 ? _everyPageRollChange = 0 : _everyPageRollChange++;
-		}
-			break;
-	}
-}
-
-void RefreshConnStatus()
-{
-	// eth
-	if (ShmSysConfigAndInfo->SysInfo.ethInternetConn == YES)
-	{ ChangeDisplay2Value(__ethernet_status, _ethernet_connect); }
-	else
-	{ ChangeDisplay2Value(__ethernet_status, _ethernet_disconnect); }
-
-	// Wifi
-	if((ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'W' || ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'D') &&
-			ShmSysConfigAndInfo->SysConfig.AthInterface.WifiMode != _SYS_WIFI_MODE_DISABLE)
-	{
-		if (ShmSysConfigAndInfo->SysConfig.AthInterface.WifiNetworkConn == YES ||
-				ShmSysConfigAndInfo->SysConfig.AthInterface.WifiMode == _SYS_WIFI_MODE_AP)
-		{ ChangeDisplay2Value(__wifi_status, _wifi_connect); }
-		else
-		{ ChangeDisplay2Value(__wifi_status, _wifi_disconnect); }
-	}
-	else
-	{
-		ShmSysConfigAndInfo->SysConfig.AthInterface.WifiRssi = 0;
-		ChangeDisplay2Value(__wifi_status, _disappear);
-	}
-
-	if((ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'T' || ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'D') &&
-			ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomEnabled != NO)
-	{
-		if (ShmSysConfigAndInfo->SysConfig.AthInterface.WifiMode == _SYS_WIFI_MODE_DISABLE)
-		{
-			ChangeDisplay2Value(__3G4G_status, _disappear);
-			// 3G/4G
-			if (ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomNetworkConn == YES)
-			{ ChangeDisplay2Value(__3G4G_move_status, _3G4G_connect); }
-			else
-			{ ChangeDisplay2Value(__3G4G_move_status, _3G4G_disconnect); }
-		}
-		else
-		{
-			ChangeDisplay2Value(__3G4G_move_status, _disappear);
-			// 3G/4G
-			if (ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomNetworkConn == YES)
-			{ ChangeDisplay2Value(__3G4G_status, _3G4G_connect); }
-			else
-			{ ChangeDisplay2Value(__3G4G_status, _3G4G_disconnect); }
-		}
-	}
-	else
-	{
-		ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomRssi = 0;
-		ChangeDisplay2Value(__3G4G_status, _disappear);
-		ChangeDisplay2Value(__3G4G_move_status, _disappear);
-	}
-
-	// 連線到後台
-	if (ShmSysConfigAndInfo->SysInfo.OcppConnStatus == YES)
-		ChangeDisplay2Value(__conn_status, _connect);
-	else
-		ChangeDisplay2Value(__conn_status, _disconnect);
-}
-
-byte FirstPageChanged()
-{
-	byte result = NO;
-
-	if (_currentPage != _oldPage)
-	{
-		result = YES;
-		_oldPage = _currentPage;
-	}
-
-	return result;
-}
-
-bool IsPageReloadChk()
-{
-	bool result = false;
-
-	if (ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc == NO_DEFINE)
-	{
-		if (_curPage_index != ShmSysConfigAndInfo->SysInfo.CurGunSelected)
-		{
-			_curPage_index = ShmSysConfigAndInfo->SysInfo.CurGunSelected;
-			result = true;
-		}
-	}
-	else
-	{
-		if (_curPage_index != ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc)
-		{
-			_curPage_index = ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc;
-			result = true;
-		}
-	}
-
-	return result;
-}
-
-bool IsConfigReloadChk()
-{
-	bool result = false;
-
-	if (ShmSysConfigAndInfo->SysConfig.QRCodeMadeMode == NO)
-	{
-		if (strcmp((char *)QRCodeBuf, (char *)ShmSysConfigAndInfo->SysConfig.SystemId) != EQUAL)
-			result = true;
-	}
-	else
-	{
-		if (strcmp((char *)QRCodeBuf, (char *)ShmSysConfigAndInfo->SysConfig.QRCodeContent) != EQUAL)
-			result = true;
-	}
-
-	return result;
-}
-
-void SaveQrcodeToBuf(byte *qrcode)
-{
-	strncpy((char *)QRCodeBuf, (char *)qrcode, sizeof(QRCodeBuf));
-}
-
-void ClearDisplayInfo()
-{
-	ChangeDisplay2Value(__csu_ver_string, _disappear);
-	ChangeDisplay2Value(__csu_ver_value, _disappear);
-
-	ChangeDisplay2Value(__eth0_ip_string, _disappear);
-	ChangeDisplay2Value(__eth0_ip_value, _disappear);
-
-	ChangeDisplay2Value(__sn_string, _disappear);
-	ChangeDisplay2Value(__sn_value, _disappear);
-
-	ChangeDisplay2Value(__dc1_ver_string, _disappear);
-	ChangeDisplay2Value(__dc1_ver_value, _disappear);
-
-	ChangeDisplay2Value(__dc2_ver_string, _disappear);
-	ChangeDisplay2Value(__dc2_ver_value, _disappear);
-
-	ChangeDisplay2Value(__fan_speed_string, _disappear);
-	ChangeDisplay2Value(__fan_speed_value, _disappear);
-}
-
-void DisplayInfoCsuVer(bool isShow, unsigned char *modelName)
-{
-	if (isShow)
-	{
-		byte value[10];
-
-		memset(value, 0x00, sizeof(value));
-		strcpy((char *)value, "CSU Ver >");
-		DisplayValueToLcm(__csu_ver_string, value, sizeof(value));
-		memset(value, 0x00, sizeof(value));
-		strncpy((char *)value, (char *)modelName, 5);
-		DisplayValueToLcm(__csu_ver_value, value, sizeof(value));
-	}
-	else
-	{
-		ChangeDisplay2Value(__csu_ver_string, _disappear);
-		ChangeDisplay2Value(__csu_ver_value, _disappear);
-	}
-}
-
-void ShowWifiMode(bool isShow, unsigned char mode)
-{
-	if (isShow)
-	{
-		byte value[20];
-
-		memset(value, 0x00, sizeof(value));
-		strcpy((char *) value, "Wifi Mo. >");
-		DisplayValueToLcm(__csu_ver_string, value, sizeof(value));
-		memset(value, 0x00, sizeof(value));
-		if (mode == 0)
-			sprintf((char *)value, "disable");
-		else if (mode == 1)
-			sprintf((char *)value, "station");
-		else if (mode == 2)
-			sprintf((char *)value, "AP");
-
-		DisplayValueToLcm(__csu_ver_value, value, sizeof(value));
-	}
-	else
-	{
-		ChangeDisplay2Value(__csu_ver_string, _disappear);
-		ChangeDisplay2Value(__csu_ver_value, _disappear);
-	}
-}
-
-void DisplayInfoEthIp(bool isShow, unsigned char *ip)
-{
-	if (isShow)
-	{
-		byte value[20];
-
-		memset(value, 0x00, sizeof(value));
-		strcpy((char *) value, "Eth IP >");
-		DisplayValueToLcm(__eth0_ip_string, value, sizeof(value));
-		memset(value, 0x00, sizeof(value));
-		strcpy((char *) value, (char *) ip);
-		DisplayValueToLcm(__eth0_ip_value, value, sizeof(value));
-	}
-	else
-	{
-		ChangeDisplay2Value(__eth0_ip_string, _disappear);
-		ChangeDisplay2Value(__eth0_ip_value, _disappear);
-	}
-}
-
-void Show4GRssi(bool isShow, int dbValue)
-{
-	if (isShow)
-	{
-		byte value[20];
-
-		memset(value, 0x00, sizeof(value));
-		strcpy((char *) value, "RSSI >");
-		DisplayValueToLcm(__dc2_ver_string, value, sizeof(value));
-		memset(value, 0x00, sizeof(value));
-		sprintf((char *)value, "%d dBm", dbValue);
-		DisplayValueToLcm(__dc2_ver_value, value, sizeof(value));
-	}
-	else
-	{
-		ChangeDisplay2Value(__dc2_ver_string, _disappear);
-		ChangeDisplay2Value(__dc2_ver_value, _disappear);
-	}
-}
-
-void DisplayInfoSN(bool isShow, unsigned char *sn)
-{
-	if (isShow)
-	{
-		byte value[30];
-
-		memset(value, 0x00, sizeof(value));
-		strcpy((char *) value, "SN >");
-		DisplayValueToLcm(__sn_string, value, sizeof(value));
-		memset(value, 0x00, sizeof(value));
-		strcpy((char *) value, (char *) sn);
-		DisplayValueToLcm(__sn_value, value, sizeof(value));
-	}
-	else
-	{
-		ChangeDisplay2Value(__sn_string, _disappear);
-		ChangeDisplay2Value(__sn_value, _disappear);
-	}
-}
-
-void ShowWifiRssi(bool isShow, int dbValue)
-{
-	if (isShow)
-	{
-		byte value[20];
-
-		memset(value, 0x00, sizeof(value));
-		strcpy((char *) value, "RSSI >");
-		DisplayValueToLcm(__fan_speed_string, value, sizeof(value));
-		memset(value, 0x00, sizeof(value));
-		sprintf((char *)value, "%d dBm", dbValue);
-		DisplayValueToLcm(__fan_speed_value, value, sizeof(value));
-	}
-	else
-	{
-		ChangeDisplay2Value(__fan_speed_string, _disappear);
-		ChangeDisplay2Value(__fan_speed_value, _disappear);
-	}
-}
-
-void DisplayInfoGun1Ver(bool isShow, unsigned char *version)
-{
-	if (isShow)
-	{
-		byte value[10];
-
-		memset(value, 0x00, sizeof(value));
-		strcpy((char *) value, "Ct1 Ver >");
-		DisplayValueToLcm(__dc1_ver_string, value, sizeof(value));
-		memset(value, 0x00, sizeof(value));
-		strcpy((char *) value, (char *) version);
-		DisplayValueToLcm(__dc1_ver_value, value, sizeof(value));
-	}
-	else
-	{
-		ChangeDisplay2Value(__dc1_ver_string, _disappear);
-		ChangeDisplay2Value(__dc1_ver_value, _disappear);
-	}
-}
-
-void Show4GMode(bool isShow, unsigned char mode)
-{
-	if (isShow)
-	{
-		byte value[20];
-
-		memset(value, 0x00, sizeof(value));
-		strcpy((char *) value, "3/4G Mo. >");
-		DisplayValueToLcm(__dc1_ver_string, value, sizeof(value));
-		memset(value, 0x00, sizeof(value));
-		if (mode == 0)
-			sprintf((char *)value, "disable");
-		else if (mode == 1)
-			sprintf((char *)value, "enable");
-
-		DisplayValueToLcm(__dc1_ver_value, value, sizeof(value));
-	}
-	else
-	{
-		ChangeDisplay2Value(__dc1_ver_string, _disappear);
-		ChangeDisplay2Value(__dc1_ver_value, _disappear);
-	}
-}
-
-void DisplayInfoGun2Ver(bool isShow, unsigned char *version)
-{
-	if (isShow)
-	{
-		byte value[10];
-
-		memset(value, 0x00, sizeof(value));
-		strcpy((char *) value, "Ct2 Ver >");
-		DisplayValueToLcm(__dc2_ver_string, value, sizeof(value));
-		memset(value, 0x00, sizeof(value));
-		strcpy((char *) value, (char *) version);
-		DisplayValueToLcm(__dc2_ver_value, value, sizeof(value));
-	}
-	else
-	{
-		ChangeDisplay2Value(__dc2_ver_string, _disappear);
-		ChangeDisplay2Value(__dc2_ver_value, _disappear);
-	}
-}
-
-void Show4GIP(bool isShow, unsigned char *ip)
-{
-	if (isShow)
-	{
-		byte value[20];
-
-		memset(value, 0x00, sizeof(value));
-		strcpy((char *) value, "3/4G IP ");
-		DisplayValueToLcm(__eth0_ip_string, value, sizeof(value));
-		memset(value, 0x00, sizeof(value));
-		strcpy((char *) value, (char *) ip);
-		DisplayValueToLcm(__eth0_ip_value, value, sizeof(value));
-	}
-	else
-	{
-		ChangeDisplay2Value(__eth0_ip_string, _disappear);
-		ChangeDisplay2Value(__eth0_ip_value, _disappear);
-	}
-}
-
-void DisplayInfoSpeed(bool isShow, unsigned int fan)
-{
-	if (isShow)
-	{
-		byte value[10];
-
-		memset(value, 0x00, sizeof(value));
-		strcpy((char *) value, "Fan Spd >");
-		DisplayValueToLcm(__fan_speed_string, value, sizeof(value));
-		memset(value, 0x00, sizeof(value));
-		sprintf((char *)value, "%d", fan);
-		DisplayValueToLcm(__fan_speed_value, value, sizeof(value));
-	}
-	else
-	{
-		ChangeDisplay2Value(__fan_speed_string, _disappear);
-		ChangeDisplay2Value(__fan_speed_value, _disappear);
-	}
-}
-
-void ShowWifiIP(bool isShow, unsigned char *ip)
-{
-	if (isShow)
-	{
-		byte value[20];
-
-		memset(value, 0x00, sizeof(value));
-		strcpy((char *) value, "Wifi IP ");
-		DisplayValueToLcm(__sn_string, value, sizeof(value));
-		memset(value, 0x00, sizeof(value));
-		strcpy((char *) value, (char *) ip);
-		DisplayValueToLcm(__sn_value, value, sizeof(value));
-	}
-	else
-	{
-		ChangeDisplay2Value(__sn_string, _disappear);
-		ChangeDisplay2Value(__sn_value, _disappear);
-	}
-}
-
-void InformationShow()
-{
-	if(ShmSysConfigAndInfo->SysConfig.ShowInformation == YES)
-	{
-		bool show = _isShow = true;
-		if (_showInformIndex == 0)
-		{
-			DisplayInfoCsuVer(show, ShmSysConfigAndInfo->SysInfo.CsuRootFsFwRev);
-			DisplayInfoSpeed(show, ShmSysConfigAndInfo->SysInfo.SystemFanRotaSpeed);
-			DisplayInfoSN(show, ShmSysConfigAndInfo->SysConfig.SerialNumber);
-
-			DisplayInfoEthIp(show, ShmSysConfigAndInfo->SysConfig.Eth0Interface.EthIpAddress);
-			DisplayInfoGun1Ver(show, ShmSysConfigAndInfo->SysInfo.Connector1FwRev);
-			if (_totalCount > 1)
-				DisplayInfoGun2Ver(show, ShmSysConfigAndInfo->SysInfo.Connector2FwRev);
-			else
-			{
-				DisplayInfoGun2Ver(false, ShmSysConfigAndInfo->SysInfo.Connector2FwRev);
-			}
-		}
-		else if (_showInformIndex == 1)
-		{
-			ShowWifiMode(show, ShmSysConfigAndInfo->SysConfig.AthInterface.WifiMode);
-			ShowWifiRssi(show, ShmSysConfigAndInfo->SysConfig.AthInterface.WifiRssi);
-			ShowWifiIP(show, ShmSysConfigAndInfo->SysConfig.AthInterface.WifiIpAddress);
-
-			Show4GMode(show, ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomEnabled);
-			Show4GRssi(show, ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomRssi);
-			Show4GIP(show, ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomIpAddress);
-		}
-	}
-	else
-	{
-		ClearDisplayInfo();
-
-		if (_isShow)
-		{
-			_isShow = false;
-			_showInformIndex++;
-			if (_showInformIndex >= 2)
-				_showInformIndex = 0;
-		}
-	}
-}
-
-void ProcessPageInfo()
-{
-	_page_reload = IsPageReloadChk();
-
-	if (!_page_reload)
-		_page_reload = IsConfigReloadChk();
-
-	// 隨插即充 - 可省略該按鈕
-//	if (ShmSysConfigAndInfo->SysConfig.AuthorisationMode == AUTH_MODE_ENABLE)
-//	{
-//		ChangeDisplay2Value(__ret_home_btn, _back_home_btn);
-//		if (_totalCount >= 2 && ShmSysConfigAndInfo->SysInfo.IsAlternatvieConf == NO)
-//			ChangeDisplay2Value(__sel_gun_btn, _sel_gun_btn);
-//		else
-//			ChangeDisplay2Value(__sel_gun_btn, _disappear);
-//	}
-	switch(_currentPage)
-	{
-		case _LCM_IDLE:
-		{
-			if (ShmSysConfigAndInfo->SysConfig.isRFID)
-				ChangeDisplay2Value(__main_rfid, _main_rfid);
-			else
-				ChangeDisplay2Value(__main_rfid, _main_none_rfid);
-
-			if (ShmSysConfigAndInfo->SysConfig.isQRCode)
-				ChangeDisplay2Value(__main_qr, _main_qr);
-			else
-			{
-				ChangeDisplay2Value(__qr_code, _disappear);
-				ChangeDisplay2Value(__main_qr, _main_none_qr);
-				needReloadQr = true;
-			}
-
-			if (ShmSysConfigAndInfo->SysConfig.isAPP)
-				ChangeDisplay2Value(__main_app, _main_app);
-			else
-				ChangeDisplay2Value(__main_app, _main_none_app);
-
-			if (FirstPageChanged() == YES || needReloadQr || _page_reload)
-			{
-				if (ShmSysConfigAndInfo->SysConfig.isQRCode)
-				{
-					needReloadQr = false;
-					if (ShmSysConfigAndInfo->SysConfig.QRCodeMadeMode == NO)
-					{
-						byte len = strlen((char *)ShmSysConfigAndInfo->SysConfig.SystemId);
-						SaveQrcodeToBuf(ShmSysConfigAndInfo->SysConfig.SystemId);
-						ChangeQrCode_Idle((char *)ShmSysConfigAndInfo->SysConfig.SystemId, len);
-					}
-					else
-					{
-						byte len = strlen((char *)ShmSysConfigAndInfo->SysConfig.QRCodeContent);
-						SaveQrcodeToBuf(ShmSysConfigAndInfo->SysConfig.QRCodeContent);
-						ChangeQrCode_Idle((char *)ShmSysConfigAndInfo->SysConfig.QRCodeContent, len);
-					}
-				}
-			}
-
-			bool isCharging = false;
-			for(byte i = 0; i < _totalCount; i++)
-			{
-				if (_chargingInfoData[i]->SystemStatus == SYS_MODE_IDLE)
-					continue;
-
-				isCharging = true;
-				break;
-			}
-
-			if (isCharging && ShmSysConfigAndInfo->SysInfo.IsAlternatvieConf == NO)
-			{
-				ChangeDisplay2Value(__sel_gun_btn, _sel_gun_btn);
-			}
-			else
-			{
-				ChangeDisplay2Value(__sel_gun_btn, _disappear);
-			}
-		}
-			break;
-		case _LCM_AUTHORIZING:
-		case _LCM_AUTHORIZ_COMP:
-		case _LCM_AUTHORIZ_FAIL:
-		{
-			FirstPageChanged();
-		}
-			break;
-		case _LCM_WAIT_FOR_PLUG:
-		{
-			FirstPageChanged();
-			bool isCharging = false;
-			for(byte i = 0; i < _totalCount; i++)
-			{
-				if (_chargingInfoData[i]->SystemStatus == SYS_MODE_IDLE ||
-						_chargingInfoData[i]->SystemStatus == SYS_MODE_MAINTAIN ||
-						_chargingInfoData[i]->SystemStatus == SYS_MODE_RESERVATION)
-					continue;
-
-				isCharging = true;
-				break;
-			}
-
-			if (ShmSysConfigAndInfo->SysConfig.AuthorisationMode == AUTH_MODE_DISABLE)
-			{
-				// 新增隨插即充功能預設在等待插槍頁面在開啟
-				ChangeDisplay2Value(__ret_home_btn, _disappear);
-			}
-			else
-				ChangeDisplay2Value(__ret_home_btn, _back_home_btn);
-
-			if (isCharging && ShmSysConfigAndInfo->SysInfo.IsAlternatvieConf == NO)
-			{
-				ChangeDisplay2Value(__sel_gun_btn, _sel_gun_btn);
-			}
-			else
-			{
-				ChangeDisplay2Value(__sel_gun_btn, _disappear);
-			}
-		}
-			break;
-		case _LCM_PRE_CHARGE:
-		case _LCM_CHARGING:
-		case _LCM_COMPLETE:
-		{
-			bool isShowAc = false;
-			byte gunTargetIndex = 0;
-
-			ChangeDisplay2Value(__ret_home_btn, _back_home_btn);
-
-			if (acgunCount > 0)
-			{
-				gunTargetIndex = 2;
-				if (ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc != NO_DEFINE)
-				{
-					isShowAc = true;
-					if (_currentPage == _LCM_COMPLETE)
-						ChangeDisplay2Value(__cmp_gun_type_index + (gunTargetIndex * 2), _actype_light_cmp);
-					else
-						ChangeDisplay2Value(__gun_type_index + (gunTargetIndex * 2), _actype_light);
-
-					if (_currentPage == _LCM_CHARGING)
-					{
-						ChangeAcBattMapAndValue(_LCM_CHARGING);
-						if (ac_chargingInfo[0]->PresentChargedDuration >= 0 &&
-								ac_chargingInfo[0]->PresentChargedDuration <= TIME_MAX_SEC)
-							ChangeRemainTime(ac_chargingInfo[0]->PresentChargedDuration);
-						else
-							ChangeRemainTime(0);
-
-						if (ac_chargingInfo[0]->PresentChargingPower >= 0.1 &&
-								ac_chargingInfo[0]->PresentChargingPower <= POWER_MAX_KW)
-							ChangeChargingPowerValue(ac_chargingInfo[0]->PresentChargingPower);
-						else
-							ChangeChargingPowerValue(0);
-
-						if (ac_chargingInfo[0]->PresentChargedEnergy >= 0.1 &&
-								ac_chargingInfo[0]->PresentChargedEnergy <= ENERGY_MAX_KWH)
-							ChangeChargingEnergyValue(ac_chargingInfo[0]->PresentChargedEnergy);
-						else
-							ChangeChargingEnergyValue(0);
-
-						if (strcmp((char *)ac_chargingInfo[0]->StartUserId, "") == 0 ||
-								ShmSysConfigAndInfo->SysConfig.StopChargingByButton == YES)
-							ChangeDisplay2Value(__stop_method_btn, _stop_charging_btn);
-						else
-							ChangeDisplay2Value(__stop_method_btn, _stop_charging_btn_scan);
-					}
-					else if (_currentPage == _LCM_COMPLETE)
-					{
-						ChangeAcBattMapAndValue(_LCM_COMPLETE);
-						if (ac_chargingInfo[0]->PresentChargedDuration >= 0 &&
-								ac_chargingInfo[0]->PresentChargedDuration <= TIME_MAX_SEC)
-							ChangeRemainTime(ac_chargingInfo[0]->PresentChargedDuration);
-						else
-							ChangeRemainTime(0);
-
-						if (ac_chargingInfo[0]->PresentChargingPower >= 0.1 &&
-								ac_chargingInfo[0]->PresentChargingPower <= POWER_MAX_KW)
-							ChangeChargingPowerValue(ac_chargingInfo[0]->PresentChargingPower);
-						else
-							ChangeChargingPowerValue(0);
-
-						if ((ac_chargingInfo[0]->PresentChargedEnergy >= 0.1 &&
-								ac_chargingInfo[0]->PresentChargedEnergy <= ENERGY_MAX_KWH) ||
-								(strcmp((char *)ShmSysConfigAndInfo->SysConfig.OcppServerURL, "") != EQUAL &&
-										strcmp((char *)ShmSysConfigAndInfo->SysConfig.ChargeBoxId, "") != EQUAL))
-						{
-							ChangeChargingEnergyValue(ac_chargingInfo[0]->PresentChargedEnergy);
-
-							if (ShmSysConfigAndInfo->SysConfig.BillingData.isBilling &&
-									ac_chargingInfo[0]->ChargingFee >= 0)
-							{
-								ChangeChargingFeeValue(ac_chargingInfo[0]->ChargingFee);
-							}
-						}
-						else
-						{
-							ChangeChargingEnergyValue(0);
-							if (ShmSysConfigAndInfo->SysConfig.BillingData.isBilling)
-								ChangeChargingFeeValue(0);
-						}
-
-						if(!ShmSysConfigAndInfo->SysConfig.BillingData.isBilling)
-						{
-							ChangeDisplay2Value(__charging_fee_map, _disappear);
-							ChangeDisplay2Value(__charging_fee_tx, _disappear);
-						}
-						else
-						{
-							ChangeDisplay2Value(__charging_fee_map, _money_map);
-						}
-					}
-				}
-				else
-				{
-					if (_currentPage == _LCM_COMPLETE)
-						ChangeDisplay2Value(__cmp_gun_type_index + (gunTargetIndex * 2), _actype_dark_cmp);
-					else
-						ChangeDisplay2Value(__gun_type_index + (gunTargetIndex * 2), _actype_dark);
-				}
-			}
-			else
-			{
-				if (_totalCount > 1)
-				{
-					gunTargetIndex = 2;
-					ChangeDisplay2Value(__cmp_gun_type_index + (gunTargetIndex * 2), _disappear);
-					ChangeDisplay2Value(__gun_type_index + (gunTargetIndex * 2), _disappear);
-				}
-			}
-
-			gunTargetIndex = 0;
-			for(byte i = 0; i < _totalCount; i++)
-			{
-				if (_totalCount == 1 && acgunCount <= 0)
-					gunTargetIndex = 2;
-				else
-					gunTargetIndex = i;
-
-				switch(_chargingInfoData[i]->Type)
-				{
-					case _Type_Chademo:
-					{
-						if (ShmSysConfigAndInfo->SysInfo.CurGunSelected == i && !isShowAc)
-						{
-							if (_currentPage == _LCM_COMPLETE)
-								ChangeDisplay2Value(__cmp_gun_type_index + (gunTargetIndex * 2), _chademo_light_cmp);
-							else
-								ChangeDisplay2Value(__gun_type_index + (gunTargetIndex * 2), _chademo_light);
-						}
-						else
-						{
-							if (_currentPage == _LCM_COMPLETE)
-								ChangeDisplay2Value(__cmp_gun_type_index + (gunTargetIndex * 2), _chademo_dark_cmp);
-							else
-								ChangeDisplay2Value(__gun_type_index + (gunTargetIndex * 2), _chademo_dark);
-						}
-					}
-						break;
-					case _Type_GB:
-					{
-						if (ShmSysConfigAndInfo->SysInfo.CurGunSelected == i && !isShowAc)
-						{
-							if (_currentPage == _LCM_COMPLETE)
-								ChangeDisplay2Value(__cmp_gun_type_index + (gunTargetIndex * 2), _gbt_light_cmp);
-							else
-								ChangeDisplay2Value(__gun_type_index + (gunTargetIndex * 2), _gbt_light);
-						}
-						else
-						{
-							if (_currentPage == _LCM_COMPLETE)
-								ChangeDisplay2Value(__cmp_gun_type_index + (gunTargetIndex * 2), _gbt_dark_cmp);
-							else
-								ChangeDisplay2Value(__gun_type_index + (gunTargetIndex * 2), _gbt_dark);
-						}
-					}
-						break;
-					case _Type_CCS_2:
-					{
-						if (ShmSysConfigAndInfo->SysInfo.CurGunSelected == i && !isShowAc)
-						{
-							if (_currentPage == _LCM_COMPLETE)
-								ChangeDisplay2Value(__cmp_gun_type_index + (gunTargetIndex * 2), _ccs_light_cmp);
-							else
-								ChangeDisplay2Value(__gun_type_index + (gunTargetIndex * 2), _ccs_light);
-						}
-						else
-						{
-							if (_currentPage == _LCM_COMPLETE)
-								ChangeDisplay2Value(__cmp_gun_type_index + (gunTargetIndex * 2), _ccs_dark_cmp);
-							else
-								ChangeDisplay2Value(__gun_type_index + (gunTargetIndex * 2), _ccs_dark);
-						}
-					}
-						break;
-				}
-
-				if (_currentPage == _LCM_PRE_CHARGE && !isShowAc)
-				{
-					if (ShmSysConfigAndInfo->SysInfo.CurGunSelected == i)
-					{
-						ChangeBattMapAndValue(_currentPage, _chargingInfoData[i]->EvBatterySoc);
-					}
-				}
-				else if (_currentPage == _LCM_CHARGING && !isShowAc)
-				{
-					if (ShmSysConfigAndInfo->SysInfo.CurGunSelected == i)
-					{
-						ChangeBattMapAndValue(_currentPage, _chargingInfoData[i]->EvBatterySoc);
-						if (_chargingInfoData[i]->PresentChargedDuration >= 0 &&
-								_chargingInfoData[i]->PresentChargedDuration <= TIME_MAX_SEC)
-							ChangeRemainTime(_chargingInfoData[i]->PresentChargedDuration);
-						else
-							ChangeRemainTime(0);
-
-						if (_chargingInfoData[i]->PresentChargingPower >= 0 &&
-								_chargingInfoData[i]->PresentChargingPower <= POWER_MAX_KW)
-							ChangeChargingPowerValue(_chargingInfoData[i]->PresentChargingPower);
-						else
-							ChangeChargingPowerValue(0);
-
-						if (_chargingInfoData[i]->PresentChargedEnergy >= 0.1 &&
-								_chargingInfoData[i]->PresentChargedEnergy <= ENERGY_MAX_KWH)
-							ChangeChargingEnergyValue(_chargingInfoData[i]->PresentChargedEnergy);
-						else
-							ChangeChargingEnergyValue(0);
-                            /*
-						if (strcmp((char *)_chargingInfoData[i]->StartUserId, "") == 0 ||
-								ShmSysConfigAndInfo->SysConfig.StopChargingByButton == YES ||
-								_chargingInfoData[i]->isRemoteStart ||
-								ShmDcCommonData->_authWithCcidFlag [i] == _CCID_AUTHCOMP)
-							ChangeDisplay2Value(__stop_method_btn, _stop_charging_btn);
-						else
-							ChangeDisplay2Value(__stop_method_btn, _stop_charging_btn_scan);
-                            */
-					}
-				}
-				else if (_currentPage == _LCM_COMPLETE && !isShowAc)
-				{
-					if (ShmSysConfigAndInfo->SysInfo.CurGunSelected == i)
-					{
-						ChangeBattMapAndValue(_currentPage, _chargingInfoData[i]->EvBatterySoc);
-						if (_chargingInfoData[i]->PresentChargedDuration >= 0 &&
-								_chargingInfoData[i]->PresentChargedDuration <= TIME_MAX_SEC)
-							ChangeRemainTime(_chargingInfoData[i]->PresentChargedDuration);
-						else
-							ChangeRemainTime(0);
-
-						if (_chargingInfoData[i]->PresentChargingPower >= 0 &&
-								_chargingInfoData[i]->PresentChargingPower <= POWER_MAX_KW)
-							ChangeChargingPowerValue(_chargingInfoData[i]->PresentChargingPower);
-						else
-							ChangeChargingPowerValue(0);
-
-						if ((_chargingInfoData[i]->PresentChargedEnergy >= 0.1 &&
-								_chargingInfoData[i]->PresentChargedEnergy <= ENERGY_MAX_KWH) ||
-								(strcmp((char *)ShmSysConfigAndInfo->SysConfig.OcppServerURL, "") != EQUAL &&
-									strcmp((char *)ShmSysConfigAndInfo->SysConfig.ChargeBoxId, "") != EQUAL))
-						{
-							ChangeChargingEnergyValue(_chargingInfoData[i]->PresentChargedEnergy);
-
-							if (ShmSysConfigAndInfo->SysConfig.BillingData.isBilling &&
-								_chargingInfoData[i]->ChargingFee >= 0)
-							{
-								ChangeChargingFeeValue(_chargingInfoData[i]->ChargingFee);
-							}
-						}
-						else
-						{
-							ChangeChargingEnergyValue(0);
-							if (ShmSysConfigAndInfo->SysConfig.BillingData.isBilling)
-								ChangeChargingFeeValue(0);
-						}
-
-						if(!ShmSysConfigAndInfo->SysConfig.BillingData.isBilling)
-						{
-							ChangeDisplay2Value(__charging_fee_map, _disappear);
-							ChangeDisplay2Value(__charging_fee_tx, _disappear);
-						}
-						else
-						{
-							ChangeDisplay2Value(__charging_fee_map, _money_map);
-						}
-					}
-				}
-			}
-
-			if (_totalCount > 1 &&
-					ShmSysConfigAndInfo->SysInfo.IsAlternatvieConf == NO)
-			{
-				ChangeDisplay2Value(__sel_gun_btn, _sel_gun_btn);
-			}
-			else
-			{
-				ChangeDisplay2Value(__sel_gun_btn, _disappear);
-			}
-
-			// gun btn and QR code
-			if (_totalCount + acgunCount >= 2 && _currentPage)
-			{
-				byte index = 0;
-				for(index = 0; index < _totalCount; index++)
-				{
-					if(ShmSysConfigAndInfo->SysInfo.CurGunSelected != index)
-					{
-						break;
-					}
-				}
-
-				if (_chargingInfoData[index]->SystemStatus == SYS_MODE_IDLE ||
-						_chargingInfoData[index]->SystemStatus == SYS_MODE_RESERVATION ||
-						_chargingInfoData[index]->SystemStatus == SYS_MODE_BOOTING)
-				{
-					if (FirstPageChanged() == YES || needReloadQr || _page_reload)
-					{
-						if (ShmSysConfigAndInfo->SysConfig.isQRCode)
-						{
-							needReloadQr = false;
-							if (ShmSysConfigAndInfo->SysConfig.QRCodeMadeMode == NO)
-							{
-								byte len = strlen((char *)ShmSysConfigAndInfo->SysConfig.SystemId);
-								ChangeQrCode_Charge((char *)ShmSysConfigAndInfo->SysConfig.SystemId, len);
-							}
-							else
-							{
-								byte len = strlen((char *)ShmSysConfigAndInfo->SysConfig.QRCodeContent);
-								ChangeQrCode_Charge((char *)ShmSysConfigAndInfo->SysConfig.QRCodeContent, len);
-							}
-						}
-					}
-				}
-			}
-		}
-			break;
-	}
-}
-
-void ChangeDisplayMoneyInfoWithoutBackend()
-{
-	struct timeb csuTime;
-	struct tm *tmCSU;
-
-	ftime(&csuTime);
-	tmCSU = localtime(&csuTime.time);
-
-	ChangeDisplay2Value(__money_rate_map, _charging_money);
-
-	if (tmCSU->tm_hour <= 23)
-	{
-		//ShmDcCommonData->_hour_index = tmCSU->tm_hour;
-		ShmSysConfigAndInfo->SysConfig.BillingData.Cur_fee = ShmSysConfigAndInfo->SysConfig.BillingData.Fee[tmCSU->tm_hour];
-		DisplayMoneyRate(ShmSysConfigAndInfo->SysConfig.BillingData.Cur_fee);
-	}
-
-	if (ShmSysConfigAndInfo->SysConfig.BillingData.Currency <= 53)
-	{
-        DisplayMoneyCur((uint8_t *)GetCurrency(pSysConfig->BillingData.Currency));
-	}
-}
-
-void ChangeDisplayMoneyInfo()
-{
-    uint8_t curGun = pSysInfo->CurGunSelected;
-
-    if (pSysConfig->BillingData.isBilling) {
-        struct timeb csuTime;
-        struct tm *tmCSU;
-
-        ftime(&csuTime);
-        tmCSU = localtime(&csuTime.time);
-
-        ChangeDisplay2Value(__money_rate_map, _charging_money);
-#if defined DD360Audi
-        if (ShmSelectGunInfo->PricesInfo[curGun].UserPrices != 0.00) { //Jerry add
-            DisplayMoneyRate(ShmSelectGunInfo->PricesInfo[curGun].UserPrices);
-        } else {
-#endif //defined DD360Audi
-            if (tmCSU->tm_hour <= 23) {
-                pSysConfig->BillingData.Cur_fee = pSysConfig->BillingData.Fee[tmCSU->tm_hour];
-                DisplayMoneyRate(pSysConfig->BillingData.Cur_fee);
-            }
-
-            if (pSysConfig->BillingData.Currency <= 53) {
-                DisplayMoneyCur((uint8_t *)GetCurrency(pSysConfig->BillingData.Currency));
-            }
-#if defined DD360Audi
-        }
-#endif //defined DD360Audi
-    } else {
-        ChangeDisplay2Value(__money_rate_map, _disappear);
-        ChangeDisplay2Value(__money_by_rate, _disappear);
-        ChangeDisplay2Value(__money_rate, _disappear);
-    }
-#if 0
-	struct timeb csuTime;
-	struct tm *tmCSU;
-
-	ftime(&csuTime);
-	tmCSU = localtime(&csuTime.time);
-
-	ChangeDisplay2Value(__money_rate_map, _charging_money);
-	//ShmDcCommonData->_hour_index = tmCSU->tm_hour;
-	if (ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc == DEFAULT_AC_INDEX)
-	{
-		if (ac_chargingInfo[0]->SystemStatus == SYS_MODE_IDLE ||
-				ac_chargingInfo[0]->SystemStatus == SYS_MODE_MAINTAIN ||
-				ac_chargingInfo[0]->SystemStatus == SYS_MODE_RESERVATION)
-		{
-			ShmSysConfigAndInfo->SysConfig.BillingData.Cur_fee = (float)ShmDcCommonData->balanceInfo.defaultPrice / 100;
-		}
-		else
-		{
-			if (ShmSysConfigAndInfo->SysConfig.TotalConnectorCount > 0)
-			{
-				if (ShmDcCommonData->balanceInfo.connectorBalanceInfo[1].UserPrice == 0)
-					ShmSysConfigAndInfo->SysConfig.BillingData.Cur_fee = (float)ShmDcCommonData->balanceInfo.defaultPrice / 100;
-				else
-				{
-					ShmSysConfigAndInfo->SysConfig.BillingData.Cur_fee =
-							(float)ShmDcCommonData->balanceInfo.connectorBalanceInfo[1].UserPrice / 100;
-				}
-
-				if (ShmDcCommonData->balanceInfo.connectorBalanceInfo[1].AccountBalance > 0)
-					ac_chargingInfo[0]->ChargingFee = (float)ShmDcCommonData->balanceInfo.connectorBalanceInfo[1].AccountBalance / 100;
-				else
-					ac_chargingInfo[0]->ChargingFee = 0;
-			}
-			else
-			{
-				if (ShmDcCommonData->balanceInfo.connectorBalanceInfo[0].UserPrice == 0)
-					ShmSysConfigAndInfo->SysConfig.BillingData.Cur_fee = (float)ShmDcCommonData->balanceInfo.defaultPrice / 100;
-				else
-					ShmSysConfigAndInfo->SysConfig.BillingData.Cur_fee = ShmDcCommonData->balanceInfo.connectorBalanceInfo[0].UserPrice;
-
-				if (ShmDcCommonData->balanceInfo.connectorBalanceInfo[0].AccountBalance > 0)
-					ac_chargingInfo[0]->ChargingFee = (float)ShmDcCommonData->balanceInfo.connectorBalanceInfo[0].AccountBalance / 100;
-				else
-					ac_chargingInfo[0]->ChargingFee = 0;
-			}
-		}
-		DisplayMoneyRate(ShmSysConfigAndInfo->SysConfig.BillingData.Cur_fee);
-	}
-	else
-	{
-		if (_chargingInfoData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus == SYS_MODE_IDLE ||
-				_chargingInfoData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus == SYS_MODE_MAINTAIN ||
-				_chargingInfoData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus == SYS_MODE_RESERVATION)
-		{
-			ShmSysConfigAndInfo->SysConfig.BillingData.Cur_fee = (float)ShmDcCommonData->balanceInfo.defaultPrice / 100;
-		}
-		else
-		{
-			byte acGunIndex = 0;
-
-			if (ShmSysConfigAndInfo->SysInfo.CurGunSelected == 1)
-				acGunIndex = ShmSysConfigAndInfo->SysConfig.AcConnectorCount;
-
-			if (ShmDcCommonData->balanceInfo.connectorBalanceInfo[ShmSysConfigAndInfo->SysInfo.CurGunSelected + acGunIndex].UserPrice == 0)
-			{
-				ShmSysConfigAndInfo->SysConfig.BillingData.Cur_fee = (float)ShmDcCommonData->balanceInfo.defaultPrice / 100;
-			}
-			else
-			{
-				ShmSysConfigAndInfo->SysConfig.BillingData.Cur_fee =
-					(float)ShmDcCommonData->balanceInfo.connectorBalanceInfo[ShmSysConfigAndInfo->SysInfo.CurGunSelected + acGunIndex].UserPrice / 100;
-			}
-
-			if (ShmDcCommonData->balanceInfo.connectorBalanceInfo[ShmSysConfigAndInfo->SysInfo.CurGunSelected + acGunIndex].AccountBalance > 0)
-			{
-				_chargingInfoData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->ChargingFee =
-						(float)ShmDcCommonData->balanceInfo.connectorBalanceInfo[ShmSysConfigAndInfo->SysInfo.CurGunSelected + acGunIndex].AccountBalance / 100;
-			}
-			else
-			{
-				_chargingInfoData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->ChargingFee = 0;
-			}
-		}
-		DisplayMoneyRate(ShmSysConfigAndInfo->SysConfig.BillingData.Cur_fee);
-	}
-
-	if (ShmSysConfigAndInfo->SysConfig.BillingData.Currency <= 53)
-	{
-        DisplayMoneyCur((uint8_t *)GetCurrency(pSysConfig->BillingData.Currency));
-	}
-#endif
-}
-
-void Initialization()
-{
-	bool isPass = false;
-	byte count = 5;
-	while(!isPass && count > 0)
-	{
-		isPass = true;
-		for (byte _index = 0; _index < _totalCount; _index++)
-		{
-			if (!FindChargingInfoData(_index, &_chargingInfoData[0]))
-			{
-				log_error("LcmComm (main) : FindChargingInfoData false \n");
-				isPass = false;
-				count--;
-				break;
-			}
-		}
-
-		sleep(1);
-	}
-
-	isPass = false;
-
-	if (acgunCount > 0)
-	{
-		while(!isPass)
-		{
-			isPass = true;
-			for (byte _index = 0; _index < acgunCount; _index++)
-			{
-				if (!FindAcChargingInfoData(_index, &ac_chargingInfo[0]))
-				{
-					log_error("LcmComm : FindAcChargingInfoData false \n");
-					isPass = false;
-					break;
-				}
-			}
-
-			sleep(1);
-		}
-	}
-
-	if (count == 0)
-		PRINTF_FUNC("LCM Initialization Gun Fail.............\n");
-}
-
-void DefaultIconStatus()
-{
-	for(byte i = 0; i < 3; i++)
-		ChangeDisplay2Value(__gun_type_index + (i * 2), _disappear);
-
-	if (ShmSysConfigAndInfo->SysInfo.IsAlternatvieConf == YES || _totalCount == 1)
-		ChangeDisplay2Value(__sel_gun_btn, _disappear);
-	else
-		ChangeDisplay2Value(__sel_gun_btn, _sel_gun_btn);
-/*
-	if (ShmDcCommonData->ShowLogoFlag)
-	{
-		ChangeDisplay2Value(__logo, _logo);
-		ChangeDisplay2Value(__logo_cmp, _logo_cmp);
-	}
-	else
-	{
-		ChangeDisplay2Value(__logo, _disappear);
-		ChangeDisplay2Value(__logo_cmp, _disappear);
-	}
-*/
-	char _buf[3] = {0};
-	memcpy(_buf, &ShmSysConfigAndInfo->SysConfig.ModelName[12], 2);
-
-	// N0 : 拓連
-    /*
-	if (ShmDcCommonData->ShowLogoFlag &&
-			strcmp(_buf, "N0") != EQUAL)
-	{
-		ChangeDisplay2Value(__phihong_string, _phihong_string_map);
-	}
-	else
-	{
-		ChangeDisplay2Value(__phihong_string, _disappear);
-	}
-    */
-}
-
-//=======================================
-// Download image
-//=======================================
-//char lcdRegisterWrite(byte command, short address, byte *data, byte len)
-//{
-//	byte cmd[256];
-//	memset(cmd, 0x00, sizeof(cmd));
-//	char result = FAIL;
-//
-//	cmd[0] = CMD_TITLE_1;
-//	cmd[1] = CMD_TITLE_2;
-//	cmd[2] = 0x03 + len;
-//	cmd[3] = command;
-//	cmd[4] = address >> 8;
-//	cmd[5] = address & 0x00FF;
-//
-//	for(byte count = 0; count < len; count++)
-//	{
-//		cmd[6 + count] = *(data + count);
-//	}
-//
-//	//WriteCmdToLcm(cmd, cmd[2] + 3);
-//	int slen = write(Uart1Fd, cmd, cmd[2] + 3);
-//	printf("%d \n", slen);
-//	if(slen >= cmd[2] + 3)
-//	{
-//		printf("Pass. \n");
-//		result = PASS;
-//	}
-//	else
-//	{
-//		result = FAIL;
-//		printf("Fail. \n");
-//	}
-//
-//	return result;
-//}
-
-void displayMessageDgus(uint8_t *data, uint16_t len, uint8_t isRX)
-{
-	uint8_t output[8192];
-
-	memset(output, 0x00, ARRAY_SIZE(output));
-	sprintf((char*)output, "%s", (isRX?"RX: ":"TX: "));
-	for(uint16_t idx = 0;idx<len;idx++)
-	{
-		sprintf((char*)output, "%s%02x ", output, data[idx]);
-	}
-
-	#ifdef isDebugPrint
-	log_info("%s\n", output);
-	#endif
-}
-
-int transceiverDgus(int32_t fd, uint8_t *tx, uint16_t tx_len, uint8_t *rx, uint16_t rx_len)
-{
-	int result = FAIL;
-	int len;
-
-	tcflush(fd,TCIOFLUSH);
-
-	#ifdef isDebugPrint
-	displayMessageDgus(tx, tx_len, NO);
-	#endif
-
-	usleep(10000);
-
-	if(write(fd, tx, tx_len) >= ARRAY_SIZE(tx))
-	{
-		if(tx[3] == CMD_REG_WRITE_DATA)
-		{
-			len = read(fd, rx, rx_len);
-			if(len > 0)
-			{
-				if((rx[0] == CMD_HEADER_1) && (rx[1] == CMD_HEADER_2))
-				{
-					if((rx[3] == CMD_REG_WRITE_DATA) && (rx[4] == 0x4f) && (rx[5] == 0x4b))
-					{
-						displayMessageDgus(rx, len, YES);
-						result = PASS;
-					}
-				}
-			}
-		}
-		else if(tx[3] == CMD_REG_READ_DATA)
-		{
-			len = read(fd, rx, rx_len);
-			if(len > 0)
-			{
-				if((rx[0] == CMD_HEADER_1) && (rx[1] == CMD_HEADER_2))
-				{
-					if(rx[3] == CMD_REG_READ_DATA)
-					{
-
-						displayMessageDgus(rx, len, YES);
-
-						result = PASS;
-					}
-					else
-					{}
-				}
-				else
-				{}
-			}
-			else
-			{}
-		}
-		else
-		{}
-	}
-	else
-	{}
-
-	return result;
-}
-
-int8_t lcdRegisterWrite(int32_t fd, uint8_t regType, uint16_t address, uint8_t *data, uint16_t dataLen)
-{
-	int8_t result = FAIL;
-	uint8_t tx[(regType == REG_TYPE_CONTROL? 8 : 6) + dataLen];
-	uint8_t rx[6];
-
-	memset(tx, 0x00, sizeof(tx));
-	memset(rx, 0x00, sizeof(rx));
-
-	tx[0] = CMD_HEADER_1;
-	tx[1] = CMD_HEADER_2;
-	tx[2] = (regType == REG_TYPE_CONTROL? 7 : (3 + dataLen));
-	tx[3] = CMD_REG_WRITE_DATA;
-	tx[4] = (address >> 8) & 0xff;
-	tx[5] = (address >> 0) & 0xff;
-
-	if(regType == REG_TYPE_CONTROL)
-	{
-		if(address == REG_ADDRESS_SET_PAGE_ID)
-		{
-			tx[6] = 0x5A;
-			tx[7] = 0x01;
-
-			memcpy(&tx[8], data, dataLen);
-		}
-	}
-	else
-	{
-		memcpy(&tx[6], data, dataLen);
-	}
-
-	if(fd > 0)
-	{
-		if(transceiverDgus(fd, tx, ARRAY_SIZE(tx), rx, ARRAY_SIZE(rx)) == PASS)
-		{
-			result = PASS;
-		}
-		else
-		{}
-	}
-	else
-	{}
-
-	return result;
-}
-
-int main(void)
-{
-    /*
-	if(InitShareMemory() == FAIL)
-	{
-		#ifdef SystemLogMessage
-		log_error("InitShareMemory NG\n");
-		#endif
-		if (ShmStatusCodeData != NULL)
-		{
-			ShmStatusCodeData->AlarmCode.AlarmEvents.bits.FailToCreateShareMemory =	1;
-		}
-		sleep(5);
-		return 0;
-	}*/
-    log_info("!!!!!!!!!!!!!!!!!!! LCM !!!!!!!!!!!!!!!!!!!!!!!!!!!!");
-    if (CreateAllCsuShareMemory() == FAIL) {
-        log_error("create share memory error");
-        return FAIL;
-    }
-
-    MappingGunChargingInfo("LCM Control Task");
-
-
-	Uart1Fd = CreateCommunicationLcmPort();
-	byte changeWarningPriority = 0;
-	byte curWarningCount = 255;
-	ChangeBackLight(true);
-	_totalCount = ShmSysConfigAndInfo->SysConfig.TotalConnectorCount;
-	acgunCount = ShmSysConfigAndInfo->SysConfig.AcConnectorCount;
-    pSysInfo = (struct SysInfoData *)GetShmSysInfoData();
-    pSysConfig = (struct SysConfigData *)GetShmSysConfigData();
-	//Initialization();
-
-	//GetDeviceInfoStatus(0x104A, 3);
-	//ChangeToOtherPage(_LCM_AUTHORIZING);
-	//ChangeDisplay2Value(0x1052, _main_rfid);
-	//byte len = strlen((char *)ShmSysConfigAndInfo->SysConfig.SystemId);
-	//ChangeQrCode_Idle((char *)ShmSysConfigAndInfo->SysConfig.SystemId, len);
-	ChangeToOtherPage(_LCM_INIT);
-	//GetCurrentPage();
-	//return -1;
-
-	DefaultIconStatus();
-
-//	for(;;)
-//	{
-//		GetDeviceInfoStatus(__lcm_version, 3);
-//		sleep(1);
-//	}
-//
-//	return -1;
-
-//	int xxx = 3;
-//	while(xxx > 0 && Uart1Fd != -1)
-//	{
-//		if (xxx == 1)
-//		{
-//			printf("---------------------------- \n");
-//			downloadBMP(1, "/tmp/1_idle.bmp");
-//			printf("---------------------------- end \n");
-//			return -1;
-//		}
-//		sleep(1);
-//		xxx--;
-//	}
-//	return -1;
-
-	byte _verShowCount = 5;
-
-	while(Uart1Fd != -1)
-	{
-		if (strcmp((char *)ShmSysConfigAndInfo->SysInfo.LcmHwRev, moduleName) != 0x00)
-		{
-			GetDeviceInfoStatus(__lcm_version, 3);
-			GetCurrentPage();
-			sleep(1);
-			if (_verShowCount > 0)
-			{
-				//PRINTF_FUNC("LCM Version = V.%03d \n", ShmDcCommonData->LcmFwVersion);
-				_verShowCount--;
-			}
-            log_info("LCM Version Count:%d",_verShowCount);
-		}
-		else
-		{
-			//DemoFunction();
-
-			// Warning 處理
-			if(curWarningCount != ShmSysConfigAndInfo->SysWarningInfo.WarningCount)
-			{
-				changeWarningPriority = 0;
-				ShmSysConfigAndInfo->SysWarningInfo.PageIndex = 0;
-				curWarningCount = ShmSysConfigAndInfo->SysWarningInfo.WarningCount;
-				ChangeWarningFunc();
-			}
-			else if (ShmSysConfigAndInfo->SysWarningInfo.WarningCount > 5 && changeWarningPriority == 0)
-			{
-				// 當有兩頁 Warning 則每隔三秒改變一次
-				if(ShmSysConfigAndInfo->SysWarningInfo.PageIndex == 0)
-					ShmSysConfigAndInfo->SysWarningInfo.PageIndex = 1;
-				else
-					ShmSysConfigAndInfo->SysWarningInfo.PageIndex = 0;
-
-				ChangeWarningFunc();
-			}
-			// 頁面資訊處理
-			ProcessPageInfo();
-
-			// 網路 - wifi - 連線訊號處理
-			RefreshConnStatus();
-			// 換頁處理
-			GetCurrentPage();
-			ChangeCurPage();
-
-			RefreshPageAnimation(_everyPageRollChange);
-
-			if (changeWarningPriority == 0)
-			{
-				if (ShmSysConfigAndInfo->SysConfig.BillingData.isBilling)
-				{
-					if(strcmp((char *)ShmSysConfigAndInfo->SysConfig.OcppServerURL, "") != EQUAL &&
-							strcmp((char *)ShmSysConfigAndInfo->SysConfig.ChargeBoxId, "") != EQUAL)
-					{
-						ChangeDisplayMoneyInfo();
-					}
-					else
-						ChangeDisplayMoneyInfoWithoutBackend();
-				}
-				else
-				{
-					ChangeDisplay2Value(__money_rate_map, _disappear);
-					ChangeDisplay2Value(__money_by_rate, _disappear);
-					ChangeDisplay2Value(__money_rate, _disappear);
-				}
-
-				InformationShow();
-			}
-
-			// 掃按鈕
-			//GetDeviceInfoStatus(0x0600, 1);
-
-			changeWarningPriority >= 15 ? (_battery_display_ani = true) : (_battery_display_ani = false);
-			changeWarningPriority >= 30 ? changeWarningPriority = 0 : changeWarningPriority++;
-			usleep(100000);
-		}
-	}
-
-	CloseCommunicationLcmPort();
-	return FAIL;
-}

+ 0 - 34
EVSE/Projects/DD360Tcci/Apps/ModuleLcmCtrl/Module_LcmControl.h.Ph

@@ -1,34 +0,0 @@
-#ifndef MODULE_LCM_CTRL_H_
-#define MODULE_LCM_CTRL_H_
-
-//------------------------------------------------------------------------------
-#define DEFAULT_AC_INDEX                        (2)
-
-#define TIME_MAX_SEC                            (2592000) // 一個月,秒數
-#define POWER_MAX_KW                            (5000)
-#define ENERGY_MAX_KWH                          (5000)
-
-#define CMD_TITLE_1                             (0x5A)
-#define CMD_TITLE_2                             (0xA5)
-#define CMD_READ                                (0x80)
-#define CMD_WRITE                               (0x81)
-#define CMD_MULTI_WRITE                         (0x82)
-#define CMD_MULTI_READ                          (0x83)
-
-#define CMD_BACKLIGHT                           (0x01)
-#define CMD_REGISTER                            (0x03)
-
-//#define NOODOE_QR_CODE_URL                    "https://ev-alpha-test.noodoe.com/station?id=" ////For Audi
-#define NOODOE_QR_CODE_URL                      "https://ev.noodoe.com/station?id=" ////For Audi
-
-//------------------------------------------------------------------------------
-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,
-};
-
-#endif //MODULE_LCM_CTRL_H_

+ 0 - 234
EVSE/Projects/DD360Tcci/Apps/ModuleLcmCtrl/Module_LcmControl.h.test

@@ -1,234 +0,0 @@
-#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/mman.h>
-#include 	<linux/wireless.h>
-#include 	<arpa/inet.h>
-#include 	<netinet/in.h>
-
-#include 	<unistd.h>
-#include 	<stdarg.h>
-#include    <stdio.h>      /*標準輸入輸出定義*/
-#include    <stdlib.h>     /*標準函數庫定義*/
-#include    <unistd.h>     /*Unix 標準函數定義*/
-#include    <fcntl.h>      /*檔控制定義*/
-#include    <termios.h>    /*PPSIX 終端控制定義*/
-#include    <errno.h>      /*錯誤號定義*/
-#include 	<string.h>
-#include	<time.h>
-#include	<ctype.h>
-#include 	<ifaddrs.h>
-#include 	<stdbool.h>
-#include	"../Define/define.h"
-#include    "../Config.h"
-#define ARRAY_SIZE(A)		(sizeof(A) / sizeof(A[0]))
-#define PASS				1
-#define FAIL				-1
-#define YES					1
-#define NO					0
-#define EQUAL				0
-
-typedef unsigned char 			byte;
-
-struct SysConfigAndInfo			*ShmSysConfigAndInfo;
-struct StatusCodeData 			*ShmStatusCodeData;
-struct FanModuleData			*ShmFanModuleData;
-struct DcCommonInformation		*ShmDcCommonData;
-
-#define NO_DEFINE			255
-#define DEFAULT_AC_INDEX	2
-
-#define TIME_MAX_SEC		2592000 // 一個月,秒數
-#define POWER_MAX_KW		5000
-#define ENERGY_MAX_KWH		5000
-
-#define CMD_TITLE_1				0x5A
-#define CMD_TITLE_2				0xA5
-#define CMD_READ				0x80
-#define CMD_WRITE				0x81
-#define CMD_MULTI_WRITE			0x82
-#define CMD_MULTI_READ			0x83
-
-#define CMD_BACKLIGHT			0x01
-#define CMD_REGISTER			0x03
-
-//=======================================
-// Register Control type
-//=======================================
-#define REG_TYPE_CONTROL					0x00
-#define REG_TYPE_RAM						0x01
-#define REG_TYPE_SPECIAL_CONTROL			0x02
-
-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,
-};
-
-int Uart1Fd;
-//char* pPortName = "/dev/ttyO2";
-char* pPortName = "/dev/ttyS3";
-char* moduleName = "DMT80480T070_09WT";
-byte _totalCount;
-byte acgunCount;
-struct ChargingInfoData *_chargingInfoData[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
-struct ChargingInfoData *ac_chargingInfo[AC_QUANTITY];
-
-byte ac_ani_battery_level = _BATTERY_LEVEL_FOR_MAP_LV5;
-byte isDiffStatus = false;
-byte isChangeBattMap = false;
-// 當前選擇的槍號
-short _currentPage = _LCM_NONE;
-short _oldPage = _LCM_NONE;
-byte _gunIndex = 0;
-bool _battery_display_ani = false;
-byte _curPage_index = 0;
-bool _page_reload = false;
-byte QRCodeBuf[128];
-
-// LCM - HW
-byte _everyPageRollChange = 0;
-short __logo = 0x1000;
-short __conn_status = 0x1030;
-short __ethernet_status = 0x1032;
-short __3G4G_status = 0x1036;
-short __3G4G_move_status = 0x1038;
-short __wifi_status = 0x103C;
-
-short __sel_gun_btn = 0x1040;
-short __ret_home_btn = 0x1042;
-short __stop_method_btn = 0x1044;
-short __phihong_string = 0x1046;
-
-short __lcm_version = 0x104A;
-
-short __qr_code = 0x1250;
-short __main_rfid = 0x1052;
-short __main_qr = 0x1054;
-short __main_app = 0x1056;
-
-short __plug_in_arrow = 0x1060;
-
-short __conn_line = 0x1066;
-
-short __gun_type_index = 0x1070;
-short __cmp_gun_type_index = 0x1080;
-short __qr_code_pre = 0x1280;
-
-short __batt_map_empty = 0x1090;
-
-short __conn_line_chag = 0x1096;
-short __batt_map = 0x1100;
-short __soc_value_charging = 0x1102;
-short __remain_time_map = 0x1106;
-short __power_map = 0x1108;
-short __energy_map = 0x110A;
-short __remain_time_tx = 0x1110;
-
-short __trp_remain_time_map = 0x1116;
-short __trp_power_map = 0x1118;
-short __trp_energy_map = 0x111A;
-
-short __output_eng_tx = 0x1120;
-short __total_out_eng_tx = 0x1130;
-short __conn_line_comp = 0x1140;
-short __charging_fee_map = 0x1146;
-short __logo_cmp = 0x114A;
-short __charging_fee_tx = 0x1150;
-
-short __money_by_rate = 0x1200;
-short __money_rate = 0x1220;
-short __money_rate_map = 0x1230;
-
-short __csu_ver_string = 0x1300;
-short __csu_ver_value = 0x1310;
-short __fan_speed_string = 0x1390;
-short __fan_speed_value = 0x1400;
-
-short __dc1_ver_string = 0x1320;
-short __dc1_ver_value = 0x1330;
-short __dc2_ver_string = 0x1340;
-short __dc2_ver_value = 0x1350;
-short __eth0_ip_string = 0x1360;
-short __eth0_ip_value = 0x1370;
-short __sn_string = 0x1410;
-short __sn_value = 0x1420;
-
-// ICON ID
-byte _disappear = 0;
-byte _disconnect = 1;
-byte _connect = 2;
-byte _warning = 3;
-byte _arrow_dark = 4;
-byte _arrow_light = 5;
-byte _3G4G_disconnect = 6;
-byte _3G4G_connect = 7;
-byte _wifi_disconnect = 8;
-byte _wifi_connect = 9;
-byte _logo = 10;
-byte _conn_map1 = 11;
-byte _conn_map2 = 12;
-byte _sel_gun_btn = 13;
-byte _back_home_btn = 14;
-byte _stop_charging_btn = 15;
-byte _stop_charging_btn_scan = 16;
-byte _chademo_dark = 17;
-byte _ccs_dark = 18;
-byte _gbt_dark = 19;
-byte _actype_dark = 20;
-byte _chademo_light = 21;
-byte _ccs_light = 22;
-byte _gbt_light = 23;
-byte _actype_light = 24;
-byte _main_none_rfid = 25;
-byte _main_rfid = 26;
-byte _main_none_app = 27;
-byte _main_app = 28;
-byte _main_none_qr = 29;
-byte _main_qr = 30;
-byte _charging_map1 = 31;
-byte _charging_map2 = 32;
-byte _battery_empty = 33;
-byte _battery_cap_20 = 34;
-byte _battery_cap_40 = 35;
-byte _battery_cap_60 = 36;
-byte _battery_cap_80 = 37;
-byte _battery_cap_100 = 38;
-byte _battery_map = 39;
-byte _power_map = 40;
-byte _time_map = 41;
-byte _complete_map = 42;
-byte _battery_soc_20 = 43;
-byte _battery_soc_40 = 44;
-byte _battery_soc_60 = 45;
-byte _battery_soc_80 = 46;
-byte _battery_soc_100 = 47;
-byte _battery_eng_map = 48;
-byte _money_map = 49;
-byte _elapse_time_map = 50;
-byte _charging_money = 51;
-byte _ethernet_disconnect = 52;
-byte _ethernet_connect = 53;
-byte _chademo_dark_cmp = 54;
-byte _ccs_dark_cmp = 55;
-byte _gbt_dark_cmp = 56;
-byte _actype_dark_cmp = 57;
-byte _chademo_light_cmp = 58;
-byte _ccs_light_cmp = 59;
-byte _gbt_light_cmp = 60;
-byte _actype_light_cmp = 61;
-byte _logo_cmp = 62;
-byte _battery_eng_trp_map = 63;
-byte _money_trp_map = 64;
-byte _elapse_time_trp_map = 65;
-byte _phihong_string_map = 66;

+ 7 - 2
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
@@ -223,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 DD360 || defined DD360Audi || defined DD360ComBox
+#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) ||
@@ -285,7 +286,7 @@ void GetInputGpioStatus(int fd)
     ShmPrimaryMcuData->InputDet.bits.Key3 = ~gpio_in.Key[3] & 0x01;
 
     return;
-#endif //defined DD360 || defined DD360Audi || defined DD360ComBox
+#endif //defined DD360Tcci || defined DD360Audi || defined DD360ComBox
 
     static uint8_t _curDeviceStatus[3] = {0};
     static uint8_t _reCheckCount[3] = {0};
@@ -419,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");
@@ -639,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);

+ 7 - 7
EVSE/Projects/DD360Tcci/Apps/ModuleUpdateFW/Module_UpdateFW.c

@@ -22,11 +22,11 @@ static struct ChargingInfoData *pDcChargingInfo = NULL;
 DcCommonInfo *ShmDcCommonData = NULL; 
 #define MODELNAME_FAIL                          (0)
 #define UPGRADE_FAN                             (0x02)
-#if defined DD360 || defined DD360Audi || defined DD360ComBox
-#define UPGRADE_RB                              (0x09) //0x09 for DD360 dispenser
+#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 DD360 ||defined DD360Audi || defined DD360ComBox
+#endif //defined DD360Tcci ||defined DD360Audi || defined DD360ComBox
 #define UPGRADE_PRI                             (0x04)
 #define UPGRADE_AC                              (0x05)
 #define UPGRADE_LED                             (0x06)
@@ -47,10 +47,10 @@ void KillAllTask(void)
     system("killall Module_LcmControl");
     system("killall Module_InternalComm");
 
-#if defined DD360 || defined DD360Audi || defined DD360ComBox
+#if defined DD360Tcci || defined DD360Audi || defined DD360ComBox
     system("killall Module_DoComm");
     return ;
-#endif //defined DD360 || defined DD360Audi || defined DD360ComBox
+#endif //defined DD360Tcci || defined DD360Audi || defined DD360ComBox
 
     system("killall Module_PsuComm");
     system("killall OcppBackend &");
@@ -68,9 +68,9 @@ void KillTask(void)
     system("killall Module_LcmControl");
     system("killall Module_InternalComm");
     //system("killall Module_DoComm");
-#if defined DD360 || defined DD360Audi || defined DD360ComBox
+#if defined DD360Tcci || defined DD360Audi || defined DD360ComBox
     return ;
-#endif //defined DD360 || defined DD360Audi || defined DD360ComBox
+#endif //defined DD360Tcci || defined DD360Audi || defined DD360ComBox
 
     system("killall Module_PsuComm");
     system("killall OcppBackend &");

+ 30 - 5
EVSE/Projects/DD360Tcci/Apps/ReadCmdline.c

@@ -517,8 +517,12 @@ void GetGunSelectedNum(char *v1)
 void SetFanSpeed(char *v1)
 {
     int speed = atoi(v1);
-
-    ShmFanModuleData->TestFanSpeed = speed;
+    if(ShmDcCommonData->debugflag == YES) {
+        ShmFanModuleData->TestFanSpeed = speed;
+        printf("Set Fan speed: %d \n",ShmFanModuleData->TestFanSpeed);
+    }
+    else
+        printf("Please open debug mode\n");
 }
 
 void GetFanSpeed()
@@ -533,7 +537,8 @@ void SetDebugMode(char *v1)
 {
     int mode = atoi(v1);
 
-    pSysConfig->SwitchDebugFlag = mode;
+    ShmDcCommonData->debugflag = mode;
+    printf("Set Debug Mode:%d\n" , ShmDcCommonData->debugflag);
 }
 
 void SetGFDMode(char *v1)
@@ -717,7 +722,6 @@ void RunUnconditionalChargeIndex1(char *v1, char *v2, char *v3)
         printf ("Input Voltage over range\n");
         return;
     }
-
     //kill ev task
     system("killall Module_EvComm");
 
@@ -771,6 +775,8 @@ void RunUnconditionalChargeIndex1(char *v1, char *v2, char *v3)
 
             //清除 main timeout 機制
             pDcChargingInfo->TimeoutFlag = 0;
+            pSysInfo->SystemTimeoutFlag = 0;
+            pSysInfo->SystemPage = _LCM_NONE;
             //不論是什麼 type 的槍都固意設成 Chademo 不跑 Prechage step
             pDcChargingInfo->Type = 9;
             break;
@@ -941,6 +947,7 @@ void RunUnconditionalChargeIndex1(char *v1, char *v2, char *v3)
             pDcChargingInfo->PresentChargingPower = 0;
 
             if (stopChg == pSysConfig->TotalConnectorCount) {
+
                 system("/root/Module_EvComm &");
                 sleep(3);
 
@@ -1187,7 +1194,17 @@ static void writeOTPTemp(void)
         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;
@@ -1288,6 +1305,7 @@ int main(void)
                      "       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) {
@@ -1323,6 +1341,7 @@ int main(void)
 //    }
 
     while (isContinue) {
+
         if (readCmdKey(CMD_KEY_WAIT) == NO) {
             continue;
         }
@@ -1437,6 +1456,10 @@ int main(void)
             }
             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;
@@ -1457,6 +1480,8 @@ int main(void)
             resdGunAndChillerTemp();
         } else if (strcmp(newString[0], "OTP") == 0) { //測試槍頭和水冷機溫度
             writeOTPTemp();
+        } else if (strcmp(newString[0], "chiller") == 0) { //測試槍頭和水冷機溫度
+            writeChillerStatus(newString[1]);
         } else {
             printf("%s\n", usageMsg);
         }

+ 1 - 1
EVSE/Projects/DD360Tcci/Apps/Readme.md

@@ -6,5 +6,5 @@
     5. 重新commit。
 
 ## 更換DD360 和 DD360ComBox project
-    DD360 和 DD360ComBox 都是用DD360Audi開發和修改,完成後,執行
+    DD360Tcci 和 DD360ComBox 都是用DD360Audi開發和修改,完成後,執行
     DD360Audi/Apps/Script/replaceOtherDD360Project.sh

+ 2 - 0
EVSE/Projects/DD360Tcci/Apps/Script/copy_from_d.sh

@@ -0,0 +1,2 @@
+#!/bin/bash
+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/ 

+ 2 - 0
EVSE/Projects/DD360Tcci/Apps/Script/copy_to_D.sh

@@ -0,0 +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_Test/Apps/

+ 2 - 0
EVSE/Projects/DD360Tcci/Apps/Script/copy_to_d.sh

@@ -0,0 +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/

+ 4 - 4
EVSE/Projects/DD360Tcci/Apps/Script/replaceOtherDD360Project.sh

@@ -9,15 +9,15 @@ echo $SCRIPTPATH
 
 ProjectPath="/opt/ti-processor-sdk-linux-am335x-evm-04.02.00.09/EVSE/Projects"
 
-rm -rf $ProjectPath/DD360/Apps/;
-cp -r $ProjectPath/DD360Audi/Apps/ $ProjectPath/DD360/Apps;
-cp -r $ProjectPath/DD360Audi/ModelNameList.txt  $ProjectPath/DD360/ModelNameList.txt;
+rm -rf $ProjectPath/DD360Tcci/Apps/;
+cp -r $ProjectPath/DD360Audi/Apps/ $ProjectPath/DD360Tcci/Apps;
+cp -r $ProjectPath/DD360Audi/ModelNameList.txt  $ProjectPath/DD360Tcci/ModelNameList.txt;
 
 rm -rf $ProjectPath/DD360ComBox/Apps/;
 cp -r $ProjectPath/DD360Audi/Apps/ $ProjectPath/DD360ComBox/Apps;
 cp -r $ProjectPath/DD360Audi/ModelNameList.txt $ProjectPath/DD360ComBox/ModelNameList.txt;
 
-# git add $ProjectPath/DD360;
+# git add $ProjectPath/DD360Tcci;
 # git add $ProjectPath/DD360Audi;
 # git add $ProjectPath/DD360ComBox;
 # git status;

+ 4 - 4
EVSE/Projects/DD360Tcci/Apps/ShareMemory/shmMem.c

@@ -550,9 +550,9 @@ int InitSelectGunShmMem(void)
 {
     int MeterSMId = FAIL;
 
-#if !defined DD360 && !defined DD360Audi && !defined DD360ComBox
+#if !defined DD360Tcci && !defined DD360Audi && !defined DD360ComBox
     return;
-#endif //!defined DD360 && !defined DD360Audi && !defined DD360ComBox
+#endif //!defined DD360Tcci && !defined DD360Audi && !defined DD360ComBox
 
     if ((MeterSMId = shmget(ShmSelectGunInfoKey, sizeof(SelectGunInfo), IPC_CREAT | 0777)) < 0) {
         return FAIL;
@@ -765,13 +765,13 @@ void ClearAllShmMemParameter(void)
     //memset(ShmCsuMeterInfo, 0, sizeof(struct MeterInformation));
     memset(ShmDcCommonData, 0, sizeof(DcCommonInfo));
 
-#if defined DD360 || defined DD360Audi || defined DD360ComBox
+#if defined DD360Tcci || defined DD360Audi || defined DD360ComBox
     memset(ShmSelectGunInfo, 0, sizeof(SelectGunInfo));
 
     for (i = 0; i < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount; i++) {
         ShmSelectGunInfo->PricesInfo[i].Balance = FAIL_BALANCE_PRICES;
     }
-#endif //defined DD360 || defined DD360Audi || defined DD360ComBox
+#endif //defined DD360Tcci || defined DD360Audi || defined DD360ComBox
 }
 
 static void setAcGunTiggerStatus(void)

BIN
EVSE/Projects/DD360Tcci/Apps/UnsafetyOutputTask


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