Эх сурвалжийг харах

2021.03.30 / Jerry Wang

Actions:
1. Add support for 023979 and 023983 status code handles.

Files:
1. As foloow as commit history.
Jerry_Wang 4 жил өмнө
parent
commit
9e07080592
27 өөрчлөгдсөн 160 нэмэгдсэн , 114 устгасан
  1. 40 40
      EVSE/Projects/DD360/Apps/Module_EvComm.c
  2. 2 2
      EVSE/Projects/DD360/Apps/ReMain.c
  3. 38 15
      EVSE/Projects/DD360/Apps/ReModule_EvComm.c
  4. BIN
      EVSE/Projects/DD360/Images/ramdisk.gz
  5. BIN
      EVSE/Projects/DD360/output/DoComm
  6. BIN
      EVSE/Projects/DD360/output/FactoryConfig
  7. BIN
      EVSE/Projects/DD360/output/Module_EvComm
  8. BIN
      EVSE/Projects/DD360/output/Module_EventLogging
  9. BIN
      EVSE/Projects/DD360/output/Module_InternalComm
  10. BIN
      EVSE/Projects/DD360/output/Module_LcmControl
  11. BIN
      EVSE/Projects/DD360/output/Module_PrimaryComm
  12. BIN
      EVSE/Projects/DD360/output/ReadCmdline
  13. BIN
      EVSE/Projects/DD360/output/main
  14. 40 40
      EVSE/Projects/DD360Audi/Apps/Module_EvComm.c
  15. 2 2
      EVSE/Projects/DD360Audi/Apps/ReMain.c
  16. 38 15
      EVSE/Projects/DD360Audi/Apps/ReModule_EvComm.c
  17. BIN
      EVSE/Projects/DD360Audi/Apps/UnsafetyOutputTask
  18. BIN
      EVSE/Projects/DD360Audi/Images/ramdisk.gz
  19. BIN
      EVSE/Projects/DD360Audi/output/DoComm
  20. BIN
      EVSE/Projects/DD360Audi/output/FactoryConfig
  21. BIN
      EVSE/Projects/DD360Audi/output/Module_EvComm
  22. BIN
      EVSE/Projects/DD360Audi/output/Module_EventLogging
  23. BIN
      EVSE/Projects/DD360Audi/output/Module_InternalComm
  24. BIN
      EVSE/Projects/DD360Audi/output/Module_LcmControl
  25. BIN
      EVSE/Projects/DD360Audi/output/Module_PrimaryComm
  26. BIN
      EVSE/Projects/DD360Audi/output/ReadCmdline
  27. BIN
      EVSE/Projects/DD360Audi/output/main

+ 40 - 40
EVSE/Projects/DD360/Apps/Module_EvComm.c

@@ -17,12 +17,12 @@
 
 #include    <unistd.h>
 #include    <stdarg.h>
-#include    <stdio.h>      /*標準輸入輸出定義*/
-#include    <stdlib.h>     /*標準函數庫定義*/
-#include    <unistd.h>     /*Unix 標準函數定義*/
-#include    <fcntl.h>      /*檔控制定義*/
-#include    <termios.h>    /*PPSIX 終端控制定義*/
-#include    <errno.h>      /*錯誤號定義*/
+#include    <stdio.h>      /*璅蹱�頛詨�頛詨枂摰𡁶儔*/
+#include    <stdlib.h>     /*璅蹱��賣彍摨怠�蝢�*/
+#include    <unistd.h>     /*Unix 璅蹱��賣彍摰𡁶儔*/
+#include    <fcntl.h>      /*瑼娍綉�嗅�蝢�*/
+#include    <termios.h>    /*PPSIX 蝯�垢�批�摰𡁶儔*/
+#include    <errno.h>      /*�航炊�笔�蝢�*/
 #include    <errno.h>
 #include    <string.h>
 #include    <time.h>
@@ -61,16 +61,16 @@ float _outCur_1 = 0;
 float _outVol_2 = 0;
 float _outCur_2 = 0;
 
-// 限制最大充電電壓,因應不同 type 槍線來限制
+// �𣂼���憭批��駁𤓖憯橒��䭾�銝滚� type 瑽滨�靘����
 // Chademo : 500V, 125A,
 // GB : 750, 120A
 // CCS : 950V, 120A
-float maxChargingVol[2] = { 5000, 9500 };           // 限制最大充電電壓,如依照模塊則填上 0
-// 限制最大充電電流與能量透過 Web
-float maxChargingCur[2] = { 5000, 1200 };           // 限制最大充電電流,如依照模塊則填上 0
-float maxChargingPow = 0;                           // 限制最大充電能量,如依照模塊則填上 0
+float maxChargingVol[2] = { 5000, 9500 };           // �𣂼���憭批��駁𤓖憯橒�憒���扳芋憛𠰴�憛思� 0
+// �𣂼���憭批��駁𤓖瘚���賡��誯� Web
+float maxChargingCur[2] = { 5000, 1200 };           // �𣂼���憭批��駁𤓖瘚��憒���扳芋憛𠰴�憛思� 0
+float maxChargingPow = 0;                           // �𣂼���憭批��餉��𧶏�憒���扳芋憛𠰴�憛思� 0
 
-// 槍資訊
+// 瑽滩�閮�
 struct ChargingInfoData *_chargingData[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
 
 struct Ev_Board_Cmd Ev_Cmd = {
@@ -2142,7 +2142,7 @@ void CANReceiver()
         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];
 
@@ -2355,7 +2355,7 @@ void CANReceiver()
                 }
                 break;
                 case NOTIFICATION_EV_STOP: {
-                    // 車端要求停止
+                    // 頠羓垢閬���𨀣迫
                     // frame.data[0] : 0x01 => normal stop, 0x02 => ev emergency stop
                     PRINTF_FUNC("(%d) NOTIFICATION_EV_STOP err level = %d-----------------------------\n", targetGun, frame.data[0]);
                     //if (frame.data[0] == 0x02)
@@ -2378,9 +2378,9 @@ void CANReceiver()
 //================================================
 // Main process
 //================================================
-// 檢查 Byte 中某個 Bit 的值
-// _byte : 欲改變的 byte
-// _bit : 該 byte 的第幾個 bit
+// 瑼X䰻 Byte 銝剜��� Bit ����
+// _byte : 甈脫㺿霈羓� byte
+// _bit : 閰� byte ��洵撟曉�� bit
 unsigned char EvDetectionStatus(unsigned char _byte, unsigned char _bit)
 {
     return ( _byte & mask_table[_bit] ) != 0x00;
@@ -2645,7 +2645,7 @@ int main(int argc, char *argv[])
     while (CanFd) {
         for (byte _index = 0; _index < gun_count; _index++) {
             if (priorityLow == 1) {
-                // 優先權較低 - 只要有回應即不會再詢問
+                // �芸�甈𡃏�雿� - �芾��匧��匧朖銝齿��滩岷��
                 if (_chargingData[_index]->Type == _Type_Chademo &&
                         ShmCHAdeMOData->evse[_chargingData[_index]->type_index].SelfTest_Comp != PASS) {
                     SyncRtcInfo(_index, _chargingData[_index]->Evboard_id, (int)rtc);
@@ -2662,7 +2662,7 @@ int main(int argc, char *argv[])
                     }
                 }
 
-                // 固定要取得的資訊 : 1.槍鎖狀態, 2."Connector 1" 溫度, 3."Connector 2" 溫度, 4.Pilot Voltage
+                // �箏�閬��敺㛖�鞈�� : 1.瑽漤�����, 2."Connector 1" 皞怠漲, 3."Connector 2" 皞怠漲, 4.Pilot Voltage
                 //PRINTF_FUNC("GetMiscellaneousInfo. index = %d, Eid = %d \n", _index, _chargingData[_index]->Evboard_id);
                 GetMiscellaneousInfo(_index,
                                      _chargingData[_index]->RelayK1K2Status,
@@ -2701,7 +2701,7 @@ int main(int argc, char *argv[])
                 }
                 break;
             case S_PREPARNING: {
-                // 設定當前輸出
+                // 閮剖��嗅�頛詨枂
                 if (gun_count == 1) {
                     SetPresentChargingOutputPower(_chargingData[0], _chargingData[0]);
                 } else if (gun_count == 2) {
@@ -2712,7 +2712,7 @@ int main(int argc, char *argv[])
             }
             break;
             case S_PREPARING_FOR_EV: {
-                // 開始確認車端是否同意開始充電 : 1.SOC, 2.Target Vol, 3.Target Cur, 4.Charging remaining time
+                // �见�蝣箄�頠羓垢�臬炏�峕��见���𤓖 : 1.SOC, 2.Target Vol, 3.Target Cur, 4.Charging remaining time
                 GetOutputReq(_index, _chargingData[_index]->Evboard_id);
 
 //                  PRINTF_FUNC("PresentChargingVoltage = %f \n", _chargingData[_index]->PresentChargingVoltage);
@@ -2721,7 +2721,7 @@ int main(int argc, char *argv[])
 //                  PRINTF_FUNC("AvailableChargingCurrent = %f \n", _chargingData[_index]->AvailableChargingCurrent);
 //                  PRINTF_FUNC("MaximumChargingVoltage = %f \n", _chargingData[_index]->MaximumChargingVoltage);
 
-                // 設定當前輸出
+                // 閮剖��嗅�頛詨枂
                 if (gun_count == 1) {
                     SetPresentChargingOutputPower(_chargingData[0], _chargingData[0]);
                 } else if (gun_count == 2) {
@@ -2730,7 +2730,7 @@ int main(int argc, char *argv[])
 
                 if (priorityLow == 1) {
                     float maxVol, maxCur;
-                    // 樁端輸出能力
+                    // 璅�垢頛詨枂�賢�
                     maxVol = _chargingData[_index]->MaximumChargingVoltage;
                     maxCur = _chargingData[_index]->AvailableChargingCurrent;
 
@@ -2746,7 +2746,7 @@ int main(int argc, char *argv[])
                                           maxVol,
                                           _chargingData[_index]->Evboard_id);
 
-                    // 取得車端電池資訊 : 1.AC or DC ? 2.Total battery cap, 3.Max battery vol, 4.Max battery cur
+                    // �硋�頠羓垢�餅�鞈�� : 1.AC or DC ? 2.Total battery cap, 3.Max battery vol, 4.Max battery cur
                     GetEvBatteryInfo(_index, _chargingData[_index]->Evboard_id);
                 }
                 gettimeofday(&_chk_ratingPower_timeout[_index], NULL);
@@ -2755,10 +2755,10 @@ int main(int argc, char *argv[])
             case S_PREPARING_FOR_EVSE:
             case S_CCS_PRECHARGE_ST0:
             case S_CCS_PRECHARGE_ST1: {
-                // 開始確認車端是否同意開始充電
+                // �见�蝣箄�頠羓垢�臬炏�峕��见���𤓖
                 GetOutputReq(_index, _chargingData[_index]->Evboard_id);
 
-                // 設定當前輸出
+                // 閮剖��嗅�頛詨枂
                 if (gun_count == 1) {
                     SetPresentChargingOutputPower(_chargingData[0], _chargingData[0]);
                 } else if (gun_count == 2) {
@@ -2766,16 +2766,16 @@ int main(int argc, char *argv[])
                 }
 
                 if (priorityLow % 5 == 1) {
-                    // 樁端輸出能力改變
+                    // 璅�垢頛詨枂�賢��寡�
                     if (gun_count == 1) {
                         SetPresentChargingOutputCap(_chargingData[0], _chargingData[0]);
                     } else if (gun_count == 2) {
                         SetPresentChargingOutputCap(_chargingData[0], _chargingData[1]);
                     }
                 }
-                // 持續通知 Isolation 測試狀態
+                // ����𡁶䰻 Isolation 皜祈岫����
                 if (priorityLow == 1) {
-                    // 拉 500 V 如果在一秒鐘內 GFD 都符合則 PASS
+                    // �� 500 V 憒���其�蝘㘾��� GFD �賜泵��� PASS
 //                      if (_chargingData[_index]->FireChargingVoltage >= 3500)
 //                          _chargingData[_index]->GroundFaultStatus = GFD_PASS;
 
@@ -2785,7 +2785,7 @@ int main(int argc, char *argv[])
                         //if ((GetTimeoutValue(_derating_time) / 1000) > 1000)
                         unsigned char _result = _chargingData[_index]->GroundFaultStatus;
 
-                        // GB & Chademo ~ Warning 也先算 Pass,因為 CCS 認證會驗 Warning 故不可更動
+                        // GB & Chademo ~ Warning 銋笔�蝞� Pass嚗���� CCS 隤滩���� Warning ����舀凒��
                         if (_chargingData[_index]->Type == _Type_Chademo ||
                                 _chargingData[_index]->Type == _Type_GB) {
                             if (_result == GFD_WARNING) {
@@ -2816,7 +2816,7 @@ int main(int argc, char *argv[])
             }
             break;
             case S_CHARGING: {
-                // 計算 Power
+                // 閮�� Power
                 _chargingData[_index]->PresentChargingPower = ((float)((_chargingData[_index]->PresentChargingVoltage) * (_chargingData[_index]->PresentChargingCurrent)) / 1000);
 
                 if (chargingTime[_index] == 0 ||
@@ -2837,10 +2837,10 @@ int main(int argc, char *argv[])
                     }
                 }
 
-                // 開始確認車端是否同意開始充電
+                // �见�蝣箄�頠羓垢�臬炏�峕��见���𤓖
                 GetOutputReq(_index, _chargingData[_index]->Evboard_id);
 
-                // 設定當前輸出
+                // 閮剖��嗅�頛詨枂
                 if (gun_count == 1) {
                     SetPresentChargingOutputPower(_chargingData[0], _chargingData[0]);
                 } else if (gun_count == 2) {
@@ -2849,7 +2849,7 @@ int main(int argc, char *argv[])
 
                 // for test end
                 if (priorityLow % 5 == 0) {
-                    // 樁端輸出能力改變
+                    // 璅�垢頛詨枂�賢��寡�
                     if (gun_count == 1) {
                         SetPresentChargingOutputCap(_chargingData[0], _chargingData[0]);
                     } else if (gun_count == 2) {
@@ -2863,7 +2863,7 @@ int main(int argc, char *argv[])
                     SetIsolationStatus(_index, _chargingData[_index]->GroundFaultStatus, _chargingData[_index]->Evboard_id);
                 }
 
-                // GFD 失敗再通知
+                // GFD 憭望��漤�𡁶䰻
                 if (priorityLow == 1) {
                     if (_chargingData[_index]->Type == _Type_CCS_2 &&
                             _chargingData[_index]->PrechargeStatus == PRECHARGE_READY) {
@@ -2873,14 +2873,14 @@ int main(int argc, char *argv[])
             }
             break;
             case S_TERMINATING: {
-                // 設定當前輸出
+                // 閮剖��嗅�頛詨枂
                 if (gun_count == 1) {
                     SetPresentChargingOutputPower(_chargingData[0], _chargingData[0]);
                 } else if (gun_count == 2) {
                     SetPresentChargingOutputPower(_chargingData[0], _chargingData[1]);
                 }
 
-                // 槍鎖還在,則代表是樁端要求的停止
+                // 瑽漤���銁嚗��隞�”�舀�蝡航�瘙���𨀣迫
                 if (_chargingData[_index]->GunLocked == START ||
                         _chargingData[_index]->Type == _Type_CCS_2) {
                     byte normalStop = 0x01;
@@ -2901,7 +2901,7 @@ int main(int argc, char *argv[])
             }
             break;
             case S_COMPLETE: {
-                // 設定當前輸出
+                // 閮剖��嗅�頛詨枂
                 if (gun_count == 1) {
                     SetPresentChargingOutputPower(_chargingData[0], _chargingData[0]);
                 } else if (gun_count == 2) {
@@ -2911,7 +2911,7 @@ int main(int argc, char *argv[])
                 if (priorityLow == 1) {
                     float maxVol, maxCur;
 
-                    // 樁端輸出能力
+                    // 璅�垢頛詨枂�賢�
                     maxVol = _chargingData[_index]->MaximumChargingVoltage;
                     maxCur = _chargingData[_index]->AvailableChargingCurrent;
 
@@ -2927,7 +2927,7 @@ int main(int argc, char *argv[])
             }
         }
         priorityLow >= 20 ? priorityLow = 1 : priorityLow++;
-        usleep(45000); //EV 小板通訊 (50 ms)
+        usleep(45000); //EV 撠𤩺踎�朞� (50 ms)
     }
     DEBUG_INFO("Module_EvComm : Can-bus port = %d \n", CanFd);
     return FAIL;

+ 2 - 2
EVSE/Projects/DD360/Apps/ReMain.c

@@ -176,7 +176,7 @@ bool isModelNameMatch = true;
 
 int rfidFd = -1;
 char *rfidPortName = "/dev/ttyS2";
-char *fwVersion = "V1.06.00.0000.00"; // "V0.16.00.0000.00";
+char *fwVersion = "V1.07.00.0000.00"; // "V0.16.00.0000.00";
 
 sqlite3 *localDb;
 bool isDb_ready;
@@ -1906,7 +1906,7 @@ int isEvBoardStopChargeFlag(byte gunIndex)
 
 bool isEvBoardNormalStopChargeFlag(byte gunIndex)
 {
-    return chargingInfo[gunIndex]->UnKnowStopChargeFlag;
+    return chargingInfo[gunIndex]->NormalStopChargeFlag;
 }
 
 //===============================================

+ 38 - 15
EVSE/Projects/DD360/Apps/ReModule_EvComm.c

@@ -1756,6 +1756,16 @@ void ClearAbnormalStatus_CCS(byte gun_index)
             memcpy(code, "023893", 6);
             memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
             isCleanCheck = true;
+        } else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023979", 6) == EQUAL &&
+                   ShmStatusCodeData->InfoCode.InfoEvents.bits.EV_Full_Charging == YES) {
+            memcpy(code, "023979", 6);
+            memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
+            isCleanCheck = true;
+        } else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023983", 6) == EQUAL &&
+                   ShmStatusCodeData->InfoCode.InfoEvents.bits.Stop_by_EV_with_unknow_reason == YES) {
+            memcpy(code, "023983", 6);
+            memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
+            isCleanCheck = true;
         }
     }
 
@@ -1906,6 +1916,9 @@ void ClearAbnormalStatus_CCS(byte gun_index)
                     if (strncmp(code, "023891", 6) == EQUAL) { ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsSeccNotReadyForCharging = NO; }
                     //if (strncmp(code, "023892", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsSeccTimeoutQCA7000Comm = NO;
                     if (strncmp(code, "023893", 6) == EQUAL) { ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsSeccFailForQCA7000SetKey = NO; }
+
+                    if (strncmp(code, "023979", 6) == EQUAL) { ShmStatusCodeData->InfoCode.InfoEvents.bits.EV_Full_Charging = NO; }
+                    if (strncmp(code, "023983", 6) == EQUAL) { ShmStatusCodeData->InfoCode.InfoEvents.bits.Stop_by_EV_with_unknow_reason = NO; }
                 }
             }
         }
@@ -2178,6 +2191,9 @@ bool AbnormalStopAnalysis(byte gun_index, byte *errCode)
     if (strcmp(string, "023976") == EQUAL) { ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BSM_ISOLATE = YES; }
     if (strcmp(string, "023977") == EQUAL) { ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BSM_OUTPUT_CONNECTOR = YES; }
 
+    if (strcmp(string, "023979") == EQUAL) { ShmStatusCodeData->InfoCode.InfoEvents.bits.EV_Full_Charging = YES; }
+    if (strcmp(string, "023983") == EQUAL) { ShmStatusCodeData->InfoCode.InfoEvents.bits.Stop_by_EV_with_unknow_reason = YES; }
+
     return true;
 }
 
@@ -2474,12 +2490,19 @@ void CANReceiver()
                             (_chargingData[targetGun]->SystemStatus >= S_CCS_PRECHARGE_ST0 &&
                              _chargingData[targetGun]->SystemStatus <= S_CCS_PRECHARGE_ST1)) {
                         // frame.data[0] : 0x01 => normal stop, 0x02 => ev emergency stop
-                        PRINTF_FUNC("(%d) NOTIFICATION_EV_STOP err level = %d-----------------------------\n", targetGun, frame.data[0]);
-                        //if (frame.data[0] == 0x02)
-                        {
+                        PRINTF_FUNC("(%d) NOTIFICATION_EV_STOP err level = %d-----------------------------\n",
+                                    targetGun,
+                                    frame.data[0]);
+                        if (frame.data[0] == 0x02) {
+                            if (AbnormalStopAnalysis(targetGun, frame.data + 1) == true) {
+                                _chargingData[targetGun]->StopChargeFlag = YES;
+                            } else {
+                                _chargingData[targetGun]->NormalStopChargeFlag = YES;
+                            }
+                        } else {
                             AbnormalStopAnalysis(targetGun, frame.data + 1);
+                            _chargingData[targetGun]->NormalStopChargeFlag = YES;
                         }
-                        _chargingData[targetGun]->StopChargeFlag = YES;
                     }
                 }
                 break;
@@ -3086,7 +3109,7 @@ int main(int argc, char *argv[])
                     _chargingData[_index]->GroundFaultStatus = GFD_WAIT;
                     _chargingData[_index]->RealRatingPower = 0;
                     _chargingData[_index]->StopChargeFlag = NO;
-                    _chargingData[_index]->UnKnowStopChargeFlag = NO;//DS60-120 add
+                    _chargingData[_index]->NormalStopChargeFlag = NO;//DS60-120 add
                     _chargingData[_index]->ChargingFee = 0.0;
                     _chargingData[_index]->EvBatterySoc = 0;
                     _chargingData[_index]->EvBatteryStartSoc = 0; //DS60-120 add
@@ -3434,16 +3457,16 @@ int main(int argc, char *argv[])
                                           _chargingData[_index]->Evboard_id);
 
                     //DS60-120 add
-                    if (_chargingData[_index]->EvBatterySoc >= 100) {
-                        //滿電,則直接清掉錯誤
-                        if (_chargingData[_index]->Type == _Type_Chademo) {
-                            ClearAbnormalStatus_Chademo(_index);
-                        } else if (_chargingData[_index]->Type == _Type_GB) {
-                            ClearAbnormalStatus_GB(_index);
-                        } else if (_chargingData[_index]->Type == _Type_CCS_2) {
-                            ClearAbnormalStatus_CCS(_index);
-                        }
-                    }
+                    //if (_chargingData[_index]->EvBatterySoc >= 100) {
+                    //    //滿電,則直接清掉錯誤
+                    //    if (_chargingData[_index]->Type == _Type_Chademo) {
+                    //        ClearAbnormalStatus_Chademo(_index);
+                    //    } else if (_chargingData[_index]->Type == _Type_GB) {
+                    //        ClearAbnormalStatus_GB(_index);
+                    //    } else if (_chargingData[_index]->Type == _Type_CCS_2) {
+                    //        ClearAbnormalStatus_CCS(_index);
+                    //    }
+                    //}
                 }
             }
             break;

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


BIN
EVSE/Projects/DD360/output/DoComm


BIN
EVSE/Projects/DD360/output/FactoryConfig


BIN
EVSE/Projects/DD360/output/Module_EvComm


BIN
EVSE/Projects/DD360/output/Module_EventLogging


BIN
EVSE/Projects/DD360/output/Module_InternalComm


BIN
EVSE/Projects/DD360/output/Module_LcmControl


BIN
EVSE/Projects/DD360/output/Module_PrimaryComm


BIN
EVSE/Projects/DD360/output/ReadCmdline


BIN
EVSE/Projects/DD360/output/main


+ 40 - 40
EVSE/Projects/DD360Audi/Apps/Module_EvComm.c

@@ -17,12 +17,12 @@
 
 #include    <unistd.h>
 #include    <stdarg.h>
-#include    <stdio.h>      /*標準輸入輸出定義*/
-#include    <stdlib.h>     /*標準函數庫定義*/
-#include    <unistd.h>     /*Unix 標準函數定義*/
-#include    <fcntl.h>      /*檔控制定義*/
-#include    <termios.h>    /*PPSIX 終端控制定義*/
-#include    <errno.h>      /*錯誤號定義*/
+#include    <stdio.h>      /*璅蹱�頛詨�頛詨枂摰𡁶儔*/
+#include    <stdlib.h>     /*璅蹱��賣彍摨怠�蝢�*/
+#include    <unistd.h>     /*Unix 璅蹱��賣彍摰𡁶儔*/
+#include    <fcntl.h>      /*瑼娍綉�嗅�蝢�*/
+#include    <termios.h>    /*PPSIX 蝯�垢�批�摰𡁶儔*/
+#include    <errno.h>      /*�航炊�笔�蝢�*/
 #include    <errno.h>
 #include    <string.h>
 #include    <time.h>
@@ -61,16 +61,16 @@ float _outCur_1 = 0;
 float _outVol_2 = 0;
 float _outCur_2 = 0;
 
-// 限制最大充電電壓,因應不同 type 槍線來限制
+// �𣂼���憭批��駁𤓖憯橒��䭾�銝滚� type 瑽滨�靘����
 // Chademo : 500V, 125A,
 // GB : 750, 120A
 // CCS : 950V, 120A
-float maxChargingVol[2] = { 5000, 9500 };           // 限制最大充電電壓,如依照模塊則填上 0
-// 限制最大充電電流與能量透過 Web
-float maxChargingCur[2] = { 5000, 1200 };           // 限制最大充電電流,如依照模塊則填上 0
-float maxChargingPow = 0;                           // 限制最大充電能量,如依照模塊則填上 0
+float maxChargingVol[2] = { 5000, 9500 };           // �𣂼���憭批��駁𤓖憯橒�憒���扳芋憛𠰴�憛思� 0
+// �𣂼���憭批��駁𤓖瘚���賡��誯� Web
+float maxChargingCur[2] = { 5000, 1200 };           // �𣂼���憭批��駁𤓖瘚��憒���扳芋憛𠰴�憛思� 0
+float maxChargingPow = 0;                           // �𣂼���憭批��餉��𧶏�憒���扳芋憛𠰴�憛思� 0
 
-// 槍資訊
+// 瑽滩�閮�
 struct ChargingInfoData *_chargingData[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
 
 struct Ev_Board_Cmd Ev_Cmd = {
@@ -2142,7 +2142,7 @@ void CANReceiver()
         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];
 
@@ -2355,7 +2355,7 @@ void CANReceiver()
                 }
                 break;
                 case NOTIFICATION_EV_STOP: {
-                    // 車端要求停止
+                    // 頠羓垢閬���𨀣迫
                     // frame.data[0] : 0x01 => normal stop, 0x02 => ev emergency stop
                     PRINTF_FUNC("(%d) NOTIFICATION_EV_STOP err level = %d-----------------------------\n", targetGun, frame.data[0]);
                     //if (frame.data[0] == 0x02)
@@ -2378,9 +2378,9 @@ void CANReceiver()
 //================================================
 // Main process
 //================================================
-// 檢查 Byte 中某個 Bit 的值
-// _byte : 欲改變的 byte
-// _bit : 該 byte 的第幾個 bit
+// 瑼X䰻 Byte 銝剜��� Bit ����
+// _byte : 甈脫㺿霈羓� byte
+// _bit : 閰� byte ��洵撟曉�� bit
 unsigned char EvDetectionStatus(unsigned char _byte, unsigned char _bit)
 {
     return ( _byte & mask_table[_bit] ) != 0x00;
@@ -2645,7 +2645,7 @@ int main(int argc, char *argv[])
     while (CanFd) {
         for (byte _index = 0; _index < gun_count; _index++) {
             if (priorityLow == 1) {
-                // 優先權較低 - 只要有回應即不會再詢問
+                // �芸�甈𡃏�雿� - �芾��匧��匧朖銝齿��滩岷��
                 if (_chargingData[_index]->Type == _Type_Chademo &&
                         ShmCHAdeMOData->evse[_chargingData[_index]->type_index].SelfTest_Comp != PASS) {
                     SyncRtcInfo(_index, _chargingData[_index]->Evboard_id, (int)rtc);
@@ -2662,7 +2662,7 @@ int main(int argc, char *argv[])
                     }
                 }
 
-                // 固定要取得的資訊 : 1.槍鎖狀態, 2."Connector 1" 溫度, 3."Connector 2" 溫度, 4.Pilot Voltage
+                // �箏�閬��敺㛖�鞈�� : 1.瑽漤�����, 2."Connector 1" 皞怠漲, 3."Connector 2" 皞怠漲, 4.Pilot Voltage
                 //PRINTF_FUNC("GetMiscellaneousInfo. index = %d, Eid = %d \n", _index, _chargingData[_index]->Evboard_id);
                 GetMiscellaneousInfo(_index,
                                      _chargingData[_index]->RelayK1K2Status,
@@ -2701,7 +2701,7 @@ int main(int argc, char *argv[])
                 }
                 break;
             case S_PREPARNING: {
-                // 設定當前輸出
+                // 閮剖��嗅�頛詨枂
                 if (gun_count == 1) {
                     SetPresentChargingOutputPower(_chargingData[0], _chargingData[0]);
                 } else if (gun_count == 2) {
@@ -2712,7 +2712,7 @@ int main(int argc, char *argv[])
             }
             break;
             case S_PREPARING_FOR_EV: {
-                // 開始確認車端是否同意開始充電 : 1.SOC, 2.Target Vol, 3.Target Cur, 4.Charging remaining time
+                // �见�蝣箄�頠羓垢�臬炏�峕��见���𤓖 : 1.SOC, 2.Target Vol, 3.Target Cur, 4.Charging remaining time
                 GetOutputReq(_index, _chargingData[_index]->Evboard_id);
 
 //                  PRINTF_FUNC("PresentChargingVoltage = %f \n", _chargingData[_index]->PresentChargingVoltage);
@@ -2721,7 +2721,7 @@ int main(int argc, char *argv[])
 //                  PRINTF_FUNC("AvailableChargingCurrent = %f \n", _chargingData[_index]->AvailableChargingCurrent);
 //                  PRINTF_FUNC("MaximumChargingVoltage = %f \n", _chargingData[_index]->MaximumChargingVoltage);
 
-                // 設定當前輸出
+                // 閮剖��嗅�頛詨枂
                 if (gun_count == 1) {
                     SetPresentChargingOutputPower(_chargingData[0], _chargingData[0]);
                 } else if (gun_count == 2) {
@@ -2730,7 +2730,7 @@ int main(int argc, char *argv[])
 
                 if (priorityLow == 1) {
                     float maxVol, maxCur;
-                    // 樁端輸出能力
+                    // 璅�垢頛詨枂�賢�
                     maxVol = _chargingData[_index]->MaximumChargingVoltage;
                     maxCur = _chargingData[_index]->AvailableChargingCurrent;
 
@@ -2746,7 +2746,7 @@ int main(int argc, char *argv[])
                                           maxVol,
                                           _chargingData[_index]->Evboard_id);
 
-                    // 取得車端電池資訊 : 1.AC or DC ? 2.Total battery cap, 3.Max battery vol, 4.Max battery cur
+                    // �硋�頠羓垢�餅�鞈�� : 1.AC or DC ? 2.Total battery cap, 3.Max battery vol, 4.Max battery cur
                     GetEvBatteryInfo(_index, _chargingData[_index]->Evboard_id);
                 }
                 gettimeofday(&_chk_ratingPower_timeout[_index], NULL);
@@ -2755,10 +2755,10 @@ int main(int argc, char *argv[])
             case S_PREPARING_FOR_EVSE:
             case S_CCS_PRECHARGE_ST0:
             case S_CCS_PRECHARGE_ST1: {
-                // 開始確認車端是否同意開始充電
+                // �见�蝣箄�頠羓垢�臬炏�峕��见���𤓖
                 GetOutputReq(_index, _chargingData[_index]->Evboard_id);
 
-                // 設定當前輸出
+                // 閮剖��嗅�頛詨枂
                 if (gun_count == 1) {
                     SetPresentChargingOutputPower(_chargingData[0], _chargingData[0]);
                 } else if (gun_count == 2) {
@@ -2766,16 +2766,16 @@ int main(int argc, char *argv[])
                 }
 
                 if (priorityLow % 5 == 1) {
-                    // 樁端輸出能力改變
+                    // 璅�垢頛詨枂�賢��寡�
                     if (gun_count == 1) {
                         SetPresentChargingOutputCap(_chargingData[0], _chargingData[0]);
                     } else if (gun_count == 2) {
                         SetPresentChargingOutputCap(_chargingData[0], _chargingData[1]);
                     }
                 }
-                // 持續通知 Isolation 測試狀態
+                // ����𡁶䰻 Isolation 皜祈岫����
                 if (priorityLow == 1) {
-                    // 拉 500 V 如果在一秒鐘內 GFD 都符合則 PASS
+                    // �� 500 V 憒���其�蝘㘾��� GFD �賜泵��� PASS
 //                      if (_chargingData[_index]->FireChargingVoltage >= 3500)
 //                          _chargingData[_index]->GroundFaultStatus = GFD_PASS;
 
@@ -2785,7 +2785,7 @@ int main(int argc, char *argv[])
                         //if ((GetTimeoutValue(_derating_time) / 1000) > 1000)
                         unsigned char _result = _chargingData[_index]->GroundFaultStatus;
 
-                        // GB & Chademo ~ Warning 也先算 Pass,因為 CCS 認證會驗 Warning 故不可更動
+                        // GB & Chademo ~ Warning 銋笔�蝞� Pass嚗���� CCS 隤滩���� Warning ����舀凒��
                         if (_chargingData[_index]->Type == _Type_Chademo ||
                                 _chargingData[_index]->Type == _Type_GB) {
                             if (_result == GFD_WARNING) {
@@ -2816,7 +2816,7 @@ int main(int argc, char *argv[])
             }
             break;
             case S_CHARGING: {
-                // 計算 Power
+                // 閮�� Power
                 _chargingData[_index]->PresentChargingPower = ((float)((_chargingData[_index]->PresentChargingVoltage) * (_chargingData[_index]->PresentChargingCurrent)) / 1000);
 
                 if (chargingTime[_index] == 0 ||
@@ -2837,10 +2837,10 @@ int main(int argc, char *argv[])
                     }
                 }
 
-                // 開始確認車端是否同意開始充電
+                // �见�蝣箄�頠羓垢�臬炏�峕��见���𤓖
                 GetOutputReq(_index, _chargingData[_index]->Evboard_id);
 
-                // 設定當前輸出
+                // 閮剖��嗅�頛詨枂
                 if (gun_count == 1) {
                     SetPresentChargingOutputPower(_chargingData[0], _chargingData[0]);
                 } else if (gun_count == 2) {
@@ -2849,7 +2849,7 @@ int main(int argc, char *argv[])
 
                 // for test end
                 if (priorityLow % 5 == 0) {
-                    // 樁端輸出能力改變
+                    // 璅�垢頛詨枂�賢��寡�
                     if (gun_count == 1) {
                         SetPresentChargingOutputCap(_chargingData[0], _chargingData[0]);
                     } else if (gun_count == 2) {
@@ -2863,7 +2863,7 @@ int main(int argc, char *argv[])
                     SetIsolationStatus(_index, _chargingData[_index]->GroundFaultStatus, _chargingData[_index]->Evboard_id);
                 }
 
-                // GFD 失敗再通知
+                // GFD 憭望��漤�𡁶䰻
                 if (priorityLow == 1) {
                     if (_chargingData[_index]->Type == _Type_CCS_2 &&
                             _chargingData[_index]->PrechargeStatus == PRECHARGE_READY) {
@@ -2873,14 +2873,14 @@ int main(int argc, char *argv[])
             }
             break;
             case S_TERMINATING: {
-                // 設定當前輸出
+                // 閮剖��嗅�頛詨枂
                 if (gun_count == 1) {
                     SetPresentChargingOutputPower(_chargingData[0], _chargingData[0]);
                 } else if (gun_count == 2) {
                     SetPresentChargingOutputPower(_chargingData[0], _chargingData[1]);
                 }
 
-                // 槍鎖還在,則代表是樁端要求的停止
+                // 瑽漤���銁嚗��隞�”�舀�蝡航�瘙���𨀣迫
                 if (_chargingData[_index]->GunLocked == START ||
                         _chargingData[_index]->Type == _Type_CCS_2) {
                     byte normalStop = 0x01;
@@ -2901,7 +2901,7 @@ int main(int argc, char *argv[])
             }
             break;
             case S_COMPLETE: {
-                // 設定當前輸出
+                // 閮剖��嗅�頛詨枂
                 if (gun_count == 1) {
                     SetPresentChargingOutputPower(_chargingData[0], _chargingData[0]);
                 } else if (gun_count == 2) {
@@ -2911,7 +2911,7 @@ int main(int argc, char *argv[])
                 if (priorityLow == 1) {
                     float maxVol, maxCur;
 
-                    // 樁端輸出能力
+                    // 璅�垢頛詨枂�賢�
                     maxVol = _chargingData[_index]->MaximumChargingVoltage;
                     maxCur = _chargingData[_index]->AvailableChargingCurrent;
 
@@ -2927,7 +2927,7 @@ int main(int argc, char *argv[])
             }
         }
         priorityLow >= 20 ? priorityLow = 1 : priorityLow++;
-        usleep(45000); //EV 小板通訊 (50 ms)
+        usleep(45000); //EV 撠𤩺踎�朞� (50 ms)
     }
     DEBUG_INFO("Module_EvComm : Can-bus port = %d \n", CanFd);
     return FAIL;

+ 2 - 2
EVSE/Projects/DD360Audi/Apps/ReMain.c

@@ -176,7 +176,7 @@ bool isModelNameMatch = true;
 
 int rfidFd = -1;
 char *rfidPortName = "/dev/ttyS2";
-char *fwVersion = "V1.06.00.0000.00"; // "V0.16.00.0000.00";
+char *fwVersion = "V1.07.00.0000.00"; // "V0.16.00.0000.00";
 
 sqlite3 *localDb;
 bool isDb_ready;
@@ -1906,7 +1906,7 @@ int isEvBoardStopChargeFlag(byte gunIndex)
 
 bool isEvBoardNormalStopChargeFlag(byte gunIndex)
 {
-    return chargingInfo[gunIndex]->UnKnowStopChargeFlag;
+    return chargingInfo[gunIndex]->NormalStopChargeFlag;
 }
 
 //===============================================

+ 38 - 15
EVSE/Projects/DD360Audi/Apps/ReModule_EvComm.c

@@ -1756,6 +1756,16 @@ void ClearAbnormalStatus_CCS(byte gun_index)
             memcpy(code, "023893", 6);
             memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
             isCleanCheck = true;
+        } else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023979", 6) == EQUAL &&
+                   ShmStatusCodeData->InfoCode.InfoEvents.bits.EV_Full_Charging == YES) {
+            memcpy(code, "023979", 6);
+            memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
+            isCleanCheck = true;
+        } else if (strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "023983", 6) == EQUAL &&
+                   ShmStatusCodeData->InfoCode.InfoEvents.bits.Stop_by_EV_with_unknow_reason == YES) {
+            memcpy(code, "023983", 6);
+            memcpy(_chargingData[gun_index]->EvConnAlarmCode, "", 6);
+            isCleanCheck = true;
         }
     }
 
@@ -1906,6 +1916,9 @@ void ClearAbnormalStatus_CCS(byte gun_index)
                     if (strncmp(code, "023891", 6) == EQUAL) { ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsSeccNotReadyForCharging = NO; }
                     //if (strncmp(code, "023892", 6) == EQUAL) ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsSeccTimeoutQCA7000Comm = NO;
                     if (strncmp(code, "023893", 6) == EQUAL) { ShmStatusCodeData->InfoCode.InfoEvents.bits.CcsSeccFailForQCA7000SetKey = NO; }
+
+                    if (strncmp(code, "023979", 6) == EQUAL) { ShmStatusCodeData->InfoCode.InfoEvents.bits.EV_Full_Charging = NO; }
+                    if (strncmp(code, "023983", 6) == EQUAL) { ShmStatusCodeData->InfoCode.InfoEvents.bits.Stop_by_EV_with_unknow_reason = NO; }
                 }
             }
         }
@@ -2178,6 +2191,9 @@ bool AbnormalStopAnalysis(byte gun_index, byte *errCode)
     if (strcmp(string, "023976") == EQUAL) { ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BSM_ISOLATE = YES; }
     if (strcmp(string, "023977") == EQUAL) { ShmStatusCodeData->InfoCode.InfoEvents.bits.ERROR_CODE_BSM_OUTPUT_CONNECTOR = YES; }
 
+    if (strcmp(string, "023979") == EQUAL) { ShmStatusCodeData->InfoCode.InfoEvents.bits.EV_Full_Charging = YES; }
+    if (strcmp(string, "023983") == EQUAL) { ShmStatusCodeData->InfoCode.InfoEvents.bits.Stop_by_EV_with_unknow_reason = YES; }
+
     return true;
 }
 
@@ -2474,12 +2490,19 @@ void CANReceiver()
                             (_chargingData[targetGun]->SystemStatus >= S_CCS_PRECHARGE_ST0 &&
                              _chargingData[targetGun]->SystemStatus <= S_CCS_PRECHARGE_ST1)) {
                         // frame.data[0] : 0x01 => normal stop, 0x02 => ev emergency stop
-                        PRINTF_FUNC("(%d) NOTIFICATION_EV_STOP err level = %d-----------------------------\n", targetGun, frame.data[0]);
-                        //if (frame.data[0] == 0x02)
-                        {
+                        PRINTF_FUNC("(%d) NOTIFICATION_EV_STOP err level = %d-----------------------------\n",
+                                    targetGun,
+                                    frame.data[0]);
+                        if (frame.data[0] == 0x02) {
+                            if (AbnormalStopAnalysis(targetGun, frame.data + 1) == true) {
+                                _chargingData[targetGun]->StopChargeFlag = YES;
+                            } else {
+                                _chargingData[targetGun]->NormalStopChargeFlag = YES;
+                            }
+                        } else {
                             AbnormalStopAnalysis(targetGun, frame.data + 1);
+                            _chargingData[targetGun]->NormalStopChargeFlag = YES;
                         }
-                        _chargingData[targetGun]->StopChargeFlag = YES;
                     }
                 }
                 break;
@@ -3086,7 +3109,7 @@ int main(int argc, char *argv[])
                     _chargingData[_index]->GroundFaultStatus = GFD_WAIT;
                     _chargingData[_index]->RealRatingPower = 0;
                     _chargingData[_index]->StopChargeFlag = NO;
-                    _chargingData[_index]->UnKnowStopChargeFlag = NO;//DS60-120 add
+                    _chargingData[_index]->NormalStopChargeFlag = NO;//DS60-120 add
                     _chargingData[_index]->ChargingFee = 0.0;
                     _chargingData[_index]->EvBatterySoc = 0;
                     _chargingData[_index]->EvBatteryStartSoc = 0; //DS60-120 add
@@ -3434,16 +3457,16 @@ int main(int argc, char *argv[])
                                           _chargingData[_index]->Evboard_id);
 
                     //DS60-120 add
-                    if (_chargingData[_index]->EvBatterySoc >= 100) {
-                        //滿電,則直接清掉錯誤
-                        if (_chargingData[_index]->Type == _Type_Chademo) {
-                            ClearAbnormalStatus_Chademo(_index);
-                        } else if (_chargingData[_index]->Type == _Type_GB) {
-                            ClearAbnormalStatus_GB(_index);
-                        } else if (_chargingData[_index]->Type == _Type_CCS_2) {
-                            ClearAbnormalStatus_CCS(_index);
-                        }
-                    }
+                    //if (_chargingData[_index]->EvBatterySoc >= 100) {
+                    //    //滿電,則直接清掉錯誤
+                    //    if (_chargingData[_index]->Type == _Type_Chademo) {
+                    //        ClearAbnormalStatus_Chademo(_index);
+                    //    } else if (_chargingData[_index]->Type == _Type_GB) {
+                    //        ClearAbnormalStatus_GB(_index);
+                    //    } else if (_chargingData[_index]->Type == _Type_CCS_2) {
+                    //        ClearAbnormalStatus_CCS(_index);
+                    //    }
+                    //}
                 }
             }
             break;

BIN
EVSE/Projects/DD360Audi/Apps/UnsafetyOutputTask


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


BIN
EVSE/Projects/DD360Audi/output/DoComm


BIN
EVSE/Projects/DD360Audi/output/FactoryConfig


BIN
EVSE/Projects/DD360Audi/output/Module_EvComm


BIN
EVSE/Projects/DD360Audi/output/Module_EventLogging


BIN
EVSE/Projects/DD360Audi/output/Module_InternalComm


BIN
EVSE/Projects/DD360Audi/output/Module_LcmControl


BIN
EVSE/Projects/DD360Audi/output/Module_PrimaryComm


BIN
EVSE/Projects/DD360Audi/output/ReadCmdline


BIN
EVSE/Projects/DD360Audi/output/main