FolusWen 4 жил өмнө
parent
commit
02592e9d57
44 өөрчлөгдсөн 2914 нэмэгдсэн , 1360 устгасан
  1. 11 2
      EVSE/Modularization/Makefile
  2. 527 0
      EVSE/Modularization/Module_RatedCurrent.c
  3. 303 0
      EVSE/Modularization/Module_RatedCurrent.h
  4. 516 0
      EVSE/Modularization/Module_RatingCurrent.c
  5. 298 0
      EVSE/Modularization/Module_RatingCurrent.h
  6. 10 8
      EVSE/Projects/DD360/Apps/Makefile
  7. 40 40
      EVSE/Projects/DD360/Apps/Module_EvComm.c
  8. 3 3
      EVSE/Projects/DD360/Apps/ReDoComm.c
  9. 29 14
      EVSE/Projects/DD360/Apps/ReMain.c
  10. 62 21
      EVSE/Projects/DD360/Apps/ReModule_EvComm.c
  11. 3 4
      EVSE/Projects/DD360/Apps/ReModule_InternalComm.c
  12. 480 587
      EVSE/Projects/DD360/Apps/ReadCmdline.c
  13. BIN
      EVSE/Projects/DD360/Apps/UnsafetyOutputTask
  14. 5 4
      EVSE/Projects/DD360/Apps/main.c
  15. BIN
      EVSE/Projects/DD360/Images/ACYE0000000\002P0_FactoryDefaultConfig.bin
  16. BIN
      EVSE/Projects/DD360/Images/DDYE182V0UD2AU_FactoryDefaultConfig.bin
  17. BIN
      EVSE/Projects/DD360/Images/ramdisk.gz
  18. BIN
      EVSE/Projects/DD360/output/DoComm
  19. BIN
      EVSE/Projects/DD360/output/FactoryConfig
  20. BIN
      EVSE/Projects/DD360/output/Module_EvComm
  21. BIN
      EVSE/Projects/DD360/output/Module_EventLogging
  22. BIN
      EVSE/Projects/DD360/output/Module_InternalComm
  23. BIN
      EVSE/Projects/DD360/output/Module_LcmControl
  24. BIN
      EVSE/Projects/DD360/output/Module_PrimaryComm
  25. BIN
      EVSE/Projects/DD360/output/ReadCmdline
  26. BIN
      EVSE/Projects/DD360/output/UnsafetyOutputTask
  27. BIN
      EVSE/Projects/DD360/output/main
  28. 10 8
      EVSE/Projects/DD360Audi/Apps/Makefile
  29. 40 40
      EVSE/Projects/DD360Audi/Apps/Module_EvComm.c
  30. 3 3
      EVSE/Projects/DD360Audi/Apps/ReDoComm.c
  31. 29 14
      EVSE/Projects/DD360Audi/Apps/ReMain.c
  32. 62 21
      EVSE/Projects/DD360Audi/Apps/ReModule_EvComm.c
  33. 3 4
      EVSE/Projects/DD360Audi/Apps/ReModule_InternalComm.c
  34. 480 587
      EVSE/Projects/DD360Audi/Apps/ReadCmdline.c
  35. BIN
      EVSE/Projects/DD360Audi/Images/ramdisk.gz
  36. BIN
      EVSE/Projects/DD360Audi/output/DoComm
  37. BIN
      EVSE/Projects/DD360Audi/output/FactoryConfig
  38. BIN
      EVSE/Projects/DD360Audi/output/Module_EvComm
  39. BIN
      EVSE/Projects/DD360Audi/output/Module_EventLogging
  40. BIN
      EVSE/Projects/DD360Audi/output/Module_InternalComm
  41. BIN
      EVSE/Projects/DD360Audi/output/Module_LcmControl
  42. BIN
      EVSE/Projects/DD360Audi/output/Module_PrimaryComm
  43. BIN
      EVSE/Projects/DD360Audi/output/ReadCmdline
  44. BIN
      EVSE/Projects/DD360Audi/output/main

+ 11 - 2
EVSE/Modularization/Makefile

@@ -4,7 +4,10 @@ export PATH=/bin:/sbin:/usr/bin:$(SDK_PATH_TARGET)/usr/bin:$PATH
 #define library variable
 Lib_SQLite3 = "-L../../../Modularization/ocppfiles" -lsqlite3
 
-all: clean Module_RFIDLib Module_Wifi WebServiceLib Ocpp16 Phihong_PsuCommObj Module_4g Module_UpgradeLib Infypwr_PsuCommObj Module_EventLogging Module_ProduceUtils Module_PhBackend Ocpp20 Module_InitUpgrade
+all: clean Module_RFIDLib Module_Wifi WebServiceLib Ocpp16 \
+		Phihong_PsuCommObj Module_4g Module_UpgradeLib Infypwr_PsuCommObj \
+			Module_EventLogging Module_ProduceUtils Module_PhBackend \
+				Ocpp20 Module_InitUpgrade Module_RatedCurrentLib
 
 
 clean:
@@ -28,6 +31,12 @@ Module_ProduceUtils:
 	rm -f Module_ProduceUtils.o
 	mv -f Module_ProduceUtils ../rootfs/root
 
+Module_RatedCurrentLib:
+	rm -f libModule_RatedCurrent.a
+	$(CC) -D $(Project) -O0 -g3 -Wall -c -fmessage-length=0 -o Module_RatedCurrent.o Module_RatedCurrent.c
+	$(AR) -r libModule_RatedCurrent.a Module_RatedCurrent.o
+	rm -f Module_RatedCurrent.o
+
 Module_RFIDLib:
 	rm -f libModule_RFID.a
 	$(CC) -D $(Project) -O0 -g3 -Wall -c -fmessage-length=0 -o Module_RFID.o Module_RFID.c
@@ -60,7 +69,7 @@ WebServiceLib:
 	mv -f logPackTools ../rootfs/root/
 
 Ocpp16:
-	rm -f OcppBackend; 
+	rm -f OcppBackend;
 	$(CC) -D $(TLS_EXPIRED) -D $(Project) -D__USE_XOPEN -D_GNU_SOURCE ./ocppfiles/Module_OcppBackend.c ./ocppfiles/MessageHandler.c ./ocppfiles/JsonParser.c ./ocppfiles/SystemLogMessage.c ./ocppfiles/hashmap.c ./ocppfiles/common.c -I ../Projects -I ../GPL/libwebsockets-2.2.2-stable/release/include -I ../GPL/json-c-json-c-0.13.1-20180305/release/include -L ../GPL/libwebsockets-2.2.2-stable/release/lib -L ../GPL/openssl-1.0.2g/release/lib -L ../GPL/json-c-json-c-0.13.1-20180305/release/lib -lwebsockets -luuid -lpthread -lc -lsqlite3 -ljson-c -o OcppBackend
 	mv -f OcppBackend ../rootfs/root/
 

+ 527 - 0
EVSE/Modularization/Module_RatedCurrent.c

@@ -0,0 +1,527 @@
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <string.h>
+#include <stdarg.h>
+#include <time.h>
+
+#include <sys/timeb.h>
+
+#include "Module_RatedCurrent.h"
+
+//------------------------------------------------------------------------------
+#define PASS                                    (1)
+#define FAIL                                    (-1)
+
+#define log_info(format, args...)               StoreLogMsg("[%s:%d][%s][Info] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
+#define log_warn(format, args...)               StoreLogMsg("[%s:%d][%s][Warn] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
+#define log_error(format, args...)              StoreLogMsg("[%s:%d][%s][Error] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
+
+//------------------------------------------------------------------------------
+static SymStruct modelTable[] = {
+    { "AC", MODEL_AC },
+    { "AW", MODEL_AW },
+    { "AP", MODEL_AP },
+    { "DW", MODEL_DW },
+    { "DS", MODEL_DS },
+    { "DM", MODEL_DM },
+    { "DR", MODEL_DR },
+    //{ "DM", MODEL_DM },
+    { "DD", MODEL_DD },
+    { "DO", MODEL_DO },
+};
+
+static SymStruct regulationTable[] = {
+    {"E", REG_CE},
+    {"U", REG_UL},
+    {"G", REG_GB},
+    {"C", REG_CNS},
+    {"J", REG_JARI},
+    {"T", REG_TR25},
+    {"K", REG_KC},
+    {"B", REG_B},
+    {"Z", REG_Z},
+    {"M", REG_M},
+    {"P", REG_P},
+    {"I", REG_I},
+    {"F", REG_F},
+    {"L", REG_L},
+};
+
+static SymStruct powerTable[] = {
+    {"30", POWER_30W},
+    {"60", POWER_60W},
+    {"90", POWER_90W},
+    {"12", POWER_120W},
+    {"15", POWER_150W},
+    {"18", POWER_180W},
+    {"24", POWER_240W},
+    {"36", POWER_360W},
+    {"48", POWER_480W},
+    {"72", POWER_720W},
+};
+
+static SymStruct gunTypeTable[] = {
+    {"0", GUN_TYPE_0},
+    {"1", GUN_TYPE_1},
+    {"2", GUN_TYPE_2},
+    {"3", GUN_TYPE_3},
+    {"4", GUN_TYPE_4},
+    {"5", GUN_TYPE_5},
+    {"6", GUN_TYPE_6},
+    {"7", GUN_TYPE_7},
+    {"8", GUN_TYPE_8},
+    {"J", GUN_TYPE_J},
+    {"U", GUN_TYPE_U},
+    {"V", GUN_TYPE_V},
+    {"E", GUN_TYPE_E},
+    {"F", GUN_TYPE_F},
+    {"G", GUN_TYPE_G},
+};
+
+//------------------------------------------------------------------------------
+static int StoreLogMsg(const char *fmt, ...)
+{
+    char Buf[4096 + 256] = {0};
+    char buffer[4096] = {0};
+    int rc = 0;
+    va_list args;
+    struct timeb  SeqEndTime;
+    struct tm *tm;
+
+    va_start(args, fmt);
+    rc = vsnprintf(buffer, sizeof(buffer), fmt, args);
+    va_end(args);
+
+    ftime(&SeqEndTime);
+    SeqEndTime.time = time(NULL);
+    tm = localtime(&SeqEndTime.time);
+
+    //if (ShmSysConfigAndInfo->SysConfig.SwitchDebugFlag == YES) {
+    //    sprintf(Buf, "%02d:%02d:%02d:%03d - %s",
+    //            tm->tm_hour, tm->tm_min, tm->tm_sec, SeqEndTime.millitm, buffer);
+    //    printf("%s \n", Buf);
+    //} else {
+    sprintf(Buf, "echo \"%04d-%02d-%02d %02d:%02d:%02d:%03d - %s\" >> /Storage/SystemLog/[%04d.%02d]SystemLog",
+            tm->tm_year + 1900,
+            tm->tm_mon + 1,
+            tm->tm_mday,
+            tm->tm_hour,
+            tm->tm_min,
+            tm->tm_sec,
+            SeqEndTime.millitm,
+            buffer,
+            tm->tm_year + 1900,
+            tm->tm_mon + 1);
+    system(Buf);
+    //}
+
+    return rc;
+}
+
+static int keyfromstring(char *key, SymStruct *table, int tableCount)
+{
+    int i = 0;
+    //int loop = sizeof(table) / sizeof(SymStruct);
+    SymStruct *sym = NULL;
+
+    for (i = 0; i < tableCount; i++) {
+        sym = (SymStruct *)&table[i];
+        if (strcmp(sym->key, key) == 0) {
+            //printf("val = %x\r\n", sym->val);
+            return sym->val;
+        }
+    }
+
+    return BADKEY;
+}
+
+//------------------------------------------------------------------------------
+static uint16_t exchangeRatingCur(uint32_t key)
+{
+    switch (key) {
+    //60A J
+    case DW_CE_30_J:
+    case DM_CE_30_J:
+
+    case DW_CE_30_E:
+    case DM_CE_30_E:
+        return RC_60A; //rating current 60A
+
+    //65A U
+    case DW_UL_30_U:
+    case DM_UL_30_U:
+
+    case DW_CNS_30_U:
+    case DM_CNS_30_U:
+        return RC_65A;
+
+    //80A J
+    case DW_UL_30_J:
+    case DM_UL_30_J:
+    case DW_CNS_30_J:
+    case DM_CNS_30_J:
+
+    //80A G
+    case DM_CNS_30_G:
+    case DS_UL_30_G:
+
+    //80A M
+    case DW_CE_30_M:
+    case DM_CE_30_M:
+
+    //80A N
+    case DW_UL_30_N:
+    case DM_UL_30_N:
+    case DW_CNS_30_N:
+    case DM_CNS_30_N:
+        return RC_80A; //rating current 80A
+
+    //125A J
+    case DS_CE_60_J:
+    case DS_CE_90_J:
+    case DS_CE_120_J:
+    case DS_CE_150_J:
+    case DS_CE_180_J:
+
+    case DS_UL_60_J:
+    case DS_UL_90_J:
+    case DS_UL_120_J:
+    case DS_UL_150_J:
+    case DS_UL_180_J:
+
+    case DS_CNS_60_J:
+    case DS_CNS_90_J:
+    case DS_CNS_120_J:
+    case DS_CNS_150_J:
+    case DS_CNS_180_J:
+
+    //125A U
+    case DS_UL_60_U:
+
+    case DS_CNS_60_U:
+
+    //125A E
+    case DS_CE_60_E:
+        return RC_125A; //rating current 125A
+
+    //200A U
+    case DS_UL_90_U:
+    case DS_UL_120_U:
+    case DS_UL_150_U:
+    case DS_UL_180_U:
+    case DD_UL_360_U:
+
+    case DS_CNS_90_U:
+    case DS_CNS_120_U:
+    case DS_CNS_150_U:
+    case DS_CNS_180_U:
+    case DD_CNS_360_U:
+
+    //200A E
+    case DS_CE_90_E:
+    case DS_CE_120_E:
+    case DS_CE_150_E:
+    case DS_CE_180_E:
+
+    //200A K
+    case DS_CE_90_K:
+    case DS_CE_120_K:
+    case DS_CE_150_K:
+    case DS_CE_180_K:
+
+    case DD_CE_360_K:
+
+    case DS_UL_90_K:
+    case DS_UL_120_K:
+    case DS_UL_150_K:
+    case DS_UL_180_K:
+
+    case DD_UL_360_K:
+        return RC_200A; //rating current 200A
+
+    //250A G
+    case DS_CNS_120_G:
+        return RC_250A;
+
+    //300A T
+    case DS_CE_90_T:
+    case DS_CE_120_T:
+    case DS_CE_150_T:
+    case DS_CE_180_T:
+
+    case DD_CE_360_T:
+
+    case DS_UL_90_T:
+    case DS_UL_120_T:
+    case DS_UL_150_T:
+    case DS_UL_180_T:
+
+    case DD_UL_360_T:
+
+    case DS_CNS_90_T:
+    case DS_CNS_120_T:
+    case DS_CNS_150_T:
+    case DS_CNS_180_T:
+
+    case DD_CNS_360_T:
+
+    //300A D
+    case DS_CE_90_D:
+    case DS_CE_120_D:
+    case DS_CE_150_D:
+    case DS_CE_180_D:
+    case DD_CE_360_D:
+
+    case DS_UL_90_D:
+    case DS_UL_120_D:
+    case DS_UL_150_D:
+    case DS_UL_180_D:
+
+    case DD_UL_360_D:
+
+    case DS_CNS_90_D:
+    case DS_CNS_120_D:
+    case DS_CNS_150_D:
+    case DS_CNS_180_D:
+
+    case DD_CNS_360_D:
+        return RC_300A;
+
+    //500A V
+    case DD_UL_360_V:
+
+    case DD_CNS_360_V:
+
+    case DO_UL_360_V:
+    case DO_CNS_360_V:
+
+    //500A F
+    case DD_CE_360_F:
+    case DO_CE_360_F:
+
+    //P
+    case DD_CE_360_P:
+
+    case DD_UL_360_R:
+    case DD_CNS_360_R:
+        return RC_500A; //rating current 500A
+
+    default:
+        return RC_0A; //rating current 200A
+    }
+}
+
+static void exchangeGunTypeAndVolValue(uint8_t key, GunTypeAndVolInfo *gunAndVol)
+{
+    GunTypeAndVolInfo *pGunAndVol = (GunTypeAndVolInfo *)gunAndVol;
+
+    switch (key) {
+    case GUN_TYPE_0:// : none
+    case GUN_TYPE_1:// : IEC 62196-2 Type 1/SAE J1772 Plug
+    case GUN_TYPE_2:// : IEC 62196-2 Type 1/SAE J1772 Socket
+    case GUN_TYPE_3:// : IEC 62196-2 Type 2 Plug
+    case GUN_TYPE_4:// : IEC 62196-2 Type 2 Socket
+    case GUN_TYPE_5:// : GB/T AC Plug
+    case GUN_TYPE_6:// : GB/T AC Socket
+    case GUN_TYPE_7:// :CCS2 AC Plug
+        pGunAndVol->GunType = Gun_Type_AC;
+        pGunAndVol->GunVoltage = VOL_CHADEMO;
+        break;
+
+    case GUN_TYPE_8:// :Type E socket
+        break;
+
+    case GUN_TYPE_J:// : CHAdeMO
+        pGunAndVol->GunType = Gun_Type_Chademo;
+        pGunAndVol->GunVoltage = VOL_CHADEMO;
+        break;
+
+    case GUN_TYPE_U:// : Natural cooling CCS1 combo
+    case GUN_TYPE_V:// : Liquid cooling CCS1 combo
+    case GUN_TYPE_E:// : Natural cooling CCS2 combo
+    case GUN_TYPE_F:// : Liquid cooling CCS2 combo
+        pGunAndVol->GunType = Gun_Type_CCS_2;
+        pGunAndVol->GunVoltage = VOL_CCS;
+        break;
+
+    case GUN_TYPE_G:// : GBT DC
+        pGunAndVol->GunType = Gun_Type_GB;
+        pGunAndVol->GunVoltage = VOL_GBT;
+        break;
+    }
+}
+
+static int exchangePowerValue(uint8_t key)
+{
+    switch (key) {
+    case POWER_30W:
+        return 300;
+
+    case POWER_60W:
+        return 600;
+
+    case POWER_90W:
+        return 900;
+
+    case POWER_120W:
+        return 1200;
+
+    case POWER_150W:
+        return 1500;
+
+    case POWER_180W:
+        return 1800;
+
+    case POWER_240W:
+        return 2400;
+
+    case POWER_360W:
+        return 3600;
+
+    case POWER_480W:
+        return 4800;
+
+    case POWER_720W:
+        return 7200;
+
+    default:
+        return 600;
+        break;
+    }
+}
+
+/**
+ * [RatedCurrentParsing : Parsing Rating Current]
+ * @param  pModuleName  [description]
+ * @param  pDestStruct  [save parameter structure array]
+ * @param  parsingCount [parameter structure array count, array 0, 1 for DC Gun, 2 for AC Gun]
+ * @return              [return -1 is module name format non match.]
+ */
+int RatedCurrentParsing(char *pModuleName, void *pDestStruct)
+{
+    uint8_t gunTypeIndex = 0;
+
+    uint8_t modelKey = 0;
+    uint8_t reguKey = 0;
+    uint8_t powerKey = 0;
+    uint8_t gunTypeKey = 0;
+    uint16_t powerVal = 0;
+    uint16_t ratingCurVal = 0;
+    int i = 0;
+    uint32_t ret = 0;
+    char model[2] = {'\0'};
+    char regulation[1] = {'\0'};
+    char power[2] = {'\0'};
+    char gunType[1] = {'\0'};
+    ParsingRatedCur *pParsingInfo = NULL;
+    GunRateCurInfo *pGunRateCurInfo = NULL;
+    GunTypeAndVolInfo fGunAndVol = {0};
+
+    if (pModuleName == NULL || pDestStruct == NULL) {
+        log_error("Failed to parse source data\r\n");
+        return FAIL;
+    }
+
+    pParsingInfo = (ParsingRatedCur *)pDestStruct;
+
+    strncpy(model, &pModuleName[0], 2);
+    model[2] = '\0';
+    strncpy(regulation, &pModuleName[3], 1);
+    regulation[1] = '\0';
+    strncpy(power, &pModuleName[4], 2);
+    power[2] = '\0';
+
+
+    pParsingInfo->GetGunCount = 0;
+    for (i = 0; i < sizeof(pParsingInfo->ParsingInfo) / sizeof(GunRateCurInfo); i++) {
+        pGunRateCurInfo = (GunRateCurInfo *)&pParsingInfo->ParsingInfo[pParsingInfo->GetGunCount];
+
+        if (i == 0) {
+            gunTypeIndex = DC_ONE;
+        } else if (i == 1) {
+            gunTypeIndex = AC_ONE;
+        } else if (i == 2) {
+            gunTypeIndex = DC_SEC;
+        }
+
+        strncpy(gunType, &pModuleName[gunTypeIndex], 1);
+        gunType[1] = '\0';
+
+        modelKey = keyfromstring(&model[0], &modelTable[0], sizeof(modelTable) / sizeof(SymStruct));
+        reguKey = keyfromstring(&regulation[0], &regulationTable[0], sizeof(regulationTable) / sizeof(SymStruct));
+        powerKey = keyfromstring(&power[0], &powerTable[0], sizeof(powerTable) / sizeof(SymStruct));
+        if ((gunTypeKey = keyfromstring(&gunType[0], &gunTypeTable[0], sizeof(gunTypeTable) / sizeof(SymStruct))) == GUN_TYPE_0) {
+            log_error("The type of gun is none\r\n");
+            continue;
+        }
+
+        ret = 0;
+        ret = ((modelKey << 24) | (reguKey << 16) | (powerKey << 8) | gunTypeKey);
+        ratingCurVal = exchangeRatingCur(ret);
+        if (ratingCurVal == RC_0A) {
+            log_error("Model name format none match\r\n");
+            continue;
+            //return FAIL;
+        }
+
+        memset((uint8_t *)&fGunAndVol, 0, sizeof(GunTypeAndVolInfo));
+        exchangeGunTypeAndVolValue(gunTypeKey, &fGunAndVol);
+        powerVal = exchangePowerValue(powerKey);
+
+        pGunRateCurInfo->GunType = fGunAndVol.GunType;
+        pGunRateCurInfo->Current = ratingCurVal;
+        pGunRateCurInfo->Voltage = fGunAndVol.GunVoltage;
+        pGunRateCurInfo->Power = powerVal;
+
+        pParsingInfo->GetGunCount++;
+
+        //log_info("%d GunType = %d, Rating current = %d, Vol = %d, Power = %d\r\n",
+        //         i,
+        //         pGunRateCurInfo->GunType,
+        //         pGunRateCurInfo->Current,
+        //         pGunRateCurInfo->Voltage,
+        //         pGunRateCurInfo->Power);
+
+    }
+
+    return PASS;
+}
+
+//------------------------------------------------------------------------------
+//Test function
+//------------------------------------------------------------------------------
+void TestParsingRatingCurrent(void)
+{
+    uint8_t i = 0;
+    ParsingRatedCur fParsingRateCur = {0};
+
+    RatedCurrentParsing("DDYC362V0UE2AD", &fParsingRateCur);
+    log_info("Get gun = %d\r\n", fParsingRateCur.GetGunCount);
+    for (i = 0; i < fParsingRateCur.GetGunCount; i++) {
+        log_info("%d GunType = %d, Rating current = %d, Vol = %d, Power = %d\r\n",
+                 i,
+                 fParsingRateCur.ParsingInfo[i].GunType,
+                 fParsingRateCur.ParsingInfo[i].Current,
+                 fParsingRateCur.ParsingInfo[i].Voltage,
+                 fParsingRateCur.ParsingInfo[i].Power);
+    }
+    //log_info("%d GunType = %d, Rating current = %d, Vol = %d, Power = %d\r\n",
+    //         0,
+    //         fGunRateCurInfo[0].GunType,
+    //         fGunRateCurInfo[0].Current,
+    //         fGunRateCurInfo[0].Voltage,
+    //         fGunRateCurInfo[0].Power);
+
+    RatedCurrentParsing("DMYE301E00D2PH", &fParsingRateCur);
+    log_info("Get gun = %d\r\n", fParsingRateCur.GetGunCount);
+    for (i = 0; i < fParsingRateCur.GetGunCount; i++) {
+        log_info("%d GunType = %d, Rating current = %d, Vol = %d, Power = %d\r\n",
+                 i,
+                 fParsingRateCur.ParsingInfo[i].GunType,
+                 fParsingRateCur.ParsingInfo[i].Current,
+                 fParsingRateCur.ParsingInfo[i].Voltage,
+                 fParsingRateCur.ParsingInfo[i].Power);
+    }
+}

+ 303 - 0
EVSE/Modularization/Module_RatedCurrent.h

@@ -0,0 +1,303 @@
+#ifndef _MODULE_NAME_PARSING_H_
+#define _MODULE_NAME_PARSING_H_
+
+#define BADKEY                                  (-1)
+
+//------------------------------------------------------------------------------
+// model type key
+//------------------------------------------------------------------------------
+#define MODEL_AC                                (0x01) //Ac EVse Cordset
+#define MODEL_AW                                (0x02) //Ac EVse Wallmount
+#define MODEL_AP                                (0x03) //Ac EVse Pedestal
+#define MODEL_DW                                (0x04) //Dc EVse Wallmount
+#define MODEL_DS                                (0x05) //Dc EVse Standalone
+#define MODEL_DM                                (0x06) //Dc EVse Moveable (Battery equipped)
+#define MODEL_DR                                (0x07) //Dc EVse Power Rack (without cabinet)
+//#define MODEL_DM                                (0x08) //Dc EVse Moveable (移動)
+#define MODEL_DD                                (0x09) //Dc EVse Dispenser
+#define MODEL_DO                                (0x0A) //Dc EVse Output power cabinet
+
+//------------------------------------------------------------------------------
+// regulation key
+//------------------------------------------------------------------------------
+#define REG_CE                                  (0x01) // CE / European Market
+#define REG_UL                                  (0x02) // UL / North America Market
+#define REG_GB                                  (0x03) // GB / China Market
+#define REG_CNS                                 (0x04) // CNS / Taiwan Market
+#define REG_JARI                                (0x05) // JARI / Japan Market
+#define REG_TR25                                (0x06) // TR25 / Singapor Market
+#define REG_KC                                  (0x07) // KC / Korea Market
+#define REG_B                                   (0x08) // British / UK Market
+#define REG_Z                                   (0x09) // EV ready / French Market
+#define REG_M                                   (0x0A) // E + MID Meter
+#define REG_P                                   (0x0B) // E + PTB certification
+#define REG_I                                   (0x0C) // Z + TIC Meter pcb
+#define REG_F                                   (0x0D) // Z + MID Meter
+#define REG_L                                   (0x0E) // U + UL meter
+
+//------------------------------------------------------------------------------
+// rate power key
+//------------------------------------------------------------------------------
+#define POWER_30W                               (0x01)
+#define POWER_60W                               (0x02)
+#define POWER_90W                               (0x03)
+#define POWER_120W                              (0x04)
+#define POWER_150W                              (0x05)
+#define POWER_180W                              (0x06)
+#define POWER_240W                              (0x07)
+#define POWER_360W                              (0x08)
+#define POWER_480W                              (0x09)
+#define POWER_720W                              (0x0A)
+
+//------------------------------------------------------------------------------
+// gun type key
+//------------------------------------------------------------------------------
+#define GUN_TYPE_0                              (0x00) //none
+#define GUN_TYPE_1                              (0x01) //IEC 62196-2 Type 1/SAE J1772 Plug
+#define GUN_TYPE_2                              (0x02) //IEC 62196-2 Type 1/SAE J1772 Socket
+#define GUN_TYPE_3                              (0x03) //IEC 62196-2 Type 2 Plug
+#define GUN_TYPE_4                              (0x04) //IEC 62196-2 Type 2 Socket
+#define GUN_TYPE_5                              (0x05) //GB/T AC Plug
+#define GUN_TYPE_6                              (0x06) //GB/T AC Socket
+#define GUN_TYPE_7                              (0x07) //CS2 AC Plug
+#define GUN_TYPE_8                              (0x08) //Type E socket
+#define GUN_TYPE_J                              (0x09) //CHAdeMO
+#define GUN_TYPE_U                              (0x0A) //Natural cooling CCS1 combo
+#define GUN_TYPE_V                              (0x0B) //Liquid cooling CCS1 combo
+#define GUN_TYPE_E                              (0x0C) //Natural cooling CCS2 combo
+#define GUN_TYPE_F                              (0x0D) //Liquid cooling CCS2 combo
+#define GUN_TYPE_G                              (0x0E) //GBT DC
+#define GUN_TYPE_T                              (0x0F) //Rema CCS1
+#define GUN_TYPE_D                              (0x10) //Rema CCS2
+#define GUN_TYPE_K                              (0x11) //CHAdeMO 200A/500V
+#define GUN_TYPE_M                              (0x12) //CCS2 80A
+#define GUN_TYPE_N                              (0x13) //CCS1 80A
+#define GUN_TYPE_P                              (0x14) //Phoenix CCS2 500A 水冷
+#define GUN_TYPE_R                              (0x15) //Phoenix CCS1 500A 水冷
+
+//------------------------------------------------------------------------------
+// rating current parameters
+//------------------------------------------------------------------------------
+#define RC_0A                                   (0)
+#define RC_60A                                  (600)
+#define RC_65A                                  (650)
+#define RC_80A                                  (800)
+#define RC_125A                                 (1250)
+#define RC_200A                                 (2000)
+#define RC_250A                                 (2500)
+#define RC_300A                                 (3000)
+#define RC_500A                                 (5000)
+
+//------------------------------------------------------------------------------
+// maximum voltage parameters
+//------------------------------------------------------------------------------
+#define VOL_CHADEMO                             (5000)
+#define VOL_CCS                                 (9500)
+#define VOL_GBT                                 (7500)
+
+#define DC_ONE                                  (7)
+#define DC_SEC                                  (9)
+#define AC_ONE                                  (8)
+
+//------------------------------------------------------------------------------
+// power parameters
+//------------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
+// rating current case
+//------------------------------------------------------------------------------
+//J
+#define DW_CE_30_J                              ((uint32_t)((MODEL_DW << 24) | (REG_CE << 16) | (POWER_30W << 8) | GUN_TYPE_J))
+#define DM_CE_30_J                              ((uint32_t)((MODEL_DM << 24) | (REG_CE << 16) | (POWER_30W << 8) | GUN_TYPE_J))
+
+#define DW_UL_30_J                              ((uint32_t)((MODEL_DW << 24) | (REG_UL << 16) | (POWER_30W << 8) | GUN_TYPE_J))
+#define DM_UL_30_J                              ((uint32_t)((MODEL_DM << 24) | (REG_UL << 16) | (POWER_30W << 8) | GUN_TYPE_J))
+
+#define DW_CNS_30_J                             ((uint32_t)((MODEL_DW << 24) | (REG_CNS << 16) | (POWER_30W << 8) | GUN_TYPE_J))
+#define DM_CNS_30_J                             ((uint32_t)((MODEL_DM << 24) | (REG_CNS << 16) | (POWER_30W << 8) | GUN_TYPE_J))
+
+#define DS_CE_60_J                              ((uint32_t)((MODEL_DS << 24) | (REG_CE << 16) | (POWER_60W << 8) | GUN_TYPE_J))
+#define DS_CE_90_J                              ((uint32_t)((MODEL_DS << 24) | (REG_CE << 16) | (POWER_90W << 8) | GUN_TYPE_J))
+#define DS_CE_120_J                             ((uint32_t)((MODEL_DS << 24) | (REG_CE << 16) | (POWER_120W << 8) | GUN_TYPE_J))
+#define DS_CE_150_J                             ((uint32_t)((MODEL_DS << 24) | (REG_CE << 16) | (POWER_150W << 8) | GUN_TYPE_J))
+#define DS_CE_180_J                             ((uint32_t)((MODEL_DS << 24) | (REG_CE << 16) | (POWER_180W << 8) | GUN_TYPE_J))
+
+#define DS_UL_60_J                              ((uint32_t)((MODEL_DS << 24) | (REG_UL << 16) | (POWER_60W << 8) | GUN_TYPE_J))
+#define DS_UL_90_J                              ((uint32_t)((MODEL_DS << 24) | (REG_UL << 16) | (POWER_90W << 8) | GUN_TYPE_J))
+#define DS_UL_120_J                             ((uint32_t)((MODEL_DS << 24) | (REG_UL << 16) | (POWER_120W << 8) | GUN_TYPE_J))
+#define DS_UL_150_J                             ((uint32_t)((MODEL_DS << 24) | (REG_UL << 16) | (POWER_150W << 8) | GUN_TYPE_J))
+#define DS_UL_180_J                             ((uint32_t)((MODEL_DS << 24) | (REG_UL << 16) | (POWER_180W << 8) | GUN_TYPE_J))
+
+#define DS_CNS_60_J                             ((uint32_t)((MODEL_DS << 24) | (REG_CNS << 16) | (POWER_60W << 8) | GUN_TYPE_J))
+#define DS_CNS_90_J                             ((uint32_t)((MODEL_DS << 24) | (REG_CNS << 16) | (POWER_90W << 8) | GUN_TYPE_J))
+#define DS_CNS_120_J                            ((uint32_t)((MODEL_DS << 24) | (REG_CNS << 16) | (POWER_120W << 8) | GUN_TYPE_J))
+#define DS_CNS_150_J                            ((uint32_t)((MODEL_DS << 24) | (REG_CNS << 16) | (POWER_150W << 8) | GUN_TYPE_J))
+#define DS_CNS_180_J                            ((uint32_t)((MODEL_DS << 24) | (REG_CNS << 16) | (POWER_180W << 8) | GUN_TYPE_J))
+
+//U
+#define DW_UL_30_U                              ((uint32_t)((MODEL_DW << 24) | (REG_UL << 16) | (POWER_30W << 8) | GUN_TYPE_U))
+#define DM_UL_30_U                              ((uint32_t)((MODEL_DM << 24) | (REG_UL << 16) | (POWER_30W << 8) | GUN_TYPE_U))
+
+#define DW_CNS_30_U                             ((uint32_t)((MODEL_DW << 24) | (REG_CNS << 16) | (POWER_30W << 8) | GUN_TYPE_U))
+#define DM_CNS_30_U                             ((uint32_t)((MODEL_DM << 24) | (REG_CNS << 16) | (POWER_30W << 8) | GUN_TYPE_U))
+
+#define DS_UL_60_U                              ((uint32_t)((MODEL_DS << 24) | (REG_UL << 16) | (POWER_60W << 8) | GUN_TYPE_U))
+#define DS_UL_90_U                              ((uint32_t)((MODEL_DS << 24) | (REG_UL << 16) | (POWER_90W << 8) | GUN_TYPE_U))
+#define DS_UL_120_U                             ((uint32_t)((MODEL_DS << 24) | (REG_UL << 16) | (POWER_120W << 8) | GUN_TYPE_U))
+#define DS_UL_150_U                             ((uint32_t)((MODEL_DS << 24) | (REG_UL << 16) | (POWER_150W << 8) | GUN_TYPE_U))
+#define DS_UL_180_U                             ((uint32_t)((MODEL_DS << 24) | (REG_UL << 16) | (POWER_180W << 8) | GUN_TYPE_U))
+
+#define DD_UL_360_U                             ((uint32_t)((MODEL_DD << 24) | (REG_UL << 16) | (POWER_360W << 8) | GUN_TYPE_U))
+
+#define DS_CNS_60_U                             ((uint32_t)((MODEL_DS << 24) | (REG_CNS << 16) | (POWER_60W << 8) | GUN_TYPE_U))
+#define DS_CNS_90_U                             ((uint32_t)((MODEL_DS << 24) | (REG_CNS << 16) | (POWER_90W << 8) | GUN_TYPE_U))
+#define DS_CNS_120_U                            ((uint32_t)((MODEL_DS << 24) | (REG_CNS << 16) | (POWER_120W << 8) | GUN_TYPE_U))
+#define DS_CNS_150_U                            ((uint32_t)((MODEL_DS << 24) | (REG_CNS << 16) | (POWER_150W << 8) | GUN_TYPE_U))
+#define DS_CNS_180_U                            ((uint32_t)((MODEL_DS << 24) | (REG_CNS << 16) | (POWER_180W << 8) | GUN_TYPE_U))
+
+#define DD_CNS_360_U                             ((uint32_t)((MODEL_DD << 24) | (REG_CNS << 16) | (POWER_360W << 8) | GUN_TYPE_U))
+
+//V
+#define DD_UL_360_V                             ((uint32_t)((MODEL_DD << 24) | (REG_UL << 16) | (POWER_360W << 8) | GUN_TYPE_V))
+
+#define DD_CNS_360_V                            ((uint32_t)((MODEL_DD << 24) | (REG_CNS << 16) | (POWER_360W << 8) | GUN_TYPE_V))
+
+#define DO_UL_360_V                             ((uint32_t)((MODEL_DO << 24) | (REG_UL << 16) | (POWER_360W << 8) | GUN_TYPE_V))
+
+#define DO_CNS_360_V                            ((uint32_t)((MODEL_DO << 24) | (REG_CNS << 16) | (POWER_360W << 8) | GUN_TYPE_V))
+
+//E
+#define DW_CE_30_E                              ((uint32_t)((MODEL_DW << 24) | (REG_CE << 16) | (POWER_30W << 8) | GUN_TYPE_E))
+#define DM_CE_30_E                              ((uint32_t)((MODEL_DM << 24) | (REG_CE << 16) | (POWER_30W << 8) | GUN_TYPE_E))
+
+#define DS_CE_60_E                              ((uint32_t)((MODEL_DS << 24) | (REG_CE << 16) | (POWER_60W << 8) | GUN_TYPE_E))
+#define DS_CE_90_E                              ((uint32_t)((MODEL_DS << 24) | (REG_CE << 16) | (POWER_90W << 8) | GUN_TYPE_E))
+#define DS_CE_120_E                             ((uint32_t)((MODEL_DS << 24) | (REG_CE << 16) | (POWER_120W << 8) | GUN_TYPE_E))
+#define DS_CE_150_E                             ((uint32_t)((MODEL_DS << 24) | (REG_CE << 16) | (POWER_150W << 8) | GUN_TYPE_E))
+#define DS_CE_180_E                             ((uint32_t)((MODEL_DS << 24) | (REG_CE << 16) | (POWER_180W << 8) | GUN_TYPE_E))
+
+//F
+#define DD_CE_360_F                             ((uint32_t)((MODEL_DD << 24) | (REG_CE << 16) | (POWER_360W << 8) | GUN_TYPE_F))
+
+#define DO_CE_360_F                             ((uint32_t)((MODEL_DO << 24) | (REG_CE << 16) | (POWER_360W << 8) | GUN_TYPE_F))
+
+//G
+#define DM_CNS_30_G                             ((uint32_t)((MODEL_DM << 24) | (REG_CNS << 16) | (POWER_30W << 8) | GUN_TYPE_G))
+
+#define DS_UL_30_G                              ((uint32_t)((MODEL_DS << 24) | (REG_UL << 16) | (POWER_30W << 8) | GUN_TYPE_G))
+#define DS_CNS_120_G                            ((uint32_t)((MODEL_DS << 24) | (REG_CNS << 16) | (POWER_120W << 8) | GUN_TYPE_G))
+
+//T
+#define DS_CE_90_T                              ((uint32_t)((MODEL_DS << 24) | (REG_CE << 16) | (POWER_90W << 8) | GUN_TYPE_T))
+#define DS_CE_120_T                             ((uint32_t)((MODEL_DS << 24) | (REG_CE << 16) | (POWER_120W << 8) | GUN_TYPE_T))
+#define DS_CE_150_T                             ((uint32_t)((MODEL_DS << 24) | (REG_CE << 16) | (POWER_150W << 8) | GUN_TYPE_T))
+#define DS_CE_180_T                             ((uint32_t)((MODEL_DS << 24) | (REG_CE << 16) | (POWER_180W << 8) | GUN_TYPE_T))
+
+#define DD_CE_360_T                             ((uint32_t)((MODEL_DD << 24) | (REG_CE << 16) | (POWER_360W << 8) | GUN_TYPE_T))
+
+#define DS_UL_90_T                              ((uint32_t)((MODEL_DS << 24) | (REG_UL << 16) | (POWER_90W << 8) | GUN_TYPE_T))
+#define DS_UL_120_T                             ((uint32_t)((MODEL_DS << 24) | (REG_UL << 16) | (POWER_120W << 8) | GUN_TYPE_T))
+#define DS_UL_150_T                             ((uint32_t)((MODEL_DS << 24) | (REG_UL << 16) | (POWER_150W << 8) | GUN_TYPE_T))
+#define DS_UL_180_T                             ((uint32_t)((MODEL_DS << 24) | (REG_UL << 16) | (POWER_180W << 8) | GUN_TYPE_T))
+
+#define DD_UL_360_T                             ((uint32_t)((MODEL_DD << 24) | (REG_UL << 16) | (POWER_360W << 8) | GUN_TYPE_T))
+
+#define DS_CNS_90_T                             ((uint32_t)((MODEL_DS << 24) | (REG_CNS << 16) | (POWER_90W << 8) | GUN_TYPE_T))
+#define DS_CNS_120_T                            ((uint32_t)((MODEL_DS << 24) | (REG_CNS << 16) | (POWER_120W << 8) | GUN_TYPE_T))
+#define DS_CNS_150_T                            ((uint32_t)((MODEL_DS << 24) | (REG_CNS << 16) | (POWER_150W << 8) | GUN_TYPE_T))
+#define DS_CNS_180_T                            ((uint32_t)((MODEL_DS << 24) | (REG_CNS << 16) | (POWER_180W << 8) | GUN_TYPE_T))
+
+#define DD_CNS_360_T                            ((uint32_t)((MODEL_DD << 24) | (REG_CNS << 16) | (POWER_360W << 8) | GUN_TYPE_T))
+
+//D
+#define DS_CE_90_D                              ((uint32_t)((MODEL_DS << 24) | (REG_CE << 16) | (POWER_90W << 8) | GUN_TYPE_D))
+#define DS_CE_120_D                             ((uint32_t)((MODEL_DS << 24) | (REG_CE << 16) | (POWER_120W << 8) | GUN_TYPE_D))
+#define DS_CE_150_D                             ((uint32_t)((MODEL_DS << 24) | (REG_CE << 16) | (POWER_150W << 8) | GUN_TYPE_D))
+#define DS_CE_180_D                             ((uint32_t)((MODEL_DS << 24) | (REG_CE << 16) | (POWER_180W << 8) | GUN_TYPE_D))
+
+#define DD_CE_360_D                             ((uint32_t)((MODEL_DD << 24) | (REG_CE << 16) | (POWER_360W << 8) | GUN_TYPE_D))
+
+#define DS_UL_90_D                              ((uint32_t)((MODEL_DS << 24) | (REG_UL << 16) | (POWER_90W << 8) | GUN_TYPE_D))
+#define DS_UL_120_D                             ((uint32_t)((MODEL_DS << 24) | (REG_UL << 16) | (POWER_120W << 8) | GUN_TYPE_D))
+#define DS_UL_150_D                             ((uint32_t)((MODEL_DS << 24) | (REG_UL << 16) | (POWER_150W << 8) | GUN_TYPE_D))
+#define DS_UL_180_D                             ((uint32_t)((MODEL_DS << 24) | (REG_UL << 16) | (POWER_180W << 8) | GUN_TYPE_D))
+
+#define DD_UL_360_D                             ((uint32_t)((MODEL_DD << 24) | (REG_UL << 16) | (POWER_360W << 8) | GUN_TYPE_D))
+
+#define DS_CNS_90_D                             ((uint32_t)((MODEL_DS << 24) | (REG_CNS << 16) | (POWER_90W << 8) | GUN_TYPE_D))
+#define DS_CNS_120_D                            ((uint32_t)((MODEL_DS << 24) | (REG_CNS << 16) | (POWER_120W << 8) | GUN_TYPE_D))
+#define DS_CNS_150_D                            ((uint32_t)((MODEL_DS << 24) | (REG_CNS << 16) | (POWER_150W << 8) | GUN_TYPE_D))
+#define DS_CNS_180_D                            ((uint32_t)((MODEL_DS << 24) | (REG_CNS << 16) | (POWER_180W << 8) | GUN_TYPE_D))
+
+#define DD_CNS_360_D                            ((uint32_t)((MODEL_DD << 24) | (REG_CNS << 16) | (POWER_360W << 8) | GUN_TYPE_D))
+
+//K
+#define DS_CE_90_K                              ((uint32_t)((MODEL_DS << 24) | (REG_CE << 16) | (POWER_90W << 8) | GUN_TYPE_K))
+#define DS_CE_120_K                             ((uint32_t)((MODEL_DS << 24) | (REG_CE << 16) | (POWER_120W << 8) | GUN_TYPE_K))
+#define DS_CE_150_K                             ((uint32_t)((MODEL_DS << 24) | (REG_CE << 16) | (POWER_150W << 8) | GUN_TYPE_K))
+#define DS_CE_180_K                             ((uint32_t)((MODEL_DS << 24) | (REG_CE << 16) | (POWER_180W << 8) | GUN_TYPE_K))
+
+#define DD_CE_360_K                             ((uint32_t)((MODEL_DD << 24) | (REG_CE << 16) | (POWER_360W << 8) | GUN_TYPE_K))
+
+#define DS_UL_90_K                              ((uint32_t)((MODEL_DS << 24) | (REG_UL << 16) | (POWER_90W << 8) | GUN_TYPE_K))
+#define DS_UL_120_K                             ((uint32_t)((MODEL_DS << 24) | (REG_UL << 16) | (POWER_120W << 8) | GUN_TYPE_K))
+#define DS_UL_150_K                             ((uint32_t)((MODEL_DS << 24) | (REG_UL << 16) | (POWER_150W << 8) | GUN_TYPE_K))
+#define DS_UL_180_K                             ((uint32_t)((MODEL_DS << 24) | (REG_UL << 16) | (POWER_180W << 8) | GUN_TYPE_K))
+
+#define DD_UL_360_K                             ((uint32_t)((MODEL_DD << 24) | (REG_UL << 16) | (POWER_360W << 8) | GUN_TYPE_K))
+
+//M
+#define DW_CE_30_M                              ((uint32_t)((MODEL_DW << 24) | (REG_CE << 16) | (POWER_30W << 8) | GUN_TYPE_M))
+#define DM_CE_30_M                              ((uint32_t)((MODEL_DM << 24) | (REG_CE << 16) | (POWER_30W << 8) | GUN_TYPE_M))
+
+//N
+#define DW_UL_30_N                              ((uint32_t)((MODEL_DW << 24) | (REG_UL << 16) | (POWER_30W << 8) | GUN_TYPE_N))
+#define DM_UL_30_N                              ((uint32_t)((MODEL_DM << 24) | (REG_UL << 16) | (POWER_30W << 8) | GUN_TYPE_N))
+
+#define DW_CNS_30_N                             ((uint32_t)((MODEL_DW << 24) | (REG_CNS << 16) | (POWER_30W << 8) | GUN_TYPE_N))
+#define DM_CNS_30_N                             ((uint32_t)((MODEL_DM << 24) | (REG_CNS << 16) | (POWER_30W << 8) | GUN_TYPE_N))
+
+//P
+#define DD_CE_360_P                             ((uint32_t)((MODEL_DD << 24) | (REG_CE << 16) | (POWER_360W << 8) | GUN_TYPE_P))
+
+//R
+#define DD_UL_360_R                             ((uint32_t)((MODEL_DD << 24) | (REG_UL << 16) | (POWER_360W << 8) | GUN_TYPE_R))
+
+#define DD_CNS_360_R                            ((uint32_t)((MODEL_DD << 24) | (REG_CNS << 16) | (POWER_360W << 8) | GUN_TYPE_R))
+
+//------------------------------------------------------------------------------
+typedef enum EnGunType {
+    Gun_Type_Chademo = 0,
+    Gun_Type_CCS_2,
+    Gun_Type_GB,
+    Gun_Type_AC,
+} GunType;
+
+typedef struct StSymStruct {
+    char *key;
+    int val;
+} SymStruct;
+
+typedef struct StGunTypeAndVolInfo {
+    uint8_t GunType;
+    uint16_t GunVoltage;
+} GunTypeAndVolInfo;
+
+typedef struct StGunRateCurInfo {
+    uint8_t GunType;
+    uint16_t Current;       //* 0.1A
+    uint16_t Voltage;       //* 0.1V
+    uint16_t Power;
+    uint8_t Reserved;
+} GunRateCurInfo;
+
+typedef struct StParsingRatingCur {
+    uint8_t GetGunCount;
+    GunRateCurInfo ParsingInfo[3];
+} ParsingRatedCur;
+
+//------------------------------------------------------------------------------
+int RatedCurrentParsing(char *pModuleName, void *pDestStruct);
+void TestParsingRatingCurrent(void);
+
+#endif /* _MODULE_NAME_PARSING_H_ */

+ 516 - 0
EVSE/Modularization/Module_RatingCurrent.c

@@ -0,0 +1,516 @@
+/*
+ *  Module_RatingCurrent.c
+ *
+ *  Created on: 2021-03-15
+ *  Update:
+ *  Author: Jerry Wang
+ *  Version: V0.01
+ *
+ * History
+ * 1. Create Parsing Rated Current Parameter, reference model name 7, 8, 9 field gun type,
+ *    GunRateCurInfo arrays 0 and 1 represent DC guns of 7 and 9 fields, and array 2 represents AC guns of 8 fields.
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <string.h>
+#include <stdarg.h>
+#include <time.h>
+
+#include <sys/timeb.h>
+
+#include "Module_RatingCurrent.h"
+
+//------------------------------------------------------------------------------
+#define PASS                                    (1)
+#define FAIL                                    (-1)
+
+#define log_info(format, args...)               StoreLogMsg("[%s:%d][%s][Info] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
+#define log_warn(format, args...)               StoreLogMsg("[%s:%d][%s][Warn] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
+#define log_error(format, args...)              StoreLogMsg("[%s:%d][%s][Error] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
+
+//------------------------------------------------------------------------------
+static SymStruct modelTable[] = {
+    { "AC", MODEL_AC },
+    { "AW", MODEL_AW },
+    { "AP", MODEL_AP },
+    { "DW", MODEL_DW },
+    { "DS", MODEL_DS },
+    { "DM", MODEL_DM },
+    { "DR", MODEL_DR },
+    //{ "DM", MODEL_DM },
+    { "DD", MODEL_DD },
+    { "DO", MODEL_DO },
+};
+
+static SymStruct regulationTable[] = {
+    {"E", REG_CE},
+    {"U", REG_UL},
+    {"G", REG_GB},
+    {"C", REG_CNS},
+    {"J", REG_JARI},
+    {"T", REG_TR25},
+    {"K", REG_KC},
+    {"B", REG_B},
+    {"Z", REG_Z},
+    {"M", REG_M},
+    {"P", REG_P},
+    {"I", REG_I},
+    {"F", REG_F},
+    {"L", REG_L},
+};
+
+static SymStruct powerTable[] = {
+    {"30", POWER_30W},
+    {"60", POWER_60W},
+    {"90", POWER_90W},
+    {"12", POWER_120W},
+    {"15", POWER_150W},
+    {"18", POWER_180W},
+    {"24", POWER_240W},
+    {"36", POWER_360W},
+    {"48", POWER_480W},
+    {"72", POWER_720W},
+};
+
+static SymStruct gunTypeTable[] = {
+    {"0", GUN_TYPE_0},
+    {"1", GUN_TYPE_1},
+    {"2", GUN_TYPE_2},
+    {"3", GUN_TYPE_3},
+    {"4", GUN_TYPE_4},
+    {"5", GUN_TYPE_5},
+    {"6", GUN_TYPE_6},
+    {"7", GUN_TYPE_7},
+    {"8", GUN_TYPE_8},
+    {"J", GUN_TYPE_J},
+    {"U", GUN_TYPE_U},
+    {"V", GUN_TYPE_V},
+    {"E", GUN_TYPE_E},
+    {"F", GUN_TYPE_F},
+    {"G", GUN_TYPE_G},
+};
+
+//------------------------------------------------------------------------------
+static int StoreLogMsg(const char *fmt, ...)
+{
+    char Buf[4096 + 256] = {0};
+    char buffer[4096] = {0};
+    int rc = 0;
+    va_list args;
+    struct timeb  SeqEndTime;
+    struct tm *tm;
+
+    va_start(args, fmt);
+    rc = vsnprintf(buffer, sizeof(buffer), fmt, args);
+    va_end(args);
+
+    ftime(&SeqEndTime);
+    SeqEndTime.time = time(NULL);
+    tm = localtime(&SeqEndTime.time);
+
+    //if (ShmSysConfigAndInfo->SysConfig.SwitchDebugFlag == YES) {
+    //    sprintf(Buf, "%02d:%02d:%02d:%03d - %s",
+    //            tm->tm_hour, tm->tm_min, tm->tm_sec, SeqEndTime.millitm, buffer);
+    //    printf("%s \n", Buf);
+    //} else {
+    sprintf(Buf, "echo \"%04d-%02d-%02d %02d:%02d:%02d:%03d - %s\" >> /Storage/SystemLog/[%04d.%02d]SystemLog",
+            tm->tm_year + 1900,
+            tm->tm_mon + 1,
+            tm->tm_mday,
+            tm->tm_hour,
+            tm->tm_min,
+            tm->tm_sec,
+            SeqEndTime.millitm,
+            buffer,
+            tm->tm_year + 1900,
+            tm->tm_mon + 1);
+    system(Buf);
+    //}
+
+    return rc;
+}
+
+static int keyfromstring(char *key, SymStruct *table, int tableCount)
+{
+    int i = 0;
+    //int loop = sizeof(table) / sizeof(SymStruct);
+    SymStruct *sym = NULL;
+
+    for (i = 0; i < tableCount; i++) {
+        sym = (SymStruct *)&table[i];
+        if (strcmp(sym->key, key) == 0) {
+            //printf("val = %x\r\n", sym->val);
+            return sym->val;
+        }
+    }
+
+    return BADKEY;
+}
+
+//------------------------------------------------------------------------------
+static uint16_t exchangeRatingCur(uint32_t key)
+{
+    switch (key) {
+    //60A J
+    case DW_CE_30_J:
+    case DM_CE_30_J:
+
+    case DW_CE_30_E:
+    case DM_CE_30_E:
+        return RC_60A; //rating current 60A
+
+    //65A U
+    case DW_UL_30_U:
+    case DM_UL_30_U:
+
+    case DW_CNS_30_U:
+    case DM_CNS_30_U:
+        return RC_65A;
+
+    //80A J
+    case DW_UL_30_J:
+    case DM_UL_30_J:
+    case DW_CNS_30_J:
+    case DM_CNS_30_J:
+
+    //80A G
+    case DM_CNS_30_G:
+    case DS_UL_30_G:
+
+    //80A M
+    case DW_CE_30_M:
+    case DM_CE_30_M:
+
+    //80A N
+    case DW_UL_30_N:
+    case DM_UL_30_N:
+    case DW_CNS_30_N:
+    case DM_CNS_30_N:
+        return RC_80A; //rating current 80A
+
+    //125A J
+    case DS_CE_60_J:
+    case DS_CE_90_J:
+    case DS_CE_120_J:
+    case DS_CE_150_J:
+    case DS_CE_180_J:
+
+    case DS_UL_60_J:
+    case DS_UL_90_J:
+    case DS_UL_120_J:
+    case DS_UL_150_J:
+    case DS_UL_180_J:
+
+    case DS_CNS_60_J:
+    case DS_CNS_90_J:
+    case DS_CNS_120_J:
+    case DS_CNS_150_J:
+    case DS_CNS_180_J:
+
+    //125A U
+    case DS_UL_60_U:
+
+    case DS_CNS_60_U:
+
+    //125A E
+    case DS_CE_60_E:
+        return RC_125A; //rating current 125A
+
+    //200A U
+    case DS_UL_90_U:
+    case DS_UL_120_U:
+    case DS_UL_150_U:
+    case DS_UL_180_U:
+    case DD_UL_360_U:
+
+    case DS_CNS_90_U:
+    case DS_CNS_120_U:
+    case DS_CNS_150_U:
+    case DS_CNS_180_U:
+    case DD_CNS_360_U:
+
+    //200A E
+    case DS_CE_90_E:
+    case DS_CE_120_E:
+    case DS_CE_150_E:
+    case DS_CE_180_E:
+
+    //200A K
+    case DS_CE_90_K:
+    case DS_CE_120_K:
+    case DS_CE_150_K:
+    case DS_CE_180_K:
+
+    case DD_CE_360_K:
+
+    case DS_UL_90_K:
+    case DS_UL_120_K:
+    case DS_UL_150_K:
+    case DS_UL_180_K:
+
+    case DD_UL_360_K:
+        return RC_200A; //rating current 200A
+
+    //250A G
+    case DS_CNS_120_G:
+        return RC_250A;
+
+    //300A T
+    case DS_CE_90_T:
+    case DS_CE_120_T:
+    case DS_CE_150_T:
+    case DS_CE_180_T:
+
+    case DD_CE_360_T:
+
+    case DS_UL_90_T:
+    case DS_UL_120_T:
+    case DS_UL_150_T:
+    case DS_UL_180_T:
+
+    case DD_UL_360_T:
+
+    case DS_CNS_90_T:
+    case DS_CNS_120_T:
+    case DS_CNS_150_T:
+    case DS_CNS_180_T:
+
+    case DD_CNS_360_T:
+
+    //300A D
+    case DS_CE_90_D:
+    case DS_CE_120_D:
+    case DS_CE_150_D:
+    case DS_CE_180_D:
+    case DD_CE_360_D:
+
+    case DS_UL_90_D:
+    case DS_UL_120_D:
+    case DS_UL_150_D:
+    case DS_UL_180_D:
+
+    case DD_UL_360_D:
+
+    case DS_CNS_90_D:
+    case DS_CNS_120_D:
+    case DS_CNS_150_D:
+    case DS_CNS_180_D:
+
+    case DD_CNS_360_D:
+        return RC_300A;
+
+    //500A V
+    case DD_UL_360_V:
+
+    case DD_CNS_360_V:
+
+    case DO_UL_360_V:
+    case DO_CNS_360_V:
+
+    //500A F
+    case DD_CE_360_F:
+    case DO_CE_360_F:
+
+    //P
+    case DD_CE_360_P:
+
+    case DD_UL_360_R:
+    case DD_CNS_360_R:
+        return RC_500A; //rating current 500A
+
+    default:
+        return RC_0A; //rating current 200A
+    }
+}
+
+static void exchangeGunTypeAndVolValue(uint8_t key, GunTypeAndVolInfo *gunAndVol)
+{
+    GunTypeAndVolInfo *pGunAndVol = (GunTypeAndVolInfo *)gunAndVol;
+
+    switch (key) {
+    case GUN_TYPE_0:// : none
+    case GUN_TYPE_1:// : IEC 62196-2 Type 1/SAE J1772 Plug
+    case GUN_TYPE_2:// : IEC 62196-2 Type 1/SAE J1772 Socket
+    case GUN_TYPE_3:// : IEC 62196-2 Type 2 Plug
+    case GUN_TYPE_4:// : IEC 62196-2 Type 2 Socket
+    case GUN_TYPE_5:// : GB/T AC Plug
+    case GUN_TYPE_6:// : GB/T AC Socket
+    case GUN_TYPE_7:// :CCS2 AC Plug
+        pGunAndVol->GunType = Gun_Type_AC;
+        pGunAndVol->GunVoltage = VOL_CHADEMO;
+        break;
+
+    case GUN_TYPE_8:// :Type E socket
+        break;
+
+    case GUN_TYPE_J:// : CHAdeMO
+        pGunAndVol->GunType = Gun_Type_Chademo;
+        pGunAndVol->GunVoltage = VOL_CHADEMO;
+        break;
+
+    case GUN_TYPE_U:// : Natural cooling CCS1 combo
+    case GUN_TYPE_V:// : Liquid cooling CCS1 combo
+    case GUN_TYPE_E:// : Natural cooling CCS2 combo
+    case GUN_TYPE_F:// : Liquid cooling CCS2 combo
+        pGunAndVol->GunType = Gun_Type_CCS_2;
+        pGunAndVol->GunVoltage = VOL_CCS;
+        break;
+
+    case GUN_TYPE_G:// : GBT DC
+        pGunAndVol->GunType = Gun_Type_GB;
+        pGunAndVol->GunVoltage = VOL_GBT;
+        break;
+    }
+}
+
+static int exchangePowerValue(uint8_t key)
+{
+    switch (key) {
+    case POWER_30W:
+        return 300;
+
+    case POWER_60W:
+        return 600;
+
+    case POWER_90W:
+        return 900;
+
+    case POWER_120W:
+        return 1200;
+
+    case POWER_150W:
+        return 1500;
+
+    case POWER_180W:
+        return 1800;
+
+    case POWER_240W:
+        return 2400;
+
+    case POWER_360W:
+        return 3600;
+
+    case POWER_480W:
+        return 4800;
+
+    case POWER_720W:
+        return 7200;
+
+    default:
+        return 600;
+        break;
+    }
+}
+
+/**
+ * [ModuleRatedCurrentParsing : Parsing Rating Current]
+ * @param  pModuleName  [description]
+ * @param  pDestStruct  [save parameter structure array]
+ * @param  parsingCount [parameter structure array count, array 0, 1 for DC Gun, 2 for AC Gun]
+ * @return              [return -1 is module name format non match.]
+ */
+int ModuleRatedCurrentParsing(char *pModuleName, void *pDestStruct, uint8_t parsingCount)
+{
+    uint8_t gunTypeIndex = 0;
+
+    uint8_t modelKey = 0;
+    uint8_t reguKey = 0;
+    uint8_t powerKey = 0;
+    uint8_t gunTypeKey = 0;
+
+    uint16_t powerVal = 0;
+    uint16_t ratingCurVal = 0;
+    int i = 0;
+    uint32_t ret = 0;
+    char model[2] = {'\0'};
+    char regulation[1] = {'\0'};
+    char power[2] = {'\0'};
+    char gunType[1] = {'\0'};
+    GunRateCurInfo *pGunRateCurInfo = NULL;
+    GunTypeAndVolInfo fGunAndVol = {0};
+
+    if (pModuleName == NULL || pDestStruct == NULL || parsingCount <= 0) {
+        log_error("Failed to parse source data\r\n");
+        return FAIL;
+    }
+
+    if (parsingCount > 3) {
+        parsingCount = 3;
+    }
+
+    strncpy(model, &pModuleName[0], 2);
+    model[2] = '\0';
+    strncpy(regulation, &pModuleName[3], 1);
+    regulation[1] = '\0';
+    strncpy(power, &pModuleName[4], 2);
+    power[2] = '\0';
+
+    for (i = 0; i < parsingCount; i++) {
+        pGunRateCurInfo = (GunRateCurInfo *)pDestStruct + i;
+
+        if (i == 0) {
+            gunTypeIndex = DC_ONE;
+        } else if (i == 1) {
+            gunTypeIndex = DC_SEC;
+        } else if (i == 2) {
+            gunTypeIndex = AC_ONE;
+        }
+
+        strncpy(gunType, &pModuleName[gunTypeIndex], 1);
+        gunType[1] = '\0';
+
+        modelKey = keyfromstring(&model[0], &modelTable[0], sizeof(modelTable) / sizeof(SymStruct));
+        reguKey = keyfromstring(&regulation[0], &regulationTable[0], sizeof(regulationTable) / sizeof(SymStruct));
+        powerKey = keyfromstring(&power[0], &powerTable[0], sizeof(powerTable) / sizeof(SymStruct));
+        if ((gunTypeKey = keyfromstring(&gunType[0], &gunTypeTable[0], sizeof(gunTypeTable) / sizeof(SymStruct))) == GUN_TYPE_0) {
+            log_error("The type of gun is none\r\n");
+            continue;
+        }
+
+        ret = 0;
+        ret = ((modelKey << 24) | (reguKey << 16) | (powerKey << 8) | gunTypeKey);
+        ratingCurVal = exchangeRatingCur(ret);
+        if (ratingCurVal == RC_0A) {
+            log_error("Model name format none match\r\n");
+            return FAIL;
+        }
+
+        memset((uint8_t *)&fGunAndVol, 0, sizeof(GunTypeAndVolInfo));
+        exchangeGunTypeAndVolValue(gunTypeKey, &fGunAndVol);
+        powerVal = exchangePowerValue(powerKey);
+
+        pGunRateCurInfo->GunType = fGunAndVol.GunType;
+        pGunRateCurInfo->RatingCurrent = ratingCurVal;
+        pGunRateCurInfo->Voltage = fGunAndVol.GunVoltage;
+        pGunRateCurInfo->Power = powerVal;
+
+        log_info("%d GunType = %d, Rating current = %d, Vol = %d, Power = %d\r\n",
+                 i,
+                 pGunRateCurInfo->GunType,
+                 pGunRateCurInfo->RatingCurrent,
+                 pGunRateCurInfo->Voltage,
+                 pGunRateCurInfo->Power);
+
+    }
+
+    return PASS;
+}
+
+//------------------------------------------------------------------------------
+//Test function
+//------------------------------------------------------------------------------
+void TestRatedCurrentParsing(void)
+{
+    GunRateCurInfo fGunRateCurInfo[3] = {0};
+
+    ModuleRatedCurrentParsing("DDYC362V0UE2AD", &fGunRateCurInfo[0], sizeof(fGunRateCurInfo) / sizeof(GunRateCurInfo));
+    //log_info("%d GunType = %d, Rating current = %d, Vol = %d, Power = %d\r\n",
+    //         0,
+    //         fGunRateCurInfo[0].GunType,
+    //         fGunRateCurInfo[0].RatingCurrent,
+    //         fGunRateCurInfo[0].Voltage,
+    //         fGunRateCurInfo[0].Power);
+
+    ModuleRatedCurrentParsing("DSYE301E00D2PH", &fGunRateCurInfo[0], sizeof(fGunRateCurInfo) / sizeof(GunRateCurInfo));
+}

+ 298 - 0
EVSE/Modularization/Module_RatingCurrent.h

@@ -0,0 +1,298 @@
+#ifndef _MODULE_NAME_PARSING_H_
+#define _MODULE_NAME_PARSING_H_
+
+#define BADKEY                                  (-1)
+
+//------------------------------------------------------------------------------
+// model type key
+//------------------------------------------------------------------------------
+#define MODEL_AC                                (0x01) //Ac EVse Cordset
+#define MODEL_AW                                (0x02) //Ac EVse Wallmount
+#define MODEL_AP                                (0x03) //Ac EVse Pedestal
+#define MODEL_DW                                (0x04) //Dc EVse Wallmount
+#define MODEL_DS                                (0x05) //Dc EVse Standalone
+#define MODEL_DM                                (0x06) //Dc EVse Moveable (Battery equipped)
+#define MODEL_DR                                (0x07) //Dc EVse Power Rack (without cabinet)
+//#define MODEL_DM                                (0x08) //Dc EVse Moveable (移動)
+#define MODEL_DD                                (0x09) //Dc EVse Dispenser
+#define MODEL_DO                                (0x0A) //Dc EVse Output power cabinet
+
+//------------------------------------------------------------------------------
+// regulation key
+//------------------------------------------------------------------------------
+#define REG_CE                                  (0x01) // CE / European Market
+#define REG_UL                                  (0x02) // UL / North America Market
+#define REG_GB                                  (0x03) // GB / China Market
+#define REG_CNS                                 (0x04) // CNS / Taiwan Market
+#define REG_JARI                                (0x05) // JARI / Japan Market
+#define REG_TR25                                (0x06) // TR25 / Singapor Market
+#define REG_KC                                  (0x07) // KC / Korea Market
+#define REG_B                                   (0x08) // British / UK Market
+#define REG_Z                                   (0x09) // EV ready / French Market
+#define REG_M                                   (0x0A) // E + MID Meter
+#define REG_P                                   (0x0B) // E + PTB certification
+#define REG_I                                   (0x0C) // Z + TIC Meter pcb
+#define REG_F                                   (0x0D) // Z + MID Meter
+#define REG_L                                   (0x0E) // U + UL meter
+
+//------------------------------------------------------------------------------
+// rate power key
+//------------------------------------------------------------------------------
+#define POWER_30W                               (0x01)
+#define POWER_60W                               (0x02)
+#define POWER_90W                               (0x03)
+#define POWER_120W                              (0x04)
+#define POWER_150W                              (0x05)
+#define POWER_180W                              (0x06)
+#define POWER_240W                              (0x07)
+#define POWER_360W                              (0x08)
+#define POWER_480W                              (0x09)
+#define POWER_720W                              (0x0A)
+
+//------------------------------------------------------------------------------
+// gun type key
+//------------------------------------------------------------------------------
+#define GUN_TYPE_0                              (0x00) //none
+#define GUN_TYPE_1                              (0x01) //IEC 62196-2 Type 1/SAE J1772 Plug
+#define GUN_TYPE_2                              (0x02) //IEC 62196-2 Type 1/SAE J1772 Socket
+#define GUN_TYPE_3                              (0x03) //IEC 62196-2 Type 2 Plug
+#define GUN_TYPE_4                              (0x04) //IEC 62196-2 Type 2 Socket
+#define GUN_TYPE_5                              (0x05) //GB/T AC Plug
+#define GUN_TYPE_6                              (0x06) //GB/T AC Socket
+#define GUN_TYPE_7                              (0x07) //CS2 AC Plug
+#define GUN_TYPE_8                              (0x08) //Type E socket
+#define GUN_TYPE_J                              (0x09) //CHAdeMO
+#define GUN_TYPE_U                              (0x0A) //Natural cooling CCS1 combo
+#define GUN_TYPE_V                              (0x0B) //Liquid cooling CCS1 combo
+#define GUN_TYPE_E                              (0x0C) //Natural cooling CCS2 combo
+#define GUN_TYPE_F                              (0x0D) //Liquid cooling CCS2 combo
+#define GUN_TYPE_G                              (0x0E) //GBT DC
+#define GUN_TYPE_T                              (0x0F) //Rema CCS1
+#define GUN_TYPE_D                              (0x10) //Rema CCS2
+#define GUN_TYPE_K                              (0x11) //CHAdeMO 200A/500V
+#define GUN_TYPE_M                              (0x12) //CCS2 80A
+#define GUN_TYPE_N                              (0x13) //CCS1 80A
+#define GUN_TYPE_P                              (0x14) //Phoenix CCS2 500A 水冷
+#define GUN_TYPE_R                              (0x15) //Phoenix CCS1 500A 水冷
+
+//------------------------------------------------------------------------------
+// rating current parameters
+//------------------------------------------------------------------------------
+#define RC_0A                                   (0)
+#define RC_60A                                  (600)
+#define RC_65A                                  (650)
+#define RC_80A                                  (800)
+#define RC_125A                                 (1250)
+#define RC_200A                                 (2000)
+#define RC_250A                                 (2500)
+#define RC_300A                                 (3000)
+#define RC_500A                                 (5000)
+
+//------------------------------------------------------------------------------
+// maximum voltage parameters
+//------------------------------------------------------------------------------
+#define VOL_CHADEMO                             (5000)
+#define VOL_CCS                                 (9500)
+#define VOL_GBT                                 (7500)
+
+#define DC_ONE                                  (7)
+#define DC_SEC                                  (9)
+#define AC_ONE                                  (8)
+
+//------------------------------------------------------------------------------
+// power parameters
+//------------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
+// rating current case
+//------------------------------------------------------------------------------
+//J
+#define DW_CE_30_J                              ((uint32_t)((MODEL_DW << 24) | (REG_CE << 16) | (POWER_30W << 8) | GUN_TYPE_J))
+#define DM_CE_30_J                              ((uint32_t)((MODEL_DM << 24) | (REG_CE << 16) | (POWER_30W << 8) | GUN_TYPE_J))
+
+#define DW_UL_30_J                              ((uint32_t)((MODEL_DW << 24) | (REG_UL << 16) | (POWER_30W << 8) | GUN_TYPE_J))
+#define DM_UL_30_J                              ((uint32_t)((MODEL_DM << 24) | (REG_UL << 16) | (POWER_30W << 8) | GUN_TYPE_J))
+
+#define DW_CNS_30_J                             ((uint32_t)((MODEL_DW << 24) | (REG_CNS << 16) | (POWER_30W << 8) | GUN_TYPE_J))
+#define DM_CNS_30_J                             ((uint32_t)((MODEL_DM << 24) | (REG_CNS << 16) | (POWER_30W << 8) | GUN_TYPE_J))
+
+#define DS_CE_60_J                              ((uint32_t)((MODEL_DS << 24) | (REG_CE << 16) | (POWER_60W << 8) | GUN_TYPE_J))
+#define DS_CE_90_J                              ((uint32_t)((MODEL_DS << 24) | (REG_CE << 16) | (POWER_90W << 8) | GUN_TYPE_J))
+#define DS_CE_120_J                             ((uint32_t)((MODEL_DS << 24) | (REG_CE << 16) | (POWER_120W << 8) | GUN_TYPE_J))
+#define DS_CE_150_J                             ((uint32_t)((MODEL_DS << 24) | (REG_CE << 16) | (POWER_150W << 8) | GUN_TYPE_J))
+#define DS_CE_180_J                             ((uint32_t)((MODEL_DS << 24) | (REG_CE << 16) | (POWER_180W << 8) | GUN_TYPE_J))
+
+#define DS_UL_60_J                              ((uint32_t)((MODEL_DS << 24) | (REG_UL << 16) | (POWER_60W << 8) | GUN_TYPE_J))
+#define DS_UL_90_J                              ((uint32_t)((MODEL_DS << 24) | (REG_UL << 16) | (POWER_90W << 8) | GUN_TYPE_J))
+#define DS_UL_120_J                             ((uint32_t)((MODEL_DS << 24) | (REG_UL << 16) | (POWER_120W << 8) | GUN_TYPE_J))
+#define DS_UL_150_J                             ((uint32_t)((MODEL_DS << 24) | (REG_UL << 16) | (POWER_150W << 8) | GUN_TYPE_J))
+#define DS_UL_180_J                             ((uint32_t)((MODEL_DS << 24) | (REG_UL << 16) | (POWER_180W << 8) | GUN_TYPE_J))
+
+#define DS_CNS_60_J                             ((uint32_t)((MODEL_DS << 24) | (REG_CNS << 16) | (POWER_60W << 8) | GUN_TYPE_J))
+#define DS_CNS_90_J                             ((uint32_t)((MODEL_DS << 24) | (REG_CNS << 16) | (POWER_90W << 8) | GUN_TYPE_J))
+#define DS_CNS_120_J                            ((uint32_t)((MODEL_DS << 24) | (REG_CNS << 16) | (POWER_120W << 8) | GUN_TYPE_J))
+#define DS_CNS_150_J                            ((uint32_t)((MODEL_DS << 24) | (REG_CNS << 16) | (POWER_150W << 8) | GUN_TYPE_J))
+#define DS_CNS_180_J                            ((uint32_t)((MODEL_DS << 24) | (REG_CNS << 16) | (POWER_180W << 8) | GUN_TYPE_J))
+
+//U
+#define DW_UL_30_U                              ((uint32_t)((MODEL_DW << 24) | (REG_UL << 16) | (POWER_30W << 8) | GUN_TYPE_U))
+#define DM_UL_30_U                              ((uint32_t)((MODEL_DM << 24) | (REG_UL << 16) | (POWER_30W << 8) | GUN_TYPE_U))
+
+#define DW_CNS_30_U                             ((uint32_t)((MODEL_DW << 24) | (REG_CNS << 16) | (POWER_30W << 8) | GUN_TYPE_U))
+#define DM_CNS_30_U                             ((uint32_t)((MODEL_DM << 24) | (REG_CNS << 16) | (POWER_30W << 8) | GUN_TYPE_U))
+
+#define DS_UL_60_U                              ((uint32_t)((MODEL_DS << 24) | (REG_UL << 16) | (POWER_60W << 8) | GUN_TYPE_U))
+#define DS_UL_90_U                              ((uint32_t)((MODEL_DS << 24) | (REG_UL << 16) | (POWER_90W << 8) | GUN_TYPE_U))
+#define DS_UL_120_U                             ((uint32_t)((MODEL_DS << 24) | (REG_UL << 16) | (POWER_120W << 8) | GUN_TYPE_U))
+#define DS_UL_150_U                             ((uint32_t)((MODEL_DS << 24) | (REG_UL << 16) | (POWER_150W << 8) | GUN_TYPE_U))
+#define DS_UL_180_U                             ((uint32_t)((MODEL_DS << 24) | (REG_UL << 16) | (POWER_180W << 8) | GUN_TYPE_U))
+
+#define DD_UL_360_U                             ((uint32_t)((MODEL_DD << 24) | (REG_UL << 16) | (POWER_360W << 8) | GUN_TYPE_U))
+
+#define DS_CNS_60_U                             ((uint32_t)((MODEL_DS << 24) | (REG_CNS << 16) | (POWER_60W << 8) | GUN_TYPE_U))
+#define DS_CNS_90_U                             ((uint32_t)((MODEL_DS << 24) | (REG_CNS << 16) | (POWER_90W << 8) | GUN_TYPE_U))
+#define DS_CNS_120_U                            ((uint32_t)((MODEL_DS << 24) | (REG_CNS << 16) | (POWER_120W << 8) | GUN_TYPE_U))
+#define DS_CNS_150_U                            ((uint32_t)((MODEL_DS << 24) | (REG_CNS << 16) | (POWER_150W << 8) | GUN_TYPE_U))
+#define DS_CNS_180_U                            ((uint32_t)((MODEL_DS << 24) | (REG_CNS << 16) | (POWER_180W << 8) | GUN_TYPE_U))
+
+#define DD_CNS_360_U                             ((uint32_t)((MODEL_DD << 24) | (REG_CNS << 16) | (POWER_360W << 8) | GUN_TYPE_U))
+
+//V
+#define DD_UL_360_V                             ((uint32_t)((MODEL_DD << 24) | (REG_UL << 16) | (POWER_360W << 8) | GUN_TYPE_V))
+
+#define DD_CNS_360_V                            ((uint32_t)((MODEL_DD << 24) | (REG_CNS << 16) | (POWER_360W << 8) | GUN_TYPE_V))
+
+#define DO_UL_360_V                             ((uint32_t)((MODEL_DO << 24) | (REG_UL << 16) | (POWER_360W << 8) | GUN_TYPE_V))
+
+#define DO_CNS_360_V                            ((uint32_t)((MODEL_DO << 24) | (REG_CNS << 16) | (POWER_360W << 8) | GUN_TYPE_V))
+
+//E
+#define DW_CE_30_E                              ((uint32_t)((MODEL_DW << 24) | (REG_CE << 16) | (POWER_30W << 8) | GUN_TYPE_E))
+#define DM_CE_30_E                              ((uint32_t)((MODEL_DM << 24) | (REG_CE << 16) | (POWER_30W << 8) | GUN_TYPE_E))
+
+#define DS_CE_60_E                              ((uint32_t)((MODEL_DS << 24) | (REG_CE << 16) | (POWER_60W << 8) | GUN_TYPE_E))
+#define DS_CE_90_E                              ((uint32_t)((MODEL_DS << 24) | (REG_CE << 16) | (POWER_90W << 8) | GUN_TYPE_E))
+#define DS_CE_120_E                             ((uint32_t)((MODEL_DS << 24) | (REG_CE << 16) | (POWER_120W << 8) | GUN_TYPE_E))
+#define DS_CE_150_E                             ((uint32_t)((MODEL_DS << 24) | (REG_CE << 16) | (POWER_150W << 8) | GUN_TYPE_E))
+#define DS_CE_180_E                             ((uint32_t)((MODEL_DS << 24) | (REG_CE << 16) | (POWER_180W << 8) | GUN_TYPE_E))
+
+//F
+#define DD_CE_360_F                             ((uint32_t)((MODEL_DD << 24) | (REG_CE << 16) | (POWER_360W << 8) | GUN_TYPE_F))
+
+#define DO_CE_360_F                             ((uint32_t)((MODEL_DO << 24) | (REG_CE << 16) | (POWER_360W << 8) | GUN_TYPE_F))
+
+//G
+#define DM_CNS_30_G                             ((uint32_t)((MODEL_DM << 24) | (REG_CNS << 16) | (POWER_30W << 8) | GUN_TYPE_G))
+
+#define DS_UL_30_G                              ((uint32_t)((MODEL_DS << 24) | (REG_UL << 16) | (POWER_30W << 8) | GUN_TYPE_G))
+#define DS_CNS_120_G                            ((uint32_t)((MODEL_DS << 24) | (REG_CNS << 16) | (POWER_120W << 8) | GUN_TYPE_G))
+
+//T
+#define DS_CE_90_T                              ((uint32_t)((MODEL_DS << 24) | (REG_CE << 16) | (POWER_90W << 8) | GUN_TYPE_T))
+#define DS_CE_120_T                             ((uint32_t)((MODEL_DS << 24) | (REG_CE << 16) | (POWER_120W << 8) | GUN_TYPE_T))
+#define DS_CE_150_T                             ((uint32_t)((MODEL_DS << 24) | (REG_CE << 16) | (POWER_150W << 8) | GUN_TYPE_T))
+#define DS_CE_180_T                             ((uint32_t)((MODEL_DS << 24) | (REG_CE << 16) | (POWER_180W << 8) | GUN_TYPE_T))
+
+#define DD_CE_360_T                             ((uint32_t)((MODEL_DD << 24) | (REG_CE << 16) | (POWER_360W << 8) | GUN_TYPE_T))
+
+#define DS_UL_90_T                              ((uint32_t)((MODEL_DS << 24) | (REG_UL << 16) | (POWER_90W << 8) | GUN_TYPE_T))
+#define DS_UL_120_T                             ((uint32_t)((MODEL_DS << 24) | (REG_UL << 16) | (POWER_120W << 8) | GUN_TYPE_T))
+#define DS_UL_150_T                             ((uint32_t)((MODEL_DS << 24) | (REG_UL << 16) | (POWER_150W << 8) | GUN_TYPE_T))
+#define DS_UL_180_T                             ((uint32_t)((MODEL_DS << 24) | (REG_UL << 16) | (POWER_180W << 8) | GUN_TYPE_T))
+
+#define DD_UL_360_T                             ((uint32_t)((MODEL_DD << 24) | (REG_UL << 16) | (POWER_360W << 8) | GUN_TYPE_T))
+
+#define DS_CNS_90_T                             ((uint32_t)((MODEL_DS << 24) | (REG_CNS << 16) | (POWER_90W << 8) | GUN_TYPE_T))
+#define DS_CNS_120_T                            ((uint32_t)((MODEL_DS << 24) | (REG_CNS << 16) | (POWER_120W << 8) | GUN_TYPE_T))
+#define DS_CNS_150_T                            ((uint32_t)((MODEL_DS << 24) | (REG_CNS << 16) | (POWER_150W << 8) | GUN_TYPE_T))
+#define DS_CNS_180_T                            ((uint32_t)((MODEL_DS << 24) | (REG_CNS << 16) | (POWER_180W << 8) | GUN_TYPE_T))
+
+#define DD_CNS_360_T                            ((uint32_t)((MODEL_DD << 24) | (REG_CNS << 16) | (POWER_360W << 8) | GUN_TYPE_T))
+
+//D
+#define DS_CE_90_D                              ((uint32_t)((MODEL_DS << 24) | (REG_CE << 16) | (POWER_90W << 8) | GUN_TYPE_D))
+#define DS_CE_120_D                             ((uint32_t)((MODEL_DS << 24) | (REG_CE << 16) | (POWER_120W << 8) | GUN_TYPE_D))
+#define DS_CE_150_D                             ((uint32_t)((MODEL_DS << 24) | (REG_CE << 16) | (POWER_150W << 8) | GUN_TYPE_D))
+#define DS_CE_180_D                             ((uint32_t)((MODEL_DS << 24) | (REG_CE << 16) | (POWER_180W << 8) | GUN_TYPE_D))
+
+#define DD_CE_360_D                             ((uint32_t)((MODEL_DD << 24) | (REG_CE << 16) | (POWER_360W << 8) | GUN_TYPE_D))
+
+#define DS_UL_90_D                              ((uint32_t)((MODEL_DS << 24) | (REG_UL << 16) | (POWER_90W << 8) | GUN_TYPE_D))
+#define DS_UL_120_D                             ((uint32_t)((MODEL_DS << 24) | (REG_UL << 16) | (POWER_120W << 8) | GUN_TYPE_D))
+#define DS_UL_150_D                             ((uint32_t)((MODEL_DS << 24) | (REG_UL << 16) | (POWER_150W << 8) | GUN_TYPE_D))
+#define DS_UL_180_D                             ((uint32_t)((MODEL_DS << 24) | (REG_UL << 16) | (POWER_180W << 8) | GUN_TYPE_D))
+
+#define DD_UL_360_D                             ((uint32_t)((MODEL_DD << 24) | (REG_UL << 16) | (POWER_360W << 8) | GUN_TYPE_D))
+
+#define DS_CNS_90_D                             ((uint32_t)((MODEL_DS << 24) | (REG_CNS << 16) | (POWER_90W << 8) | GUN_TYPE_D))
+#define DS_CNS_120_D                            ((uint32_t)((MODEL_DS << 24) | (REG_CNS << 16) | (POWER_120W << 8) | GUN_TYPE_D))
+#define DS_CNS_150_D                            ((uint32_t)((MODEL_DS << 24) | (REG_CNS << 16) | (POWER_150W << 8) | GUN_TYPE_D))
+#define DS_CNS_180_D                            ((uint32_t)((MODEL_DS << 24) | (REG_CNS << 16) | (POWER_180W << 8) | GUN_TYPE_D))
+
+#define DD_CNS_360_D                            ((uint32_t)((MODEL_DD << 24) | (REG_CNS << 16) | (POWER_360W << 8) | GUN_TYPE_D))
+
+//K
+#define DS_CE_90_K                              ((uint32_t)((MODEL_DS << 24) | (REG_CE << 16) | (POWER_90W << 8) | GUN_TYPE_K))
+#define DS_CE_120_K                             ((uint32_t)((MODEL_DS << 24) | (REG_CE << 16) | (POWER_120W << 8) | GUN_TYPE_K))
+#define DS_CE_150_K                             ((uint32_t)((MODEL_DS << 24) | (REG_CE << 16) | (POWER_150W << 8) | GUN_TYPE_K))
+#define DS_CE_180_K                             ((uint32_t)((MODEL_DS << 24) | (REG_CE << 16) | (POWER_180W << 8) | GUN_TYPE_K))
+
+#define DD_CE_360_K                             ((uint32_t)((MODEL_DD << 24) | (REG_CE << 16) | (POWER_360W << 8) | GUN_TYPE_K))
+
+#define DS_UL_90_K                              ((uint32_t)((MODEL_DS << 24) | (REG_UL << 16) | (POWER_90W << 8) | GUN_TYPE_K))
+#define DS_UL_120_K                             ((uint32_t)((MODEL_DS << 24) | (REG_UL << 16) | (POWER_120W << 8) | GUN_TYPE_K))
+#define DS_UL_150_K                             ((uint32_t)((MODEL_DS << 24) | (REG_UL << 16) | (POWER_150W << 8) | GUN_TYPE_K))
+#define DS_UL_180_K                             ((uint32_t)((MODEL_DS << 24) | (REG_UL << 16) | (POWER_180W << 8) | GUN_TYPE_K))
+
+#define DD_UL_360_K                             ((uint32_t)((MODEL_DD << 24) | (REG_UL << 16) | (POWER_360W << 8) | GUN_TYPE_K))
+
+//M
+#define DW_CE_30_M                              ((uint32_t)((MODEL_DW << 24) | (REG_CE << 16) | (POWER_30W << 8) | GUN_TYPE_M))
+#define DM_CE_30_M                              ((uint32_t)((MODEL_DM << 24) | (REG_CE << 16) | (POWER_30W << 8) | GUN_TYPE_M))
+
+//N
+#define DW_UL_30_N                              ((uint32_t)((MODEL_DW << 24) | (REG_UL << 16) | (POWER_30W << 8) | GUN_TYPE_N))
+#define DM_UL_30_N                              ((uint32_t)((MODEL_DM << 24) | (REG_UL << 16) | (POWER_30W << 8) | GUN_TYPE_N))
+
+#define DW_CNS_30_N                             ((uint32_t)((MODEL_DW << 24) | (REG_CNS << 16) | (POWER_30W << 8) | GUN_TYPE_N))
+#define DM_CNS_30_N                             ((uint32_t)((MODEL_DM << 24) | (REG_CNS << 16) | (POWER_30W << 8) | GUN_TYPE_N))
+
+//P
+#define DD_CE_360_P                             ((uint32_t)((MODEL_DD << 24) | (REG_CE << 16) | (POWER_360W << 8) | GUN_TYPE_P))
+
+//R
+#define DD_UL_360_R                             ((uint32_t)((MODEL_DD << 24) | (REG_UL << 16) | (POWER_360W << 8) | GUN_TYPE_R))
+
+#define DD_CNS_360_R                            ((uint32_t)((MODEL_DD << 24) | (REG_CNS << 16) | (POWER_360W << 8) | GUN_TYPE_R))
+
+//------------------------------------------------------------------------------
+typedef enum EnGunType {
+    Gun_Type_Chademo = 0,
+    Gun_Type_CCS_2,
+    Gun_Type_GB,
+    Gun_Type_AC,
+} GunType;
+
+typedef struct StSymStruct {
+    char *key;
+    int val;
+} SymStruct;
+
+typedef struct StGunTypeAndVolInfo {
+    uint8_t GunType;
+    uint16_t GunVoltage;
+} GunTypeAndVolInfo;
+
+typedef struct StGunRateCurInfo {
+    uint8_t GunType;
+    uint16_t RatingCurrent; //* 0.1A
+    uint16_t Voltage;       //* 0.1V
+    uint16_t Power;
+    uint8_t Reserved;
+} GunRateCurInfo;
+
+//------------------------------------------------------------------------------
+int ModuleRatedCurrentParsing(char *pModuleName, void *pDestStruct, uint8_t parsingCount);
+void TestRatedCurrentParsing(void);
+
+#endif /* _MODULE_NAME_PARSING_H_ */

+ 10 - 8
EVSE/Projects/DD360/Apps/Makefile

@@ -16,14 +16,16 @@ Internal485ProtocolLib = -L $(ModularizationPath)/Internal485Protocol -lInternal
 
 #define library variable
 Lib_Module_RFID = "-L$(ModularizationPath)" -lModule_RFID
+RFID_H = -include$(ModularizationPath)/Module_RFID.h
+
 Lib_Module_Upgrade = "-L$(ModularizationPath)" -lModule_Upgrade
-Lib_SQLite3 = "-L$(ModularizationPath)/ocppfiles" -lsqlite3
-#Lib_Module_RatingCurrent = "-L$(ModularizationPath)" -lModule_RatingCurrent
+ModuleUpgrade_H = -include$(ModularizationPath)/Module_Upgrade.h
 
+Lib_SQLite3 = "-L$(ModularizationPath)/ocppfiles" -lsqlite3
 SQLite3_H = -include$(ModularizationPath)/ocppfiles/sqlite3.h
-ModuleUpgrade_H = -include$(ModularizationPath)/Module_Upgrade.h
-RFID_H = -include$(ModularizationPath)/Module_RFID.h
-#RatingCurrent_H = -include$(ModularizationPath)/Module_RatingCurrent.h
+
+Lib_Module_RatedCurrent = "-L$(ModularizationPath)" -lModule_RatedCurrent
+RatedCurrent_H = -include$(ModularizationPath)/Module_RatedCurrent.h
 
 InfypwrPsuComm_H = -include$(ModularizationPath)/Infypwr_PsuCommObj.h
 InfypwrPsuComm_A = $(ModularizationPath)/libInfypwr_PsuCommObj.a
@@ -39,9 +41,9 @@ apps: MainTask DoCommTask EvCommTask \
 LOG_INC = Log
 
 MainTask:
-	$(CC) -D $(Project) -includeConfig.h $(SQLite3_H) $(ModuleUpgrade_H) $(RFID_H) $(CFLAGS) -o main.o ReMain.c
-	$(CC) -D $(Project) -includeConfig.h $(SQLite3_H) $(ModuleUpgrade_H) $(RFID_H) $(CFLAGS) -o timeout.o timeout.c
-	$(CC) $(TFLAGS) -o main main.o timeout.o ${Lib_Module_RFID} ${Lib_Module_Upgrade} ${Lib_SQLite3} $(Lib_Module_RatingCurrent)
+	$(CC) -D $(Project) -includeConfig.h $(SQLite3_H) $(ModuleUpgrade_H) $(RFID_H) $(RatedCurrent_H) $(CFLAGS) -o main.o ReMain.c
+	$(CC) -D $(Project) -includeConfig.h $(SQLite3_H) $(ModuleUpgrade_H) $(RFID_H) $(RatedCurrent_H) $(CFLAGS) -o timeout.o timeout.c
+	$(CC) $(TFLAGS) -o main main.o timeout.o ${Lib_Module_RFID} ${Lib_Module_Upgrade} ${Lib_SQLite3} $(Lib_Module_RatedCurrent)
 
 DoCommTask:
 	$(CC) -D $(Project) -includeConfig.h $(CFLAGS) -o DoComm.o ReDoComm.c

+ 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;

+ 3 - 3
EVSE/Projects/DD360/Apps/ReDoComm.c

@@ -1056,7 +1056,7 @@ static int responsePackeHandle(int fd, uint8_t *pResult, uint8_t plugNum, uint8_
 
     case REG_DISPENSER_STATUS:
         memset(&gPreSysWarningInfo, 0, sizeof(struct WARNING_CODE_INFO));
-        memcpy(&gPreSysWarningInfo,
+        memcpy((uint8_t *)&gPreSysWarningInfo,
                &(ShmSysConfigAndInfo->SysWarningInfo),
                sizeof(struct WARNING_CODE_INFO));
         break;
@@ -1995,7 +1995,7 @@ static void systemStatusProcess(int fd, uint8_t totalGun, uint8_t plugNum, uint8
         ftime(&AuthNowTime);
         if (DiffTimeb(gRegTimeUp[plugNum][REG_CHARGING_PERMISSION], AuthNowTime) > LOOP_RETRY_TIME) {
             if (readChargePermission(fd, gunID) == 0) {
-                DEBUG_INFO("Stop charging by power cabinet's permission = %d, %d\r\n",
+                DEBUG_INFO("S_PREPARING_FOR_EV Stop charging by power cabinet's permission = %d, %d\r\n",
                            plugNum,
                            REG_CHARGING_PERMISSION);
                 ChargingData[plugNum]->StopChargeFlag = POWER_CABINET_STOP_CHARGING;
@@ -2024,7 +2024,7 @@ static void systemStatusProcess(int fd, uint8_t totalGun, uint8_t plugNum, uint8
         ftime(&AuthNowTime);
         if (DiffTimeb(gRegTimeUp[plugNum][REG_CHARGING_PERMISSION], AuthNowTime) > LOOP_RETRY_TIME) {
             if (readChargePermission(fd, gunID) == 0) {
-                DEBUG_INFO("Stop charging by power cabinet's permission = %d, %d\r\n",
+                DEBUG_INFO("S_PREPARING_FOR_EVSE Stop charging by power cabinet's permission = %d, %d\r\n",
                            plugNum,
                            REG_CHARGING_PERMISSION);
                 ChargingData[plugNum]->StopChargeFlag = POWER_CABINET_STOP_CHARGING;

+ 29 - 14
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;
@@ -1683,7 +1683,10 @@ void SelfTestRun()
                 if (!evInitFlag) {
                     evInitFlag = YES;
                     for (byte index = 0; index < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount; index++) {
-                        //log_info("index = %d, charging index = %d, type = %d\r\n", index, chargingInfo[index]->type_index, chargingInfo[index]->Type);
+                        //log_info("index = %d, charging index = %d, type = %d\r\n",
+                        //         index,
+                        //         chargingInfo[index]->type_index,
+                        //         chargingInfo[index]->Type);
                         if (chargingInfo[index]->Type == _Type_Chademo) {
                             if ((strlen((char *)ShmCHAdeMOData->evse[chargingInfo[index]->type_index].version) != 0 ||
                                     ShmCHAdeMOData->evse[chargingInfo[index]->type_index].version[0] != '\0')
@@ -1903,7 +1906,7 @@ int isEvBoardStopChargeFlag(byte gunIndex)
 
 bool isEvBoardNormalStopChargeFlag(byte gunIndex)
 {
-    return chargingInfo[gunIndex]->UnKnowStopChargeFlag;
+    return chargingInfo[gunIndex]->NormalStopChargeFlag;
 }
 
 //===============================================
@@ -2301,6 +2304,14 @@ void ReleaseAlarmCode(byte gunIndex)
             }
         }
     }
+
+    if (strncmp((char *)chargingInfo[gunIndex]->ConnectorAlarmCode, "012251", 6) == EQUAL ||
+            strncmp((char *)chargingInfo[gunIndex]->ConnectorAlarmCode, "012252", 6) == EQUAL ||
+            strncmp((char *)chargingInfo[gunIndex]->ConnectorAlarmCode, "012238", 6) == EQUAL ||
+            strncmp((char *)chargingInfo[gunIndex]->ConnectorAlarmCode, "012304", 6) == EQUAL
+       ) {
+        memset(chargingInfo[gunIndex]->ConnectorAlarmCode, 0, sizeof(chargingInfo[gunIndex]->ConnectorAlarmCode));
+    }
 }
 
 void ReleaseWarningCodeByString(byte gunIndex, char *code)
@@ -2822,15 +2833,17 @@ void CheckErrorOccurStatus(byte index)
         }
     }
     //--------------------------------------------------------------------------
-    //Primary
-    if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.EmergencyStopTrip == YES) {
-        memcpy(chargingInfo[index]->ConnectorAlarmCode, "012251", 6);
-    } else if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.DoorOpen == YES) {
-        memcpy(chargingInfo[index]->ConnectorAlarmCode, "012252", 6);
-    } else if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.MainPowerBreakerTrip == YES) {
-        memcpy(chargingInfo[index]->ConnectorAlarmCode, "012238", 6);
-    } else if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.DisconnectedFromDo == YES) {
-        memcpy(chargingInfo[index]->ConnectorAlarmCode, "012304", 6);
+    if (strlen(chargingInfo[index]->ConnectorAlarmCode) == 0) {
+        //Primary
+        if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.EmergencyStopTrip == YES) {
+            memcpy(chargingInfo[index]->ConnectorAlarmCode, "012251", 6);
+        } else if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.DoorOpen == YES) {
+            memcpy(chargingInfo[index]->ConnectorAlarmCode, "012252", 6);
+        } else if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.MainPowerBreakerTrip == YES) {
+            memcpy(chargingInfo[index]->ConnectorAlarmCode, "012238", 6);
+        } else if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.DisconnectedFromDo == YES) {
+            memcpy(chargingInfo[index]->ConnectorAlarmCode, "012304", 6);
+        }
     }
 }
 
@@ -3293,7 +3306,8 @@ bool AddGunInfoByConnector(byte typeValue, byte slots)
         break;
     case '6': // GB/T AC Socket
         break;
-    case 'J': { // CHAdeMO
+    case 'J':
+    case 'K': { // CHAdeMO
         if (CHAdeMO_QUANTITY > _chademoIndex) {
             chargingInfo[_gunIndex] = &ShmSysConfigAndInfo->SysInfo.ChademoChargingData[_chademoIndex];
             chargingInfo[_gunIndex]->Index = _gunIndex;
@@ -5616,6 +5630,8 @@ int main(void)
             //PRINTF_FUNC("index = %d, ErrorCode = %s \n", gun_index, ShmOCPP16Data->StatusNotification[gun_index].ErrorCode);
             switch (chargingInfo[gun_index]->SystemStatus) {
             case S_IDLE:
+                ReleaseAlarmCode(gun_index);
+
                 if (isModeChange(gun_index)) {
                     log_info("S_IDLE================================== %x \n", gun_index);
                     chargingInfo[gun_index]->PresentChargedDuration = 0;
@@ -5813,7 +5829,6 @@ int main(void)
                         }
                     }
 #endif //defined METER_ENABLE
-                    ReleaseAlarmCode(gun_index);
                 }
             }
             break;

+ 62 - 21
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; }
                 }
             }
         }
@@ -1922,7 +1935,8 @@ bool AbnormalStopAnalysis(byte gun_index, byte *errCode)
     //        strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "", 6) != EQUAL) {
     //    return;
     //}
-    if (strncmp(string, "000000", 6) == EQUAL) {
+    if (strncmp(string, "000000", 6) == EQUAL ||
+            strncmp(string, "023979", 6) == EQUAL) {
         return false;
     }
 
@@ -2178,6 +2192,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;
 }
 
@@ -2263,6 +2280,7 @@ void CANReceiver()
                         break;
                     }
                 }
+                //PRINTF_FUNC("target = %d, %d, %d\r\n", target, _chargingData[targetGun]->Evboard_id, targetGun);
 
                 if (targetGun < 0 || targetGun >= CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY) {
                     PRINTF_FUNC("EvComm (CANReceiver) : Target index = %x is < 0 or > QUANTITY \n", targetGun);
@@ -2473,12 +2491,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;
@@ -2900,16 +2925,32 @@ void FormatVoltageAndCurrent()
             }
         } else {
             if (_chargingData[_index]->Type == _Type_Chademo) {
-                maxChargingCur[_index] = 1200;
+                if (_index == 0) {
+                    if (strncmp((char *)&ShmSysConfigAndInfo->SysConfig.ModelName[7], "K", 1) == 0) {
+                        maxChargingCur[_index] = 2000;
+                    } else {
+                        maxChargingCur[_index] = 1200;
+                    }
+                } else if (_index == 1) {
+                    if (strncmp((char *)&ShmSysConfigAndInfo->SysConfig.ModelName[9], "K", 1) == 0) {
+                        maxChargingCur[_index] = 2000;
+                    } else {
+                        maxChargingCur[_index] = 1200;
+                    }
+                }
             } else if (_chargingData[_index]->Type == _Type_CCS_2) {
                 if (_index == 0) {
-                    if (strncmp((char *)&ShmSysConfigAndInfo->SysConfig.ModelName[7], "V", 1) == 0) {
+                    if ((strncmp((char *)&ShmSysConfigAndInfo->SysConfig.ModelName[7], "V", 1) == 0) ||
+                            (strncmp((char *)&ShmSysConfigAndInfo->SysConfig.ModelName[7], "F", 1) == 0)
+                       ) {
                         maxChargingCur[_index] = 5000;
                     } else {
                         maxChargingCur[_index] = 2000;
                     }
                 } else if (_index == 1) {
-                    if (strncmp((char *)&ShmSysConfigAndInfo->SysConfig.ModelName[9], "V", 1) == 0) {
+                    if ((strncmp((char *)&ShmSysConfigAndInfo->SysConfig.ModelName[9], "V", 1) == 0) ||
+                            (strncmp((char *)&ShmSysConfigAndInfo->SysConfig.ModelName[9], "F", 1) == 0)
+                       ) {
                         maxChargingCur[_index] = 5000;
                     } else {
                         maxChargingCur[_index] = 2000;
@@ -3069,7 +3110,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
@@ -3204,7 +3245,7 @@ int main(int argc, char *argv[])
 
                 if (priorityLow % 5 == 1) {
                     // 取得車端電池資訊 : 1.AC or DC ? 2.Total battery cap, 3.Max battery vol, 4.Max battery cur
-                    GetEvBatteryInfo(_index, targetID); //DS60-120 add
+                    GetEvBatteryInfo(_index, _chargingData[_index]->Evboard_id); //DS60-120 add
 
                     // 樁端輸出能力改變
                     if (gun_count == 1) {
@@ -3389,7 +3430,7 @@ int main(int argc, char *argv[])
                                               _chargingData[_index]->AvailableChargingPower,
                                               maxCur,
                                               maxVol,
-                                              targetID);
+                                              _chargingData[_index]->Evboard_id);
                     }
                 }
             }
@@ -3417,16 +3458,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;

+ 3 - 4
EVSE/Projects/DD360/Apps/ReModule_InternalComm.c

@@ -33,7 +33,6 @@
 #include "internalComm.h"
 #include "Config.h"
 
-#define AudiCustomized              1
 #define ARRAY_SIZE(A)       (sizeof(A) / sizeof(A[0]))
 #define PASS                1
 #define FAIL                -1
@@ -1348,7 +1347,7 @@ void SetLedColor(struct ChargingInfoData *chargingData_1, struct ChargingInfoDat
                     (chargingData_2->SystemStatus == S_BOOTING ||
                      chargingData_2->SystemStatus == S_IDLE ||
                      chargingData_2->SystemStatus == S_RESERVATION)) {
-#ifdef AudiCustomized
+#if defined DD360Audi
                 led_color.Connect_1_Green = _colorBuf;
                 led_color.Connect_1_Blue = _colorBuf;
                 led_color.Connect_1_Red = _colorBuf;
@@ -1391,7 +1390,7 @@ void SetLedColor(struct ChargingInfoData *chargingData_1, struct ChargingInfoDat
                     led_color.Connect_1_Blue = COLOR_MIN_LV;
                     led_color.Connect_1_Red = _colorBuf;
                 } else {
-#ifdef AudiCustomized
+#if defined DD360Audi
                     led_color.Connect_1_Green = _colorBuf;
                     led_color.Connect_1_Blue = _colorBuf;
                     led_color.Connect_1_Red = _colorBuf;
@@ -1420,7 +1419,7 @@ void SetLedColor(struct ChargingInfoData *chargingData_1, struct ChargingInfoDat
                     led_color.Connect_2_Blue = COLOR_MIN_LV;
                     led_color.Connect_2_Red = _colorBuf;
                 } else {
-#ifdef AudiCustomized
+#if defined DD360Audi
                     led_color.Connect_2_Green = _colorBuf;
                     led_color.Connect_2_Blue = _colorBuf;
                     led_color.Connect_2_Red = _colorBuf;

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 480 - 587
EVSE/Projects/DD360/Apps/ReadCmdline.c


BIN
EVSE/Projects/DD360/Apps/UnsafetyOutputTask


+ 5 - 4
EVSE/Projects/DD360/Apps/main.c

@@ -2421,6 +2421,7 @@ void CheckGunTypeFromHw()
         case 23:
             bd1_2_status = gpioValue;
             break;
+
         case 44:
             bd0_1_status = gpioValue;
             break;
@@ -2438,16 +2439,16 @@ void CheckGunTypeFromHw()
     for (int i = 0; i < 2; i++) {
         switch (tmp[i]) {
         case 0x01:
-            DEBUG_INFO_MSG("BD%d(%s) = %s ", i + 1, i == 1 ? "Right" : "Left", "CHAdeMO");
+            DEBUG_INFO_MSG("BD%d(%s) = %s ", i + 1, i + 1 == 1 ? "Right" : "Left", "CHAdeMO");
             break;
         case 0x10:
-            DEBUG_INFO_MSG("BD%d(%s) = %s ", i + 1, i == 1 ? "Right" : "Left", "CCS");
+            DEBUG_INFO_MSG("BD%d(%s) = %s ", i + 1, i + 1 == 1 ? "Right" : "Left", "CCS");
             break;
         case 0x11:
-            DEBUG_INFO_MSG("BD%d(%s) = %s ", i + 1, i == 1 ? "Right" : "Left", "GBT");
+            DEBUG_INFO_MSG("BD%d(%s) = %s ", i + 1, i + 1 == 1 ? "Right" : "Left", "GBT");
             break;
         case 0x00:
-            DEBUG_INFO_MSG("BD%d(%s) = %s ", i + 1, i == 1 ? "Right" : "Left", "None");
+            DEBUG_INFO_MSG("BD%d(%s) = %s ", i + 1, i + 1 == 1 ? "Right" : "Left", "None");
             break;
         }
     }

BIN
EVSE/Projects/DD360/Images/ACYE0000000\002P0_FactoryDefaultConfig.bin


BIN
EVSE/Projects/DD360/Images/DDYE182V0UD2AU_FactoryDefaultConfig.bin


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/UnsafetyOutputTask


BIN
EVSE/Projects/DD360/output/main


+ 10 - 8
EVSE/Projects/DD360Audi/Apps/Makefile

@@ -16,14 +16,16 @@ Internal485ProtocolLib = -L $(ModularizationPath)/Internal485Protocol -lInternal
 
 #define library variable
 Lib_Module_RFID = "-L$(ModularizationPath)" -lModule_RFID
+RFID_H = -include$(ModularizationPath)/Module_RFID.h
+
 Lib_Module_Upgrade = "-L$(ModularizationPath)" -lModule_Upgrade
-Lib_SQLite3 = "-L$(ModularizationPath)/ocppfiles" -lsqlite3
-#Lib_Module_RatingCurrent = "-L$(ModularizationPath)" -lModule_RatingCurrent
+ModuleUpgrade_H = -include$(ModularizationPath)/Module_Upgrade.h
 
+Lib_SQLite3 = "-L$(ModularizationPath)/ocppfiles" -lsqlite3
 SQLite3_H = -include$(ModularizationPath)/ocppfiles/sqlite3.h
-ModuleUpgrade_H = -include$(ModularizationPath)/Module_Upgrade.h
-RFID_H = -include$(ModularizationPath)/Module_RFID.h
-#RatingCurrent_H = -include$(ModularizationPath)/Module_RatingCurrent.h
+
+Lib_Module_RatedCurrent = "-L$(ModularizationPath)" -lModule_RatedCurrent
+RatedCurrent_H = -include$(ModularizationPath)/Module_RatedCurrent.h
 
 InfypwrPsuComm_H = -include$(ModularizationPath)/Infypwr_PsuCommObj.h
 InfypwrPsuComm_A = $(ModularizationPath)/libInfypwr_PsuCommObj.a
@@ -39,9 +41,9 @@ apps: MainTask DoCommTask EvCommTask \
 LOG_INC = Log
 
 MainTask:
-	$(CC) -D $(Project) -includeConfig.h $(SQLite3_H) $(ModuleUpgrade_H) $(RFID_H) $(CFLAGS) -o main.o ReMain.c
-	$(CC) -D $(Project) -includeConfig.h $(SQLite3_H) $(ModuleUpgrade_H) $(RFID_H) $(CFLAGS) -o timeout.o timeout.c
-	$(CC) $(TFLAGS) -o main main.o timeout.o ${Lib_Module_RFID} ${Lib_Module_Upgrade} ${Lib_SQLite3} $(Lib_Module_RatingCurrent)
+	$(CC) -D $(Project) -includeConfig.h $(SQLite3_H) $(ModuleUpgrade_H) $(RFID_H) $(RatedCurrent_H) $(CFLAGS) -o main.o ReMain.c
+	$(CC) -D $(Project) -includeConfig.h $(SQLite3_H) $(ModuleUpgrade_H) $(RFID_H) $(RatedCurrent_H) $(CFLAGS) -o timeout.o timeout.c
+	$(CC) $(TFLAGS) -o main main.o timeout.o ${Lib_Module_RFID} ${Lib_Module_Upgrade} ${Lib_SQLite3} $(Lib_Module_RatedCurrent)
 
 DoCommTask:
 	$(CC) -D $(Project) -includeConfig.h $(CFLAGS) -o DoComm.o ReDoComm.c

+ 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;

+ 3 - 3
EVSE/Projects/DD360Audi/Apps/ReDoComm.c

@@ -1056,7 +1056,7 @@ static int responsePackeHandle(int fd, uint8_t *pResult, uint8_t plugNum, uint8_
 
     case REG_DISPENSER_STATUS:
         memset(&gPreSysWarningInfo, 0, sizeof(struct WARNING_CODE_INFO));
-        memcpy(&gPreSysWarningInfo,
+        memcpy((uint8_t *)&gPreSysWarningInfo,
                &(ShmSysConfigAndInfo->SysWarningInfo),
                sizeof(struct WARNING_CODE_INFO));
         break;
@@ -1995,7 +1995,7 @@ static void systemStatusProcess(int fd, uint8_t totalGun, uint8_t plugNum, uint8
         ftime(&AuthNowTime);
         if (DiffTimeb(gRegTimeUp[plugNum][REG_CHARGING_PERMISSION], AuthNowTime) > LOOP_RETRY_TIME) {
             if (readChargePermission(fd, gunID) == 0) {
-                DEBUG_INFO("Stop charging by power cabinet's permission = %d, %d\r\n",
+                DEBUG_INFO("S_PREPARING_FOR_EV Stop charging by power cabinet's permission = %d, %d\r\n",
                            plugNum,
                            REG_CHARGING_PERMISSION);
                 ChargingData[plugNum]->StopChargeFlag = POWER_CABINET_STOP_CHARGING;
@@ -2024,7 +2024,7 @@ static void systemStatusProcess(int fd, uint8_t totalGun, uint8_t plugNum, uint8
         ftime(&AuthNowTime);
         if (DiffTimeb(gRegTimeUp[plugNum][REG_CHARGING_PERMISSION], AuthNowTime) > LOOP_RETRY_TIME) {
             if (readChargePermission(fd, gunID) == 0) {
-                DEBUG_INFO("Stop charging by power cabinet's permission = %d, %d\r\n",
+                DEBUG_INFO("S_PREPARING_FOR_EVSE Stop charging by power cabinet's permission = %d, %d\r\n",
                            plugNum,
                            REG_CHARGING_PERMISSION);
                 ChargingData[plugNum]->StopChargeFlag = POWER_CABINET_STOP_CHARGING;

+ 29 - 14
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;
@@ -1683,7 +1683,10 @@ void SelfTestRun()
                 if (!evInitFlag) {
                     evInitFlag = YES;
                     for (byte index = 0; index < ShmSysConfigAndInfo->SysConfig.TotalConnectorCount; index++) {
-                        //log_info("index = %d, charging index = %d, type = %d\r\n", index, chargingInfo[index]->type_index, chargingInfo[index]->Type);
+                        //log_info("index = %d, charging index = %d, type = %d\r\n",
+                        //         index,
+                        //         chargingInfo[index]->type_index,
+                        //         chargingInfo[index]->Type);
                         if (chargingInfo[index]->Type == _Type_Chademo) {
                             if ((strlen((char *)ShmCHAdeMOData->evse[chargingInfo[index]->type_index].version) != 0 ||
                                     ShmCHAdeMOData->evse[chargingInfo[index]->type_index].version[0] != '\0')
@@ -1903,7 +1906,7 @@ int isEvBoardStopChargeFlag(byte gunIndex)
 
 bool isEvBoardNormalStopChargeFlag(byte gunIndex)
 {
-    return chargingInfo[gunIndex]->UnKnowStopChargeFlag;
+    return chargingInfo[gunIndex]->NormalStopChargeFlag;
 }
 
 //===============================================
@@ -2301,6 +2304,14 @@ void ReleaseAlarmCode(byte gunIndex)
             }
         }
     }
+
+    if (strncmp((char *)chargingInfo[gunIndex]->ConnectorAlarmCode, "012251", 6) == EQUAL ||
+            strncmp((char *)chargingInfo[gunIndex]->ConnectorAlarmCode, "012252", 6) == EQUAL ||
+            strncmp((char *)chargingInfo[gunIndex]->ConnectorAlarmCode, "012238", 6) == EQUAL ||
+            strncmp((char *)chargingInfo[gunIndex]->ConnectorAlarmCode, "012304", 6) == EQUAL
+       ) {
+        memset(chargingInfo[gunIndex]->ConnectorAlarmCode, 0, sizeof(chargingInfo[gunIndex]->ConnectorAlarmCode));
+    }
 }
 
 void ReleaseWarningCodeByString(byte gunIndex, char *code)
@@ -2822,15 +2833,17 @@ void CheckErrorOccurStatus(byte index)
         }
     }
     //--------------------------------------------------------------------------
-    //Primary
-    if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.EmergencyStopTrip == YES) {
-        memcpy(chargingInfo[index]->ConnectorAlarmCode, "012251", 6);
-    } else if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.DoorOpen == YES) {
-        memcpy(chargingInfo[index]->ConnectorAlarmCode, "012252", 6);
-    } else if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.MainPowerBreakerTrip == YES) {
-        memcpy(chargingInfo[index]->ConnectorAlarmCode, "012238", 6);
-    } else if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.DisconnectedFromDo == YES) {
-        memcpy(chargingInfo[index]->ConnectorAlarmCode, "012304", 6);
+    if (strlen(chargingInfo[index]->ConnectorAlarmCode) == 0) {
+        //Primary
+        if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.EmergencyStopTrip == YES) {
+            memcpy(chargingInfo[index]->ConnectorAlarmCode, "012251", 6);
+        } else if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.DoorOpen == YES) {
+            memcpy(chargingInfo[index]->ConnectorAlarmCode, "012252", 6);
+        } else if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.MainPowerBreakerTrip == YES) {
+            memcpy(chargingInfo[index]->ConnectorAlarmCode, "012238", 6);
+        } else if (ShmStatusCodeData->AlarmCode.AlarmEvents.bits.DisconnectedFromDo == YES) {
+            memcpy(chargingInfo[index]->ConnectorAlarmCode, "012304", 6);
+        }
     }
 }
 
@@ -3293,7 +3306,8 @@ bool AddGunInfoByConnector(byte typeValue, byte slots)
         break;
     case '6': // GB/T AC Socket
         break;
-    case 'J': { // CHAdeMO
+    case 'J':
+    case 'K': { // CHAdeMO
         if (CHAdeMO_QUANTITY > _chademoIndex) {
             chargingInfo[_gunIndex] = &ShmSysConfigAndInfo->SysInfo.ChademoChargingData[_chademoIndex];
             chargingInfo[_gunIndex]->Index = _gunIndex;
@@ -5616,6 +5630,8 @@ int main(void)
             //PRINTF_FUNC("index = %d, ErrorCode = %s \n", gun_index, ShmOCPP16Data->StatusNotification[gun_index].ErrorCode);
             switch (chargingInfo[gun_index]->SystemStatus) {
             case S_IDLE:
+                ReleaseAlarmCode(gun_index);
+
                 if (isModeChange(gun_index)) {
                     log_info("S_IDLE================================== %x \n", gun_index);
                     chargingInfo[gun_index]->PresentChargedDuration = 0;
@@ -5813,7 +5829,6 @@ int main(void)
                         }
                     }
 #endif //defined METER_ENABLE
-                    ReleaseAlarmCode(gun_index);
                 }
             }
             break;

+ 62 - 21
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; }
                 }
             }
         }
@@ -1922,7 +1935,8 @@ bool AbnormalStopAnalysis(byte gun_index, byte *errCode)
     //        strncmp((char *)_chargingData[gun_index]->EvConnAlarmCode, "", 6) != EQUAL) {
     //    return;
     //}
-    if (strncmp(string, "000000", 6) == EQUAL) {
+    if (strncmp(string, "000000", 6) == EQUAL ||
+            strncmp(string, "023979", 6) == EQUAL) {
         return false;
     }
 
@@ -2178,6 +2192,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;
 }
 
@@ -2263,6 +2280,7 @@ void CANReceiver()
                         break;
                     }
                 }
+                //PRINTF_FUNC("target = %d, %d, %d\r\n", target, _chargingData[targetGun]->Evboard_id, targetGun);
 
                 if (targetGun < 0 || targetGun >= CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY) {
                     PRINTF_FUNC("EvComm (CANReceiver) : Target index = %x is < 0 or > QUANTITY \n", targetGun);
@@ -2473,12 +2491,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;
@@ -2900,16 +2925,32 @@ void FormatVoltageAndCurrent()
             }
         } else {
             if (_chargingData[_index]->Type == _Type_Chademo) {
-                maxChargingCur[_index] = 1200;
+                if (_index == 0) {
+                    if (strncmp((char *)&ShmSysConfigAndInfo->SysConfig.ModelName[7], "K", 1) == 0) {
+                        maxChargingCur[_index] = 2000;
+                    } else {
+                        maxChargingCur[_index] = 1200;
+                    }
+                } else if (_index == 1) {
+                    if (strncmp((char *)&ShmSysConfigAndInfo->SysConfig.ModelName[9], "K", 1) == 0) {
+                        maxChargingCur[_index] = 2000;
+                    } else {
+                        maxChargingCur[_index] = 1200;
+                    }
+                }
             } else if (_chargingData[_index]->Type == _Type_CCS_2) {
                 if (_index == 0) {
-                    if (strncmp((char *)&ShmSysConfigAndInfo->SysConfig.ModelName[7], "V", 1) == 0) {
+                    if ((strncmp((char *)&ShmSysConfigAndInfo->SysConfig.ModelName[7], "V", 1) == 0) ||
+                            (strncmp((char *)&ShmSysConfigAndInfo->SysConfig.ModelName[7], "F", 1) == 0)
+                       ) {
                         maxChargingCur[_index] = 5000;
                     } else {
                         maxChargingCur[_index] = 2000;
                     }
                 } else if (_index == 1) {
-                    if (strncmp((char *)&ShmSysConfigAndInfo->SysConfig.ModelName[9], "V", 1) == 0) {
+                    if ((strncmp((char *)&ShmSysConfigAndInfo->SysConfig.ModelName[9], "V", 1) == 0) ||
+                            (strncmp((char *)&ShmSysConfigAndInfo->SysConfig.ModelName[9], "F", 1) == 0)
+                       ) {
                         maxChargingCur[_index] = 5000;
                     } else {
                         maxChargingCur[_index] = 2000;
@@ -3069,7 +3110,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
@@ -3204,7 +3245,7 @@ int main(int argc, char *argv[])
 
                 if (priorityLow % 5 == 1) {
                     // 取得車端電池資訊 : 1.AC or DC ? 2.Total battery cap, 3.Max battery vol, 4.Max battery cur
-                    GetEvBatteryInfo(_index, targetID); //DS60-120 add
+                    GetEvBatteryInfo(_index, _chargingData[_index]->Evboard_id); //DS60-120 add
 
                     // 樁端輸出能力改變
                     if (gun_count == 1) {
@@ -3389,7 +3430,7 @@ int main(int argc, char *argv[])
                                               _chargingData[_index]->AvailableChargingPower,
                                               maxCur,
                                               maxVol,
-                                              targetID);
+                                              _chargingData[_index]->Evboard_id);
                     }
                 }
             }
@@ -3417,16 +3458,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;

+ 3 - 4
EVSE/Projects/DD360Audi/Apps/ReModule_InternalComm.c

@@ -33,7 +33,6 @@
 #include "internalComm.h"
 #include "Config.h"
 
-#define AudiCustomized              1
 #define ARRAY_SIZE(A)       (sizeof(A) / sizeof(A[0]))
 #define PASS                1
 #define FAIL                -1
@@ -1348,7 +1347,7 @@ void SetLedColor(struct ChargingInfoData *chargingData_1, struct ChargingInfoDat
                     (chargingData_2->SystemStatus == S_BOOTING ||
                      chargingData_2->SystemStatus == S_IDLE ||
                      chargingData_2->SystemStatus == S_RESERVATION)) {
-#ifdef AudiCustomized
+#if defined DD360Audi
                 led_color.Connect_1_Green = _colorBuf;
                 led_color.Connect_1_Blue = _colorBuf;
                 led_color.Connect_1_Red = _colorBuf;
@@ -1391,7 +1390,7 @@ void SetLedColor(struct ChargingInfoData *chargingData_1, struct ChargingInfoDat
                     led_color.Connect_1_Blue = COLOR_MIN_LV;
                     led_color.Connect_1_Red = _colorBuf;
                 } else {
-#ifdef AudiCustomized
+#if defined DD360Audi
                     led_color.Connect_1_Green = _colorBuf;
                     led_color.Connect_1_Blue = _colorBuf;
                     led_color.Connect_1_Red = _colorBuf;
@@ -1420,7 +1419,7 @@ void SetLedColor(struct ChargingInfoData *chargingData_1, struct ChargingInfoDat
                     led_color.Connect_2_Blue = COLOR_MIN_LV;
                     led_color.Connect_2_Red = _colorBuf;
                 } else {
-#ifdef AudiCustomized
+#if defined DD360Audi
                     led_color.Connect_2_Green = _colorBuf;
                     led_color.Connect_2_Blue = _colorBuf;
                     led_color.Connect_2_Red = _colorBuf;

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 480 - 587
EVSE/Projects/DD360Audi/Apps/ReadCmdline.c


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


Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно