Browse Source

2021-12-08 / Simon Xue

Action
1. Modify DD360UCar Project.

Files
As follow commit history

Image version : V2.00.XX.XXXX.XX
Simon Xue 3 years ago
parent
commit
e7fdf5b3e8

+ 21 - 0
EVSE/Projects/DD360UCar/Apps/CSU/Primary.c

@@ -45,6 +45,7 @@ void EnterAuthorizePage(uint8_t gunIndex)
 {
 {
     pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(gunIndex);
     pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(gunIndex);
     log_info("Select Gun(%d) in Authorizing",gunIndex);
     log_info("Select Gun(%d) in Authorizing",gunIndex);
+    ClearDetectPluginFlag();
     ChangeGunSelectByIndex(gunIndex);
     ChangeGunSelectByIndex(gunIndex);
     confirmSelGun(gunIndex);
     confirmSelGun(gunIndex);
     ChangeLCM(_LCM_START_SCAN);
     ChangeLCM(_LCM_START_SCAN);
@@ -65,12 +66,14 @@ void EnterDetailViewPage(uint8_t gunIndex)
     log_info("Show Gun(%d) Detail View",gunIndex);
     log_info("Show Gun(%d) Detail View",gunIndex);
     ChangeGunSelectByIndex(gunIndex);
     ChangeGunSelectByIndex(gunIndex);
     ChangeLCM(_LCM_DETAIL_VIEW);
     ChangeLCM(_LCM_DETAIL_VIEW);
+    StopGunInfoTimeoutDet(gunIndex);
     StartGunInfoTimeoutDet(gunIndex,Timeout_DetailView);
     StartGunInfoTimeoutDet(gunIndex,Timeout_DetailView);
 }
 }
 void EnterAuthorizeStopPage()
 void EnterAuthorizeStopPage()
 {
 {
     log_info("Select Gun(%d) in Stopping",pSysInfo->CurGunSelected);
     log_info("Select Gun(%d) in Stopping",pSysInfo->CurGunSelected);
     StopGunInfoTimeoutDet(pSysInfo->CurGunSelected);
     StopGunInfoTimeoutDet(pSysInfo->CurGunSelected);
+    StopSystemTimeoutDet();
     strcpy((char *)pSysConfig->UserId, "");
     strcpy((char *)pSysConfig->UserId, "");
     pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(pSysInfo->CurGunSelected);
     pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(pSysInfo->CurGunSelected);
     if (pDcChargingInfo->isRemoteStart) {
     if (pDcChargingInfo->isRemoteStart) {
@@ -95,6 +98,8 @@ void ReturnIDLE(uint8_t gunIndex)
     log_info("Gun(%d) return to IDLE",gunIndex);
     log_info("Gun(%d) return to IDLE",gunIndex);
     pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(gunIndex);
     pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(gunIndex);
     EnterViewPage();
     EnterViewPage();
+    StopSystemTimeoutDet();
+    StopGunInfoTimeoutDet(gunIndex);
     setChargerMode(gunIndex,MODE_IDLE);
     setChargerMode(gunIndex,MODE_IDLE);
     destroySelGun(gunIndex);
     destroySelGun(gunIndex);
 }
 }
@@ -137,6 +142,7 @@ void CheckLeftButton()
 }
 }
 void CheckRightButton()
 void CheckRightButton()
 {
 {
+
     uint8_t gunIndex = 0;
     uint8_t gunIndex = 0;
 
 
     switch (pSysInfo->SystemPage) {
     switch (pSysInfo->SystemPage) {
@@ -191,6 +197,10 @@ void CheckPrimaryWarm(void)
                 ShmDcCommonData->PowerAlarmState.StatusBit.DoorOpen = YES;
                 ShmDcCommonData->PowerAlarmState.StatusBit.DoorOpen = YES;
                 EmcOccureByString("042252");
                 EmcOccureByString("042252");
                 Rtn = 1;
                 Rtn = 1;
+            } else if (memcmp(&pSysWarning->WarningCode[i][0], "042327", 6) == 0) {
+                ShmDcCommonData->PowerAlarmState.StatusBit.DcInputOVP = YES;
+                EmcOccureByString("042200");
+                Rtn = 1;
             } else if (memcmp(&pSysWarning->WarningCode[i][0], "042200", 6) == 0) {
             } else if (memcmp(&pSysWarning->WarningCode[i][0], "042200", 6) == 0) {
                 ShmDcCommonData->PowerAlarmState.StatusBit.SystemL1InputOVP = YES;
                 ShmDcCommonData->PowerAlarmState.StatusBit.SystemL1InputOVP = YES;
                 EmcOccureByString("042200");
                 EmcOccureByString("042200");
@@ -216,6 +226,7 @@ void CheckPrimaryWarm(void)
         if (Rtn == 0) {
         if (Rtn == 0) {
             ShmDcCommonData->PowerAlarmState.StatusBit.EmergencyStop = NO;
             ShmDcCommonData->PowerAlarmState.StatusBit.EmergencyStop = NO;
             ShmDcCommonData->PowerAlarmState.StatusBit.DoorOpen = NO;
             ShmDcCommonData->PowerAlarmState.StatusBit.DoorOpen = NO;
+            ShmDcCommonData->PowerAlarmState.StatusBit.DcInputOVP = NO;
             ShmDcCommonData->PowerAlarmState.StatusBit.SystemL1InputOVP = NO;
             ShmDcCommonData->PowerAlarmState.StatusBit.SystemL1InputOVP = NO;
             ShmDcCommonData->PowerAlarmState.StatusBit.SystemL2InputOVP = NO;
             ShmDcCommonData->PowerAlarmState.StatusBit.SystemL2InputOVP = NO;
             ShmDcCommonData->PowerAlarmState.StatusBit.SystemL3InputOVP = NO;
             ShmDcCommonData->PowerAlarmState.StatusBit.SystemL3InputOVP = NO;
@@ -231,6 +242,7 @@ void CheckPrimaryWarm(void)
     } else {
     } else {
         ShmDcCommonData->PowerAlarmState.StatusBit.EmergencyStop = NO;
         ShmDcCommonData->PowerAlarmState.StatusBit.EmergencyStop = NO;
         ShmDcCommonData->PowerAlarmState.StatusBit.DoorOpen = NO;
         ShmDcCommonData->PowerAlarmState.StatusBit.DoorOpen = NO;
+        ShmDcCommonData->PowerAlarmState.StatusBit.DcInputOVP = NO;
         ShmDcCommonData->PowerAlarmState.StatusBit.SystemL1InputOVP = NO;
         ShmDcCommonData->PowerAlarmState.StatusBit.SystemL1InputOVP = NO;
         ShmDcCommonData->PowerAlarmState.StatusBit.SystemL2InputOVP = NO;
         ShmDcCommonData->PowerAlarmState.StatusBit.SystemL2InputOVP = NO;
         ShmDcCommonData->PowerAlarmState.StatusBit.SystemL3InputOVP = NO;
         ShmDcCommonData->PowerAlarmState.StatusBit.SystemL3InputOVP = NO;
@@ -287,6 +299,15 @@ void ChkPrimaryStatus(void)
         log_info("Offline policy no charge");
         log_info("Offline policy no charge");
         return;;
         return;;
     }
     }
+
+    // Show Version
+    if (ShmPrimaryMcuData->InputDet.bits.Button1 == BTN_PRESS &&
+            ShmPrimaryMcuData->InputDet.bits.Button2 == BTN_PRESS )
+        pSysConfig->ShowInformation = YES;
+    else
+        pSysConfig->ShowInformation = NO;
+    if (pSysConfig->ShowInformation)
+        return;
     // Press Left Button
     // Press Left Button
     if (ShmPrimaryMcuData->InputDet.bits.Button1 == BTN_PRESS && !leftBtnPush ) {
     if (ShmPrimaryMcuData->InputDet.bits.Button1 == BTN_PRESS && !leftBtnPush ) {
         leftBtnPush = true;
         leftBtnPush = true;

+ 15 - 6
EVSE/Projects/DD360UCar/Apps/CSU/main.c

@@ -3395,6 +3395,7 @@ static void ReviewCriticalAlarm(void)
             //Power cabinet alarm status
             //Power cabinet alarm status
             ShmDcCommonData->PowerAlarmState.StatusBit.EmergencyStop == YES ||
             ShmDcCommonData->PowerAlarmState.StatusBit.EmergencyStop == YES ||
             ShmDcCommonData->PowerAlarmState.StatusBit.DoorOpen == YES ||
             ShmDcCommonData->PowerAlarmState.StatusBit.DoorOpen == YES ||
+            ShmDcCommonData->PowerAlarmState.StatusBit.DcInputOVP == YES ||
             ShmDcCommonData->PowerAlarmState.StatusBit.SystemL1InputOVP == YES ||
             ShmDcCommonData->PowerAlarmState.StatusBit.SystemL1InputOVP == YES ||
             ShmDcCommonData->PowerAlarmState.StatusBit.SystemL2InputOVP == YES ||
             ShmDcCommonData->PowerAlarmState.StatusBit.SystemL2InputOVP == YES ||
             ShmDcCommonData->PowerAlarmState.StatusBit.SystemL3InputOVP == YES ||
             ShmDcCommonData->PowerAlarmState.StatusBit.SystemL3InputOVP == YES ||
@@ -3723,7 +3724,9 @@ void ResetIdleData(uint8_t gunIndex)
     strcpy((char *)pDcChargingInfo->StartDateTime, "");
     strcpy((char *)pDcChargingInfo->StartDateTime, "");
     strcpy((char *)pDcChargingInfo->StopDateTime, "");
     strcpy((char *)pDcChargingInfo->StopDateTime, "");
     strcpy((char *)pDcChargingInfo->StartUserId, "");
     strcpy((char *)pDcChargingInfo->StartUserId, "");
+    strcpy((char *)pSysConfig->UserId, "");
     strcpy((char *)ShmOCPP16Data->StopTransaction[gunIndex].StopReason, "");
     strcpy((char *)ShmOCPP16Data->StopTransaction[gunIndex].StopReason, "");
+    ClearDetectPluginFlag();
     //Jerry add
     //Jerry add
     memset(&ShmSelectGunInfo->PricesInfo[gunIndex], 0, sizeof(PricesInfo));
     memset(&ShmSelectGunInfo->PricesInfo[gunIndex], 0, sizeof(PricesInfo));
     ShmSelectGunInfo->PricesInfo[gunIndex].Balance = FAIL_BALANCE_PRICES;
     ShmSelectGunInfo->PricesInfo[gunIndex].Balance = FAIL_BALANCE_PRICES;
@@ -3743,6 +3746,8 @@ void CheckErrorCode(uint8_t gunIndex)
     if (gunIndex == pSysInfo->CurGunSelected) {
     if (gunIndex == pSysInfo->CurGunSelected) {
         //pSysInfo->SystemPage = _LCM_ERROR;
         //pSysInfo->SystemPage = _LCM_ERROR;
         pSysInfo->SystemPage = _LCM_MAINTAIN;
         pSysInfo->SystemPage = _LCM_MAINTAIN;
+        if (ShmPrimaryMcuData->InputDet.bits.EmergencyButton)
+            pSysInfo->SystemPage = _LCM_EMERGENCY;
     } else if (pSelectedDcChargingInfo->SystemStatus != S_IDLE &&
     } else if (pSelectedDcChargingInfo->SystemStatus != S_IDLE &&
             pSelectedDcChargingInfo->SystemStatus != S_RESERVATION &&
             pSelectedDcChargingInfo->SystemStatus != S_RESERVATION &&
             pSelectedDcChargingInfo->SystemStatus != S_MAINTAIN &&
             pSelectedDcChargingInfo->SystemStatus != S_MAINTAIN &&
@@ -3780,7 +3785,7 @@ void AuthorizeStopCharging(uint8_t gunIndex)
 void showversion()
 void showversion()
 {
 {
     uint8_t index = 0;
     uint8_t index = 0;
-    log_info("\t=========== Charger info =========== ");
+    log_info("\t=========== Dispenser info =========== ");
     log_info("\tSW Version = %s", fwVersion);
     log_info("\tSW Version = %s", fwVersion);
     log_info("\tDebug Version = %s",DebugVersion);
     log_info("\tDebug Version = %s",DebugVersion);
     log_info("\tModelName = %s", pSysConfig->ModelName);
     log_info("\tModelName = %s", pSysConfig->ModelName);
@@ -3847,7 +3852,8 @@ int main(void)
     log_info(" ********************************************************");
     log_info(" ********************************************************");
     log_info(" ******************  FileSystem Boot up *****************");
     log_info(" ******************  FileSystem Boot up *****************");
     log_info(" ********************************************************");
     log_info(" ********************************************************");
-
+    log_info(" ******************  Project:DD360UCar  *****************");
+    log_info(" ********************************************************");
     if (!InitialSystemDefaultConfig()) {
     if (!InitialSystemDefaultConfig()) {
         log_error("InitialSystemDefaultConfig NG ");
         log_error("InitialSystemDefaultConfig NG ");
         //StopProcessingLoop();
         //StopProcessingLoop();
@@ -4047,6 +4053,7 @@ int main(void)
                     }
                     }
                 }
                 }
 CheckStatus:
 CheckStatus:
+
 				if (pDcChargingInfo->IsAvailable == NO) {
 				if (pDcChargingInfo->IsAvailable == NO) {
 					setChargerMode(gunIndex, MODE_MAINTAIN);
 					setChargerMode(gunIndex, MODE_MAINTAIN);
 					break;
 					break;
@@ -4323,13 +4330,15 @@ CheckStatus:
                     TheEndCharging(gunIndex);
                     TheEndCharging(gunIndex);
                     StopGunInfoTimeoutDet(gunIndex);
                     StopGunInfoTimeoutDet(gunIndex);
                     //pSysInfo->SystemPage = _LCM_ERROR;
                     //pSysInfo->SystemPage = _LCM_ERROR;
-                    pSysInfo->SystemPage = _LCM_MAINTAIN;
                 }
                 }
-/*
+                pSysInfo->SystemPage = _LCM_MAINTAIN;
+
+                if (ShmPrimaryMcuData->InputDet.bits.EmergencyButton)
+                        pSysInfo->SystemPage = _LCM_EMERGENCY;
                 if (pDcChargingInfo->ConnectorPlugIn == NO &&
                 if (pDcChargingInfo->ConnectorPlugIn == NO &&
                       GetTimeoutValue(pDcChargingInfo->TimeoutTimer) >= 10000000) {
                       GetTimeoutValue(pDcChargingInfo->TimeoutTimer) >= 10000000) {
                   setChargerMode(gunIndex, MODE_IDLE);
                   setChargerMode(gunIndex, MODE_IDLE);
-                }*/
+                }
                 break;
                 break;
 
 
             case S_TERMINATING:
             case S_TERMINATING:
@@ -4438,7 +4447,7 @@ CheckStatus:
         }//for
         }//for
 
 
         //if (pSysInfo->SystemPage != _LCM_VIEW)
         //if (pSysInfo->SystemPage != _LCM_VIEW)
-        ChangeLcmByIndex(pSysInfo->SystemPage);
+        //ChangeLcmByIndex(pSysInfo->SystemPage);
 
 
         TryFeedWatchdog();
         TryFeedWatchdog();
         usleep(WHILE_LOOP_TIME);
         usleep(WHILE_LOOP_TIME);

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

@@ -76,6 +76,7 @@ void AuthorizingStart(void);
 bool IsAuthorizingMode(void);
 bool IsAuthorizingMode(void);
 bool isAuthorizedComplete(void);
 bool isAuthorizedComplete(void);
 void ClearAuthorizedFlag(void);
 void ClearAuthorizedFlag(void);
+void ClearDetectPluginFlag(void);
 
 
 void ChargingAlarmProcess(uint8_t gunIndex);
 void ChargingAlarmProcess(uint8_t gunIndex);
 void StopChargingProcessByString(uint8_t level);
 void StopChargingProcessByString(uint8_t level);

+ 21 - 34
EVSE/Projects/DD360UCar/Apps/Config.h

@@ -142,40 +142,26 @@ enum _CCS_GUN_TYPE {
     _TYPE_CCS2_Natural,
     _TYPE_CCS2_Natural,
     _TYPE_CCS2_Liquid,
     _TYPE_CCS2_Liquid,
 };
 };
-/*
-enum _LCM_INDEX {
-    _LCM_INIT          = 0x00,
-    _LCM_IDLE          = 0x01,
-    _LCM_AUTHORIZING   = 0x02,
-    _LCM_AUTHORIZ_COMP = 0x03,
-    _LCM_AUTHORIZ_FAIL = 0x04,
-    _LCM_WAIT_FOR_PLUG = 0x05,
-    _LCM_PRE_CHARGE    = 0x06,
-    _LCM_CHARGING      = 0x07,
-    _LCM_COMPLETE      = 0x08,
-    _LCM_FIX           = 0x09,
-    _LCM_SELECT_GUN    = 0x0A,
-    _LCM_NONE          = 0xFF,
-};
-*/
-enum _LCM_UAR_INDEX {
 
 
-    _LCM_VIEW                   = 0x0A,
-    _LCM_START_SCAN             = 0x01,
-    _LCM_START_AUTHORIZING      = 0x02,
-    _LCM_START_AUTHORIZE_FAIL   = 0x03,
-    _LCM_WAIT_PLUGIN            = 0x04,
-    _LCM_PRECHARGE              = 0x05,
-    _LCM_LINK_ERROR             = 0x06,
-    _LCM_DETAIL_VIEW            = 0x07,
-    _LCM_STOP_RFID              = 0x08,
-    _LCM_STOP_APP               = 0x09,
-    _LCM_STOP_RFID_FAIL         = 0x00,
-    _LCM_STOPPING               = 0x0B,
-    _LCM_WAIT_PLUGOUT           = 0x0C,
-    _LCM_SUMMARY                = 0x0D,
-    _LCM_MAINTAIN               = 0x0E,
-    _LCM_ERROR                  = 0x0F,
+enum _LCM_UAR_INDEX {
+    _LCM_NONE                   = 0x00,
+    _LCM_VIEW                   = 0x01,
+    _LCM_START_SCAN             = 0x02,
+    _LCM_START_AUTHORIZING      = 0x03,
+    _LCM_START_AUTHORIZE_FAIL   = 0x04,
+    _LCM_WAIT_PLUGIN            = 0x05,
+    _LCM_PRECHARGE              = 0x06,
+    _LCM_LINK_ERROR             = 0x07,
+    _LCM_DETAIL_VIEW            = 0x08,
+    _LCM_STOP_RFID              = 0x09,
+    _LCM_STOP_APP               = 0x0A,
+    _LCM_STOP_RFID_FAIL         = 0x0B,
+    _LCM_STOPPING               = 0x0C,
+    _LCM_WAIT_PLUGOUT           = 0x0D,
+    _LCM_SUMMARY                = 0x0E,
+    _LCM_MAINTAIN               = 0x0F,
+    _LCM_ERROR                  = 0x10,
+    _LCM_EMERGENCY              = 0x11,
 
 
     /*
     /*
     _LCM_VIEW                   = _LCM_SELECT_GUN,
     _LCM_VIEW                   = _LCM_SELECT_GUN,
@@ -376,11 +362,12 @@ typedef union {
     struct {
     struct {
         uint8_t EmergencyStop: 1;    //Power cabinet emergency stop
         uint8_t EmergencyStop: 1;    //Power cabinet emergency stop
         uint8_t DoorOpen: 1;         //Power cabinet emergency door open
         uint8_t DoorOpen: 1;         //Power cabinet emergency door open
+        uint8_t DcInputOVP: 1;
         uint8_t SystemL1InputOVP: 1; //Power cabinet system L1 input OVP
         uint8_t SystemL1InputOVP: 1; //Power cabinet system L1 input OVP
         uint8_t SystemL2InputOVP: 1; //Power cabinet System L2 input OVP
         uint8_t SystemL2InputOVP: 1; //Power cabinet System L2 input OVP
         uint8_t SystemL3InputOVP: 1; //Power cabinet System L3 input OVP
         uint8_t SystemL3InputOVP: 1; //Power cabinet System L3 input OVP
         uint8_t PsuFailure: 1;       //Power cabinet PSU Failure Alarm
         uint8_t PsuFailure: 1;       //Power cabinet PSU Failure Alarm
-        uint8_t Reserved: 2;
+        uint8_t Reserved: 1;
     } StatusBit;
     } StatusBit;
 } PowerAlarmState;
 } PowerAlarmState;
 
 

+ 2 - 2
EVSE/Projects/DD360UCar/Apps/Define/define.c

@@ -103,8 +103,8 @@ char FaultStatusCode[40][6]=
 "011036", //Rotary switch fault
 "011036", //Rotary switch fault
 "011037", //CCS liquid chiller water level fault
 "011037", //CCS liquid chiller water level fault
 "011038", //Chiller temperature sensor broken
 "011038", //Chiller temperature sensor broken
-"011039", //Reserved
-"011040" //Reserved
+"011039", //Parallel relay welding 
+"011040"  //Parallel output relay driving fault
 };
 };
 
 
 char AlarmStatusCode[160][6]=
 char AlarmStatusCode[160][6]=

+ 14 - 10
EVSE/Projects/DD360UCar/Apps/Define/define.h

@@ -551,9 +551,11 @@ struct SysConfigData
     /************PowerCabinet************/
     /************PowerCabinet************/
     WiringInfoData          WiringInfo;
     WiringInfoData          WiringInfo;
 
 
-    unsigned char           OcppReceiptrURL[512];       // Charging receipt display URL
-    unsigned char           isAuthrizeByEVCCID;         // is Authorize by EVCCID (CCS)
-    unsigned char 			MaintainServerURL[512];		//ws: non-secure OCPP 1.6-J, wss: secure OCPP 1.6-J"
+    unsigned char           OcppReceiptrURL[512];               // Charging receipt display URL
+    unsigned char           isAuthrizeByEVCCID;                 // is Authorize by EVCCID (CCS)
+    unsigned char           MaintainServerURL[512];             // ws: non-secure OCPP 1.6-J, wss: secure OCPP 1.6-J"
+    unsigned char           MaintainServerSecurityProfile;      // Maintain server security profile 0~3
+    unsigned char           MaintainServerSecurityPassword[41]; // Maintain server AuthorizationKey for security profile
 };
 };
 
 
 struct ChargingInfoData
 struct ChargingInfoData
@@ -580,6 +582,7 @@ struct ChargingInfoData
 	float PresentChargingCurrent;   // unit: 1A
 	float PresentChargingCurrent;   // unit: 1A
 	float PresentChargingPower;		//0~6553.5 kW
 	float PresentChargingPower;		//0~6553.5 kW
 	float PresentChargedEnergy;		//0~6553.5 kWh
 	float PresentChargedEnergy;		//0~6553.5 kWh
+	float presentChargedEnergyPeriod[24];       // Session present charged energy at each period
 	int PresentChargedDuration;	// second
 	int PresentChargedDuration;	// second
 	int RemainChargingDuration;	// second
 	int RemainChargingDuration;	// second
 	float EvBatteryMaxVoltage;		// 0~6553.5 volt
 	float EvBatteryMaxVoltage;		// 0~6553.5 volt
@@ -944,7 +947,7 @@ struct SysInfoData
 	unsigned char 		InternetConn;					//0: disconnected, 1: connected
 	unsigned char 		InternetConn;					//0: disconnected, 1: connected
 	/**************Backend***************/
 	/**************Backend***************/
 	unsigned char 		OcppConnStatus;					//0: disconnected, 1: connected
 	unsigned char 		OcppConnStatus;					//0: disconnected, 1: connected
-	unsigned char 		MaintainServerConnStatus;		//0: disconnected, 1: connected
+    unsigned char       MaintainServerConnStatus;       //0: disconnected, 1: connected
 	char 				OrderCharging;
 	char 				OrderCharging;
     float               MaxChargingProfilePower;        // unit: 1W
     float               MaxChargingProfilePower;        // unit: 1W
 	/**************Alston***************/
 	/**************Alston***************/
@@ -1113,8 +1116,8 @@ char FaultStatusCode[40][6]=
 	"011036",	//Rotary switch fault
 	"011036",	//Rotary switch fault
 	"011037",	//CCS liquid chiller water level fault
 	"011037",	//CCS liquid chiller water level fault
 	"011038",	//Chiller temperature sensor broken
 	"011038",	//Chiller temperature sensor broken
-	"011039",	//Reserved
-	"011040"	//Reserved
+	"011039",	//Parallel relay welding
+	"011040"	//Parallel output relay driving fault
 };
 };
 */
 */
 
 
@@ -1169,7 +1172,8 @@ struct FaultCodeData
 			unsigned char RotarySwitchFault:1;					//bit 3 
 			unsigned char RotarySwitchFault:1;					//bit 3 
 			unsigned char CcsLiquidChillerWaterLevelFault:1;    //bit 4
 			unsigned char CcsLiquidChillerWaterLevelFault:1;    //bit 4
             unsigned char ChillerTempSensorBroken:1;            //bit 5
             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;
 		}bits;
 	}FaultEvents;
 	}FaultEvents;
 };
 };
@@ -1304,7 +1308,7 @@ char AlarmStatusCode[160][6]=
     "012324",   // Connector 1 detects abnormal voltage on the output line
     "012324",   // Connector 1 detects abnormal voltage on the output line
     "012325",   // Connector 2 detects abnormal voltage on the output line
     "012325",   // Connector 2 detects abnormal voltage on the output line
     "012326",   // System task is lost
     "012326",   // System task is lost
-    "012327",   // reserved
+    "012327",   // DC input ovp
     "012328",   // reserved
     "012328",   // reserved
     "012329",   // reserved
     "012329",   // reserved
     "012330",   // reserved
     "012330",   // reserved
@@ -1490,7 +1494,7 @@ struct AlarmCodeData
             unsigned char AbnormalVoltageOnOutputLine_1:1;          //bit 4
             unsigned char AbnormalVoltageOnOutputLine_1:1;          //bit 4
             unsigned char AbnormalVoltageOnOutputLine_2:1;          //bit 5
             unsigned char AbnormalVoltageOnOutputLine_2:1;          //bit 5
             unsigned char SystemTaskLost:1;                         //bit 6
             unsigned char SystemTaskLost:1;                         //bit 6
-            unsigned char Reserved:1;                               //bit 7
+            unsigned char DcInputOVP:1;                             //bit 7
             //AlarmVal[16]
             //AlarmVal[16]
             unsigned char :8;                                       //reserved bit 0 ~ bit 7
             unsigned char :8;                                       //reserved bit 0 ~ bit 7
             //AlarmVal[17]
             //AlarmVal[17]
@@ -4265,7 +4269,7 @@ struct StructDataTransfer
 	unsigned char MessageId[52];
 	unsigned char MessageId[52];
 	unsigned char Data[512];
 	unsigned char Data[512];
 	unsigned char ResponseStatus[18];	//Accepted, Rejected,UnknownMessageId,UnknownVendorId
 	unsigned char ResponseStatus[18];	//Accepted, Rejected,UnknownMessageId,UnknownVendorId
-	unsigned char ResponseData[256];
+	unsigned char ResponseData[512];
 };
 };
 struct StructDiagnosticsStatusNotification
 struct StructDiagnosticsStatusNotification
 {
 {

+ 1 - 0
EVSE/Projects/DD360UCar/Apps/ModuleEvComm/Module_EvTxComm.c

@@ -778,6 +778,7 @@ int main(int argc, char *argv[])
 
 
             switch (pDcChargingInfo->SystemStatus) {
             switch (pDcChargingInfo->SystemStatus) {
             case S_IDLE:
             case S_IDLE:
+            case S_AUTHORIZING:
             case S_RESERVATION:
             case S_RESERVATION:
                 if (pDcChargingInfo->Type == _Type_Chademo) {
                 if (pDcChargingInfo->Type == _Type_Chademo) {
 
 

+ 8 - 6
EVSE/Projects/DD360UCar/Apps/ModuleInternalComm/RelayBoard.c

@@ -1534,8 +1534,7 @@ static void SetLedColor(void)
         } else {
         } else {
             if (chargingData_1->SystemStatus == S_BOOTING ||
             if (chargingData_1->SystemStatus == S_BOOTING ||
                     chargingData_1->SystemStatus == S_IDLE ||
                     chargingData_1->SystemStatus == S_IDLE ||
-                    chargingData_1->SystemStatus == S_RESERVATION ||
-                    chargingData_1->SystemStatus == S_MAINTAIN) {
+                    chargingData_1->SystemStatus == S_RESERVATION) {
 
 
                 if (chargingData_1->IsAvailable == NO) { //For Audi
                 if (chargingData_1->IsAvailable == NO) { //For Audi
                     led_color.Connect_1_Green = COLOR_MIN_LV;
                     led_color.Connect_1_Green = COLOR_MIN_LV;
@@ -1559,7 +1558,9 @@ static void SetLedColor(void)
                 led_color.Connect_1_Green = COLOR_MIN_LV;
                 led_color.Connect_1_Green = COLOR_MIN_LV;
                 led_color.Connect_1_Blue = _colorBuf;
                 led_color.Connect_1_Blue = _colorBuf;
                 led_color.Connect_1_Red = COLOR_MIN_LV;
                 led_color.Connect_1_Red = COLOR_MIN_LV;
-            }else if ( chargingData_1->SystemStatus == S_UPDATE ) {
+            }else if ( chargingData_1->SystemStatus == S_UPDATE ||
+                    chargingData_1->SystemStatus == S_MAINTAIN ||
+                    chargingData_1->SystemStatus == S_ALARM ) {
                 led_color.Connect_1_Green = COLOR_MIN_LV;
                 led_color.Connect_1_Green = COLOR_MIN_LV;
                 led_color.Connect_1_Blue = COLOR_MIN_LV;
                 led_color.Connect_1_Blue = COLOR_MIN_LV;
                 led_color.Connect_1_Red = _colorBuf;
                 led_color.Connect_1_Red = _colorBuf;
@@ -1569,8 +1570,7 @@ static void SetLedColor(void)
             // --------------------------------------------------------------------------
             // --------------------------------------------------------------------------
             if (chargingData_2->SystemStatus == S_BOOTING ||
             if (chargingData_2->SystemStatus == S_BOOTING ||
                     chargingData_2->SystemStatus == S_IDLE ||
                     chargingData_2->SystemStatus == S_IDLE ||
-                    chargingData_2->SystemStatus == S_RESERVATION ||
-                    chargingData_2->SystemStatus == S_MAINTAIN) {
+                    chargingData_2->SystemStatus == S_RESERVATION ) {
                 if (chargingData_2->IsAvailable == NO) {
                 if (chargingData_2->IsAvailable == NO) {
                     led_color.Connect_2_Green = COLOR_MIN_LV;
                     led_color.Connect_2_Green = COLOR_MIN_LV;
                     led_color.Connect_2_Blue = COLOR_MIN_LV;
                     led_color.Connect_2_Blue = COLOR_MIN_LV;
@@ -1593,7 +1593,9 @@ static void SetLedColor(void)
                 led_color.Connect_2_Green = COLOR_MIN_LV;
                 led_color.Connect_2_Green = COLOR_MIN_LV;
                 led_color.Connect_2_Blue = _colorBuf;
                 led_color.Connect_2_Blue = _colorBuf;
                 led_color.Connect_2_Red = COLOR_MIN_LV;
                 led_color.Connect_2_Red = COLOR_MIN_LV;
-            }else if ( chargingData_2->SystemStatus == S_UPDATE ) {
+            }else if ( chargingData_2->SystemStatus == S_UPDATE ||
+                    chargingData_2->SystemStatus == S_MAINTAIN ||
+                    chargingData_2->SystemStatus == S_ALARM) {
                 led_color.Connect_2_Green = COLOR_MIN_LV;
                 led_color.Connect_2_Green = COLOR_MIN_LV;
                 led_color.Connect_2_Blue = COLOR_MIN_LV;
                 led_color.Connect_2_Blue = COLOR_MIN_LV;
                 led_color.Connect_2_Red = _colorBuf;
                 led_color.Connect_2_Red = _colorBuf;

+ 2351 - 0
EVSE/Projects/DD360UCar/Apps/ModuleLcmCtrl/Module_LcmContro_oldl.c

@@ -0,0 +1,2351 @@
+#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;
+// 當前選擇的槍號
+short _currentPage              = _LCM_VIEW;
+short _oldPage                  = _LCM_VIEW;
+
+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;
+short __show_replugString_value = 0x0460;
+uint8_t _showReplugStr_1 = 74;
+uint8_t _showReplugStr_2 = 75;
+
+//#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(5000);
+}
+
+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(5000);
+    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_VIEW;
+        } else if (demoCount == 80) {
+            pSysInfo->PageIndex = _LCM_START_AUTHORIZING;
+        } else if (demoCount == 100) {
+            //pSysInfo->PageIndex = _LCM_AUTHORIZ_COMP;
+        } else if (demoCount == 120) {
+            pSysInfo->PageIndex = _LCM_WAIT_PLUGIN;
+        } else if (demoCount == 140) {
+            pSysInfo->PageIndex =  _LCM_LINK_ERROR;
+        } else if (demoCount == 180) {
+            pSysInfo->PageIndex = _LCM_DETAIL_VIEW;
+        }
+    }
+
+    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_replugString_value, _showReplugStr_1);
+        } else if (time < 1) {
+            ChangeDisplay2Value(__show_replugString_value, _showReplugStr_2);
+        } else
+            GetTimespecFunc(&showReplugStrTimer);
+
+    } else
+        ChangeDisplay2Value(__show_replugString_value, _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_VIEW) {
+        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_SUMMARY) {
+        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_PRECHARGE) {
+        ChangeDisplay2Value(__batt_map_empty, _battery_empty);
+    } else if (page == _LCM_VIEW) {
+        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_SUMMARY) {
+        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_VIEW: {
+
+    }
+    break;
+    case _LCM_WAIT_PLUGIN: {
+        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_PRECHARGE:
+    case _LCM_SUMMARY: {
+        if (_currentPage == _LCM_PRECHARGE) {
+            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_VIEW) {
+            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_SUMMARY) {
+            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 || defined DD360UCar
+    uint8_t i = 0;
+    uint8_t ehtStatus = 0;
+
+    for (i = 0; i < pSysWarning->WarningCount; i++) {
+        if (memcmp(&pSysWarning->WarningCode[i][0], "012304", 6) == 0) {
+            ehtStatus = 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 (ehtStatus == 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);
+    }
+    */
+    uint8_t ehtStatus = 0;
+    int i;
+    for (i = 0; i < pSysWarning->WarningCount; i++) {
+        if (memcmp(&pSysWarning->WarningCode[i][0], "012304", 6) == 0) {
+            ehtStatus = 1;
+            //if (ShmSelectGunInfo->EthDevStatus.Ethernet != DEV_ST_DISABLE) {
+            //    ShmSelectGunInfo->EthDevStatus.Ethernet = DEV_ST_ENABLE_NO_USE;
+            //}
+            break;
+        }
+    }
+
+    if (ehtStatus == 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);
+        //}
+    }
+    // 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);
+
+    // 隨插即充 - 可省略該按鈕 //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) {
+    case _LCM_VIEW: ////For Audi
+    case _LCM_DETAIL_VIEW:
+        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;
+
+    case _LCM_START_SCAN:
+    case _LCM_STOP_RFID:
+    case _LCM_STOP_APP:
+        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 (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_START_AUTHORIZING:
+    case _LCM_START_AUTHORIZE_FAIL:
+    case _LCM_STOP_RFID_FAIL:
+    case _LCM_LINK_ERROR:
+        //case _LCM_WAIT_FOR_PLUG: {
+        FirstPageChanged();
+        break;
+    case _LCM_WAIT_PLUGIN:
+    case _LCM_WAIT_PLUGOUT:
+        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_PRECHARGE:
+    case _LCM_STOPPING:
+    case _LCM_SUMMARY: {
+        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_SUMMARY) {
+                    ChangeDisplay2Value(__cmp_gun_type_index + (gunTargetIndex * 2), _actype_light_cmp);
+                } else {
+                    ChangeDisplay2Value(__gun_type_index + (gunTargetIndex * 2), _actype_light);
+                }
+
+                if (_currentPage == _LCM_VIEW) {
+                    ChangeAcBattMapAndValue(_LCM_VIEW);
+                    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_SUMMARY) {
+                    ChangeAcBattMapAndValue(_LCM_SUMMARY);
+                    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_SUMMARY) {
+                    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_SUMMARY) {
+                        ChangeDisplay2Value(__cmp_gun_type_index + (i * 2), _chademo_light_cmp);
+                    } else {
+                        ChangeDisplay2Value(__gun_type_index + (i * 2), _chademo_light);
+                    }
+                } else {
+                    if (_currentPage == _LCM_SUMMARY) {
+                        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_SUMMARY) {
+                        ChangeDisplay2Value(__cmp_gun_type_index + (i * 2), _gbt_light_cmp);
+                    } else {
+                        ChangeDisplay2Value(__gun_type_index + (i * 2), _gbt_light);
+                    }
+                } else {
+                    if (_currentPage == _LCM_SUMMARY) {
+                        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_SUMMARY) {
+                        ChangeDisplay2Value(__cmp_gun_type_index + (i * 2), _ccs_light_cmp);
+                    } else {
+                        ChangeDisplay2Value(__gun_type_index + (i * 2), _ccs_light);
+                    }
+                } else {
+                    if (_currentPage == _LCM_SUMMARY) {
+                        ChangeDisplay2Value(__cmp_gun_type_index + (i * 2), _ccs_dark_cmp);
+                    } else {
+                        ChangeDisplay2Value(__gun_type_index + (i * 2), _ccs_dark);
+                    }
+                }
+            }
+            break;
+            }
+
+            if (_currentPage == _LCM_PRECHARGE && !isShowAc) {
+                if (pSysInfo->CurGunSelected == i) {
+                    ChangeBattMapAndValue(_currentPage, pDcChargingInfo->EvBatterySoc);
+                }
+            } else if (_currentPage == _LCM_VIEW && !isShowAc) {
+                if (pSysInfo->CurGunSelected == i) {
+                    ChangeBattMapAndValue(_LCM_VIEW, 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_SUMMARY && !isShowAc) {
+                if (pSysInfo->CurGunSelected == i) {
+                    ChangeBattMapAndValue(_LCM_SUMMARY, 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 (pDcChargingInfo->Replug_flag) {
+                        RunReplugStringFunction(true);
+                    } else {
+                        RunReplugStringFunction(false);
+                    }
+#else
+#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_ERROR:
+    case _LCM_MAINTAIN:
+        // AUDI_LCM_CHANGE
+        if (ShmPrimaryMcuData->InputDet.bits.EmergencyButton == 1) {
+            ChangeDisplay2Value(_emergency_map, _emergency_disable_map);
+        } else {
+            ChangeDisplay2Value(_emergency_map, _disappear);
+        }
+        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;
+}

File diff suppressed because it is too large
+ 676 - 1949
EVSE/Projects/DD360UCar/Apps/ModuleLcmCtrl/Module_LcmControl.c


+ 199 - 8
EVSE/Projects/DD360UCar/Apps/ModuleLcmCtrl/Module_LcmControl.h

@@ -21,14 +21,205 @@
 //#define NOODOE_QR_CODE_URL                    "https://ev-alpha-test.noodoe.com/station?id=" ////For Audi
 //#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
 #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,
+#define LEFT_GUN_LOCAL_NAME     "1A"
+#define RIGHT_GUN_LOCAL_NAME    "1B"
+// Page
+#define __VIEW_ALL_IDLE_        0x0001
+#define __VIEW_LEFT_CHARGE_     0x0002
+#define __VIEW_RIGHT_CHARGE_    0x0003
+#define __VIEW_ALL_CHARGE_      0x0004
+#define __START_SCAN_           0x0005
+#define __START_AUTHORIZE_      0x0006
+#define __START_AUTHORIZE_FAIL_ 0x0007
+#define __WAIT_PLUGIN_          0x0008
+#define __LINKING_ERROR_        0x0009
+#define __PRE_CHARGE_           0x000A
+#define __DETAIL_VIEW_          0x000B
+#define __STOP_SCAN_RFID_       0x000C
+#define __STOP_SCAN_APP_        0x000D
+#define __STOP_AUTHORIZE_       0x000E
+#define __STOP_RFID_FAIL_       0x000F
+#define __WAIT_PLUGOUT_         0x0010
+#define __SUMMARY_              0x0011
+#define __EMERGENCY_BUTTON_     0x0012
+#define __MAINTAIN_PAGE_        0x0013
+#define __ERROR_PAGE_           0x0014
+#define __SHOW_CABIENT_VERSION  0x0015
+#define __SHOW_DISPENSER_VERASION 0x0016
+
+// ICON Map Address
+#define _LeftGun_type_pic_U         0x0001
+#define _LeftGun_type_pic_L         0x0003
+#define _LeftGun_type_name          0x0005
+#define _LeftGun_type_speed         0x0007
+#define _LeftGun_Soc_Digits         0x0009
+#define _LeftGun_Soc_Tens           0x000B
+#define _LeftGun_Soc_Hundreds       0x000D
+#define _RightGun_type_pic_U        0x0011
+#define _RightGun_type_pic_L        0x0013
+#define _RightGun_type_name         0x0015
+#define _RightGun_type_speed        0x0017
+#define _RightGun_Soc_Digits        0x0019
+#define _RightGun_Soc_Tens          0x001B
+#define _RightGun_Soc_Hundreds      0x001D
+#define _Confirm_Gun_Left_symbol    0x0021
+#define _Confirm_Gun_Right_symbol   0x0023
+#define _ProgressBar_LEVEL          0x0025
+#define _Percent_Number_Digits      0x0031
+#define _Percent_Number_Tens        0x0033
+#define _Percent_Number_Hundreds    0x0035
+
+// String Map Address
+#define _LeftGun_location           0x0100
+#define _LeftGun_info_power         0x0110
+#define _LeftGun_info_time          0x0120
+#define _LeftGun_info_cap           0x0130
+#define _LeftGun_info_money         0x0140
+#define _LeftGun_info_power_number  0x0150
+#define _RightGun_location          0x0200
+#define _RightGun_info_power        0x0210
+#define _RightGun_info_time         0x0220
+#define _RightGun_info_cap          0x0230
+#define _RightGun_info_money        0x0240
+#define _RightGun_info_power_number 0x0250
+#define _Confirm_Gun_Left_name      0x0300
+#define _Confirm_Gun_Right_name     0x0310
+#define _Count_Down_Time            0x0320
+#define _Detail_Power_Num           0x0330
+#define _Detail_Time_Num            0x0340
+#define _Detail_Cap_Num             0x0350
+#define _Detail_Money_Num           0x0360
+#define _Summary_total_money        0x0400
+#define _Summary_Start_time_hr      0x0410
+#define _Summary_Start_time_min     0x0420
+#define _Summary_end_time_hr        0x0430
+#define _Summary_end_time_min       0x0440
+#define _Summary_duration_time      0x0450
+#define _Summary_max_power          0x0460
+#define _Summary_average_power      0x0470
+#define _Summary_cap                0x0480
+#define _Summary_cal_Total_money    0x0490
+#define _Summary_cal_discount       0x04A0
+#define _Summary_cal_Settlement     0x04B0
+
+enum _ICON_LIST_ {
+    _ICON_Empty,
+    _ICON_CCS1_GUN_U = 1,
+    _ICON_CCS1_GUN_L,
+    _ICON_CCS2_GUN_U,
+    _ICON_CCS2_GUN_L,
+    _ICON_CCS1_Name,
+    _ICON_CCS2_Name,
+    _ICON_Speed,
+    _ICON_High_Speed,
+    _ICON_CCS1_Symbol,
+    _ICON_CCS2_Symbol,
+    _ICON_Power_Symbol,
+    _ICON_ProgressBar_10,
+    _ICON_ProgressBar_20,
+    _ICON_ProgressBar_30,
+    _ICON_ProgressBar_40,
+    _ICON_ProgressBar_50,
+    _ICON_ProgressBar_60,
+    _ICON_ProgressBar_70,
+    _ICON_ProgressBar_80,
+    _ICON_ProgressBar_90,
+    _ICON_ProgressBar_100,
+    _ICON_Red_Num_0,
+    _ICON_Red_Num_1,
+    _ICON_Red_Num_2,
+    _ICON_Red_Num_3,
+    _ICON_Red_Num_4,
+    _ICON_Red_Num_5,
+    _ICON_Red_Num_6,
+    _ICON_Red_Num_7,
+    _ICON_Red_Num_8,
+    _ICON_Red_Num_9,
+    _ICON_Red_Percent,
+    _ICON_White_Num_0,
+    _ICON_White_Num_1,
+    _ICON_White_Num_2,
+    _ICON_White_Num_3,
+    _ICON_White_Num_4,
+    _ICON_White_Num_5,
+    _ICON_White_Num_6,
+    _ICON_White_Num_7,
+    _ICON_White_Num_8,
+    _ICON_White_Num_9,
+    _ICON_White_Percent,
+    _ICON_Card_Power,
+    _ICON_Card_Time,
+    _ICON_Card_Cap,
+    _ICON_Card_Money,
 };
 };
 
 
+
+/* Show Version */
+#define _Version_Cabient_Name_Text          0x0500
+#define _Version_Cabient_BootLoader_Text    0x0510
+#define _Version_Cabient_Kernel_Text        0x0520
+#define _Version_Cabient_CSU_Text           0x0530
+#define _Version_Cabient_Priamry_Text       0x0540
+#define _Version_Cabient_Relay0_Text        0x0550
+#define _Version_Cabient_Relay1_Text        0x0560
+#define _Version_Cabient_Fan_Text           0x0570
+#define _Version_Cabient_IPAddr_Text        0x0580
+#define _Version_Cabient_PSU_Prim1_Text     0x0590
+#define _Version_Cabient_PSU_Prim2_Text     0x05A0
+#define _Version_Cabient_PSU_Prim3_Text     0x05B0
+#define _Version_Cabient_PSU_Prim4_Text     0x05C0
+#define _Version_Cabient_PSU_Prim5_Text     0x05D0
+#define _Version_Cabient_PSU_Prim6_Text     0x05E0
+#define _Version_Cabient_PSU_Sec1_Text      0x05F0
+#define _Version_Cabient_PSU_Sec2_Text      0x0600
+#define _Version_Cabient_PSU_Sec3_Text      0x0610
+#define _Version_Cabient_PSU_Sec4_Text      0x0620
+#define _Version_Cabient_PSU_Sec5_Text      0x0630
+#define _Version_Cabient_PSU_Sec6_Text      0x0640
+#define _Version_Cabient_Model_value        0x0650
+#define _Version_Cabient_BootLoader_value   0x0660
+#define _Version_Cabient_Kernel_value       0x0670
+#define _Version_Cabient_CSU_value          0x0680
+#define _Version_Cabient_Priamry_value      0x0690
+#define _Version_Cabient_Relay0_value       0x06A0
+#define _Version_Cabient_Relay1_value       0x06B0
+#define _Version_Cabient_Fan_value          0x06C0
+#define _Version_Cabient_IPAddr_value       0x06D0
+#define _Version_Cabient_PSU_Prim1_value    0x06E0
+#define _Version_Cabient_PSU_Prim2_value    0x06F0
+#define _Version_Cabient_PSU_Prim3_value    0x0700
+#define _Version_Cabient_PSU_Prim4_value    0x0710
+#define _Version_Cabient_PSU_Prim5_value    0x0720
+#define _Version_Cabient_PSU_Prim6_value    0x0730
+#define _Version_Cabient_PSU_Sec1_value     0x0740
+#define _Version_Cabient_PSU_Sec2_value     0x0750
+#define _Version_Cabient_PSU_Sec3_value     0x0760
+#define _Version_Cabient_PSU_Sec4_value     0x0770
+#define _Version_Cabient_PSU_Sec5_value     0x0780
+#define _Version_Cabient_PSU_Sec6_value     0x0790
+#define _Version_Dispenser_Name_Text        0x07A0
+#define _Version_Dispenser_BootLoader_Text  0x07B0
+#define _Version_Dispenser_Kernel_Text      0x07C0
+#define _Version_Dispenser_CSU_Text         0x07D0
+#define _Version_Dispenser_Relay_Text       0x07E0
+#define _Version_Dispenser_Fan_Text         0x07F0
+#define _Version_Dispenser_Priamry_Text     0x0800
+#define _Version_Dispenser_LCM_Text         0x0810
+#define _Version_Dispenser_LED_Text         0x0820
+#define _Version_Dispenser_Connector0_Text  0x0830
+#define _Version_Dispenser_Connector1_Text  0x0840
+#define _Version_Dispenser_IPAddr_Text      0x0850
+#define _Version_Dispenser_Model_value      0x0860
+#define _Version_Dispenser_BootLoader_value 0x0870
+#define _Version_Dispenser_Kernel_value     0x0880
+#define _Version_Dispenser_CSU_value        0x0890
+#define _Version_Dispenser_Relay_value      0x08A0
+#define _Version_Dispenser_Fan_value        0x08B0
+#define _Version_Dispenser_Priamry_value    0x08C0
+#define _Version_Dispenser_LCM_value        0x08D0
+#define _Version_Dispenser_LED_value        0x08E0
+#define _Version_Dispenser_Connector0_value 0x08F0
+#define _Version_Dispenser_Connector1_value 0x0900
+#define _Version_Dispenser_IPAddr_value     0x0910
+
 #endif //MODULE_LCM_CTRL_H_
 #endif //MODULE_LCM_CTRL_H_

+ 2 - 2
copy_project_from_D.sh → EVSE/Projects/DD360UCar/Apps/Script/copy_from_D.sh

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

+ 2 - 0
EVSE/Projects/DD360UCar/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/DD360UCar/Apps/* /mnt/d/Phihong/Project/DD360UCar/Apps/

+ 14 - 10
EVSE/Projects/define.h

@@ -551,9 +551,11 @@ struct SysConfigData
     /************PowerCabinet************/
     /************PowerCabinet************/
     WiringInfoData          WiringInfo;
     WiringInfoData          WiringInfo;
 
 
-    unsigned char           OcppReceiptrURL[512];       // Charging receipt display URL
-    unsigned char           isAuthrizeByEVCCID;         // is Authorize by EVCCID (CCS)
-    unsigned char 			MaintainServerURL[512];		//ws: non-secure OCPP 1.6-J, wss: secure OCPP 1.6-J"
+    unsigned char           OcppReceiptrURL[512];               // Charging receipt display URL
+    unsigned char           isAuthrizeByEVCCID;                 // is Authorize by EVCCID (CCS)
+    unsigned char           MaintainServerURL[512];             // ws: non-secure OCPP 1.6-J, wss: secure OCPP 1.6-J"
+    unsigned char           MaintainServerSecurityProfile;      // Maintain server security profile 0~3
+    unsigned char           MaintainServerSecurityPassword[41]; // Maintain server AuthorizationKey for security profile
 };
 };
 
 
 struct ChargingInfoData
 struct ChargingInfoData
@@ -580,6 +582,7 @@ struct ChargingInfoData
 	float PresentChargingCurrent;   // unit: 1A
 	float PresentChargingCurrent;   // unit: 1A
 	float PresentChargingPower;		//0~6553.5 kW
 	float PresentChargingPower;		//0~6553.5 kW
 	float PresentChargedEnergy;		//0~6553.5 kWh
 	float PresentChargedEnergy;		//0~6553.5 kWh
+	float presentChargedEnergyPeriod[24];       // Session present charged energy at each period
 	int PresentChargedDuration;	// second
 	int PresentChargedDuration;	// second
 	int RemainChargingDuration;	// second
 	int RemainChargingDuration;	// second
 	float EvBatteryMaxVoltage;		// 0~6553.5 volt
 	float EvBatteryMaxVoltage;		// 0~6553.5 volt
@@ -944,7 +947,7 @@ struct SysInfoData
 	unsigned char 		InternetConn;					//0: disconnected, 1: connected
 	unsigned char 		InternetConn;					//0: disconnected, 1: connected
 	/**************Backend***************/
 	/**************Backend***************/
 	unsigned char 		OcppConnStatus;					//0: disconnected, 1: connected
 	unsigned char 		OcppConnStatus;					//0: disconnected, 1: connected
-	unsigned char 		MaintainServerConnStatus;		//0: disconnected, 1: connected
+    unsigned char       MaintainServerConnStatus;       //0: disconnected, 1: connected
 	char 				OrderCharging;
 	char 				OrderCharging;
     float               MaxChargingProfilePower;        // unit: 1W
     float               MaxChargingProfilePower;        // unit: 1W
 	/**************Alston***************/
 	/**************Alston***************/
@@ -1110,8 +1113,8 @@ char FaultStatusCode[40][6]=
 	"011036",	//Rotary switch fault
 	"011036",	//Rotary switch fault
 	"011037",	//CCS liquid chiller water level fault
 	"011037",	//CCS liquid chiller water level fault
 	"011038",	//Chiller temperature sensor broken
 	"011038",	//Chiller temperature sensor broken
-	"011039",	//Reserved
-	"011040"	//Reserved
+	"011039",	//Parallel relay welding
+	"011040"	//Parallel output relay driving fault
 };
 };
 
 
 struct FaultCodeData
 struct FaultCodeData
@@ -1165,7 +1168,8 @@ struct FaultCodeData
 			unsigned char RotarySwitchFault:1;					//bit 3 
 			unsigned char RotarySwitchFault:1;					//bit 3 
 			unsigned char CcsLiquidChillerWaterLevelFault:1;    //bit 4
 			unsigned char CcsLiquidChillerWaterLevelFault:1;    //bit 4
             unsigned char ChillerTempSensorBroken:1;            //bit 5
             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;
 		}bits;
 	}FaultEvents;
 	}FaultEvents;
 };
 };
@@ -1299,7 +1303,7 @@ char AlarmStatusCode[160][6]=
     "012324",   // Connector 1 detects abnormal voltage on the output line
     "012324",   // Connector 1 detects abnormal voltage on the output line
     "012325",   // Connector 2 detects abnormal voltage on the output line
     "012325",   // Connector 2 detects abnormal voltage on the output line
     "012326",   // System task is lost
     "012326",   // System task is lost
-    "012327",   // reserved
+    "012327",   // DC input ovp
     "012328",   // reserved
     "012328",   // reserved
     "012329",   // reserved
     "012329",   // reserved
     "012330",   // reserved
     "012330",   // reserved
@@ -1484,7 +1488,7 @@ struct AlarmCodeData
             unsigned char AbnormalVoltageOnOutputLine_1:1;          //bit 4
             unsigned char AbnormalVoltageOnOutputLine_1:1;          //bit 4
             unsigned char AbnormalVoltageOnOutputLine_2:1;          //bit 5
             unsigned char AbnormalVoltageOnOutputLine_2:1;          //bit 5
             unsigned char SystemTaskLost:1;                         //bit 6
             unsigned char SystemTaskLost:1;                         //bit 6
-            unsigned char Reserved:1;                               //bit 7
+            unsigned char DcInputOVP:1;                             //bit 7
             //AlarmVal[16]
             //AlarmVal[16]
             unsigned char :8;                                       //reserved bit 0 ~ bit 7
             unsigned char :8;                                       //reserved bit 0 ~ bit 7
             //AlarmVal[17]
             //AlarmVal[17]
@@ -4257,7 +4261,7 @@ struct StructDataTransfer
 	unsigned char MessageId[52];
 	unsigned char MessageId[52];
 	unsigned char Data[512];
 	unsigned char Data[512];
 	unsigned char ResponseStatus[18];	//Accepted, Rejected,UnknownMessageId,UnknownVendorId
 	unsigned char ResponseStatus[18];	//Accepted, Rejected,UnknownMessageId,UnknownVendorId
-	unsigned char ResponseData[256];
+	unsigned char ResponseData[512];
 };
 };
 struct StructDiagnosticsStatusNotification
 struct StructDiagnosticsStatusNotification
 {
 {

Some files were not shown because too many files changed in this diff