瀏覽代碼

Merge branch 'DW30'

FolusWen 4 年之前
父節點
當前提交
8867b8fa5c
共有 43 個文件被更改,包括 3408 次插入1038 次删除
  1. 8 0
      EVSE/Projects/DM30/Apps/Config.h
  2. 3 1
      EVSE/Projects/DM30/Apps/FactoryConfig.c
  3. 3 2
      EVSE/Projects/DM30/Apps/Makefile
  4. 147 77
      EVSE/Projects/DM30/Apps/Module_EvComm.c
  5. 20 19
      EVSE/Projects/DM30/Apps/Module_EventLogging.c
  6. 167 72
      EVSE/Projects/DM30/Apps/Module_InternalComm.c
  7. 77 36
      EVSE/Projects/DM30/Apps/Module_LcmControl.c
  8. 5 4
      EVSE/Projects/DM30/Apps/Module_LcmControl.h
  9. 15 10
      EVSE/Projects/DM30/Apps/Module_PrimaryComm.c
  10. 516 195
      EVSE/Projects/DM30/Apps/Module_PsuComm.c
  11. 3 0
      EVSE/Projects/DM30/Apps/Module_PsuComm.h
  12. 88 30
      EVSE/Projects/DM30/Apps/ReadCmdline.c
  13. 68 24
      EVSE/Projects/DM30/Apps/internalComm.c
  14. 1 0
      EVSE/Projects/DM30/Apps/kill.sh
  15. 573 48
      EVSE/Projects/DM30/Apps/main.c
  16. 10 1
      EVSE/Projects/DM30/Apps/timeout.h
  17. 二進制
      EVSE/Projects/DM30/Images/FactoryDefaultConfig.bin
  18. 二進制
      EVSE/Projects/DM30/Images/MLO
  19. 二進制
      EVSE/Projects/DM30/Images/ramdisk.gz
  20. 二進制
      EVSE/Projects/DM30/Images/u-boot.img
  21. 二進制
      EVSE/Projects/DM30/Images/zImage
  22. 8 0
      EVSE/Projects/DW30/Apps/Config.h
  23. 3 1
      EVSE/Projects/DW30/Apps/FactoryConfig.c
  24. 3 2
      EVSE/Projects/DW30/Apps/Makefile
  25. 147 77
      EVSE/Projects/DW30/Apps/Module_EvComm.c
  26. 20 19
      EVSE/Projects/DW30/Apps/Module_EventLogging.c
  27. 167 72
      EVSE/Projects/DW30/Apps/Module_InternalComm.c
  28. 77 36
      EVSE/Projects/DW30/Apps/Module_LcmControl.c
  29. 5 4
      EVSE/Projects/DW30/Apps/Module_LcmControl.h
  30. 15 10
      EVSE/Projects/DW30/Apps/Module_PrimaryComm.c
  31. 516 195
      EVSE/Projects/DW30/Apps/Module_PsuComm.c
  32. 3 0
      EVSE/Projects/DW30/Apps/Module_PsuComm.h
  33. 88 30
      EVSE/Projects/DW30/Apps/ReadCmdline.c
  34. 68 24
      EVSE/Projects/DW30/Apps/internalComm.c
  35. 1 0
      EVSE/Projects/DW30/Apps/kill.sh
  36. 573 48
      EVSE/Projects/DW30/Apps/main.c
  37. 10 1
      EVSE/Projects/DW30/Apps/timeout.h
  38. 二進制
      EVSE/Projects/DW30/Images/FactoryDefaultConfig.bin
  39. 二進制
      EVSE/Projects/DW30/Images/MLO
  40. 二進制
      EVSE/Projects/DW30/Images/am335x-evm.dtb
  41. 二進制
      EVSE/Projects/DW30/Images/ramdisk.gz
  42. 二進制
      EVSE/Projects/DW30/Images/u-boot.img
  43. 二進制
      EVSE/Projects/DW30/Images/zImage

+ 8 - 0
EVSE/Projects/DM30/Apps/Config.h

@@ -166,4 +166,12 @@ enum _CHARGER_TYPE
     _CHARGER_TYPE_UL                    = 1,
 };
 
+enum _SYS_WIFI_MODE
+{
+    _SYS_WIFI_MODE_DISABLE              = 0,
+    _SYS_WIFI_MODE_STATION              = 1,
+    _SYS_WIFI_MODE_AP                   = 2,
+    _SYS_WIFI_MODE_ADHOC                = 3,
+};
+
 #endif /* CONFIG_H_ */

+ 3 - 1
EVSE/Projects/DM30/Apps/FactoryConfig.c

@@ -148,7 +148,7 @@ int main(int argc,char *argv[])
     strcpy((char *) SysConfig.Eth1Interface.EthIpAddress, "192.168.0.10");
     strcpy((char *) SysConfig.Eth1Interface.EthSubmaskAddress, "255.255.255.0");
     strcpy((char *) SysConfig.Eth1Interface.EthGatewayAddress, "192.168.0.254");
-    SysConfig.AthInterface.WifiMode = 0;
+    SysConfig.AthInterface.WifiMode = _SYS_WIFI_MODE_AP;
     strcpy((char *) SysConfig.AthInterface.WifiSsid, "");
     strcpy((char *) SysConfig.AthInterface.WifiPassword, "");
     SysConfig.AthInterface.WifiRssi = 0;
@@ -179,6 +179,8 @@ int main(int argc,char *argv[])
     SysConfig.OfflinePolicy = OFF_POLICY_FREE;
     SysConfig.OfflineMaxChargeEnergy = 0;
     SysConfig.OfflineMaxChargeDuration = 0;
+    //strcpy((char *) SysConfig.OcppServerURL, "ws://test.evsocket.phihong.com.cn:2012/");
+    //strcpy((char *) SysConfig.ChargeBoxId, "DemoDC");
     strcpy((char *) SysConfig.OcppServerURL, "");
     strcpy((char *) SysConfig.ChargeBoxId, "");
 

+ 3 - 2
EVSE/Projects/DM30/Apps/Makefile

@@ -3,6 +3,7 @@ export PATH=/bin:/sbin:/usr/bin:$(SDK_PATH_TARGET)/usr/bin:$PATH
 
 #define library variable
 Internal485ProtocolLib = -L ../../../Modularization/Internal485Protocol -lInternal485Protocol
+Lib_SQLite3 = "-L../../../Modularization/ocppfiles" -lsqlite3
 
 all: CreateOutputFolder BuildFactorys BuildApps CopyExecuteFiles Clean
 
@@ -11,9 +12,9 @@ BuildFactorys: FactoryConfigBin
 BuildApps: MainTask EvCommTask EventLoggingTask InternalCommTask LcmControlTask PrimaryCommTask PsuCommTask ReadCmdlineTask FactoryConfigApp
 
 MainTask:
-	$(CC) -D $(Project) -D DEBUG_OPTION=$(Project_Debug_Option) -include../../../Modularization/Module_RFID.h -include../../../Modularization/Module_Upgrade.h -O0 -g3 -Wall -c -fmessage-length=0 -o main.o main.c
+	$(CC) -D $(Project) -D DEBUG_OPTION=$(Project_Debug_Option) -include../../../Modularization/ocppfiles/sqlite3.h -include../../../Modularization/Module_RFID.h -include../../../Modularization/Module_Upgrade.h -O0 -g3 -Wall -c -fmessage-length=0 -o main.o main.c
 	$(CC) -D $(Project) -D DEBUG_OPTION=$(Project_Debug_Option) -O0 -g3 -Wall -c -fmessage-length=0 -o timeout.o timeout.c
-	$(CC) -o main main.o timeout.o ../../../Modularization/libModule_RFID.a ../../../Modularization/libModule_Upgrade.a
+	$(CC) -o main main.o timeout.o ../../../Modularization/libModule_RFID.a ../../../Modularization/libModule_Upgrade.a ${Lib_SQLite3}
 
 EvCommTask:
 	$(CC) -D $(Project) -D DEBUG_OPTION=$(Project_Debug_Option) -includeConfig.h -O0 -g3 -Wall -c -fmessage-length=0 -o Ev_Comm.o Ev_Comm.c

+ 147 - 77
EVSE/Projects/DM30/Apps/Module_EvComm.c

@@ -55,9 +55,15 @@ float _cur_1 = 0;
 float _pow_2 = 0;
 float _cur_2 = 0;
 
+float _outVol_1 = 0;
+float _outCur_1 = 0;
+float _outVol_2 = 0;
+float _outCur_2 = 0;
+
 // 限制最大充電電壓,因應不同 type 槍線來限制
-// Chademo : 500V, GB : 750, CCS : 950V
-//TODO: change maximum charging voltage by connector type
+// Chademo : 500V, 125A,
+// GB : 750, 120A
+// CCS : 950V, 120A
 float maxChargingVol[2] = { 9500, 9500 };           // 限制最大充電電壓,如依照模塊則填上 0
 // 限制最大充電電流與能量透過 Web
 float maxChargingCur[2] = { 600, 600 };             // 限制最大充電電流,如依照模塊則填上 0
@@ -94,7 +100,7 @@ unsigned char mask_table[] = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 };
 void PRINTF_FUNC(char *string, ...);
 
 void GetMaxVolAndCurMethod(byte index, float *vol, float *cur);
-void GetMaxPowerMethod(float *pow);
+void GetMaxPowerMethod(byte index, float *pow);
 unsigned long GetTimeoutValue(struct timeval _sour_time);
 
 #define DEBUG_INFO(format, args...) StoreLogMsg("[%s:%d][%s][Info] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
@@ -126,11 +132,20 @@ int StoreLogMsg(const char *fmt, ...)
     SeqEndTime.time = time(NULL);
     tm=localtime(&SeqEndTime.time);
 
-    sprintf(Buf,"echo \"%04d-%02d-%02d %02d:%02d:%02d.%03d - %s\" >> /Storage/SystemLog/[%04d.%02d]SystemLog",
-            tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,SeqEndTime.millitm,
-            buffer,
-            tm->tm_year+1900,tm->tm_mon+1);
-    system(Buf);
+    if (ShmSysConfigAndInfo->SysConfig.SwitchDebugFlag == YES)
+    {
+        sprintf(Buf,"%02d:%02d:%02d.%03d - %s",
+                tm->tm_hour,tm->tm_min,tm->tm_sec,SeqEndTime.millitm, buffer);
+        printf("%s \n", Buf);
+    }
+    else
+    {
+        sprintf(Buf,"echo \"%04d-%02d-%02d %02d:%02d:%02d.%03d - %s\" >> /Storage/SystemLog/[%04d.%02d]SystemLog",
+                tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,SeqEndTime.millitm,
+                buffer,
+                tm->tm_year+1900,tm->tm_mon+1);
+        system(Buf);
+    }
 
     return rc;
 }
@@ -153,10 +168,7 @@ void PRINTF_FUNC(char *string, ...)
     vsnprintf(buffer, sizeof(buffer), string, args);
     va_end(args);
 
-    if (ShmSysConfigAndInfo->SysConfig.SwitchDebugFlag == YES)
-        printf("%s \n", buffer);
-    else
-        DEBUG_INFO("%s \n", buffer);
+    DEBUG_INFO("%s \n", buffer);
 }
 
 //=================================
@@ -1927,6 +1939,13 @@ void ClearAbnormalStatus_CCS(byte gun_index)
         memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
         isCleanCheck = true;
     }
+    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023850", 6) == EQUAL &&
+            ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsSeccTimeoutV2GPreChargePerformaceTime == YES)
+    {
+        memcpy(code, "023850", 6);
+        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
+        isCleanCheck = true;
+    }
     else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023855", 6) == EQUAL &&
              ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTP_GET_EV_TARGET_INFO == YES)
     {
@@ -2179,6 +2198,20 @@ void ClearAbnormalStatus_CCS(byte gun_index)
         memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
         isCleanCheck = true;
     }
+    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023891", 6) == EQUAL &&
+            ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsSeccNotReadyForCharging == YES)
+    {
+        memcpy(code, "023891", 6);
+        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
+        isCleanCheck = true;
+    }
+    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023892", 6) == EQUAL &&
+            ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsSeccTimeoutQCA7000Comm == YES)
+    {
+        memcpy(code, "023892", 6);
+        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
+        isCleanCheck = true;
+    }
 
     if (isCleanCheck)
     {
@@ -2288,6 +2321,7 @@ void ClearAbnormalStatus_CCS(byte gun_index)
                     if (strncmp(code, "023847", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCableCheck_Performance_Time = NO;
                     if (strncmp(code, "023848", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCPState_Detection_Time = NO;
                     if (strncmp(code, "023849", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCPOscillator_Retain_Time = NO;
+                    if (strncmp(code, "023850", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsSeccTimeoutV2GPreChargePerformaceTime = NO;
                     if (strncmp(code, "023855", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTP_GET_EV_TARGET_INFO = NO;
                     if (strncmp(code, "023856", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTT_GET_EV_TARGET_INFO = NO;
                     if (strncmp(code, "023857", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTP_GET_EV_BATTERY_INFO = NO;
@@ -2324,6 +2358,8 @@ void ClearAbnormalStatus_CCS(byte gun_index)
                     if (strncmp(code, "023888", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsISO2_Msg_Encode_Error = NO;
                     if (strncmp(code, "023889", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCpStatus_Error = NO;
                     if (strncmp(code, "023890", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsUnexpectVolBeforeCharing_Error = NO;
+                    if (strncmp(code, "023891", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsSeccNotReadyForCharging = NO;
+                    if (strncmp(code, "023892", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsSeccTimeoutQCA7000Comm = NO;
                 }
             }
         }
@@ -2336,7 +2372,7 @@ void AbnormalStopAnalysis(byte gun_index, byte *errCode)
     sprintf(string, "%d%d%d%d%d%d", *(errCode + 0), *(errCode + 1), *(errCode + 2), *(errCode + 3), *(errCode + 4), *(errCode + 5));
 
     PRINTF_FUNC("NOTIFICATION_EV_STOP : Err Code = %s \n", string);
-    if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "000000", 6) == EQUAL ||
+    if (strncmp(string, "000000", 6) == EQUAL ||
         strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "", 6) != EQUAL)
         return;
 
@@ -2477,6 +2513,7 @@ void AbnormalStopAnalysis(byte gun_index, byte *errCode)
     if (strcmp(string, "023847") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCableCheck_Performance_Time = YES;
     if (strcmp(string, "023848") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCPState_Detection_Time = YES;
     if (strcmp(string, "023849") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCPOscillator_Retain_Time = YES;
+    if (strcmp(string, "023850") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsSeccTimeoutV2GPreChargePerformaceTime = YES;
     if (strcmp(string, "023855") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTP_GET_EV_TARGET_INFO = YES;
     if (strcmp(string, "023856") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTT_GET_EV_TARGET_INFO = YES;
     if (strcmp(string, "023857") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTP_GET_EV_BATTERY_INFO = YES;
@@ -2513,6 +2550,8 @@ void AbnormalStopAnalysis(byte gun_index, byte *errCode)
     if (strcmp(string, "023888") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsISO2_Msg_Encode_Error = YES;
     if (strcmp(string, "023889") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCpStatus_Error = YES;
     if (strcmp(string, "023890") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsUnexpectVolBeforeCharing_Error = YES;
+    if (strcmp(string, "023891") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsSeccNotReadyForCharging = YES;
+    if (strcmp(string, "023892") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsSeccTimeoutQCA7000Comm = YES;
 
     if (strcmp(string, "023702") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.GbEvCommFail = YES;
     if (strcmp(string, "023900") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_GBT_LOS_CC1 = YES;
@@ -2679,15 +2718,20 @@ void CANReceiver()
                         break;
                     case ACK_EV_FW_VERSION:
                     {
+                        byte ver[16];
+
+                        memset(ver, 0, sizeof(ver));
                         if (_chargingData[targetGun]->Type == _Type_Chademo)
                         {
-                            memcpy(ShmCHAdeMOData->evse[_chargingData[targetGun]->type_index].version, frame.data, frame.can_dlc);
+                            memcpy(ver, frame.data, frame.can_dlc);
+                            memcpy(ShmCHAdeMOData->evse[_chargingData[targetGun]->type_index].version, ver, ARRAY_SIZE(ver));
                             ShmCHAdeMOData->evse[_chargingData[targetGun]->type_index].SelfTest_Comp = PASS;
                             PRINTF_FUNC("chademo ver. : %s\n", ShmCHAdeMOData->evse[_chargingData[targetGun]->type_index].version);
                         }
                         else if (_chargingData[targetGun]->Type == _Type_GB)
                         {
-                            memcpy(ShmGBTData->evse[_chargingData[targetGun]->type_index].version, frame.data, ARRAY_SIZE(frame.data));
+                            memcpy(ver, frame.data, frame.can_dlc);
+                            memcpy(ShmGBTData->evse[_chargingData[targetGun]->type_index].version, ver, ARRAY_SIZE(ver));
                             ShmGBTData->evse[_chargingData[targetGun]->type_index].SelfTest_Comp = PASS;
                             PRINTF_FUNC("gbt ver. : %s\n", ShmGBTData->evse[_chargingData[targetGun]->type_index].version);
                         }
@@ -2695,7 +2739,18 @@ void CANReceiver()
                         {
                             if (ShmCcsData->CommProtocol == 0x01)
                             {
-                                memcpy(&ShmCcsData->V2GMessage_DIN70121[_chargingData[targetGun]->type_index].version, frame.data, frame.can_dlc);
+                                for (byte _vCount = 0, _vPoint = 0; _vCount < frame.can_dlc; _vCount++)
+                                {
+                                    if (_vCount % 2 == 0 && _vCount != 0)
+                                    {
+                                        ver[_vCount + _vPoint] = 0x2E;
+                                        _vPoint++;
+                                    }
+
+                                    ver[_vCount + _vPoint] = frame.data[_vCount];
+                                }
+
+                                memcpy(&ShmCcsData->V2GMessage_DIN70121[_chargingData[targetGun]->type_index].version, ver, ARRAY_SIZE(ver));
                                 ShmCcsData->V2GMessage_DIN70121[_chargingData[targetGun]->type_index].SelfTest_Comp = PASS;
                                 PRINTF_FUNC("CCS FW = %s \n", ShmCcsData->V2GMessage_DIN70121[_chargingData[targetGun]->type_index].version);
                             }
@@ -2704,12 +2759,12 @@ void CANReceiver()
                         if (targetGun == 0)
                         {
                             memset(ShmSysConfigAndInfo->SysInfo.Connector1FwRev, 0, sizeof(ShmSysConfigAndInfo->SysInfo.Connector1FwRev));
-                            memcpy(ShmSysConfigAndInfo->SysInfo.Connector1FwRev, frame.data, frame.can_dlc);
+                            memcpy(ShmSysConfigAndInfo->SysInfo.Connector1FwRev, ver, ARRAY_SIZE(ver));
                         }
                         else
                         {
                             memset(ShmSysConfigAndInfo->SysInfo.Connector2FwRev, 0, sizeof(ShmSysConfigAndInfo->SysInfo.Connector2FwRev));
-                            memcpy(ShmSysConfigAndInfo->SysInfo.Connector2FwRev, frame.data, frame.can_dlc);
+                            memcpy(ShmSysConfigAndInfo->SysInfo.Connector2FwRev, ver, ARRAY_SIZE(ver));
                         }
                     }
                         break;
@@ -2721,33 +2776,25 @@ void CANReceiver()
                     case ACK_GET_OUTPUT_REQ:
                     {
                         _chargingData[targetGun]->EvBatterySoc = frame.data[1];
-                        _chargingData[targetGun]->EvBatterytargetVoltage = ((short) frame.data[3] << 8) + (short) frame.data[2];
-                        _chargingData[targetGun]->EvBatterytargetCurrent = ((short) frame.data[5] << 8) + (short) frame.data[4];
-                        _chargingData[targetGun]->PresentChargedDuration = ((short) frame.data[7] << 8) + (short) frame.data[6];
+                        _chargingData[targetGun]->EvBatterytargetVoltage = (((short) frame.data[3] << 8) + (short) frame.data[2]) / 10;
+                        _chargingData[targetGun]->EvBatterytargetCurrent = (((short) frame.data[5] << 8) + (short) frame.data[4]) / 10;
+                        _chargingData[targetGun]->RemainChargingDuration = ((short) frame.data[7] << 8) + (short) frame.data[6];
 
                         if (_chargingData[targetGun]->Type == _Type_Chademo)
                         {
-                            if (ShmCHAdeMOData->ev[_chargingData[targetGun]->type_index].EvDetection != frame.data[0])
-                            {
-                                ShmCHAdeMOData->ev[_chargingData[targetGun]->type_index].PresentMsgFlowStatus = frame.data[0];
-                            }
-
+                            ShmCHAdeMOData->ev[_chargingData[targetGun]->type_index].PresentMsgFlowStatus = frame.data[0];
                             ShmCHAdeMOData->ev[_chargingData[targetGun]->type_index].EvDetection = frame.data[0];
                             ShmCHAdeMOData->ev[_chargingData[targetGun]->type_index].SOC = _chargingData[targetGun]->EvBatterySoc;
-                            ShmCHAdeMOData->ev[_chargingData[targetGun]->type_index].TargetBatteryVoltage = _chargingData[targetGun]->EvBatterytargetVoltage;
-                            ShmCHAdeMOData->ev[_chargingData[targetGun]->type_index].ChargingCurrentRequest = _chargingData[targetGun]->EvBatterytargetCurrent;
+                            ShmCHAdeMOData->ev[_chargingData[targetGun]->type_index].TargetBatteryVoltage = (_chargingData[targetGun]->EvBatterytargetVoltage * 10);
+                            ShmCHAdeMOData->ev[_chargingData[targetGun]->type_index].ChargingCurrentRequest = (_chargingData[targetGun]->EvBatterytargetCurrent * 10);
                         }
                         else if (_chargingData[targetGun]->Type == _Type_GB)
                         {
-                            if (ShmGBTData->ev[_chargingData[targetGun]->type_index].EvDetection != frame.data[0])
-                            {
-                                ShmGBTData->ev[_chargingData[targetGun]->type_index].PresentMsgFlowStatus = frame.data[0];
-                            }
-
+                            ShmGBTData->ev[_chargingData[targetGun]->type_index].PresentMsgFlowStatus = frame.data[0];
                             ShmGBTData->ev[_chargingData[targetGun]->type_index].EvDetection = frame.data[0];
                             ShmGBTData->ev[_chargingData[targetGun]->type_index].SOC = _chargingData[targetGun]->EvBatterySoc;
-                            ShmGBTData->ev[_chargingData[targetGun]->type_index].TargetBatteryVoltage = _chargingData[targetGun]->EvBatterytargetVoltage;
-                            ShmGBTData->ev[_chargingData[targetGun]->type_index].ChargingCurrentRequest = _chargingData[targetGun]->EvBatterytargetCurrent;
+                            ShmGBTData->ev[_chargingData[targetGun]->type_index].TargetBatteryVoltage = (_chargingData[targetGun]->EvBatterytargetVoltage * 10);
+                            ShmGBTData->ev[_chargingData[targetGun]->type_index].ChargingCurrentRequest = (_chargingData[targetGun]->EvBatterytargetCurrent * 10);
                         }
                         else if (_chargingData[targetGun]->Type == _Type_CCS_2)
                         {
@@ -2767,7 +2814,7 @@ void CANReceiver()
                     {
                         //_chargingData[target].EvACorDCcharging = frame.data[0];
                         //_chargingData[target]->TotalBatteryCap = ((float) frame.data[4] << 8) + (short) frame.data[3];
-                        _chargingData[targetGun]->EvBatteryMaxVoltage = ((short) frame.data[4] << 8) + (short) frame.data[3];
+                        _chargingData[targetGun]->EvBatteryMaxVoltage = (((short) frame.data[4] << 8) + (short) frame.data[3]) / 10;
                         //_chargingData[target]->EvBatteryMaxCurrent = ((float) frame.data[4] << 8) + (short) frame.data[3];
                         //_chargingData[target].MaxiBatteryCurrent = ((short) frame.data[6] << 8) + (short) frame.data[5];
                         if (_chargingData[targetGun]->Type == _Type_Chademo)
@@ -2792,30 +2839,27 @@ void CANReceiver()
                         break;
                     case ACK_GET_MISCELLANEOUS_INFO:
                     {
+                        _chargingData[targetGun]->GunLocked = frame.data[0];
+                        _chargingData[targetGun]->PilotVoltage = (float)(-120 + frame.data[3]) / 10;
+
                         if (_chargingData[targetGun]->Type == _Type_Chademo)
                         {
-                            _chargingData[targetGun]->GunLocked = frame.data[0];
                             ShmCHAdeMOData->evse[_chargingData[targetGun]->type_index].ConnectorTemperatureP = frame.data[1];
                             ShmCHAdeMOData->evse[_chargingData[targetGun]->type_index].ConnectorTemperatureN = frame.data[2];
-                            _chargingData[targetGun]->PilotVoltage = (float)(-120 + frame.data[3]) / 10;
                             ShmCHAdeMOData->evse[_chargingData[targetGun]->type_index].EvboardStatus = frame.data[7];
                         }
                         else if (_chargingData[targetGun]->Type == _Type_GB)
                         {
-                            _chargingData[targetGun]->GunLocked = frame.data[0];
                             ShmGBTData->evse[_chargingData[targetGun]->type_index].ConnectorTemperatureP = frame.data[1];
                             ShmGBTData->evse[_chargingData[targetGun]->type_index].ConnectorTemperatureN = frame.data[2];
-                            _chargingData[targetGun]->PilotVoltage = (float)(-120 + frame.data[3]) / 10;
                             ShmGBTData->evse[_chargingData[targetGun]->type_index].EvboardStatus = frame.data[7];
                         }
                         else if (_chargingData[targetGun]->Type == _Type_CCS_2)
                         {
                             if (ShmCcsData->CommProtocol == 0x01)
                             {
-                                _chargingData[targetGun]->GunLocked = frame.data[0];
                                 //ShmCcsData->V2GMessage_DIN70121[_chargingData[targetGun]->type_index]. .ConnectorTemperatureP = frame.data[1];
                                 //ShmCcsData->V2GMessage_DIN70121[_chargingData[targetGun]->type_index]. .ConnectorTemperatureN = frame.data[2];
-                                _chargingData[targetGun]->PilotVoltage = (float)(-120 + frame.data[3]) / 10;
                             }
                         }
 
@@ -2874,17 +2918,23 @@ void SetPresentChargingOutputPower(struct ChargingInfoData *chargingData_1, stru
     float vol1 = 0, cur1 = 0;
     float vol2 = 0, cur2 = 0;
 
-    //PRINTF_FUNC("f vol - 0 = %f \n", chargingData_1->FireChargingVoltage);
-    //PRINTF_FUNC("f cur - 0 = %f \n", chargingData_1->PresentChargingCurrent);
-    //PRINTF_FUNC("***********************f vol - 1 = %f \n", chargingData_2->FireChargingVoltage);
-    //PRINTF_FUNC("***********************f cur - 1 = %f \n", chargingData_2->PresentChargingCurrent);
-
     vol1 = chargingData_1->FireChargingVoltage;
     cur1 = (chargingData_1->PresentChargingCurrent * 10);
 
     vol2 = chargingData_2->FireChargingVoltage;
     cur2 = (chargingData_2->PresentChargingCurrent * 10);
 
+    if (_outVol_1 != vol1 ||
+        _outCur_1 != cur1 ||
+        _outVol_2 != vol2 ||
+        _outCur_2 != cur2)
+    {
+        PRINTF_FUNC("G1 -> Output Vol = %f, Output Cur = %f -- G2 -> Output Vol = %f, Output Cur = %f \n",
+            vol1, cur1, vol2, cur2);
+
+        _outVol_1 = vol1; _outCur_1 = cur1; _outVol_2 = vol2; _outCur_2 = cur2;
+    }
+
     SetPresentOutputPower(vol1, cur1, vol2, cur2);
 }
 
@@ -2899,14 +2949,14 @@ void SetPresentChargingOutputCap(struct ChargingInfoData *chargingData_1, struct
 
     vol = chargingData_1->MaximumChargingVoltage;
     GetMaxVolAndCurMethod(chargingData_1->Index, &vol, &cur1);
-    GetMaxPowerMethod(&pow1);
+    GetMaxPowerMethod(chargingData_1->Index, &pow1);
 
     pow2 = chargingData_2->AvailableChargingPower;
     cur2 = chargingData_2->AvailableChargingCurrent;
     vol = chargingData_2->MaximumChargingVoltage;
 
     GetMaxVolAndCurMethod(chargingData_2->Index, &vol, &cur2);
-    GetMaxPowerMethod(&pow2);
+    GetMaxPowerMethod(chargingData_2->Index, &pow2);
 
     if (_pow_1 != pow1 ||
         _cur_1 != cur1 ||
@@ -2954,12 +3004,26 @@ void GetMaxVolAndCurMethod(byte index, float *vol, float *cur)
 
     if (maxChargingCur[index] != 0 && maxChargingCur[index] <= *cur)
         *cur = maxChargingCur[index];
+
+    if (_chargingData[index]->SystemStatus == S_CHARGING &&
+        _chargingData[index]->ChargingProfileCurrent >= 0 &&
+        _chargingData[index]->ChargingProfileCurrent <= *cur)
+    {
+        *cur = _chargingData[index]->ChargingProfileCurrent;
+    }
 }
 
-void GetMaxPowerMethod(float *pow)
+void GetMaxPowerMethod(byte index, float *pow)
 {
     if (maxChargingPow != 0 && maxChargingPow <= *pow)
         *pow = maxChargingPow;
+
+    if (_chargingData[index]->SystemStatus == S_CHARGING &&
+        _chargingData[index]->ChargingProfilePower >= 0 &&
+        _chargingData[index]->ChargingProfilePower <= *pow)
+    {
+        *pow = _chargingData[index]->ChargingProfilePower;
+    }
 }
 
 time_t GetRtcInfoForEpoch()
@@ -3165,13 +3229,6 @@ int main(int argc, char *argv[])
             {
                 case S_IDLE:
                 case S_RESERVATION:
-                    _chargingData[_index]->PresentChargedEnergy = 0;
-                    _chargingData[_index]->PresentChargingPower = 0;
-                    _chargingData[_index]->GroundFaultStatus = GFD_WAIT;
-                    _chargingData[_index]->StopChargeFlag = NO;
-                    _chargingData[_index]->ChargingFee = 0.0;
-                    chargingTime[_index] = 0;
-
                     if (_chargingData[_index]->Type == _Type_Chademo)
                     {
                         ClearAbnormalStatus_Chademo(_index);
@@ -3187,6 +3244,19 @@ int main(int argc, char *argv[])
 
                     if (priorityLow == 1)
                     {
+                        _chargingData[_index]->PresentChargedEnergy = 0;
+                        _chargingData[_index]->PresentChargingPower = 0;
+                        _chargingData[_index]->GroundFaultStatus = GFD_WAIT;
+                        _chargingData[_index]->RealRatingPower = 0;
+                        _chargingData[_index]->StopChargeFlag = NO;
+                        _chargingData[_index]->ChargingFee = 0.0;
+                        _chargingData[_index]->EvBatterySoc = 0;
+                        _chargingData[_index]->PresentChargingVoltage = 0;
+                        _chargingData[_index]->PresentChargingCurrent = 0;
+                        _chargingData[_index]->EvBatteryMaxVoltage = 0;
+
+                        chargingTime[_index] = 0;
+
                         maxChargingPow = (ShmSysConfigAndInfo->SysConfig.MaxChargingPower * 10);
                     }
                     break;
@@ -3270,28 +3340,28 @@ int main(int argc, char *argv[])
 //                          _chargingData[_index]->GroundFaultStatus = GFD_PASS;
 
                         //PRINTF_FUNC("To EV_%d GFD = %d \n",   _index, _chargingData[_index]->GroundFaultStatus);
-                        if(_chargingData[_index]->GroundFaultStatus != GFD_WAIT)
-                        {
-                            unsigned char _result = _chargingData[_index]->GroundFaultStatus;
 
-                            if(_chargingData[_index]->Type == _Type_Chademo || _chargingData[_index]->Type == _Type_GB)
-                            {
-                                if (_result == GFD_WARNING)
-                                {
-                                    _result = GFD_PASS;
-                                }
-                                SetIsolationStatus(_index, _result, _chargingData[_index]->Evboard_id);
-                            }
-                            else if(_chargingData[_index]->Type == _Type_CCS_2)
-                            {
-                                SetIsolationStatus(_index, _result, _chargingData[_index]->Evboard_id);
-                            }
-                            else
+                        unsigned char _result = GFD_WAIT;
+                        _result = _chargingData[_index]->GroundFaultStatus;
+
+                        if(_chargingData[_index]->Type == _Type_Chademo ||
+                           _chargingData[_index]->Type == _Type_GB)
+                        {
+                            if (_result == GFD_WARNING)
                             {
-                                //NULL
+                                _result = GFD_PASS;
                             }
                         }
 
+                        if(_result < GFD_WAIT &&
+                           _result > GFD_WARNING)
+                        {
+                            PRINTF_FUNC("Unexpected GFD status : %d \n", _result);
+                            _result = GFD_WAIT;
+                        }
+
+                        SetIsolationStatus(_index, _result, _chargingData[_index]->Evboard_id);
+
                         if(_chargingData[_index]->SystemStatus == S_CCS_PRECHARGE_ST0 &&
                             _chargingData[_index]->PrechargeStatus == PRECHARGE_READY)
                         {
@@ -3307,11 +3377,11 @@ int main(int argc, char *argv[])
 
                     if (chargingTime[_index] == 0)
                     {
-                        chargingTime[_index] = _chargingData[_index]->RemainChargingDuration;
+                        chargingTime[_index] = _chargingData[_index]->PresentChargedDuration;
                     }
                     else
                     {
-                        int passTime = _chargingData[_index]->RemainChargingDuration - chargingTime[_index];
+                        int passTime = _chargingData[_index]->PresentChargedDuration - chargingTime[_index];
 
                         if (passTime > 0)
                         {
@@ -3322,7 +3392,7 @@ int main(int argc, char *argv[])
                             }
 
                             _chargingData[_index]->PresentChargedEnergy += changingPow;
-                            chargingTime[_index] = _chargingData[_index]->RemainChargingDuration;
+                            chargingTime[_index] = _chargingData[_index]->PresentChargedDuration;
                         }
                     }
 

+ 20 - 19
EVSE/Projects/DM30/Apps/Module_EventLogging.c

@@ -39,7 +39,6 @@ struct StatusCodeData           *ShmStatusCodeData;
 
 void PRINTF_FUNC(char *string, ...);
 
-int StoreLogMsg(const char *fmt, ...);
 #define DEBUG_INFO(format, args...) StoreLogMsg("[%s:%d][%s][Info] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
 #define DEBUG_WARN(format, args...) StoreLogMsg("[%s:%d][%s][Warn] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
 #define DEBUG_ERROR(format, args...) StoreLogMsg("[%s:%d][%s][Error] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
@@ -61,11 +60,20 @@ int StoreLogMsg(const char *fmt, ...)
     SeqEndTime.time = time(NULL);
     tm=localtime(&SeqEndTime.time);
 
-    sprintf(Buf,"echo \"%04d-%02d-%02d %02d:%02d:%02d.%03d - %s\" >> /Storage/SystemLog/[%04d.%02d]SystemLog",
-            tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,SeqEndTime.millitm,
-            buffer,
-            tm->tm_year+1900,tm->tm_mon+1);
-    system(Buf);
+    if (ShmSysConfigAndInfo->SysConfig.SwitchDebugFlag == YES)
+    {
+        sprintf(Buf,"%02d:%02d:%02d.%03d - %s",
+                tm->tm_hour,tm->tm_min,tm->tm_sec,SeqEndTime.millitm, buffer);
+        printf("%s \n", Buf);
+    }
+    else
+    {
+        sprintf(Buf,"echo \"%04d-%02d-%02d %02d:%02d:%02d.%03d - %s\" >> /Storage/SystemLog/[%04d.%02d]SystemLog",
+                tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,SeqEndTime.millitm,
+                buffer,
+                tm->tm_year+1900,tm->tm_mon+1);
+        system(Buf);
+    }
 
     return rc;
 }
@@ -88,10 +96,7 @@ void PRINTF_FUNC(char *string, ...)
     vsnprintf(buffer, sizeof(buffer), string, args);
     va_end(args);
 
-    if (ShmSysConfigAndInfo->SysConfig.SwitchDebugFlag == YES)
-        printf("%s \n", buffer);
-    else
-        DEBUG_INFO("%s \n", buffer);
+    DEBUG_INFO("%s \n", buffer);
 }
 
 //=================================
@@ -175,6 +180,7 @@ void RemoveFaultCodeToBuf(unsigned char *Code)
     char _code[7];
     sprintf(_code,"%s", Code);
 
+    printf("********************* %s \n", _code);
     // 把相關的錯誤碼一次移除,避免重複顯示
     while(find)
     {
@@ -190,20 +196,15 @@ void RemoveFaultCodeToBuf(unsigned char *Code)
             }
             else
             {
-                if(i == ShmSysConfigAndInfo->SysWarningInfo.WarningCount - 1)
-                {
-                    memcpy(&ShmSysConfigAndInfo->SysWarningInfo.WarningCode[i][0], "", 7);
-                }
-                else
-                {
-                    memcpy(&ShmSysConfigAndInfo->SysWarningInfo.WarningCode[i][0],
-                            &ShmSysConfigAndInfo->SysWarningInfo.WarningCode[i + 1][0], 7);
-                }
+                memcpy(&ShmSysConfigAndInfo->SysWarningInfo.WarningCode[i - 1][0],
+                       &ShmSysConfigAndInfo->SysWarningInfo.WarningCode[i][0], 7);
             }
         }
 
         if (find)
+        {
             ShmSysConfigAndInfo->SysWarningInfo.WarningCount--;
+        }
     }
 }
 

+ 167 - 72
EVSE/Projects/DM30/Apps/Module_InternalComm.c

@@ -44,19 +44,19 @@
 #define COLOR_MAX_LV        100
 #define COLOR_MIN_LV        0
 
+#define AC_DEFAULT_VOL      220
+
 struct SysConfigAndInfo         *ShmSysConfigAndInfo;
 struct StatusCodeData           *ShmStatusCodeData;
 struct FanModuleData            *ShmFanModuleData;
 struct RelayModuleData          *ShmRelayModuleData;
 struct LedModuleData            *ShmLedModuleData;
-struct CHAdeMOData              *ShmCHAdeMOData;
-struct CcsData                  *ShmCcsData;
 struct PsuData                  *ShmPsuData;
 
-#define VIN_MAX_VOLTAGE_IEC     296 // 大於該值 : OVP
-#define VIN_MIN_VOLTAGE_IEC     166 // 小於該值 : UVP
-#define VIN_MAX_VOLTAGE_UL      305 // 大於該值 : OVP
-#define VIN_MIN_VOLTAGE_UL      215 // 小於該值 : UVP
+#define VIN_MAX_VOLTAGE_IEC     285 // 大於該值 : OVP
+#define VIN_MIN_VOLTAGE_IEC     160 // 小於該值 : UVP
+#define VIN_MAX_VOLTAGE_UL      315 // 大於該值 : OVP
+#define VIN_MIN_VOLTAGE_UL      210 // 小於該值 : UVP
 
 #define VIN_DROP_VOLTAGE    150 // 小於該值 : ac drop
 
@@ -114,6 +114,8 @@ struct timeb    _ac_startChargingTime;
 struct timeb    _ac_endChargingTime;
 
 unsigned short _setFanSpeed = 0;
+float _beforeChargingTotalEnergy = 0.0;
+byte _checkLedChanged = 3;
 
 Ver ver;
 PresentInputVoltage inputVoltage;
@@ -164,7 +166,6 @@ int _alarm_code[] = {AC_OVP, AC_UVP, AC_OCP, AC_OTP, AC_GMI_FAULT, AC_CP_ERROR,
 
 void PRINTF_FUNC(char *string, ...);
 
-int StoreLogMsg(const char *fmt, ...);
 unsigned long GetTimeoutValue(struct timeval _sour_time);
 
 #define DEBUG_INFO(format, args...) StoreLogMsg("[%s:%d][%s][Info] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
@@ -196,11 +197,20 @@ int StoreLogMsg(const char *fmt, ...)
     SeqEndTime.time = time(NULL);
     tm=localtime(&SeqEndTime.time);
 
-    sprintf(Buf,"echo \"%04d-%02d-%02d %02d:%02d:%02d.%03d - %s\" >> /Storage/SystemLog/[%04d.%02d]SystemLog",
-            tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,SeqEndTime.millitm,
-            buffer,
-            tm->tm_year+1900,tm->tm_mon+1);
-    system(Buf);
+    if (ShmSysConfigAndInfo->SysConfig.SwitchDebugFlag == YES)
+    {
+        sprintf(Buf,"%02d:%02d:%02d.%03d - %s",
+                tm->tm_hour,tm->tm_min,tm->tm_sec,SeqEndTime.millitm, buffer);
+        printf("%s \n", Buf);
+    }
+    else
+    {
+        sprintf(Buf,"echo \"%04d-%02d-%02d %02d:%02d:%02d.%03d - %s\" >> /Storage/SystemLog/[%04d.%02d]SystemLog",
+                tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,SeqEndTime.millitm,
+                buffer,
+                tm->tm_year+1900,tm->tm_mon+1);
+        system(Buf);
+    }
 
     return rc;
 }
@@ -228,10 +238,7 @@ void PRINTF_FUNC(char *string, ...)
     vsnprintf(buffer, sizeof(buffer), string, args);
     va_end(args);
 
-    if (ShmSysConfigAndInfo->SysConfig.SwitchDebugFlag == YES)
-        printf("%s \n", buffer);
-    else
-        DEBUG_INFO("%s \n", buffer);
+    DEBUG_INFO("%s \n", buffer);
 }
 
 //==========================================
@@ -260,7 +267,7 @@ void GetFwAndHwVersion_Relay()
 {
     if (Query_FW_Ver(Uart5Fd, Addr.Relay, &ver) == PASS)
     {
-        // FanModuleData
+        // RelayModuleData
         strcpy((char *) ShmRelayModuleData->version, ver.Version_FW);
         // SystemInfo
         strcpy((char *) ShmSysConfigAndInfo->SysInfo.RelayModuleFwRev, ver.Version_FW);
@@ -301,6 +308,15 @@ void GetFwVersion_AC()
     }
 }
 
+void GetAcModelName()
+{
+    memset(ShmSysConfigAndInfo->SysConfig.AcModelName, 0x00, sizeof(ShmSysConfigAndInfo->SysConfig.AcModelName));
+    if (Query_Model_Name(Uart5Fd, Addr.AcPlug, ShmSysConfigAndInfo->SysConfig.AcModelName) == PASS)
+    {
+        PRINTF_FUNC("ac model name = %s \n", ShmSysConfigAndInfo->SysConfig.AcModelName);
+    }
+}
+
 void SetRtcData_Relay()
 {
     struct timeb csuTime;
@@ -398,34 +414,52 @@ void GetPresentInputVol()
         if (ShmSysConfigAndInfo->SysInfo.ChargerType == _CHARGER_TYPE_IEC)
         {
             if (inputVoltage.L1N_L12 < VIN_MIN_VOLTAGE_IEC)
+            {
+                PRINTF_FUNC("In Uvp L1N_L12 = %d \n", inputVoltage.L1N_L12);
                 ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputUVP = YES;
+            }
             else
                 ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputUVP = NO;
 
             if (inputVoltage.L2N_L23 < VIN_MIN_VOLTAGE_IEC)
+            {
+                PRINTF_FUNC("In Uvp L2N_L23 = %d \n", inputVoltage.L2N_L23);
                 ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL2InputUVP = YES;
+            }
             else
                 ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL2InputUVP = NO;
 
             if (inputVoltage.L3N_L31 < VIN_MIN_VOLTAGE_IEC)
+            {
+                PRINTF_FUNC("In Uvp L3N_L31 = %d \n", inputVoltage.L3N_L31);
                 ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL3InputUVP = YES;
+            }
             else
                 ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL3InputUVP = NO;
         }
         else if (ShmSysConfigAndInfo->SysInfo.ChargerType == _CHARGER_TYPE_UL)
         {
             if (inputVoltage.L1N_L12 < VIN_MIN_VOLTAGE_UL)
+            {
+                PRINTF_FUNC("In Uvp L1N_L12 = %d \n", inputVoltage.L1N_L12);
                 ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputUVP = YES;
+            }
             else
                 ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputUVP = NO;
 
             if (inputVoltage.L2N_L23 < VIN_MIN_VOLTAGE_UL)
+            {
+                PRINTF_FUNC("In Uvp L2N_L23 = %d \n", inputVoltage.L2N_L23);
                 ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL2InputUVP = YES;
+            }
             else
                 ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL2InputUVP = NO;
 
             if (inputVoltage.L3N_L31 < VIN_MIN_VOLTAGE_UL)
+            {
+                PRINTF_FUNC("In Uvp L3N_L31 = %d \n", inputVoltage.L3N_L31);
                 ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL3InputUVP = YES;
+            }
             else
                 ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL3InputUVP = NO;
         }
@@ -434,34 +468,52 @@ void GetPresentInputVol()
         if (ShmSysConfigAndInfo->SysInfo.ChargerType == _CHARGER_TYPE_IEC)
         {
             if (inputVoltage.L1N_L12 > VIN_MAX_VOLTAGE_IEC)
+            {
+                PRINTF_FUNC("In Ovp L1N_L12 = %d \n", inputVoltage.L1N_L12);
                 ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputOVP = YES;
+            }
             else
                 ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputOVP = NO;
 
             if (inputVoltage.L2N_L23 > VIN_MAX_VOLTAGE_IEC)
+            {
+                PRINTF_FUNC("In Ovp L2N_L23 = %d \n", inputVoltage.L2N_L23);
                 ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL2InputOVP = YES;
+            }
             else
                 ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL2InputOVP = NO;
 
             if (inputVoltage.L3N_L31 > VIN_MAX_VOLTAGE_IEC)
+            {
+                PRINTF_FUNC("In Ovp L3N_L31 = %d \n", inputVoltage.L3N_L31);
                 ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL3InputOVP = YES;
+            }
             else
                 ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL3InputOVP = NO;
         }
         else if (ShmSysConfigAndInfo->SysInfo.ChargerType == _CHARGER_TYPE_UL)
         {
             if (inputVoltage.L1N_L12 > VIN_MAX_VOLTAGE_UL)
+            {
+                PRINTF_FUNC("In Ovp L1N_L12 = %d \n", inputVoltage.L1N_L12);
                 ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputOVP = YES;
+            }
             else
                 ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputOVP = NO;
 
             if (inputVoltage.L2N_L23 > VIN_MAX_VOLTAGE_UL)
+            {
+                PRINTF_FUNC("In Ovp L2N_L23 = %d \n", inputVoltage.L2N_L23);
                 ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL2InputOVP = YES;
+            }
             else
                 ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL2InputOVP = NO;
 
             if (inputVoltage.L3N_L31 > VIN_MAX_VOLTAGE_UL)
+            {
+                PRINTF_FUNC("In Ovp L3N_L31 = %d \n", inputVoltage.L3N_L31);
                 ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL3InputOVP = YES;
+            }
             else
                 ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL3InputOVP = NO;
         }
@@ -942,7 +994,8 @@ void CheckPhaseLossStatus(byte index)
 
 void SetParalleRelayStatus()
 {
-    if (gunCount >= 2 && ShmSysConfigAndInfo->SysInfo.IsAlternatvieConf == NO)
+    // 之後雙槍單模機種,橋接都會上
+    if (gunCount >= 2)
     {
         if (_chargingData[0]->SystemStatus == S_BOOTING || _chargingData[1]->SystemStatus == S_BOOTING ||
             (_chargingData[0]->SystemStatus == S_IDLE && _chargingData[1]->SystemStatus == S_IDLE))
@@ -1022,7 +1075,7 @@ void CheckAlarmOccur()
                 case AC_DC_LEAKAGE: ShmStatusCodeData->AlarmCode.AlarmEvents.bits.RcdTrip = YES; break;
                 case AC_SYSTEM_SELFTEST_FAULT: ShmStatusCodeData->AlarmCode.AlarmEvents.bits.McuSelftestFail = YES; break;
                 case AC_HANDSHAKE_TIMEOUT: break;
-                case AC_EMC_STOP: ShmStatusCodeData->AlarmCode.AlarmEvents.bits.EmergencyStopTrip = YES; break;
+            //case AC_EMC_STOP: ShmStatusCodeData->AlarmCode.AlarmEvents.bits.EmergencyStopTrip = YES; break;
                 case AC_RELAY_WELDING: ShmStatusCodeData->FaultCode.FaultEvents.bits.AcOutputRelayWelding = YES; break;
                 case AC_GF_MODULE_FAULT: ShmStatusCodeData->FaultCode.FaultEvents.bits.RcdSelfTestFail = YES; break;
                 case AC_SHUTTER_FAULT: break;
@@ -1047,7 +1100,7 @@ void CheckAlarmOccur()
                 case AC_DC_LEAKAGE: ShmStatusCodeData->AlarmCode.AlarmEvents.bits.RcdTrip = NO; break;
                 case AC_SYSTEM_SELFTEST_FAULT: ShmStatusCodeData->AlarmCode.AlarmEvents.bits.McuSelftestFail = NO; break;
                 case AC_HANDSHAKE_TIMEOUT: break;
-                case AC_EMC_STOP: ShmStatusCodeData->AlarmCode.AlarmEvents.bits.EmergencyStopTrip = NO; break;
+            //case AC_EMC_STOP: ShmStatusCodeData->AlarmCode.AlarmEvents.bits.EmergencyStopTrip = NO; break;
                 case AC_RELAY_WELDING: ShmStatusCodeData->FaultCode.FaultEvents.bits.AcOutputRelayWelding = NO; break;
                 case AC_GF_MODULE_FAULT: ShmStatusCodeData->FaultCode.FaultEvents.bits.RcdSelfTestFail = NO; break;
                 case AC_SHUTTER_FAULT: break;
@@ -1149,10 +1202,12 @@ void SetLedColor(struct ChargingInfoData *chargingData_1, struct ChargingInfoDat
         led_color.Connect_2_Red     = COLOR_MAX_LV;
     }
 
-    if (IsNoneMatchLedColor())
+    if (_checkLedChanged > 0)
     {
         if (Config_Led_Color(Uart5Fd, Addr.Led, &led_color) == PASS)
     {
+            _checkLedChanged--;
+
             cur_led_color.Connect_1_Red = led_color.Connect_1_Red;
             cur_led_color.Connect_1_Green = led_color.Connect_1_Green;
             cur_led_color.Connect_1_Blue = led_color.Connect_1_Blue;
@@ -1161,6 +1216,8 @@ void SetLedColor(struct ChargingInfoData *chargingData_1, struct ChargingInfoDat
             cur_led_color.Connect_2_Blue = led_color.Connect_2_Blue;
         }
     }
+    else if (IsNoneMatchLedColor())
+        _checkLedChanged = 3;
 }
 //==========================================
 // Init all share memory
@@ -1233,6 +1290,7 @@ int InitShareMemory()
         #endif
         result = FAIL;
     }
+    memset(ShmRelayModuleData,0,sizeof(struct RelayModuleData));
 
     //creat ShmLedModuleData
     if ((MeterSMId = shmget(ShmLedBdKey, sizeof(struct LedModuleData),  0777)) < 0)
@@ -1266,43 +1324,6 @@ int InitShareMemory()
         #endif
         result = FAIL;
     }
-    memset(ShmPsuData,0,sizeof(struct PsuData));
-
-    if(CHAdeMO_QUANTITY > 0)
-    {
-        if ((MeterSMId = shmget(ShmCHAdeMOCommKey, sizeof(struct CHAdeMOData),  IPC_CREAT | 0777)) < 0)
-        {
-            #ifdef SystemLogMessage
-            DEBUG_ERROR("[shmget ShmCHAdeMOData NG \n");
-            #endif
-            return FAIL;
-        }
-        else if ((ShmCHAdeMOData = shmat(MeterSMId, NULL, 0)) == (void *) -1) {
-            #ifdef SystemLogMessage
-            DEBUG_ERROR("shmat ShmCHAdeMOData NG \n");
-            #endif
-            return FAIL;
-        }
-    }
-
-    if(CCS_QUANTITY > 0)
-    {
-        if ((MeterSMId = shmget(ShmCcsCommKey, sizeof(struct CcsData),  IPC_CREAT | 0777)) < 0)
-        {
-            #ifdef SystemLogMessage
-            DEBUG_ERROR("shmget ShmCcsData NG \n");
-            #endif
-            return FAIL;
-        }
-        else if ((ShmCcsData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
-        {
-            #ifdef SystemLogMessage
-            DEBUG_ERROR("shmat ShmCcsData NG \n");
-            #endif
-            return FAIL;
-        }
-    }
-
 
     return result;
 }
@@ -1401,7 +1422,7 @@ void Initialization()
         {
             if (!FindChargingInfoData(_index, &_chargingData[0]))
             {
-                DEBUG_ERROR("EvComm : FindChargingInfoData false \n");
+                DEBUG_ERROR("InternalComm : FindChargingInfoData false \n");
                 isPass = false;
                 break;
             }
@@ -1540,10 +1561,14 @@ void CableCheckDetected(byte index)
             }
             else if (_chargingData[index]->SystemStatus <= S_CHARGING)
             {
-                if (_chargingData[index]->Type == _Type_GB)
-                    SetGfdConfig(index, GFD_IDLE);
-                else
+                if (_chargingData[index]->Type == _Type_CCS_2)
+                {
                     SetGfdConfig(index, GFD_CHARGING);
+                }
+                else
+                {
+                    SetGfdConfig(index, GFD_IDLE);
+                }
             }
         }
         else if(_chargingData[index]->SystemStatus == S_COMPLETE || _chargingData[index]->SystemStatus == S_PREPARNING
@@ -1557,9 +1582,9 @@ void CableCheckDetected(byte index)
 void CheckOutputPowerOverCarReq(byte index)
 {
     float fireV = _chargingData[index]->FireChargingVoltage;
-    float carV = _chargingData[index]->EvBatterytargetVoltage;
+    float carV = _chargingData[index]->EvBatterytargetVoltage * 10;
 
-    if (_chargingData[index]->EvBatterytargetVoltage > 1500 &&
+    if ((_chargingData[index]->EvBatterytargetVoltage * 10) > 1500 &&
         (_chargingData[index]->Type == _Type_Chademo ||
          _chargingData[index]->Type == _Type_CCS_2 ||
          _chargingData[index]->Type == _Type_GB))
@@ -1567,9 +1592,9 @@ void CheckOutputPowerOverCarReq(byte index)
         if (fireV >= (carV + (carV * 0.1)))
         {
             PRINTF_FUNC("[Module_InternalComm]CheckOutputPowerOverCarReq NG : fire = %f, battery = %f \n",
-                    _chargingData[index]->FireChargingVoltage, _chargingData[index]->EvBatterytargetVoltage);
+                    _chargingData[index]->FireChargingVoltage, (_chargingData[index]->EvBatterytargetVoltage * 10));
             DEBUG_ERROR("[Module_InternalComm]CheckOutputPowerOverCarReq NG : fire = %f, battery = %f \n",
-                    _chargingData[index]->FireChargingVoltage, _chargingData[index]->EvBatterytargetVoltage);
+                    _chargingData[index]->FireChargingVoltage, (_chargingData[index]->EvBatterytargetVoltage * 10));
             _chargingData[index]->StopChargeFlag = YES;
         }
     }
@@ -1577,7 +1602,7 @@ void CheckOutputPowerOverCarReq(byte index)
 
 void CheckOutputVolNoneMatchFire(byte index)
 {
-    if (_chargingData[index]->EvBatterytargetVoltage > 1500 &&
+    if ((_chargingData[index]->EvBatterytargetVoltage * 10) > 1500 &&
         (_chargingData[index]->Type == _Type_Chademo ||
          _chargingData[index]->Type == _Type_CCS_2 ||
          _chargingData[index]->Type == _Type_GB))
@@ -1678,6 +1703,7 @@ void GetAcStatus()
         if(ShmSysConfigAndInfo->SysConfig.AcMaxChargingCurrent == 0)
             ShmSysConfigAndInfo->SysConfig.AcMaxChargingCurrent = ShmSysConfigAndInfo->SysConfig.AcRatingCurrent;
 
+        ac_chargingInfo[0]->ConnectorPlugIn = acStatus.CpStatus;
     //              printf("CpStatus = %d \n", acStatus.CpStatus);
     //              printf("CurLimit = %d \n", acStatus.CurLimit);
     //              printf("PilotVol_P = %d \n", acStatus.PilotVol_P);
@@ -1745,6 +1771,24 @@ void ChangeToCsuMode()
 //  }
 }
 
+void ChangeStartOrStopDateTime(byte isStart)
+{
+    char cmdBuf[32];
+    struct timeb csuTime;
+    struct tm *tmCSU;
+
+    ftime(&csuTime);
+    tmCSU = localtime(&csuTime.time);
+
+    sprintf(cmdBuf, "%04d-%02d-%02d %02d:%02d:%02d", tmCSU->tm_year + 1900,
+            tmCSU->tm_mon + 1, tmCSU->tm_mday, tmCSU->tm_hour, tmCSU->tm_min,
+            tmCSU->tm_sec);
+    if (isStart)
+        strcpy((char *)ac_chargingInfo[0]->StartDateTime, cmdBuf);
+    else
+        strcpy((char *)ac_chargingInfo[0]->StopDateTime, cmdBuf);
+}
+
 void AcChargeTypeProcess()
 {
     if (acgunCount > 0)
@@ -1753,6 +1797,7 @@ void AcChargeTypeProcess()
         {
             ac_chargingInfo[0]->IsModeChagned = NO;
             GetFwVersion_AC();
+            GetAcModelName();
         }
         else if (ac_chargingInfo[0]->SelfTest_Comp == YES)
         {
@@ -1793,6 +1838,16 @@ void AcChargeTypeProcess()
                      (ShmSysConfigAndInfo->SysInfo.WaitForPlugit == YES ||
                       ShmSysConfigAndInfo->SysConfig.AuthorisationMode == AUTH_MODE_DISABLE))
             {
+                if (ShmSysConfigAndInfo->SysInfo.OrderCharging != FAIL &&
+                        ShmSysConfigAndInfo->SysInfo.OrderCharging == DEFAULT_AC_INDEX)
+                {
+                    PRINTF_FUNC("** AC Remote \n");
+                    strcpy((char *)ac_chargingInfo[0]->StartUserId, "");
+                    ShmSysConfigAndInfo->SysInfo.WaitForPlugit = NO;
+                    _status = S_PREPARNING;
+                }
+                else
+                {
                 PRINTF_FUNC("** UserId = %s \n", ShmSysConfigAndInfo->SysConfig.UserId);
                 strcpy((char *)ac_chargingInfo[0]->StartUserId, (char *)ShmSysConfigAndInfo->SysConfig.UserId);
                 PRINTF_FUNC("** CardNumber = %s \n", ac_chargingInfo[0]->StartUserId);
@@ -1800,6 +1855,7 @@ void AcChargeTypeProcess()
                 ShmSysConfigAndInfo->SysInfo.WaitForPlugit = NO;
                 _status = S_PREPARNING;
             }
+            }
 
             //printf("_status = %d \n", _status);
 
@@ -1817,6 +1873,9 @@ void AcChargeTypeProcess()
                     if (_isStatusChanged)
                     {
                         ac_chargingInfo[0]->PresentChargedEnergy = 0.0;
+                        ac_chargingInfo[0]->PresentChargingVoltage = 0;
+                        ac_chargingInfo[0]->ChargingFee = 0.0;
+                        _beforeChargingTotalEnergy = 0.0;
                     }
 
                     ChangeLedStatus();
@@ -1828,12 +1887,13 @@ void AcChargeTypeProcess()
                     {
                         ShmSysConfigAndInfo->SysInfo.SystemPage = _LCM_NONE;
                         ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc = DEFAULT_AC_INDEX;
+                        ShmSysConfigAndInfo->SysInfo.OrderCharging = FAIL;
                         gettimeofday(&_ac_preparing, NULL);
                     }
 
                     if (GetChargingEnergy() == PASS)
                     {
-                        ac_chargingInfo[0]->PresentChargedEnergy = acChargingEnergy.Energy / 100;
+                        _beforeChargingTotalEnergy = acChargingEnergy.Energy;
                     }
 
                     SetLegacyReq(YES);
@@ -1845,17 +1905,31 @@ void AcChargeTypeProcess()
                     if (_isStatusChanged)
                     {
                         ftime(&_ac_startChargingTime);
+                        ChangeStartOrStopDateTime(YES);
                         ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc = DEFAULT_AC_INDEX;
                     }
 
                     if (GetChargingEnergy() == PASS)
-                        ac_chargingInfo[0]->PresentChargedEnergy = acChargingEnergy.Energy / 100;
+                    {
+                        if ((acChargingEnergy.Energy - _beforeChargingTotalEnergy) > 0)
+                        {
+                            ac_chargingInfo[0]->PresentChargedEnergy += (acChargingEnergy.Energy - _beforeChargingTotalEnergy) / 100;
+                            if (ShmSysConfigAndInfo->SysConfig.BillingData.isBilling)
+                            {
+                                ac_chargingInfo[0]->ChargingFee += ac_chargingInfo[0]->PresentChargedEnergy * ShmSysConfigAndInfo->SysConfig.BillingData.Cur_fee;
+                            }
+                        }
+
+                        _beforeChargingTotalEnergy = acChargingEnergy.Energy;
+                    }
 
                     if (GetChargingCurrent() == PASS)
-                        ac_chargingInfo[0]->PresentChargingPower = (220 * (acChargingCurrent.OuputCurrentL1 / 10)) / 1000;
+                        ac_chargingInfo[0]->PresentChargingPower = (AC_DEFAULT_VOL * (acChargingCurrent.OuputCurrentL1 / 10)) / 1000;
 
                     ftime(&_ac_endChargingTime);
-                    ac_chargingInfo[0]->RemainChargingDuration = DiffTimeb(_ac_startChargingTime, _ac_endChargingTime);
+                    ac_chargingInfo[0]->PresentChargedDuration = DiffTimeb(_ac_startChargingTime, _ac_endChargingTime);
+                    ac_chargingInfo[0]->PresentChargingVoltage = AC_DEFAULT_VOL;
+                    ac_chargingInfo[0]->PresentChargingCurrent = acChargingCurrent.OuputCurrentL1 / 10;
 
                     // 用以判斷是否有在輸出
                     ac_chargingInfo[0]->IsCharging = acStatus.RelayStatus;
@@ -1868,6 +1942,7 @@ void AcChargeTypeProcess()
                 {
                     if (_isStatusChanged)
                     {
+                        ChangeStartOrStopDateTime(NO);
                         gettimeofday(&_ac_charging_comp, NULL);
                     }
 
@@ -1882,7 +1957,8 @@ void AcChargeTypeProcess()
                     {
                         gettimeofday(&_ac_charging_comp, NULL);
                         ftime(&_ac_endChargingTime);
-                        ac_chargingInfo[0]->RemainChargingDuration = DiffTimeb(_ac_startChargingTime, _ac_endChargingTime);
+                        ChangeStartOrStopDateTime(NO);
+                        ac_chargingInfo[0]->PresentChargedDuration = DiffTimeb(_ac_startChargingTime, _ac_endChargingTime);
                     }
                 }
                     break;
@@ -1957,12 +2033,23 @@ int main(void)
             gettimeofday(&_priority_time, NULL);
         }
 
+        // 自檢階段處理,自檢階段如果讀不到版號則代表該系統沒有掛燈板
         if (ShmLedModuleData->SelfTest_Comp == NO)
         {
+            // 自檢階段
+            if (ShmSysConfigAndInfo->SysInfo.SelfTestSeq <= _STEST_PSU_CAP)
+            {
             GetFwAndHwVersion_Led();
             sleep(1);
             gettimeofday(&_led_priority_time, NULL);
         }
+            else
+            {
+                // 自檢階段沒有問到版號
+                if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.LedboardStestFail == NO)
+                    ShmStatusCodeData->AlarmCode.AlarmEvents.bits.LedboardStestFail = YES;
+            }
+        }
 
         AcChargeTypeProcess();
 
@@ -2084,6 +2171,14 @@ int main(void)
 
         if (ShmFanModuleData->SelfTest_Comp == YES)
         {
+            // 風控修改 :
+            // ******************************************************* //
+            //
+            //       當前PSU輸出總 KW       PSU Temp
+            // 30 x -------------------- x ---------- + 14 x (PSU Temp - 45)
+            //       當前樁最大功率 KW         45
+            //
+            // ******************************************************* //
             if (GetTimeoutValue(_priority_time) / 1000 >= 1000)
             {
                 GetPsuTempForFanSpeed();

+ 77 - 36
EVSE/Projects/DM30/Apps/Module_LcmControl.c

@@ -4,7 +4,6 @@ bool needReloadQr = true;
 
 void PRINTF_FUNC(char *string, ...);
 
-int StoreLogMsg(const char *fmt, ...);
 #define DEBUG_INFO(format, args...) StoreLogMsg("[%s:%d][%s][Info] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
 #define DEBUG_WARN(format, args...) StoreLogMsg("[%s:%d][%s][Warn] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
 #define DEBUG_ERROR(format, args...) StoreLogMsg("[%s:%d][%s][Error] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
@@ -31,11 +30,20 @@ int StoreLogMsg(const char *fmt, ...)
     SeqEndTime.time = time(NULL);
     tm=localtime(&SeqEndTime.time);
 
-    sprintf(Buf,"echo \"%04d-%02d-%02d %02d:%02d:%02d.%03d - %s\" >> /Storage/SystemLog/[%04d.%02d]SystemLog",
-            tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,SeqEndTime.millitm,
-            buffer,
-            tm->tm_year+1900,tm->tm_mon+1);
-    system(Buf);
+    if (ShmSysConfigAndInfo->SysConfig.SwitchDebugFlag == YES)
+    {
+        sprintf(Buf,"%02d:%02d:%02d.%03d - %s",
+                tm->tm_hour,tm->tm_min,tm->tm_sec,SeqEndTime.millitm, buffer);
+        printf("%s \n", Buf);
+    }
+    else
+    {
+        sprintf(Buf,"echo \"%04d-%02d-%02d %02d:%02d:%02d.%03d - %s\" >> /Storage/SystemLog/[%04d.%02d]SystemLog",
+                tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,SeqEndTime.millitm,
+                buffer,
+                tm->tm_year+1900,tm->tm_mon+1);
+        system(Buf);
+    }
 
     return rc;
 }
@@ -61,10 +69,7 @@ void PRINTF_FUNC(char *string, ...)
     vsnprintf(buffer, sizeof(buffer), string, args);
     va_end(args);
 
-    if (ShmSysConfigAndInfo->SysConfig.SwitchDebugFlag == YES)
-        printf("%s \n", buffer);
-    else
-        DEBUG_INFO("%s \n", buffer);
+    DEBUG_INFO("%s \n", buffer);
 }
 
 //==========================================
@@ -586,7 +591,12 @@ void ChangeBattMapAndValue(short page, int soc)
             ChangeDisplay2Value(__batt_map, _battery_cap_80);
         }
         else if (soc >= 80 && soc <= 100)
+        {
+            if (_battery_display_ani)
+                ChangeDisplay2Value(__batt_map, _battery_cap_80);
+            else
             ChangeDisplay2Value(__batt_map, _battery_cap_100);
+        }
     }
     else if (page == _LCM_COMPLETE)
     {
@@ -612,7 +622,7 @@ void ChangeBattMapAndValue(short page, int soc)
     DisplayValueToLcm(__soc_value_charging, cmd, sizeof(cmd));
 }
 
-void ChangeRemainTime(int sec)
+void ChangeChargingTime(int sec)
 {
     int h, m, s;
     byte cmd[10];
@@ -630,7 +640,7 @@ void ChangeRemainTime(int sec)
     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));
+    DisplayValueToLcm(__charging_time_tx, cmd, sizeof(cmd));
 }
 
 void ChangeChargingEnergyValue(float energy)
@@ -748,17 +758,14 @@ void RefreshPageAnimation(byte value)
     }
 }
 
-#define WIFI_MODE_DISABLE           0
-#define WIFI_MODE_STA               1
-#define WIFI_MODE_AP                2
-#define WIFI_MODE_ADHOC             3
-
 void RefreshConnStatus()
 {
     // Wifi priority is higher than Ethernet
-    if(ShmSysConfigAndInfo->SysConfig.AthInterface.WifiMode == WIFI_MODE_STA)
+    if(ShmSysConfigAndInfo->SysConfig.AthInterface.WifiMode == _SYS_WIFI_MODE_STATION ||
+       ShmSysConfigAndInfo->SysConfig.AthInterface.WifiMode == _SYS_WIFI_MODE_AP)
     {
-        if (ShmSysConfigAndInfo->SysConfig.AthInterface.WifiNetworkConn == YES)
+        if (ShmSysConfigAndInfo->SysConfig.AthInterface.WifiNetworkConn == YES ||
+            ShmStatusCodeData->InfoCode.InfoEvents.bits.ApDisconnectViaWiFi == NO)
         {
             _wifi_conn_status = true;
             ChangeDisplay2Value(__ethernet_status, _disappear);
@@ -814,8 +821,34 @@ byte FirstPageChanged()
     return result;
 }
 
+bool IsPageReloadChk()
+{
+    bool result = false;
+
+    if (ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc == NO_DEFINE)
+    {
+        if (_curPage_index != ShmSysConfigAndInfo->SysInfo.CurGunSelected)
+        {
+            _curPage_index = ShmSysConfigAndInfo->SysInfo.CurGunSelected;
+            result = true;
+        }
+    }
+    else
+    {
+        if (_curPage_index != ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc)
+        {
+            _curPage_index = ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc;
+            result = true;
+        }
+    }
+
+    return result;
+}
+
 void ProcessPageInfo()
 {
+    _page_reload = IsPageReloadChk();
+
     switch(_currentPage)
     {
         case _LCM_IDLE:
@@ -839,12 +872,15 @@ void ProcessPageInfo()
             else
                 ChangeDisplay2Value(__main_app, _main_none_app);
 
-            if (FirstPageChanged() == YES || needReloadQr)
+            if (FirstPageChanged() == YES || needReloadQr || _page_reload)
             {
                 if (ShmSysConfigAndInfo->SysConfig.isQRCode)
                 {
                     needReloadQr = false;
-                    ChangeQrCode_Idle("http://google.com.tw");
+                    char QrCodeContent[128];
+                    strcpy(QrCodeContent, (char *)ShmSysConfigAndInfo->SysConfig.ModelName);
+                    strcat(QrCodeContent, (char *)ShmSysConfigAndInfo->SysConfig.SerialNumber);
+                    ChangeQrCode_Idle(QrCodeContent);
                 }
             }
         }
@@ -861,7 +897,8 @@ void ProcessPageInfo()
         case _LCM_CHARGING:
         case _LCM_COMPLETE:
         {
-            if (_totalCount + acgunCount >= 2)
+            if ((_totalCount >= 1 && acgunCount >= 1) ||
+                (_totalCount >= 2 && ShmSysConfigAndInfo->SysInfo.IsAlternatvieConf == NO))
             {
                 ChangeDisplay2Value(__sel_gun_btn, _sel_gun_btn);
 
@@ -890,6 +927,7 @@ void ProcessPageInfo()
                 ChangeDisplay2Value(__side_mid, _disappear);
                 ChangeDisplay2Value(__side_down, _disappear);
                 ChangeDisplay2Value(__sel_gun_btn, _disappear);
+                ChangeDisplay2Value(__qr_code_pre, _disappear);
             }
 
             bool isShowAc = false;
@@ -903,10 +941,10 @@ void ProcessPageInfo()
                     if (_currentPage == _LCM_CHARGING)
                     {
                         ChangeAcBattMapAndValue(_LCM_CHARGING);
-                        if (ac_chargingInfo[0]->RemainChargingDuration >= 0)
-                            ChangeRemainTime(ac_chargingInfo[0]->RemainChargingDuration);
+                        if (ac_chargingInfo[0]->PresentChargedDuration >= 0)
+                            ChangeChargingTime(ac_chargingInfo[0]->PresentChargedDuration);
                         else
-                            ChangeRemainTime(0);
+                            ChangeChargingTime(0);
 
                         if (ac_chargingInfo[0]->PresentChargingPower >= 0.1)
                             ChangeChargingPowerValue(ac_chargingInfo[0]->PresentChargingPower);
@@ -926,10 +964,10 @@ void ProcessPageInfo()
                     else if (_currentPage == _LCM_COMPLETE)
                     {
                         ChangeAcBattMapAndValue(_LCM_COMPLETE);
-                        if (ac_chargingInfo[0]->RemainChargingDuration >= 0)
-                            ChangeRemainTime(ac_chargingInfo[0]->RemainChargingDuration);
+                        if (ac_chargingInfo[0]->PresentChargedDuration >= 0)
+                            ChangeChargingTime(ac_chargingInfo[0]->PresentChargedDuration);
                         else
-                            ChangeRemainTime(0);
+                            ChangeChargingTime(0);
 
                         if (ac_chargingInfo[0]->PresentChargingPower >= 0.1)
                             ChangeChargingPowerValue(ac_chargingInfo[0]->PresentChargingPower);
@@ -1017,10 +1055,10 @@ void ProcessPageInfo()
                     if (ShmSysConfigAndInfo->SysInfo.CurGunSelected == i)
                     {
                         ChangeBattMapAndValue(_LCM_CHARGING, _chargingInfoData[i]->EvBatterySoc);
-                        if (_chargingInfoData[i]->RemainChargingDuration >= 0)
-                            ChangeRemainTime(_chargingInfoData[i]->RemainChargingDuration);
+                        if (_chargingInfoData[i]->PresentChargedDuration >= 0)
+                            ChangeChargingTime(_chargingInfoData[i]->PresentChargedDuration);
                         else
-                            ChangeRemainTime(0);
+                            ChangeChargingTime(0);
 
                         if (_chargingInfoData[i]->PresentChargingPower >= 0)
                             ChangeChargingPowerValue(_chargingInfoData[i]->PresentChargingPower);
@@ -1043,10 +1081,10 @@ void ProcessPageInfo()
                     if (ShmSysConfigAndInfo->SysInfo.CurGunSelected == i)
                     {
                         ChangeBattMapAndValue(_LCM_COMPLETE, _chargingInfoData[i]->EvBatterySoc);
-                        if (_chargingInfoData[i]->RemainChargingDuration >= 0)
-                            ChangeRemainTime(_chargingInfoData[i]->RemainChargingDuration);
+                        if (_chargingInfoData[i]->PresentChargedDuration >= 0)
+                            ChangeChargingTime(_chargingInfoData[i]->PresentChargedDuration);
                         else
-                            ChangeRemainTime(0);
+                            ChangeChargingTime(0);
 
                         if (_chargingInfoData[i]->PresentChargingPower >= 0)
                             ChangeChargingPowerValue(_chargingInfoData[i]->PresentChargingPower);
@@ -1099,12 +1137,15 @@ void ProcessPageInfo()
                         _chargingInfoData[index]->SystemStatus == S_RESERVATION ||
                         _chargingInfoData[index]->SystemStatus == S_BOOTING)
                 {
-                    if (FirstPageChanged() == YES || needReloadQr)
+                    if (FirstPageChanged() == YES || needReloadQr || _page_reload)
                     {
                         if (ShmSysConfigAndInfo->SysConfig.isQRCode)
                         {
                             needReloadQr = false;
-                            ChangeQrCode_Charge("http://google.com.tw");
+                            char QrCodeContent[128];
+                            strcpy(QrCodeContent, (char *)ShmSysConfigAndInfo->SysConfig.ModelName);
+                            strcat(QrCodeContent, (char *)ShmSysConfigAndInfo->SysConfig.SerialNumber);
+                            ChangeQrCode_Charge(QrCodeContent);
                         }
                     }
                 }

+ 5 - 4
EVSE/Projects/DM30/Apps/Module_LcmControl.h

@@ -42,6 +42,7 @@ struct StatusCodeData           *ShmStatusCodeData;
 struct FanModuleData            *ShmFanModuleData;
 
 #define NO_DEFINE           255
+#define DEFAULT_AC_INDEX    2
 
 #define CMD_TITLE_1             0x5A
 #define CMD_TITLE_2             0xA5
@@ -79,10 +80,10 @@ byte isChangeBattMap = false;
 short _currentPage = _LCM_NONE;
 short _oldPage = _LCM_NONE;
 byte _gunIndex = 0;
-byte _idlePageRotate = 1;
-bool _backend_conn_status = false;
 bool _wifi_conn_status = false;
 bool _battery_display_ani = false;
+byte _curPage_index = 0;
+bool _page_reload = false;
 
 // LCM - HW
 byte _everyPageRollChange = 0;
@@ -113,10 +114,10 @@ short __side_mid = 0x0094;
 short __conn_line_chag = 0x0096;
 short __batt_map = 0x0100;
 short __soc_value_charging = 0x0102;
-short __remain_time_map = 0x0106;
+short __charging_time_map = 0x0106;
 short __power_map = 0x0108;
 short __energy_map = 0x010A;
-short __remain_time_tx = 0x0110;
+short __charging_time_tx = 0x0110;
 short __output_eng_tx = 0x0120;
 short __total_out_eng_tx = 0x0130;
 short __conn_line_comp = 0x0140;

+ 15 - 10
EVSE/Projects/DM30/Apps/Module_PrimaryComm.c

@@ -59,7 +59,6 @@ byte flash = NO;
 
 void PRINTF_FUNC(char *string, ...);
 
-int StoreLogMsg(const char *fmt, ...);
 #define DEBUG_INFO(format, args...) StoreLogMsg("[%s:%d][%s][Info] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
 #define DEBUG_WARN(format, args...) StoreLogMsg("[%s:%d][%s][Warn] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
 #define DEBUG_ERROR(format, args...) StoreLogMsg("[%s:%d][%s][Error] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
@@ -81,11 +80,20 @@ int StoreLogMsg(const char *fmt, ...)
     SeqEndTime.time = time(NULL);
     tm=localtime(&SeqEndTime.time);
 
-    sprintf(Buf,"echo \"%04d-%02d-%02d %02d:%02d:%02d.%03d - %s\" >> /Storage/SystemLog/[%04d.%02d]SystemLog",
-            tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,SeqEndTime.millitm,
-            buffer,
-            tm->tm_year+1900,tm->tm_mon+1);
-    system(Buf);
+    if (ShmSysConfigAndInfo->SysConfig.SwitchDebugFlag == YES)
+    {
+        sprintf(Buf,"%02d:%02d:%02d.%03d - %s",
+                tm->tm_hour,tm->tm_min,tm->tm_sec,SeqEndTime.millitm, buffer);
+        printf("%s \n", Buf);
+    }
+    else
+    {
+        sprintf(Buf,"echo \"%04d-%02d-%02d %02d:%02d:%02d.%03d - %s\" >> /Storage/SystemLog/[%04d.%02d]SystemLog",
+                tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,SeqEndTime.millitm,
+                buffer,
+                tm->tm_year+1900,tm->tm_mon+1);
+        system(Buf);
+    }
 
     return rc;
 }
@@ -108,10 +116,7 @@ void PRINTF_FUNC(char *string, ...)
     vsnprintf(buffer, sizeof(buffer), string, args);
     va_end(args);
 
-    if (ShmSysConfigAndInfo->SysConfig.SwitchDebugFlag == YES)
-        printf("%s \n", buffer);
-    else
-        DEBUG_INFO("%s \n", buffer);
+    DEBUG_INFO("%s \n", buffer);
 }
 //=================================
 // Common routine

文件差異過大導致無法顯示
+ 516 - 195
EVSE/Projects/DM30/Apps/Module_PsuComm.c


+ 3 - 0
EVSE/Projects/DM30/Apps/Module_PsuComm.h

@@ -38,16 +38,19 @@ typedef unsigned int        unit;
 
 unsigned char _gunCount;
 struct ChargingInfoData *chargingInfo[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
+bool isStartOutputSwitch[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
 
 struct timeval _cmdSubPriority_time;
 byte _getCapDelayCount;
 struct timeval _derating_time;
+struct timeval _max_time;
 
 struct timeval _test_time;
 
 bool isCharging = false;
 bool isWaitingAver = false;
 bool isReadToCharging = false;
+bool CanAverageCharging = false;
 int preChargingTarget;
 int preChargingCur;
 

+ 88 - 30
EVSE/Projects/DM30/Apps/ReadCmdline.c

@@ -57,6 +57,7 @@ struct CcsData                  *ShmCcsData;
 struct GBTData                  *ShmGBTData;
 struct FanModuleData            *ShmFanModuleData;
 struct RelayModuleData          *ShmRelayModuleData;
+struct LedModuleData            *ShmLedModuleData;
 struct PsuData                  *ShmPsuData;
 
 struct ChargingInfoData         *_chargingData[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
@@ -200,6 +201,15 @@ int InitShareMemory()
         result = FAIL;
     }
 
+    if ((MeterSMId = shmget(ShmLedBdKey, sizeof(struct LedModuleData),  0777)) < 0)
+    {
+        result = FAIL;
+    }
+    else if ((ShmLedModuleData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
+    {
+        result = FAIL;
+    }
+
     if ((MeterSMId = shmget(ShmPsuKey, sizeof(struct PsuData),  IPC_CREAT | 0777)) < 0)
     {
         result = FAIL;
@@ -212,8 +222,26 @@ int InitShareMemory()
     return result;
 }
 
+unsigned long GetTimeoutValue(struct timeval _sour_time)
+{
+    struct timeval _end_time;
+    gettimeofday(&_end_time, NULL);
+
+    return 1000000 * (_end_time.tv_sec - _sour_time.tv_sec) + _end_time.tv_usec - _sour_time.tv_usec;
+}
+
 void RunStatusProc(char *v1, char *v2)
 {
+    if (strcmp(v1, "ac") == 0)
+    {
+        if (!FindAcChargingInfoData(0, &ac_chargingInfo[0]))
+        {
+            printf("FindChargingInfoData (AC) false \n");
+        }
+        printf("AC Status = %d \n", ac_chargingInfo[0]->ConnectorPlugIn);
+        return;
+    }
+
     int _index = atoi(v1);
     if (_index <= 1)
     {
@@ -273,7 +301,9 @@ void RunCardProc(char *v1, char *v2)
     }
     else
     {
-        memcpy((char *)ShmSysConfigAndInfo->SysConfig.UserId, v1, ARRAY_SIZE(v1));
+        strcpy((char *)ShmSysConfigAndInfo->SysConfig.UserId, "");
+        memcpy((char *)ShmSysConfigAndInfo->SysConfig.UserId, v1, strlen(v1));
+        ShmSysConfigAndInfo->SysConfig.UserId[strlen(v1)] = '\0';
         printf("StartUserId = %s \n", ShmSysConfigAndInfo->SysConfig.UserId);
     }
 }
@@ -307,8 +337,12 @@ void GetGunLockStatusProc(char *v1, char *v2)
         printf("FindChargingInfoData error\n");
         return;
     }
+    if (strcmp(v2, "-1") != 0 && strcmp(v2, "") != 0)
+    {
+        _chargingData[_index]->GunLocked = atoi(v2);
+    }
 
-    printf("Gun Locked Status = %x \n", _chargingData[_index]->GunLocked);
+    printf("Gun Locked Status = %d \n", _chargingData[_index]->GunLocked);
 }
 
 void SetSystemIDProc()
@@ -328,17 +362,14 @@ void GetFwVerProc(char *v1)
     {
         printf("407 FW Version = %s \n", ShmPrimaryMcuData->version);
     }
-    else if (strcmp(v1, "0") == 0)
+    else if (strcmp(v1, "0") == 0 || strcmp(v1, "1") == 0)
     {
-        printf("Ev board 0 FW Version = %s \n", ShmCHAdeMOData->evse[0].version);
-    }
-    else if (strcmp(v1, "1") == 0)
-    {
-        printf("Ev board 1 FW Version = %s \n", ShmCcsData->V2GMessage_DIN70121->version);
-    }
-    else if (strcmp(v1, "2") == 0)
-    {
-        printf("Ev board 2 FW Version = %s \n", ShmGBTData->evse[0].version);
+        int _index = atoi(v1);
+
+        if (_index == 0)
+            printf("Gun 0 FW Version = %s \n", ShmSysConfigAndInfo->SysInfo.Connector1FwRev);
+        else if (_index == 1)
+            printf("Gun 1 FW Version = %s \n", ShmSysConfigAndInfo->SysInfo.Connector2FwRev);
     }
     else if (strcmp(v1, "rb") == 0)
     {
@@ -352,6 +383,10 @@ void GetFwVerProc(char *v1)
     {
         printf("DC Main Version = %s \n", ShmSysConfigAndInfo->SysInfo.CsuRootFsFwRev);
     }
+    else if (strcmp(v1, "led") == 0)
+    {
+        printf("LED Version = %s \n", ShmSysConfigAndInfo->SysInfo.LedModuleFwRev);
+    }
     else if (strcmp(v1, "ac") == 0)
     {
         if (!FindAcChargingInfoData(0, &ac_chargingInfo[0]))
@@ -370,6 +405,26 @@ void CreateOneError(char *v1)
     ShmSysConfigAndInfo->SysConfig.BillingData.isBilling = value;
 }
 
+void GetAuthorizeFlag(char *v1)
+{
+    if (strcmp(v1, "-1") == 0|| strcmp(v1, "") == 0)
+        printf("AuthorizeFlag = %d \n", ShmSysConfigAndInfo->SysInfo.AuthorizeFlag);
+    else
+        ShmSysConfigAndInfo->SysInfo.AuthorizeFlag = atoi(v1);
+}
+
+void GetOrClearId(char *v1)
+{
+    int _index = atoi(v1);
+
+    if (!FindChargingInfoData(_index, &_chargingData[0]))
+    {
+        printf("FindChargingInfoData error\n");
+        return;
+    }
+    printf("Card Number = %s \n", _chargingData[_index]->StartUserId);
+}
+
 void FwUpdateFlagProc()
 {
     ShmSysConfigAndInfo->SysInfo.FirmwareUpdate = 0x01;
@@ -409,12 +464,15 @@ void SetPowerValue(char *v1, char *v2)
         return;
     }
 
-    _chargingData[_index]->EvBatterytargetCurrent = _Current * 10;
+    _chargingData[_index]->EvBatterytargetCurrent = _Current;
 }
 
 void GetSystemInfo()
 {
     printf ("ModelName = %s \n", ShmSysConfigAndInfo->SysConfig.ModelName);
+    printf ("SerialNumber = %s \n", ShmSysConfigAndInfo->SysConfig.SerialNumber);
+    printf ("InternetConn = %d \n", ShmSysConfigAndInfo->SysInfo.InternetConn);
+
     printf ("MaxChargingPower = %d, MaxChargingCurrent = %d \n",
             ShmSysConfigAndInfo->SysConfig.MaxChargingPower,
             ShmSysConfigAndInfo->SysConfig.MaxChargingCurrent);
@@ -615,7 +673,6 @@ void RunUnconditionalChargeIndex1(char *v1, char *v2, char *v3)
 
     if(_Voltage > 1000 || _Voltage < 50)
     {
-
         printf ("Input Voltage over range\n");
         return;
     }
@@ -632,8 +689,8 @@ void RunUnconditionalChargeIndex1(char *v1, char *v2, char *v3)
     //kill ev task
     system("killall Module_EvComm");
 
-    _Voltage = (_Voltage * 10);
-    _Current = (_Current * 10);
+    //_Voltage = (_Voltage * 10);
+    //_Current = (_Current * 10);
 
     //system(STTY_US TTY_PATH);
 
@@ -699,7 +756,7 @@ void RunUnconditionalChargeIndex1(char *v1, char *v2, char *v3)
                     PreviousSystemStatus = _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus;
 
                     printf ("[UnconditionalCharge - S_PREPARING_FOR_EV]\n");
-                    printf ("ReqVoltage = %f, ReqCurrent = %f \n", _Voltage,_Current);
+                    printf ("ReqVoltage = %f, ReqCurrent = %f \n", _Voltage * 10,_Current * 10);
 
                 }
                 //清除 main timeout 機制
@@ -709,8 +766,8 @@ void RunUnconditionalChargeIndex1(char *v1, char *v2, char *v3)
 
                 //充電電壓電流
                 _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->EvBatterySoc = 50;
-                _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->EvBatterytargetVoltage = 5000;
-                _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->EvBatterytargetCurrent = 20;
+                _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->EvBatterytargetVoltage = 500;
+                _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->EvBatterytargetCurrent = 2;
                 _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->AvailableChargingCurrent = 1000;
 
                 //****** 注意~此行為是防止 K1K2 先開導到無法升壓 ( Relay Board 在此 state 還未搭上 K1K2 )
@@ -746,8 +803,8 @@ void RunUnconditionalChargeIndex1(char *v1, char *v2, char *v3)
 
                 //充電電壓電流
                 _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->EvBatterySoc = 50;
-                _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->EvBatterytargetVoltage = 5000;
-                _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->EvBatterytargetCurrent = 20;
+                _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->EvBatterytargetVoltage = 500;
+                _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->EvBatterytargetCurrent = 2;
                 _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->AvailableChargingCurrent = 1000;
 
                 //printf ("tar vol_ = %d \n", _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->EvBatterytargetVoltage);
@@ -796,12 +853,6 @@ void RunUnconditionalChargeIndex1(char *v1, char *v2, char *v3)
                      printf ("Charging Ground Fault check Fail (%d)\n",_chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->GroundFaultStatus);
                     _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus = S_TERMINATING;
                 }
-
-                if (_chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->GroundFaultStatus == 0x03){
-                     printf ("Charging Ground Fault Warning (%d)\n",_chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->GroundFaultStatus);
-                    _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus = S_TERMINATING;
-                }
-
             }
             break;
 
@@ -815,7 +866,6 @@ void RunUnconditionalChargeIndex1(char *v1, char *v2, char *v3)
                     printf ("[UnconditionalCharge - S_TERMINATING]\n");
                     //無阻塞偵測 keybaord 結束
                     system(STTY_DEF TTY_PATH);
-
                 }
 
                 sleep(3);
@@ -880,8 +930,8 @@ void RunUnconditionalChargeIndex1(char *v1, char *v2, char *v3)
                continue;
 
             printf("vol = %f, cur = %f \n", _vol, _cur);
-            _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->EvBatterytargetVoltage = _vol * 10;
-            _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->EvBatterytargetCurrent = _cur * 10;
+            _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->EvBatterytargetVoltage = _vol;
+            _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->EvBatterytargetCurrent = _cur;
         }
         else if (strcmp(newString[0], "c") == 0)
         {
@@ -1067,6 +1117,14 @@ int main(void)
         {
             CreateOneError(newString[1]);
         }
+        else if (strcmp(newString[0], "auth") == 0)
+        {
+            GetAuthorizeFlag(newString[1]);
+        }
+        else if (strcmp(newString[0], "id") == 0)
+        {
+            GetOrClearId(newString[1]);
+        }
         else if(strcmp(newString[0], "strchg") == 0)
         {
             //如果連一個參數都沒有 (此命令不理會) 加上判斷第二參數

+ 68 - 24
EVSE/Projects/DM30/Apps/internalComm.c

@@ -42,11 +42,33 @@ struct Address Addr={0x01,0x02,0x03,0x05,0x06,0xFF};
 struct Command Cmd={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x24,0x27,0x28,0x29,0x2C,0x81,0x83,
                     0x85,0x86,0x87,0x88,0x089,0x8A,0x8B,0x8C,0x90,0x93,0xe0,0xe1,0xe2,0xe3};
 
+int tranceiveRelDelayTime(int fd, unsigned char* cmd, unsigned char cmd_len, unsigned char* rx, unsigned short _delay)
+{
+    int len;
+    //sleep(2); //required to make flush work, for some reason
+    tcflush(fd,TCIOFLUSH);
+
+    if(write(fd, cmd, cmd_len) >= cmd_len)
+    {
+        usleep(_delay * 1000);
+        len = read(fd, rx, 512);
+    }
+    else
+    {
+        #ifdef SystemLogMessage
+        DEBUG_ERROR("Serial command %s response fail.\n", cmd);
+        #endif
+    }
+
+    return len;
+}
+
 int tranceive(int fd, unsigned char* cmd, unsigned char cmd_len, unsigned char* rx)
 {
     int len;
     //sleep(2); //required to make flush work, for some reason
     tcflush(fd,TCIOFLUSH);
+
     if(write(fd, cmd, cmd_len) >= cmd_len)
     {
         usleep(15000);
@@ -134,7 +156,7 @@ unsigned char Query_Present_InputVoltage(unsigned char fd, unsigned char targetA
     unsigned char chksum = 0x00;
     unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
 
-    if(len > 6)
+    if(len > 13)
     {
         if (len < 6+(rx[4] | rx[5]<<8))
             return result;
@@ -146,14 +168,24 @@ unsigned char Query_Present_InputVoltage(unsigned char fd, unsigned char targetA
         if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
            (rx[2] == tx[1]) &&
            (rx[1] == tx[2]) &&
-           (rx[3] == tx[3]))
+           (rx[3] == tx[3]) &&
+           chksum != 0)
         {
             Ret_Buf->inputType = rx[6];
             Ret_Buf->L1N_L12 =(rx[7] | (rx[8]<<8))/10.0;
             Ret_Buf->L2N_L23 =(rx[9] | (rx[10]<<8))/10.0;
             Ret_Buf->L3N_L31 =(rx[11] | (rx[12]<<8))/10.0;
 
-            result = PASS;
+            if(Ret_Buf->L1N_L12 >= 320 ||
+               Ret_Buf->L2N_L23 >= 320 ||
+               Ret_Buf->L3N_L31 >= 320)
+            {
+                result = FAIL;
+            }
+            else
+            {
+                result = PASS;
+            }
         }
     }
 
@@ -496,7 +528,8 @@ unsigned char Config_Fan_Speed(unsigned char fd, unsigned char targetAddr, FanSp
         if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
            (rx[2] == tx[1]) &&
            (rx[1] == tx[2]) &&
-           (rx[3] == tx[3]))
+           (rx[3] == tx[3]) &&
+           rx[6] == PASS)
         {
             result = PASS;
         }
@@ -539,7 +572,7 @@ unsigned char Config_Relay_Output(unsigned char fd, unsigned char targetAddr, Re
            (rx[2] == tx[1]) &&
            (rx[1] == tx[2]) &&
            (rx[3] == tx[3]) &&
-           (rx[6] == 0x01))
+           rx[6] == PASS)
         {
             result = PASS;
         }
@@ -664,7 +697,8 @@ unsigned char Config_Model_Name(unsigned char fd, unsigned char targetAddr, unsi
         if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
               (rx[2] == tx[1]) &&
               (rx[1] == tx[2]) &&
-              (rx[3] == tx[3]))
+              (rx[3] == tx[3]) &&
+              rx[6] == PASS)
         {
             result = PASS;
         }
@@ -697,7 +731,8 @@ unsigned char Config_Rtc_Data(unsigned char fd, unsigned char targetAddr, Rtc *S
         if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
                 (rx[2] == tx[1]) &&
                 (rx[1] == tx[2]) &&
-                (rx[3] == tx[3]))
+                (rx[3] == tx[3]) &&
+                rx[6] == PASS)
         {
             result = PASS;
         }
@@ -858,7 +893,7 @@ unsigned char Query_AC_Status(unsigned char fd, unsigned char targetAddr, Ac_Sta
     unsigned char tx[7] = {0xaa, 0x00, targetAddr, Cmd.query_ac_status, 0x00, 0x00, 0x00};
     unsigned char rx[512];
     unsigned char chksum = 0x00;
-    unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
+    unsigned char len = tranceiveRelDelayTime(fd, tx, sizeof(tx), rx, 100);
 
     if(len > 6)
     {
@@ -918,7 +953,7 @@ unsigned char Query_AC_Alarm_Code(unsigned char fd, unsigned char targetAddr, Ac
     unsigned char tx[7] = {0xaa, 0x00, targetAddr, Cmd.query_ac_alarm_code, 0x00, 0x00};
     unsigned char rx[512];
     unsigned char chksum = 0x00;
-    unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
+    unsigned char len = tranceiveRelDelayTime(fd, tx, sizeof(tx), rx, 100);
 
     if(len > 6)
     {
@@ -949,7 +984,7 @@ unsigned char Query_Charging_Energy(unsigned char fd, unsigned char targetAddr,
     unsigned char tx[7] = {0xaa, 0x00, targetAddr, Cmd.query_ac_output_energy, 0x00, 0x00,0x00};
     unsigned char rx[512];
     unsigned char chksum = 0x00;
-    unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
+    unsigned char len = tranceiveRelDelayTime(fd, tx, sizeof(tx), rx, 100);
 
     if(len > 6)
     {
@@ -980,7 +1015,7 @@ unsigned char Query_Charging_Current(unsigned char fd, unsigned char targetAddr,
     unsigned char tx[7] = {0xaa, 0x00, targetAddr, Cmd.query_ac_output_current, 0x00, 0x00, 0x00};
     unsigned char rx[512];
     unsigned char chksum = 0x00;
-    unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
+    unsigned char len = tranceiveRelDelayTime(fd, tx, sizeof(tx), rx, 100);
 
     if(len > 6)
     {
@@ -1019,7 +1054,7 @@ unsigned char Config_LED_Status(unsigned char fd, unsigned char targetAddr, Ac_L
         chksum ^= tx[6 + idx];
     tx[11] = chksum;
 
-    if (tranceive(fd, tx, sizeof(tx), rx) > 0)
+    if (tranceiveRelDelayTime(fd, tx, sizeof(tx), rx, 100) > 0)
     {
         chksum = 0x00;
         for (int idx = 0; idx < (rx[4] | rx[5] << 8); idx++)
@@ -1030,7 +1065,8 @@ unsigned char Config_LED_Status(unsigned char fd, unsigned char targetAddr, Ac_L
         if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
             (rx[2] == tx[1]) &&
             (rx[1] == tx[2]) &&
-            (rx[3] == tx[3]))
+            (rx[3] == tx[3]) &&
+            rx[6] == PASS)
         {
             result = PASS;
         }
@@ -1050,7 +1086,7 @@ unsigned char Config_Legacy_Req(unsigned char fd, unsigned char targetAddr, unsi
         chksum ^= tx[6 + idx];
     tx[8] = chksum;
 
-    if (tranceive(fd, tx, sizeof(tx), rx) > 0)
+    if (tranceiveRelDelayTime(fd, tx, sizeof(tx), rx, 100) > 0)
     {
         chksum = 0x00;
         for (int idx = 0; idx < (rx[4] | rx[5] << 8); idx++)
@@ -1061,7 +1097,8 @@ unsigned char Config_Legacy_Req(unsigned char fd, unsigned char targetAddr, unsi
         if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
            (rx[2] == tx[1]) &&
            (rx[1] == tx[2]) &&
-           (rx[3] == tx[3]))
+           (rx[3] == tx[3]) &&
+           rx[6] == PASS)
         {
             result = PASS;
         }
@@ -1081,7 +1118,7 @@ unsigned char Config_Ac_Duty(unsigned char fd, unsigned char targetAddr, unsigne
         chksum ^= tx[6 + idx];
     tx[7] = chksum;
 
-    if (tranceive(fd, tx, sizeof(tx), rx) > 0)
+    if (tranceiveRelDelayTime(fd, tx, sizeof(tx), rx, 100) > 0)
     {
         chksum = 0x00;
         for (int idx = 0; idx < (rx[4] | rx[5] << 8); idx++)
@@ -1092,7 +1129,8 @@ unsigned char Config_Ac_Duty(unsigned char fd, unsigned char targetAddr, unsigne
         if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
            (rx[2] == tx[1]) &&
            (rx[1] == tx[2]) &&
-           (rx[3] == tx[3]))
+           (rx[3] == tx[3]) &&
+           rx[6] == PASS)
         {
             result = PASS;
         }
@@ -1112,7 +1150,7 @@ unsigned char Config_CSU_Mode(unsigned char fd, unsigned char targetAddr)
         chksum ^= tx[6 + idx];
     tx[7] = chksum;
 
-    if (tranceive(fd, tx, sizeof(tx), rx) > 0)
+    if (tranceiveRelDelayTime(fd, tx, sizeof(tx), rx, 100) > 0)
     {
         chksum = 0x00;
         for (int idx = 0; idx < (rx[4] | rx[5] << 8); idx++)
@@ -1123,7 +1161,8 @@ unsigned char Config_CSU_Mode(unsigned char fd, unsigned char targetAddr)
         if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
            (rx[2] == tx[1]) &&
            (rx[1] == tx[2]) &&
-           (rx[3] == tx[3]))
+           (rx[3] == tx[3]) &&
+           rx[6] == PASS)
         {
             result = PASS;
         }
@@ -1143,7 +1182,7 @@ unsigned char Config_Reset_MCU(unsigned char fd, unsigned char targetAddr)
         chksum ^= tx[6 + idx];
     tx[7] = chksum;
 
-    if (tranceive(fd, tx, sizeof(tx), rx) > 0)
+    if (tranceiveRelDelayTime(fd, tx, sizeof(tx), rx, 100) > 0)
     {
         chksum = 0x00;
         for (int idx = 0; idx < (rx[4] | rx[5] << 8); idx++)
@@ -1154,7 +1193,8 @@ unsigned char Config_Reset_MCU(unsigned char fd, unsigned char targetAddr)
         if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
            (rx[2] == tx[1]) &&
            (rx[1] == tx[2]) &&
-           (rx[3] == tx[3]))
+           (rx[3] == tx[3]) &&
+           rx[6] == PASS)
         {
             result = PASS;
         }
@@ -1176,9 +1216,13 @@ unsigned char Config_Led_Color(unsigned char fd, unsigned char targetAddr, Led_C
         chksum ^= tx[6 + idx];
     tx[13] = chksum;
 
-    if (tranceive(fd, tx, sizeof(tx), rx) > 0)
+    unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
+
+    if(len > 6)
     {
-        chksum = 0x00;
+        if (len < 6+(rx[4] | rx[5]<<8))
+            return result;
+
         for (int idx = 0; idx < (rx[4] | rx[5] << 8); idx++)
         {
             chksum ^= rx[6 + idx];
@@ -1188,7 +1232,7 @@ unsigned char Config_Led_Color(unsigned char fd, unsigned char targetAddr, Led_C
                 (rx[2] == tx[1]) &&
                 (rx[1] == tx[2]) &&
                 (rx[3] == tx[3]) &&
-                rx[6] == PASS)
+                (rx[6] == PASS))
         {
             result = PASS;
         }

+ 1 - 0
EVSE/Projects/DM30/Apps/kill.sh

@@ -8,4 +8,5 @@ pkill Module_PsuComm
 pkill Module_4g
 pkill Module_Wifi
 pkill OcppBackend
+pkill Module_ProduceUtils
 pkill main

文件差異過大導致無法顯示
+ 573 - 48
EVSE/Projects/DM30/Apps/main.c


+ 10 - 1
EVSE/Projects/DM30/Apps/timeout.h

@@ -32,6 +32,8 @@
 #include <ctype.h>
 #include <ifaddrs.h>
 
+#define CONN_PLUG_TIME_OUT          40
+
 enum Timeout_flag
 {
     Timeout_None =                      0,
@@ -46,7 +48,14 @@ enum Timeout_flag
     Timeout_EvseChargingDet =           8,
     Timeout_EvseCompleteDet =           9,
     Timeout_ForCcsPrechargeDet =        10,
-    Timeout_ReturnToChargingGunDet =    11
+    Timeout_ReturnToChargingGunDet =    11,
+    Timeout_AuthorizingForStop =        12
 };
 
+// for timeout fork
+struct timeval _cmdSubPriority_time;
+unsigned short _connectionTimeout;
+
+// for main
+struct timeval _cmdMainPriority_time;
 #endif /* TIMEOUT_H_ */

二進制
EVSE/Projects/DM30/Images/FactoryDefaultConfig.bin


二進制
EVSE/Projects/DM30/Images/MLO


二進制
EVSE/Projects/DM30/Images/ramdisk.gz


二進制
EVSE/Projects/DM30/Images/u-boot.img


二進制
EVSE/Projects/DM30/Images/zImage


+ 8 - 0
EVSE/Projects/DW30/Apps/Config.h

@@ -166,4 +166,12 @@ enum _CHARGER_TYPE
     _CHARGER_TYPE_UL                    = 1,
 };
 
+enum _SYS_WIFI_MODE
+{
+    _SYS_WIFI_MODE_DISABLE              = 0,
+    _SYS_WIFI_MODE_STATION              = 1,
+    _SYS_WIFI_MODE_AP                   = 2,
+    _SYS_WIFI_MODE_ADHOC                = 3,
+};
+
 #endif /* CONFIG_H_ */

+ 3 - 1
EVSE/Projects/DW30/Apps/FactoryConfig.c

@@ -148,7 +148,7 @@ int main(int argc,char *argv[])
     strcpy((char *) SysConfig.Eth1Interface.EthIpAddress, "192.168.0.10");
     strcpy((char *) SysConfig.Eth1Interface.EthSubmaskAddress, "255.255.255.0");
     strcpy((char *) SysConfig.Eth1Interface.EthGatewayAddress, "192.168.0.254");
-    SysConfig.AthInterface.WifiMode = 0;
+    SysConfig.AthInterface.WifiMode = _SYS_WIFI_MODE_AP;
     strcpy((char *) SysConfig.AthInterface.WifiSsid, "");
     strcpy((char *) SysConfig.AthInterface.WifiPassword, "");
     SysConfig.AthInterface.WifiRssi = 0;
@@ -179,6 +179,8 @@ int main(int argc,char *argv[])
     SysConfig.OfflinePolicy = OFF_POLICY_FREE;
     SysConfig.OfflineMaxChargeEnergy = 0;
     SysConfig.OfflineMaxChargeDuration = 0;
+    //strcpy((char *) SysConfig.OcppServerURL, "ws://test.evsocket.phihong.com.cn:2012/");
+    //strcpy((char *) SysConfig.ChargeBoxId, "DemoDC");
     strcpy((char *) SysConfig.OcppServerURL, "");
     strcpy((char *) SysConfig.ChargeBoxId, "");
 

+ 3 - 2
EVSE/Projects/DW30/Apps/Makefile

@@ -3,6 +3,7 @@ export PATH=/bin:/sbin:/usr/bin:$(SDK_PATH_TARGET)/usr/bin:$PATH
 
 #define library variable
 Internal485ProtocolLib = -L ../../../Modularization/Internal485Protocol -lInternal485Protocol
+Lib_SQLite3 = "-L../../../Modularization/ocppfiles" -lsqlite3
 
 all: CreateOutputFolder BuildFactorys BuildApps CopyExecuteFiles Clean
 
@@ -11,9 +12,9 @@ BuildFactorys: FactoryConfigBin
 BuildApps: MainTask EvCommTask EventLoggingTask InternalCommTask LcmControlTask PrimaryCommTask PsuCommTask ReadCmdlineTask FactoryConfigApp
 
 MainTask:
-	$(CC) -D $(Project) -D DEBUG_OPTION=$(Project_Debug_Option) -include../../../Modularization/Module_RFID.h -include../../../Modularization/Module_Upgrade.h -O0 -g3 -Wall -c -fmessage-length=0 -o main.o main.c
+	$(CC) -D $(Project) -D DEBUG_OPTION=$(Project_Debug_Option) -include../../../Modularization/ocppfiles/sqlite3.h -include../../../Modularization/Module_RFID.h -include../../../Modularization/Module_Upgrade.h -O0 -g3 -Wall -c -fmessage-length=0 -o main.o main.c
 	$(CC) -D $(Project) -D DEBUG_OPTION=$(Project_Debug_Option) -O0 -g3 -Wall -c -fmessage-length=0 -o timeout.o timeout.c
-	$(CC) -o main main.o timeout.o ../../../Modularization/libModule_RFID.a ../../../Modularization/libModule_Upgrade.a
+	$(CC) -o main main.o timeout.o ../../../Modularization/libModule_RFID.a ../../../Modularization/libModule_Upgrade.a ${Lib_SQLite3}
 
 EvCommTask:
 	$(CC) -D $(Project) -D DEBUG_OPTION=$(Project_Debug_Option) -includeConfig.h -O0 -g3 -Wall -c -fmessage-length=0 -o Ev_Comm.o Ev_Comm.c

+ 147 - 77
EVSE/Projects/DW30/Apps/Module_EvComm.c

@@ -55,9 +55,15 @@ float _cur_1 = 0;
 float _pow_2 = 0;
 float _cur_2 = 0;
 
+float _outVol_1 = 0;
+float _outCur_1 = 0;
+float _outVol_2 = 0;
+float _outCur_2 = 0;
+
 // 限制最大充電電壓,因應不同 type 槍線來限制
-// Chademo : 500V, GB : 750, CCS : 950V
-//TODO: change maximum charging voltage by connector type
+// Chademo : 500V, 125A,
+// GB : 750, 120A
+// CCS : 950V, 120A
 float maxChargingVol[2] = { 9500, 9500 };           // 限制最大充電電壓,如依照模塊則填上 0
 // 限制最大充電電流與能量透過 Web
 float maxChargingCur[2] = { 600, 600 };             // 限制最大充電電流,如依照模塊則填上 0
@@ -94,7 +100,7 @@ unsigned char mask_table[] = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 };
 void PRINTF_FUNC(char *string, ...);
 
 void GetMaxVolAndCurMethod(byte index, float *vol, float *cur);
-void GetMaxPowerMethod(float *pow);
+void GetMaxPowerMethod(byte index, float *pow);
 unsigned long GetTimeoutValue(struct timeval _sour_time);
 
 #define DEBUG_INFO(format, args...) StoreLogMsg("[%s:%d][%s][Info] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
@@ -126,11 +132,20 @@ int StoreLogMsg(const char *fmt, ...)
     SeqEndTime.time = time(NULL);
     tm=localtime(&SeqEndTime.time);
 
-    sprintf(Buf,"echo \"%04d-%02d-%02d %02d:%02d:%02d.%03d - %s\" >> /Storage/SystemLog/[%04d.%02d]SystemLog",
-            tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,SeqEndTime.millitm,
-            buffer,
-            tm->tm_year+1900,tm->tm_mon+1);
-    system(Buf);
+    if (ShmSysConfigAndInfo->SysConfig.SwitchDebugFlag == YES)
+    {
+        sprintf(Buf,"%02d:%02d:%02d.%03d - %s",
+                tm->tm_hour,tm->tm_min,tm->tm_sec,SeqEndTime.millitm, buffer);
+        printf("%s \n", Buf);
+    }
+    else
+    {
+        sprintf(Buf,"echo \"%04d-%02d-%02d %02d:%02d:%02d.%03d - %s\" >> /Storage/SystemLog/[%04d.%02d]SystemLog",
+                tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,SeqEndTime.millitm,
+                buffer,
+                tm->tm_year+1900,tm->tm_mon+1);
+        system(Buf);
+    }
 
     return rc;
 }
@@ -153,10 +168,7 @@ void PRINTF_FUNC(char *string, ...)
     vsnprintf(buffer, sizeof(buffer), string, args);
     va_end(args);
 
-    if (ShmSysConfigAndInfo->SysConfig.SwitchDebugFlag == YES)
-        printf("%s \n", buffer);
-    else
-        DEBUG_INFO("%s \n", buffer);
+    DEBUG_INFO("%s \n", buffer);
 }
 
 //=================================
@@ -1927,6 +1939,13 @@ void ClearAbnormalStatus_CCS(byte gun_index)
         memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
         isCleanCheck = true;
     }
+    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023850", 6) == EQUAL &&
+            ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsSeccTimeoutV2GPreChargePerformaceTime == YES)
+    {
+        memcpy(code, "023850", 6);
+        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
+        isCleanCheck = true;
+    }
     else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023855", 6) == EQUAL &&
              ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTP_GET_EV_TARGET_INFO == YES)
     {
@@ -2179,6 +2198,20 @@ void ClearAbnormalStatus_CCS(byte gun_index)
         memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
         isCleanCheck = true;
     }
+    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023891", 6) == EQUAL &&
+            ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsSeccNotReadyForCharging == YES)
+    {
+        memcpy(code, "023891", 6);
+        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
+        isCleanCheck = true;
+    }
+    else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023892", 6) == EQUAL &&
+            ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsSeccTimeoutQCA7000Comm == YES)
+    {
+        memcpy(code, "023892", 6);
+        memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
+        isCleanCheck = true;
+    }
 
     if (isCleanCheck)
     {
@@ -2288,6 +2321,7 @@ void ClearAbnormalStatus_CCS(byte gun_index)
                     if (strncmp(code, "023847", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCableCheck_Performance_Time = NO;
                     if (strncmp(code, "023848", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCPState_Detection_Time = NO;
                     if (strncmp(code, "023849", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCPOscillator_Retain_Time = NO;
+                    if (strncmp(code, "023850", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsSeccTimeoutV2GPreChargePerformaceTime = NO;
                     if (strncmp(code, "023855", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTP_GET_EV_TARGET_INFO = NO;
                     if (strncmp(code, "023856", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTT_GET_EV_TARGET_INFO = NO;
                     if (strncmp(code, "023857", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTP_GET_EV_BATTERY_INFO = NO;
@@ -2324,6 +2358,8 @@ void ClearAbnormalStatus_CCS(byte gun_index)
                     if (strncmp(code, "023888", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsISO2_Msg_Encode_Error = NO;
                     if (strncmp(code, "023889", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCpStatus_Error = NO;
                     if (strncmp(code, "023890", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsUnexpectVolBeforeCharing_Error = NO;
+                    if (strncmp(code, "023891", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsSeccNotReadyForCharging = NO;
+                    if (strncmp(code, "023892", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsSeccTimeoutQCA7000Comm = NO;
                 }
             }
         }
@@ -2336,7 +2372,7 @@ void AbnormalStopAnalysis(byte gun_index, byte *errCode)
     sprintf(string, "%d%d%d%d%d%d", *(errCode + 0), *(errCode + 1), *(errCode + 2), *(errCode + 3), *(errCode + 4), *(errCode + 5));
 
     PRINTF_FUNC("NOTIFICATION_EV_STOP : Err Code = %s \n", string);
-    if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "000000", 6) == EQUAL ||
+    if (strncmp(string, "000000", 6) == EQUAL ||
         strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "", 6) != EQUAL)
         return;
 
@@ -2477,6 +2513,7 @@ void AbnormalStopAnalysis(byte gun_index, byte *errCode)
     if (strcmp(string, "023847") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCableCheck_Performance_Time = YES;
     if (strcmp(string, "023848") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCPState_Detection_Time = YES;
     if (strcmp(string, "023849") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCPOscillator_Retain_Time = YES;
+    if (strcmp(string, "023850") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsSeccTimeoutV2GPreChargePerformaceTime = YES;
     if (strcmp(string, "023855") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTP_GET_EV_TARGET_INFO = YES;
     if (strcmp(string, "023856") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTT_GET_EV_TARGET_INFO = YES;
     if (strcmp(string, "023857") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsTP_GET_EV_BATTERY_INFO = YES;
@@ -2513,6 +2550,8 @@ void AbnormalStopAnalysis(byte gun_index, byte *errCode)
     if (strcmp(string, "023888") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsISO2_Msg_Encode_Error = YES;
     if (strcmp(string, "023889") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsCpStatus_Error = YES;
     if (strcmp(string, "023890") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsUnexpectVolBeforeCharing_Error = YES;
+    if (strcmp(string, "023891") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsSeccNotReadyForCharging = YES;
+    if (strcmp(string, "023892") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsSeccTimeoutQCA7000Comm = YES;
 
     if (strcmp(string, "023702") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.GbEvCommFail = YES;
     if (strcmp(string, "023900") == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_GBT_LOS_CC1 = YES;
@@ -2679,15 +2718,20 @@ void CANReceiver()
                         break;
                     case ACK_EV_FW_VERSION:
                     {
+                        byte ver[16];
+
+                        memset(ver, 0, sizeof(ver));
                         if (_chargingData[targetGun]->Type == _Type_Chademo)
                         {
-                            memcpy(ShmCHAdeMOData->evse[_chargingData[targetGun]->type_index].version, frame.data, frame.can_dlc);
+                            memcpy(ver, frame.data, frame.can_dlc);
+                            memcpy(ShmCHAdeMOData->evse[_chargingData[targetGun]->type_index].version, ver, ARRAY_SIZE(ver));
                             ShmCHAdeMOData->evse[_chargingData[targetGun]->type_index].SelfTest_Comp = PASS;
                             PRINTF_FUNC("chademo ver. : %s\n", ShmCHAdeMOData->evse[_chargingData[targetGun]->type_index].version);
                         }
                         else if (_chargingData[targetGun]->Type == _Type_GB)
                         {
-                            memcpy(ShmGBTData->evse[_chargingData[targetGun]->type_index].version, frame.data, ARRAY_SIZE(frame.data));
+                            memcpy(ver, frame.data, frame.can_dlc);
+                            memcpy(ShmGBTData->evse[_chargingData[targetGun]->type_index].version, ver, ARRAY_SIZE(ver));
                             ShmGBTData->evse[_chargingData[targetGun]->type_index].SelfTest_Comp = PASS;
                             PRINTF_FUNC("gbt ver. : %s\n", ShmGBTData->evse[_chargingData[targetGun]->type_index].version);
                         }
@@ -2695,7 +2739,18 @@ void CANReceiver()
                         {
                             if (ShmCcsData->CommProtocol == 0x01)
                             {
-                                memcpy(&ShmCcsData->V2GMessage_DIN70121[_chargingData[targetGun]->type_index].version, frame.data, frame.can_dlc);
+                                for (byte _vCount = 0, _vPoint = 0; _vCount < frame.can_dlc; _vCount++)
+                                {
+                                    if (_vCount % 2 == 0 && _vCount != 0)
+                                    {
+                                        ver[_vCount + _vPoint] = 0x2E;
+                                        _vPoint++;
+                                    }
+
+                                    ver[_vCount + _vPoint] = frame.data[_vCount];
+                                }
+
+                                memcpy(&ShmCcsData->V2GMessage_DIN70121[_chargingData[targetGun]->type_index].version, ver, ARRAY_SIZE(ver));
                                 ShmCcsData->V2GMessage_DIN70121[_chargingData[targetGun]->type_index].SelfTest_Comp = PASS;
                                 PRINTF_FUNC("CCS FW = %s \n", ShmCcsData->V2GMessage_DIN70121[_chargingData[targetGun]->type_index].version);
                             }
@@ -2704,12 +2759,12 @@ void CANReceiver()
                         if (targetGun == 0)
                         {
                             memset(ShmSysConfigAndInfo->SysInfo.Connector1FwRev, 0, sizeof(ShmSysConfigAndInfo->SysInfo.Connector1FwRev));
-                            memcpy(ShmSysConfigAndInfo->SysInfo.Connector1FwRev, frame.data, frame.can_dlc);
+                            memcpy(ShmSysConfigAndInfo->SysInfo.Connector1FwRev, ver, ARRAY_SIZE(ver));
                         }
                         else
                         {
                             memset(ShmSysConfigAndInfo->SysInfo.Connector2FwRev, 0, sizeof(ShmSysConfigAndInfo->SysInfo.Connector2FwRev));
-                            memcpy(ShmSysConfigAndInfo->SysInfo.Connector2FwRev, frame.data, frame.can_dlc);
+                            memcpy(ShmSysConfigAndInfo->SysInfo.Connector2FwRev, ver, ARRAY_SIZE(ver));
                         }
                     }
                         break;
@@ -2721,33 +2776,25 @@ void CANReceiver()
                     case ACK_GET_OUTPUT_REQ:
                     {
                         _chargingData[targetGun]->EvBatterySoc = frame.data[1];
-                        _chargingData[targetGun]->EvBatterytargetVoltage = ((short) frame.data[3] << 8) + (short) frame.data[2];
-                        _chargingData[targetGun]->EvBatterytargetCurrent = ((short) frame.data[5] << 8) + (short) frame.data[4];
-                        _chargingData[targetGun]->PresentChargedDuration = ((short) frame.data[7] << 8) + (short) frame.data[6];
+                        _chargingData[targetGun]->EvBatterytargetVoltage = (((short) frame.data[3] << 8) + (short) frame.data[2]) / 10;
+                        _chargingData[targetGun]->EvBatterytargetCurrent = (((short) frame.data[5] << 8) + (short) frame.data[4]) / 10;
+                        _chargingData[targetGun]->RemainChargingDuration = ((short) frame.data[7] << 8) + (short) frame.data[6];
 
                         if (_chargingData[targetGun]->Type == _Type_Chademo)
                         {
-                            if (ShmCHAdeMOData->ev[_chargingData[targetGun]->type_index].EvDetection != frame.data[0])
-                            {
-                                ShmCHAdeMOData->ev[_chargingData[targetGun]->type_index].PresentMsgFlowStatus = frame.data[0];
-                            }
-
+                            ShmCHAdeMOData->ev[_chargingData[targetGun]->type_index].PresentMsgFlowStatus = frame.data[0];
                             ShmCHAdeMOData->ev[_chargingData[targetGun]->type_index].EvDetection = frame.data[0];
                             ShmCHAdeMOData->ev[_chargingData[targetGun]->type_index].SOC = _chargingData[targetGun]->EvBatterySoc;
-                            ShmCHAdeMOData->ev[_chargingData[targetGun]->type_index].TargetBatteryVoltage = _chargingData[targetGun]->EvBatterytargetVoltage;
-                            ShmCHAdeMOData->ev[_chargingData[targetGun]->type_index].ChargingCurrentRequest = _chargingData[targetGun]->EvBatterytargetCurrent;
+                            ShmCHAdeMOData->ev[_chargingData[targetGun]->type_index].TargetBatteryVoltage = (_chargingData[targetGun]->EvBatterytargetVoltage * 10);
+                            ShmCHAdeMOData->ev[_chargingData[targetGun]->type_index].ChargingCurrentRequest = (_chargingData[targetGun]->EvBatterytargetCurrent * 10);
                         }
                         else if (_chargingData[targetGun]->Type == _Type_GB)
                         {
-                            if (ShmGBTData->ev[_chargingData[targetGun]->type_index].EvDetection != frame.data[0])
-                            {
-                                ShmGBTData->ev[_chargingData[targetGun]->type_index].PresentMsgFlowStatus = frame.data[0];
-                            }
-
+                            ShmGBTData->ev[_chargingData[targetGun]->type_index].PresentMsgFlowStatus = frame.data[0];
                             ShmGBTData->ev[_chargingData[targetGun]->type_index].EvDetection = frame.data[0];
                             ShmGBTData->ev[_chargingData[targetGun]->type_index].SOC = _chargingData[targetGun]->EvBatterySoc;
-                            ShmGBTData->ev[_chargingData[targetGun]->type_index].TargetBatteryVoltage = _chargingData[targetGun]->EvBatterytargetVoltage;
-                            ShmGBTData->ev[_chargingData[targetGun]->type_index].ChargingCurrentRequest = _chargingData[targetGun]->EvBatterytargetCurrent;
+                            ShmGBTData->ev[_chargingData[targetGun]->type_index].TargetBatteryVoltage = (_chargingData[targetGun]->EvBatterytargetVoltage * 10);
+                            ShmGBTData->ev[_chargingData[targetGun]->type_index].ChargingCurrentRequest = (_chargingData[targetGun]->EvBatterytargetCurrent * 10);
                         }
                         else if (_chargingData[targetGun]->Type == _Type_CCS_2)
                         {
@@ -2767,7 +2814,7 @@ void CANReceiver()
                     {
                         //_chargingData[target].EvACorDCcharging = frame.data[0];
                         //_chargingData[target]->TotalBatteryCap = ((float) frame.data[4] << 8) + (short) frame.data[3];
-                        _chargingData[targetGun]->EvBatteryMaxVoltage = ((short) frame.data[4] << 8) + (short) frame.data[3];
+                        _chargingData[targetGun]->EvBatteryMaxVoltage = (((short) frame.data[4] << 8) + (short) frame.data[3]) / 10;
                         //_chargingData[target]->EvBatteryMaxCurrent = ((float) frame.data[4] << 8) + (short) frame.data[3];
                         //_chargingData[target].MaxiBatteryCurrent = ((short) frame.data[6] << 8) + (short) frame.data[5];
                         if (_chargingData[targetGun]->Type == _Type_Chademo)
@@ -2792,30 +2839,27 @@ void CANReceiver()
                         break;
                     case ACK_GET_MISCELLANEOUS_INFO:
                     {
+                        _chargingData[targetGun]->GunLocked = frame.data[0];
+                        _chargingData[targetGun]->PilotVoltage = (float)(-120 + frame.data[3]) / 10;
+
                         if (_chargingData[targetGun]->Type == _Type_Chademo)
                         {
-                            _chargingData[targetGun]->GunLocked = frame.data[0];
                             ShmCHAdeMOData->evse[_chargingData[targetGun]->type_index].ConnectorTemperatureP = frame.data[1];
                             ShmCHAdeMOData->evse[_chargingData[targetGun]->type_index].ConnectorTemperatureN = frame.data[2];
-                            _chargingData[targetGun]->PilotVoltage = (float)(-120 + frame.data[3]) / 10;
                             ShmCHAdeMOData->evse[_chargingData[targetGun]->type_index].EvboardStatus = frame.data[7];
                         }
                         else if (_chargingData[targetGun]->Type == _Type_GB)
                         {
-                            _chargingData[targetGun]->GunLocked = frame.data[0];
                             ShmGBTData->evse[_chargingData[targetGun]->type_index].ConnectorTemperatureP = frame.data[1];
                             ShmGBTData->evse[_chargingData[targetGun]->type_index].ConnectorTemperatureN = frame.data[2];
-                            _chargingData[targetGun]->PilotVoltage = (float)(-120 + frame.data[3]) / 10;
                             ShmGBTData->evse[_chargingData[targetGun]->type_index].EvboardStatus = frame.data[7];
                         }
                         else if (_chargingData[targetGun]->Type == _Type_CCS_2)
                         {
                             if (ShmCcsData->CommProtocol == 0x01)
                             {
-                                _chargingData[targetGun]->GunLocked = frame.data[0];
                                 //ShmCcsData->V2GMessage_DIN70121[_chargingData[targetGun]->type_index]. .ConnectorTemperatureP = frame.data[1];
                                 //ShmCcsData->V2GMessage_DIN70121[_chargingData[targetGun]->type_index]. .ConnectorTemperatureN = frame.data[2];
-                                _chargingData[targetGun]->PilotVoltage = (float)(-120 + frame.data[3]) / 10;
                             }
                         }
 
@@ -2874,17 +2918,23 @@ void SetPresentChargingOutputPower(struct ChargingInfoData *chargingData_1, stru
     float vol1 = 0, cur1 = 0;
     float vol2 = 0, cur2 = 0;
 
-    //PRINTF_FUNC("f vol - 0 = %f \n", chargingData_1->FireChargingVoltage);
-    //PRINTF_FUNC("f cur - 0 = %f \n", chargingData_1->PresentChargingCurrent);
-    //PRINTF_FUNC("***********************f vol - 1 = %f \n", chargingData_2->FireChargingVoltage);
-    //PRINTF_FUNC("***********************f cur - 1 = %f \n", chargingData_2->PresentChargingCurrent);
-
     vol1 = chargingData_1->FireChargingVoltage;
     cur1 = (chargingData_1->PresentChargingCurrent * 10);
 
     vol2 = chargingData_2->FireChargingVoltage;
     cur2 = (chargingData_2->PresentChargingCurrent * 10);
 
+    if (_outVol_1 != vol1 ||
+        _outCur_1 != cur1 ||
+        _outVol_2 != vol2 ||
+        _outCur_2 != cur2)
+    {
+        PRINTF_FUNC("G1 -> Output Vol = %f, Output Cur = %f -- G2 -> Output Vol = %f, Output Cur = %f \n",
+            vol1, cur1, vol2, cur2);
+
+        _outVol_1 = vol1; _outCur_1 = cur1; _outVol_2 = vol2; _outCur_2 = cur2;
+    }
+
     SetPresentOutputPower(vol1, cur1, vol2, cur2);
 }
 
@@ -2899,14 +2949,14 @@ void SetPresentChargingOutputCap(struct ChargingInfoData *chargingData_1, struct
 
     vol = chargingData_1->MaximumChargingVoltage;
     GetMaxVolAndCurMethod(chargingData_1->Index, &vol, &cur1);
-    GetMaxPowerMethod(&pow1);
+    GetMaxPowerMethod(chargingData_1->Index, &pow1);
 
     pow2 = chargingData_2->AvailableChargingPower;
     cur2 = chargingData_2->AvailableChargingCurrent;
     vol = chargingData_2->MaximumChargingVoltage;
 
     GetMaxVolAndCurMethod(chargingData_2->Index, &vol, &cur2);
-    GetMaxPowerMethod(&pow2);
+    GetMaxPowerMethod(chargingData_2->Index, &pow2);
 
     if (_pow_1 != pow1 ||
         _cur_1 != cur1 ||
@@ -2954,12 +3004,26 @@ void GetMaxVolAndCurMethod(byte index, float *vol, float *cur)
 
     if (maxChargingCur[index] != 0 && maxChargingCur[index] <= *cur)
         *cur = maxChargingCur[index];
+
+    if (_chargingData[index]->SystemStatus == S_CHARGING &&
+        _chargingData[index]->ChargingProfileCurrent >= 0 &&
+        _chargingData[index]->ChargingProfileCurrent <= *cur)
+    {
+        *cur = _chargingData[index]->ChargingProfileCurrent;
+    }
 }
 
-void GetMaxPowerMethod(float *pow)
+void GetMaxPowerMethod(byte index, float *pow)
 {
     if (maxChargingPow != 0 && maxChargingPow <= *pow)
         *pow = maxChargingPow;
+
+    if (_chargingData[index]->SystemStatus == S_CHARGING &&
+        _chargingData[index]->ChargingProfilePower >= 0 &&
+        _chargingData[index]->ChargingProfilePower <= *pow)
+    {
+        *pow = _chargingData[index]->ChargingProfilePower;
+    }
 }
 
 time_t GetRtcInfoForEpoch()
@@ -3165,13 +3229,6 @@ int main(int argc, char *argv[])
             {
                 case S_IDLE:
                 case S_RESERVATION:
-                    _chargingData[_index]->PresentChargedEnergy = 0;
-                    _chargingData[_index]->PresentChargingPower = 0;
-                    _chargingData[_index]->GroundFaultStatus = GFD_WAIT;
-                    _chargingData[_index]->StopChargeFlag = NO;
-                    _chargingData[_index]->ChargingFee = 0.0;
-                    chargingTime[_index] = 0;
-
                     if (_chargingData[_index]->Type == _Type_Chademo)
                     {
                         ClearAbnormalStatus_Chademo(_index);
@@ -3187,6 +3244,19 @@ int main(int argc, char *argv[])
 
                     if (priorityLow == 1)
                     {
+                        _chargingData[_index]->PresentChargedEnergy = 0;
+                        _chargingData[_index]->PresentChargingPower = 0;
+                        _chargingData[_index]->GroundFaultStatus = GFD_WAIT;
+                        _chargingData[_index]->RealRatingPower = 0;
+                        _chargingData[_index]->StopChargeFlag = NO;
+                        _chargingData[_index]->ChargingFee = 0.0;
+                        _chargingData[_index]->EvBatterySoc = 0;
+                        _chargingData[_index]->PresentChargingVoltage = 0;
+                        _chargingData[_index]->PresentChargingCurrent = 0;
+                        _chargingData[_index]->EvBatteryMaxVoltage = 0;
+
+                        chargingTime[_index] = 0;
+
                         maxChargingPow = (ShmSysConfigAndInfo->SysConfig.MaxChargingPower * 10);
                     }
                     break;
@@ -3270,28 +3340,28 @@ int main(int argc, char *argv[])
 //                          _chargingData[_index]->GroundFaultStatus = GFD_PASS;
 
                         //PRINTF_FUNC("To EV_%d GFD = %d \n",   _index, _chargingData[_index]->GroundFaultStatus);
-                        if(_chargingData[_index]->GroundFaultStatus != GFD_WAIT)
-                        {
-                            unsigned char _result = _chargingData[_index]->GroundFaultStatus;
 
-                            if(_chargingData[_index]->Type == _Type_Chademo || _chargingData[_index]->Type == _Type_GB)
-                            {
-                                if (_result == GFD_WARNING)
-                                {
-                                    _result = GFD_PASS;
-                                }
-                                SetIsolationStatus(_index, _result, _chargingData[_index]->Evboard_id);
-                            }
-                            else if(_chargingData[_index]->Type == _Type_CCS_2)
-                            {
-                                SetIsolationStatus(_index, _result, _chargingData[_index]->Evboard_id);
-                            }
-                            else
+                        unsigned char _result = GFD_WAIT;
+                        _result = _chargingData[_index]->GroundFaultStatus;
+
+                        if(_chargingData[_index]->Type == _Type_Chademo ||
+                           _chargingData[_index]->Type == _Type_GB)
+                        {
+                            if (_result == GFD_WARNING)
                             {
-                                //NULL
+                                _result = GFD_PASS;
                             }
                         }
 
+                        if(_result < GFD_WAIT &&
+                           _result > GFD_WARNING)
+                        {
+                            PRINTF_FUNC("Unexpected GFD status : %d \n", _result);
+                            _result = GFD_WAIT;
+                        }
+
+                        SetIsolationStatus(_index, _result, _chargingData[_index]->Evboard_id);
+
                         if(_chargingData[_index]->SystemStatus == S_CCS_PRECHARGE_ST0 &&
                             _chargingData[_index]->PrechargeStatus == PRECHARGE_READY)
                         {
@@ -3307,11 +3377,11 @@ int main(int argc, char *argv[])
 
                     if (chargingTime[_index] == 0)
                     {
-                        chargingTime[_index] = _chargingData[_index]->RemainChargingDuration;
+                        chargingTime[_index] = _chargingData[_index]->PresentChargedDuration;
                     }
                     else
                     {
-                        int passTime = _chargingData[_index]->RemainChargingDuration - chargingTime[_index];
+                        int passTime = _chargingData[_index]->PresentChargedDuration - chargingTime[_index];
 
                         if (passTime > 0)
                         {
@@ -3322,7 +3392,7 @@ int main(int argc, char *argv[])
                             }
 
                             _chargingData[_index]->PresentChargedEnergy += changingPow;
-                            chargingTime[_index] = _chargingData[_index]->RemainChargingDuration;
+                            chargingTime[_index] = _chargingData[_index]->PresentChargedDuration;
                         }
                     }
 

+ 20 - 19
EVSE/Projects/DW30/Apps/Module_EventLogging.c

@@ -39,7 +39,6 @@ struct StatusCodeData           *ShmStatusCodeData;
 
 void PRINTF_FUNC(char *string, ...);
 
-int StoreLogMsg(const char *fmt, ...);
 #define DEBUG_INFO(format, args...) StoreLogMsg("[%s:%d][%s][Info] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
 #define DEBUG_WARN(format, args...) StoreLogMsg("[%s:%d][%s][Warn] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
 #define DEBUG_ERROR(format, args...) StoreLogMsg("[%s:%d][%s][Error] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
@@ -61,11 +60,20 @@ int StoreLogMsg(const char *fmt, ...)
     SeqEndTime.time = time(NULL);
     tm=localtime(&SeqEndTime.time);
 
-    sprintf(Buf,"echo \"%04d-%02d-%02d %02d:%02d:%02d.%03d - %s\" >> /Storage/SystemLog/[%04d.%02d]SystemLog",
-            tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,SeqEndTime.millitm,
-            buffer,
-            tm->tm_year+1900,tm->tm_mon+1);
-    system(Buf);
+    if (ShmSysConfigAndInfo->SysConfig.SwitchDebugFlag == YES)
+    {
+        sprintf(Buf,"%02d:%02d:%02d.%03d - %s",
+                tm->tm_hour,tm->tm_min,tm->tm_sec,SeqEndTime.millitm, buffer);
+        printf("%s \n", Buf);
+    }
+    else
+    {
+        sprintf(Buf,"echo \"%04d-%02d-%02d %02d:%02d:%02d.%03d - %s\" >> /Storage/SystemLog/[%04d.%02d]SystemLog",
+                tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,SeqEndTime.millitm,
+                buffer,
+                tm->tm_year+1900,tm->tm_mon+1);
+        system(Buf);
+    }
 
     return rc;
 }
@@ -88,10 +96,7 @@ void PRINTF_FUNC(char *string, ...)
     vsnprintf(buffer, sizeof(buffer), string, args);
     va_end(args);
 
-    if (ShmSysConfigAndInfo->SysConfig.SwitchDebugFlag == YES)
-        printf("%s \n", buffer);
-    else
-        DEBUG_INFO("%s \n", buffer);
+    DEBUG_INFO("%s \n", buffer);
 }
 
 //=================================
@@ -175,6 +180,7 @@ void RemoveFaultCodeToBuf(unsigned char *Code)
     char _code[7];
     sprintf(_code,"%s", Code);
 
+    printf("********************* %s \n", _code);
     // 把相關的錯誤碼一次移除,避免重複顯示
     while(find)
     {
@@ -190,20 +196,15 @@ void RemoveFaultCodeToBuf(unsigned char *Code)
             }
             else
             {
-                if(i == ShmSysConfigAndInfo->SysWarningInfo.WarningCount - 1)
-                {
-                    memcpy(&ShmSysConfigAndInfo->SysWarningInfo.WarningCode[i][0], "", 7);
-                }
-                else
-                {
-                    memcpy(&ShmSysConfigAndInfo->SysWarningInfo.WarningCode[i][0],
-                            &ShmSysConfigAndInfo->SysWarningInfo.WarningCode[i + 1][0], 7);
-                }
+                memcpy(&ShmSysConfigAndInfo->SysWarningInfo.WarningCode[i - 1][0],
+                       &ShmSysConfigAndInfo->SysWarningInfo.WarningCode[i][0], 7);
             }
         }
 
         if (find)
+        {
             ShmSysConfigAndInfo->SysWarningInfo.WarningCount--;
+        }
     }
 }
 

+ 167 - 72
EVSE/Projects/DW30/Apps/Module_InternalComm.c

@@ -44,19 +44,19 @@
 #define COLOR_MAX_LV        100
 #define COLOR_MIN_LV        0
 
+#define AC_DEFAULT_VOL      220
+
 struct SysConfigAndInfo         *ShmSysConfigAndInfo;
 struct StatusCodeData           *ShmStatusCodeData;
 struct FanModuleData            *ShmFanModuleData;
 struct RelayModuleData          *ShmRelayModuleData;
 struct LedModuleData            *ShmLedModuleData;
-struct CHAdeMOData              *ShmCHAdeMOData;
-struct CcsData                  *ShmCcsData;
 struct PsuData                  *ShmPsuData;
 
-#define VIN_MAX_VOLTAGE_IEC     296 // 大於該值 : OVP
-#define VIN_MIN_VOLTAGE_IEC     166 // 小於該值 : UVP
-#define VIN_MAX_VOLTAGE_UL      305 // 大於該值 : OVP
-#define VIN_MIN_VOLTAGE_UL      215 // 小於該值 : UVP
+#define VIN_MAX_VOLTAGE_IEC     285 // 大於該值 : OVP
+#define VIN_MIN_VOLTAGE_IEC     160 // 小於該值 : UVP
+#define VIN_MAX_VOLTAGE_UL      315 // 大於該值 : OVP
+#define VIN_MIN_VOLTAGE_UL      210 // 小於該值 : UVP
 
 #define VIN_DROP_VOLTAGE    150 // 小於該值 : ac drop
 
@@ -114,6 +114,8 @@ struct timeb    _ac_startChargingTime;
 struct timeb    _ac_endChargingTime;
 
 unsigned short _setFanSpeed = 0;
+float _beforeChargingTotalEnergy = 0.0;
+byte _checkLedChanged = 3;
 
 Ver ver;
 PresentInputVoltage inputVoltage;
@@ -164,7 +166,6 @@ int _alarm_code[] = {AC_OVP, AC_UVP, AC_OCP, AC_OTP, AC_GMI_FAULT, AC_CP_ERROR,
 
 void PRINTF_FUNC(char *string, ...);
 
-int StoreLogMsg(const char *fmt, ...);
 unsigned long GetTimeoutValue(struct timeval _sour_time);
 
 #define DEBUG_INFO(format, args...) StoreLogMsg("[%s:%d][%s][Info] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
@@ -196,11 +197,20 @@ int StoreLogMsg(const char *fmt, ...)
     SeqEndTime.time = time(NULL);
     tm=localtime(&SeqEndTime.time);
 
-    sprintf(Buf,"echo \"%04d-%02d-%02d %02d:%02d:%02d.%03d - %s\" >> /Storage/SystemLog/[%04d.%02d]SystemLog",
-            tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,SeqEndTime.millitm,
-            buffer,
-            tm->tm_year+1900,tm->tm_mon+1);
-    system(Buf);
+    if (ShmSysConfigAndInfo->SysConfig.SwitchDebugFlag == YES)
+    {
+        sprintf(Buf,"%02d:%02d:%02d.%03d - %s",
+                tm->tm_hour,tm->tm_min,tm->tm_sec,SeqEndTime.millitm, buffer);
+        printf("%s \n", Buf);
+    }
+    else
+    {
+        sprintf(Buf,"echo \"%04d-%02d-%02d %02d:%02d:%02d.%03d - %s\" >> /Storage/SystemLog/[%04d.%02d]SystemLog",
+                tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,SeqEndTime.millitm,
+                buffer,
+                tm->tm_year+1900,tm->tm_mon+1);
+        system(Buf);
+    }
 
     return rc;
 }
@@ -228,10 +238,7 @@ void PRINTF_FUNC(char *string, ...)
     vsnprintf(buffer, sizeof(buffer), string, args);
     va_end(args);
 
-    if (ShmSysConfigAndInfo->SysConfig.SwitchDebugFlag == YES)
-        printf("%s \n", buffer);
-    else
-        DEBUG_INFO("%s \n", buffer);
+    DEBUG_INFO("%s \n", buffer);
 }
 
 //==========================================
@@ -260,7 +267,7 @@ void GetFwAndHwVersion_Relay()
 {
     if (Query_FW_Ver(Uart5Fd, Addr.Relay, &ver) == PASS)
     {
-        // FanModuleData
+        // RelayModuleData
         strcpy((char *) ShmRelayModuleData->version, ver.Version_FW);
         // SystemInfo
         strcpy((char *) ShmSysConfigAndInfo->SysInfo.RelayModuleFwRev, ver.Version_FW);
@@ -301,6 +308,15 @@ void GetFwVersion_AC()
     }
 }
 
+void GetAcModelName()
+{
+    memset(ShmSysConfigAndInfo->SysConfig.AcModelName, 0x00, sizeof(ShmSysConfigAndInfo->SysConfig.AcModelName));
+    if (Query_Model_Name(Uart5Fd, Addr.AcPlug, ShmSysConfigAndInfo->SysConfig.AcModelName) == PASS)
+    {
+        PRINTF_FUNC("ac model name = %s \n", ShmSysConfigAndInfo->SysConfig.AcModelName);
+    }
+}
+
 void SetRtcData_Relay()
 {
     struct timeb csuTime;
@@ -398,34 +414,52 @@ void GetPresentInputVol()
         if (ShmSysConfigAndInfo->SysInfo.ChargerType == _CHARGER_TYPE_IEC)
         {
             if (inputVoltage.L1N_L12 < VIN_MIN_VOLTAGE_IEC)
+            {
+                PRINTF_FUNC("In Uvp L1N_L12 = %d \n", inputVoltage.L1N_L12);
                 ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputUVP = YES;
+            }
             else
                 ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputUVP = NO;
 
             if (inputVoltage.L2N_L23 < VIN_MIN_VOLTAGE_IEC)
+            {
+                PRINTF_FUNC("In Uvp L2N_L23 = %d \n", inputVoltage.L2N_L23);
                 ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL2InputUVP = YES;
+            }
             else
                 ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL2InputUVP = NO;
 
             if (inputVoltage.L3N_L31 < VIN_MIN_VOLTAGE_IEC)
+            {
+                PRINTF_FUNC("In Uvp L3N_L31 = %d \n", inputVoltage.L3N_L31);
                 ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL3InputUVP = YES;
+            }
             else
                 ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL3InputUVP = NO;
         }
         else if (ShmSysConfigAndInfo->SysInfo.ChargerType == _CHARGER_TYPE_UL)
         {
             if (inputVoltage.L1N_L12 < VIN_MIN_VOLTAGE_UL)
+            {
+                PRINTF_FUNC("In Uvp L1N_L12 = %d \n", inputVoltage.L1N_L12);
                 ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputUVP = YES;
+            }
             else
                 ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputUVP = NO;
 
             if (inputVoltage.L2N_L23 < VIN_MIN_VOLTAGE_UL)
+            {
+                PRINTF_FUNC("In Uvp L2N_L23 = %d \n", inputVoltage.L2N_L23);
                 ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL2InputUVP = YES;
+            }
             else
                 ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL2InputUVP = NO;
 
             if (inputVoltage.L3N_L31 < VIN_MIN_VOLTAGE_UL)
+            {
+                PRINTF_FUNC("In Uvp L3N_L31 = %d \n", inputVoltage.L3N_L31);
                 ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL3InputUVP = YES;
+            }
             else
                 ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL3InputUVP = NO;
         }
@@ -434,34 +468,52 @@ void GetPresentInputVol()
         if (ShmSysConfigAndInfo->SysInfo.ChargerType == _CHARGER_TYPE_IEC)
         {
             if (inputVoltage.L1N_L12 > VIN_MAX_VOLTAGE_IEC)
+            {
+                PRINTF_FUNC("In Ovp L1N_L12 = %d \n", inputVoltage.L1N_L12);
                 ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputOVP = YES;
+            }
             else
                 ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputOVP = NO;
 
             if (inputVoltage.L2N_L23 > VIN_MAX_VOLTAGE_IEC)
+            {
+                PRINTF_FUNC("In Ovp L2N_L23 = %d \n", inputVoltage.L2N_L23);
                 ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL2InputOVP = YES;
+            }
             else
                 ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL2InputOVP = NO;
 
             if (inputVoltage.L3N_L31 > VIN_MAX_VOLTAGE_IEC)
+            {
+                PRINTF_FUNC("In Ovp L3N_L31 = %d \n", inputVoltage.L3N_L31);
                 ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL3InputOVP = YES;
+            }
             else
                 ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL3InputOVP = NO;
         }
         else if (ShmSysConfigAndInfo->SysInfo.ChargerType == _CHARGER_TYPE_UL)
         {
             if (inputVoltage.L1N_L12 > VIN_MAX_VOLTAGE_UL)
+            {
+                PRINTF_FUNC("In Ovp L1N_L12 = %d \n", inputVoltage.L1N_L12);
                 ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputOVP = YES;
+            }
             else
                 ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputOVP = NO;
 
             if (inputVoltage.L2N_L23 > VIN_MAX_VOLTAGE_UL)
+            {
+                PRINTF_FUNC("In Ovp L2N_L23 = %d \n", inputVoltage.L2N_L23);
                 ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL2InputOVP = YES;
+            }
             else
                 ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL2InputOVP = NO;
 
             if (inputVoltage.L3N_L31 > VIN_MAX_VOLTAGE_UL)
+            {
+                PRINTF_FUNC("In Ovp L3N_L31 = %d \n", inputVoltage.L3N_L31);
                 ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL3InputOVP = YES;
+            }
             else
                 ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL3InputOVP = NO;
         }
@@ -942,7 +994,8 @@ void CheckPhaseLossStatus(byte index)
 
 void SetParalleRelayStatus()
 {
-    if (gunCount >= 2 && ShmSysConfigAndInfo->SysInfo.IsAlternatvieConf == NO)
+    // 之後雙槍單模機種,橋接都會上
+    if (gunCount >= 2)
     {
         if (_chargingData[0]->SystemStatus == S_BOOTING || _chargingData[1]->SystemStatus == S_BOOTING ||
             (_chargingData[0]->SystemStatus == S_IDLE && _chargingData[1]->SystemStatus == S_IDLE))
@@ -1022,7 +1075,7 @@ void CheckAlarmOccur()
                 case AC_DC_LEAKAGE: ShmStatusCodeData->AlarmCode.AlarmEvents.bits.RcdTrip = YES; break;
                 case AC_SYSTEM_SELFTEST_FAULT: ShmStatusCodeData->AlarmCode.AlarmEvents.bits.McuSelftestFail = YES; break;
                 case AC_HANDSHAKE_TIMEOUT: break;
-                case AC_EMC_STOP: ShmStatusCodeData->AlarmCode.AlarmEvents.bits.EmergencyStopTrip = YES; break;
+            //case AC_EMC_STOP: ShmStatusCodeData->AlarmCode.AlarmEvents.bits.EmergencyStopTrip = YES; break;
                 case AC_RELAY_WELDING: ShmStatusCodeData->FaultCode.FaultEvents.bits.AcOutputRelayWelding = YES; break;
                 case AC_GF_MODULE_FAULT: ShmStatusCodeData->FaultCode.FaultEvents.bits.RcdSelfTestFail = YES; break;
                 case AC_SHUTTER_FAULT: break;
@@ -1047,7 +1100,7 @@ void CheckAlarmOccur()
                 case AC_DC_LEAKAGE: ShmStatusCodeData->AlarmCode.AlarmEvents.bits.RcdTrip = NO; break;
                 case AC_SYSTEM_SELFTEST_FAULT: ShmStatusCodeData->AlarmCode.AlarmEvents.bits.McuSelftestFail = NO; break;
                 case AC_HANDSHAKE_TIMEOUT: break;
-                case AC_EMC_STOP: ShmStatusCodeData->AlarmCode.AlarmEvents.bits.EmergencyStopTrip = NO; break;
+            //case AC_EMC_STOP: ShmStatusCodeData->AlarmCode.AlarmEvents.bits.EmergencyStopTrip = NO; break;
                 case AC_RELAY_WELDING: ShmStatusCodeData->FaultCode.FaultEvents.bits.AcOutputRelayWelding = NO; break;
                 case AC_GF_MODULE_FAULT: ShmStatusCodeData->FaultCode.FaultEvents.bits.RcdSelfTestFail = NO; break;
                 case AC_SHUTTER_FAULT: break;
@@ -1149,10 +1202,12 @@ void SetLedColor(struct ChargingInfoData *chargingData_1, struct ChargingInfoDat
         led_color.Connect_2_Red     = COLOR_MAX_LV;
     }
 
-    if (IsNoneMatchLedColor())
+    if (_checkLedChanged > 0)
     {
         if (Config_Led_Color(Uart5Fd, Addr.Led, &led_color) == PASS)
     {
+            _checkLedChanged--;
+
             cur_led_color.Connect_1_Red = led_color.Connect_1_Red;
             cur_led_color.Connect_1_Green = led_color.Connect_1_Green;
             cur_led_color.Connect_1_Blue = led_color.Connect_1_Blue;
@@ -1161,6 +1216,8 @@ void SetLedColor(struct ChargingInfoData *chargingData_1, struct ChargingInfoDat
             cur_led_color.Connect_2_Blue = led_color.Connect_2_Blue;
         }
     }
+    else if (IsNoneMatchLedColor())
+        _checkLedChanged = 3;
 }
 //==========================================
 // Init all share memory
@@ -1233,6 +1290,7 @@ int InitShareMemory()
         #endif
         result = FAIL;
     }
+    memset(ShmRelayModuleData,0,sizeof(struct RelayModuleData));
 
     //creat ShmLedModuleData
     if ((MeterSMId = shmget(ShmLedBdKey, sizeof(struct LedModuleData),  0777)) < 0)
@@ -1266,43 +1324,6 @@ int InitShareMemory()
         #endif
         result = FAIL;
     }
-    memset(ShmPsuData,0,sizeof(struct PsuData));
-
-    if(CHAdeMO_QUANTITY > 0)
-    {
-        if ((MeterSMId = shmget(ShmCHAdeMOCommKey, sizeof(struct CHAdeMOData),  IPC_CREAT | 0777)) < 0)
-        {
-            #ifdef SystemLogMessage
-            DEBUG_ERROR("[shmget ShmCHAdeMOData NG \n");
-            #endif
-            return FAIL;
-        }
-        else if ((ShmCHAdeMOData = shmat(MeterSMId, NULL, 0)) == (void *) -1) {
-            #ifdef SystemLogMessage
-            DEBUG_ERROR("shmat ShmCHAdeMOData NG \n");
-            #endif
-            return FAIL;
-        }
-    }
-
-    if(CCS_QUANTITY > 0)
-    {
-        if ((MeterSMId = shmget(ShmCcsCommKey, sizeof(struct CcsData),  IPC_CREAT | 0777)) < 0)
-        {
-            #ifdef SystemLogMessage
-            DEBUG_ERROR("shmget ShmCcsData NG \n");
-            #endif
-            return FAIL;
-        }
-        else if ((ShmCcsData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
-        {
-            #ifdef SystemLogMessage
-            DEBUG_ERROR("shmat ShmCcsData NG \n");
-            #endif
-            return FAIL;
-        }
-    }
-
 
     return result;
 }
@@ -1401,7 +1422,7 @@ void Initialization()
         {
             if (!FindChargingInfoData(_index, &_chargingData[0]))
             {
-                DEBUG_ERROR("EvComm : FindChargingInfoData false \n");
+                DEBUG_ERROR("InternalComm : FindChargingInfoData false \n");
                 isPass = false;
                 break;
             }
@@ -1540,10 +1561,14 @@ void CableCheckDetected(byte index)
             }
             else if (_chargingData[index]->SystemStatus <= S_CHARGING)
             {
-                if (_chargingData[index]->Type == _Type_GB)
-                    SetGfdConfig(index, GFD_IDLE);
-                else
+                if (_chargingData[index]->Type == _Type_CCS_2)
+                {
                     SetGfdConfig(index, GFD_CHARGING);
+                }
+                else
+                {
+                    SetGfdConfig(index, GFD_IDLE);
+                }
             }
         }
         else if(_chargingData[index]->SystemStatus == S_COMPLETE || _chargingData[index]->SystemStatus == S_PREPARNING
@@ -1557,9 +1582,9 @@ void CableCheckDetected(byte index)
 void CheckOutputPowerOverCarReq(byte index)
 {
     float fireV = _chargingData[index]->FireChargingVoltage;
-    float carV = _chargingData[index]->EvBatterytargetVoltage;
+    float carV = _chargingData[index]->EvBatterytargetVoltage * 10;
 
-    if (_chargingData[index]->EvBatterytargetVoltage > 1500 &&
+    if ((_chargingData[index]->EvBatterytargetVoltage * 10) > 1500 &&
         (_chargingData[index]->Type == _Type_Chademo ||
          _chargingData[index]->Type == _Type_CCS_2 ||
          _chargingData[index]->Type == _Type_GB))
@@ -1567,9 +1592,9 @@ void CheckOutputPowerOverCarReq(byte index)
         if (fireV >= (carV + (carV * 0.1)))
         {
             PRINTF_FUNC("[Module_InternalComm]CheckOutputPowerOverCarReq NG : fire = %f, battery = %f \n",
-                    _chargingData[index]->FireChargingVoltage, _chargingData[index]->EvBatterytargetVoltage);
+                    _chargingData[index]->FireChargingVoltage, (_chargingData[index]->EvBatterytargetVoltage * 10));
             DEBUG_ERROR("[Module_InternalComm]CheckOutputPowerOverCarReq NG : fire = %f, battery = %f \n",
-                    _chargingData[index]->FireChargingVoltage, _chargingData[index]->EvBatterytargetVoltage);
+                    _chargingData[index]->FireChargingVoltage, (_chargingData[index]->EvBatterytargetVoltage * 10));
             _chargingData[index]->StopChargeFlag = YES;
         }
     }
@@ -1577,7 +1602,7 @@ void CheckOutputPowerOverCarReq(byte index)
 
 void CheckOutputVolNoneMatchFire(byte index)
 {
-    if (_chargingData[index]->EvBatterytargetVoltage > 1500 &&
+    if ((_chargingData[index]->EvBatterytargetVoltage * 10) > 1500 &&
         (_chargingData[index]->Type == _Type_Chademo ||
          _chargingData[index]->Type == _Type_CCS_2 ||
          _chargingData[index]->Type == _Type_GB))
@@ -1678,6 +1703,7 @@ void GetAcStatus()
         if(ShmSysConfigAndInfo->SysConfig.AcMaxChargingCurrent == 0)
             ShmSysConfigAndInfo->SysConfig.AcMaxChargingCurrent = ShmSysConfigAndInfo->SysConfig.AcRatingCurrent;
 
+        ac_chargingInfo[0]->ConnectorPlugIn = acStatus.CpStatus;
     //              printf("CpStatus = %d \n", acStatus.CpStatus);
     //              printf("CurLimit = %d \n", acStatus.CurLimit);
     //              printf("PilotVol_P = %d \n", acStatus.PilotVol_P);
@@ -1745,6 +1771,24 @@ void ChangeToCsuMode()
 //  }
 }
 
+void ChangeStartOrStopDateTime(byte isStart)
+{
+    char cmdBuf[32];
+    struct timeb csuTime;
+    struct tm *tmCSU;
+
+    ftime(&csuTime);
+    tmCSU = localtime(&csuTime.time);
+
+    sprintf(cmdBuf, "%04d-%02d-%02d %02d:%02d:%02d", tmCSU->tm_year + 1900,
+            tmCSU->tm_mon + 1, tmCSU->tm_mday, tmCSU->tm_hour, tmCSU->tm_min,
+            tmCSU->tm_sec);
+    if (isStart)
+        strcpy((char *)ac_chargingInfo[0]->StartDateTime, cmdBuf);
+    else
+        strcpy((char *)ac_chargingInfo[0]->StopDateTime, cmdBuf);
+}
+
 void AcChargeTypeProcess()
 {
     if (acgunCount > 0)
@@ -1753,6 +1797,7 @@ void AcChargeTypeProcess()
         {
             ac_chargingInfo[0]->IsModeChagned = NO;
             GetFwVersion_AC();
+            GetAcModelName();
         }
         else if (ac_chargingInfo[0]->SelfTest_Comp == YES)
         {
@@ -1793,6 +1838,16 @@ void AcChargeTypeProcess()
                      (ShmSysConfigAndInfo->SysInfo.WaitForPlugit == YES ||
                       ShmSysConfigAndInfo->SysConfig.AuthorisationMode == AUTH_MODE_DISABLE))
             {
+                if (ShmSysConfigAndInfo->SysInfo.OrderCharging != FAIL &&
+                        ShmSysConfigAndInfo->SysInfo.OrderCharging == DEFAULT_AC_INDEX)
+                {
+                    PRINTF_FUNC("** AC Remote \n");
+                    strcpy((char *)ac_chargingInfo[0]->StartUserId, "");
+                    ShmSysConfigAndInfo->SysInfo.WaitForPlugit = NO;
+                    _status = S_PREPARNING;
+                }
+                else
+                {
                 PRINTF_FUNC("** UserId = %s \n", ShmSysConfigAndInfo->SysConfig.UserId);
                 strcpy((char *)ac_chargingInfo[0]->StartUserId, (char *)ShmSysConfigAndInfo->SysConfig.UserId);
                 PRINTF_FUNC("** CardNumber = %s \n", ac_chargingInfo[0]->StartUserId);
@@ -1800,6 +1855,7 @@ void AcChargeTypeProcess()
                 ShmSysConfigAndInfo->SysInfo.WaitForPlugit = NO;
                 _status = S_PREPARNING;
             }
+            }
 
             //printf("_status = %d \n", _status);
 
@@ -1817,6 +1873,9 @@ void AcChargeTypeProcess()
                     if (_isStatusChanged)
                     {
                         ac_chargingInfo[0]->PresentChargedEnergy = 0.0;
+                        ac_chargingInfo[0]->PresentChargingVoltage = 0;
+                        ac_chargingInfo[0]->ChargingFee = 0.0;
+                        _beforeChargingTotalEnergy = 0.0;
                     }
 
                     ChangeLedStatus();
@@ -1828,12 +1887,13 @@ void AcChargeTypeProcess()
                     {
                         ShmSysConfigAndInfo->SysInfo.SystemPage = _LCM_NONE;
                         ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc = DEFAULT_AC_INDEX;
+                        ShmSysConfigAndInfo->SysInfo.OrderCharging = FAIL;
                         gettimeofday(&_ac_preparing, NULL);
                     }
 
                     if (GetChargingEnergy() == PASS)
                     {
-                        ac_chargingInfo[0]->PresentChargedEnergy = acChargingEnergy.Energy / 100;
+                        _beforeChargingTotalEnergy = acChargingEnergy.Energy;
                     }
 
                     SetLegacyReq(YES);
@@ -1845,17 +1905,31 @@ void AcChargeTypeProcess()
                     if (_isStatusChanged)
                     {
                         ftime(&_ac_startChargingTime);
+                        ChangeStartOrStopDateTime(YES);
                         ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc = DEFAULT_AC_INDEX;
                     }
 
                     if (GetChargingEnergy() == PASS)
-                        ac_chargingInfo[0]->PresentChargedEnergy = acChargingEnergy.Energy / 100;
+                    {
+                        if ((acChargingEnergy.Energy - _beforeChargingTotalEnergy) > 0)
+                        {
+                            ac_chargingInfo[0]->PresentChargedEnergy += (acChargingEnergy.Energy - _beforeChargingTotalEnergy) / 100;
+                            if (ShmSysConfigAndInfo->SysConfig.BillingData.isBilling)
+                            {
+                                ac_chargingInfo[0]->ChargingFee += ac_chargingInfo[0]->PresentChargedEnergy * ShmSysConfigAndInfo->SysConfig.BillingData.Cur_fee;
+                            }
+                        }
+
+                        _beforeChargingTotalEnergy = acChargingEnergy.Energy;
+                    }
 
                     if (GetChargingCurrent() == PASS)
-                        ac_chargingInfo[0]->PresentChargingPower = (220 * (acChargingCurrent.OuputCurrentL1 / 10)) / 1000;
+                        ac_chargingInfo[0]->PresentChargingPower = (AC_DEFAULT_VOL * (acChargingCurrent.OuputCurrentL1 / 10)) / 1000;
 
                     ftime(&_ac_endChargingTime);
-                    ac_chargingInfo[0]->RemainChargingDuration = DiffTimeb(_ac_startChargingTime, _ac_endChargingTime);
+                    ac_chargingInfo[0]->PresentChargedDuration = DiffTimeb(_ac_startChargingTime, _ac_endChargingTime);
+                    ac_chargingInfo[0]->PresentChargingVoltage = AC_DEFAULT_VOL;
+                    ac_chargingInfo[0]->PresentChargingCurrent = acChargingCurrent.OuputCurrentL1 / 10;
 
                     // 用以判斷是否有在輸出
                     ac_chargingInfo[0]->IsCharging = acStatus.RelayStatus;
@@ -1868,6 +1942,7 @@ void AcChargeTypeProcess()
                 {
                     if (_isStatusChanged)
                     {
+                        ChangeStartOrStopDateTime(NO);
                         gettimeofday(&_ac_charging_comp, NULL);
                     }
 
@@ -1882,7 +1957,8 @@ void AcChargeTypeProcess()
                     {
                         gettimeofday(&_ac_charging_comp, NULL);
                         ftime(&_ac_endChargingTime);
-                        ac_chargingInfo[0]->RemainChargingDuration = DiffTimeb(_ac_startChargingTime, _ac_endChargingTime);
+                        ChangeStartOrStopDateTime(NO);
+                        ac_chargingInfo[0]->PresentChargedDuration = DiffTimeb(_ac_startChargingTime, _ac_endChargingTime);
                     }
                 }
                     break;
@@ -1957,12 +2033,23 @@ int main(void)
             gettimeofday(&_priority_time, NULL);
         }
 
+        // 自檢階段處理,自檢階段如果讀不到版號則代表該系統沒有掛燈板
         if (ShmLedModuleData->SelfTest_Comp == NO)
         {
+            // 自檢階段
+            if (ShmSysConfigAndInfo->SysInfo.SelfTestSeq <= _STEST_PSU_CAP)
+            {
             GetFwAndHwVersion_Led();
             sleep(1);
             gettimeofday(&_led_priority_time, NULL);
         }
+            else
+            {
+                // 自檢階段沒有問到版號
+                if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.LedboardStestFail == NO)
+                    ShmStatusCodeData->AlarmCode.AlarmEvents.bits.LedboardStestFail = YES;
+            }
+        }
 
         AcChargeTypeProcess();
 
@@ -2084,6 +2171,14 @@ int main(void)
 
         if (ShmFanModuleData->SelfTest_Comp == YES)
         {
+            // 風控修改 :
+            // ******************************************************* //
+            //
+            //       當前PSU輸出總 KW       PSU Temp
+            // 30 x -------------------- x ---------- + 14 x (PSU Temp - 45)
+            //       當前樁最大功率 KW         45
+            //
+            // ******************************************************* //
             if (GetTimeoutValue(_priority_time) / 1000 >= 1000)
             {
                 GetPsuTempForFanSpeed();

+ 77 - 36
EVSE/Projects/DW30/Apps/Module_LcmControl.c

@@ -4,7 +4,6 @@ bool needReloadQr = true;
 
 void PRINTF_FUNC(char *string, ...);
 
-int StoreLogMsg(const char *fmt, ...);
 #define DEBUG_INFO(format, args...) StoreLogMsg("[%s:%d][%s][Info] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
 #define DEBUG_WARN(format, args...) StoreLogMsg("[%s:%d][%s][Warn] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
 #define DEBUG_ERROR(format, args...) StoreLogMsg("[%s:%d][%s][Error] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
@@ -31,11 +30,20 @@ int StoreLogMsg(const char *fmt, ...)
     SeqEndTime.time = time(NULL);
     tm=localtime(&SeqEndTime.time);
 
-    sprintf(Buf,"echo \"%04d-%02d-%02d %02d:%02d:%02d.%03d - %s\" >> /Storage/SystemLog/[%04d.%02d]SystemLog",
-            tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,SeqEndTime.millitm,
-            buffer,
-            tm->tm_year+1900,tm->tm_mon+1);
-    system(Buf);
+    if (ShmSysConfigAndInfo->SysConfig.SwitchDebugFlag == YES)
+    {
+        sprintf(Buf,"%02d:%02d:%02d.%03d - %s",
+                tm->tm_hour,tm->tm_min,tm->tm_sec,SeqEndTime.millitm, buffer);
+        printf("%s \n", Buf);
+    }
+    else
+    {
+        sprintf(Buf,"echo \"%04d-%02d-%02d %02d:%02d:%02d.%03d - %s\" >> /Storage/SystemLog/[%04d.%02d]SystemLog",
+                tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,SeqEndTime.millitm,
+                buffer,
+                tm->tm_year+1900,tm->tm_mon+1);
+        system(Buf);
+    }
 
     return rc;
 }
@@ -61,10 +69,7 @@ void PRINTF_FUNC(char *string, ...)
     vsnprintf(buffer, sizeof(buffer), string, args);
     va_end(args);
 
-    if (ShmSysConfigAndInfo->SysConfig.SwitchDebugFlag == YES)
-        printf("%s \n", buffer);
-    else
-        DEBUG_INFO("%s \n", buffer);
+    DEBUG_INFO("%s \n", buffer);
 }
 
 //==========================================
@@ -586,7 +591,12 @@ void ChangeBattMapAndValue(short page, int soc)
             ChangeDisplay2Value(__batt_map, _battery_cap_80);
         }
         else if (soc >= 80 && soc <= 100)
+        {
+            if (_battery_display_ani)
+                ChangeDisplay2Value(__batt_map, _battery_cap_80);
+            else
             ChangeDisplay2Value(__batt_map, _battery_cap_100);
+        }
     }
     else if (page == _LCM_COMPLETE)
     {
@@ -612,7 +622,7 @@ void ChangeBattMapAndValue(short page, int soc)
     DisplayValueToLcm(__soc_value_charging, cmd, sizeof(cmd));
 }
 
-void ChangeRemainTime(int sec)
+void ChangeChargingTime(int sec)
 {
     int h, m, s;
     byte cmd[10];
@@ -630,7 +640,7 @@ void ChangeRemainTime(int sec)
     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));
+    DisplayValueToLcm(__charging_time_tx, cmd, sizeof(cmd));
 }
 
 void ChangeChargingEnergyValue(float energy)
@@ -748,17 +758,14 @@ void RefreshPageAnimation(byte value)
     }
 }
 
-#define WIFI_MODE_DISABLE           0
-#define WIFI_MODE_STA               1
-#define WIFI_MODE_AP                2
-#define WIFI_MODE_ADHOC             3
-
 void RefreshConnStatus()
 {
     // Wifi priority is higher than Ethernet
-    if(ShmSysConfigAndInfo->SysConfig.AthInterface.WifiMode == WIFI_MODE_STA)
+    if(ShmSysConfigAndInfo->SysConfig.AthInterface.WifiMode == _SYS_WIFI_MODE_STATION ||
+       ShmSysConfigAndInfo->SysConfig.AthInterface.WifiMode == _SYS_WIFI_MODE_AP)
     {
-        if (ShmSysConfigAndInfo->SysConfig.AthInterface.WifiNetworkConn == YES)
+        if (ShmSysConfigAndInfo->SysConfig.AthInterface.WifiNetworkConn == YES ||
+            ShmStatusCodeData->InfoCode.InfoEvents.bits.ApDisconnectViaWiFi == NO)
         {
             _wifi_conn_status = true;
             ChangeDisplay2Value(__ethernet_status, _disappear);
@@ -814,8 +821,34 @@ byte FirstPageChanged()
     return result;
 }
 
+bool IsPageReloadChk()
+{
+    bool result = false;
+
+    if (ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc == NO_DEFINE)
+    {
+        if (_curPage_index != ShmSysConfigAndInfo->SysInfo.CurGunSelected)
+        {
+            _curPage_index = ShmSysConfigAndInfo->SysInfo.CurGunSelected;
+            result = true;
+        }
+    }
+    else
+    {
+        if (_curPage_index != ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc)
+        {
+            _curPage_index = ShmSysConfigAndInfo->SysInfo.CurGunSelectedByAc;
+            result = true;
+        }
+    }
+
+    return result;
+}
+
 void ProcessPageInfo()
 {
+    _page_reload = IsPageReloadChk();
+
     switch(_currentPage)
     {
         case _LCM_IDLE:
@@ -839,12 +872,15 @@ void ProcessPageInfo()
             else
                 ChangeDisplay2Value(__main_app, _main_none_app);
 
-            if (FirstPageChanged() == YES || needReloadQr)
+            if (FirstPageChanged() == YES || needReloadQr || _page_reload)
             {
                 if (ShmSysConfigAndInfo->SysConfig.isQRCode)
                 {
                     needReloadQr = false;
-                    ChangeQrCode_Idle("http://google.com.tw");
+                    char QrCodeContent[128];
+                    strcpy(QrCodeContent, (char *)ShmSysConfigAndInfo->SysConfig.ModelName);
+                    strcat(QrCodeContent, (char *)ShmSysConfigAndInfo->SysConfig.SerialNumber);
+                    ChangeQrCode_Idle(QrCodeContent);
                 }
             }
         }
@@ -861,7 +897,8 @@ void ProcessPageInfo()
         case _LCM_CHARGING:
         case _LCM_COMPLETE:
         {
-            if (_totalCount + acgunCount >= 2)
+            if ((_totalCount >= 1 && acgunCount >= 1) ||
+                (_totalCount >= 2 && ShmSysConfigAndInfo->SysInfo.IsAlternatvieConf == NO))
             {
                 ChangeDisplay2Value(__sel_gun_btn, _sel_gun_btn);
 
@@ -890,6 +927,7 @@ void ProcessPageInfo()
                 ChangeDisplay2Value(__side_mid, _disappear);
                 ChangeDisplay2Value(__side_down, _disappear);
                 ChangeDisplay2Value(__sel_gun_btn, _disappear);
+                ChangeDisplay2Value(__qr_code_pre, _disappear);
             }
 
             bool isShowAc = false;
@@ -903,10 +941,10 @@ void ProcessPageInfo()
                     if (_currentPage == _LCM_CHARGING)
                     {
                         ChangeAcBattMapAndValue(_LCM_CHARGING);
-                        if (ac_chargingInfo[0]->RemainChargingDuration >= 0)
-                            ChangeRemainTime(ac_chargingInfo[0]->RemainChargingDuration);
+                        if (ac_chargingInfo[0]->PresentChargedDuration >= 0)
+                            ChangeChargingTime(ac_chargingInfo[0]->PresentChargedDuration);
                         else
-                            ChangeRemainTime(0);
+                            ChangeChargingTime(0);
 
                         if (ac_chargingInfo[0]->PresentChargingPower >= 0.1)
                             ChangeChargingPowerValue(ac_chargingInfo[0]->PresentChargingPower);
@@ -926,10 +964,10 @@ void ProcessPageInfo()
                     else if (_currentPage == _LCM_COMPLETE)
                     {
                         ChangeAcBattMapAndValue(_LCM_COMPLETE);
-                        if (ac_chargingInfo[0]->RemainChargingDuration >= 0)
-                            ChangeRemainTime(ac_chargingInfo[0]->RemainChargingDuration);
+                        if (ac_chargingInfo[0]->PresentChargedDuration >= 0)
+                            ChangeChargingTime(ac_chargingInfo[0]->PresentChargedDuration);
                         else
-                            ChangeRemainTime(0);
+                            ChangeChargingTime(0);
 
                         if (ac_chargingInfo[0]->PresentChargingPower >= 0.1)
                             ChangeChargingPowerValue(ac_chargingInfo[0]->PresentChargingPower);
@@ -1017,10 +1055,10 @@ void ProcessPageInfo()
                     if (ShmSysConfigAndInfo->SysInfo.CurGunSelected == i)
                     {
                         ChangeBattMapAndValue(_LCM_CHARGING, _chargingInfoData[i]->EvBatterySoc);
-                        if (_chargingInfoData[i]->RemainChargingDuration >= 0)
-                            ChangeRemainTime(_chargingInfoData[i]->RemainChargingDuration);
+                        if (_chargingInfoData[i]->PresentChargedDuration >= 0)
+                            ChangeChargingTime(_chargingInfoData[i]->PresentChargedDuration);
                         else
-                            ChangeRemainTime(0);
+                            ChangeChargingTime(0);
 
                         if (_chargingInfoData[i]->PresentChargingPower >= 0)
                             ChangeChargingPowerValue(_chargingInfoData[i]->PresentChargingPower);
@@ -1043,10 +1081,10 @@ void ProcessPageInfo()
                     if (ShmSysConfigAndInfo->SysInfo.CurGunSelected == i)
                     {
                         ChangeBattMapAndValue(_LCM_COMPLETE, _chargingInfoData[i]->EvBatterySoc);
-                        if (_chargingInfoData[i]->RemainChargingDuration >= 0)
-                            ChangeRemainTime(_chargingInfoData[i]->RemainChargingDuration);
+                        if (_chargingInfoData[i]->PresentChargedDuration >= 0)
+                            ChangeChargingTime(_chargingInfoData[i]->PresentChargedDuration);
                         else
-                            ChangeRemainTime(0);
+                            ChangeChargingTime(0);
 
                         if (_chargingInfoData[i]->PresentChargingPower >= 0)
                             ChangeChargingPowerValue(_chargingInfoData[i]->PresentChargingPower);
@@ -1099,12 +1137,15 @@ void ProcessPageInfo()
                         _chargingInfoData[index]->SystemStatus == S_RESERVATION ||
                         _chargingInfoData[index]->SystemStatus == S_BOOTING)
                 {
-                    if (FirstPageChanged() == YES || needReloadQr)
+                    if (FirstPageChanged() == YES || needReloadQr || _page_reload)
                     {
                         if (ShmSysConfigAndInfo->SysConfig.isQRCode)
                         {
                             needReloadQr = false;
-                            ChangeQrCode_Charge("http://google.com.tw");
+                            char QrCodeContent[128];
+                            strcpy(QrCodeContent, (char *)ShmSysConfigAndInfo->SysConfig.ModelName);
+                            strcat(QrCodeContent, (char *)ShmSysConfigAndInfo->SysConfig.SerialNumber);
+                            ChangeQrCode_Charge(QrCodeContent);
                         }
                     }
                 }

+ 5 - 4
EVSE/Projects/DW30/Apps/Module_LcmControl.h

@@ -42,6 +42,7 @@ struct StatusCodeData           *ShmStatusCodeData;
 struct FanModuleData            *ShmFanModuleData;
 
 #define NO_DEFINE           255
+#define DEFAULT_AC_INDEX    2
 
 #define CMD_TITLE_1             0x5A
 #define CMD_TITLE_2             0xA5
@@ -79,10 +80,10 @@ byte isChangeBattMap = false;
 short _currentPage = _LCM_NONE;
 short _oldPage = _LCM_NONE;
 byte _gunIndex = 0;
-byte _idlePageRotate = 1;
-bool _backend_conn_status = false;
 bool _wifi_conn_status = false;
 bool _battery_display_ani = false;
+byte _curPage_index = 0;
+bool _page_reload = false;
 
 // LCM - HW
 byte _everyPageRollChange = 0;
@@ -113,10 +114,10 @@ short __side_mid = 0x0094;
 short __conn_line_chag = 0x0096;
 short __batt_map = 0x0100;
 short __soc_value_charging = 0x0102;
-short __remain_time_map = 0x0106;
+short __charging_time_map = 0x0106;
 short __power_map = 0x0108;
 short __energy_map = 0x010A;
-short __remain_time_tx = 0x0110;
+short __charging_time_tx = 0x0110;
 short __output_eng_tx = 0x0120;
 short __total_out_eng_tx = 0x0130;
 short __conn_line_comp = 0x0140;

+ 15 - 10
EVSE/Projects/DW30/Apps/Module_PrimaryComm.c

@@ -59,7 +59,6 @@ byte flash = NO;
 
 void PRINTF_FUNC(char *string, ...);
 
-int StoreLogMsg(const char *fmt, ...);
 #define DEBUG_INFO(format, args...) StoreLogMsg("[%s:%d][%s][Info] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
 #define DEBUG_WARN(format, args...) StoreLogMsg("[%s:%d][%s][Warn] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
 #define DEBUG_ERROR(format, args...) StoreLogMsg("[%s:%d][%s][Error] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
@@ -81,11 +80,20 @@ int StoreLogMsg(const char *fmt, ...)
     SeqEndTime.time = time(NULL);
     tm=localtime(&SeqEndTime.time);
 
-    sprintf(Buf,"echo \"%04d-%02d-%02d %02d:%02d:%02d.%03d - %s\" >> /Storage/SystemLog/[%04d.%02d]SystemLog",
-            tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,SeqEndTime.millitm,
-            buffer,
-            tm->tm_year+1900,tm->tm_mon+1);
-    system(Buf);
+    if (ShmSysConfigAndInfo->SysConfig.SwitchDebugFlag == YES)
+    {
+        sprintf(Buf,"%02d:%02d:%02d.%03d - %s",
+                tm->tm_hour,tm->tm_min,tm->tm_sec,SeqEndTime.millitm, buffer);
+        printf("%s \n", Buf);
+    }
+    else
+    {
+        sprintf(Buf,"echo \"%04d-%02d-%02d %02d:%02d:%02d.%03d - %s\" >> /Storage/SystemLog/[%04d.%02d]SystemLog",
+                tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,SeqEndTime.millitm,
+                buffer,
+                tm->tm_year+1900,tm->tm_mon+1);
+        system(Buf);
+    }
 
     return rc;
 }
@@ -108,10 +116,7 @@ void PRINTF_FUNC(char *string, ...)
     vsnprintf(buffer, sizeof(buffer), string, args);
     va_end(args);
 
-    if (ShmSysConfigAndInfo->SysConfig.SwitchDebugFlag == YES)
-        printf("%s \n", buffer);
-    else
-        DEBUG_INFO("%s \n", buffer);
+    DEBUG_INFO("%s \n", buffer);
 }
 //=================================
 // Common routine

文件差異過大導致無法顯示
+ 516 - 195
EVSE/Projects/DW30/Apps/Module_PsuComm.c


+ 3 - 0
EVSE/Projects/DW30/Apps/Module_PsuComm.h

@@ -38,16 +38,19 @@ typedef unsigned int        unit;
 
 unsigned char _gunCount;
 struct ChargingInfoData *chargingInfo[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
+bool isStartOutputSwitch[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
 
 struct timeval _cmdSubPriority_time;
 byte _getCapDelayCount;
 struct timeval _derating_time;
+struct timeval _max_time;
 
 struct timeval _test_time;
 
 bool isCharging = false;
 bool isWaitingAver = false;
 bool isReadToCharging = false;
+bool CanAverageCharging = false;
 int preChargingTarget;
 int preChargingCur;
 

+ 88 - 30
EVSE/Projects/DW30/Apps/ReadCmdline.c

@@ -57,6 +57,7 @@ struct CcsData                  *ShmCcsData;
 struct GBTData                  *ShmGBTData;
 struct FanModuleData            *ShmFanModuleData;
 struct RelayModuleData          *ShmRelayModuleData;
+struct LedModuleData            *ShmLedModuleData;
 struct PsuData                  *ShmPsuData;
 
 struct ChargingInfoData         *_chargingData[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
@@ -200,6 +201,15 @@ int InitShareMemory()
         result = FAIL;
     }
 
+    if ((MeterSMId = shmget(ShmLedBdKey, sizeof(struct LedModuleData),  0777)) < 0)
+    {
+        result = FAIL;
+    }
+    else if ((ShmLedModuleData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
+    {
+        result = FAIL;
+    }
+
     if ((MeterSMId = shmget(ShmPsuKey, sizeof(struct PsuData),  IPC_CREAT | 0777)) < 0)
     {
         result = FAIL;
@@ -212,8 +222,26 @@ int InitShareMemory()
     return result;
 }
 
+unsigned long GetTimeoutValue(struct timeval _sour_time)
+{
+    struct timeval _end_time;
+    gettimeofday(&_end_time, NULL);
+
+    return 1000000 * (_end_time.tv_sec - _sour_time.tv_sec) + _end_time.tv_usec - _sour_time.tv_usec;
+}
+
 void RunStatusProc(char *v1, char *v2)
 {
+    if (strcmp(v1, "ac") == 0)
+    {
+        if (!FindAcChargingInfoData(0, &ac_chargingInfo[0]))
+        {
+            printf("FindChargingInfoData (AC) false \n");
+        }
+        printf("AC Status = %d \n", ac_chargingInfo[0]->ConnectorPlugIn);
+        return;
+    }
+
     int _index = atoi(v1);
     if (_index <= 1)
     {
@@ -273,7 +301,9 @@ void RunCardProc(char *v1, char *v2)
     }
     else
     {
-        memcpy((char *)ShmSysConfigAndInfo->SysConfig.UserId, v1, ARRAY_SIZE(v1));
+        strcpy((char *)ShmSysConfigAndInfo->SysConfig.UserId, "");
+        memcpy((char *)ShmSysConfigAndInfo->SysConfig.UserId, v1, strlen(v1));
+        ShmSysConfigAndInfo->SysConfig.UserId[strlen(v1)] = '\0';
         printf("StartUserId = %s \n", ShmSysConfigAndInfo->SysConfig.UserId);
     }
 }
@@ -307,8 +337,12 @@ void GetGunLockStatusProc(char *v1, char *v2)
         printf("FindChargingInfoData error\n");
         return;
     }
+    if (strcmp(v2, "-1") != 0 && strcmp(v2, "") != 0)
+    {
+        _chargingData[_index]->GunLocked = atoi(v2);
+    }
 
-    printf("Gun Locked Status = %x \n", _chargingData[_index]->GunLocked);
+    printf("Gun Locked Status = %d \n", _chargingData[_index]->GunLocked);
 }
 
 void SetSystemIDProc()
@@ -328,17 +362,14 @@ void GetFwVerProc(char *v1)
     {
         printf("407 FW Version = %s \n", ShmPrimaryMcuData->version);
     }
-    else if (strcmp(v1, "0") == 0)
+    else if (strcmp(v1, "0") == 0 || strcmp(v1, "1") == 0)
     {
-        printf("Ev board 0 FW Version = %s \n", ShmCHAdeMOData->evse[0].version);
-    }
-    else if (strcmp(v1, "1") == 0)
-    {
-        printf("Ev board 1 FW Version = %s \n", ShmCcsData->V2GMessage_DIN70121->version);
-    }
-    else if (strcmp(v1, "2") == 0)
-    {
-        printf("Ev board 2 FW Version = %s \n", ShmGBTData->evse[0].version);
+        int _index = atoi(v1);
+
+        if (_index == 0)
+            printf("Gun 0 FW Version = %s \n", ShmSysConfigAndInfo->SysInfo.Connector1FwRev);
+        else if (_index == 1)
+            printf("Gun 1 FW Version = %s \n", ShmSysConfigAndInfo->SysInfo.Connector2FwRev);
     }
     else if (strcmp(v1, "rb") == 0)
     {
@@ -352,6 +383,10 @@ void GetFwVerProc(char *v1)
     {
         printf("DC Main Version = %s \n", ShmSysConfigAndInfo->SysInfo.CsuRootFsFwRev);
     }
+    else if (strcmp(v1, "led") == 0)
+    {
+        printf("LED Version = %s \n", ShmSysConfigAndInfo->SysInfo.LedModuleFwRev);
+    }
     else if (strcmp(v1, "ac") == 0)
     {
         if (!FindAcChargingInfoData(0, &ac_chargingInfo[0]))
@@ -370,6 +405,26 @@ void CreateOneError(char *v1)
     ShmSysConfigAndInfo->SysConfig.BillingData.isBilling = value;
 }
 
+void GetAuthorizeFlag(char *v1)
+{
+    if (strcmp(v1, "-1") == 0|| strcmp(v1, "") == 0)
+        printf("AuthorizeFlag = %d \n", ShmSysConfigAndInfo->SysInfo.AuthorizeFlag);
+    else
+        ShmSysConfigAndInfo->SysInfo.AuthorizeFlag = atoi(v1);
+}
+
+void GetOrClearId(char *v1)
+{
+    int _index = atoi(v1);
+
+    if (!FindChargingInfoData(_index, &_chargingData[0]))
+    {
+        printf("FindChargingInfoData error\n");
+        return;
+    }
+    printf("Card Number = %s \n", _chargingData[_index]->StartUserId);
+}
+
 void FwUpdateFlagProc()
 {
     ShmSysConfigAndInfo->SysInfo.FirmwareUpdate = 0x01;
@@ -409,12 +464,15 @@ void SetPowerValue(char *v1, char *v2)
         return;
     }
 
-    _chargingData[_index]->EvBatterytargetCurrent = _Current * 10;
+    _chargingData[_index]->EvBatterytargetCurrent = _Current;
 }
 
 void GetSystemInfo()
 {
     printf ("ModelName = %s \n", ShmSysConfigAndInfo->SysConfig.ModelName);
+    printf ("SerialNumber = %s \n", ShmSysConfigAndInfo->SysConfig.SerialNumber);
+    printf ("InternetConn = %d \n", ShmSysConfigAndInfo->SysInfo.InternetConn);
+
     printf ("MaxChargingPower = %d, MaxChargingCurrent = %d \n",
             ShmSysConfigAndInfo->SysConfig.MaxChargingPower,
             ShmSysConfigAndInfo->SysConfig.MaxChargingCurrent);
@@ -615,7 +673,6 @@ void RunUnconditionalChargeIndex1(char *v1, char *v2, char *v3)
 
     if(_Voltage > 1000 || _Voltage < 50)
     {
-
         printf ("Input Voltage over range\n");
         return;
     }
@@ -632,8 +689,8 @@ void RunUnconditionalChargeIndex1(char *v1, char *v2, char *v3)
     //kill ev task
     system("killall Module_EvComm");
 
-    _Voltage = (_Voltage * 10);
-    _Current = (_Current * 10);
+    //_Voltage = (_Voltage * 10);
+    //_Current = (_Current * 10);
 
     //system(STTY_US TTY_PATH);
 
@@ -699,7 +756,7 @@ void RunUnconditionalChargeIndex1(char *v1, char *v2, char *v3)
                     PreviousSystemStatus = _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus;
 
                     printf ("[UnconditionalCharge - S_PREPARING_FOR_EV]\n");
-                    printf ("ReqVoltage = %f, ReqCurrent = %f \n", _Voltage,_Current);
+                    printf ("ReqVoltage = %f, ReqCurrent = %f \n", _Voltage * 10,_Current * 10);
 
                 }
                 //清除 main timeout 機制
@@ -709,8 +766,8 @@ void RunUnconditionalChargeIndex1(char *v1, char *v2, char *v3)
 
                 //充電電壓電流
                 _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->EvBatterySoc = 50;
-                _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->EvBatterytargetVoltage = 5000;
-                _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->EvBatterytargetCurrent = 20;
+                _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->EvBatterytargetVoltage = 500;
+                _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->EvBatterytargetCurrent = 2;
                 _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->AvailableChargingCurrent = 1000;
 
                 //****** 注意~此行為是防止 K1K2 先開導到無法升壓 ( Relay Board 在此 state 還未搭上 K1K2 )
@@ -746,8 +803,8 @@ void RunUnconditionalChargeIndex1(char *v1, char *v2, char *v3)
 
                 //充電電壓電流
                 _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->EvBatterySoc = 50;
-                _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->EvBatterytargetVoltage = 5000;
-                _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->EvBatterytargetCurrent = 20;
+                _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->EvBatterytargetVoltage = 500;
+                _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->EvBatterytargetCurrent = 2;
                 _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->AvailableChargingCurrent = 1000;
 
                 //printf ("tar vol_ = %d \n", _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->EvBatterytargetVoltage);
@@ -796,12 +853,6 @@ void RunUnconditionalChargeIndex1(char *v1, char *v2, char *v3)
                      printf ("Charging Ground Fault check Fail (%d)\n",_chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->GroundFaultStatus);
                     _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus = S_TERMINATING;
                 }
-
-                if (_chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->GroundFaultStatus == 0x03){
-                     printf ("Charging Ground Fault Warning (%d)\n",_chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->GroundFaultStatus);
-                    _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus = S_TERMINATING;
-                }
-
             }
             break;
 
@@ -815,7 +866,6 @@ void RunUnconditionalChargeIndex1(char *v1, char *v2, char *v3)
                     printf ("[UnconditionalCharge - S_TERMINATING]\n");
                     //無阻塞偵測 keybaord 結束
                     system(STTY_DEF TTY_PATH);
-
                 }
 
                 sleep(3);
@@ -880,8 +930,8 @@ void RunUnconditionalChargeIndex1(char *v1, char *v2, char *v3)
                continue;
 
             printf("vol = %f, cur = %f \n", _vol, _cur);
-            _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->EvBatterytargetVoltage = _vol * 10;
-            _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->EvBatterytargetCurrent = _cur * 10;
+            _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->EvBatterytargetVoltage = _vol;
+            _chargingData[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->EvBatterytargetCurrent = _cur;
         }
         else if (strcmp(newString[0], "c") == 0)
         {
@@ -1067,6 +1117,14 @@ int main(void)
         {
             CreateOneError(newString[1]);
         }
+        else if (strcmp(newString[0], "auth") == 0)
+        {
+            GetAuthorizeFlag(newString[1]);
+        }
+        else if (strcmp(newString[0], "id") == 0)
+        {
+            GetOrClearId(newString[1]);
+        }
         else if(strcmp(newString[0], "strchg") == 0)
         {
             //如果連一個參數都沒有 (此命令不理會) 加上判斷第二參數

+ 68 - 24
EVSE/Projects/DW30/Apps/internalComm.c

@@ -42,11 +42,33 @@ struct Address Addr={0x01,0x02,0x03,0x05,0x06,0xFF};
 struct Command Cmd={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x24,0x27,0x28,0x29,0x2C,0x81,0x83,
                     0x85,0x86,0x87,0x88,0x089,0x8A,0x8B,0x8C,0x90,0x93,0xe0,0xe1,0xe2,0xe3};
 
+int tranceiveRelDelayTime(int fd, unsigned char* cmd, unsigned char cmd_len, unsigned char* rx, unsigned short _delay)
+{
+    int len;
+    //sleep(2); //required to make flush work, for some reason
+    tcflush(fd,TCIOFLUSH);
+
+    if(write(fd, cmd, cmd_len) >= cmd_len)
+    {
+        usleep(_delay * 1000);
+        len = read(fd, rx, 512);
+    }
+    else
+    {
+        #ifdef SystemLogMessage
+        DEBUG_ERROR("Serial command %s response fail.\n", cmd);
+        #endif
+    }
+
+    return len;
+}
+
 int tranceive(int fd, unsigned char* cmd, unsigned char cmd_len, unsigned char* rx)
 {
     int len;
     //sleep(2); //required to make flush work, for some reason
     tcflush(fd,TCIOFLUSH);
+
     if(write(fd, cmd, cmd_len) >= cmd_len)
     {
         usleep(15000);
@@ -134,7 +156,7 @@ unsigned char Query_Present_InputVoltage(unsigned char fd, unsigned char targetA
     unsigned char chksum = 0x00;
     unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
 
-    if(len > 6)
+    if(len > 13)
     {
         if (len < 6+(rx[4] | rx[5]<<8))
             return result;
@@ -146,14 +168,24 @@ unsigned char Query_Present_InputVoltage(unsigned char fd, unsigned char targetA
         if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
            (rx[2] == tx[1]) &&
            (rx[1] == tx[2]) &&
-           (rx[3] == tx[3]))
+           (rx[3] == tx[3]) &&
+           chksum != 0)
         {
             Ret_Buf->inputType = rx[6];
             Ret_Buf->L1N_L12 =(rx[7] | (rx[8]<<8))/10.0;
             Ret_Buf->L2N_L23 =(rx[9] | (rx[10]<<8))/10.0;
             Ret_Buf->L3N_L31 =(rx[11] | (rx[12]<<8))/10.0;
 
-            result = PASS;
+            if(Ret_Buf->L1N_L12 >= 320 ||
+               Ret_Buf->L2N_L23 >= 320 ||
+               Ret_Buf->L3N_L31 >= 320)
+            {
+                result = FAIL;
+            }
+            else
+            {
+                result = PASS;
+            }
         }
     }
 
@@ -496,7 +528,8 @@ unsigned char Config_Fan_Speed(unsigned char fd, unsigned char targetAddr, FanSp
         if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
            (rx[2] == tx[1]) &&
            (rx[1] == tx[2]) &&
-           (rx[3] == tx[3]))
+           (rx[3] == tx[3]) &&
+           rx[6] == PASS)
         {
             result = PASS;
         }
@@ -539,7 +572,7 @@ unsigned char Config_Relay_Output(unsigned char fd, unsigned char targetAddr, Re
            (rx[2] == tx[1]) &&
            (rx[1] == tx[2]) &&
            (rx[3] == tx[3]) &&
-           (rx[6] == 0x01))
+           rx[6] == PASS)
         {
             result = PASS;
         }
@@ -664,7 +697,8 @@ unsigned char Config_Model_Name(unsigned char fd, unsigned char targetAddr, unsi
         if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
               (rx[2] == tx[1]) &&
               (rx[1] == tx[2]) &&
-              (rx[3] == tx[3]))
+              (rx[3] == tx[3]) &&
+              rx[6] == PASS)
         {
             result = PASS;
         }
@@ -697,7 +731,8 @@ unsigned char Config_Rtc_Data(unsigned char fd, unsigned char targetAddr, Rtc *S
         if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
                 (rx[2] == tx[1]) &&
                 (rx[1] == tx[2]) &&
-                (rx[3] == tx[3]))
+                (rx[3] == tx[3]) &&
+                rx[6] == PASS)
         {
             result = PASS;
         }
@@ -858,7 +893,7 @@ unsigned char Query_AC_Status(unsigned char fd, unsigned char targetAddr, Ac_Sta
     unsigned char tx[7] = {0xaa, 0x00, targetAddr, Cmd.query_ac_status, 0x00, 0x00, 0x00};
     unsigned char rx[512];
     unsigned char chksum = 0x00;
-    unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
+    unsigned char len = tranceiveRelDelayTime(fd, tx, sizeof(tx), rx, 100);
 
     if(len > 6)
     {
@@ -918,7 +953,7 @@ unsigned char Query_AC_Alarm_Code(unsigned char fd, unsigned char targetAddr, Ac
     unsigned char tx[7] = {0xaa, 0x00, targetAddr, Cmd.query_ac_alarm_code, 0x00, 0x00};
     unsigned char rx[512];
     unsigned char chksum = 0x00;
-    unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
+    unsigned char len = tranceiveRelDelayTime(fd, tx, sizeof(tx), rx, 100);
 
     if(len > 6)
     {
@@ -949,7 +984,7 @@ unsigned char Query_Charging_Energy(unsigned char fd, unsigned char targetAddr,
     unsigned char tx[7] = {0xaa, 0x00, targetAddr, Cmd.query_ac_output_energy, 0x00, 0x00,0x00};
     unsigned char rx[512];
     unsigned char chksum = 0x00;
-    unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
+    unsigned char len = tranceiveRelDelayTime(fd, tx, sizeof(tx), rx, 100);
 
     if(len > 6)
     {
@@ -980,7 +1015,7 @@ unsigned char Query_Charging_Current(unsigned char fd, unsigned char targetAddr,
     unsigned char tx[7] = {0xaa, 0x00, targetAddr, Cmd.query_ac_output_current, 0x00, 0x00, 0x00};
     unsigned char rx[512];
     unsigned char chksum = 0x00;
-    unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
+    unsigned char len = tranceiveRelDelayTime(fd, tx, sizeof(tx), rx, 100);
 
     if(len > 6)
     {
@@ -1019,7 +1054,7 @@ unsigned char Config_LED_Status(unsigned char fd, unsigned char targetAddr, Ac_L
         chksum ^= tx[6 + idx];
     tx[11] = chksum;
 
-    if (tranceive(fd, tx, sizeof(tx), rx) > 0)
+    if (tranceiveRelDelayTime(fd, tx, sizeof(tx), rx, 100) > 0)
     {
         chksum = 0x00;
         for (int idx = 0; idx < (rx[4] | rx[5] << 8); idx++)
@@ -1030,7 +1065,8 @@ unsigned char Config_LED_Status(unsigned char fd, unsigned char targetAddr, Ac_L
         if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
             (rx[2] == tx[1]) &&
             (rx[1] == tx[2]) &&
-            (rx[3] == tx[3]))
+            (rx[3] == tx[3]) &&
+            rx[6] == PASS)
         {
             result = PASS;
         }
@@ -1050,7 +1086,7 @@ unsigned char Config_Legacy_Req(unsigned char fd, unsigned char targetAddr, unsi
         chksum ^= tx[6 + idx];
     tx[8] = chksum;
 
-    if (tranceive(fd, tx, sizeof(tx), rx) > 0)
+    if (tranceiveRelDelayTime(fd, tx, sizeof(tx), rx, 100) > 0)
     {
         chksum = 0x00;
         for (int idx = 0; idx < (rx[4] | rx[5] << 8); idx++)
@@ -1061,7 +1097,8 @@ unsigned char Config_Legacy_Req(unsigned char fd, unsigned char targetAddr, unsi
         if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
            (rx[2] == tx[1]) &&
            (rx[1] == tx[2]) &&
-           (rx[3] == tx[3]))
+           (rx[3] == tx[3]) &&
+           rx[6] == PASS)
         {
             result = PASS;
         }
@@ -1081,7 +1118,7 @@ unsigned char Config_Ac_Duty(unsigned char fd, unsigned char targetAddr, unsigne
         chksum ^= tx[6 + idx];
     tx[7] = chksum;
 
-    if (tranceive(fd, tx, sizeof(tx), rx) > 0)
+    if (tranceiveRelDelayTime(fd, tx, sizeof(tx), rx, 100) > 0)
     {
         chksum = 0x00;
         for (int idx = 0; idx < (rx[4] | rx[5] << 8); idx++)
@@ -1092,7 +1129,8 @@ unsigned char Config_Ac_Duty(unsigned char fd, unsigned char targetAddr, unsigne
         if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
            (rx[2] == tx[1]) &&
            (rx[1] == tx[2]) &&
-           (rx[3] == tx[3]))
+           (rx[3] == tx[3]) &&
+           rx[6] == PASS)
         {
             result = PASS;
         }
@@ -1112,7 +1150,7 @@ unsigned char Config_CSU_Mode(unsigned char fd, unsigned char targetAddr)
         chksum ^= tx[6 + idx];
     tx[7] = chksum;
 
-    if (tranceive(fd, tx, sizeof(tx), rx) > 0)
+    if (tranceiveRelDelayTime(fd, tx, sizeof(tx), rx, 100) > 0)
     {
         chksum = 0x00;
         for (int idx = 0; idx < (rx[4] | rx[5] << 8); idx++)
@@ -1123,7 +1161,8 @@ unsigned char Config_CSU_Mode(unsigned char fd, unsigned char targetAddr)
         if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
            (rx[2] == tx[1]) &&
            (rx[1] == tx[2]) &&
-           (rx[3] == tx[3]))
+           (rx[3] == tx[3]) &&
+           rx[6] == PASS)
         {
             result = PASS;
         }
@@ -1143,7 +1182,7 @@ unsigned char Config_Reset_MCU(unsigned char fd, unsigned char targetAddr)
         chksum ^= tx[6 + idx];
     tx[7] = chksum;
 
-    if (tranceive(fd, tx, sizeof(tx), rx) > 0)
+    if (tranceiveRelDelayTime(fd, tx, sizeof(tx), rx, 100) > 0)
     {
         chksum = 0x00;
         for (int idx = 0; idx < (rx[4] | rx[5] << 8); idx++)
@@ -1154,7 +1193,8 @@ unsigned char Config_Reset_MCU(unsigned char fd, unsigned char targetAddr)
         if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
            (rx[2] == tx[1]) &&
            (rx[1] == tx[2]) &&
-           (rx[3] == tx[3]))
+           (rx[3] == tx[3]) &&
+           rx[6] == PASS)
         {
             result = PASS;
         }
@@ -1176,9 +1216,13 @@ unsigned char Config_Led_Color(unsigned char fd, unsigned char targetAddr, Led_C
         chksum ^= tx[6 + idx];
     tx[13] = chksum;
 
-    if (tranceive(fd, tx, sizeof(tx), rx) > 0)
+    unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
+
+    if(len > 6)
     {
-        chksum = 0x00;
+        if (len < 6+(rx[4] | rx[5]<<8))
+            return result;
+
         for (int idx = 0; idx < (rx[4] | rx[5] << 8); idx++)
         {
             chksum ^= rx[6 + idx];
@@ -1188,7 +1232,7 @@ unsigned char Config_Led_Color(unsigned char fd, unsigned char targetAddr, Led_C
                 (rx[2] == tx[1]) &&
                 (rx[1] == tx[2]) &&
                 (rx[3] == tx[3]) &&
-                rx[6] == PASS)
+                (rx[6] == PASS))
         {
             result = PASS;
         }

+ 1 - 0
EVSE/Projects/DW30/Apps/kill.sh

@@ -8,4 +8,5 @@ pkill Module_PsuComm
 pkill Module_4g
 pkill Module_Wifi
 pkill OcppBackend
+pkill Module_ProduceUtils
 pkill main

文件差異過大導致無法顯示
+ 573 - 48
EVSE/Projects/DW30/Apps/main.c


+ 10 - 1
EVSE/Projects/DW30/Apps/timeout.h

@@ -32,6 +32,8 @@
 #include <ctype.h>
 #include <ifaddrs.h>
 
+#define CONN_PLUG_TIME_OUT          40
+
 enum Timeout_flag
 {
     Timeout_None =                      0,
@@ -46,7 +48,14 @@ enum Timeout_flag
     Timeout_EvseChargingDet =           8,
     Timeout_EvseCompleteDet =           9,
     Timeout_ForCcsPrechargeDet =        10,
-    Timeout_ReturnToChargingGunDet =    11
+    Timeout_ReturnToChargingGunDet =    11,
+    Timeout_AuthorizingForStop =        12
 };
 
+// for timeout fork
+struct timeval _cmdSubPriority_time;
+unsigned short _connectionTimeout;
+
+// for main
+struct timeval _cmdMainPriority_time;
 #endif /* TIMEOUT_H_ */

二進制
EVSE/Projects/DW30/Images/FactoryDefaultConfig.bin


二進制
EVSE/Projects/DW30/Images/MLO


二進制
EVSE/Projects/DW30/Images/am335x-evm.dtb


二進制
EVSE/Projects/DW30/Images/ramdisk.gz


二進制
EVSE/Projects/DW30/Images/u-boot.img


二進制
EVSE/Projects/DW30/Images/zImage


部分文件因文件數量過多而無法顯示