Просмотр исходного кода

2020.04.21 / TC Hsu

Actions: update DM30 application code to D0.09 version. Which merge from DS60's application code.

Image version    : N/A
Image checksum   : N/A

Hardware PWB P/N : N/A
Hardware Version : N/A

Files:

	modified:   EVSE/Projects/DM30/Apps/Config.h
	modified:   EVSE/Projects/DM30/Apps/FactoryConfig.c
	modified:   EVSE/Projects/DM30/Apps/Module_EvComm.c
	modified:   EVSE/Projects/DM30/Apps/Module_EventLogging.c
	modified:   EVSE/Projects/DM30/Apps/Module_InternalComm.c
	modified:   EVSE/Projects/DM30/Apps/Module_LcmControl.c
	modified:   EVSE/Projects/DM30/Apps/Module_LcmControl.h
	modified:   EVSE/Projects/DM30/Apps/Module_PrimaryComm.c
	modified:   EVSE/Projects/DM30/Apps/Module_PsuComm.c
	modified:   EVSE/Projects/DM30/Apps/main.c
TC_Hsu 4 лет назад
Родитель
Сommit
56f4bdb9f2

+ 20 - 39
EVSE/Projects/DM30/Apps/Config.h

@@ -11,24 +11,6 @@ typedef unsigned char           byte;
 
 #define TOTAL_QUANTITY_GUN          4   //Max Count
 
-#ifdef DEBUG_OPTION
-
-    #if (DEBUG_OPTION == 1)
-
-        #define DEBUG               1
-
-    #else
-
-        #define DEBUG               0
-
-    #endif
-
-#else
-
-    #define DEBUG                   0
-
-#endif
-
 #define MODE_BOOT                   0
 #define MODE_IDLE                   1
 #define MODE_AUTHORIZING            2
@@ -99,14 +81,14 @@ enum _LCM_INDEX
 {
     _LCM_INIT                           = 0x00,
     _LCM_IDLE                           = 0x01,
-    _LCM_AUTHORIZING                    = 0x04,
-    _LCM_AUTHORIZ_COMP                  = 0x05,
-    _LCM_AUTHORIZ_FAIL                  = 0x06,
-    _LCM_WAIT_FOR_PLUG                  = 0x07,
-    _LCM_PRE_CHARGE                     = 0x08,
-    _LCM_CHARGING                       = 0x09,
-    _LCM_COMPLETE                       = 0x0A,
-    _LCM_FIX                            = 0x0B,
+    _LCM_AUTHORIZING                    = 0x02,
+    _LCM_AUTHORIZ_COMP                  = 0x03,
+    _LCM_AUTHORIZ_FAIL                  = 0x04,
+    _LCM_WAIT_FOR_PLUG                  = 0x05,
+    _LCM_PRE_CHARGE                     = 0x06,
+    _LCM_CHARGING                       = 0x07,
+    _LCM_COMPLETE                       = 0x08,
+    _LCM_FIX                            = 0x09,
     _LCM_NONE                           = 0xFF,
 };
 
@@ -126,9 +108,7 @@ enum _MODULE_PSU_WORK_STEP
     GET_PSU_COUNT                       = 1,
     GET_SYS_CAP                         = 2,
     BOOTING_COMPLETE                    = 3,
-
     _WORK_CHARGING                      = 10,
-
     _NO_WORKING                         = 254,
     _INIT_PSU_STATUS                    = 255,
 };
@@ -143,17 +123,17 @@ enum _OFFLINE_POLICY
 
 enum _REASSIGNED_RESOURCE_STEP
 {
-    _REASSIGNED_NONE =              0,  //
-    _REASSIGNED_PREPARE_M_TO_A =    1,  // 系統收到需要降載需求 (輸出總電流降低),PSU Task 收到將狀態切換至下個狀態
-    _REASSIGNED_GET_NEW_CAP =       2,  // 充電中的重新取得屬於自己火線上的總能量並透過小板通知車端 - 超過10秒直接跳下一步
-    _REASSIGNED_ADJUST_M_TO_A =     3,  // 模塊重新分配完成
-    _REASSIGNED_RELAY_M_TO_A =      4,  // 切斷橋接的 Relay
-
-    _REASSIGNED_PREPARE_A_TO_M =    11,
-    _REASSIGNED_ADJUST_A_TO_M =     12, // 模塊升壓
-    _REASSIGNED_RELAY_A_TO_M =      13, // 搭接橋接的 Relay
-    _REASSIGNED_WAITING =           14,
-    _REASSIGNED_COMP =              15,
+    _REASSIGNED_NONE                    = 0,  //
+    _REASSIGNED_PREPARE_M_TO_A          = 1,  // 系統收到需要降載需求 (輸出總電流降低),PSU Task 收到將狀態切換至下個狀態
+    _REASSIGNED_GET_NEW_CAP             = 2,  // 充電中的重新取得屬於自己火線上的總能量並透過小板通知車端 - 超過10秒直接跳下一步
+    _REASSIGNED_ADJUST_M_TO_A           = 3,  // 模塊重新分配完成
+    _REASSIGNED_RELAY_M_TO_A            = 4,  // 切斷橋接的 Relay
+
+    _REASSIGNED_PREPARE_A_TO_M          = 11,
+    _REASSIGNED_ADJUST_A_TO_M           = 12, // 模塊升壓
+    _REASSIGNED_RELAY_A_TO_M            = 13, // 搭接橋接的 Relay
+    _REASSIGNED_WAITING                 = 14,
+    _REASSIGNED_COMP                    = 15,
 };
 
 enum _MAIN_CHARGING_MODE
@@ -166,6 +146,7 @@ enum _EXTRA_ERR_PROCESS
 {
     _EXTRA_ERR_PROCESS_NONE             = 0,
     _EXTRA_ERR_PROCESS_INUVP            = 1,
+    _EXTRA_ERR_PROCESS_INOVP            = 2,
 };
 
 #endif /* CONFIG_H_ */

+ 6 - 2
EVSE/Projects/DM30/Apps/FactoryConfig.c

@@ -103,7 +103,7 @@ int main(int argc,char *argv[])
      */
     //********** System **********// udhcpc -i eth1 -s ./dhcp_script/eth1.script
     //
-    strcpy((char *)SysConfig.ModelName, "DMYE301E00E2PH");
+    strcpy((char *)SysConfig.ModelName, "DMYE301E00W2PH");
     strcpy((char *)SysConfig.SerialNumber, "");
 
     memset(SysConfig.SystemId, 0x00, sizeof(SysConfig.SystemId));
@@ -122,6 +122,10 @@ int main(int argc,char *argv[])
     SysConfig.Ccs1PlugInTime = 0;
     SysConfig.Ccs2PlugInTimes = 0;
     SysConfig.ChademoPlugInTimes = 0;
+    SysConfig.BillingData.isBilling = 0;
+    SysConfig.isAPP = 1;
+    SysConfig.isQRCode = 1;
+    SysConfig.isRFID = 1;
     //********** Charging **********//
     SysConfig.MaxChargingEnergy = 0;
     SysConfig.MaxChargingCurrent = 65;      // 最大可輸出電流
@@ -169,7 +173,7 @@ int main(int argc,char *argv[])
     strcpy((char *)SysConfig.chargePointVendor, "Phihong Technology");
     //********** Backend **********//
     SysConfig.BackendConnTimeout = 300; //300 seconds
-    SysConfig.OfflinePolicy = OFF_POLICY_LOCALLIST;
+    SysConfig.OfflinePolicy = OFF_POLICY_FREE;
     SysConfig.OfflineMaxChargeEnergy = 0;
     SysConfig.OfflineMaxChargeDuration = 0;
     strcpy((char *) SysConfig.OcppServerURL, "");

+ 23 - 4
EVSE/Projects/DM30/Apps/Module_EvComm.c

@@ -900,6 +900,7 @@ void CANReceiver()
         int nbytes;
         struct can_frame frame;
         int intCmd;
+
         // 槍資訊
         struct ChargingInfoData *_chargingData[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
         struct timeval _cmd_ack_timeout[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
@@ -1007,6 +1008,11 @@ void CANReceiver()
                                 PRINTF_FUNC("CCS FW = %s \n", ShmCcsData->V2GMessage_DIN70121[_chargingData[targetGun]->type_index].version);
                             }
                         }
+
+                        if (targetGun == 1)
+                            memcpy(ShmSysConfigAndInfo->SysInfo.Connector1FwRev, frame.data, ARRAY_SIZE(frame.data));
+                        else
+                            memcpy(ShmSysConfigAndInfo->SysInfo.Connector2FwRev, frame.data, ARRAY_SIZE(frame.data));
                     }
                         break;
                     case ACK_EV_HW_VERSION:
@@ -1178,10 +1184,10 @@ void SetPresentChargingOutputPower(struct ChargingInfoData *chargingData_1, stru
     //PRINTF_FUNC("***********************f cur - 1 = %f \n", chargingData_2->PresentChargingCurrent);
 
     vol1 = chargingData_1->FireChargingVoltage;
-    cur1 = chargingData_1->PresentChargingCurrent;
+    cur1 = (chargingData_1->PresentChargingCurrent * 10);
 
     vol2 = chargingData_2->FireChargingVoltage;
-    cur2 = chargingData_2->PresentChargingCurrent;
+    cur2 = (chargingData_2->PresentChargingCurrent * 10);
 
     SetPresentOutputPower(vol1, cur1, vol2, cur2);
 }
@@ -1426,6 +1432,7 @@ int main(int argc, char *argv[])
                     _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)
@@ -1527,7 +1534,13 @@ int main(int argc, char *argv[])
                         //PRINTF_FUNC("To EV_%d GFD = %d \n",   _index, _chargingData[_index]->GroundFaultStatus);
                         if(_chargingData[_index]->GroundFaultStatus != GFD_WAIT)
                         {
-                            SetIsolationStatus(_index, _chargingData[_index]->GroundFaultStatus, _chargingData[_index]->Evboard_id);
+                            unsigned char _result = _chargingData[_index]->GroundFaultStatus;
+
+                            if (_result == GFD_WARNING)
+                            {
+                                _result = GFD_PASS;
+                            }
+                            SetIsolationStatus(_index, _result, _chargingData[_index]->Evboard_id);
                         }
 
                         if(_chargingData[_index]->SystemStatus == S_CCS_PRECHARGE_ST0 &&
@@ -1553,7 +1566,13 @@ int main(int argc, char *argv[])
 
                         if (passTime > 0)
                         {
-                            _chargingData[_index]->PresentChargedEnergy += (_chargingData[_index]->PresentChargingPower) * passTime / 3600;
+                            float changingPow = (_chargingData[_index]->PresentChargingPower) * passTime / 3600;
+                            if (ShmSysConfigAndInfo->SysConfig.BillingData.isBilling)
+                            {
+                                _chargingData[_index]->ChargingFee += changingPow * ShmSysConfigAndInfo->SysConfig.BillingData.Cur_fee;
+                            }
+
+                            _chargingData[_index]->PresentChargedEnergy += changingPow;
                             chargingTime[_index] = _chargingData[_index]->RemainChargingDuration;
                         }
                     }

+ 1 - 1
EVSE/Projects/DM30/Apps/Module_EventLogging.c

@@ -256,7 +256,7 @@ int main(void)
         }
 
         //check Alarm Status
-        for(ByteCount=0;ByteCount<12;ByteCount++)
+        for(ByteCount=0;ByteCount<13;ByteCount++)
         {
             if(ShmStatusCodeData->AlarmCode.AlarmEvents.AlarmVal[ByteCount] != ShmStatusCodeData->AlarmCode.PreviousAlarmVal[ByteCount])
             {

+ 38 - 55
EVSE/Projects/DM30/Apps/Module_InternalComm.c

@@ -48,7 +48,7 @@ struct CHAdeMOData              *ShmCHAdeMOData;
 struct CcsData                  *ShmCcsData;
 struct PsuData                  *ShmPsuData;
 
-#define VIN_MAX_VOLTAGE     250 // 大於該值 : OVP
+#define VIN_MAX_VOLTAGE     277 // 大於該值 : OVP
 #define VIN_MIN_VOLTAGE     150 // 小於該值 : UVP
 #define VIN_DROP_VOLTAGE    150 // 小於該值 : ac drop
 
@@ -333,54 +333,21 @@ void GetPresentInputVol()
             ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL3InputUVP = NO;
 
         //********************************************************************************************************//
-        // VIN > 250
+        // VIN > 277
         if (inputVoltage.L1N_L12 > VIN_MAX_VOLTAGE)
-        {
-            //ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputOVP = 0x01;
-        }
+            ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputOVP = YES;
+        else
+            ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputOVP = NO;
+
         if (inputVoltage.L2N_L23 > VIN_MAX_VOLTAGE)
-        {
-            //ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL2InputOVP = 0x01;
-        }
-        if (inputVoltage.L3N_L31 > VIN_MAX_VOLTAGE)
-        {
-            //ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL3InputOVP = 0x01;
-        }
-        //********************************************************************************************************//
-        // VIN < 150
-        if (inputVoltage.L1N_L12 < VIN_DROP_VOLTAGE)
-        {
-            //ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputDrop = 0x01;
-        }
-        if (inputVoltage.L2N_L23 < VIN_DROP_VOLTAGE)
-        {
-            //ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL2InputDrop = 0x01;
-        }
-        if (inputVoltage.L3N_L31 < VIN_DROP_VOLTAGE)
-        {
-            //ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL3InputDrop = 0x01;
-        }
+            ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL2InputOVP = YES;
+        else
+            ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL2InputOVP = NO;
 
-        //********************************************************************************************************//
-        // 150 <= VIN < 160
-//      if (inputVoltage.L1N_L12 >= VIN_MIN_VOLTAGE && inputVoltage.L1N_L12 <= VIN_LOW_VOLTAGE)
-//      {
-//          ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputUVP = 0x00;
-//          ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputOVP = 0x00;
-//          ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputDrop = 0x00;
-//      }
-//      if (inputVoltage.L2N_L23 >= VIN_MIN_VOLTAGE && inputVoltage.L2N_L23 <= VIN_LOW_VOLTAGE)
-//      {
-//          ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL2InputUVP = 0x00;
-//          ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL2InputOVP = 0x00;
-//          ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL2InputDrop = 0x00;
-//      }
-//      if (inputVoltage.L3N_L31 >= VIN_MIN_VOLTAGE && inputVoltage.L3N_L31 <= VIN_LOW_VOLTAGE)
-//      {
-//          ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL3InputUVP = 0x00;
-//          ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL3InputOVP = 0x00;
-//          ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL3InputDrop = 0x00;
-//      }
+        if (inputVoltage.L3N_L31 > VIN_MAX_VOLTAGE)
+            ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL3InputOVP = YES;
+        else
+            ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL3InputOVP = NO;
     }
 }
 
@@ -540,7 +507,7 @@ void GetGfdAdc()
         {
             if (_chargingData[i]->Type == 9)
             {
-                if (_chargingData[i]->PresentChargingVoltage >= VOUT_MIN_VOLTAGE)
+                if ((_chargingData[i]->PresentChargingVoltage * 10) >= VOUT_MIN_VOLTAGE)
                     _chargingData[i]->GroundFaultStatus = GFD_PASS;
                 continue;
             }
@@ -574,7 +541,7 @@ void GetGfdAdc()
 //                  PRINTF_FUNC("GFD Result. index = %d, Result = %d, R = %d, Vol = %d \n",
 //                      i, _chargingData[i]->GroundFaultStatus, gfd_adc.Resister_conn2, gfd_adc.voltage_conn2);
                 }
-        }
+            }
         }
     }
 }
@@ -811,7 +778,7 @@ void SetK1K2RelayStatus(byte index)
     }
     else if ((_chargingData[index]->SystemStatus >= S_TERMINATING && _chargingData[index]->SystemStatus <= S_COMPLETE))
     {
-        if (_chargingData[index]->PresentChargingCurrent <= SEFETY_SWITCH_RELAY_CUR)
+        if ((_chargingData[index]->PresentChargingCurrent * 10) <= SEFETY_SWITCH_RELAY_CUR)
         {
             if (_chargingData[index]->Evboard_id == 0x01)
             {
@@ -877,6 +844,16 @@ void SetK1K2RelayStatus(byte index)
     }
 }
 
+void CheckAcInputOvpStatus(byte index)
+{
+    if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputOVP == YES ||
+            ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL2InputOVP == YES ||
+            ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL3InputOVP == YES)
+    {
+        _chargingData[index]->StopChargeFlag = YES;
+    }
+}
+
 void CheckPhaseLossStatus(byte index)
 {
     if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputUVP == YES ||
@@ -1159,7 +1136,7 @@ void Initialization()
         {
             if (!FindChargingInfoData(_index, &_chargingData[0]))
             {
-                DEBUG_ERROR("EvComm (main) : FindChargingInfoData false \n");
+                DEBUG_ERROR("EvComm : FindChargingInfoData false \n");
                 isPass = false;
                 break;
             }
@@ -1333,9 +1310,9 @@ void CheckOutputVolNoneMatchFire(byte index)
                 if ((GetTimeoutValue(_checkOutputNoneMatchTimer[index]) / 1000) >= 5000)
                 {
                     PRINTF_FUNC("[Module_InternalComm]CheckOutputVolNoneMatchFire NG (%d) : pre = %f, fire = %f \n",
-                            index, _chargingData[index]->PresentChargingVoltage, _chargingData[index]->FireChargingVoltage);
+                            index, (_chargingData[index]->PresentChargingVoltage * 10), _chargingData[index]->FireChargingVoltage);
                     DEBUG_ERROR("[Module_InternalComm]CheckOutputVolNoneMatchFire NG (%d): pre = %f, fire = %f \n",
-                            index, _chargingData[index]->PresentChargingVoltage, _chargingData[index]->FireChargingVoltage);
+                            index, (_chargingData[index]->PresentChargingVoltage * 10), _chargingData[index]->FireChargingVoltage);
                     _chargingData[index]->StopChargeFlag = YES;
                 }
             }
@@ -1349,7 +1326,7 @@ void CheckRelayWeldingStatus(byte index)
 {
     if (!_isRelayWelding[index])
     {
-        if (_chargingData[index]->PresentChargingVoltage >= VOUT_MIN_VOLTAGE)
+        if ((_chargingData[index]->PresentChargingVoltage * 10) >= VOUT_MIN_VOLTAGE * 10)
         {
             gettimeofday(&_checkRelayWeldingTimer[index], NULL);
             _isRelayWelding[index] = YES;
@@ -1445,7 +1422,6 @@ int main(void)
     if(Config_Relay_Output(Uart5Fd, Addr.Relay, &outputRelay) != PASS)
         PRINTF_FUNC("Config_Relay_Output fail \n");
 
-    bool printRelayStatus = true;
     for(;;)
     {
         bool isCharging = false;
@@ -1492,6 +1468,8 @@ int main(void)
                 if (ShmSysConfigAndInfo->SysConfig.PhaseLossPolicy == YES)
                     CheckPhaseLossStatus(i);
 
+                CheckAcInputOvpStatus(i);
+
                 if (_chargingData[i]->SystemStatus == S_IDLE)
                 {
                     _chargingData[i]->RelayWeldingCheck = NO;
@@ -1506,9 +1484,15 @@ int main(void)
                     _chargingData[i]->IsReadyToCharging = YES;
                     isCharging = true;
 
+                    // 限定只有在槍類別為 GBT 的時候才做 relay welding 的判斷
+                    if (_chargingData[i]->Type == _Type_GB)
+                    {
                     if (_chargingData[i]->SystemStatus >= S_PREPARING_FOR_EVSE &&
                             _chargingData[i]->RelayWeldingCheck == NO)
                         CheckRelayWeldingStatus(i);
+                    }
+                    else
+                        _chargingData[i]->RelayWeldingCheck = YES;
 
                     if (_chargingData[i]->SystemStatus == S_CHARGING)
                     {
@@ -1577,7 +1561,6 @@ int main(void)
                             regRelay.relay_event.bits.Gun1_Parallel_P,
                             regRelay.relay_event.bits.Gun1_Parallel_N);
                 }
-                printRelayStatus = true;
             }
         }
 

+ 209 - 74
EVSE/Projects/DM30/Apps/Module_LcmControl.c

@@ -1,5 +1,7 @@
 #include "Module_LcmControl.h"
 
+bool needReloadQr = true;
+
 void PRINTF_FUNC(char *string, ...);
 
 int StoreLogMsg(const char *fmt, ...);
@@ -479,13 +481,33 @@ void ChangeBattMapAndValue(short page, int soc)
     if (page == _LCM_CHARGING)
     {
         if (soc < 20)
+        {
+            if (_battery_display_ani)
+                ChangeDisplay2Value(__batt_map, _battery_empty);
+            else
             ChangeDisplay2Value(__batt_map, _battery_cap_20);
+        }
         else if (soc >= 20 && soc < 40)
+        {
+            if (_battery_display_ani)
+                ChangeDisplay2Value(__batt_map, _battery_cap_20);
+            else
             ChangeDisplay2Value(__batt_map, _battery_cap_40);
+        }
         else if (soc >= 40 && soc < 60)
+        {
+            if (_battery_display_ani)
+                ChangeDisplay2Value(__batt_map, _battery_cap_40);
+            else
             ChangeDisplay2Value(__batt_map, _battery_cap_60);
+        }
         else if (soc >= 60 && soc < 80)
+        {
+            if (_battery_display_ani)
+                ChangeDisplay2Value(__batt_map, _battery_cap_60);
+            else
             ChangeDisplay2Value(__batt_map, _battery_cap_80);
+        }
         else if (soc >= 80 && soc <= 100)
             ChangeDisplay2Value(__batt_map, _battery_cap_100);
     }
@@ -540,7 +562,10 @@ void ChangeChargingEnergyValue(float energy)
     byte value[10];
 
     memset(cmd, 0x00, sizeof(cmd));
-
+    if(energy > 0.05)
+    {
+        energy -= 0.05;
+    }
     sprintf((char *) value, "%.1f kWh", energy);
     string2ByteArray(value, cmd);
     DisplayValueToLcm(__total_out_eng_tx, cmd, sizeof(cmd));
@@ -556,15 +581,45 @@ void ChangeChargingPowerValue(float pow)
 //  float min = 0.0;
 //  float max = 50;
 //  pow = (max - min) * rand() / (RAND_MAX + 1.0) + min;
-
     sprintf((char *) value, "%.1f kW", pow);
     string2ByteArray(value, cmd);
     DisplayValueToLcm(__output_eng_tx, cmd, sizeof(cmd));
 }
 
-void ChangeStopMap(byte value)
+void ChangeChargingFeeValue(float fee)
 {
+    byte cmd[10];
+    byte value[10];
 
+    memset(cmd, 0x00, sizeof(cmd));
+
+    sprintf((char *) value, "%.2f", fee);
+    string2ByteArray(value, cmd);
+    DisplayValueToLcm(__charging_fee_tx, cmd, sizeof(cmd));
+}
+
+void DisplayMoneyRate(float money)
+{
+    byte cmd[8];
+    byte value[8];
+
+    memset(cmd, 0x00, sizeof(cmd));
+
+    sprintf((char *) value, "%.2f", money);
+    string2ByteArray(value, cmd);
+    DisplayValueToLcm(__money_by_rate, cmd, sizeof(cmd));
+}
+
+void DisplayMoneyCur(byte *cur)
+{
+    byte cmd[5];
+    byte buf[5];
+
+    *(cur + 3) = '\0';
+    memset(cmd, 0x00, sizeof(cmd));
+    sprintf((char *) buf, "%s", cur);
+    string2ByteArray(buf, cmd);
+    DisplayValueToLcm(__money_rate, cmd, sizeof(cmd));
 }
 
 void RefreshPageAnimation(byte value)
@@ -573,20 +628,7 @@ void RefreshPageAnimation(byte value)
     {
         case _LCM_IDLE:
         {
-            if (value == 0)
-            {
-                ChangeToOtherPage(_currentPage);
-            }
-            else if (value == 15)
-            {
-                ChangeToOtherPage(_currentPage + 1);
-            }
-            else if (value == 30)
-            {
-                ChangeToOtherPage(_currentPage + 2);
-            }
 
-            _everyPageRollChange > 45 ? _everyPageRollChange = 0 : _everyPageRollChange++;
         }
             break;
         case _LCM_WAIT_FOR_PLUG:
@@ -623,51 +665,6 @@ void RefreshPageAnimation(byte value)
                     ChangeDisplay2Value(__conn_line_comp, _complete_map);
             }
 
-            if (_totalCount == 2 && _currentPage != _LCM_PRE_CHARGE)
-            {
-                byte index = 0;
-                for (index = 0; index < _totalCount; index++) {
-                    if (ShmSysConfigAndInfo->SysInfo.CurGunSelected != index)
-                    {
-                        break;
-                    }
-                }
-
-                ChangeDisplay2Value(__sel_gun_btn, _sel_gun_btn);
-                if (_chargingInfoData[index]->SystemStatus == S_IDLE ||
-                        _chargingInfoData[index]->SystemStatus == S_RESERVATION)
-                {
-                    if(value == 0)
-                    {
-                        ChangeDisplay2Value(__side_top, _side_rfid_1);
-                        ChangeDisplay2Value(__side_down, _side_rfid_2);
-                    }
-                    else if (value == 15)
-                    {
-                        ChangeDisplay2Value(__side_top, _side_qr_1);
-                        ChangeDisplay2Value(__side_down, _side_qr_2);
-                    }
-                    else if (value == 30)
-                    {
-                        ChangeDisplay2Value(__side_top, _side_app_1);
-                        ChangeDisplay2Value(__side_down, _side_app_2);
-                    }
-                }
-                else
-                {
-                    ChangeDisplay2Value(__side_top, _disappear);
-                    ChangeDisplay2Value(__side_down, _disappear);
-                    ChangeDisplay2Value(__qr_code_pre, _disappear);
-                }
-            }
-            else
-            {
-                ChangeDisplay2Value(__sel_gun_btn, _disappear);
-                ChangeDisplay2Value(__side_top, _disappear);
-                ChangeDisplay2Value(__side_down, _disappear);
-                ChangeDisplay2Value(__qr_code_pre, _disappear);
-            }
-
             _everyPageRollChange >= 45 ? _everyPageRollChange = 0 : _everyPageRollChange++;
         }
             break;
@@ -708,20 +705,97 @@ void RefreshConnStatus()
         ChangeDisplay2Value(__conn_status, _disconnect);
 }
 
+byte FirstPageChanged()
+{
+    byte result = NO;
+
+    if (_currentPage != _oldPage)
+    {
+        result = YES;
+        _oldPage = _currentPage;
+    }
+
+    return result;
+}
+
 void ProcessPageInfo()
 {
     switch(_currentPage)
     {
         case _LCM_IDLE:
         {
-            // QR Code 處理
-            ChangeQrCode_Idle("http://google.com.tw");
+            if (ShmSysConfigAndInfo->SysConfig.isRFID)
+                ChangeDisplay2Value(__main_rfid, _main_rfid);
+            else
+                ChangeDisplay2Value(__main_rfid, _main_none_rfid);
+
+            if (ShmSysConfigAndInfo->SysConfig.isQRCode)
+                ChangeDisplay2Value(__main_qr, _main_qr);
+            else
+            {
+                ChangeDisplay2Value(__qr_code, _disappear);
+                ChangeDisplay2Value(__main_qr, _main_none_qr);
+                needReloadQr = true;
+            }
+
+            if (ShmSysConfigAndInfo->SysConfig.isAPP)
+                ChangeDisplay2Value(__main_app, _main_app);
+            else
+                ChangeDisplay2Value(__main_app, _main_none_app);
+
+            if (FirstPageChanged() == YES || needReloadQr)
+            {
+                if (ShmSysConfigAndInfo->SysConfig.isQRCode)
+                {
+                    needReloadQr = false;
+                    ChangeQrCode_Idle("http://google.com.tw");
+                }
+            }
+        }
+            break;
+        case _LCM_AUTHORIZING:
+        case _LCM_AUTHORIZ_COMP:
+        case _LCM_AUTHORIZ_FAIL:
+        case _LCM_WAIT_FOR_PLUG:
+        {
+            FirstPageChanged();
         }
             break;
         case _LCM_PRE_CHARGE:
         case _LCM_CHARGING:
         case _LCM_COMPLETE:
         {
+            if (_totalCount == 2)
+            {
+                ChangeDisplay2Value(__sel_gun_btn, _sel_gun_btn);
+
+                if (ShmSysConfigAndInfo->SysConfig.isRFID)
+                    ChangeDisplay2Value(__side_top, _side_rfid);
+                else
+                    ChangeDisplay2Value(__side_top, _side_none_rfid);
+
+                if (ShmSysConfigAndInfo->SysConfig.isQRCode)
+                    ChangeDisplay2Value(__side_mid, _side_qr);
+                else
+                {
+                    ChangeDisplay2Value(__qr_code_pre, _disappear);
+                    ChangeDisplay2Value(__side_mid, _side_none_qr);
+                    needReloadQr = true;
+                }
+
+                if (ShmSysConfigAndInfo->SysConfig.isAPP)
+                    ChangeDisplay2Value(__side_down, _side_app);
+                else
+                    ChangeDisplay2Value(__side_down, _side_none_app);
+            }
+            else
+            {
+                ChangeDisplay2Value(__side_top, _disappear);
+                ChangeDisplay2Value(__side_mid, _disappear);
+                ChangeDisplay2Value(__side_down, _disappear);
+                ChangeDisplay2Value(__sel_gun_btn, _disappear);
+            }
+
             // gun type and charging info
             for(byte i = 0; i < _totalCount; i++)
             {
@@ -743,11 +817,11 @@ void ProcessPageInfo()
                     {
                         if (ShmSysConfigAndInfo->SysInfo.CurGunSelected == i)
                         {
-                            ChangeDisplay2Value(__gun_type_index + (i * 2), _chademo_light);
+                            ChangeDisplay2Value(__gun_type_index + (i * 2), _gbt_light);
                         }
                         else
                         {
-                            ChangeDisplay2Value(__gun_type_index + (i * 2), _chademo_dark);
+                            ChangeDisplay2Value(__gun_type_index + (i * 2), _gbt_dark);
                         }
                     }
                         break;
@@ -772,10 +846,16 @@ void ProcessPageInfo()
                         ChangeBattMapAndValue(_LCM_CHARGING, _chargingInfoData[i]->EvBatterySoc);
                         if (_chargingInfoData[i]->RemainChargingDuration >= 0)
                             ChangeRemainTime(_chargingInfoData[i]->RemainChargingDuration);
+                        else
+                            ChangeRemainTime(0);
                         if (_chargingInfoData[i]->PresentChargingPower >= 0)
                             ChangeChargingPowerValue(_chargingInfoData[i]->PresentChargingPower);
-                        if (_chargingInfoData[i]->PresentChargedEnergy >= 0)
+                        else
+                            ChangeChargingPowerValue(0);
+                        if (_chargingInfoData[i]->PresentChargedEnergy >= 0.1)
                             ChangeChargingEnergyValue(_chargingInfoData[i]->PresentChargedEnergy);
+                        else
+                            ChangeChargingEnergyValue(0);
 
                         if (strcmp((char *)_chargingInfoData[i]->StartUserId, "") == 0)
                             ChangeDisplay2Value(__stop_method_btn, _stop_charging_btn);
@@ -790,16 +870,34 @@ void ProcessPageInfo()
                         ChangeBattMapAndValue(_LCM_COMPLETE, _chargingInfoData[i]->EvBatterySoc);
                         if (_chargingInfoData[i]->RemainChargingDuration >= 0)
                             ChangeRemainTime(_chargingInfoData[i]->RemainChargingDuration);
+                        else
+                            ChangeRemainTime(0);
                         if (_chargingInfoData[i]->PresentChargingPower >= 0)
                             ChangeChargingPowerValue(_chargingInfoData[i]->PresentChargingPower);
-                        if (_chargingInfoData[i]->PresentChargedEnergy >= 0)
+                        else
+                            ChangeChargingPowerValue(0);
+
+                        if (_chargingInfoData[i]->PresentChargedEnergy >= 0.1)
+                        {
                             ChangeChargingEnergyValue(_chargingInfoData[i]->PresentChargedEnergy);
+
+                            if (ShmSysConfigAndInfo->SysConfig.BillingData.isBilling &&
+                                _chargingInfoData[i]->ChargingFee >= 0)
+                            {
+                                ChangeChargingFeeValue(_chargingInfoData[i]->ChargingFee);
+                            }
+                        }
+                        else
+                        {
+                            ChangeChargingEnergyValue(0);
+                            ChangeChargingFeeValue(0);
+                        }
                     }
                 }
             }
 
             // gun btn and QR code
-            if (_totalCount == 2 && _currentPage != _LCM_PRE_CHARGE)
+            if (_totalCount == 2 && _currentPage)
             {
                 byte index = 0;
                 for(index = 0; index < _totalCount; index++)
@@ -814,8 +912,14 @@ void ProcessPageInfo()
                         _chargingInfoData[index]->SystemStatus == S_RESERVATION ||
                         _chargingInfoData[index]->SystemStatus == S_BOOTING)
                 {
-                    // QR Code 處理
-                    ChangeQrCode_Charge("http://google.com.tw");
+                    if (FirstPageChanged() == YES || needReloadQr)
+                    {
+                        if (ShmSysConfigAndInfo->SysConfig.isQRCode)
+                        {
+                            needReloadQr = false;
+                            ChangeQrCode_Charge("http://google.com.tw");
+                        }
+                    }
                 }
             }
         }
@@ -823,10 +927,37 @@ void ProcessPageInfo()
     }
 }
 
-void Initialization()
+void ChangeDisplayMoneyInfo()
 {
-    //strcpy((char *)ShmSysConfigAndInfo->SysInfo.LcmHwRev, moduleName);
+    if (ShmSysConfigAndInfo->SysConfig.BillingData.isBilling)
+    {
+        struct timeb csuTime;
+        struct tm *tmCSU;
+
+        ftime(&csuTime);
+        tmCSU = localtime(&csuTime.time);
+
+        ChangeDisplay2Value(__money_rate_map, _charging_money);
+
+        if (tmCSU->tm_hour <= 23)
+        {
+            ShmSysConfigAndInfo->SysConfig.BillingData.Cur_fee = ShmSysConfigAndInfo->SysConfig.BillingData.Fee[tmCSU->tm_hour];
+            DisplayMoneyRate(ShmSysConfigAndInfo->SysConfig.BillingData.Cur_fee);
+        }
 
+        if (ShmSysConfigAndInfo->SysConfig.BillingData.Currency <= 53)
+            DisplayMoneyCur((byte *)Currency[ShmSysConfigAndInfo->SysConfig.BillingData.Currency]);
+    }
+    else
+    {
+        ChangeDisplay2Value(__money_rate_map, _disappear);
+        ChangeDisplay2Value(__money_by_rate, _disappear);
+        ChangeDisplay2Value(__money_rate, _disappear);
+    }
+}
+
+void Initialization()
+{
     bool isPass = false;
     byte count = 5;
     while(!isPass && count > 0)
@@ -870,8 +1001,8 @@ int main(void)
     _totalCount = ShmSysConfigAndInfo->SysConfig.TotalConnectorCount;
     Initialization();
 
-//  ChangeToOtherPage(_LCM_FIX);
-//  return 0;
+    //ChangeToOtherPage(_LCM_INIT);
+    //return 0;
 
     while(_port != -1)
     {
@@ -914,6 +1045,10 @@ int main(void)
 
             RefreshPageAnimation(_everyPageRollChange);
 
+            if (changeWarningPriority == 0)
+                ChangeDisplayMoneyInfo();
+
+            changeWarningPriority >= 15 ? (_battery_display_ani = true) : (_battery_display_ani = false);
             changeWarningPriority >= 30 ? changeWarningPriority = 0 : changeWarningPriority++;
             usleep(100000);
         }

+ 52 - 31
EVSE/Projects/DM30/Apps/Module_LcmControl.h

@@ -60,10 +60,12 @@ struct ChargingInfoData *_chargingInfoData[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_
 
 // 當前選擇的槍號
 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;
 
 // LCM - HW
 byte _everyPageRollChange = 0;
@@ -75,17 +77,21 @@ short __sel_gun_btn = 0x0040;
 short __ret_home_btn = 0x0042;
 short __stop_method_btn = 0x0044;
 
-short __qr_code = 0x0050;
+short __qr_code = 0x0250;
+short __main_rfid = 0x0052;
+short __main_qr = 0x0054;
+short __main_app = 0x0056;
 
 short __plug_in_arrow = 0x0060;
 
 short __conn_line = 0x0066;
 
 short __gun_type_index = 0x0070;
-short __qr_code_pre = 0x0080;
+short __qr_code_pre = 0x0280;
 
 short __side_top = 0x0090;
 short __side_down = 0x0092;
+short __side_mid = 0x0094;
 
 short __conn_line_chag = 0x0096;
 short __batt_map = 0x0100;
@@ -97,6 +103,11 @@ short __remain_time_tx = 0x0110;
 short __output_eng_tx = 0x0120;
 short __total_out_eng_tx = 0x0130;
 short __conn_line_comp = 0x0140;
+short __charging_fee_tx = 0x0150;
+
+short __money_by_rate = 0x0200;
+short __money_rate = 0x0220;
+short __money_rate_map = 0x0230;
 
 // ICON ID
 byte _disappear = 0;
@@ -118,32 +129,42 @@ byte _stop_charging_btn = 15;
 byte _stop_charging_btn_scan = 16;
 byte _chademo_dark = 17;
 byte _ccs_dark = 18;
-byte _actype_dark = 19;
-byte _chademo_light = 20;
-byte _ccs_light = 21;
-byte _actype_light = 22;
-byte _side_rfid_1 = 23;
-byte _side_qr_1 = 24;
-byte _side_app_1 = 25;
-byte _side_rfid_2 = 26;
-byte _side_qr_2 = 27;
-byte _side_app_2 = 28;
-byte _charging_map1 = 29;
-byte _charging_map2 = 30;
-byte _battery_cap_20 = 31;
-byte _battery_cap_40 = 32;
-byte _battery_cap_60 = 33;
-byte _battery_cap_80 = 34;
-byte _battery_cap_100 = 35;
-byte _battery_map = 36;
-byte _power_map = 37;
-byte _time_map = 38;
-byte _complete_map = 39;
-byte _battery_soc_20 = 40;
-byte _battery_soc_40 = 41;
-byte _battery_soc_60 = 42;
-byte _battery_soc_80 = 43;
-byte _battery_soc_100 = 44;
-byte _battery_eng_map = 45;
-byte _money_map = 46;
-byte _elapse_time_map = 47;
+byte _gbt_dark = 19;
+byte _actype_dark = 20;
+byte _chademo_light = 21;
+byte _ccs_light = 22;
+byte _gbt_light = 23;
+byte _actype_light = 24;
+byte _main_none_rfid = 25;
+byte _main_rfid = 26;
+byte _main_none_app = 27;
+byte _main_app = 28;
+byte _main_none_qr = 29;
+byte _main_qr = 30;
+byte _charging_map1 = 31;
+byte _charging_map2 = 32;
+byte _battery_empty = 33;
+byte _battery_cap_20 = 34;
+byte _battery_cap_40 = 35;
+byte _battery_cap_60 = 36;
+byte _battery_cap_80 = 37;
+byte _battery_cap_100 = 38;
+byte _battery_map = 39;
+byte _power_map = 40;
+byte _time_map = 41;
+byte _complete_map = 42;
+byte _battery_soc_20 = 43;
+byte _battery_soc_40 = 44;
+byte _battery_soc_60 = 45;
+byte _battery_soc_80 = 46;
+byte _battery_soc_100 = 47;
+byte _battery_eng_map = 48;
+byte _money_map = 49;
+byte _elapse_time_map = 50;
+byte _charging_money = 51;
+byte _side_none_rfid = 52;
+byte _side_rfid = 53;
+byte _side_none_app = 54;
+byte _side_app = 55;
+byte _side_none_qr = 56;
+byte _side_qr = 57;

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

@@ -290,9 +290,13 @@ void SetOutputGpio(byte flash)
     gpio.AC_Breaker = 0x00;
 
     if (Config_Gpio_Output(Uart1Fd, Addr.IoExtend, &gpio) == PASS)
-        PRINTF_FUNC("SetOutputGpio sucessfully. %d \n", flash);
+    {
+        //PRINTF_FUNC("SetOutputGpio sucessfully. %d \n", flash);
+    }
     else
-        PRINTF_FUNC("SetOutputGpio fail. \n");
+    {
+        //PRINTF_FUNC("SetOutputGpio fail. \n");
+    }
 }
 
 void SetRtcData()
@@ -327,9 +331,13 @@ void SetRtcData()
     rtc.RtcData[13] = '0' + (tmCSU->tm_sec) / 1 % 10;
 
     if (Config_Rtc_Data(Uart1Fd, Addr.IoExtend, &rtc) == PASS)
-        PRINTF_FUNC("SetRtc sucessfully. \n");
+    {
+        //PRINTF_FUNC("SetRtc sucessfully. \n");
+    }
     else
-        PRINTF_FUNC("SetRtc fail. \n");
+    {
+        //PRINTF_FUNC("SetRtc fail. \n");
+    }
 }
 
 //================================================
@@ -419,10 +427,12 @@ int main(void)
         }
         else
         {
-            if (flash == NO)
+            if ((GetTimeoutValue(_flash_time) / 1000) > 5000)
             {
                 flash = YES;
+
                 SetOutputGpio(flash);
+                gettimeofday(&_flash_time, NULL);
             }
         }
 

+ 19 - 19
EVSE/Projects/DM30/Apps/Module_PsuComm.c

@@ -907,12 +907,12 @@ int main(void)
                                     chargingInfo[gunIndex]->FireChargingVoltage);
                         }
 
-                        if (chargingInfo[gunIndex]->PresentChargingCurrent > 0 &&
-                            evseOutCur != chargingInfo[gunIndex]->PresentChargingCurrent)
+                        if ((chargingInfo[gunIndex]->PresentChargingCurrent * 10) > 0 &&
+                            evseOutCur != (chargingInfo[gunIndex]->PresentChargingCurrent * 10))
                         {
-                            evseOutCur = chargingInfo[gunIndex]->PresentChargingCurrent;
+                            evseOutCur = (chargingInfo[gunIndex]->PresentChargingCurrent * 10);
                             PRINTF_FUNC("groupIndex = %d, evse output cur = %f \n", gunIndex,
-                                chargingInfo[gunIndex]->PresentChargingCurrent);
+                                (chargingInfo[gunIndex]->PresentChargingCurrent * 10));
                         }
                     }
 
@@ -925,7 +925,7 @@ int main(void)
                     GetModuleOutput(groupIndex);
                     // 針對各槍當前狀態,傳送需要回傳的資料指令
                     if (((chargingInfo[groupIndex]->SystemStatus >= S_PREPARING_FOR_EVSE && chargingInfo[groupIndex]->SystemStatus <= S_CHARGING) && chargingInfo[groupIndex]->RelayK1K2Status) ||
-                            chargingInfo[groupIndex]->SystemStatus >= S_PREPARING_FOR_EVSE ||
+                            (chargingInfo[groupIndex]->SystemStatus >= S_PREPARING_FOR_EVSE && chargingInfo[groupIndex]->Type == _Type_GB) ||
                             (chargingInfo[groupIndex]->SystemStatus >= S_CCS_PRECHARGE_ST0 && chargingInfo[groupIndex]->SystemStatus <= S_CCS_PRECHARGE_ST1))
                     {
                         if (chargingInfo[groupIndex]->EvBatterytargetVoltage > 0 &&
@@ -974,13 +974,13 @@ int main(void)
                                 if (chargingInfo[groupIndex]->AvailableChargingCurrent < chargingInfo[groupIndex]->EvBatterytargetCurrent)
                         {
                                     PRINTF_FUNC("** _REASSIGNED_ADJUST_M_TO_A ** Gun_%d, AvailableChargingCurrent = %f, EvBatterytargetCurrent = %f \n", groupIndex,
-                                            chargingInfo[groupIndex]->PresentChargingCurrent,
+                                            (chargingInfo[groupIndex]->PresentChargingCurrent * 10),
                                             chargingInfo[groupIndex]->AvailableChargingCurrent);
                                     for (byte subIndex = 0; subIndex < ShmPsuData->GroupCount; subIndex++)
                                     {
                                         if (chargingInfo[subIndex]->SystemStatus == S_REASSIGN)
                                         {
-                                            if (chargingInfo[subIndex]->PresentChargingCurrent <= CHK_CUR_RANGE)
+                                            if ((chargingInfo[subIndex]->PresentChargingCurrent * 10) <= CHK_CUR_RANGE)
                                                 isChanged = true;
                                             break;
                                         }
@@ -988,14 +988,14 @@ int main(void)
 
                                     // 這狀況下輸出端的電流載滿載衝的狀況下,並不會降電流
                                     // 所以只能拉載到該槍端的最大輸出能力
-                                    if (chargingInfo[groupIndex]->PresentChargingCurrent >= chargingInfo[groupIndex]->AvailableChargingCurrent - CHK_CUR_RANGE ||
-                                            chargingInfo[groupIndex]->PresentChargingCurrent <= CHK_CUR_RANGE)
+                                    if ((chargingInfo[groupIndex]->PresentChargingCurrent * 10)>= chargingInfo[groupIndex]->AvailableChargingCurrent - CHK_CUR_RANGE ||
+                                            (chargingInfo[groupIndex]->PresentChargingCurrent * 10) <= CHK_CUR_RANGE)
                                     {
                                         isChanged = true;
                                     }
                                 }
-                                else if ((chargingInfo[groupIndex]->PresentChargingCurrent >= ShmPsuData->PsuGroup[groupIndex].GroupPresentOutputCurrent - CHK_CUR_RANGE) &&
-                                        (chargingInfo[groupIndex]->PresentChargingCurrent <= ShmPsuData->PsuGroup[groupIndex].GroupPresentOutputCurrent + CHK_CUR_RANGE))
+                                else if (((chargingInfo[groupIndex]->PresentChargingCurrent * 10) >= ShmPsuData->PsuGroup[groupIndex].GroupPresentOutputCurrent - CHK_CUR_RANGE) &&
+                                        ((chargingInfo[groupIndex]->PresentChargingCurrent * 10) <= ShmPsuData->PsuGroup[groupIndex].GroupPresentOutputCurrent + CHK_CUR_RANGE))
                                 {
                                     isChanged = true;
                                 }
@@ -1003,7 +1003,7 @@ int main(void)
                                 if (isChanged)
                                 {
                                     PRINTF_FUNC("** _REASSIGNED_ADJUST_M_TO_A ** Gun_%d, PresentChargingCurrent = %f, GroupPresentOutputCurrent = %d \n", groupIndex,
-                                        chargingInfo[groupIndex]->PresentChargingCurrent,
+                                        (chargingInfo[groupIndex]->PresentChargingCurrent * 10),
                                         ShmPsuData->PsuGroup[groupIndex].GroupPresentOutputCurrent);
 
                                     // 輸出端與車端要求電流接近
@@ -1025,8 +1025,8 @@ int main(void)
                                     chargingInfo[groupIndex]->EvBatterytargetCurrent);
 
                                 PRINTF_FUNC("Gun_%d OutputVol = %f, OutputCur = %f \n", groupIndex,
-                                        chargingInfo[groupIndex]->PresentChargingVoltage,
-                                chargingInfo[groupIndex]->PresentChargingCurrent);
+                                        (chargingInfo[groupIndex]->PresentChargingVoltage * 10),
+                                        (chargingInfo[groupIndex]->PresentChargingCurrent * 10));
 
                                 gettimeofday(&_test_time, NULL);
                         }
@@ -1124,8 +1124,8 @@ int main(void)
                                             ((chargingInfo[subIndex]->PresentChargingVoltage * 10) < chargingInfo[groupIndex]->EvBatterytargetVoltage - CHK_VOL_RANGE))
                                         {
                                             PRINTF_FUNC("** _REASSIGNED_ADJUST_A_TO_M ** Gun_%d, PresentChargingVoltage = %f, PresentChargingVoltage_V = %f, EvBatterytargetVoltage = %f \n", subIndex,
-                                                chargingInfo[subIndex]->PresentChargingVoltage,
-                                                (chargingInfo[groupIndex]->PresentChargingVoltage - ZERO_VOLTAGE),
+                                                (chargingInfo[subIndex]->PresentChargingVoltage * 10),
+                                                ((chargingInfo[groupIndex]->PresentChargingVoltage * 10) - ZERO_VOLTAGE),
                                                 (chargingInfo[groupIndex]->EvBatterytargetVoltage - CHK_VOL_RANGE));
                                             balanceVol = false;
                                         }
@@ -1165,8 +1165,8 @@ int main(void)
                                     chargingInfo[groupIndex]->EvBatterytargetCurrent);
 
                                 PRINTF_FUNC("Gun_%d OutputVol = %f, OutputCur = %f \n", groupIndex,
-                                    chargingInfo[groupIndex]->PresentChargingVoltage,
-                                    chargingInfo[groupIndex]->PresentChargingCurrent);
+                                    (chargingInfo[groupIndex]->PresentChargingVoltage * 10),
+                                    (chargingInfo[groupIndex]->PresentChargingCurrent * 10));
 
                                 gettimeofday(&_test_time, NULL);
                             }
@@ -1239,7 +1239,7 @@ int main(void)
                                         ShmSysConfigAndInfo->SysInfo.ReAssignedFlag <= _REASSIGNED_RELAY_M_TO_A)
                                 {
                                     // 代表在切換的過程中,停止充電了
-                                    if (chargingInfo[groupIndex]->PresentChargingCurrent <= STOP_CURRENT)
+                                    if ((chargingInfo[groupIndex]->PresentChargingCurrent * 10) <= STOP_CURRENT)
                                         ShmSysConfigAndInfo->SysInfo.ReAssignedFlag = _REASSIGNED_RELAY_M_TO_A;
                                 }
                             }

+ 120 - 41
EVSE/Projects/DM30/Apps/main.c

@@ -109,7 +109,7 @@ bool isCardScan = false;
 
 int rfidFd = -1;
 char* rfidPortName = "/dev/ttyS2";
-char* fwVersion = "D0.06.00.00.00.00";
+char* fwVersion = "D0.09.00.0000.00";
 
 //================================================
 // initial can-bus
@@ -1024,12 +1024,8 @@ void GetFirmwareVersion()
             ShmSysConfigAndInfo->SysInfo.CsuRootFsFwRev[9] = '0';
             break;
     }
-
-    // Get rating power from model name
-    memcpy(&ShmSysConfigAndInfo->SysInfo.CsuRootFsFwRev[10], &ShmSysConfigAndInfo->SysConfig.ModelName[4], 0x01);
-
     // Get rating power from model name
-    memcpy(&ShmSysConfigAndInfo->SysInfo.CsuRootFsFwRev[12], &ShmSysConfigAndInfo->SysConfig.ModelName[5], 0x02);
+    memcpy(&ShmSysConfigAndInfo->SysInfo.CsuRootFsFwRev[10], &ShmSysConfigAndInfo->SysConfig.ModelName[4], 0x03);
 }
 
 void InitialShareMemoryInfo()
@@ -1120,22 +1116,28 @@ void InitialShareMemoryInfo()
     char EvsePower[2];
 
     EvsePower[2] = '\0';
+    unsigned short buf_pow = 0;
     if (strlen((char *) ShmSysConfigAndInfo->SysConfig.ModelName) >= 6)
     {
         strncpy(EvsePower, (char *)(ShmSysConfigAndInfo->SysConfig.ModelName + 4), 2);
         if (strcmp(EvsePower, "15") == EQUAL)
-            ShmSysConfigAndInfo->SysConfig.MaxChargingPower = 150;
+            buf_pow = 150;
         else if (strcmp(EvsePower, "30") == EQUAL)
-            ShmSysConfigAndInfo->SysConfig.MaxChargingPower = 30;
+            buf_pow = 30;
         else if (strcmp(EvsePower, "60") == EQUAL)
-            ShmSysConfigAndInfo->SysConfig.MaxChargingPower = 60;
+            buf_pow = 60;
         else if (strcmp(EvsePower, "18") == EQUAL)
-            ShmSysConfigAndInfo->SysConfig.MaxChargingPower = 180;
+            buf_pow = 180;
         else if (strcmp(EvsePower, "36") == EQUAL)
-            ShmSysConfigAndInfo->SysConfig.MaxChargingPower = 360;
+            buf_pow = 360;
+
+        if(ShmSysConfigAndInfo->SysConfig.MaxChargingPower == 0 ||
+                ShmSysConfigAndInfo->SysConfig.MaxChargingPower > buf_pow)
+            ShmSysConfigAndInfo->SysConfig.MaxChargingPower = buf_pow;
 
         ShmSysConfigAndInfo->SysConfig.RatingCurrent = (ShmSysConfigAndInfo->SysConfig.MaxChargingPower / 30) * 100;
     }
+    ShmSysConfigAndInfo->SysConfig.SwitchDebugFlag = NO;
 }
 
 int Initialization()
@@ -1800,6 +1802,9 @@ void RecordAlarmCode(char *code)
     if (strcmp(code, "012288") == 0) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CcsOutputUVPFail = YES;
     if (strcmp(code, "012289") == 0) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.ChademoOutputUVPFail = YES;
     if (strcmp(code, "012290") == 0) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.GbtOutputUVPFail = YES;
+    if (strcmp(code, "012296") == 0) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.ChademoGroundWarning = YES;
+    if (strcmp(code, "012297") == 0) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CcsGroundfaultWarning = YES;
+    if (strcmp(code, "012298") == 0) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.GbGroundfaultWarning = YES;
 }
 
 void ReleaseAlarmCode(byte gunIndex)
@@ -1809,21 +1814,31 @@ void ReleaseAlarmCode(byte gunIndex)
         ShmStatusCodeData->AlarmCode.AlarmEvents.bits.ChademoGfdTrip = NO;
         ShmStatusCodeData->AlarmCode.AlarmEvents.bits.ChademoOutputUVPFail = NO;
         ShmStatusCodeData->FaultCode.FaultEvents.bits.ChademoOutputRelayWelding = NO;
+        ShmStatusCodeData->AlarmCode.AlarmEvents.bits.ChademoGroundWarning = NO;
     }
     else if (chargingInfo[gunIndex]->Type == _Type_GB)
     {
         ShmStatusCodeData->AlarmCode.AlarmEvents.bits.GbGfdTrip = NO;
         ShmStatusCodeData->AlarmCode.AlarmEvents.bits.GbtOutputUVPFail = NO;
         ShmStatusCodeData->FaultCode.FaultEvents.bits.GbOutputRelayWelding = NO;
+        ShmStatusCodeData->AlarmCode.AlarmEvents.bits.GbGroundfaultWarning = NO;
     }
     else if (chargingInfo[gunIndex]->Type == _Type_CCS_2)
     {
         ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CcsGfdTrip = NO;
         ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CcsOutputUVPFail = NO;
         ShmStatusCodeData->FaultCode.FaultEvents.bits.CcsOutputRelayWelding = NO;
+        ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CcsGroundfaultWarning = NO;
     }
 }
 
+void CleanAlarmCodeByString(char *code)
+{
+    if (strcmp(code, "012296") == 0) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.ChademoGroundWarning = NO;
+    if (strcmp(code, "012297") == 0) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.CcsGroundfaultWarning = NO;
+    if (strcmp(code, "012298") == 0) ShmStatusCodeData->AlarmCode.AlarmEvents.bits.GbGroundfaultWarning = NO;
+}
+
 //===============================================
 // EmergencyStop and Charging Stop
 //===============================================
@@ -1980,28 +1995,6 @@ void ChkPrimaryStatus()
         {
             leftBtnPush = true;
             PRINTF_FUNC("left btn down............................... \n");
-            if (ShmSysConfigAndInfo->SysInfo.CurGunSelected + 1 < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount)
-                ShmSysConfigAndInfo->SysInfo.CurGunSelected += 1;
-            else
-                ShmSysConfigAndInfo->SysInfo.CurGunSelected = 0;
-        }
-        // 左邊的選槍按鈕,只有在雙槍都在充電時候才有用 : 30KW 以下該按鈕無作用
-    }
-    else if (ShmPrimaryMcuData->InputDet.bits.Button1 == BTN_RELEASE)
-    {
-        if(leftBtnPush)
-        {
-            leftBtnPush = false;
-            PRINTF_FUNC("left btn up............................... \n");
-        }
-    }
-
-    if (ShmPrimaryMcuData->InputDet.bits.Button2 == BTN_PRESS && !rightBtnPush)
-    {
-        if(!rightBtnPush)
-        {
-            rightBtnPush = true;
-            PRINTF_FUNC("right btn down............................... %d \n", ShmSysConfigAndInfo->SysInfo.CurGunSelected);
             switch(chargingInfo[ShmSysConfigAndInfo->SysInfo.CurGunSelected]->SystemStatus)
             {
             case S_IDLE:
@@ -2042,6 +2035,27 @@ void ChkPrimaryStatus()
             }
         }
     }
+    else if (ShmPrimaryMcuData->InputDet.bits.Button1 == BTN_RELEASE)
+    {
+        if(leftBtnPush)
+        {
+            leftBtnPush = false;
+            PRINTF_FUNC("left btn up............................... \n");
+        }
+    }
+
+    if (ShmPrimaryMcuData->InputDet.bits.Button2 == BTN_PRESS && !rightBtnPush)
+    {
+        if(!rightBtnPush)
+        {
+            rightBtnPush = true;
+            PRINTF_FUNC("right btn down............................... %d \n", ShmSysConfigAndInfo->SysInfo.CurGunSelected);
+            if (ShmSysConfigAndInfo->SysInfo.CurGunSelected + 1 < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount)
+                ShmSysConfigAndInfo->SysInfo.CurGunSelected += 1;
+            else
+                ShmSysConfigAndInfo->SysInfo.CurGunSelected = 0;
+        }
+    }
     else if (ShmPrimaryMcuData->InputDet.bits.Button2 == BTN_RELEASE)
     {
         if(rightBtnPush)
@@ -2102,6 +2116,25 @@ void CheckErrorOccurStatus(byte index)
             }
         }
     }
+
+    if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL1InputOVP == YES ||
+            ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL2InputOVP == YES ||
+            ShmStatusCodeData->AlarmCode.AlarmEvents.bits.SystemL3InputOVP == YES)
+    {
+        if (ShmSysConfigAndInfo->SysWarningInfo.ExtraErrProcess == _EXTRA_ERR_PROCESS_NONE)
+        {
+            ShmSysConfigAndInfo->SysWarningInfo.ExtraErrProcess = _EXTRA_ERR_PROCESS_INOVP;
+            StopChargingProcessByString(2);
+        }
+    }
+    else
+    {
+        if (ShmSysConfigAndInfo->SysWarningInfo.ExtraErrProcess == _EXTRA_ERR_PROCESS_INOVP)
+        {
+            ShmSysConfigAndInfo->SysWarningInfo.ExtraErrProcess = _EXTRA_ERR_PROCESS_NONE;
+            ReleaseChargingProcessByString(2);
+        }
+    }
 }
 
 //===============================================
@@ -3870,6 +3903,11 @@ int main(void)
                             // GFD 錯誤停止
                             RecordAlarmCode("012234");
                         }
+                        else if (chargingInfo[gun_index]->GroundFaultStatus == GFD_WARNING)
+                        {
+                            // GFD 警告
+                            RecordAlarmCode("012296");
+                        }
                     }
                     else if (chargingInfo[gun_index]->Type == _Type_GB)
                     {
@@ -3884,11 +3922,17 @@ int main(void)
                             // GFD 錯誤停止
                             RecordAlarmCode("012236");
                         }
+                        else if (chargingInfo[gun_index]->GroundFaultStatus == GFD_WARNING)
+                        {
+                            // GFD 警告
+                            RecordAlarmCode("012298");
+                        }
                     }
                     else if (chargingInfo[gun_index]->Type == _Type_CCS_2)
                     {
                         // 檢查樁端的 GFD 結果
-                        if (chargingInfo[gun_index]->GroundFaultStatus == GFD_PASS)
+                        if (chargingInfo[gun_index]->GroundFaultStatus == GFD_PASS ||
+                            chargingInfo[gun_index]->GroundFaultStatus == GFD_WARNING)
                         {
                             setChargerMode(gun_index, MODE_CCS_PRECHARGE_STEP0);
                         }
@@ -3898,6 +3942,11 @@ int main(void)
                             // GFD 錯誤停止
                             RecordAlarmCode("012235");
                         }
+                        else if (chargingInfo[gun_index]->GroundFaultStatus == GFD_WARNING)
+                        {
+                            // GFD 警告
+                            RecordAlarmCode("012297");
+                        }
                     }
 
                     if (isEvBoardStopChargeFlag(gun_index) == YES ||
@@ -3933,8 +3982,18 @@ int main(void)
                             // GFD 錯誤停止
                             RecordAlarmCode("012234");
                         }
-                        else if ((chargingInfo[gun_index]->EvBatterytargetVoltage > 0 && chargingInfo[gun_index]->EvBatterytargetVoltage < SYSTEM_MIN_VOL) ||
-                                (chargingInfo[gun_index]->RemainChargingDuration >= 10 && chargingInfo[gun_index]->PresentChargingVoltage < SYSTEM_MIN_VOL))
+                        else if (chargingInfo[gun_index]->GroundFaultStatus == GFD_WARNING)
+                        {
+                            // GFD 警告
+                            RecordAlarmCode("012296");
+                        }
+                        else
+                        {
+                            CleanAlarmCodeByString("012296");
+                        }
+
+                        if ((chargingInfo[gun_index]->EvBatterytargetVoltage > 0 && chargingInfo[gun_index]->EvBatterytargetVoltage < SYSTEM_MIN_VOL) ||
+                            (chargingInfo[gun_index]->RemainChargingDuration >= 10 && chargingInfo[gun_index]->PresentChargingVoltage < SYSTEM_MIN_VOL))
                         {
                             // UVP
                             RecordAlarmCode("012289");
@@ -3948,9 +4007,19 @@ int main(void)
                             // GFD 錯誤停止
                             RecordAlarmCode("012236");
                         }
-                        else if (isPrechargeStatus_gb(gun_index) == 10 &&
-                                ((chargingInfo[gun_index]->EvBatterytargetVoltage > 0 && chargingInfo[gun_index]->EvBatterytargetVoltage < SYSTEM_MIN_VOL) ||
-                                (chargingInfo[gun_index]->RemainChargingDuration >= 10 && chargingInfo[gun_index]->PresentChargingVoltage < SYSTEM_MIN_VOL)))
+                        else if (chargingInfo[gun_index]->GroundFaultStatus == GFD_WARNING)
+                        {
+                            // GFD 警告
+                            RecordAlarmCode("012298");
+                        }
+                        else
+                        {
+                            CleanAlarmCodeByString("012298");
+                        }
+
+                        if (isPrechargeStatus_gb(gun_index) == 10 &&
+                            ((chargingInfo[gun_index]->EvBatterytargetVoltage > 0 && chargingInfo[gun_index]->EvBatterytargetVoltage < SYSTEM_MIN_VOL) ||
+                             (chargingInfo[gun_index]->RemainChargingDuration >= 10 && chargingInfo[gun_index]->PresentChargingVoltage < SYSTEM_MIN_VOL)))
                         {
                             // UVP
                             RecordAlarmCode("012290");
@@ -3964,8 +4033,18 @@ int main(void)
                             // GFD 錯誤停止
                             RecordAlarmCode("012235");
                         }
-                        else if ((chargingInfo[gun_index]->EvBatterytargetVoltage > 0 && chargingInfo[gun_index]->EvBatterytargetVoltage < SYSTEM_MIN_VOL) ||
-                                (chargingInfo[gun_index]->RemainChargingDuration >= 10 && chargingInfo[gun_index]->PresentChargingVoltage < SYSTEM_MIN_VOL))
+                        else if (chargingInfo[gun_index]->GroundFaultStatus == GFD_WARNING)
+                        {
+                            // GFD 警告
+                            RecordAlarmCode("012297");
+                        }
+                        else
+                        {
+                            CleanAlarmCodeByString("012297");
+                        }
+
+                        if ((chargingInfo[gun_index]->EvBatterytargetVoltage > 0 && chargingInfo[gun_index]->EvBatterytargetVoltage < SYSTEM_MIN_VOL) ||
+                            (chargingInfo[gun_index]->RemainChargingDuration >= 10 && chargingInfo[gun_index]->PresentChargingVoltage < SYSTEM_MIN_VOL))
                         {
                             // UVP
                             RecordAlarmCode("012288");