瀏覽代碼

2020.05.27 / TC Hsu

Actions: New feature, add LED control feature, idle is green LED, charging is blue LED, fault(fix page) is red LED.

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

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

Files:

	modified:   Module_InternalComm.c
	modified:   internalComm.c
	modified:   internalComm.h
	modified:   main.c
TC_Hsu 4 年之前
父節點
當前提交
10a0432654

+ 172 - 0
EVSE/Projects/DM30/Apps/Module_InternalComm.c

@@ -40,11 +40,15 @@
 #define ENV_TEMP_MIN        45
 #define ENV_TEMP_MAX        50
 #define DEFAULT_AC_INDEX    2
+#define EQUAL               0
+#define COLOR_MAX_LV        100
+#define COLOR_MIN_LV        0
 
 struct SysConfigAndInfo         *ShmSysConfigAndInfo;
 struct StatusCodeData           *ShmStatusCodeData;
 struct FanModuleData            *ShmFanModuleData;
 struct RelayModuleData          *ShmRelayModuleData;
+struct LedModuleData            *ShmLedModuleData;
 struct CHAdeMOData              *ShmCHAdeMOData;
 struct CcsData                  *ShmCcsData;
 struct PsuData                  *ShmPsuData;
@@ -102,6 +106,7 @@ bool isStopChargingCount = false;
 struct timeval _close_ac_contactor;
 
 struct timeval _priority_time;
+struct timeval _led_priority_time;
 
 struct timeval  _ac_charging_comp;
 struct timeval  _ac_preparing;
@@ -123,6 +128,8 @@ Gpio_out gpio_out;
 Relay outputRelay;
 Relay regRelay;
 Rtc rtc;
+Led_Color cur_led_color;
+Led_Color led_color;
 
 Ac_Status acStatus;
 Ac_Led_Status ledStatus;
@@ -266,6 +273,23 @@ void GetFwAndHwVersion_Relay()
     }
 }
 
+void GetFwAndHwVersion_Led()
+{
+    if (Query_FW_Ver(Uart5Fd, Addr.Led, &ver) == PASS)
+    {
+        // LedModuleData
+        strcpy((char *) ShmLedModuleData->version, ver.Version_FW);
+        // SystemInfo
+        strcpy((char *) ShmSysConfigAndInfo->SysInfo.LedModuleFwRev, ver.Version_FW);
+        PRINTF_FUNC("GetFwAndHwVersion_Led s1 = %s \n", ver.Version_FW);
+        ShmLedModuleData->SelfTest_Comp = YES;
+    }
+    else
+    {
+        //PRINTF_FUNC("GetFwAndHwVersion_Led fail \n");
+    }
+}
+
 void GetFwVersion_AC()
 {
     if (Query_FW_Ver(Uart5Fd, Addr.AcPlug, &ver) == PASS)
@@ -1039,6 +1063,105 @@ void CheckAlarmOccur()
     ac_chargingInfo[0]->IsErrorOccur = isErr;
 }
 
+bool IsNoneMatchLedColor()
+{
+    bool result = false;
+
+    if (cur_led_color.Connect_1_Red != led_color.Connect_1_Red ||
+        cur_led_color.Connect_1_Green != led_color.Connect_1_Green ||
+        cur_led_color.Connect_1_Blue != led_color.Connect_1_Blue ||
+        cur_led_color.Connect_2_Red != led_color.Connect_2_Red ||
+        cur_led_color.Connect_2_Green != led_color.Connect_2_Green ||
+        cur_led_color.Connect_2_Blue != led_color.Connect_2_Blue)
+    {
+        result = true;
+    }
+
+    return result;
+}
+
+void SetLedColor(struct ChargingInfoData *chargingData_1, struct ChargingInfoData *chargingData_2)
+{
+    if (ShmSysConfigAndInfo->SysInfo.IsAlternatvieConf == YES)
+    {
+        if ((chargingData_1->SystemStatus == S_BOOTING || chargingData_1->SystemStatus == S_IDLE || chargingData_1->SystemStatus == S_RESERVATION) &&
+            (chargingData_2->SystemStatus == S_BOOTING || chargingData_2->SystemStatus == S_IDLE || chargingData_2->SystemStatus == S_RESERVATION))
+        {
+            led_color.Connect_1_Green   = COLOR_MAX_LV;
+            led_color.Connect_1_Blue    = COLOR_MIN_LV;
+            led_color.Connect_1_Red     = COLOR_MIN_LV;
+            led_color.Connect_2_Green   = COLOR_MAX_LV;
+            led_color.Connect_2_Blue    = COLOR_MIN_LV;
+            led_color.Connect_2_Red     = COLOR_MIN_LV;
+        }
+        else if ((chargingData_1->SystemStatus >= S_AUTHORIZING && chargingData_1->SystemStatus <= S_COMPLETE) ||
+                 (chargingData_1->SystemStatus >= S_CCS_PRECHARGE_ST0 && chargingData_1->SystemStatus <= S_CCS_PRECHARGE_ST1) ||
+                 (chargingData_2->SystemStatus >= S_AUTHORIZING && chargingData_2->SystemStatus <= S_COMPLETE) ||
+                 (chargingData_2->SystemStatus >= S_CCS_PRECHARGE_ST0 && chargingData_2->SystemStatus <= S_CCS_PRECHARGE_ST1))
+        {
+            led_color.Connect_1_Green   = COLOR_MIN_LV;
+            led_color.Connect_1_Blue    = COLOR_MAX_LV;
+            led_color.Connect_1_Red     = COLOR_MIN_LV;
+            led_color.Connect_2_Green   = COLOR_MIN_LV;
+            led_color.Connect_2_Blue    = COLOR_MAX_LV;
+            led_color.Connect_2_Red     = COLOR_MIN_LV;
+        }
+    }
+    else
+    {
+        if (chargingData_1->SystemStatus == S_BOOTING || chargingData_1->SystemStatus == S_IDLE || chargingData_1->SystemStatus == S_RESERVATION)
+        {
+            led_color.Connect_1_Green   = COLOR_MAX_LV;
+            led_color.Connect_1_Blue    = COLOR_MIN_LV;
+            led_color.Connect_1_Red     = COLOR_MIN_LV;
+        }
+        else if ((chargingData_1->SystemStatus >= S_AUTHORIZING && chargingData_1->SystemStatus <= S_COMPLETE) ||
+                (chargingData_1->SystemStatus >= S_CCS_PRECHARGE_ST0 && chargingData_1->SystemStatus <= S_CCS_PRECHARGE_ST1))
+        {
+            led_color.Connect_1_Green   = COLOR_MIN_LV;
+            led_color.Connect_1_Blue    = COLOR_MAX_LV;
+            led_color.Connect_1_Red     = COLOR_MIN_LV;
+        }
+
+        // --------------------------------------------------------------------------
+        if (chargingData_2->SystemStatus == S_BOOTING || chargingData_2->SystemStatus == S_IDLE || chargingData_2->SystemStatus == S_RESERVATION)
+        {
+            led_color.Connect_2_Green   = COLOR_MAX_LV;
+            led_color.Connect_2_Blue    = COLOR_MIN_LV;
+            led_color.Connect_2_Red     = COLOR_MIN_LV;
+        }
+        else if ((chargingData_2->SystemStatus >= S_AUTHORIZING && chargingData_2->SystemStatus <= S_COMPLETE) ||
+                (chargingData_2->SystemStatus >= S_CCS_PRECHARGE_ST0 && chargingData_2->SystemStatus <= S_CCS_PRECHARGE_ST1))
+        {
+            led_color.Connect_2_Green   = COLOR_MIN_LV;
+            led_color.Connect_2_Blue    = COLOR_MAX_LV;
+            led_color.Connect_2_Red     = COLOR_MIN_LV;
+        }
+    }
+
+    if (ShmSysConfigAndInfo->SysWarningInfo.Level == 2)
+    {
+        led_color.Connect_1_Green   = COLOR_MIN_LV;
+        led_color.Connect_1_Blue    = COLOR_MIN_LV;
+        led_color.Connect_1_Red     = COLOR_MAX_LV;
+        led_color.Connect_2_Green   = COLOR_MIN_LV;
+        led_color.Connect_2_Blue    = COLOR_MIN_LV;
+        led_color.Connect_2_Red     = COLOR_MAX_LV;
+    }
+
+    if (IsNoneMatchLedColor())
+    {
+        if (Config_Led_Color(Uart5Fd, Addr.Led, &led_color) == PASS)
+    {
+            cur_led_color.Connect_1_Red = led_color.Connect_1_Red;
+            cur_led_color.Connect_1_Green = led_color.Connect_1_Green;
+            cur_led_color.Connect_1_Blue = led_color.Connect_1_Blue;
+            cur_led_color.Connect_2_Red = led_color.Connect_2_Red;
+            cur_led_color.Connect_2_Green = led_color.Connect_2_Green;
+            cur_led_color.Connect_2_Blue = led_color.Connect_2_Blue;
+        }
+    }
+}
 //==========================================
 // Init all share memory
 //==========================================
@@ -1094,6 +1217,7 @@ int InitShareMemory()
         result = FAIL;
      }
      memset(ShmFanModuleData,0,sizeof(struct FanModuleData));
+
      //creat ShmRelayModuleData
     if ((MeterSMId = shmget(ShmRelayBdKey, sizeof(struct RelayModuleData),  0777)) < 0)
     {
@@ -1110,6 +1234,23 @@ int InitShareMemory()
         result = FAIL;
     }
 
+    //creat ShmLedModuleData
+    if ((MeterSMId = shmget(ShmLedBdKey, sizeof(struct LedModuleData),  0777)) < 0)
+    {
+        #ifdef SystemLogMessage
+        DEBUG_ERROR("shmget ShmLedModuleData NG\n");
+        #endif
+        result = FAIL;
+    }
+    else if ((ShmLedModuleData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
+    {
+        #ifdef SystemLogMessage
+        DEBUG_ERROR("shmat ShmLedModuleData NG\n");
+        #endif
+        result = FAIL;
+    }
+    memset(ShmLedModuleData,0,sizeof(struct LedModuleData));
+
     //creat ShmPsuData
     if ((MeterSMId = shmget(ShmPsuKey, sizeof(struct PsuData),  0777)) < 0)
     {
@@ -1789,6 +1930,13 @@ int main(void)
     if(Config_Relay_Output(Uart5Fd, Addr.Relay, &outputRelay) != PASS)
         PRINTF_FUNC("Config_Relay_Output fail \n");
 
+    cur_led_color.Connect_1_Red = COLOR_MIN_LV;
+    cur_led_color.Connect_1_Green = COLOR_MIN_LV;
+    cur_led_color.Connect_1_Blue = COLOR_MIN_LV;
+    cur_led_color.Connect_2_Red = COLOR_MIN_LV;
+    cur_led_color.Connect_2_Green = COLOR_MIN_LV;
+    cur_led_color.Connect_2_Blue = COLOR_MIN_LV;
+
     for(;;)
     {
         bool isCharging = false;
@@ -1809,6 +1957,13 @@ int main(void)
             gettimeofday(&_priority_time, NULL);
         }
 
+        if (ShmLedModuleData->SelfTest_Comp == NO)
+        {
+            GetFwAndHwVersion_Led();
+            sleep(1);
+            gettimeofday(&_led_priority_time, NULL);
+        }
+
         AcChargeTypeProcess();
 
         if (ShmRelayModuleData->SelfTest_Comp == YES)
@@ -1975,6 +2130,23 @@ int main(void)
             }
         }
 
+        if (ShmLedModuleData->SelfTest_Comp == YES)
+        {
+            if (GetTimeoutValue(_led_priority_time) / 1000 >= 1000)
+            {
+            if(gunCount == 1)
+            {
+                SetLedColor(_chargingData[0], _chargingData[0]);
+            }
+            else if (gunCount == 2)
+            {
+                SetLedColor(_chargingData[0], _chargingData[1]);
+                }
+
+                gettimeofday(&_led_priority_time, NULL);
+            }
+        }
+
         usleep(10000);
     }
 

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

@@ -38,9 +38,9 @@
 #define PASS                1
 #define FAIL                -1
 
-struct Address Addr={0x01,0x02,0x03,0x05,0xFF};
-struct Command Cmd={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x27,0x28,0x29,0x2C,0x81,0x83,
-                    0x85,0x86,0x87,0x88,0x089,0x8A,0x8B,0x8C,0x90,0xe0,0xe1,0xe2,0xe3};
+struct Address Addr={0x01,0x02,0x03,0x05,0x06,0xFF};
+struct Command Cmd={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x24,0x27,0x28,0x29,0x2C,0x81,0x83,
+                    0x85,0x86,0x87,0x88,0x089,0x8A,0x8B,0x8C,0x90,0x93,0xe0,0xe1,0xe2,0xe3};
 
 int tranceive(int fd, unsigned char* cmd, unsigned char cmd_len, unsigned char* rx)
 {
@@ -439,6 +439,37 @@ unsigned char Query_Gpio_Input(unsigned char fd, unsigned char targetAddr, Gpio_
     return result;
 }
 
+unsigned char Query_Model_Name(unsigned char fd, unsigned char targetAddr, unsigned char *modelname)
+{
+    unsigned char result = FAIL;
+    unsigned char tx[7] = {0xaa, 0x00, targetAddr, Cmd.query_Model_Name, 0x00, 0x00, 0x00};
+    unsigned char rx[512];
+    unsigned char chksum = 0x00;
+    unsigned char len = tranceive(fd, tx, sizeof(tx), rx);
+
+    if(len > 6)
+    {
+        if (len < 6+(rx[4] | rx[5]<<8))
+            return result;
+
+        for(int idx = 0;idx<(rx[4] | rx[5]<<8);idx++)
+        {
+            chksum ^= rx[6+idx];
+        }
+
+        if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
+           (rx[2] == tx[1]) &&
+           (rx[1] == tx[2]) &&
+           (rx[3] == tx[3]))
+        {
+            strncpy((char *)modelname, (char *)(rx + 6), (rx[4] | rx[5]<<8));
+            result = PASS;
+        }
+    }
+
+    return result;
+}
+
 unsigned char Config_Fan_Speed(unsigned char fd, unsigned char targetAddr, FanSpeed *Set_Buf)
 {
     unsigned char result = FAIL;
@@ -1131,3 +1162,37 @@ unsigned char Config_Reset_MCU(unsigned char fd, unsigned char targetAddr)
 
     return result;
 }
+
+unsigned char Config_Led_Color(unsigned char fd, unsigned char targetAddr, Led_Color *Ret_Buf)
+{
+    unsigned char result = FAIL;
+    unsigned char tx[13] = {0xaa, 0x00, targetAddr, Cmd.config_led_color, 0x06, 0x00,
+            Ret_Buf->Connect_1_Red, Ret_Buf->Connect_1_Green, Ret_Buf->Connect_1_Blue,
+            Ret_Buf->Connect_2_Red, Ret_Buf->Connect_2_Green, Ret_Buf->Connect_2_Blue};
+    unsigned char rx[512];
+    unsigned char chksum = 0x00;
+
+    for (int idx = 0; idx < (tx[4] | tx[5] << 8); idx++)
+        chksum ^= tx[6 + idx];
+    tx[13] = chksum;
+
+    if (tranceive(fd, tx, sizeof(tx), rx) > 0)
+    {
+        chksum = 0x00;
+        for (int idx = 0; idx < (rx[4] | rx[5] << 8); idx++)
+        {
+            chksum ^= rx[6 + idx];
+        }
+
+        if((chksum == rx[6+(rx[4] | rx[5]<<8)]) &&
+                (rx[2] == tx[1]) &&
+                (rx[1] == tx[2]) &&
+                (rx[3] == tx[3]) &&
+                rx[6] == PASS)
+        {
+            result = PASS;
+        }
+    }
+
+    return result;
+}

+ 16 - 0
EVSE/Projects/DM30/Apps/internalComm.h

@@ -14,6 +14,7 @@ extern struct Address
     unsigned char Fan;
     unsigned char Relay;
     unsigned char AcPlug;
+    unsigned char Led;
     unsigned char Broadcast;
 }Addr;
 
@@ -30,6 +31,7 @@ extern struct Command
     unsigned char query_Gfd_Adc;                //0x09
     unsigned char query_Gpio_In;                //0x0a
 
+    unsigned char query_Model_Name;             //0x24
     unsigned char query_ac_output_current;      //0x27
     unsigned char query_ac_status;              //0x28
     unsigned char query_ac_alarm_code;          //0x29
@@ -50,6 +52,8 @@ extern struct Command
 
     unsigned char config_csu_mode;              //0x90
 
+    unsigned char config_led_color;             //0x93
+
     unsigned char update_Start;                 //0xe0
     unsigned char update_Abort;                 //0xe1
     unsigned char update_Transfer;              //0xe2
@@ -182,6 +186,16 @@ typedef struct RTC
     unsigned char RtcData[14];
 }Rtc;
 
+typedef struct LED_Color
+{
+    unsigned char Connect_1_Red;
+    unsigned char Connect_1_Green;
+    unsigned char Connect_1_Blue;
+    unsigned char Connect_2_Red;
+    unsigned char Connect_2_Green;
+    unsigned char Connect_2_Blue;
+}Led_Color;
+
 typedef struct AC_Status
 {
     unsigned char       CpStatus;
@@ -235,6 +249,7 @@ extern unsigned char Query_Aux_PowerVoltage(unsigned char fd, unsigned char targ
 extern unsigned char Query_Relay_Output(unsigned char fd, unsigned char targetAddr, Relay *Ret_Buf);
 extern unsigned char Query_Gfd_Adc(unsigned char fd, unsigned char targetAddr, Gfd *Ret_Buf);
 extern unsigned char Query_Gpio_Input(unsigned char fd, unsigned char targetAddr, Gpio_in *Ret_Buf);
+extern unsigned char Query_Model_Name(unsigned char fd, unsigned char targetAddr, unsigned char *modelname);
 
 extern unsigned char Config_Fan_Speed(unsigned char fd, unsigned char targetAddr, FanSpeed *Set_Buf);
 extern unsigned char Config_Relay_Output(unsigned char fd, unsigned char targetAddr, Relay *Set_Buf);
@@ -257,4 +272,5 @@ extern unsigned char Config_Legacy_Req(unsigned char fd, unsigned char targetAdd
 extern unsigned char Config_Ac_Duty(unsigned char fd, unsigned char targetAddr, unsigned char _value);
 extern unsigned char Config_CSU_Mode(unsigned char fd, unsigned char targetAddr);
 extern unsigned char Config_Reset_MCU(unsigned char fd, unsigned char targetAddr);
+extern unsigned char Config_Led_Color(unsigned char fd, unsigned char targetAddr, Led_Color *Ret_Buf);
 #endif /* INTERNALCOMM_H_ */

+ 17 - 0
EVSE/Projects/DM30/Apps/main.c

@@ -99,6 +99,7 @@ struct CcsData                  *ShmCcsData;
 struct PrimaryMcuData           *ShmPrimaryMcuData;
 struct FanModuleData            *ShmFanModuleData;
 struct RelayModuleData          *ShmRelayModuleData;
+struct LedModuleData            *ShmLedModuleData;
 struct OCPP16Data               *ShmOCPP16Data;
 
 struct ChargingInfoData         *chargingInfo[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY];
@@ -509,6 +510,22 @@ int CreateShareMemory()
     }
     memset(ShmRelayModuleData, 0, sizeof(struct RelayModuleData));
 
+    if ((MeterSMId = shmget(ShmLedBdKey, sizeof(struct LedModuleData), IPC_CREAT | 0777)) < 0)
+    {
+        #ifdef SystemLogMessage
+        DEBUG_ERROR_MSG("[main]CreatShareMemory:shmget ShmLedModuleData NG \n");
+        #endif
+        return 0;
+    }
+    else if ((ShmLedModuleData = shmat(MeterSMId, NULL, 0)) == (void *) -1)
+    {
+        #ifdef SystemLogMessage
+        DEBUG_ERROR_MSG("[main]CreatShareMemory:shmat ShmLedModuleData NG \n");
+        #endif
+        return 0;
+    }
+    memset(ShmLedModuleData, 0, sizeof(struct LedModuleData));
+
     //creat ShmOCPP16Data
     if ((MeterSMId = shmget(ShmOcppModuleKey, sizeof(struct OCPP16Data), IPC_CREAT | 0777)) < 0)
     {