/* USER CODE BEGIN Header */ /** ****************************************************************************** * File Name : freertos.c * Description : Code for freertos applications ****************************************************************************** * @attention * *

© Copyright (c) 2019 STMicroelectronics. * All rights reserved.

* * This software component is licensed by ST under Ultimate Liberty license * SLA0044, the "License"; You may not use this file except in compliance with * the License. You may obtain a copy of the License at: * www.st.com/SLA0044 * ****************************************************************************** */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "FreeRTOS.h" #include "task.h" #include "main.h" #include "cmsis_os.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include "dma.h" //Hao@20231020 #include "adc.h" #include "crc.h" #include "flash_if.h" #include "gpio.h" #include "iwdg.h" #include "rtc.h" #include "tim.h" #include "usart.h" #include "cp_detection.h" #include "W25QXX.h" #include "usbd_cdc_if.h" #include "time.h" #include "driver_meter.h" #include "i2c.h" #ifdef FUNC_LIN_CP #include "LinCP.h" #endif #ifdef FUNC_EKM_OMNIMETER #include "EKM_Omnimeter.h" #endif #ifdef FUNC_AES256 #include "..\Middlewares\AES256\aes256.h" #endif #ifdef FUNC_ECDSA #include "cmox_crypto.h" #endif /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ /* USER CODE END PD */ /* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM */ /* USER CODE END PM */ /* Private variables ---------------------------------------------------------*/ /* USER CODE BEGIN Variables */ #ifdef FUNC_SYSTEM_KEEP_INFO __no_init __root SystemKeepInfo g_SystemKeepInfo; void SystemKeepInfo_Display(PSystemKeepInfo p) { u32 crc32 = HAL_CRC_Calculate(&hcrc, (u32*)p->m_Buf, (sizeof(p->m_Buf) >> 2)); // XP("==============\r\n"); // XP("BootCount = %d\r\n", p->m_BootCount); // XP("CsuIsRequestOn = %d\r\n", p->m_CsuIsRequestOn); // XP("CpPwmVal = %d\r\n", p->m_CpPwmVal); // XP("CRC32 = 0x%04X (%s)\r\n", p->m_CRC32, (p->m_CRC32 == crc32 ? "OK" : "NG")); // XP("CRC32_CALC = 0x%04X\r\n", crc32); // XP("================================\r\n"); DEBUG_INFO("BootCount(%d) CsuIsRequestOn(%d) CpPwmVal(%d) CRC32(0x%04X,%s)\r\n", p->m_BootCount, p->m_CsuIsRequestOn, p->m_CpPwmVal, p->m_CRC32, (p->m_CRC32 == crc32 ? "OK" : "NG")); } void SystemKeepInfo_Update(PSystemKeepInfo p) { u32 crc32 = HAL_CRC_Calculate(&hcrc, (u32*)p->m_Buf, (sizeof(p->m_Buf) >> 2)); p->m_CRC32 = crc32; } HTK_BOOL SystemKeepInfo_Check(PSystemKeepInfo p) { u32 crc32 = HAL_CRC_Calculate(&hcrc, (u32*)p->m_Buf, (sizeof(p->m_Buf) >> 2)); return (p->m_CRC32 == crc32 ? HTK_TRUE : HTK_FALSE); } #endif //FUNC_SYSTEM_KEEP_INFO uint32_t alarm_record_code[32] = { 0x00012200, // Input L1 OVP 0x00012203, // Input L1 UVP 0x00012216, // Output L1 OCP 0x00012223, // Over temperature 0x00012255, // Ground fault 0x00023703, // Pilot error 0x00012233, // AC CCID 0x00012233, // DC CCID 0x00012256, // MCU self test 0x00012258, // Hand shaking timeout 0x00012251, // Emergency stop 0x00011009, // Relay welding 0x00011032, // Leak module test fail 0x00011034, // shutter fault 0x00012212, // L1 Power drop 0x00012262, // L1 Circuit short 0x00011033, // Maximum Output Current setup error 0x00011010, // AC output relay driving fault 0x00011035, // Ble module broken 0x00012201, // Input L2 OVP 0x00012202, // Input L3 OVP 0x00012204, // Input L2 UVP 0x00012205, // Input L3 UVP 0x00012299, // Output L2 OCP 0x00012300, // Output L3 OCP 0x00012301, // L2 Circuit short 0x00012302, // L3 Circuit short 0x00000000, 0x00000000, 0x00000000, 0x00000000 }; uint32_t binCRCTarget, binCRCCal; __IO uint32_t flashdestination; __IO uint32_t newdestination; volatile unsigned long ulHighFrequencyTimerTicks; sCPModuleResult_t CpDetectionResult; #ifndef FUNC_CP_ADC_MODIFY sCPVoltageBoundary_t CpBoundary = { CP_P12V_HIGH, CP_P12V_LOW, CP_P9V_HIGH, CP_P9V_LOW, CP_P6V_HIGH, CP_P6V_LOW, CP_P3V_HIGH, CP_P3V_LOW, CP_0V_HIGH, CP_0V_LOW, CP_N12V_HIGH, CP_N12V_LOW, }; sCPVoltageBoundary_t SpecDefBoundary = { CP_SPEC_P12V_HIGH, CP_SPEC_P12V_LOW, CP_SPEC_P9V_HIGH, CP_SPEC_P9V_LOW, CP_SPEC_P6V_HIGH, CP_SPEC_P6V_LOW, CP_SPEC_P3V_HIGH, CP_SPEC_P3V_LOW, CP_SPEC_0V_HIGH, CP_SPEC_0V_LOW, CP_SPEC_N12V_HIGH, CP_SPEC_N12V_LOW, }; sCPVoltageHysteresis_t CpHysteresis = { HYSTERESIS_P12V_HIGH, HYSTERESIS_P12V_LOW, HYSTERESIS_P9V_HIGH, HYSTERESIS_P9V_LOW, HYSTERESIS_P6V_HIGH, HYSTERESIS_P6V_LOW, HYSTERESIS_P3V_HIGH, HYSTERESIS_P3V_LOW, HYSTERESIS_0V_HIGH, HYSTERESIS_0V_LOW, }; #endif //FUNC_CP_ADC_MODIFY struct EVSE Charger; const unsigned char CharacterArray[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; uint32_t test_logA = 0 ; uint32_t test_logB = 0 ; extern I2C_HandleTypeDef hi2c2; /* USER CODE END Variables */ #ifndef DISABLE_OS_ETH_TASK osThreadId ethTaskHandle; #endif osThreadId uartTaskHandle; osThreadId adcTaskHandle; osThreadId timeoutTaskHandle; osThreadId rfidTaskHandle; osThreadId led_speakerTaskHandle; osThreadId cpTaskHandle; osThreadId alarmTaskHandle; osThreadId bleTaskHandle; osThreadId memoryTaskHandle; osThreadId wifiTaskHandle; osThreadId MeterTaskHandle; #ifdef RECODE_FUNC_METER_IC_TASK osThreadId MeterIcTaskHandle; #endif #ifdef FUNC_TASK_MONITOR osThreadId MonitorTaskHandle; #endif #ifdef FUNC_LIN_CP osThreadId LinCpTaskHandle; #endif #ifdef FUNC_VERIFY_TASK osThreadId VerifyTaskHandle; #endif #ifdef FUNC_METER_IC_READ_PHASE_ANGLE char *AC_PERIOD_MODE_STR[AC_PERIOD_MODE_NUM] = { "?Hz", "50Hz", "60Hz" }; char *AC_PHASE_MODE_STR[AC_PHASE_MODE_NUM] = { "?", "AC_PHASE_MODE_1P", "240_120_120_SEQ_OK", "120_120_240_SEQ_NG", "360_360_360" }; #endif /* Private function prototypes -----------------------------------------------*/ /* USER CODE BEGIN FunctionPrototypes */ #ifdef FUNC_RS485_SLAVE uint8_t isValidCheckSum_IAP(uint8_t *RxBuf); #else uint8_t isValidCheckSum_IAP(void); #endif uint8_t isValidCheckSum_BLE(void); uint8_t isValidCheckSum_WIFI(void); void setChargerMode(uint8_t mode); uint8_t isModeChange(void); uint8_t isMode(uint8_t mode); uint8_t rfidCheckSumCal(uint8_t *data, uint8_t length); uint8_t Test_LeakModule(void); uint8_t Valid_RFID_SN(void); void recordAlarmHis(void); #ifdef FUNC_METER_IC_HISTORY uint8_t recordMeterICHis(MeterIC_CaliValType Type, int32_t Val); #else uint8_t recordChargingHis(uint8_t isColdLoadPickUp, uint32_t statusCode); #endif void setLedMotion(uint8_t action); #ifdef FUNC_CUSTOMIZED_LED_MODE_FROM_CSU void setLedMotion_User(uint8_t action, PLED_UserCfg p); #endif #ifdef FUNC_AW48_NET_LED void setNetLedMotion(uint8_t action); #endif void getlastRecord(void); void getRotarySwitchSetting(void); void CLC_Corr_Gain_Par(uint16_t SpecData_H ,uint16_t SpecData_L ,uint16_t MCUData_H , uint16_t MCUData_L , float *GainA , float *GainB ) ; void CLC_Corr_Gain_Par2(uint16_t SpecData_H ,uint16_t SpecData_L ,uint16_t MCUData_H , uint16_t MCUData_L , float *GainA , float *GainB , uint8_t *PosorNeg ) ; uint8_t Array_data_Check ( uint8_t *s1, uint8_t *s2 ) ; void Relay_Control_Function (void) ; #ifdef FUNC_OUTP_TYPE_E void SE_Relay_Control_Function(void); #endif uint8_t WatchDogLeakRawDataCheck_Event(void) ; uint16_t getBrightnessDuty(uint16_t max_duty); void parseVersionInfoFromModelname(void); #ifdef ENABLE_PRINT_IMCP_MSG int CheckPrintImcpMsg(uint8_t MsgID); #endif #ifdef MODIFY_IMCP void UpdateCheckSum(uint8_t *Buf, uint16_t Len); #endif #ifdef MODIFY_COLD_LOAD_PICKUP_DELAY void ColdLoadPickup_Delay(const char* Description); #endif #ifdef FUNC_FORCE_RUN_CSU_MODE_WITH_DC_MODELNAME void Update_McuCtrlMode(void); #endif #ifdef FUNC_IDLE_UNTIL_READ_ALL_MEM void IdleUntilReadAllMemory(void); #endif #ifdef FUNC_IDLE_UNTIL_INIT_METER_IC void IdleUntilInitMeterIC(void); #endif #ifdef FUNC_GUN_LOCK void GL_Init(void); ////void GL_Lock(void); void GL_Unlock(void); HTK_BOOL GL_IsLock(void); void GL_Trig(GL_MODE mode); void GL_Proc(void); #endif #ifdef FUNC_AX32_TRIG_LEAKAGE void TrigLeakage_Init(void); void TrigLeakage_Trig(void); void TrigLeakage_Proc(void); #endif #ifdef MODIFY_ALARM_DETECT_RELAY_WELDING_BLOCK void AlarmDetect_RelayWelding_UseADC(void); #ifdef FUNC_USE_RELAY_B_CONTACT HTK_BOOL IsRelayContact_Closed(void); void AlarmDetect_RelayWelding_UseGPIO(void); #endif #endif //MODIFY_ALARM_DETECT_RELAY_WELDING_BLOCK #ifdef FUNC_AX80_ADD_TILT_SENSOR void TILT_TrigLeakage_Init(void); void TILT_TrigLeakage_Trig(void); void TILT_TrigLeakage_Proc(void); void AlarmDetect_TiltSensor(void); #endif #ifdef MODIFY_DC_RS485_UPGRADE_ISSUE void RS485_TX_Enable(void); void RS485_TX_Disable(void); void Prefix_UartTX(uint8_t* TxBuf, uint8_t* RxBuf); void Postfix_UartTX(uint8_t* TxBuf, uint8_t* RxBuf); #endif #ifdef FUNC_RS485_BLE_SW void RS485_SW(HTK_BOOL bON); void BLE_SW(HTK_BOOL bON); #endif #ifdef FUNC_LIN_EN_SW void LIN_EN(HTK_BOOL bEnable); void LIN_SW(HTK_BOOL bUseLIN); #endif #ifdef FUNC_AW48_NET_LED void Proc_NetLedActionSubState(void); #endif #ifdef FUNC_AES256 HTK_BOOL AES256_Verify(u8* Data, int DataLen, u8* Key, u8* IV, u8* RemoteEncryptedData); void AES256_Test(void); #endif #ifdef FUNC_ECDSA HTK_BOOL ECDSA_Verify(u8* PublicKey, int PublicKeyLen, u8* Hash, int HashLen, u8* Signature, int SignatureLen); void ECDSA_VerifyTest(void); #endif /* USER CODE END FunctionPrototypes */ #ifndef DISABLE_OS_ETH_TASK void StartEthTask(void const * argument); #endif void StartUartTask(void const * argument); void StartAdcTask(void const * argument); void StartTimeoutTask(void const * argument); #ifdef FUNC_ENABLE_USART1_RFID void StartRfidTask(void const * argument); #endif void StartLedSpeakerTask(void const * argument); void StartCpTask(void const * argument); void StartAlarmTask(void const * argument); void StartBleTask(void const * argument); void StartMemoryTask(void const * argument); void StartWifiTask(void const * argument); void StartMeterTask(void const * argument); #ifdef RECODE_FUNC_METER_IC_TASK void StartMeterIcTask(void const * argument); #endif #ifdef FUNC_TASK_MONITOR void StartMonitorTask(void const * argument); #endif #ifdef FUNC_LIN_CP void StartLinCpTask(void const * argument); #endif #ifdef FUNC_VERIFY_TASK void StartVerifyTask(void const * argument); #endif extern void MX_USB_DEVICE_Init(void); void MX_FREERTOS_Init(void); /* (MISRA C 2004 rule 8.1) */ /* GetIdleTaskMemory prototype (linked to static allocation support) */ void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize ); /* Hook prototypes */ void configureTimerForRunTimeStats(void); unsigned long getRunTimeCounterValue(void); /* USER CODE BEGIN 1 */ /* Functions needed when configGENERATE_RUN_TIME_STATS is on */ __weak void configureTimerForRunTimeStats(void) { ulHighFrequencyTimerTicks = 0ul; } __weak unsigned long getRunTimeCounterValue(void) { return ulHighFrequencyTimerTicks; } /* USER CODE END 1 */ /* USER CODE BEGIN GET_IDLE_TASK_MEMORY */ static StaticTask_t xIdleTaskTCBBuffer; static StackType_t xIdleStack[configMINIMAL_STACK_SIZE]; void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize ) { *ppxIdleTaskTCBBuffer = &xIdleTaskTCBBuffer; *ppxIdleTaskStackBuffer = &xIdleStack[0]; *pulIdleTaskStackSize = configMINIMAL_STACK_SIZE; /* place for user code */ } /* USER CODE END GET_IDLE_TASK_MEMORY */ /** * @brief FreeRTOS initialization * @param None * @retval None */ void UpdateFirmwareVersion(void) { #ifdef FUNC_FW_VER_TRACE #if (FW_VER_NUM >= 1000) //-------------------------------------------------------------- #if (FW_VER_TYPE == FW_VER_TYPE_DEVELOP) #ifdef FORCE_VER_WITH_T_PREFIX sprintf(Charger.Ver_FW, "T%4.2f.X0.0011.P0", FW_VER_NUM * 0.00001); #else sprintf(Charger.Ver_FW, "D%4.2f.X0.0011.P0", FW_VER_NUM * 0.00001); //sprintf(Charger.Ver_FW, "D0.02.X0.0011.P0"); //test #endif #elif (FW_VER_TYPE == FW_VER_TYPE_PVT) #ifdef FORCE_VER_WITH_T_PREFIX #ifdef FORCE_VER_WITH_F_PREFIX sprintf(Charger.Ver_FW, "F%4.2f.X0.0011.P0", FW_VER_NUM * 0.00001); #else sprintf(Charger.Ver_FW, "T%4.2f.X0.0011.P0", FW_VER_NUM * 0.00001); #endif #else //FORCE_VER_WITH_T_PREFIX #ifdef AUTO_MODIFY_FW_VERSION_PREFIX_V_WHEN_GET_AX48_MODELNAME_WITH_CSU if ( ( Charger.m_bModelNameAX48_1P #ifdef AUTO_MODIFY_FW_VERSION_PREFIX_V_WHEN_GET_AX32_MODELNAME_WITH_CSU || Charger.m_bModelNameAX32_3P #endif ) && IS_CSU_MOUNTED) //With CSU { sprintf(Charger.Ver_FW, "V%4.2f.X0.0011.P0", FW_VER_NUM * 0.00001); } else { sprintf(Charger.Ver_FW, "B%4.2f.X0.0011.P0", FW_VER_NUM * 0.00001); } #else sprintf(Charger.Ver_FW, "B%4.2f.X0.0011.P0", FW_VER_NUM * 0.00001); #endif #endif //FORCE_VER_WITH_T_PREFIX #elif (FW_VER_TYPE == FW_VER_TYPE_FORMAL) sprintf(Charger.Ver_FW, "V%4.2f.X0.0011.P0", FW_VER_NUM * 0.00001); #elif (FW_VER_TYPE == FW_VER_TYPE_TEST) sprintf(Charger.Ver_FW, "T%4.2f.X0.0011.P0", FW_VER_NUM * 0.00001); #endif //-------------------------------------------------------------- #else //(FW_VER_NUM >= 1000) #if (FW_VER_TYPE == FW_VER_TYPE_DEVELOP) sprintf(Charger.Ver_FW, "D%4.2f.X0.0011.P0", FW_VER_NUM * 0.01); #elif (FW_VER_TYPE == FW_VER_TYPE_PVT) #ifdef FORCE_VER_WITH_T_PREFIX //--------------- #ifdef FORCE_VER_WITH_F_PREFIX sprintf(Charger.Ver_FW, "F%4.2f.X0.0011.P0", FW_VER_NUM * 0.01); #else sprintf(Charger.Ver_FW, "T%4.2f.X0.0011.P0", FW_VER_NUM * 0.01); #endif //--------------- //sprintf(Charger.Ver_FW, "T%4.2f.X0.0011.P0", FW_VER_NUM * 0.01); #else //FORCE_VER_WITH_T_PREFIX #ifdef AUTO_MODIFY_FW_VERSION_PREFIX_V_WHEN_GET_AX48_MODELNAME_WITH_CSU if ( ( Charger.m_bModelNameAX48_1P #ifdef AUTO_MODIFY_FW_VERSION_PREFIX_V_WHEN_GET_AX32_MODELNAME_WITH_CSU || Charger.m_bModelNameAX32_3P #endif #ifdef AUTO_MODIFY_FW_VERSION_PREFIX_V_WHEN_GET_AX80_MODELNAME_WITH_CSU || Charger.m_bModelNameAX80_1P #endif ) && IS_CSU_MOUNTED) //With CSU { sprintf(Charger.Ver_FW, "V%4.2f.X0.0011.P0", FW_VER_NUM * 0.01); } else { sprintf(Charger.Ver_FW, "B%4.2f.X0.0011.P0", FW_VER_NUM * 0.01); } #else //AUTO_MODIFY_FW_VERSION_PREFIX_V_WHEN_GET_AX48_MODELNAME_WITH_CSU sprintf(Charger.Ver_FW, "B%4.2f.X0.0011.P0", FW_VER_NUM * 0.01); #endif //AUTO_MODIFY_FW_VERSION_PREFIX_V_WHEN_GET_AX48_MODELNAME_WITH_CSU #endif //FORCE_VER_WITH_T_PREFIX #elif (FW_VER_TYPE == FW_VER_TYPE_FORMAL) sprintf(Charger.Ver_FW, "V%4.2f.X0.0011.P0", FW_VER_NUM * 0.00001); #elif (FW_VER_TYPE == FW_VER_TYPE_TEST) sprintf(Charger.Ver_FW, "T%4.2f.X0.0011.P0", FW_VER_NUM * 0.00001); #endif #endif //(FW_VER_NUM >= 1000) #else //FUNC_FW_VER_TRACE //sprintf(Charger.Ver_FW, "D0.11.X0.0011.P0"); //sprintf(Charger.Ver_FW, "D0.12.X0.0011.P0"); //AX_1P, AX_3P Generic version (=>Git) //sprintf(Charger.Ver_FW, "D0.13.X0.0011.P0"); //0.13.001: POWER_CONSUME_64_BIT, CDFA_V2 //sprintf(Charger.Ver_FW, "D0.13.X0.0011.P0"); //0.13.002: FUNC_METER_IC_COMM_ALARM, CDFA_V3 //sprintf(Charger.Ver_FW, "D0.14.X0.0011.P0"); //0.14.000: MODIFY_CPTASK_CSU_0_1_CHARGE_MODE (Fix UL test issue) + Relay welding //sprintf(Charger.Ver_FW, "D0.15.X0.0011.P0"); //0.15: FUNC_NEW_RELAY_MONITOR, FUNC_ZEROING_WHEN_MEM_CLEARNED //sprintf(Charger.Ver_FW, "D0.16.X0.0011.P0"); //0.16: FUNC_NEW_RELAY_MONITOR/Relay_LL_DriveFault_Slop/Relay_LL_DriveFault_Offs #endif //FUNC_FW_VER_TRACE #ifdef FUNC_VERSION_USE_NEW_SPEC_20240926 //Indicate firmware belong which module board //L: LED board //R: Relay board //C: CHAdeMO board //G: GBT board //F: Fan board //D: DCM 407 //A: AC main board //S: CCS board //M: CSU board Charger.Ver_FW[6] = 'A'; //0: For formal release specification //1: For lab certificate specification #ifdef FUNC_VERSION_FOR_LAB_CERTIFICATE_SPEC Charger.Ver_FW[7] = '1'; #else Charger.Ver_FW[7] = '0'; #endif #endif //FUNC_VERSION_USE_NEW_SPEC_20240926 } //--------------- #ifdef FUNC_STM32_FLASH_INFO enum { STM32_UID_LEN = 12 }; //96 bits (12 bytes) typedef struct _STM32_Flash_Info { union { u8 m_UID[STM32_UID_LEN]; u32 m_UIDw[3]; }; u32 m_DeviceID; u32 m_FlashSizeKB; } STM32_Flash_Info, *PSTM32_Flash_Info; void STM32_Flash_Info_Init(PSTM32_Flash_Info p) { memset(p, 0, sizeof(STM32_Flash_Info)); } void STM32_Flash_Info_Read(PSTM32_Flash_Info p) { //UID memcpy(p->m_UID, (u8*)UID_BASE, STM32_UID_LEN); //Device ID p->m_DeviceID = (uint32_t)(READ_BIT(DBGMCU->IDCODE, DBGMCU_IDCODE_DEV_ID)); //Flash size p->m_FlashSizeKB = (uint32_t)(READ_REG(*((uint32_t *)FLASHSIZE_BASE)) & 0xFFFF); } void STM32_Flash_Info_Disp(PSTM32_Flash_Info p) { XP("[FlashInfo]------------------------\r\n"); //UID HTK_ByteArray2HexStr_XP("UID", p->m_UID, 0, STM32_UID_LEN); //Device ID XP("DeviceID: 0x%03X\r\n", p->m_DeviceID); { char *s = "DeviceFamily: "; if (p->m_DeviceID == 0x413) { XP("%sSTM32F40xxx/F41xxx\r\n", s); } else if (p->m_DeviceID == 0x419) { XP("%sSTM32F42xxx/F43xxx\r\n", s); } else { XP("%sUnknow\r\n", s); } } //Flash size XP("DeviceFlashSize: %d Kbytes\r\n", p->m_FlashSizeKB); #ifdef FUNC_DISP_MCU_CLOCK_INFO XP("PWR->CR: 0x%08X, PWR->CSR: 0x%08X\r\n", PWR->CR, PWR->CSR); #endif } void STM32_Flash_Info_Proc(void) { PSTM32_Flash_Info p = HTK_Malloc(sizeof(STM32_Flash_Info)); if (p != NULL) { STM32_Flash_Info_Init(p); STM32_Flash_Info_Read(p); STM32_Flash_Info_Disp(p); } else { XP("PSTM32_Flash_Info malloc NG\r\n"); } } #endif //FUNC_STM32_FLASH_INFO #ifdef FUNC_STM32_FLASH_OPTION_BYTES typedef struct _STM32_Flash_OB { FLASH_OBProgramInitTypeDef m_SetOB; FLASH_OBProgramInitTypeDef m_CurOB; u8 m_nRST_STDBY: 1; //0: Reset generated when entering the Standby mode //1: No reset generated u8 m_nRST_STOP: 1; //0: Reset generated when entering the Stop mode //1: No reset generated u8 m_WDG_SW: 1; //0: Hardware independent watchdog //1: Software independent watchdog } STM32_Flash_OB, *PSTM32_Flash_OB; void STM32_Flash_OB_Init(PSTM32_Flash_OB p) { memset(p, 0, sizeof(STM32_Flash_OB)); //Set default p->m_SetOB.OptionType = OPTIONBYTE_WRP /*| OPTIONBYTE_RDP*/ | OPTIONBYTE_USER | OPTIONBYTE_BOR; p->m_SetOB.WRPState = OB_WRPSTATE_ENABLE; p->m_SetOB.Banks = 0; p->m_SetOB.BORLevel = OB_BOR_LEVEL3; p->m_SetOB.USERConfig = OB_IWDG_SW | OB_STOP_NO_RST | OB_STDBY_NO_RST; #ifdef FUNC_USE_STM32_SBSFU //Sector_0~4: Write Protection; Sector_5~11: No Write Protection p->m_SetOB.WRPSector = OB_WRP_SECTOR_0 | OB_WRP_SECTOR_1 | OB_WRP_SECTOR_2 | OB_WRP_SECTOR_3 | OB_WRP_SECTOR_4; p->m_SetOB.RDPLevel = OB_RDP_LEVEL_1; #else //Sector_0~11: No Write Protection p->m_SetOB.WRPSector = ~OB_WRP_SECTOR_All; p->m_SetOB.RDPLevel = OB_RDP_LEVEL_0; #endif } void STM32_Flash_OB_Read(PSTM32_Flash_OB p) { __HAL_FLASH_PREFETCH_BUFFER_DISABLE(); HAL_FLASHEx_OBGetConfig(&p->m_CurOB); __HAL_FLASH_PREFETCH_BUFFER_ENABLE(); p->m_nRST_STDBY = BIT_GET(p->m_CurOB.USERConfig, 7); p->m_nRST_STOP = BIT_GET(p->m_CurOB.USERConfig, 6); p->m_WDG_SW = BIT_GET(p->m_CurOB.USERConfig, 5); } void STM32_Flash_OB_WriteDefault(PSTM32_Flash_OB p) { XP("\r\n"); __HAL_FLASH_PREFETCH_BUFFER_DISABLE(); HAL_FLASH_Unlock(); HAL_FLASH_OB_Unlock(); { { XP("\r\n"); HAL_FLASHEx_OBProgram(&p->m_SetOB); HAL_FLASH_OB_Launch(); } { FLASH_OBProgramInitTypeDef ob; memcpy(&ob, &p->m_SetOB, sizeof(p->m_SetOB)); ob.OptionType = OPTIONBYTE_WRP; ob.WRPState = OB_WRPSTATE_DISABLE; ob.WRPSector = (~p->m_SetOB.WRPSector) & OB_WRP_SECTOR_All; XP(" Disable>\r\n"); HAL_FLASHEx_OBProgram(&ob); HAL_FLASH_OB_Launch(); } if (p->m_CurOB.RDPLevel == OB_RDP_LEVEL_0 && p->m_SetOB.RDPLevel == OB_RDP_LEVEL_1) { FLASH_OBProgramInitTypeDef ob; memcpy(&ob, &p->m_SetOB, sizeof(p->m_SetOB)); ob.OptionType = OPTIONBYTE_RDP; XP(" Level 1> Please power off and then power on to restart !\r\n"); HAL_FLASHEx_OBProgram(&ob); HAL_FLASH_OB_Launch(); /* Set the OPTSTRT bit in OPTCR register */ // XP("*(__IO uint8_t *)OPTCR_BYTE0_ADDRESS |= FLASH_OPTCR_OPTSTRT [BEG]\r\n"); // *(__IO uint8_t *)OPTCR_BYTE0_ADDRESS |= FLASH_OPTCR_OPTSTRT; // XP("*(__IO uint8_t *)OPTCR_BYTE0_ADDRESS |= FLASH_OPTCR_OPTSTRT [BEG]\r\n"); //HAL_Delay(1000); //NVIC_SystemReset(); } } HAL_FLASH_OB_Lock(); HAL_FLASH_Lock(); __HAL_FLASH_PREFETCH_BUFFER_ENABLE(); } void STM32_Flash_OB_Disp(PSTM32_Flash_OB p) { XP("[OB]-------------------------------\r\n"); XP("OptionType: 0x%08X\r\n", p->m_CurOB.OptionType); XP("WRPState : 0x%08X\r\n", p->m_CurOB.WRPState); XP("WRPSector : 0x%08X\r\n", p->m_CurOB.WRPSector); { for (int i = 0; i < 12; i++) { XP("\tSector_%d: %s Protection\r\n", i, BIT_GET(p->m_CurOB.WRPSector, i) == 1 ? "No" : "Write"); } } XP("Banks : 0x%08X\r\n", p->m_CurOB.Banks); XP("RDPLevel : 0x%08X (0: 0xAA, 1: 0x55, 2: 0xCC)\r\n", p->m_CurOB.RDPLevel); XP("BORLevel : 0x%08X (3: 0x00, 2: 0x04, 1: 0x08, OFF: 0x0C)\r\n", p->m_CurOB.BORLevel); XP("USERConfig: 0x%02X\r\n", p->m_CurOB.USERConfig); { XP("\tnRST_STDBY = %d (%s)\r\n", p->m_nRST_STDBY, (p->m_nRST_STDBY == 0 ? "STDBY_RST(0)" : "STDBY_NO_RST(0x80)")); XP("\tnRST_STOP = %d (%s)\r\n", p->m_nRST_STOP, (p->m_nRST_STOP == 0 ? "STOP_RST(0)" : "STOP_NO_RST(0x40)")); XP("\tWDG_SW = %d (%s)\r\n", p->m_WDG_SW, (p->m_WDG_SW == 0 ? "IWDG_HW(0)" : "IWDG_SW(0x20)")); } } HTK_BOOL STM32_Flash_OB_IsDefault(PSTM32_Flash_OB p) { XP("m_CurOB.BORLevel = 0x%08X, m_SetOB.BORLevel = 0x%08X\r\n", p->m_CurOB.BORLevel, p->m_SetOB.BORLevel); XP("m_CurOB.RDPLevel = 0x%08X, m_SetOB.RDPLevel = 0x%08X\r\n", p->m_CurOB.RDPLevel, p->m_SetOB.RDPLevel); XP("m_CurOB.USERConfig = 0x%08X, m_SetOB.USERConfig = 0x%08X\r\n", p->m_CurOB.USERConfig, p->m_SetOB.USERConfig); XP("m_CurOB.WRPSector = 0x%08X, m_SetOB.WRPSector = 0x%08X\r\n", p->m_CurOB.WRPSector, p->m_SetOB.WRPSector); XP("(~p->m_SetOB.WRPSector) & OB_WRP_SECTOR_All = 0x%08X\r\n", (~p->m_SetOB.WRPSector) & OB_WRP_SECTOR_All); if ( (p->m_CurOB.BORLevel == p->m_SetOB.BORLevel) && (p->m_CurOB.RDPLevel == p->m_SetOB.RDPLevel) && (p->m_CurOB.USERConfig == p->m_SetOB.USERConfig) && (p->m_CurOB.WRPSector == ((~p->m_SetOB.WRPSector) & OB_WRP_SECTOR_All)) ) { XP("\r\n"); return HTK_TRUE; } else { XP("\r\n"); return HTK_FALSE; } } void STM32_Flash_OB_ProcDefault(void) { PSTM32_Flash_OB p = HTK_Malloc(sizeof(STM32_Flash_OB)); if (p != NULL) { STM32_Flash_OB_Init(p); STM32_Flash_OB_Read(p); STM32_Flash_OB_Disp(p); if (!STM32_Flash_OB_IsDefault(p)) { STM32_Flash_OB_WriteDefault(p); STM32_Flash_OB_Read(p); STM32_Flash_OB_Disp(p); if (STM32_Flash_OB_IsDefault(p)) { XP("\r\n"); } else { XP("\r\n"); } } } else { XP("STM32_Flash_OB malloc NG\r\n"); } } #endif //FUNC_STM32_FLASH_OPTION_BYTES void MX_FREERTOS_Init(void) { /* USER CODE BEGIN Init */ #ifdef FUNC_BOOT_TICK Charger.m_BootTick = HAL_GetTick(); #endif #ifdef FUNC_STM32_FLASH_INFO STM32_Flash_Info_Proc(); #endif //FUNC_STM32_FLASH_INFO #ifdef FUNC_STM32_FLASH_OPTION_BYTES STM32_Flash_OB_ProcDefault(); #endif #ifdef FUNC_RS485_BLE_SW RS485_SW(HTK_TRUE); BLE_SW(HTK_FALSE); //Disable BLE (remove part from PCB) #endif #ifdef FUNC_SYSTEM_KEEP_INFO if (!SystemKeepInfo_Check(&g_SystemKeepInfo)) { memset(&g_SystemKeepInfo, 0, sizeof(g_SystemKeepInfo)); } g_SystemKeepInfo.m_BootCount++; SystemKeepInfo_Update(&g_SystemKeepInfo); SystemKeepInfo_Display(&g_SystemKeepInfo); #endif UpdateFirmwareVersion(); sprintf(Charger.Ver_HW, "1.0"); HAL_GPIO_WritePin(OUT_Leak_Test_GPIO_Port, OUT_Leak_Test_Pin, GPIO_PIN_SET); /* USER CODE END Init */ /* USER CODE BEGIN RTOS_MUTEX */ /* add mutexes, ... */ /* USER CODE END RTOS_MUTEX */ /* USER CODE BEGIN RTOS_SEMAPHORES */ /* add semaphores, ... */ /* USER CODE END RTOS_SEMAPHORES */ /* USER CODE BEGIN RTOS_TIMERS */ /* start timers, add new ones, ... */ /* USER CODE END RTOS_TIMERS */ /* USER CODE BEGIN RTOS_QUEUES */ /* add queues, ... */ /* USER CODE END RTOS_QUEUES */ /* Create the thread(s) */ /* definition and creation of ethTask */ #ifndef DISABLE_OS_ETH_TASK //osThreadDef(ethTask, StartEthTask, osPriorityIdle, 0, 1024); osThreadDef(ethTask, StartEthTask, osPriorityIdle, 0, 128); //Empty(USB) ethTaskHandle = osThreadCreate(osThread(ethTask), NULL); #endif /* definition and creation of uartTask */ osThreadDef(uartTask, StartUartTask, osPriorityNormal, 0, 1024); uartTaskHandle = osThreadCreate(osThread(uartTask), NULL); /* definition and creation of adcTask */ #ifdef MODIFY_OS_ADC_TASK_DEFINE_DATA osThreadDef(adcTask, StartAdcTask, osPriorityRealtime, 0, 512); #else osThreadDef(adcTask, StartAdcTask, osPriorityRealtime, 0, 256); #endif adcTaskHandle = osThreadCreate(osThread(adcTask), NULL); /* definition and creation of timeoutTask */ osThreadDef(timeoutTask, StartTimeoutTask, osPriorityNormal, 0, 128); timeoutTaskHandle = osThreadCreate(osThread(timeoutTask), NULL); #ifdef FUNC_ENABLE_USART1_RFID /* definition and creation of rfidTask */ osThreadDef(rfidTask, StartRfidTask, osPriorityIdle, 0, 256); rfidTaskHandle = osThreadCreate(osThread(rfidTask), NULL); #endif /* definition and creation of led_speakerTask */ osThreadDef(led_speakerTask, StartLedSpeakerTask, osPriorityNormal, 0, 128); led_speakerTaskHandle = osThreadCreate(osThread(led_speakerTask), NULL); /* definition and creation of cpTask */ osThreadDef(cpTask, StartCpTask, osPriorityHigh, 0, 256); cpTaskHandle = osThreadCreate(osThread(cpTask), NULL); /* definition and creation of alarmTask */ osThreadDef(alarmTask, StartAlarmTask, osPriorityHigh, 0, 256); alarmTaskHandle = osThreadCreate(osThread(alarmTask), NULL); /* definition and creation of bleTask */ #ifdef LOCAL_LINK_BLE osThreadDef(bleTask, StartBleTask, osPriorityHigh, 0, 1024); bleTaskHandle = osThreadCreate(osThread(bleTask), NULL); #endif /* definition and creation of memoryTask */ osThreadDef(memoryTask, StartMemoryTask, osPriorityIdle, 0, 256); memoryTaskHandle = osThreadCreate(osThread(memoryTask), NULL); /* definition and creation of wifiTask */ #ifdef LOCAL_LINK_WIFI osThreadDef(wifiTask, StartWifiTask, osPriorityIdle, 0, 1024); wifiTaskHandle = osThreadCreate(osThread(wifiTask), NULL); #endif /* definition and creation of MeterTask */ osThreadDef(MeterTask, StartMeterTask, osPriorityIdle, 0, 1024); MeterTaskHandle = osThreadCreate(osThread(MeterTask), NULL); /* USER CODE BEGIN RTOS_THREADS */ /* add threads, ... */ #ifdef RECODE_FUNC_METER_IC_TASK #ifdef MODIFY_METER_IC_TASK_PRIORITY //osThreadDef(MeterIcTask, StartMeterIcTask, osPriorityAboveNormal, 0, 1024); osThreadDef(MeterIcTask, StartMeterIcTask, osPriorityHigh, 0, 1024); #else osThreadDef(MeterIcTask, StartMeterIcTask, osPriorityNormal, 0, 1024); #endif MeterIcTaskHandle = osThreadCreate(osThread(MeterIcTask), NULL); #endif #ifdef FUNC_TASK_MONITOR osThreadDef(MonitorTask, StartMonitorTask, osPriorityIdle, 0, 256); MonitorTaskHandle = osThreadCreate(osThread(MonitorTask), NULL); #endif #ifdef FUNC_LIN_CP //osThreadDef(LinCpTask, StartLinCpTask, osPriorityIdle, 0, 256 * 4); osThreadDef(LinCpTask, StartLinCpTask, osPriorityIdle, 0, 256); LinCpTaskHandle = osThreadCreate(osThread(LinCpTask), NULL); #endif #ifdef FUNC_VERIFY_TASK osThreadDef(VerifyTask, StartVerifyTask, osPriorityIdle, 0, 256); VerifyTaskHandle = osThreadCreate(osThread(VerifyTask), NULL); #endif /* USER CODE END RTOS_THREADS */ } #ifndef DISABLE_OS_ETH_TASK /* USER CODE BEGIN Header_StartEthTask */ /** * @brief Function implementing the ethTask thread. * @param argument: Not used * @retval None */ /* USER CODE END Header_StartEthTask */ void StartEthTask(void const * argument) { /* init code for USB_DEVICE */ MX_USB_DEVICE_Init(); /* USER CODE BEGIN StartEthTask */ #ifdef FUNC_IDLE_UNTIL_READ_ALL_MEM IdleUntilReadAllMemory(); #endif /* Infinite loop */ for(;;) { osDelay(1); } /* USER CODE END StartEthTask */ } #endif //DISABLE_OS_ETH_TASK /* USER CODE BEGIN Header_StartUartTask */ /** * @brief Function implementing the uartTask thread. * @param argument: Not used * @retval None */ /* USER CODE END Header_StartUartTask */ void StartUartTask(void const * argument) { /* USER CODE BEGIN StartUartTask */ //uuart #ifdef FUNC_IDLE_UNTIL_READ_ALL_MEM IdleUntilReadAllMemory(); #endif #ifndef DISABLE_PRINT_RTOS_MSG uint8_t pcWriteBuffer[1024]; #endif #ifndef FUNC_USE_STM32_SBSFU uint8_t endFlag[4]={0x55,0xaa,0x55,0xaa}; uint32_t checksum; #endif __IO uint32_t flash; uint8_t dbgIdx; #if defined(DEBUG) || defined(RTOS_STAT) DEBUG_INFO("========== AP initial OK ==========\n\r"); DEBUG_INFO(" Version: %s\n\r", Charger.Ver_FW); DEBUG_INFO("===================================\n\r"); if (__HAL_RCC_GET_FLAG(RCC_FLAG_PINRST) != RESET) DEBUG_INFO("Reset flag: Pin reset \r\n"); if (__HAL_RCC_GET_FLAG(RCC_FLAG_PORRST) != RESET) DEBUG_INFO("Reset flag: POR reset \r\n"); if (__HAL_RCC_GET_FLAG(RCC_FLAG_SFTRST) != RESET) DEBUG_INFO("Reset flag: SW reset \r\n"); if (__HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST) != RESET) DEBUG_INFO("Reset flag: IWDG reset \r\n"); if (__HAL_RCC_GET_FLAG(RCC_FLAG_WWDGRST) != RESET) DEBUG_INFO("Reset flag: WWDG reset \r\n"); if (__HAL_RCC_GET_FLAG(RCC_FLAG_LPWRRST) != RESET) DEBUG_INFO("Reset flag: LP reset \r\n"); DEBUG_INFO("\r\n"); __HAL_RCC_CLEAR_RESET_FLAGS(); #endif Charger.CSUisReady = OFF ; #ifdef FUNC_RS485_SLAVE HAL_GPIO_WritePin(OUT_Meter_485_DE_GPIO_Port, OUT_Meter_485_DE_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(OUT_Meter_485_RE_GPIO_Port, OUT_Meter_485_RE_Pin, GPIO_PIN_RESET); #endif #ifdef FUNC_IDLE_UNTIL_INIT_METER_IC IdleUntilInitMeterIC(); #endif #ifdef FUNC_CSU_PUBLIC_KEY_OPERATION if (Charger.m_bCsuSignInMustVerify) { #ifdef FUNC_SECURITY_DEBUG_INFO HTK_ByteArray2HexStr_XP("CSU_PublicKey", Charger.memory.EVSE_Config.data.item.m_CsuPublicKey, 0, CSU_PUBLIC_KEY_LEN); #endif } #endif #ifdef FUNC_RELAY_OFF_WHEN_GET_TWICE_OFF_CMD u8 CsuSetRelayOffCount = 0; #endif //#ifdef FUNC_REQUEST_OFF_WHEN_GET_TWICE_OFF_CMD // u8 CsuSetRequestOffCount = 0; //#endif /* Infinite loop */ for(;;) { timerEnable(TIMER_IDX_RTOS_STAT, 500); if(timer[TIMER_IDX_RTOS_STAT].isAlarm) { switch(dbgIdx) { case 0: #ifdef RTOS_STAT #ifndef DISABLE_PRINT_RTOS_MSG printf("=================================================\r\n"); printf("Task_Name \tState \tPrior \tStack \tTask_Id\r\n"); vTaskList((char *)&pcWriteBuffer); printf("%s\r\n", pcWriteBuffer); printf("-------------------------------------------------\r\n"); printf("Task_Name \tRun_Time(10us) \tUsage_Percent\r\n"); vTaskGetRunTimeStats((char *)&pcWriteBuffer); printf("%s\r\n", pcWriteBuffer); #endif //DISABLE_PRINT_RTOS_MSG #endif #ifdef FUNC_PTB_METER_WM3M4C if (Charger.m_bUseExtMeter_WM3M4C && Charger.m_pWM3M4C) { const PWM3M4C p = Charger.m_pWM3M4C; #ifdef DEBUG_PTB_METER_WM3M4C XP("========================< WM3M4C Information >=====================\r\n"); XP("[30001 ModelName ] %s\r\n", p->m_ModelName.m_Str); XP("[30009 SerialNumber ] %s\r\n", p->m_SerialNumber.m_Str); XP("[30013 SW_Version ] %.2f\r\n", (float)p->m_SW_Ver.m_Val * 0.01); XP("[30014 HW_Version ] %s\r\n", p->m_HW_Ver.m_Str); XP("===================================================================\r\n"); XP("[30400 CheckSumStatus ] 0x%04X\r\n", p->m_CheckSumStatus.m_Val); XP("===================================================================\r\n"); XP("[30414 EngCountExp1 ] %d\r\n", p->m_EngCountExp1.m_Val); XP("[30415 EngCountExp2 ] %d\r\n", p->m_EngCountExp2.m_Val); XP("[30418 EngCount1 (Wh) ] %d\r\n", p->m_EngCount1.m_Val); XP("[30420 EngCount2 (Wh) ] %d\r\n", p->m_EngCount2.m_Val); XP("[30434 EngCount1x1000 ] %d\r\n", p->m_EngCount1x1000.m_Val); XP("[30436 EngCount2x1000 ] %d\r\n", p->m_EngCount2x1000.m_Val); XP("[----- Eng1 (0.0001Wh) ] %llu\r\n", p->m_AccuEnergy1); XP("===================================================================\r\n"); XP("[47000 MeasurementStatus] %d\r\n", p->m_MeasurementStatus.m_Val); XP("[47001 Duration ] %d\r\n", p->m_Duration.m_Val); XP("[47003 Consumption ] %d\r\n", p->m_Consumption.m_Val); XP("[47005 ActivePowerTotal ] %lf\r\n", p->m_ActivePowerTotal.m_Val); XP("[47007 DateTime ] %d (%s)\r\n", p->m_GetDateTime.m_Val, p->m_GetDateTime.m_Str); XP("[47013 SignaturesCount ] %d\r\n", p->m_SignaturesCount.m_Val); XP("===================================================================\r\n"); XP("[47052 SignatureStatus ] %d\r\n", p->m_SignatureStatus.m_Val); XP("[47053 TimeZoneOffset ] %d\r\n", p->m_TimeZoneOffset.m_Val); XP("[47054 SetDataTime ] %d (%s)\r\n", p->m_SetDataTime.m_Val, p->m_SetDataTime.m_Str); XP("[47056 InpMsgLen ] %d\r\n", p->m_InpMsgLen.m_Val); XP("[47057 OutpMsgLen ] %d\r\n", p->m_OutpMsgLen.m_Val); XP("[47058 OutpSigLen ] %d (x2 = %d)\r\n", p->m_OutpSigLen.m_Val, p->m_OutpSigLen.m_Val * 2); XP("[----- ExpOutpMsgSigLen ] %d\r\n", p->m_ExpectOutpMsgSigLen); XP("[47059 OutpSigFmt ] %d\r\n", p->m_OutpSigFmt.m_Val); XP("[47060 OutpSigAlg ] %d\r\n", p->m_OutpSigAlg.m_Val); XP("[47061 Backlit ] %d\r\n", p->m_Backlit.m_Val); XP("===================================================================\r\n"); XP("[47100 DataSetInput ] %s (%d:%d)\r\n", p->m_InputJsonMsg.m_All, p->m_InpMsgLen.m_Val, strlen(p->m_InputJsonMsg.m_All)); XP("===================================================================\r\n"); XP("[47612 OutpMsg ] %s (%d:%d)\r\n", (char*)p->m_OutpMsg.m_Buf, p->m_OutpMsgLen.m_Val, strlen((char*)p->m_OutpMsg.m_Buf)); XP("===================================================================\r\n"); XP("[FIXED PublicKeyHeader ] %s (%d)\r\n", p->m_PublicKeyHStr, WM3M3C_PUBLIC_KEY_H_LEN * 2); XP("[48124 PublicKey ] %s (%d)\r\n", p->m_PublicKey.m_Str, p->m_PublicKeyStrLen); XP("===================================================================\r\n"); XP("[48188 OutpSig ] %s (%d)\r\n", p->m_OutpSig.m_Str, p->m_OutpSigLen.m_Val); XP("===================================================================\r\n"); XP("[----- OutpMsgSig ] %s (%d)\r\n", p->m_OutpMsgSig, p->m_OutpMsgSigLen); XP("[----- Header+PKey ] %s (%d)\r\n", p->m_HPKey, p->m_HPKeyLen); XP("===================================================================\r\n"); #else //DEBUG_PTB_METER_WM3M4C XP("[OutpMsgSig] %s (%d)\r\n", p->m_OutpMsgSig, p->m_OutpMsgSigLen); XP("[Header+PKey] %s (%d)\r\n\r\n", p->m_HPKey, p->m_HPKeyLen); #endif //DEBUG_PTB_METER_WM3M4C } #endif //FUNC_PTB_METER_WM3M4C #ifdef FUNC_EKM_OMNIMETER_DISPLAY if (Charger.m_bUseExtMeter_OMNIMETER && Charger.m_pEKM_Omnimeter) { EKM_Omnimeter_Display(Charger.m_pEKM_Omnimeter); } #endif #ifdef FUNC_LINCP_DISPLAY if (Charger.m_bUseLinCP && Charger.m_pLinCP) { LIN_Display(Charger.m_pLinCP); } #endif //#ifdef FUNC_SALT_AND_BLEND // if (0) // { // enum // { // KeyLen = 64, // SaltLen = 64, // MixtureLen = KeyLen + SaltLen, // SaltMapLen = GET_BOX_NUM(MixtureLen, 8), // AllLen = MixtureLen + SaltMapLen, // }; // // u8* Key = (u8*)HTK_Malloc(KeyLen); // if (Key != NULL) // { // for (int i = 0; i < KeyLen; i++) { Key[i] = i + 1; } // u8* Mixture = (u8*)HTK_Malloc(AllLen); // if (Mixture != NULL) // { // DataEncryption(Key, KeyLen, Mixture, AllLen, 0); // DataEncryption(Key, KeyLen, Mixture, AllLen, 1); // HTK_Free(Mixture); // } // HTK_Free(Key); // } // } //#endif //FUNC_SALT_AND_BLEND dbgIdx++; break; case 1: #ifdef FUNC_USE_STM32_SBSFU DEBUG_INFO("Firmware version: %s [S]\r\n", Charger.Ver_FW); #else DEBUG_INFO("Firmware version: %s\r\n", Charger.Ver_FW); #endif #ifdef FUNC_BUILD_DATE_TIME DEBUG_INFO("Build: %s %s\r\n", __DATE__, __TIME__); //ex Build: Mar 10 2022 14:53:25 #endif #ifdef FUNC_CSU_SIGN_IN_VERIFY DEBUG_INFO("MCU_Control_Mode: %x (%s%s)\r\n",Charger.memory.EVSE_Config.data.item.MCU_Control_Mode, Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_CSU ? "CSU" : "No CSU", Charger.m_bCsuSignInMustVerify ? (Charger.m_bCsuSignInVerifyOK ? ": VerifyOK" : ": NotVerify") : ""); #else DEBUG_INFO("MCU_Control_Mode: %x (%s)\r\n",Charger.memory.EVSE_Config.data.item.MCU_Control_Mode, Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_CSU ? "CSU" : "No CSU"); #endif DEBUG_INFO("ModelName: %s\r\n",Charger.memory.EVSE_Config.data.item.ModelName); DEBUG_INFO("SerialNumber: %s\r\n",Charger.memory.EVSE_Config.data.item.SerialNumber); #ifdef FUNC_BOOT_TICK DEBUG_INFO("UpTime(s): %d\r\n", (HAL_GetTick() - Charger.m_BootTick) / 1000); #endif dbgIdx++; break; case 2: if (Charger.CCID_Module_Type == CCID_MODULE_CORMEX) { DEBUG_INFO("Charger.CCID_Module_Type is CCID_MODULE_CORMEX\n\r"); } else if (Charger.CCID_Module_Type == CCID_MODULE_VAC) { DEBUG_INFO("Charger.CCID_Module_Type is CCID_MODULE_VAC\n\r"); } DEBUG_INFO("System mode: %d\r\n", Charger.Mode); DEBUG_INFO("Alarm code: 0x%08X\r\n", Charger.Alarm_Code); #ifdef FUNC_WARNING_CODE DEBUG_INFO("Warning code: 0x%08X\r\n", Charger.Warning_Code); #endif #ifdef FUNC_SHOW_RELAY_INFO DEBUG_INFO("Relay action: Main(%d), TypeE(%d)\r\n", Charger.Relay_Action, Charger.SE_Relay_Action); #endif #ifdef FUNC_MODE_DEBUG_REC_RELAY_ON_TIMES if (Charger.isDebugEnable) { DEBUG_INFO("[Debug Mode] RelayOnTimes: %d\r\n", Charger.memory.EVSE_Config.data.item.m_ModeDebugRelayOnTimes); } #endif dbgIdx++; break; case 3: #ifndef FUNC_REPLACE_ADC_WITH_METER_IC DEBUG_INFO("Original L1 Voltage: %fV\r\n", adc_value.ADC3_IN9_Voltage_L1.value/100.0); DEBUG_INFO("Original L2 Voltage: %fV\r\n", adc_value.ADC3_IN8_Voltage_L2.value/100.0); DEBUG_INFO("Original L3 Voltage: %fV\r\n", adc_value.ADC3_IN10_Voltage_L3.value/100.0); #endif dbgIdx++; break; case 4: #ifndef FUNC_REPLACE_ADC_WITH_METER_IC DEBUG_INFO("Original L1 Current: %fA\r\n", adc_value.ADC3_IN7_Current_L1.value/100.0); DEBUG_INFO("Original L2 Current: %fA\r\n", adc_value.ADC3_IN5_Current_L2.value/100.0); DEBUG_INFO("Original L3 Current: %fA\r\n", adc_value.ADC3_IN11_Current_L3.value/100.0); #endif dbgIdx++; break; case 5: #ifdef FUNC_INFO_METER_IC_RAW_DATA DEBUG_INFO("Correction L1 Voltage[0]: %fV (%d)\r\n", Charger.Voltage[0]/100.0, Charger.m_MeterIC_MeasVals.m_AVRMS_LRIP); DEBUG_INFO("Correction L2 Voltage[1]: %fV (%d)\r\n", Charger.Voltage[1]/100.0, Charger.m_MeterIC_MeasVals.m_BVRMS_LRIP); DEBUG_INFO("Correction L3 Voltage[2]: %fV (%d)\r\n", Charger.Voltage[2]/100.0, Charger.m_MeterIC_MeasVals.m_CVRMS_LRIP); #else DEBUG_INFO("Correction L1 Voltage[0]: %fV\r\n", Charger.Voltage[0]/100.0); DEBUG_INFO("Correction L2 Voltage[1]: %fV\r\n", Charger.Voltage[1]/100.0); DEBUG_INFO("Correction L3 Voltage[2]: %fV\r\n", Charger.Voltage[2]/100.0); #endif dbgIdx++; break; case 6: #ifdef FUNC_INFO_METER_IC_RAW_DATA DEBUG_INFO("Correction L1 Current[0]: %fA (%d)\r\n", Charger.Current[0]/100.0, Charger.m_MeterIC_MeasVals.m_AIRMS_LRIP); DEBUG_INFO("Correction L2 Current[1]: %fA (%d)\r\n", Charger.Current[1]/100.0, Charger.m_MeterIC_MeasVals.m_BIRMS_LRIP); DEBUG_INFO("Correction L3 Current[2]: %fA (%d)\r\n", Charger.Current[2]/100.0, Charger.m_MeterIC_MeasVals.m_CIRMS_LRIP); #else DEBUG_INFO("Correction L1 Current[0]: %fA\r\n", Charger.Current[0]/100.0); DEBUG_INFO("Correction L2 Current[1]: %fA\r\n", Charger.Current[1]/100.0); DEBUG_INFO("Correction L3 Current[2]: %fA\r\n", Charger.Current[2]/100.0); #endif #ifdef FUNC_METER_IC_READ_PHASE_ANGLE { #ifndef DISABLE_PRINT_DEBUG_MSG const PMeterIC_ExtraInfo pEx = &Charger.m_MeterIcEx; #endif DEBUG_INFO("MeterIC: MMODE(0x%02X) COMPMODE(0x%04X) STATUS01(0x%08X, 0x%08X) Period(%d:%s)\r\n", pEx->m_MMODE, pEx->m_COMPMODE, pEx->m_STATUS0, pEx->m_STATUS1, Charger.m_MeterIC_MeasVals.m_Period, AC_PERIOD_MODE_STR[pEx->m_AcPeriodMode]); DEBUG_INFO("MeterIC: ANGLE_REG3_DEG3(%4d, %4d, %4d, %10.6lf, %10.6lf, %10.6lf) SEQERR(%d) [%s]\r\n", pEx->m_AngleReg[0], pEx->m_AngleReg[1], pEx->m_AngleReg[2], pEx->m_AngleDegree[0], pEx->m_AngleDegree[1], pEx->m_AngleDegree[2], pEx->m_bSEQERR, AC_PHASE_MODE_STR[pEx->m_AcPhaseMode]); } #endif //FUNC_METER_IC_READ_PHASE_ANGLE dbgIdx++; break; case 7: DEBUG_INFO("PE(ADC): %d\r\n", adc_value.ADC3_IN4_GMI_VL1.value ); DEBUG_INFO("PE(V): %f\r\n", adc_value.ADC3_IN4_GMI_VL1.value*3.3/4095 ); DEBUG_INFO("adc_value.ADC2_IN5_Welding.value : %d(unit:0.01v)\r\n", adc_value.ADC2_IN5_Welding.value ); #ifdef DEBUG_RELAY_MONITOR_SHOW_INFO { double threshold = Charger.Voltage[0] * 0.01 * Charger.alarm_spec.Relay_LL_Welding_Slop + Charger.alarm_spec.Relay_LL_Welding_Offs; XP("#Welding threshold : %lf\r\n", threshold); } #endif //DEBUG_RELAY_MONITOR_SHOW_INFO DEBUG_INFO("SystemAmbientTemp: %d (unit:C)\r\n", Charger.temperature.SystemAmbientTemp); #ifdef FUNC_TMP100 if (Charger.m_bUseTMP100) { DEBUG_INFO("TMP100: %.4f (unit:C) >>> CcsConnectorTemp: %d \r\n", Charger.m_TMP100_cTemp, Charger.temperature.CcsConnectorTemp); } #endif #ifdef FUNC_AX80_ADD_4_TEMP_SENEOR if (Charger.m_bModelNameAX80_1P) { #ifdef FUNC_AX80_NACS_ADD_6_TEMP_SENEOR if (Charger.m_bModelNameAX80_NACS_1P) { #ifdef MODIFY_AX80_NACS_OTP_SPEC_20240911_JACK DEBUG_INFO("T1_L1_IN(%d), T2_L2_IN(%d), T3_L1_OUT(%d), T4_L2_OUT(%d), T5_L1_GUN(%d), T6_L2_GUN(%d), MAX_G2[T12](%d), MAX_G3[T34](%d), MAX_G4[T56](%d)\r\n", Charger.temperature.AX80_NACS_T1_L1_IN, Charger.temperature.AX80_NACS_T2_L2_IN, Charger.temperature.AX80_NACS_T3_L1_OUT, Charger.temperature.AX80_NACS_T4_L2_OUT, Charger.temperature.AX80_NACS_T5_L1_GUN, Charger.temperature.AX80_NACS_T6_L2_GUN, Charger.temperature.Group2_MaxTemp, Charger.temperature.Group3_MaxTemp, Charger.temperature.Group4_MaxTemp); #else //MODIFY_AX80_NACS_OTP_SPEC_20240911_JACK DEBUG_INFO("T1_L1_IN(%d), T2_L2_IN(%d), T3_L1_OUT(%d), T4_L2_OUT(%d), T5_L1_GUN(%d), T6_L2_GUN(%d), MAX(%d)\r\n", Charger.temperature.AX80_NACS_T1_L1_IN, Charger.temperature.AX80_NACS_T2_L2_IN, Charger.temperature.AX80_NACS_T3_L1_OUT, Charger.temperature.AX80_NACS_T4_L2_OUT, Charger.temperature.AX80_NACS_T5_L1_GUN, Charger.temperature.AX80_NACS_T6_L2_GUN, Charger.temperature.Group2_MaxTemp); #endif //MODIFY_AX80_NACS_OTP_SPEC_20240911_JACK #ifdef DEBUG_SHOW_AX80_NACS_TEMP_SENSOR_ADC_COUNT DEBUG_INFO("[ADC_COUNT] T1_L1_IN(%d), T2_L2_IN(%d), T3_L1_OUT(%d), T4_L2_OUT(%d), T5_L1_GUN(%d), T6_L2_GUN(%d)\r\n", adc_value.ADC3_IN9_AX80_NACS_T1.value, adc_value.ADC3_IN8_AX80_NACS_T2.value, adc_value.ADC3_IN10_AX80_NACS_T3.value, adc_value.ADC3_IN7_AX80_NACS_T4.value, adc_value.ADC3_IN5_AX80_NACS_T5.value, adc_value.ADC3_IN11_AX80_NACS_T6.value); #endif //DEBUG_SHOW_AX80_NACS_TEMP_SENSOR_ADC_COUNT } else { DEBUG_INFO("Relay1(%d), Relay2(%d), InL1(%d), InL2N(%d), Max(%d)\r\n", Charger.temperature.AX80_Relay1Temp, Charger.temperature.AX80_Relay2Temp, Charger.temperature.AX80_Input_L1_Temp, Charger.temperature.AX80_Input_N_L2_Temp, Charger.temperature.Group2_MaxTemp); } #else //FUNC_AX80_NACS_ADD_6_TEMP_SENEOR DEBUG_INFO("Relay1(%d), Relay2(%d), InL1(%d), InL2N(%d), Max(%d)\r\n", Charger.temperature.AX80_Relay1Temp, Charger.temperature.AX80_Relay2Temp, Charger.temperature.AX80_Input_L1_Temp, Charger.temperature.AX80_Input_N_L2_Temp, Charger.temperature.Group2_MaxTemp); #endif //FUNC_AX80_NACS_ADD_6_TEMP_SENEOR } #ifdef FUNC_AW48_ADD_6_TEMP_SENEOR else if (Charger.m_bModelNameAW48_1P) { #ifdef MODIFY_AW48_OTP_SPEC_20240522_STEVEN #ifdef MODIFY_AW48_OTP_SPEC_20240802_STEVEN DEBUG_INFO("T1_L1_IN(%d), T2_L2_IN(%d), T3_L1_OUT(%d), T4_L2_OUT(%d), T5_L1_GUN(%d), T6_L2_GUN(%d), MAX_G2[T12](%d), MAX_G3[T34](%d), MAX_G4[T56](%d)\r\n", Charger.temperature.AW48_T1_L1_IN, Charger.temperature.AW48_T2_L2_IN, Charger.temperature.AW48_T3_L1_OUT, Charger.temperature.AW48_T4_L2_OUT, Charger.temperature.AW48_T5_L1_GUN, Charger.temperature.AW48_T6_L2_GUN, Charger.temperature.Group2_MaxTemp, Charger.temperature.Group3_MaxTemp, Charger.temperature.Group4_MaxTemp); #else //MODIFY_AW48_OTP_SPEC_20240802_STEVEN DEBUG_INFO("T1_L1_IN(%d), T2_L2_IN(%d), T3_L1_OUT(%d), T4_L2_OUT(%d), T5_L1_GUN(%d), T6_L2_GUN(%d), MAX_G2[T1256](%d), MAX_G3[T34](%d)\r\n", Charger.temperature.AW48_T1_L1_IN, Charger.temperature.AW48_T2_L2_IN, Charger.temperature.AW48_T3_L1_OUT, Charger.temperature.AW48_T4_L2_OUT, Charger.temperature.AW48_T5_L1_GUN, Charger.temperature.AW48_T6_L2_GUN, Charger.temperature.Group2_MaxTemp, Charger.temperature.Group3_MaxTemp); #endif //MODIFY_AW48_OTP_SPEC_20240802_STEVEN #else //MODIFY_AW48_OTP_SPEC_20240522_STEVEN DEBUG_INFO("T1_L1_IN(%d), T2_L2_IN(%d), T3_L1_OUT(%d), T4_L2_OUT(%d), T5_L1_GUN(%d), T6_L2_GUN(%d), MAX(%d)\r\n", Charger.temperature.AW48_T1_L1_IN, Charger.temperature.AW48_T2_L2_IN, Charger.temperature.AW48_T3_L1_OUT, Charger.temperature.AW48_T4_L2_OUT, Charger.temperature.AW48_T5_L1_GUN, Charger.temperature.AW48_T6_L2_GUN, Charger.temperature.Group2_MaxTemp); #endif //MODIFY_AW48_OTP_SPEC_20240522_STEVEN #ifdef DEBUG_SHOW_AW48_TEMP_SENSOR_ADC_COUNT DEBUG_INFO("[ADC_COUNT] T1_L1_IN(%d), T2_L2_IN(%d), T3_L1_OUT(%d), T4_L2_OUT(%d), T5_L1_GUN(%d), T6_L2_GUN(%d)\r\n", adc_value.ADC3_IN9_AW48_T1.value, adc_value.ADC3_IN8_AW48_T2.value, adc_value.ADC3_IN10_AW48_T3.value, adc_value.ADC3_IN7_AW48_T4.value, adc_value.ADC3_IN5_AW48_T5.value, adc_value.ADC3_IN11_AW48_T6.value); #endif //DEBUG_SHOW_AW48_TEMP_SENSOR_ADC_COUNT } #endif //FUNC_AW48_ADD_6_TEMP_SENEOR #ifdef FUNC_AX48_NACS_ADD_6_TEMP_SENEOR else if (Charger.m_bModelNameAX48_NACS_1P) { #ifdef MODIFY_AX48_NACS_OTP_SPEC_20240522_STEVEN #ifdef MODIFY_AX48_NACS_OTP_SPEC_20240826_STEVEN DEBUG_INFO("T1_L1_IN(%d), T2_L2_IN(%d), T3_L1_OUT(%d), T4_L2_OUT(%d), T5_L1_GUN(%d), T6_L2_GUN(%d), MAX_G2[T12](%d), MAX_G3[T34](%d), MAX_G4[T56](%d)\r\n", Charger.temperature.AX48_NACS_T1_L1_IN, Charger.temperature.AX48_NACS_T2_L2_IN, Charger.temperature.AX48_NACS_T3_L1_OUT, Charger.temperature.AX48_NACS_T4_L2_OUT, Charger.temperature.AX48_NACS_T5_L1_GUN, Charger.temperature.AX48_NACS_T6_L2_GUN, Charger.temperature.Group2_MaxTemp, Charger.temperature.Group3_MaxTemp, Charger.temperature.Group4_MaxTemp); #else //MODIFY_AX48_NACS_OTP_SPEC_20240826_STEVEN DEBUG_INFO("T1_L1_IN(%d), T2_L2_IN(%d), T3_L1_OUT(%d), T4_L2_OUT(%d), T5_L1_GUN(%d), T6_L2_GUN(%d), MAX_G2[T1256](%d), MAX_G3[T34](%d)\r\n", Charger.temperature.AX48_NACS_T1_L1_IN, Charger.temperature.AX48_NACS_T2_L2_IN, Charger.temperature.AX48_NACS_T3_L1_OUT, Charger.temperature.AX48_NACS_T4_L2_OUT, Charger.temperature.AX48_NACS_T5_L1_GUN, Charger.temperature.AX48_NACS_T6_L2_GUN, Charger.temperature.Group2_MaxTemp, Charger.temperature.Group3_MaxTemp); #endif //MODIFY_AX48_NACS_OTP_SPEC_20240826_STEVEN #else //MODIFY_AX48_NACS_OTP_SPEC_20240522_STEVEN DEBUG_INFO("T1_L1_IN(%d), T2_L2_IN(%d), T3_L1_OUT(%d), T4_L2_OUT(%d), T5_L1_GUN(%d), T6_L2_GUN(%d), MAX(%d)\r\n", Charger.temperature.AX48_NACS_T1_L1_IN, Charger.temperature.AX48_NACS_T2_L2_IN, Charger.temperature.AX48_NACS_T3_L1_OUT, Charger.temperature.AX48_NACS_T4_L2_OUT, Charger.temperature.AX48_NACS_T5_L1_GUN, Charger.temperature.AX48_NACS_T6_L2_GUN, Charger.temperature.Group2_MaxTemp); #endif //MODIFY_AX48_NACS_OTP_SPEC_20240522_STEVEN #ifdef DEBUG_SHOW_AX48_NACS_TEMP_SENSOR_ADC_COUNT DEBUG_INFO("[ADC_COUNT] T1_L1_IN(%d), T2_L2_IN(%d), T3_L1_OUT(%d), T4_L2_OUT(%d), T5_L1_GUN(%d), T6_L2_GUN(%d)\r\n", adc_value.ADC3_IN9_AX48_NACS_T1.value, adc_value.ADC3_IN8_AX48_NACS_T2.value, adc_value.ADC3_IN10_AX48_NACS_T3.value, adc_value.ADC3_IN7_AX48_NACS_T4.value, adc_value.ADC3_IN5_AX48_NACS_T5.value, adc_value.ADC3_IN11_AX48_NACS_T6.value); #endif //DEBUG_SHOW_AX48_NACS_TEMP_SENSOR_ADC_COUNT } #endif //FUNC_AX48_NACS_ADD_6_TEMP_SENEOR #endif //FUNC_AX80_ADD_4_TEMP_SENEOR dbgIdx++; break; case 8: if (Charger.CCID_Module_Type == CCID_MODULE_CORMEX) { DEBUG_INFO("Original GF[0]: %fmA\r\n", adc_value.ADC2_IN6_GF.value/100.0); DEBUG_INFO("Charger.Leak_Current: %fmA\r\n", Charger.Leak_Current/100.0); } else { //DEBUG_INFO("Temperature ADC raw data : %d\r\n", adc_value.ADC3_IN15_Temp.value); //DEBUG_INFO("Temperature : %d\r\n", Charger.temperature.SystemAmbientTemp); DEBUG_INFO("ADC3_Buffer[1] (ADC): %d(unit:ADC)\r\n", ADC3_Buffer[1] ); DEBUG_INFO("Charger.Led_Mode: %d\r\n", Charger.Led_Mode ); } dbgIdx++; break; case 9: DEBUG_INFO("CP+(ADC): %d(unit:ADC)\r\n",CpDetectionResult.PositiveValue ); DEBUG_INFO("CP-(ADC): %d(unit:ADC)\r\n",CpDetectionResult.NegativeValue ); //if(CpDetectionResult.PositiveValue>0) { #ifdef FUNC_CP_ADC_MODIFY //DEBUG_INFO("CP +voltage: %f\r\n", CP_GET_OPA_VIN_USE_ADC(CpDetectionResult.PositiveValue)); DEBUG_INFO("CP +voltage: %f\r\n", (CpDetectionResult.PositiveValue == 0 ? 0 : HTK_GetPosFromZero(CP_GET_OPA_VIN_USE_ADC(CpDetectionResult.PositiveValue)))); #else //DEBUG_INFO("CP +voltage: %f\r\n", (float)((1.59131-((3.3*CpDetectionResult.PositiveValue)/4095))*(475/53.6))); #endif } // else // { // DEBUG_INFO("CP +voltage: 0\r\n"); // } //if(CpDetectionResult.NegativeValue>0) { #ifdef FUNC_CP_ADC_MODIFY //DEBUG_INFO("CP -voltage: %f\r\n", CP_GET_OPA_VIN_USE_ADC(CpDetectionResult.NegativeValue)); DEBUG_INFO("CP -voltage: %f\r\n", (CpDetectionResult.NegativeValue == 0 ? 0 : HTK_GetNegFromZero(CP_GET_OPA_VIN_USE_ADC(CpDetectionResult.NegativeValue)))); #else //DEBUG_INFO("CP -voltage: %f\r\n", (float)((1.59131-((3.3*CpDetectionResult.NegativeValue)/4095))*(475/53.6))); #endif } // else // { // DEBUG_INFO("CP -voltage: 0\r\n"); // } #ifdef FUNC_DISP_CURRENT_CP_PWM DEBUG_INFO("CP state: %d (%.1f%)\r\n", Charger.CP_State, Charger.m_CP_CurPWM / 10.0f); #else DEBUG_INFO("CP state: %d\r\n", Charger.CP_State); #endif #ifdef FUNC_DETECT_PP if (Charger.m_bDetectPP) { DEBUG_INFO("#PP(ADC): %d\r\n", adc_value.ADC3_IN6_Gun_Detec.value); DEBUG_INFO("#PP(CURR): %d\r\n", Charger.m_PPInfo.m_CurCurr); } #endif #ifdef FUNC_DETECT_PP_NACS if (Charger.m_bDetectPP_NACS) { DEBUG_INFO("#PP_NACS(ADC): %d\r\n", adc_value.ADC3_IN6_Gun_Detec.value); //DEBUG_INFO("#PP(CURR): %d\r\n", Charger.m_PPInfo.m_CurCurr); } #endif #ifdef FUNC_OUTP_TYPE_E if (Charger.m_bEnableTypeE) { DEBUG_INFO("#TypeE: isOnSocketE(%d), IsTypeEPlugIn(%d)\r\n", Charger.isOnSocketE, IsTypeEPlugIn()); } #endif #ifdef FUNC_GUN_LOCK if (Charger.m_bUseGunLock) { #ifdef FUNC_GUN_LOCK_TRIG_MODE DEBUG_INFO("#GunLock Status: %s ,TrigMode(%d)\r\n", GL_IsLock() ? "Locked" : "Unlocked", (int)Charger.m_GunLockTrigMode); #else DEBUG_INFO("#GunLock Status: %s\r\n", GL_IsLock() ? "Locked" : "Unlocked"); #endif } #endif #ifdef FUNC_USE_RELAY_B_CONTACT if (Charger.m_bUseRelayBContact) { DEBUG_INFO("#Relay b Contact Status: %s\r\n", IsRelayContact_Closed() ? "Closed" : "Opened"); } #endif dbgIdx++; break; case 10: DEBUG_INFO("Power_Consumption_Cumulative: %llu (0.0001 kWh)\r\n", Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_Total); DEBUG_INFO("#Current rating value: %d A\r\n", Charger.maxRatingCurrent); if (Charger.memory.EVSE_Config.data.item.MaxChargingCurrent>=20) { DEBUG_INFO("OCP tigger : %d\r\n", (Charger.memory.EVSE_Config.data.item.MaxChargingCurrent*Charger.OCP_Magnification)-100 ); } else { DEBUG_INFO("OCP tigger : %d\r\n", (Charger.memory.EVSE_Config.data.item.MaxChargingCurrent+1)*100 ); } DEBUG_INFO("#Charger.am3352.isRequestOn: %d\r\n", Charger.am3352.isRequestOn); #ifdef FUNC_OCP_WITH_PP #ifdef MODIFY_OCP_PROC_WITH_MODELNAME_IDX_3_EURO_SPEC DEBUG_INFO("#OCPInfo(%d, %d, %d, %d) [%s]\r\n", Charger.m_OCP_CurMaxCurr, Charger.OCP_Magnification, Charger.m_OCP_BegThreshold, Charger.m_OCP_EndThreshold, Charger.m_bModelNameWithEuroSpecOCP ? "EuroSpec" : "NotEuroSpec"); #else DEBUG_INFO("#OCPInfo(%d, %d, %d, %d)\r\n", Charger.m_OCP_CurMaxCurr, Charger.OCP_Magnification, Charger.m_OCP_BegThreshold, Charger.m_OCP_EndThreshold); #endif //MODIFY_OCP_PROC_WITH_MODELNAME_IDX_3_EURO_SPEC #endif //FUNC_OCP_WITH_PP #ifdef FUNC_GET_TRIP_TIME if (Charger.m_TripBeg != 0 && Charger.m_TripBeg < Charger.m_TripEnd) { DEBUG_INFO("Trip period: %d\r\n", Charger.m_TripEnd - Charger.m_TripBeg); } #endif #ifdef RECODE_METER_PRO380 if (Charger.m_bUseExtMeter_PRO380 && Charger.m_pPRO380) { #ifndef DISABLE_PRINT_DEBUG_MSG const PPRO380 p = Charger.m_pPRO380; #endif DEBUG_INFO("PRO380(%s, %d, %d) E(%.2f %.2f, %.2f %.2f %.2f)\r\n", p->m_bCommTimeout ? "[NG]" : "OK", p->m_UpdateOkTimes, p->m_UpdateNgTimes, p->m_T1_Total_active_energy.m_Val, p->m_T2_Total_active_energy.m_Val, p->m_L1_Total_active_energy.m_Val, p->m_L2_Total_active_energy.m_Val, p->m_L3_Total_active_energy.m_Val); } #endif #ifdef FUNC_PTB_METER_WM3M4C if (Charger.m_bUseExtMeter_WM3M4C && Charger.m_pWM3M4C) { #ifndef DISABLE_PRINT_DEBUG_MSG const PWM3M4C p = Charger.m_pWM3M4C; #endif DEBUG_INFO("WM3M4C(%s, %d, %d) I(%s V%.2f%s) E(%d, %d, %d) M(%d) S(%d) T(%s)\r\n", p->m_bCommTimeout ? "[NG]" : "OK", p->m_UpdateOkTimes, p->m_UpdateNgTimes, p->m_SerialNumber.m_Str, (float)p->m_SW_Ver.m_Val * 0.01, p->m_HW_Ver.m_Str, p->m_EngCountExp1.m_Val, p->m_EngCount1.m_Val, p->m_EngCount1x1000.m_Val, p->m_MeasurementStatus.m_Val, p->m_SignatureStatus.m_Val, p->m_GetDateTime.m_Str); } #endif #ifdef FUNC_TASK_MONITOR { #ifndef DISABLE_PRINT_DEBUG_MSG const PTaskADCInfo p = &Charger.m_TaskMonitor.m_ADC; #endif DEBUG_INFO("#TaskMonitor: ADC[%d/%d](%d, %d, %d) ADC->SR(0x%04X, 0x%04X, 0x%04X)\r\n", p->m_ContinueResetCounter, p->m_TotalResetCounter, p->m_ADC1_Counter[0], p->m_ADC2_Counter[0], p->m_ADC3_Counter[0], ADC1->SR, ADC2->SR, ADC3->SR); } #endif //FUNC_TASK_MONITOR #ifdef MODIFY_GOT_CSU_DUTY_CMD_PROCESS DEBUG_INFO("CCSInfo(%d, %d, %d)\r\n", Charger.m_bRunCCS, Charger.m_bGotCsuCpDutyCmd, Charger.m_bPassGotCsuCpDutyCmd); #endif #ifdef FUNC_SYSTEM_KEEP_INFO SystemKeepInfo_Display(&g_SystemKeepInfo); #endif dbgIdx++; break; case 11: if (Charger.Alarm_Code & ALARM_L1_OVER_VOLTAGE) DEBUG_INFO("#ALARM_L1_OVER_VOLTAGE \n\r"); if (Charger.Alarm_Code & ALARM_L1_UNDER_VOLTAGE) DEBUG_INFO("#ALARM_L1_UNDER_VOLTAGE \n\r"); if (Charger.Alarm_Code & ALARM_L1_OVER_CURRENT) DEBUG_INFO("#ALARM_L1_OVER_CURRENT \n\r"); if (Charger.Alarm_Code & ALARM_L2_OVER_VOLTAGE) DEBUG_INFO("#ALARM_L2_OVER_VOLTAGE \n\r"); if (Charger.Alarm_Code & ALARM_L2_UNDER_VOLTAGE) DEBUG_INFO("#ALARM_L2_UNDER_VOLTAGE \n\r"); if (Charger.Alarm_Code & ALARM_L2_OVER_CURRENT) DEBUG_INFO("#ALARM_L2_OVER_CURRENT \n\r"); if (Charger.Alarm_Code & ALARM_L3_OVER_VOLTAGE) DEBUG_INFO("#ALARM_L3_OVER_VOLTAGE \n\r"); if (Charger.Alarm_Code & ALARM_L3_UNDER_VOLTAGE) DEBUG_INFO("#ALARM_L3_UNDER_VOLTAGE \n\r"); if (Charger.Alarm_Code & ALARM_L3_OVER_CURRENT) DEBUG_INFO("#ALARM_L3_OVER_CURRENT \n\r"); dbgIdx++; break; case 12: if (Charger.Alarm_Code & ALARM_OVER_TEMPERATURE) DEBUG_INFO("#ALARM_OVER_TEMPERATURE \n\r"); if (Charger.Alarm_Code & ALARM_GROUND_FAIL) DEBUG_INFO("#ALARM_GROUND_FAIL \n\r"); if (Charger.Alarm_Code & ALARM_CP_ERROR) DEBUG_INFO("#ALARM_CP_ERROR \n\r"); if (Charger.Alarm_Code & ALARM_CURRENT_LEAK_AC) DEBUG_INFO("#ALARM_CURRENT_LEAK_AC \n\r"); if (Charger.Alarm_Code & ALARM_CURRENT_LEAK_DC) DEBUG_INFO("#ALARM_CURRENT_LEAK_DC \n\r"); if (Charger.Alarm_Code & ALARM_MCU_TESTFAIL) DEBUG_INFO("#ALARM_MCU_TESTFAIL \n\r"); if (Charger.Alarm_Code & ALARM_HANDSHAKE_TIMEOUT) DEBUG_INFO("#ALARM_HANDSHAKE_TIMEOUT \n\r"); if (Charger.Alarm_Code & ALARM_EMERGENCY_STOP) DEBUG_INFO("#ALARM_EMERGENCY_STOP \n\r"); dbgIdx++; break; case 13: if (Charger.Alarm_Code & ALARM_RELAY_STATUS) DEBUG_INFO("#ALARM_RELAY_STATUS \n\r"); if (Charger.Alarm_Code & ALARM_LEAK_MODULE_FAIL) DEBUG_INFO("#ALARM_LEAK_MODULE_FAIL \n\r"); if (Charger.Alarm_Code & ALARM_SHUTTER_FAULT) DEBUG_INFO("#ALARM_SHUTTER_FAULT \n\r"); if (Charger.Alarm_Code & ALARM_LOCKER_FAULT) DEBUG_INFO("#ALARM_LOCKER_FAULT \n\r"); if (Charger.Alarm_Code & ALARM_POWER_DROP) DEBUG_INFO("#ALARM_POWER_DROP \n\r"); if (Charger.Alarm_Code & ALARM_L1_CIRCUIT_SHORT) DEBUG_INFO("#ALARM_L1_CIRCUIT_SHORT \n\r"); if (Charger.Alarm_Code & ALARM_L2_CIRCUIT_SHORT) DEBUG_INFO("#ALARM_L2_CIRCUIT_SHORT \n\r"); if (Charger.Alarm_Code & ALARM_L3_CIRCUIT_SHORT) DEBUG_INFO("#ALARM_L3_CIRCUIT_SHORT \n\r"); if (Charger.Alarm_Code & ALARM_ROTATORY_SWITCH_FAULT) DEBUG_INFO("#ALARM_ROTATORY_SWITCH_FAULT \n\r"); if (Charger.Alarm_Code & ALARM_RELAY_DRIVE_FUALT) DEBUG_INFO("#ALARM_RELAY_DRIVE_FUALT \n\r"); if (Charger.Alarm_Code & ALARM_METER_TIMEOUT) DEBUG_INFO("#ALARM_METER_TIMEOUT \n\r"); #ifdef FUNC_METER_IC_COMM_ALARM if (Charger.Alarm_Code & ALARM_METER_IC_TIMEOUT) DEBUG_INFO("#ALARM_METER_IC_TIMEOUT \n\r"); #endif #ifdef FUNC_ALARM_CP_NEG_ERROR if (Charger.Alarm_Code & ALARM_CP_NEG_ERROR) DEBUG_INFO("#ALARM_CP_NEG_ERROR \n\r"); #endif #ifdef FUNC_AX80_ADD_TILT_SENSOR if (Charger.Alarm_Code & ALARM_TILT_SENSOR) DEBUG_INFO("#ALARM_TILT_SENSOR \n\r"); #endif #ifdef FUNC_WARNING_CODE //------------------------------------------------------------ #ifdef FUNC_EKM_OMNIMETER if (Charger.Warning_Code & WARN_OMNIMETER_COMM_TIMEOUT) DEBUG_INFO("#WARN_OMNIMETER_COMM_TIMEOUT \n\r"); #endif //------------------------------------------------------------ #endif //FUNC_WARNING_CODE // XP("sizeof(Charger.memory.EVSE_Config.data.value) = %d\r\n", sizeof(Charger.memory.EVSE_Config.data.value)); // XP("sizeof(Charger.memory.EVSE_Config.data.item) = %d\r\n", sizeof(Charger.memory.EVSE_Config.data.item)); #ifdef FUNC_METER_IC_HISTORY_DEBUG XP("sizeof(Charger.memory.hisMeterIC) = %d\r\n", sizeof(Charger.memory.hisMeterIC)); XP("sizeof(Charger.memory.hisMeterIC.data) = %d\r\n", sizeof(Charger.memory.hisMeterIC.data)); XP("sizeof(Charger.memory.hisMeterIC.data.value) = %d\r\n", sizeof(Charger.memory.hisMeterIC.data.value)); XP("sizeof(Charger.memory.hisMeterIC.data.item) = %d\r\n", sizeof(Charger.memory.hisMeterIC.data.item)); XP("sizeof(Charger.memory.hisMeterIC.data.item[0]) = %d\r\n", sizeof(Charger.memory.hisMeterIC.data.item[0])); XP("sizeof(Charger.memory.hisMeterIC.data.item[0].DateTime) = %d\r\n", sizeof(Charger.memory.hisMeterIC.data.item[0].DateTime)); XP("sizeof(Charger.memory.hisMeterIC.data.item[0].m_CaliValType) = %d\r\n", sizeof(Charger.memory.hisMeterIC.data.item[0].m_CaliValType)); XP("sizeof(Charger.memory.hisMeterIC.data.item[0].m_CaliVal) = %d\r\n", sizeof(Charger.memory.hisMeterIC.data.item[0].m_CaliVal)); XP("sizeof(Charger.memory.hisMeterIC.data.item[0].m_Reserved) = %d\r\n", sizeof(Charger.memory.hisMeterIC.data.item[0].m_Reserved)); XP("sizeof(Charger.memory.hisMeterIC.op_bits) = %d\r\n", sizeof(Charger.memory.hisMeterIC.op_bits)); #endif //FUNC_METER_IC_HISTORY_DEBUG dbgIdx++; break; default: getlastRecord(); dbgIdx = 0; break; } timerRefresh(TIMER_IDX_RTOS_STAT); } HAL_IWDG_Refresh(&hiwdg); #ifdef FUNC_RS485_SLAVE if(UART_IAP_recv_end_flag == 1 || UART_RS485_recv_end_flag == 1) #else if(UART_IAP_recv_end_flag == 1) #endif { #ifdef FUNC_UART_IAP_TX_BUF_INIT_ZERO uint8_t tx[UART_BUFFER_SIZE] = { 0 }; #else uint8_t tx[UART_BUFFER_SIZE]; #endif #ifdef MODIFY_UART_TX_LEN_FROM_U8_TO_U16 uint16_t tx_len; #else uint8_t tx_len; #endif uint8_t chksum = 0; uint8_t tmpBuf = 0 ; // Protocol process #ifdef FUNC_RS485_SLAVE uint8_t *CurRxBuf = NULL; uint16_t *pCurRxBuf_RxLen = NULL; uint8_t *pCurRecvEndFlag = NULL; UART_HandleTypeDef *pUartHandle = NULL; if (UART_IAP_recv_end_flag == 1 && isValidCheckSum_IAP(UART_IAP_rx_buffer) == ON) { CurRxBuf = UART_IAP_rx_buffer; pCurRxBuf_RxLen = &UART_IAP_rx_len; pCurRecvEndFlag = &UART_IAP_recv_end_flag; pUartHandle = &IAP_USART; #ifdef FUNC_RELAY_OFF_WHEN_CSU_CMD_TIMEOUT Charger.m_CSU_RxTick = HAL_GetTick(); #endif } else if (UART_RS485_recv_end_flag == 1 && isValidCheckSum_IAP(UART_RS485_rx_buffer) == ON) { CurRxBuf = UART_RS485_rx_buffer; pCurRxBuf_RxLen = &UART_RS485_rx_len; pCurRecvEndFlag = &UART_RS485_recv_end_flag; pUartHandle = &RS485_USART; #ifdef FUNC_RELAY_OFF_WHEN_CSU_CMD_TIMEOUT //DC Model Charger.m_CSU_RxTick = HAL_GetTick(); #endif } if (CurRxBuf != NULL) #else uint8_t *CurRxBuf = UART_IAP_rx_buffer; if(isValidCheckSum_IAP() == ON) #endif { Charger.CSUisReady = ON ; #ifdef ENABLE_PRINT_IMCP_MSG #ifdef FUNC_RS485_SLAVE #ifdef PRINT_IMCP_MSG_ONLY_ON_UPDATEPORT if (CurRxBuf == UART_IAP_rx_buffer && CheckPrintImcpMsg(CurRxBuf[IMCP_FM_MSGID_IDX])) { XP("-------------------------------------------\r\n"); HTK_ByteArray2HexStr_XP(NULL, CurRxBuf, 0, IMCP_FM_HEAD_LEN + HTK_U16(CurRxBuf[IMCP_FM_DATALEN_LSB_IDX]) + IMCP_FM_TAIL_LEN); } #else if (CheckPrintImcpMsg(CurRxBuf[IMCP_FM_MSGID_IDX])) { XP("-------------------------------------------\r\n"); HTK_ByteArray2HexStr_XP(NULL, CurRxBuf, 0, IMCP_FM_HEAD_LEN + HTK_U16(CurRxBuf[IMCP_FM_DATALEN_LSB_IDX]) + IMCP_FM_TAIL_LEN); } #endif //PRINT_IMCP_MSG_ONLY_ON_UPDATEPORT #else //FUNC_RS485_SLAVE if (CheckPrintImcpMsg(UART_IAP_rx_buffer[IMCP_FM_MSGID_IDX])) { XP("-------------------------------------------\r\n"); HTK_ByteArray2HexStr_XP(NULL, UART_IAP_rx_buffer, 0, IMCP_FM_HEAD_LEN + HTK_U16(UART_IAP_rx_buffer[IMCP_FM_DATALEN_LSB_IDX]) + IMCP_FM_TAIL_LEN); } #endif //FUNC_RS485_SLAVE #endif //ENABLE_PRINT_IMCP_MSG #ifdef FUNC_RS485_SLAVE switch (CurRxBuf[3]) #else switch (UART_IAP_rx_buffer[3]) #endif { /* Query message */ case PROTOCOL_MESSAGE_QUERY_FW_VER: tx_len = 7 + (strlen(Charger.Ver_FW)); tx[0] = 0xaa; tx[1] = PROTOCOL_ADDR; tx[2] = CurRxBuf[1]; tx[3] = PROTOCOL_MESSAGE_QUERY_FW_VER; tx[4] = strlen(Charger.Ver_FW)&0xff; tx[5] = (strlen(Charger.Ver_FW)>>0x08) & 0xff; for(uint8_t idx=0;idx>0x08) & 0xff; for(uint8_t idx=0;idx>0) & 0xff); tx[8] = (((Charger.Voltage[0]/10)>>8) & 0xff); tx[9] = (((Charger.Voltage[1]/10)>>0) & 0xff); tx[10] = (((Charger.Voltage[1]/10)>>8) & 0xff); tx[11] = (((Charger.Voltage[2]/10)>>0) & 0xff); tx[12] = (((Charger.Voltage[2]/10)>>8) & 0xff); for(uint16_t idx=0;idx<(tx[4] | (tx[5]<<8));idx++) { chksum ^= tx[6 + idx]; } tx[13] = chksum; break; case PROTOCOL_MESSAGE_QUERY_PRESENT_OUTPUT_VOLTAGE: tx_len = 15; tx[0] = 0xaa; tx[1] = PROTOCOL_ADDR; tx[2] = CurRxBuf[1]; tx[3] = PROTOCOL_MESSAGE_QUERY_PRESENT_OUTPUT_VOLTAGE; tx[4] = 0x08; tx[5] = 0x00; tx[6] = 0x00; tx[7] = 0x00; tx[8] = 0x00; tx[9] = 0x00; tx[10] = 0x00; tx[11] = 0x00; tx[12] = 0x00; tx[13] = 0x00; for(uint16_t idx=0;idx<(tx[4] | (tx[5]<<8));idx++) { chksum ^= tx[6 + idx]; } tx[14] = chksum; break; case PROTOCOL_MESSAGE_QUERY_FAN_SPEED: tx_len = 15; tx[0] = 0xaa; tx[1] = PROTOCOL_ADDR; tx[2] = CurRxBuf[1]; tx[3] = PROTOCOL_MESSAGE_QUERY_FAN_SPEED; tx[4] = 0x08; tx[5] = 0x00; tx[6] = 0x00; tx[7] = 0x00; tx[8] = 0x00; tx[9] = 0x00; tx[10] = 0x00; tx[11] = 0x00; tx[12] = 0x00; tx[13] = 0x00; for(uint16_t idx=0;idx<(tx[4] | (tx[5]<<8));idx++) { chksum ^= tx[6 + idx]; } tx[14] = chksum; break; case PROTOCOL_MESSAGE_QUERY_TEMPERATURE: tx_len = 15; tx[0] = 0xaa; tx[1] = PROTOCOL_ADDR; tx[2] = CurRxBuf[1]; tx[3] = PROTOCOL_MESSAGE_QUERY_TEMPERATURE; tx[4] = 0x08; tx[5] = 0x00; tx[6] = (((Charger.temperature.SystemAmbientTemp+60)>>0) & 0xff); tx[7] = (((Charger.temperature.CcsConnectorTemp+60)>>0) & 0xff); #ifdef FUNC_AX80_ADD_4_TEMP_SENEOR if (Charger.m_bModelNameAX80_1P) { #ifdef FUNC_AX80_NACS_ADD_6_TEMP_SENEOR if (Charger.m_bModelNameAX80_NACS_1P) { tx[8] = (((Charger.temperature.AX80_NACS_T1_L1_IN+60)>>0) & 0xff); tx[9] = (((Charger.temperature.AX80_NACS_T2_L2_IN+60)>>0) & 0xff); tx[10] = (((Charger.temperature.AX80_NACS_T3_L1_OUT+60)>>0) & 0xff); tx[11] = (((Charger.temperature.AX80_NACS_T4_L2_OUT+60)>>0) & 0xff); tx[12] = (((Charger.temperature.AX80_NACS_T5_L1_GUN+60)>>0) & 0xff); tx[13] = (((Charger.temperature.AX80_NACS_T6_L2_GUN+60)>>0) & 0xff); } else { tx[8] = (((Charger.temperature.AX80_Relay1Temp+60)>>0) & 0xff); tx[9] = (((Charger.temperature.AX80_Relay2Temp+60)>>0) & 0xff); tx[10] = (((Charger.temperature.AX80_Input_L1_Temp+60)>>0) & 0xff); tx[11] = (((Charger.temperature.AX80_Input_N_L2_Temp+60)>>0) & 0xff); tx[12] = 0x00; tx[13] = 0x00; } #else //FUNC_AX80_NACS_ADD_6_TEMP_SENEOR tx[8] = (((Charger.temperature.AX80_Relay1Temp+60)>>0) & 0xff); tx[9] = (((Charger.temperature.AX80_Relay2Temp+60)>>0) & 0xff); tx[10] = (((Charger.temperature.AX80_Input_L1_Temp+60)>>0) & 0xff); tx[11] = (((Charger.temperature.AX80_Input_N_L2_Temp+60)>>0) & 0xff); tx[12] = 0x00; tx[13] = 0x00; #endif //FUNC_AX80_NACS_ADD_6_TEMP_SENEOR } #ifdef FUNC_AW48_ADD_6_TEMP_SENEOR else if (Charger.m_bModelNameAW48_1P) { tx[8] = (((Charger.temperature.AW48_T1_L1_IN+60)>>0) & 0xff); tx[9] = (((Charger.temperature.AW48_T2_L2_IN+60)>>0) & 0xff); tx[10] = (((Charger.temperature.AW48_T3_L1_OUT+60)>>0) & 0xff); tx[11] = (((Charger.temperature.AW48_T4_L2_OUT+60)>>0) & 0xff); tx[12] = (((Charger.temperature.AW48_T5_L1_GUN+60)>>0) & 0xff); tx[13] = (((Charger.temperature.AW48_T6_L2_GUN+60)>>0) & 0xff); } #endif //FUNC_AW48_ADD_6_TEMP_SENEOR #ifdef FUNC_AX48_NACS_ADD_6_TEMP_SENEOR else if (Charger.m_bModelNameAX48_NACS_1P) { tx[8] = (((Charger.temperature.AX48_NACS_T1_L1_IN+60)>>0) & 0xff); tx[9] = (((Charger.temperature.AX48_NACS_T2_L2_IN+60)>>0) & 0xff); tx[10] = (((Charger.temperature.AX48_NACS_T3_L1_OUT+60)>>0) & 0xff); tx[11] = (((Charger.temperature.AX48_NACS_T4_L2_OUT+60)>>0) & 0xff); tx[12] = (((Charger.temperature.AX48_NACS_T5_L1_GUN+60)>>0) & 0xff); tx[13] = (((Charger.temperature.AX48_NACS_T6_L2_GUN+60)>>0) & 0xff); } #endif //FUNC_AX48_NACS_ADD_6_TEMP_SENEOR else { tx[8] = 0x00; tx[9] = 0x00; tx[10] = 0x00; tx[11] = 0x00; tx[12] = 0x00; tx[13] = 0x00; } #else //FUNC_AX80_ADD_4_TEMP_SENEOR tx[8] = 0x00; tx[9] = 0x00; tx[10] = 0x00; tx[11] = 0x00; tx[12] = 0x00; tx[13] = 0x00; #endif //FUNC_AX80_ADD_4_TEMP_SENEOR for(uint16_t idx=0;idx<(tx[4] | (tx[5]<<8));idx++) { chksum ^= tx[6 + idx]; } tx[14] = chksum; break; case PROTOCOL_MESSAGE_QUERY_AUX_POWER_VOLTAGE: tx_len = 15; tx[0] = 0xaa; tx[1] = PROTOCOL_ADDR; tx[2] = CurRxBuf[1]; tx[3] = PROTOCOL_MESSAGE_QUERY_AUX_POWER_VOLTAGE; tx[4] = 0x08; tx[5] = 0x00; tx[6] = 0x00; tx[7] = 0x00; tx[8] = 0x00; tx[9] = 0x00; tx[10] = 0x00; tx[11] = 0x00; tx[12] = 0x00; tx[13] = 0x00; for(uint16_t idx=0;idx<(tx[4] | (tx[5]<<8));idx++) { chksum ^= tx[6 + idx]; } tx[14] = chksum; break; case PROTOCOL_MESSAGE_QUERY_RELAY_OUTPUT_STATUS: tx_len = 9; tx[0] = 0xaa; tx[1] = PROTOCOL_ADDR; tx[2] = CurRxBuf[1]; tx[3] = PROTOCOL_MESSAGE_QUERY_RELAY_OUTPUT_STATUS; tx[4] = 0x02; tx[5] = 0x00; tx[6] = ((Relay1_Action_Get()==GPIO_RELAY1_ACTION_OFF)?0:1); tx[7] = ((Relay2_Action_Get()==GPIO_RELAY2_ACTION_OFF)?0:1); for(uint16_t idx=0;idx<(tx[4] | (tx[5]<<8));idx++) { chksum ^= tx[6 + idx]; } tx[8] = chksum; break; case PROTOCOL_MESSAGE_QUERY_GFD_ADC_VALUE: tx_len = 15; tx[0] = 0xaa; tx[1] = PROTOCOL_ADDR; tx[2] = CurRxBuf[1]; tx[3] = PROTOCOL_MESSAGE_QUERY_GFD_ADC_VALUE; tx[4] = 0x08; tx[5] = 0x00; tx[6] = ((adc_value.ADC2_IN6_GF.value>>0) & 0xff); tx[7] = ((adc_value.ADC2_IN6_GF.value>>8) & 0xff); tx[8] = 0x00; tx[9] = 0x00; tx[10] = 0x00; tx[11] = 0x00; tx[12] = 0x00; tx[13] = 0x00; for(uint16_t idx=0;idx<(tx[4] | (tx[5]<<8));idx++) { chksum ^= tx[6 + idx]; } tx[14] = chksum; break; case PROTOCOL_MESSAGE_QUERY_INPUT_GPIO_STATUS: tx_len = 9; tx[0] = 0xaa; tx[1] = PROTOCOL_ADDR; tx[2] = CurRxBuf[1]; tx[3] = PROTOCOL_MESSAGE_QUERY_INPUT_GPIO_STATUS; tx[4] = 0x02; tx[5] = 0x00; tx[6] = 0x00; tx[7] = 0x00 | ((HAL_GPIO_ReadPin(IN_BTN_ModeSw_GPIO_Port, IN_BTN_ModeSw_Pin)?0:1) << 7); for(uint16_t idx=0;idx<(tx[4] | (tx[5]<<8));idx++) { chksum ^= tx[6 + idx]; } tx[8] = chksum; break; case PROTOCOL_MESSAGE_QUERY_ALARM_LOG: tx_len = 17; tx[0] = 0xaa; tx[1] = PROTOCOL_ADDR; tx[2] = CurRxBuf[1]; tx[3] = PROTOCOL_MESSAGE_QUERY_ALARM_LOG; tx[4] = 0x0a; tx[5] = 0x00; tx[6] = CurRxBuf[7] ; tx[7] = CurRxBuf[8] ; tx[8] = CharacterArray[(Charger.memory.hisAlarm.data.item[CurRxBuf[7] | (CurRxBuf[8]>>8)].alarmCode & 0xF0000000)>>28]; tx[9] = CharacterArray[(Charger.memory.hisAlarm.data.item[CurRxBuf[7] | (CurRxBuf[8]>>8)].alarmCode & 0x0F000000)>>24]; tx[10] = CharacterArray[(Charger.memory.hisAlarm.data.item[CurRxBuf[7] | (CurRxBuf[8]>>8)].alarmCode & 0x00F00000)>>20]; tx[11] = CharacterArray[(Charger.memory.hisAlarm.data.item[CurRxBuf[7] | (CurRxBuf[8]>>8)].alarmCode & 0x000F0000)>>16]; tx[12] = CharacterArray[(Charger.memory.hisAlarm.data.item[CurRxBuf[7] | (CurRxBuf[8]>>8)].alarmCode & 0x0000F000)>>12]; tx[13] = CharacterArray[(Charger.memory.hisAlarm.data.item[CurRxBuf[7] | (CurRxBuf[8]>>8)].alarmCode & 0x00000F00)>>8]; tx[14] = CharacterArray[(Charger.memory.hisAlarm.data.item [CurRxBuf[7] | (CurRxBuf[8]>>8)].alarmCode & 0x000000F0)>>4]; tx[15] = CharacterArray[ Charger.memory.hisAlarm.data.item [CurRxBuf[7] | (CurRxBuf[8]>>8)].alarmCode & 0x0000000F ]; #ifdef FUNC_TRACE_MEM_HIS_ALARM XP("ALARM_LOG[%d] = 0x%08X (%c%c%c%c%c%c%c%c)\r\n", CurRxBuf[7] | (CurRxBuf[8]>>8), Charger.memory.hisAlarm.data.item[CurRxBuf[7] | (CurRxBuf[8]>>8)].alarmCode, tx[8], tx[9], tx[10], tx[11], tx[12], tx[13], tx[14], tx[15]); XP("sizeof(Charger.memory.hisAlarm.data.item[0]) = %d\r\n", sizeof(Charger.memory.hisAlarm.data.item[0])); #endif for(uint16_t idx=0;idx<(tx[4] | (tx[5]<<8));idx++) { chksum ^= tx[6 + idx]; } tx[16] = chksum; break; case PROTOCOL_MESSAGE_QUERY_SN: // head +checksum = 7 , SystemDateTimeyear month day = 8 , SerialNumber tx_len = 15 + strlen(Charger.memory.EVSE_Config.data.item.SerialNumber); tx[0] = 0xaa; tx[1] = PROTOCOL_ADDR; tx[2] = CurRxBuf[1]; tx[3] = PROTOCOL_MESSAGE_QUERY_SN; tx[4] = (strlen(Charger.memory.EVSE_Config.data.item.SerialNumber)+8)&0xff; tx[5] = ((strlen(Charger.memory.EVSE_Config.data.item.SerialNumber)+8)>>0x08) & 0xff; tx[6] = (Charger.memory.EVSE_Config.data.item.SystemDateTime.year/1000)+'0'; tx[7] = ((Charger.memory.EVSE_Config.data.item.SystemDateTime.year%1000)/100)+'0'; tx[8] = ((Charger.memory.EVSE_Config.data.item.SystemDateTime.year%100)/10)+'0'; tx[9] = (Charger.memory.EVSE_Config.data.item.SystemDateTime.year%10) +'0'; tx[10] = (Charger.memory.EVSE_Config.data.item.SystemDateTime.month/10) +'0'; tx[11] = (Charger.memory.EVSE_Config.data.item.SystemDateTime.month%10) +'0'; tx[12] = (Charger.memory.EVSE_Config.data.item.SystemDateTime.day/10) +'0'; tx[13] = (Charger.memory.EVSE_Config.data.item.SystemDateTime.day%10) +'0'; for(uint8_t idx=0;idx>0x08) & 0xff; for(uint8_t idx=0;idx>8) & 0xff; break; case INPUT_L2_AC_VOLTAGE: tx[8] = Charger.memory.EVSE_Config.data.item.Correction_VL2[CurRxBuf[7]][1] & 0xff; tx[9] = (Charger.memory.EVSE_Config.data.item.Correction_VL2[CurRxBuf[7]][1]>>8) & 0xff; break; case INPUT_L3_AC_VOLTAGE: tx[8] = Charger.memory.EVSE_Config.data.item.Correction_VL3[CurRxBuf[7]][1] & 0xff; tx[9] = (Charger.memory.EVSE_Config.data.item.Correction_VL3[CurRxBuf[7]][1]>>8) & 0xff; break; case OUTPUT_L1_CURRENT: tx[8] = Charger.memory.EVSE_Config.data.item.Correction_CL1[CurRxBuf[7]][1] & 0xff; tx[9] = (Charger.memory.EVSE_Config.data.item.Correction_CL1[CurRxBuf[7]][1]>>8) & 0xff; break; case OUTPUT_L2_CURRENT: tx[8] = Charger.memory.EVSE_Config.data.item.Correction_CL2[CurRxBuf[7]][1] & 0xff; tx[9] = (Charger.memory.EVSE_Config.data.item.Correction_CL2[CurRxBuf[7]][1]>>8) & 0xff; break; case OUTPUT_L3_CURRENT: tx[8] = Charger.memory.EVSE_Config.data.item.Correction_CL3[CurRxBuf[7]][1] & 0xff; tx[9] = (Charger.memory.EVSE_Config.data.item.Correction_CL3[CurRxBuf[7]][1]>>8) & 0xff; break; case LEAK_CURRENT: tx[8] = (Charger.memory.EVSE_Config.data.item.Correction_Leak[CurRxBuf[7]][1]/100) & 0xff; tx[9] = ((Charger.memory.EVSE_Config.data.item.Correction_Leak[CurRxBuf[7]][1]/100)>>8) & 0xff; break; } for(uint16_t idx=0;idx<(tx[4] | (tx[5]<<8));idx++) { chksum ^= tx[6 + idx]; } tx[10] = chksum; break; case PROTOCOL_MESSAGE_QUERY_RTC: tx_len = 21; tx[0] = 0xaa; tx[1] = PROTOCOL_ADDR; tx[2] = CurRxBuf[1]; tx[3] = PROTOCOL_MESSAGE_QUERY_RTC; tx[4] = 0x0e; tx[5] = 0x00; tx[6] = (Charger.memory.EVSE_Config.data.item.SystemDateTime.year/1000)+'0'; tx[7] = ((Charger.memory.EVSE_Config.data.item.SystemDateTime.year%1000)/100)+'0'; tx[8] = ((Charger.memory.EVSE_Config.data.item.SystemDateTime.year%100)/10)+'0'; tx[9] = (Charger.memory.EVSE_Config.data.item.SystemDateTime.year%10) +'0'; tx[10] = (Charger.memory.EVSE_Config.data.item.SystemDateTime.month/10) +'0'; tx[11] = (Charger.memory.EVSE_Config.data.item.SystemDateTime.month%10) +'0'; tx[12] = (Charger.memory.EVSE_Config.data.item.SystemDateTime.day/10) +'0'; tx[13] = (Charger.memory.EVSE_Config.data.item.SystemDateTime.day%10) +'0'; tx[14] = (Charger.memory.EVSE_Config.data.item.SystemDateTime.hour/10) +'0'; tx[15] = (Charger.memory.EVSE_Config.data.item.SystemDateTime.hour%10) +'0'; tx[16] = (Charger.memory.EVSE_Config.data.item.SystemDateTime.min/10) +'0'; tx[17] = (Charger.memory.EVSE_Config.data.item.SystemDateTime.min%10) +'0'; tx[18] = (Charger.memory.EVSE_Config.data.item.SystemDateTime.sec/10) +'0'; tx[19] = (Charger.memory.EVSE_Config.data.item.SystemDateTime.sec%10) +'0'; for(uint16_t idx=0;idx<(tx[4] | (tx[5]<<8));idx++) { chksum ^= tx[6 + idx]; } tx[20] = chksum; break; case PROTOCOL_MESSAGE_QUERY_PRESENT_OUTPUT_CURRENT: tx_len = 19; tx[0] = 0xaa; tx[1] = PROTOCOL_ADDR; tx[2] = CurRxBuf[1]; tx[3] = PROTOCOL_MESSAGE_QUERY_PRESENT_OUTPUT_CURRENT; tx[4] = 0x0c; tx[5] = 0x00; tx[6] = (((Charger.Current[0]/10)>>0) & 0xff); tx[7] = (((Charger.Current[0]/10)>>8) & 0xff); tx[8] = (((Charger.Current[1]/10)>>0) & 0xff); tx[9] = (((Charger.Current[1]/10)>>8) & 0xff); tx[10] = (((Charger.Current[2]/10)>>0) & 0xff); tx[11] = (((Charger.Current[2]/10)>>8) & 0xff); tx[12] = 0x00; tx[13] = 0x00; tx[14] = 0x00; tx[15] = 0x00; tx[16] = 0x00; tx[17] = 0x00; for(uint16_t idx=0;idx<(tx[4] | (tx[5]<<8));idx++) { chksum ^= tx[6 + idx]; } tx[18] = chksum; break; case PROTOCOL_MESSAGE_QUERY_EVSE_STATE: tx_len = 22; tx[0] = 0xaa; tx[1] = PROTOCOL_ADDR; tx[2] = CurRxBuf[1]; tx[3] = PROTOCOL_MESSAGE_QUERY_EVSE_STATE; tx[4] = 15; tx[5] = 0x00; tx[6] = Charger.CP_State; #ifdef MODIFY_AC_EVSE_STATUS_MAX_CHARGING_CURRENT_VARIABLE #ifdef FUNC_AW48 if (Charger.m_bModelNameAX || Charger.m_bModelNameAT || Charger.m_bModelNameAW48_1P) #else //FUNC_AW48 #ifdef FUNC_AT32 if (Charger.m_bModelNameAX || Charger.m_bModelNameAT) #else if (Charger.m_bModelNameAX) #endif #endif //FUNC_AW48 { //AX32/48 tx[7] = (Charger.AC_MaxChargingCurrentOrDuty&0xff); tx[8] = Charger.AC_MaxChargingCurrentOrDuty>>8; } else { //DC Model tx[7] = (Charger.memory.EVSE_Config.data.item.MaxChargingCurrent&0xff); tx[8] = Charger.memory.EVSE_Config.data.item.MaxChargingCurrent>>8; } #else tx[7] = (Charger.memory.EVSE_Config.data.item.MaxChargingCurrent&0xff); tx[8] = Charger.memory.EVSE_Config.data.item.MaxChargingCurrent>>8; #endif uint16_t transfer_float; { #ifdef FUNC_CP_ADC_MODIFY transfer_float = (uint16_t)(CpDetectionResult.PositiveValue == 0 ? 0 : HTK_GetPosFromZero(CP_GET_OPA_VIN_USE_ADC(CpDetectionResult.PositiveValue)) * 100); #else //transfer_float = (uint16_t)((float)(((1.59131-((3.3*CpDetectionResult.PositiveValue)/4095))*(475/53.6)))*100); #endif } tx[9] = (transfer_float&0xff); tx[10] = (transfer_float&0xff00)>>8; { #ifdef FUNC_CP_ADC_MODIFY transfer_float = (uint16_t)(CpDetectionResult.NegativeValue == 0 ? 0 : HTK_GetNegFromZero(CP_GET_OPA_VIN_USE_ADC(CpDetectionResult.NegativeValue)) * 100); #else //transfer_float = (uint16_t)((float)(((((3.3*CpDetectionResult.NegativeValue)/4095)-1.59131)*(475/53.6)))*100); #endif } tx[11] = (transfer_float&0xff); tx[12] = (transfer_float&0xff00)>>8; #ifdef FUNC_GUN_LOCK if (Charger.m_bUseGunLock) { tx[13] = GL_IsLock() ? 0x01 : 0x00; //Locker status } else { tx[13] = 0x00; } #else tx[13] = 0x00; //Locker status #endif { uint8_t val = 0; if (Charger.Relay_Action == GPIO_RELAY_ACTION_ON) { //val |= 0x07; //Use different bit val |= 0x01; //Use same bit (Fit CSU code) } if (Charger.SE_Relay_Action == GPIO_SE_RELAY_ACTION_ON) { //val |= 0x08; //Use different bit val |= 0x01; //Use same bit (Fit CSU code) } tx[14] = val; } tx[15] = 0x00; //Shutter status tx[16] = 0x00; //Meter status #ifdef FUNC_DETECT_PP tx[17] = Charger.m_PPInfo.m_StatusID; //PP status #else tx[17] = 0x00; //PP status #endif //FUNC_DETECT_PP tx[18] = Charger.maxRatingCurrent; #ifdef ROTATE_SWITCH_HARDCODE tmpBuf = HC_ROTARY_SWITCH_SET_VAL; tmpBuf += (HC_SWITCH_1_CONN_TYPE_VAL?0:1)<<4; tmpBuf += (HC_SWITCH_2_GROUND_SYS?0:1)<<5; #else tmpBuf += (HAL_GPIO_ReadPin(IN_AC_Current_Set1_GPIO_Port, IN_AC_Current_Set1_Pin)?0:1)<<0; tmpBuf += (HAL_GPIO_ReadPin(IN_AC_Current_Set2_GPIO_Port, IN_AC_Current_Set2_Pin)?0:1)<<1; tmpBuf += (HAL_GPIO_ReadPin(IN_AC_Current_Set3_GPIO_Port, IN_AC_Current_Set3_Pin)?0:1)<<2; tmpBuf += (HAL_GPIO_ReadPin(IN_AC_Current_Set4_GPIO_Port, IN_AC_Current_Set4_Pin)?0:1)<<3; #ifdef MODIFY_AX32_RUN_3P_OR_1P_AUTOMATIC_AFTER_GC5 if ( Charger.m_bModelNameAX32_3P #ifdef FUNC_AT32 || Charger.m_bModelNameAT32_3P #endif ) { tmpBuf += (Charger.m_b3PhaseModelButUse1PhaseOnly ? 1 : 0) << 4; } else { tmpBuf += (HAL_GPIO_ReadPin(IN_GridType_Select_GPIO_Port, IN_GridType_Select_Pin)?0:1)<<4; } #else //MODIFY_AX32_RUN_3P_OR_1P_AUTOMATIC_AFTER_GC5 tmpBuf += (HAL_GPIO_ReadPin(IN_GridType_Select_GPIO_Port, IN_GridType_Select_Pin)?0:1)<<4; #endif //MODIFY_AX32_RUN_3P_OR_1P_AUTOMATIC_AFTER_GC5 tmpBuf += (HAL_GPIO_ReadPin(IN_Grid_Groundding_GPIO_Port, IN_Grid_Groundding_Pin)?0:1)<<5; #endif //ROTATE_SWITCH_HARDCODE tx[19] = tmpBuf; #ifdef FUNC_OUTP_TYPE_E tx[20] = Charger.isOnSocketE | ((IsTypeEPlugIn() ? 1 : 0) << 1); #else //tx[20] = Charger.isOnSocketE | ((HAL_GPIO_ReadPin(IN_SocketE_Detect_GPIO_Port, IN_SocketE_Detect_Pin)?0:1)<<1); #endif for(uint16_t idx=0;idx<(tx[4] | (tx[5]<<8));idx++) { chksum ^= tx[6 + idx]; } tx[21] = chksum; break; case PROTOCOL_MESSAGE_QUERY_EVSE_ALARM: tx_len = 11; tx[0] = 0xaa; tx[1] = PROTOCOL_ADDR; tx[2] = CurRxBuf[1]; tx[3] = PROTOCOL_MESSAGE_QUERY_EVSE_ALARM; tx[4] = 4; tx[5] = 0x00; #ifdef VO_SIMU_ALARMCODE if (Charger.m_VOCode.m_EnableSimuAlarmCode) { HTK_U32(tx[6]) = Charger.m_SimuData.m_AlarmCode; } else { // tx[6] = (Charger.Alarm_Code&0xff); // tx[7] = (Charger.Alarm_Code&0xff00)>>8; // tx[8] = (Charger.Alarm_Code&0xff0000)>>16; // tx[9] = (Charger.Alarm_Code&0xff000000)>>24; HTK_U32(tx[6]) = Charger.Alarm_Code; } #else // tx[6] = (Charger.Alarm_Code&0xff); // tx[7] = (Charger.Alarm_Code&0xff00)>>8; // tx[8] = (Charger.Alarm_Code&0xff0000)>>16; // tx[9] = (Charger.Alarm_Code&0xff000000)>>24; HTK_U32(tx[6]) = Charger.Alarm_Code; #endif for(uint16_t idx=0;idx<(tx[4] | (tx[5]<<8));idx++) { chksum ^= tx[6 + idx]; } tx[10] = chksum; break; case PROTOCOL_MESSAGE_QUERY_BLE_STATE: tx_len = 10; tx[0] = 0xaa; tx[1] = PROTOCOL_ADDR; tx[2] = CurRxBuf[1]; tx[3] = PROTOCOL_MESSAGE_QUERY_BLE_STATE; tx[4] = 3; tx[5] = 0x00; tx[6] = 0x00 ; tx[7] = 0x00 ; tx[8] = 0x00 ; for(uint16_t idx=0;idx<(tx[4] | (tx[5]<<8));idx++) { chksum ^= tx[6 + idx]; } tx[9] = chksum; break; case PROTOCOL_MESSAGE_QUERY_BLE_LOGIC_CENTRAL_ID: tx_len = 39; tx[0] = 0xaa; tx[1] = PROTOCOL_ADDR; tx[2] = CurRxBuf[1]; tx[3] = PROTOCOL_MESSAGE_QUERY_BLE_LOGIC_CENTRAL_ID; tx[4] = 32; tx[5] = 0x00; tx[6] = 'P'; tx[7] = 'H'; tx[8] = 'I'; tx[9] = 'H'; tx[10] = 'O'; tx[11] = 'N'; tx[12] = 'G'; tx[13] = ' '; tx[14] = 'A'; tx[15] = 'C'; tx[16] = '-'; tx[17] = 'S'; tx[18] = 'i'; tx[19] = 'm'; tx[20] = 'p'; tx[21] = 'l'; tx[22] = 'e'; tx[23] = ' '; tx[24] = '1'; tx[25] = '2'; tx[26] = '3'; tx[27] = '4'; tx[28] = '5'; tx[29] = '6'; tx[30] = '7'; tx[31] = '8'; tx[32] = '9'; tx[33] = 'A'; tx[34] = 'B'; tx[35] = 'C'; tx[36] = 'D'; tx[37] = 'E'; for(uint16_t idx=0;idx<(tx[4] | (tx[5]<<8));idx++) { chksum ^= tx[6 + idx]; } tx[38] = chksum; break; case PROTOCOL_MESSAGE_QUERY_POWER_CONSUME: #ifdef MODIFY_PROTOCOL_MESSAGE_QUERY_POWER_CONSUME_64_BIT tx_len = 39; #else tx_len = 23; #endif tx[0] = 0xaa; tx[1] = PROTOCOL_ADDR; tx[2] = CurRxBuf[1]; tx[3] = PROTOCOL_MESSAGE_QUERY_POWER_CONSUME; #ifdef MODIFY_PROTOCOL_MESSAGE_QUERY_POWER_CONSUME_64_BIT tx[4] = 32; #else tx[4] = 16; #endif tx[5] = 0x00; #ifdef MODIFY_PROTOCOL_MESSAGE_QUERY_POWER_CONSUME_64_BIT { memcpy(&tx[6], &Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_Total, sizeof(uint64_t) * 4); for(uint16_t idx=0;idx<(tx[4] | (tx[5]<<8));idx++) { chksum ^= tx[6 + idx]; } tx[38] = chksum; } #else HTK_U32(tx[6]) = (uint32_t)(HTK_ROUND_U64((double)Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_Total / 100)); HTK_U32(tx[10]) = (uint32_t)(HTK_ROUND_U64((double)Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_L1 / 100)); HTK_U32(tx[14]) = (uint32_t)(HTK_ROUND_U64((double)Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_L2 / 100)); HTK_U32(tx[18]) = (uint32_t)(HTK_ROUND_U64((double)Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_L3 / 100)); for(uint16_t idx=0;idx<(tx[4] | (tx[5]<<8));idx++) { chksum ^= tx[6 + idx]; } tx[22] = chksum; #endif //MODIFY_PROTOCOL_MESSAGE_QUERY_POWER_CONSUME_64_BIT break; case PROTOCOL_MESSAGE_QUERY_GUN_PLUGIN_TIMES: tx_len = 11; tx[0] = 0xaa; tx[1] = PROTOCOL_ADDR; tx[2] = CurRxBuf[1]; tx[3] = PROTOCOL_MESSAGE_QUERY_GUN_PLUGIN_TIMES; tx[4] = 4; tx[5] = 0x00; tx[6] = (Charger.memory.EVSE_Config.data.item.AcPlugInTimes&0xff); tx[7] = (Charger.memory.EVSE_Config.data.item.AcPlugInTimes&0xff00)>>8; tx[8] = (Charger.memory.EVSE_Config.data.item.AcPlugInTimes&0xff0000)>>16; tx[9] = (Charger.memory.EVSE_Config.data.item.AcPlugInTimes&0xff000000)>>24; for(uint16_t idx=0;idx<(tx[4] | (tx[5]<<8));idx++) { chksum ^= tx[6 + idx]; } tx[10] = chksum; break; case PROTOCOL_MESSAGE_QUERY_EVSE_AUTH_MODE: tx_len = 9; tx[0] = 0xaa; tx[1] = PROTOCOL_ADDR; tx[2] = CurRxBuf[1]; tx[3] = PROTOCOL_MESSAGE_QUERY_EVSE_AUTH_MODE; tx[4] = 2; tx[5] = 0x00; tx[6] = Charger.memory.EVSE_Config.data.item.AuthMode; tx[7] = Charger.memory.EVSE_Config.data.item.OfflinePolicy; for(uint16_t idx=0;idx<(tx[4] | (tx[5]<<8));idx++) { chksum ^= tx[6 + idx]; } tx[8] = chksum; break; case PROTOCOL_MESSAGE_QUERY_PRESENT_LEAK_CURRENT: tx_len = 9; tx[0] = 0xaa; tx[1] = PROTOCOL_ADDR; tx[2] = CurRxBuf[1]; tx[3] = PROTOCOL_MESSAGE_QUERY_PRESENT_LEAK_CURRENT; tx[4] = 2; tx[5] = 0x00; tx[6] = Charger.Leak_Current/100; tx[7] = 0; for(uint16_t idx=0;idx<(tx[4] | (tx[5]<<8));idx++) { chksum ^= tx[6 + idx]; } tx[8] = chksum; break; #ifdef FUNC_METER_IC_ADE7858A case PROTOCOL_MESSAGE_QUERY_METER_IC_MEAS_PARAMETER: tx_len = 6 + sizeof(MeterIC_MeasVals) + 1; tx[0] = 0xaa; tx[1] = PROTOCOL_ADDR; tx[2] = CurRxBuf[1]; tx[3] = PROTOCOL_MESSAGE_QUERY_METER_IC_MEAS_PARAMETER; memcpy(&tx[6], &Charger.m_MeterIC_MeasVals, sizeof(MeterIC_MeasVals)); UpdateCheckSum(tx, tx_len); break; case PROTOCOL_MESSAGE_QUERY_METER_IC_CALI_PARAMETER: tx_len = 6 + (5) + 1; tx[0] = 0xaa; tx[1] = PROTOCOL_ADDR; tx[2] = CurRxBuf[1]; tx[3] = PROTOCOL_MESSAGE_QUERY_METER_IC_CALI_PARAMETER; #ifdef FUNC_METER_IC_CALI_FLAG if (CurRxBuf[6] == MICC_READ_METER_IC_CALI_FLAG) { tx[6] = CurRxBuf[6]; uint32_t tmp = Charger.memory.EVSE_Config.data.item.m_MeterIC_CaliFlag.m_Data; tmp |= (Charger.m_bMeterIC_CaliValIsDefault << 31); HTK_U32(tx[7]) = tmp; } else #endif //FUNC_METER_IC_CALI_FLAG #ifdef FUNC_QUERY_METER_IC_DIE_VERSION if (CurRxBuf[6] == MICC_GET_DIE_VERSION) { tx[6] = CurRxBuf[6]; //#ifdef FUNC_FORCE_QUERY_METER_IC_DIE_VERSION_2 // HTK_U32(tx[7]) = 0x02; //#else HTK_U32(tx[7]) = Charger.m_MeterIcEx.m_DieVersion; //#endif } else #endif #ifdef VO_GET_VO_CODE if (CurRxBuf[6] == MICC_GET_VO_CODE) { tx[6] = CurRxBuf[6]; HTK_U32(tx[7]) = Charger.m_VOCode.m_Value; } else #endif //VO_GET_VO_CODE { MeterIC_CaliValType type = (MeterIC_CaliValType)CurRxBuf[6]; int32_t *p = MeterIC_GetCaliValPtr(type, NULL); if (p != NULL) { tx[6] = (uint8_t)type; HTK_U32(tx[7]) = (uint32_t)*p; //7-10 } else { tx[6] = (uint8_t)MICC_UNDEFINED; HTK_U32(tx[7]) = HTK_U32_MAX; } } UpdateCheckSum(tx, tx_len); break; #ifdef FUNC_METER_IC_HISTORY_IMCP_CMD case PROTOCOL_MESSAGE_QUERY_METER_IC_CALI_HISTORY: tx_len = 6 + (5) + 1; tx[0] = 0xaa; tx[1] = PROTOCOL_ADDR; tx[2] = CurRxBuf[1]; tx[3] = PROTOCOL_MESSAGE_QUERY_METER_IC_CALI_HISTORY; { uint8_t area = CurRxBuf[6]; uint16_t idx = HTK_U16(CurRxBuf[7]); tx[6] = HTK_U16_BYTE(idx, 0); tx[7] = HTK_U16_BYTE(idx, 1); if (area > 1 || idx > 0xFF) { DT* pDT = &Charger.memory.hisMeterIC.data.item[idx].DateTime; tx[8] = HTK_U16_BYTE(pDT->year, 0); tx[9] = HTK_U16_BYTE(pDT->year, 1); tx[10] = pDT->month; tx[11] = pDT->day; tx[12] = pDT->hour; tx[13] = pDT->min; tx[14] = pDT->sec; tx[15] = (uint8_t)Charger.memory.hisMeterIC.data.item[idx].m_CaliValType; HTK_U32(tx[16]) = Charger.memory.hisMeterIC.data.item[idx].m_CaliVal; //16~19 } else { memset(&tx[8], 0xFF, 12); } } UpdateCheckSum(tx, tx_len); break; #endif //FUNC_METER_IC_HISTORY_IMCP_CMD #endif //FUNC_METER_IC_ADE7858A #ifdef FUNC_PTB_METER_WM3M4C case PROTOCOL_MESSAGE_QUERY_PTB_METER_WM3M4C: { tx[0] = 0xaa; tx[1] = PROTOCOL_ADDR; tx[2] = CurRxBuf[1]; tx[3] = PROTOCOL_MESSAGE_QUERY_PTB_METER_WM3M4C; PWM3M4C p = Charger.m_pWM3M4C; byte SubCmd = CurRxBuf[6]; #ifdef FUNC_CSU_CMD_DEBUG char* s = "#CSU_WM3M4C_Get: "; XP("%s0x%02X%s\r\n", s, SubCmd, (Charger.m_bUseExtMeter_WM3M4C && p ? "" : " (NOT SUPPORTED)")); #endif tx[6] = SubCmd; if (Charger.m_bUseExtMeter_WM3M4C && p) { if (SubCmd == WM3M4C_GCMD_OUTP_OCMF_MSG_SIG_LEN) { tx_len = IMCP_TX_LEN(1 + 2); HTK_U16(tx[7]) = p->m_OutpMsgSigLen; } else if (SubCmd == WM3M4C_GCMD_OUTP_OCMF_MSG_SIG) { tx_len = IMCP_TX_LEN(1 + p->m_OutpMsgSigLen); memcpy(&tx[7], p->m_OutpMsgSig, p->m_OutpMsgSigLen); } else if (SubCmd == WM3M4C_GCMD_HEADER_PKEY_LEN) { tx_len = IMCP_TX_LEN(1 + 2); HTK_U16(tx[7]) = p->m_HPKeyLen; } else if (SubCmd == WM3M4C_GCMD_HEADER_PKEY) { tx_len = IMCP_TX_LEN(1 + p->m_HPKeyLen); memcpy(&tx[7], p->m_HPKey, p->m_HPKeyLen); } else if (SubCmd == WM3M4C_GCMD_OUTP_MSG_FMT_ID) { u8 n = strlen(p->m_OutpMsgFmtStr); tx_len = IMCP_TX_LEN(1 + 1 + n); tx[7] = p->m_OutpMsgFmtID; memcpy(&tx[8], p->m_OutpMsgFmtStr, n) ; } else if (SubCmd == WM3M4C_GCMD_OUTP_MSG_LEN) { tx_len = IMCP_TX_LEN(1 + 2); HTK_U16(tx[7]) = p->m_OutpMsgLen.m_Val; } else if (SubCmd == WM3M4C_GCMD_OUTP_MSG) { tx_len = IMCP_TX_LEN(1 + p->m_OutpMsgLen.m_Val); memcpy(&tx[7], p->m_OutpMsg.m_Buf, p->m_OutpMsgLen.m_Val); } else if (SubCmd == WM3M4C_GCMD_OUTP_SIG_LEN) { tx_len = IMCP_TX_LEN(1 + 2); HTK_U16(tx[7]) = p->m_OutpSigLen.m_Val * 2; //Byte to ASCII String } else if (SubCmd == WM3M4C_GCMD_OUTP_SIG) { tx_len = IMCP_TX_LEN(1 + p->m_OutpSigLen.m_Val * 2); memcpy(&tx[7], p->m_OutpSig.m_Str, p->m_OutpSigLen.m_Val * 2); } else if (SubCmd == WM3M4C_GCMD_PKEYHEADER_LEN) { tx_len = IMCP_TX_LEN(1 + 2); HTK_U16(tx[7]) = WM3M3C_PUBLIC_KEY_H_LEN * 2; } else if (SubCmd == WM3M4C_GCMD_PKEYHEADER) { tx_len = IMCP_TX_LEN(1 + WM3M3C_PUBLIC_KEY_H_LEN * 2); memcpy(&tx[7], p->m_PublicKeyHStr, WM3M3C_PUBLIC_KEY_H_LEN * 2); } else if (SubCmd == WM3M4C_GCMD_PKEY_LEN) { tx_len = IMCP_TX_LEN(1 + 2); HTK_U16(tx[7]) = p->m_PublicKeyStrLen; } else if (SubCmd == WM3M4C_GCMD_PKEY) { tx_len = IMCP_TX_LEN(1 + p->m_PublicKeyStrLen); memcpy(&tx[7], p->m_PublicKey.m_Str, p->m_PublicKeyStrLen); } else { tx_len = IMCP_TX_LEN(1); tx[6] = 0; //NG } } else { tx_len = IMCP_TX_LEN(1); tx[6] = 0; //NG } UpdateCheckSum(tx, tx_len); } break; #endif //FUNC_PTB_METER_WM3M4C #ifdef FUNC_EKM_OMNIMETER case PROTOCOL_MESSAGE_QUERY_EKM_OMNIMETER: { tx[0] = 0xaa; tx[1] = PROTOCOL_ADDR; tx[2] = CurRxBuf[1]; tx[3] = PROTOCOL_MESSAGE_QUERY_EKM_OMNIMETER; PEKM_Omnimeter p = Charger.m_pEKM_Omnimeter; byte SubCmd = CurRxBuf[6]; //#ifdef FUNC_CSU_CMD_DEBUG // char* s = "#CSU_EKM_Omnimeter_Get: "; // XP("%s0x%02X%s\r\n", s, SubCmd, (Charger.m_bUseExtMeter_OMNIMETER && p ? "" : " (NOT SUPPORTED)")); //#endif tx[6] = SubCmd; if (Charger.m_bUseExtMeter_OMNIMETER && p) { if (SubCmd == EKM_OMNIMETER_GCMD_POWER_CURRENT) { // tx_len = IMCP_TX_LEN(1 + (sizeof(u32) * 4)); //(u32) m_RMS_Watts_Ln_(1~3), m_RMS_Watts_Tot // memcpy(&tx[7], &p->m_RMS_Watts_Ln_1, sizeof(u32) * 4); tx_len = IMCP_TX_LEN(1 + (sizeof(u32) * 7)); //(u32) m_RMS_Watts_Ln_(1~3), m_RMS_Watts_Tot, Amps_Ln_(1~3) memcpy(&tx[7], &p->m_RMS_Watts_Ln_1, sizeof(u32) * 4);//7-10, 11-14, 15-18, 19-22 /// 23-26, 27-30, 31-34 u32 vTemp[3] = { (u32)(p->m_Amps_Ln_1 * 10), (u32)(p->m_Amps_Ln_2 * 10), (u32)(p->m_Amps_Ln_3 * 10)}; memcpy(&tx[23], vTemp, sizeof(u32) * 3); } else { tx_len = IMCP_TX_LEN(1); tx[6] = 0; //NG } } else { tx_len = IMCP_TX_LEN(1); tx[6] = 0; //NG } UpdateCheckSum(tx, tx_len); } break; #endif //FUNC_EKM_OMNIMETER #ifdef FUNC_WARNING_CODE case PROTOCOL_MESSAGE_QUERY_EVSE_WARNING: tx_len = 11; tx[0] = 0xaa; tx[1] = PROTOCOL_ADDR; tx[2] = CurRxBuf[1]; tx[3] = PROTOCOL_MESSAGE_QUERY_EVSE_WARNING; tx[4] = 4; tx[5] = 0x00; HTK_U32(tx[6]) = Charger.Warning_Code; for(uint16_t idx=0;idx<(tx[4] | (tx[5]<<8));idx++) { chksum ^= tx[6 + idx]; } tx[10] = chksum; break; #endif //FUNC_WARNING_CODE #ifdef FUNC_CSU_PUBLIC_KEY_OPERATION case PROTOCOL_MESSAGE_QUERY_EVSE_PUBLIC_KEY: { enum { DATA_LEN = 64, SALT_LEN = 64, MIXTURE_LEN = DATA_LEN + SALT_LEN, SALTMAP_LEN = GET_BOX_NUM(MIXTURE_LEN, 8), ALL_LEN = MIXTURE_LEN + SALTMAP_LEN, }; tx_len = IMCP_TX_LEN(ALL_LEN); tx[0] = 0xaa; tx[1] = PROTOCOL_ADDR; tx[2] = CurRxBuf[1]; tx[3] = PROTOCOL_MESSAGE_QUERY_EVSE_PUBLIC_KEY; HTK_U16(tx[4]) = ALL_LEN; //XP("\r\n[PROTOCOL_MESSAGE_QUERY_EVSE_PUBLIC_KEY]\r\n\r\n"); #ifdef FUNC_ENABLE_CSU_SIGN_IN_WHEN_MCU_HAVE_NG_MODELNAME if (!Charger.m_bCsuSignInMustVerify) { Charger.m_bCsuSignInMustVerify = HTK_TRUE; } #endif if (Charger.m_bCsuSignInMustVerify) { if (DataEncryption(Charger.memory.EVSE_Config.data.item.m_CsuPublicKey, DATA_LEN, &tx[6], ALL_LEN, 0) == PASS) { #ifdef FUNC_SECURITY_DEBUG_INFO HTK_ByteArray2HexStr_XP("#CSU_GetPublicKey", Charger.memory.EVSE_Config.data.item.m_CsuPublicKey, 0, DATA_LEN); #endif XP("#CSU_GetPublicKey: OK\r\n"); } else { memset(&tx[6], 0, ALL_LEN); XP("#CSU_GetPublicKey: [NG]\r\n"); } } else { memset(&tx[6], 0, ALL_LEN); XP("#CSU_GetPublicKey: [NG]\r\n"); } UpdateCheckSum(tx, tx_len); } break; #endif //FUNC_CSU_PUBLIC_KEY_OPERATION /* Config message */ case PROTOCOL_MESSAGE_CONFIG_FAN_SPEED: tx_len = 8; tx[0] = 0xaa; tx[1] = PROTOCOL_ADDR; tx[2] = CurRxBuf[1]; tx[3] = PROTOCOL_MESSAGE_CONFIG_FAN_SPEED; tx[4] = 0x01; tx[5] = 0x00; tx[6] = 0x01; tx[7] = 0x01; break; case PROTOCOL_MESSAGE_CONFIG_SN: tx_len = 8; tx[0] = 0xaa; tx[1] = PROTOCOL_ADDR; tx[2] = CurRxBuf[1]; tx[3] = PROTOCOL_MESSAGE_CONFIG_SN; tx[4] = 0x01; tx[5] = 0x00; #ifdef MODIFY_CONFIG_SN { uint16_t len = HTK_U16(CurRxBuf[4]); if (len < sizeof(Charger.memory.EVSE_Config.data.item.SerialNumber) && HTK_IS_DISP_CHAR(CurRxBuf[14])) { //OK tx[6] = 0x01; tx[7] = 0x01; memset(Charger.memory.EVSE_Config.data.item.SerialNumber, 0, ARRAY_SIZE(Charger.memory.EVSE_Config.data.item.SerialNumber)); memset(Charger.memory.EVSE_Config.data.item.System_ID, 0, ARRAY_SIZE(Charger.memory.EVSE_Config.data.item.System_ID)); for(uint16_t idx=0;idx<(len-8);idx++) { Charger.memory.EVSE_Config.data.item.SerialNumber[idx] = CurRxBuf[14+idx]; } Charger.memory.EVSE_Config.data.item.SerialNumber[len-8] = '\0'; memcpy(Charger.memory.EVSE_Config.data.item.System_ID, Charger.memory.EVSE_Config.data.item.ModelName, strlen(Charger.memory.EVSE_Config.data.item.ModelName)); memcpy(&Charger.memory.EVSE_Config.data.item.System_ID[strlen(Charger.memory.EVSE_Config.data.item.ModelName)], Charger.memory.EVSE_Config.data.item.SerialNumber, len); XP("#CONFIG_SN: %s\r\n", Charger.memory.EVSE_Config.data.item.SerialNumber); //parseVersionInfoFromModelname() ; Charger.memory.EVSE_Config.op_bits.update = ON; break; } else { //NG tx[6] = 0x00; tx[7] = 0x00; break; } } #else //MODIFY_CONFIG_SN // tx[6] = 0x01; // tx[7] = 0x01; // // memset(Charger.memory.EVSE_Config.data.item.SerialNumber, 0x00, sizeof(Charger.memory.EVSE_Config.data.item.SerialNumber)/sizeof(Charger.memory.EVSE_Config.data.item.SerialNumber[0])); // memset(Charger.memory.EVSE_Config.data.item.System_ID, 0x00, sizeof(Charger.memory.EVSE_Config.data.item.System_ID)/sizeof(Charger.memory.EVSE_Config.data.item.System_ID[0])); // for(uint16_t idx=0;idx<((CurRxBuf[4] | (CurRxBuf[5]<<8))-8);idx++) // { // Charger.memory.EVSE_Config.data.item.SerialNumber[idx] = CurRxBuf[14+idx]; // } // Charger.memory.EVSE_Config.data.item.SerialNumber[(CurRxBuf[4] | (CurRxBuf[5]<<8))-8] = '\0'; // memcpy(Charger.memory.EVSE_Config.data.item.System_ID, Charger.memory.EVSE_Config.data.item.ModelName, strlen(Charger.memory.EVSE_Config.data.item.ModelName)); // memcpy(&Charger.memory.EVSE_Config.data.item.System_ID[strlen(Charger.memory.EVSE_Config.data.item.ModelName)], Charger.memory.EVSE_Config.data.item.SerialNumber, (CurRxBuf[4] | (CurRxBuf[5]<<8))); // // parseVersionInfoFromModelname() ; // Charger.memory.EVSE_Config.op_bits.update = ON; // break; #endif //MODIFY_CONFIG_SN case PROTOCOL_MESSAGE_CONFIG_MODEL_NAME: tx_len = 8; tx[0] = 0xaa; tx[1] = PROTOCOL_ADDR; tx[2] = CurRxBuf[1]; tx[3] = PROTOCOL_MESSAGE_CONFIG_MODEL_NAME; tx[4] = 0x01; tx[5] = 0x00; #ifdef MODIFY_CONFIG_MODEL_NAME { uint16_t len = HTK_U16(CurRxBuf[4]); if (len < sizeof(Charger.memory.EVSE_Config.data.item.ModelName) && HTK_IS_DISP_CHAR(CurRxBuf[6])) { #ifdef FUNC_IGNORE_ILLEGAL_MODEL_NAME if (CurRxBuf[6] != 'A' && CurRxBuf[6] != 'D') { CurRxBuf[6+14] = '\0'; XP("#CONFIG_ILLEGAL_MODEL_NAME: %s\r\n", (char*)&CurRxBuf[6]); //NG tx[6] = 0x00; tx[7] = 0x00; break; } #endif //OK tx[6] = 0x01; tx[7] = 0x01; memset(Charger.memory.EVSE_Config.data.item.ModelName, 0, ARRAY_SIZE(Charger.memory.EVSE_Config.data.item.ModelName)); memset(Charger.memory.EVSE_Config.data.item.System_ID, 0, ARRAY_SIZE(Charger.memory.EVSE_Config.data.item.System_ID)); for(uint16_t idx=0;idx25mA Charger.memory.EVSE_Config.data.item.Correction_Leak[CurRxBuf[7]][1] = ((CurRxBuf[8] | (CurRxBuf[9]<<8))*100); // mA DEBUG_INFO("Charger.memory.EVSE_Config.data.item.Correction_Leak[[0] = %d\r\n",Charger.memory.EVSE_Config.data.item.Correction_Leak[CurRxBuf[7]][0]); DEBUG_INFO("Charger.memory.EVSE_Config.data.item.Correction_Leak[[1] = %d\r\n",Charger.memory.EVSE_Config.data.item.Correction_Leak[CurRxBuf[7]][1]); break; case GROUND_FAULT_VOLTAGE: //max 3.3V Charger.memory.EVSE_Config.data.item.Correction_GMI[CurRxBuf[7]][0] = (uint16_t)(adc_value.ADC3_IN4_GMI_VL1.value*10*3.3/4095) ; Charger.memory.EVSE_Config.data.item.Correction_GMI[CurRxBuf[7]][1] = CurRxBuf[8] | (CurRxBuf[9]<<8); break; } Charger.memory.EVSE_Config.op_bits.update = ON; break; case PROTOCOL_MESSAGE_CONFIG_RELAY_OUTPUT: tx_len = 8; tx[0] = 0xaa; tx[1] = PROTOCOL_ADDR; tx[2] = CurRxBuf[1]; tx[3] = PROTOCOL_MESSAGE_CONFIG_RELAY_OUTPUT; tx[4] = 0x01; tx[5] = 0x00; tx[6] = 0x01; for(uint16_t idx=0;idx<(tx[4] | (tx[5]<<8));idx++) { chksum ^= tx[6 + idx]; } tx[7] = chksum; #ifdef MODIFY_GOT_CSU_DUTY_CMD_PROCESS Charger.m_bPassGotCsuCpDutyCmd = (Charger.am3352.isRequestOn && Charger.Alarm_Code == 0 && ( (Charger.CP_State == SYSTEM_STATE_C && CurRxBuf[9] == 0x07) || (Charger.m_bEnableTypeE && IsTypeEPlugIn() && CurRxBuf[9] == 0x08) ) ); #endif if ( #ifdef MODIFY_PROTOCOL_MESSAGE_CONFIG_RELAY_OUTPUT_CHECK_LEGACY_REQUEST Charger.am3352.isRequestOn && #endif #ifdef MODIFY_PROTOCOL_MESSAGE_CONFIG_RELAY_OUTPUT_CHECK_ALARM_CODE Charger.Alarm_Code == 0 && #endif #ifdef MODIFY_PROTOCOL_MESSAGE_CONFIG_RELAY_OUTPUT_CHECK_MODE_CHARGING Charger.Mode == MODE_CHARGING && #endif #ifdef MODIFY_PROTOCOL_MESSAGE_CONFIG_RELAY_OUTPUT_CHECK_CP_PWM Charger.m_CP_CurPWM != PWM_DUTY_FULL && #endif Charger.CP_State == SYSTEM_STATE_C && CurRxBuf[9] == 0x07 //Main relay (0111b) ) { Charger.Relay_Action = GPIO_RELAY_ACTION_ON; #ifdef FUNC_RELAY_OFF_WHEN_GET_TWICE_OFF_CMD CsuSetRelayOffCount = 0; #endif } else if ( #ifdef MODIFY_PROTOCOL_MESSAGE_CONFIG_RELAY_OUTPUT_CHECK_LEGACY_REQUEST Charger.am3352.isRequestOn && #endif #ifdef MODIFY_PROTOCOL_MESSAGE_CONFIG_RELAY_OUTPUT_CHECK_ALARM_CODE Charger.Alarm_Code == 0 && #endif #ifdef MODIFY_PROTOCOL_MESSAGE_CONFIG_RELAY_OUTPUT_CHECK_MODE_CHARGING Charger.Mode == MODE_CHARGING && #endif Charger.m_bEnableTypeE && IsTypeEPlugIn() && CurRxBuf[9] == 0x08 //Type E socket relay (1000b) ) { Charger.SE_Relay_Action = GPIO_SE_RELAY_ACTION_ON; #ifdef FUNC_RELAY_OFF_WHEN_GET_TWICE_OFF_CMD CsuSetRelayOffCount = 0; #endif } else { #ifdef FUNC_RELAY_OFF_WHEN_GET_TWICE_OFF_CMD if (++CsuSetRelayOffCount >= 2) { CsuSetRelayOffCount = 0; #ifdef FUNC_MODE_DEBUG_RELAY_ON_OFF_TEST_FOR_PHN_QE if (Charger.Mode != MODE_DEBUG) { Charger.Relay_Action = GPIO_RELAY_ACTION_OFF ; } Charger.SE_Relay_Action = GPIO_SE_RELAY_ACTION_OFF; #else Charger.Relay_Action = GPIO_RELAY_ACTION_OFF ; Charger.SE_Relay_Action = GPIO_SE_RELAY_ACTION_OFF; #endif } #else //FUNC_RELAY_OFF_WHEN_GET_TWICE_OFF_CMD #ifdef FUNC_MODE_DEBUG_RELAY_ON_OFF_TEST_FOR_PHN_QE if (Charger.Mode != MODE_DEBUG) { Charger.Relay_Action = GPIO_RELAY_ACTION_OFF ; } Charger.SE_Relay_Action = GPIO_SE_RELAY_ACTION_OFF; #else Charger.Relay_Action = GPIO_RELAY_ACTION_OFF ; Charger.SE_Relay_Action = GPIO_SE_RELAY_ACTION_OFF; #endif #endif //FUNC_RELAY_OFF_WHEN_GET_TWICE_OFF_CMD } #ifdef FUNC_CSU_CMD_DEBUG XP("#CSU_SetRelay: %d\r\n", CurRxBuf[9]); #endif DEBUG_INFO("Set Relay Action By CSU: %d => Main(%d), TypeE(%d)\r\n", CurRxBuf[9], Charger.Relay_Action, Charger.SE_Relay_Action); break; case PROTOCOL_MESSAGE_CONFIG_GPIO_OUTPUT: tx_len = 8; tx[0] = 0xaa; tx[1] = PROTOCOL_ADDR; tx[2] = CurRxBuf[1]; tx[3] = PROTOCOL_MESSAGE_CONFIG_GPIO_OUTPUT; tx[4] = 0x01; tx[5] = 0x00; tx[6] = CurRxBuf[6]; tx[7] = 0x00 ^ CurRxBuf[6]; break; case PROTOCOL_MESSAGE_CONFIG_RTC: tx_len = 8; tx[0] = 0xaa; tx[1] = PROTOCOL_ADDR; tx[2] = CurRxBuf[1]; tx[3] = PROTOCOL_MESSAGE_CONFIG_RTC; tx[4] = 0x01; tx[5] = 0x00; tx[6] = 0x01; tx[7] = 0x01; setTime.Hours = (CurRxBuf[14]-'0')*10 + (CurRxBuf[15]-'0'); setTime.Minutes = (CurRxBuf[16]-'0')*10 + (CurRxBuf[17]-'0'); setTime.Seconds = (CurRxBuf[18]-'0')*10 + (CurRxBuf[19]-'0'); setTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; setTime.StoreOperation = RTC_STOREOPERATION_RESET; if (HAL_RTC_SetTime(&hrtc, &setTime, RTC_FORMAT_BIN) != HAL_OK) { Error_Handler(); } setDate.Year = (CurRxBuf[6]-'0')*1000 + (CurRxBuf[7]-'0')*100 + (CurRxBuf[8]-'0')*10 + (CurRxBuf[9]-'0') - 2000; setDate.Month = (CurRxBuf[10]-'0')*10+ (CurRxBuf[11]-'0'); setDate.Date = (CurRxBuf[12]-'0')*10 + (CurRxBuf[13]-'0'); if (HAL_RTC_SetDate(&hrtc, &setDate, RTC_FORMAT_BIN) != HAL_OK) { Error_Handler(); } #ifdef FUNC_CSU_CMD_DEBUG XP("#CSU_SetRTC: %04d/%02d/%02d %02d:%02d:%02d\r\n", setDate.Year + 2000, setDate.Month, setDate.Date, setTime.Hours, setTime.Minutes, setTime.Seconds); #endif break; case PROTOCOL_MESSAGE_CONFIG_LED_ACTION_ALARM: #ifdef VO_BLOCK_CSU_LED_ACTION_CMD if (Charger.m_VOCode.m_EnableBlockCsuLedCmd) { if (CurRxBuf == UART_IAP_rx_buffer) //CSU or Debug Port { tx_len = 8; tx[0] = 0xaa; tx[1] = PROTOCOL_ADDR; tx[2] = CurRxBuf[1]; tx[3] = PROTOCOL_MESSAGE_CONFIG_LED_ACTION_ALARM; tx[4] = 0x01; tx[5] = 0x00; tx[6] = 0x01; tx[7] = 0x01; break; } } #endif #ifdef FUNC_CUSTOMIZED_LED_MODE_FROM_CSU if((Charger.am3352.LedActionState != CurRxBuf[6])||(Charger.am3352.LedAlarmState != HTK_U32(CurRxBuf[7]))||CurRxBuf[6]==LED_ACTION_CUSTOMIZED_MODE) { Charger.am3352.LedActionState = CurRxBuf[6]; Charger.am3352.LedAlarmState = HTK_U32(CurRxBuf[7]); #else if((Charger.am3352.LedActionState != CurRxBuf[6])||(Charger.am3352.LedAlarmState != (CurRxBuf[7]|(CurRxBuf[8]<<8)|(CurRxBuf[9]<<16)|(CurRxBuf[10]<<24)))) { Charger.am3352.LedActionState = CurRxBuf[6]; Charger.am3352.LedAlarmState = (CurRxBuf[7]|(CurRxBuf[8]<<8)|(CurRxBuf[9]<<16)|(CurRxBuf[10]<<24)); #endif #ifdef FUNC_SHOW_CSU_CONFIG_LED_ACTION_INFO XP("#CSU_SetLed (%d, %d)\r\n", Charger.am3352.LedActionState, Charger.am3352.LedAlarmState); #endif switch(Charger.am3352.LedActionState) { case LED_ACTION_INIT: setLedMotion(LED_ACTION_INIT); break; case LED_ACTION_IDLE: setLedMotion(LED_ACTION_IDLE); break; case LED_ACTION_AUTHED: setLedMotion(LED_ACTION_AUTHED); break; case LED_ACTION_CONNECTED: setLedMotion(LED_ACTION_CONNECTED); break; case LED_ACTION_CHARGING: setLedMotion(LED_ACTION_CHARGING); break; case LED_ACTION_STOP: setLedMotion(LED_ACTION_STOP); break; case LED_ACTION_ALARM: setLedMotion(LED_ACTION_ALARM); break; case LED_ACTION_MAINTAIN: setLedMotion(LED_ACTION_MAINTAIN); break; case LED_ACTION_RFID_PASS: setLedMotion(LED_ACTION_RFID_PASS); timerEnable(TIMER_IDX_LED_TEMP, 3000); break; case LED_ACTION_RFID_FAIL: setLedMotion(LED_ACTION_RFID_FAIL); timerEnable(TIMER_IDX_LED_TEMP, 3000); break; case LED_ACTION_BLE_CONNECT: setLedMotion(LED_ACTION_BLE_CONNECT); timerEnable(TIMER_IDX_LED_TEMP, 3000); break; case LED_ACTION_BLE_DISABLE: setLedMotion(LED_ACTION_BLE_DISABLE); break; case LED_ACTION_ALL_OFF: setLedMotion(LED_ACTION_ALL_OFF); break; case LED_ACTION_INTERNET_DISCONNECT: setLedMotion(LED_ACTION_INTERNET_DISCONNECT); break; case LED_ACTION_HANDSHAKE_FAIL: setLedMotion(LED_ACTION_HANDSHAKE_FAIL); timerEnable(TIMER_IDX_LED_TEMP, 3000); break; case LED_ACTION_RESTORE_SETTING: setLedMotion(LED_ACTION_RESTORE_SETTING); timerEnable(TIMER_IDX_LED_TEMP, 3000); break; #ifdef MODIFY_LED_STATUS_202108 case LED_ACTION_IDLE_BACKEND_CONNECTED: setLedMotion(LED_ACTION_IDLE_BACKEND_CONNECTED); break; case LED_ACTION_IDLE_BACKEND_CONNECTED_SLEEP: setLedMotion(LED_ACTION_IDLE_BACKEND_CONNECTED_SLEEP); break; case LED_ACTION_IDLE_BACKEND_DISCONNECTED: setLedMotion(LED_ACTION_IDLE_BACKEND_DISCONNECTED); break; case LED_ACTION_IDLE_BACKEND_DISCONNECTED_SLEEP: setLedMotion(LED_ACTION_IDLE_BACKEND_DISCONNECTED_SLEEP); break; case LED_ACTION_RESERVATION_MODE: setLedMotion(LED_ACTION_RESERVATION_MODE); break; #endif //MODIFY_LED_STATUS_202108 #ifdef FUNC_CUSTOMIZED_LED_MODE_FROM_CSU case LED_ACTION_CUSTOMIZED_MODE: { LED_UserCfg o = { 0 }; o.m_Mode = CurRxBuf[11]; o.m_AutoRepeat = CurRxBuf[12]; o.m_Brightness = CurRxBuf[13]; o.m_R = HTK_U16(CurRxBuf[14]); o.m_G = HTK_U16(CurRxBuf[16]); o.m_B = HTK_U16(CurRxBuf[18]); HTK_BOOL bCfgOK = HTK_TRUE; if (o.m_Mode == LED_USER_MODE_SOLID) { //Do nothing } else if (o.m_Mode == LED_USER_MODE_BLINK) { o.Blink.m_On_ms = HTK_U16(CurRxBuf[20]); o.Blink.m_Off_ms = HTK_U16(CurRxBuf[22]); o.Blink.m_Rest_ms = HTK_U16(CurRxBuf[24]); o.Blink.m_Count = HTK_U16(CurRxBuf[26]); } else if (o.m_Mode == LED_USER_MODE_BREATH) { o.Breath.m_Up_ms = HTK_U16(CurRxBuf[20]); o.Breath.m_Down_ms = HTK_U16(CurRxBuf[22]); } else { //Wrong mode bCfgOK = HTK_FALSE; } if (bCfgOK) { setLedMotion_User(LED_ACTION_CUSTOMIZED_MODE, &o); } } break; #endif //FUNC_CUSTOMIZED_LED_MODE_FROM_CSU default: break; } } tx_len = 8; tx[0] = 0xaa; tx[1] = PROTOCOL_ADDR; tx[2] = CurRxBuf[1]; tx[3] = PROTOCOL_MESSAGE_CONFIG_LED_ACTION_ALARM; tx[4] = 0x01; tx[5] = 0x00; tx[6] = 0x01; tx[7] = 0x01; break; case PROTOCOL_MESSAGE_CONFIG_MAX_CURRENT_PWM_DUTY: tx_len = 8; tx[0] = 0xaa; tx[1] = PROTOCOL_ADDR; tx[2] = CurRxBuf[1]; tx[3] = PROTOCOL_MESSAGE_CONFIG_MAX_CURRENT_PWM_DUTY; tx[4] = 0x01; tx[5] = 0x00; #ifdef FUNC_CSU_CMD_DEBUG XP("#CSU_SetCpPwmDuty: %d %s\r\n", CurRxBuf[6], (Charger.m_bBlockCsuCpPwmDuty || Charger.m_bBlockCsuCpPwmDutyWhenAlarmCpF) ? "(Block)" : ""); #endif if ( #ifdef FUNC_BLOCK_CSU_CONFIG_CP_PWM_DUTY !Charger.m_bBlockCsuCpPwmDuty && #endif #ifdef FUNC_BLOCK_CSU_CMD_SET_DUTY_WHEN_ALARM_CP_F_STATE !Charger.m_bBlockCsuCpPwmDutyWhenAlarmCpF && #endif ( #ifdef FUNC_AX80 (CurRxBuf[6] <= 80 && CurRxBuf[6] >= 6) || #else (CurRxBuf[6] <= 48 && CurRxBuf[6] >= 6) || #endif (CurRxBuf[6] == PWM_DUTY_OFF) || (CurRxBuf[6] == 1) || (CurRxBuf[6] == 5) || (CurRxBuf[6] == 100) ) ) { #ifdef MODIFY_AC_EVSE_STATUS_MAX_CHARGING_CURRENT_VARIABLE Charger.AC_MaxChargingCurrentOrDuty = CurRxBuf[6]; #endif tx[6] = 0x00; #ifdef FUNC_AX80 if(CurRxBuf[6] <= 80 && CurRxBuf[6] >= 6) #else if(CurRxBuf[6] <= 48 && CurRxBuf[6] >= 6) #endif { Charger.memory.EVSE_Config.data.item.MaxChargingCurrent = CurRxBuf[6]; #ifdef FUNC_CCS Charger.m_bRunCCS = 0; Charger.m_bGotCsuCpDutyCmd = 1; #endif #ifdef MODIFY_CP_TASK_CTRL_CP_PWM user_pwm_setvalue(PWM_CH_CP, GetCpPwmDuty(Charger.memory.EVSE_Config.data.item.MaxChargingCurrent)); #ifdef FUNC_SYSTEM_KEEP_INFO g_SystemKeepInfo.m_CpPwmVal = GetCpPwmDuty(Charger.memory.EVSE_Config.data.item.MaxChargingCurrent); SystemKeepInfo_Update(&g_SystemKeepInfo); #endif #else //MODIFY_CP_TASK_CTRL_CP_PWM //user_pwm_setvalue(PWM_CH_CP, PWM_DUTY_651(Charger.memory.EVSE_Config.data.item.MaxChargingCurrent)); #endif //MODIFY_CP_TASK_CTRL_CP_PWM tx[6] = 0x01; } else if (CurRxBuf[6] == PWM_DUTY_OFF) { user_pwm_setvalue(PWM_CH_CP, 0); // State F #ifdef FUNC_SYSTEM_KEEP_INFO g_SystemKeepInfo.m_CpPwmVal = 0; SystemKeepInfo_Update(&g_SystemKeepInfo); #endif tx[6] = 0x01; } else if (CurRxBuf[6] == 5) { #ifdef FUNC_CCS Charger.m_bRunCCS = 1; Charger.m_bGotCsuCpDutyCmd = 1; #endif user_pwm_setvalue(PWM_CH_CP, PWM_DUTY_5); #ifdef FUNC_SYSTEM_KEEP_INFO g_SystemKeepInfo.m_CpPwmVal = PWM_DUTY_5; SystemKeepInfo_Update(&g_SystemKeepInfo); #endif tx[6] = 0x01; } else if (CurRxBuf[6] == 100) { user_pwm_setvalue(PWM_CH_CP, PWM_DUTY_FULL); #ifdef FUNC_SYSTEM_KEEP_INFO g_SystemKeepInfo.m_CpPwmVal = PWM_DUTY_FULL; SystemKeepInfo_Update(&g_SystemKeepInfo); #endif tx[6] = 0x01; } //control pilot E if (CurRxBuf[6] == 1) { HAL_GPIO_WritePin(OUT_StateE_GPIO_Port, OUT_StateE_Pin, GPIO_PIN_SET); // ON // State E user_pwm_setvalue(PWM_CH_CP, 0); //Temporarily, wait for EE to change the hardware and delete #ifdef FUNC_SYSTEM_KEEP_INFO g_SystemKeepInfo.m_CpPwmVal = 0; SystemKeepInfo_Update(&g_SystemKeepInfo); #endif tx[6] = 0x01; } else { HAL_GPIO_WritePin(OUT_StateE_GPIO_Port, OUT_StateE_Pin, GPIO_PIN_RESET); //OFF } XP("#CSU_SetCpPwmDuty_Final: %d\r\n", CurRxBuf[6]); } else { tx[6] = 0x00; DEBUG_INFO("CSU_SetCpPwmDuty [NG] (%d) !!!!! \r\n", CurRxBuf[6]); } for(uint16_t idx=0;idx<(tx[4] | (tx[5]<<8));idx++) { chksum ^= tx[6 + idx]; } tx[7] = chksum; //checksum break; case PROTOCOL_MESSAGE_CONFIG_LEGACY_REQUEST: #ifdef FUNC_CSU_CMD_DEBUG XP("#CSU_SetRequest: %d\r\n", CurRxBuf[6]); #endif //#ifdef FUNC_DC_AUTO_RELAY_OFF // if (Charger.m_bModelNameDC && CurRxBuf[6] == 0) // { // if (Charger.Relay_Action != GPIO_RELAY_ACTION_OFF) // { // XP("#SET RELAY OFF\r\n"); // Charger.Relay_Action = GPIO_RELAY_ACTION_OFF; // } // if (Charger.SE_Relay_Action != GPIO_SE_RELAY_ACTION_OFF) // { // XP("#SET SE_RELAY OFF\r\n"); // Charger.SE_Relay_Action = GPIO_SE_RELAY_ACTION_OFF; // } // } //#endif if((CurRxBuf[6]&SETTING_LEGACY_REQUEST)>0) { //#ifdef FUNC_REQUEST_OFF_WHEN_GET_TWICE_OFF_CMD // CsuSetRequestOffCount = 0; //#endif Charger.am3352.isRequestOff = OFF; Charger.rfid.op_bits.reqStart = ON; if(!Charger.am3352.isRequestOn) { DEBUG_INFO("#Request Pin On.\r\n"); Charger.am3352.isRequestOn = ON; #ifdef FUNC_SYSTEM_KEEP_INFO g_SystemKeepInfo.m_CsuIsRequestOn = Charger.am3352.isRequestOn; SystemKeepInfo_Update(&g_SystemKeepInfo); #endif } } else { //#ifdef FUNC_REQUEST_OFF_WHEN_GET_TWICE_OFF_CMD // if (++CsuSetRequestOffCount >= 2) // { // CsuSetRequestOffCount = 0; // Charger.am3352.isRequestOn = OFF; //#ifdef FUNC_SYSTEM_KEEP_INFO // g_SystemKeepInfo.m_CsuIsRequestOn = Charger.am3352.isRequestOn; // SystemKeepInfo_Update(&g_SystemKeepInfo); //#endif // Charger.am3352.RequestPinDebounceCnt = 0; // Charger.rfid.op_bits.reqStart = OFF; // if(!Charger.am3352.isRequestOff) // { // DEBUG_INFO("#Request Pin Off.\r\n"); // Charger.am3352.isRequestOff = ON; // } // } //#else //FUNC_REQUEST_OFF_WHEN_GET_TWICE_OFF_CMD Charger.am3352.isRequestOn = OFF; #ifdef FUNC_SYSTEM_KEEP_INFO g_SystemKeepInfo.m_CsuIsRequestOn = Charger.am3352.isRequestOn; SystemKeepInfo_Update(&g_SystemKeepInfo); #endif Charger.am3352.RequestPinDebounceCnt = 0; Charger.rfid.op_bits.reqStart = OFF; if(!Charger.am3352.isRequestOff) { DEBUG_INFO("#Request Pin Off.\r\n"); Charger.am3352.isRequestOff = ON; } //#endif //FUNC_REQUEST_OFF_WHEN_GET_TWICE_OFF_CMD } tx_len = 8; tx[0] = 0xaa; tx[1] = PROTOCOL_ADDR; tx[2] = CurRxBuf[1]; tx[3] = PROTOCOL_MESSAGE_CONFIG_LEGACY_REQUEST; tx[4] = 0x01; tx[5] = 0x00; tx[6] = 0x01; tx[7] = 0x01; break; case PROTOCOL_MESSAGE_CONFIG_MCU_RESET: tx_len = 8; tx[0] = 0xaa; tx[1] = PROTOCOL_ADDR; tx[2] = CurRxBuf[1]; tx[3] = PROTOCOL_MESSAGE_CONFIG_MCU_RESET; tx[4] = 0x01; tx[5] = 0x00; tx[6] = 0x01; tx[7] = 0x01; if((CurRxBuf[6]&0x01)>0){ DEBUG_INFO("MCU reset request.\r\n"); #ifdef MODIFY_DC_RS485_UPGRADE_ISSUE Prefix_UartTX(tx, CurRxBuf); HAL_UART_Transmit(pUartHandle, (uint8_t *)tx, tx_len , 0x0ffff); Postfix_UartTX(tx, CurRxBuf); #else HAL_UART_Transmit(&IAP_USART, (uint8_t *)tx, tx_len , 0x0ffff); #endif osDelay(1000); NVIC_SystemReset(); } else { tx[6] = 0x00; tx[7] = 0x00; } break; case PROTOCOL_MESSAGE_CONFIG_BREATHE_LED_TIMING: Charger.am3352.BreatheLedConnectFadeIn = (((uint16_t)CurRxBuf[7]<<8)+(uint16_t)CurRxBuf[6]); Charger.am3352.BreatheLedConnectFadeOut = (((uint16_t)CurRxBuf[9]<<8)+(uint16_t)CurRxBuf[8]); DEBUG_INFO("Connect Breathe Led Fade In time: %d ms.\r\n",Charger.am3352.BreatheLedConnectFadeIn); DEBUG_INFO("Connect Breathe Led Fade Out time: %d ms.\r\n",Charger.am3352.BreatheLedConnectFadeOut); Charger.am3352.BreatheLedAuthdFadeIn = (((uint16_t)CurRxBuf[11]<<8)+(uint16_t)CurRxBuf[10]); Charger.am3352.BreatheLedAuthdFadeOut = (((uint16_t)CurRxBuf[13]<<8)+(uint16_t)CurRxBuf[12]); DEBUG_INFO("Authd Breathe Led Fade In time: %d ms.\r\n",Charger.am3352.BreatheLedAuthdFadeIn); DEBUG_INFO("Authd Breathe Led Fade Out time: %d ms.\r\n",Charger.am3352.BreatheLedAuthdFadeOut); Charger.am3352.BreatheLedChargeFadeIn = (((uint16_t)CurRxBuf[15]<<8)+(uint16_t)CurRxBuf[14]); Charger.am3352.BreatheLedChargeFadeOut = (((uint16_t)CurRxBuf[17]<<8)+(uint16_t)CurRxBuf[16]); DEBUG_INFO("Charge Breathe Led Fade In time: %d ms.\r\n",Charger.am3352.BreatheLedChargeFadeIn); DEBUG_INFO("Charge Breathe Led Fade Out time: %d ms.\r\n",Charger.am3352.BreatheLedChargeFadeOut); tx_len = 8; tx[0] = 0xaa; tx[1] = PROTOCOL_ADDR; tx[2] = CurRxBuf[1]; tx[3] = PROTOCOL_MESSAGE_CONFIG_BREATHE_LED_TIMING; tx[4] = 0x01; tx[5] = 0x00; tx[6] = 0x01; tx[7] = 0x01; break; case PROTOCOL_MESSAGE_CONFIG_LED_BRIGHTNESS: memcpy(Charger.Led_Brightness, &CurRxBuf[6], 12); tx_len = 8; tx[0] = 0xaa; tx[1] = PROTOCOL_ADDR; tx[2] = CurRxBuf[1]; tx[3] = PROTOCOL_MESSAGE_CONFIG_LED_BRIGHTNESS; tx[4] = 0x01; tx[5] = 0x00; tx[6] = 0x01; tx[7] = 0x01; break; case PROTOCOL_MESSAGE_CONFIG_EVSE_AUTH_MODE: switch(CurRxBuf[6]) { case AUTH_MODE_OCPP: Charger.memory.EVSE_Config.data.item.AuthMode = AUTH_MODE_OCPP ; break; case AUTH_MODE_FREE: Charger.memory.EVSE_Config.data.item.AuthMode = AUTH_MODE_FREE ; break; default: Charger.memory.EVSE_Config.data.item.AuthMode = AUTH_MODE_FREE ; Charger.memory.EVSE_Config.data.item.OfflinePolicy = RFID_USER_AUTH_FREE ; break ; } switch(CurRxBuf[7]) { case RFID_USER_AUTH_LOCAL_LIST: Charger.memory.EVSE_Config.data.item.OfflinePolicy = RFID_USER_AUTH_LOCAL_LIST ; break; case RFID_USER_AUTH_PH: Charger.memory.EVSE_Config.data.item.OfflinePolicy = RFID_USER_AUTH_PH ; break; case RFID_USER_AUTH_FREE: Charger.memory.EVSE_Config.data.item.OfflinePolicy = RFID_USER_AUTH_FREE ; break; case RFID_USER_AUTH_NO_CHARGING: Charger.memory.EVSE_Config.data.item.OfflinePolicy = RFID_USER_AUTH_NO_CHARGING ; break; default: Charger.memory.EVSE_Config.data.item.AuthMode = AUTH_MODE_FREE ; Charger.memory.EVSE_Config.data.item.OfflinePolicy = RFID_USER_AUTH_FREE ; break ; } tx_len = 8; tx[0] = 0xaa; tx[1] = PROTOCOL_ADDR; tx[2] = CurRxBuf[1]; tx[3] = PROTOCOL_MESSAGE_CONFIG_EVSE_AUTH_MODE; tx[4] = 0x01; tx[5] = 0x00; tx[6] = 0x01; tx[7] = 0x01; Charger.memory.EVSE_Config.op_bits.update = ON; break; case PROTOCOL_MESSAGE_CONFIG_ERASE_MEMORY: switch(CurRxBuf[6]) { case 0: Charger.memory.EVSE_Config.op_bits.clear = ON; Charger.memory.whiteList.op_bits.clear = ON; #ifdef FUNC_METER_IC_HISTORY Charger.memory.hisMeterIC.op_bits.clear = ON; #else Charger.memory.hisCharging.op_bits.clear = ON; #endif Charger.memory.hisAlarm.op_bits.clear = ON; Charger.memory.coldLoadPickUp.op_bits.clear = ON; break; case 1: Charger.memory.EVSE_Config.op_bits.clear = ON; break; case 2: Charger.memory.whiteList.op_bits.clear = ON; break; case 3: #ifdef FUNC_METER_IC_HISTORY Charger.memory.hisMeterIC.op_bits.clear = ON; #else Charger.memory.hisCharging.op_bits.clear = ON; #endif break; case 4: Charger.memory.hisAlarm.op_bits.clear = ON; break; case 5: Charger.memory.coldLoadPickUp.op_bits.clear = ON; break; default: break; } tx_len = 8; tx[0] = 0xaa; tx[1] = PROTOCOL_ADDR; tx[2] = CurRxBuf[1]; tx[3] = PROTOCOL_MESSAGE_CONFIG_ERASE_MEMORY; tx[4] = 0x01; tx[5] = 0x00; tx[6] = 0x01; tx[7] = 0x01; break; case PROTOCOL_MESSAGE_CONFIG_AUX_POWER_SW: switch(CurRxBuf[6]) { case 0: HAL_GPIO_WritePin(OUT_Meter_Power_GPIO_Port, OUT_Meter_Power_Pin, (CurRxBuf[7]?GPIO_PIN_SET:GPIO_PIN_RESET)); break; case 1: HAL_GPIO_WritePin(OUT_Meter_Power_GPIO_Port, OUT_Meter_Power_Pin, (CurRxBuf[7]?GPIO_PIN_SET:GPIO_PIN_RESET)); break; default: break; } tx_len = 8; tx[0] = 0xaa; tx[1] = PROTOCOL_ADDR; tx[2] = CurRxBuf[1]; tx[3] = PROTOCOL_MESSAGE_CONFIG_AUX_POWER_SW; tx[4] = 0x01; tx[5] = 0x00; tx[6] = 0x01; tx[7] = 0x01; break; #ifdef FUNC_METER_IC_ADE7858A case PROTOCOL_MESSAGE_CONFIG_METER_IC_CALI_PARAMETER: tx_len = 8; tx[0] = 0xaa; tx[1] = PROTOCOL_ADDR; tx[2] = CurRxBuf[1]; tx[3] = PROTOCOL_MESSAGE_CONFIG_METER_IC_CALI_PARAMETER; tx[4] = 0x01; tx[5] = 0x00; { MeterIC_CaliValType type = (MeterIC_CaliValType)CurRxBuf[6]; uint32_t nSetVal = HTK_U32(CurRxBuf[7]); if (type == MICC_RESET_POWER_CONSUMPTION_CUMULATIVE) //0xA0: Reset power consumption cumulative { if (nSetVal == AUTHCODE_RESET_POWER_CONSUMPTION_CUMULATIVE) { tx[6] = 0x01; //Set OK XP("#RESET_POWER_CONSUMPTION_CUMULATIVE\r\n"); Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_Total = 0; Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_L1 = 0; Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_L2 = 0; Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_L3 = 0; Charger.memory.EVSE_Config.data.item.AcPlugInTimes = 0; //Clear PlugIn counter Charger.memory.EVSE_Config.op_bits.update = ON; } else { tx[6] = 0x00; //Set NG } } //0xC0/0xC1: Reset all MeterIC calibration values to (0x00/0xFF) else if (type == MICC_RESET_METER_IC_ALL_CALI_VAL_00 || type == MICC_RESET_METER_IC_ALL_CALI_VAL_FF) { if (nSetVal == AUTHCODE_RESET_METER_IC_ALL_CALI_VAL) { tx[6] = 0x01; //Set OK XP("#RESET_RESET_ALL_CALI_VAL: 0x%02X\r\n", type); memset (&Charger.memory.EVSE_Config.data.item.m_MeterIC_CaliVals, type == MICC_RESET_METER_IC_ALL_CALI_VAL_00 ? 0x00 : 0xFF, sizeof(MeterIC_CaliVals)); #ifdef FUNC_METER_IC_CALI_FLAG Charger.memory.EVSE_Config.data.item.m_MeterIC_CaliFlag.m_Data = 0; #endif Charger.memory.EVSE_Config.op_bits.update = ON; Charger.m_MeterIC_TrigWriteCaliVals.m_Data = HTK_U32_MAX; } else { tx[6] = 0x00; //Set NG } } #ifdef FUNC_GUN_LOCK else if (type == MICC_SET_GUN_LOCK_STATUS && Charger.m_bUseGunLock) { XP("#SetGunLock: %d\r\n", nSetVal); if (nSetVal == 0) { GL_Trig(GL_MODE_UNLOCK); } else if (nSetVal == 1) { GL_Trig(GL_MODE_LOCK); } } #endif //FUNC_GUN_LOCK #ifdef FUNC_VOLATILE_OPERATION else if (type == MICC_SET_VO_CODE) { Charger.m_VOCode.m_Value = nSetVal; XP("#SET VO_Code = 0x%08X\r\n", Charger.m_VOCode.m_Value); #ifdef VO_SIMU_CP XP("#VO: EnableSimuCP(%d)\r\n", Charger.m_VOCode.m_EnableSimuCP); if (Charger.m_VOCode.m_EnableSimuCP) { Charger.m_SimuData.m_CP.m_VoltPos = (uint16_t)(CpDetectionResult.PositiveValue == 0 ? 0 : HTK_GetPosFromZero(CP_GET_OPA_VIN_USE_ADC(CpDetectionResult.PositiveValue)) * 1000); //V => mV Charger.m_SimuData.m_CP.m_VoltNeg = (uint16_t)(CpDetectionResult.NegativeValue == 0 ? 0 : HTK_GetNegFromZero(CP_GET_OPA_VIN_USE_ADC(CpDetectionResult.NegativeValue)) * 1000); //V => mV } #endif //VO_SIMU_CP #ifdef VO_SIMU_PP XP("#VO: EnableSimuPP(%d)\r\n", Charger.m_VOCode.m_EnableSimuPP); if (Charger.m_VOCode.m_EnableSimuPP) { if (!Charger.m_bDetectPP) { Charger.m_VOCode.m_EnableSimuPP = 0; XP("#VO: EnableSimuPP(%d) [Detect PP Function OFF]\r\n", Charger.m_VOCode.m_EnableSimuPP); } } #endif #ifdef VO_DISABLE_RELAY_WELDING XP("#VO: DisableRelayWelding(%d)\r\n", Charger.m_VOCode.m_DisableRelayWelding); #endif #ifdef VO_BLOCK_CSU_LED_ACTION_CMD XP("#VO: EnableBlockCsuLedCmd(%d)\r\n", Charger.m_VOCode.m_EnableBlockCsuLedCmd); #endif #ifdef VO_SIMU_ACV XP("#VO: EnableSimuACV(%d)\r\n", Charger.m_VOCode.m_EnableSimuACV); if (Charger.m_VOCode.m_EnableSimuACV) { Charger.m_SimuData.m_AcvVolt = Charger.Voltage[0]; } #endif #ifdef VO_SIMU_NTC XP("#VO: EnableSimuNTC(%d)\r\n", Charger.m_VOCode.m_EnableSimuNTC); if (Charger.m_VOCode.m_EnableSimuNTC) { Charger.m_SimuData.m_NtcTemp = Charger.temperature.SystemAmbientTemp; } #endif #ifdef VO_SIMU_ALARMCODE XP("#VO: EnableSimuAlarmCode(%d)\r\n", Charger.m_VOCode.m_EnableSimuAlarmCode); if (Charger.m_VOCode.m_EnableSimuAlarmCode) { Charger.m_SimuData.m_AlarmCode = Charger.Alarm_Code; } #endif #ifdef VO_SIMU_ACA XP("#VO: EnableSimuACA(%d)\r\n", Charger.m_VOCode.m_EnableSimuACA); if (Charger.m_VOCode.m_EnableSimuACA) { Charger.m_SimuData.m_AcaCurr = Charger.Current[0]; } #endif #ifdef VO_DISABLE_DETECT_TILT_SENSOR if (Charger.m_bModelNameAX80_1P) { XP("#VO: DisableDetectTiltSensor(%d)\r\n", Charger.m_VOCode.m_DisableDetectTiltSensor); } #endif } #ifdef VO_SIMU_CP else if (type == MICC_SET_SIMU_CP_VOLT) { if (Charger.m_VOCode.m_EnableSimuCP) { Charger.m_SimuData.m_CP.m_Value = nSetVal; XP("#SET VO_SimuCP_Volt = (+%0.3f, -%0.3f)\r\n", Charger.m_SimuData.m_CP.m_VoltPos * 0.001, Charger.m_SimuData.m_CP.m_VoltNeg * 0.001); } } #endif //VO_SIMU_CP #ifdef VO_SIMU_PP else if (type == MICC_SET_SIMU_PP_CURR) { if (Charger.m_VOCode.m_EnableSimuPP) { if (Charger.m_bDetectPP) { Charger.m_SimuData.m_PPCurr = nSetVal; XP("#SET VO_SimuPP_Curr = (%d)\r\n", Charger.m_SimuData.m_PPCurr); } else { XP("#SET VO_SimuPP_Curr = (%d) [Detect PP Function OFF]\r\n", Charger.m_SimuData.m_PPCurr); } } } #endif //VO_SIMU_PP #ifdef VO_SIMU_ACV else if (type == MICC_SET_SIMU_ACV_VOLT) { if (Charger.m_VOCode.m_EnableSimuACV) { Charger.m_SimuData.m_AcvVolt = (uint16_t)nSetVal; XP("#SET VO_SimuACV_Volt = (%d)\r\n", Charger.m_SimuData.m_AcvVolt); } } #endif #ifdef VO_SIMU_NTC else if (type == MICC_SET_SIMU_NTC_TEMP) { if (Charger.m_VOCode.m_EnableSimuNTC) { Charger.m_SimuData.m_NtcTemp = (uint8_t)nSetVal; XP("#SET VO_SimuNTC_Temp = (%d)\r\n", Charger.m_SimuData.m_NtcTemp); } } #endif #ifdef VO_SIMU_ALARMCODE else if (type == MICC_SET_SIMU_ALARMCIDE_VAL) { if (Charger.m_VOCode.m_EnableSimuAlarmCode) { Charger.m_SimuData.m_AlarmCode = nSetVal; XP("#SET VO_SimuAlarmCode_Val = (0x%08X)\r\n", Charger.m_SimuData.m_AlarmCode); } } #endif #ifdef VO_SIMU_ACA else if (type == MICC_SET_SIMU_ACA_CURR) { if (Charger.m_VOCode.m_EnableSimuACA) { Charger.m_SimuData.m_AcaCurr = (uint16_t)nSetVal; XP("#SET VO_SimuACA_Curr = (%d)\r\n", Charger.m_SimuData.m_AcaCurr); } } #endif #endif //FUNC_VOLATILE_OPERATION else { uint32_t nSetVal = HTK_U32(CurRxBuf[7]); uint8_t Offset = 0xFF; int32_t *p = MeterIC_GetCaliValPtr(type, &Offset); if (p != NULL && Offset != 0xFF) { tx[6] = 0x01; //Set OK *p = nSetVal; #ifdef FUNC_METER_IC_CALI_FLAG Charger.memory.EVSE_Config.data.item.m_MeterIC_CaliFlag.m_Data |= (((uint32_t)0x01) << Offset); #endif Charger.memory.EVSE_Config.op_bits.update = ON; Charger.m_MeterIC_TrigWriteCaliVals.m_Data |= (((uint32_t)0x01) << Offset); #ifdef FUNC_METER_IC_HISTORY recordMeterICHis(type, *p); #endif } else { tx[6] = 0x00; //Set NG } XP(" \r\nPROTOCOL_MESSAGE_CONFIG_METER_IC_CALI_PARAMETER(0x%02X, 0x%04X)\r\n\r\n", type, nSetVal); } } UpdateCheckSum(tx, tx_len); break; #endif //FUNC_METER_IC_ADE7858A #ifdef FUNC_PTB_METER_WM3M4C case PROTOCOL_MESSAGE_CONFIG_PTB_METER_WM3M4C: { tx[0] = 0xaa; tx[1] = PROTOCOL_ADDR; tx[2] = CurRxBuf[1]; tx[3] = PROTOCOL_MESSAGE_CONFIG_PTB_METER_WM3M4C; PWM3M4C p = Charger.m_pWM3M4C; byte SubCmd = CurRxBuf[6]; tx_len = 6 + (1) + 1; char* s = "#CSU_WM3M4C_Set: "; #ifdef FUNC_CSU_CMD_DEBUG XP("%s0x%02X%s\r\n", s, SubCmd, (Charger.m_bUseExtMeter_WM3M4C && p ? "" : " (NOT SUPPORTED)")); #endif if (Charger.m_bUseExtMeter_WM3M4C && p) { if (SubCmd == WM3M4C_SCMD_CHG_BEGIN) //AA 00 FF 97 01 00 01 01 { #ifdef FUNC_CSU_CMD_DEBUG XP("%sCHARGE BEGIN\r\n", s); #endif tx[6] = 1; //OK p->m_bTrigBegCharge = HTK_TRUE; } else if (SubCmd == WM3M4C_SCMD_CHG_END) //AA 00 FF 97 01 00 02 02 { #ifdef FUNC_CSU_CMD_DEBUG XP("%sCHARGE END\r\n", s); #endif tx[6] = 1; //OK p->m_bTrigEndCharge = HTK_TRUE; } else { tx[6] = 0; //NG } } else { tx[6] = 0; //NG } UpdateCheckSum(tx, tx_len); } break; #endif //FUNC_PTB_METER_WM3M4C #ifdef FUNC_CSU_SIGN_IN_VERIFY case PROTOCOL_MESSAGE_CONFIG_CSU_SIGN_IN_VERIFY: tx_len = 8; tx[0] = 0xaa; tx[1] = PROTOCOL_ADDR; tx[2] = CurRxBuf[1]; tx[3] = PROTOCOL_MESSAGE_CONFIG_CSU_SIGN_IN_VERIFY; tx[4] = 0x01; tx[5] = 0x00; //XP("\r\n[PROTOCOL_MESSAGE_CONFIG_CSU_SIGN_IN_VERIFY]\r\n\r\n"); #ifdef FUNC_ENABLE_CSU_SIGN_IN_WHEN_MCU_HAVE_NG_MODELNAME if (!Charger.m_bCsuSignInMustVerify) { Charger.m_bCsuSignInMustVerify = HTK_TRUE; } #endif if (Charger.m_bCsuSignInMustVerify) { #ifdef FUNC_VERIFY_TASK if (!Charger.m_bCsuSignInVerifyOK && !Charger.m_bRunCsuSignInVerify) { Charger.m_VerifyTaskRxBufDataLen = *pCurRxBuf_RxLen; memset(Charger.m_VerifyTaskRxBuf, 0, VERIFY_TASK_RXBUF_LEN); memcpy(Charger.m_VerifyTaskRxBuf, CurRxBuf, HTK_GET_VAL_MIN(Charger.m_VerifyTaskRxBufDataLen, VERIFY_TASK_RXBUF_LEN)); Charger.m_bRunCsuSignInVerify = HTK_TRUE; } #else //Charger.m_bCsuVerifyOK = AES256_Verify(&CurRxBuf[6], 4, (u8*)AES256_KEY, &CurRxBuf[10], &CurRxBuf[26]); #endif if (Charger.m_bCsuSignInVerifyOK) { DEBUG_INFO("#CSU SignIn OK!\n\r"); tx[6] = 0x01; tx[7] = 0x01; } else { DEBUG_INFO("#CSU SignIn [NG]!\n\r"); tx[6] = 0x00; tx[7] = 0x00; } } else { DEBUG_INFO("#NO need to SignIn!\n\r"); tx[6] = 0x00; tx[7] = 0x00; } break; #endif //FUNC_CSU_SIGN_IN_VERIFY #ifdef FUNC_AW48_NET_LED case PROTOCOL_MESSAGE_CONFIG_LED_ACTION_CONNECTIVITY_STATUS: if (HTK_IS_BETWEEN_MINMAX(CurRxBuf[6], NET_LED_ACTION_MIN, NET_LED_ACTION_MAX) && (CurRxBuf[6] != Charger.am3352.NetLedActionState)) { Charger.am3352.NetLedActionState = CurRxBuf[6]; #ifdef FUNC_SHOW_CSU_CONFIG_LED_ACTION_INFO XP("#CSU_SetNetLed(%d)\r\n", Charger.am3352.NetLedActionState); #endif setNetLedMotion(Charger.am3352.NetLedActionState); } tx_len = 8; tx[0] = 0xaa; tx[1] = PROTOCOL_ADDR; tx[2] = CurRxBuf[1]; tx[3] = PROTOCOL_MESSAGE_CONFIG_LED_ACTION_CONNECTIVITY_STATUS; tx[4] = 0x01; tx[5] = 0x00; tx[6] = 0x01; tx[7] = 0x01; break; #endif //FUNC_AW48_NET_LED #ifdef FUNC_CSU_PUBLIC_KEY_OPERATION case PROTOCOL_MESSAGE_CONFIG_EVSE_PUBLIC_KEY: { enum { DATA_LEN = 64, SALT_LEN = 64, MIXTURE_LEN = DATA_LEN + SALT_LEN, SALTMAP_LEN = GET_BOX_NUM(MIXTURE_LEN, 8), ALL_LEN = MIXTURE_LEN + SALTMAP_LEN, }; tx_len = 8; tx[0] = 0xaa; tx[1] = PROTOCOL_ADDR; tx[2] = CurRxBuf[1]; tx[3] = PROTOCOL_MESSAGE_CONFIG_EVSE_PUBLIC_KEY; tx[4] = 0x01; tx[5] = 0x00; //XP("\r\n[PROTOCOL_MESSAGE_CONFIG_EVSE_PUBLIC_KEY]\r\n\r\n"); #ifdef FUNC_ENABLE_CSU_SIGN_IN_WHEN_MCU_HAVE_NG_MODELNAME if (!Charger.m_bCsuSignInMustVerify) { Charger.m_bCsuSignInMustVerify = HTK_TRUE; } #endif if (Charger.m_bCsuSignInMustVerify) { enum { KEY_LEN = sizeof(Charger.memory.EVSE_Config.data.item.m_CsuPublicKey), }; u8* pKey = Charger.memory.EVSE_Config.data.item.m_CsuPublicKey; u8 Temp[KEY_LEN] = { 0 }; memcpy(Temp, pKey, KEY_LEN); if (DataEncryption(pKey, DATA_LEN, &CurRxBuf[6], ALL_LEN, 1) == PASS) { #ifdef FUNC_SECURITY_DEBUG_INFO HTK_ByteArray2HexStr_XP("#CSU_SetPublicKey", pKey, 0, DATA_LEN); #endif if (memcmp(Temp, pKey, KEY_LEN) != 0) { Charger.memory.EVSE_Config.op_bits.update = ON; XP("#CSU_SetPublicKey OK => MEM_ADDR_EVSE_CONFIG\r\n"); //Need to RE-SignIn Charger.m_bCsuSignInVerifyOK = HTK_FALSE; Charger.m_bCsuUpgradeFwVerifyOK = HTK_FALSE; } tx[6] = 0x01; tx[7] = 0x01; } else { XP("#CSU_SetPublicKey: [NG]\r\n"); tx[6] = 0x00; tx[7] = 0x00; } } else { XP("#CSU_SetPublicKey: [NG]\r\n"); tx[6] = 0x00; tx[7] = 0x00; } } break; #endif //FUNC_CSU_PUBLIC_KEY_OPERATION #ifdef FUNC_RESET_CONNECTOR_PLUGIN_TIMES case PROTOCOL_MESSAGE_CONFIG_RESET_CONNECTOR_PLUGIN_TIMES: tx_len = 8; tx[0] = 0xaa; tx[1] = PROTOCOL_ADDR; tx[2] = CurRxBuf[1]; tx[3] = PROTOCOL_MESSAGE_CONFIG_RESET_CONNECTOR_PLUGIN_TIMES; tx[4] = 0x01; tx[5] = 0x00; tx[6] = 0x01; tx[7] = 0x01; if(CurRxBuf[6] == 0x01) { DEBUG_INFO("CSU reset connector plugin times.\r\n"); Charger.memory.EVSE_Config.data.item.AcPlugInTimes = 0; Charger.memory.EVSE_Config.op_bits.update = ON; } else { tx[6] = 0x00; tx[7] = 0x00; } break; #endif //FUNC_RESET_CONNECTOR_PLUGIN_TIMES /* Firmware update message */ case PROTOCOL_MESSAGE_UPGRADE_START: tx_len = 8; tx[0] = 0xaa; tx[1] = PROTOCOL_ADDR; tx[2] = CurRxBuf[1]; tx[3] = PROTOCOL_MESSAGE_UPGRADE_START; tx[4] = 0x01; tx[5] = 0x00; binCRCTarget = (CurRxBuf[6] << 24) | (CurRxBuf[6] << 16) | (CurRxBuf[6] << 8) | (CurRxBuf[6] << 0); flashdestination = NEW_CODE_ADDRESS; #ifdef FUNC_CSU_UPGRADE_FW_VERIFY XP("\r\n[PROTOCOL_MESSAGE_UPGRADE_START]\r\n\r\n"); #ifdef FUNC_VERIFY_TASK if (Charger.m_bCsuUpgradeFwMustVerify) { if (Charger.m_bCsuUpgradeFwMustVerify && !Charger.m_bCsuUpgradeFwVerifyOK && !Charger.m_bRunCsuUpgradeFwVerify) { Charger.m_VerifyTaskRxBufDataLen = *pCurRxBuf_RxLen; memset(Charger.m_VerifyTaskRxBuf, 0, VERIFY_TASK_RXBUF_LEN); memcpy(Charger.m_VerifyTaskRxBuf, CurRxBuf, HTK_GET_VAL_MIN(Charger.m_VerifyTaskRxBufDataLen, VERIFY_TASK_RXBUF_LEN)); Charger.m_bRunCsuUpgradeFwVerify = HTK_TRUE; #ifdef FUNC_SECURITY_DEBUG_INFO HTK_ByteArray2HexStr_XP("PROTOCOL_MESSAGE_UPGRADE_START", Charger.m_VerifyTaskRxBuf, 0, Charger.m_VerifyTaskRxBufDataLen); #endif } } #else //FUNC_VERIFY_TASK // taskENTER_CRITICAL(); // bFwCheckOkUseAES256 = AES256_Verify(&CurRxBuf[6], 4, (u8*)AES256_KEY, &CurRxBuf[10], &CurRxBuf[26]); // taskEXIT_CRITICAL(); #endif //FUNC_VERIFY_TASK #endif //FUNC_CSU_UPGRADE_FW_VERIFY if(FLASH_If_Erase(NEW_CODE_ADDRESS, 3)== FLASHIF_OK) { #if defined(DEBUG) || defined(RTOS_STAT) DEBUG_INFO("Firmware transfer start, earase flash success....\n\r"); #endif tx[6] = 0x01; tx[7] = 0x01; if (Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_NO_CSU) { setChargerMode(MODE_MAINTAIN); timerEnable(TIMER_IDX_UPDATE, 10000); } } else { #if defined(DEBUG) || defined(RTOS_STAT) DEBUG_INFO("Firmware transfer start, earase flash fail....\n\r"); #endif tx[6] = 0x00; tx[7] = 0x00; } break; case PROTOCOL_MESSAGE_UPGRADE_TRANS: tx_len = 8; tx[0] = 0xaa; tx[1] = PROTOCOL_ADDR; tx[2] = CurRxBuf[1]; tx[3] = PROTOCOL_MESSAGE_UPGRADE_TRANS; tx[4] = 0x01; tx[5] = 0x00; flashdestination = NEW_CODE_ADDRESS + ((CurRxBuf[6]<<0) | (CurRxBuf[7]<<8) | (CurRxBuf[8]<<16) |(CurRxBuf[9]<<24)); if (FLASH_If_Write(flashdestination, (uint32_t*) &CurRxBuf[10], ((((CurRxBuf[4]) | (CurRxBuf[5])<<8)-4)>>2)) == FLASHIF_OK) { #if defined(DEBUG) || defined(RTOS_STAT) //DEBUG_INFO("Firmware transfer start address: 0x%x, length: %d...Pass\n\r", flashdestination, (((CurRxBuf[4]) | (CurRxBuf[5])<<8)-4)); #endif tx[6] = 0x01; tx[7] = 0x01; if (Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_NO_CSU) { setLedMotion(LED_ACTION_MAINTAIN); timerRefresh(TIMER_IDX_UPDATE); } } else { #if defined(DEBUG) || defined(RTOS_STAT) DEBUG_INFO("Firmware transfer start address: 0x%x, length: %d...Fail\n\r", flashdestination, (((CurRxBuf[4]) | (CurRxBuf[5])<<8)-4)); #endif tx[6] = 0x00; tx[7] = 0x00; } break; case PROTOCOL_MESSAGE_UPGRADE_STOP: tx_len = 8; tx[0] = 0xaa; tx[1] = PROTOCOL_ADDR; tx[2] = CurRxBuf[1]; tx[3] = PROTOCOL_MESSAGE_UPGRADE_STOP; tx[4] = 0x01; tx[5] = 0x00; #ifdef FUNC_USE_STM32_SBSFU // { // //HAL_StatusTypeDef ret = HAL_ERROR; // //uint8_t fw_header_dwl_slot[SE_FW_HEADER_TOT_LEN]; // SFU_FwImageFlashTypeDef dw1; // // /* Get Info about the download area */ // SFU_APP_GetDownloadAreaInfo(SLOT_DWL_1, &dw1); // XP("MaxSizeInBytes = %d (0x%08X)\r\n", dw1.MaxSizeInBytes, dw1.MaxSizeInBytes); // XP("DownloadAddr = %d (0x%08X)\r\n", dw1.DownloadAddr, dw1.DownloadAddr); // XP("ImageOffsetInBytes = %d (0x%08X)\r\n", dw1.ImageOffsetInBytes, dw1.ImageOffsetInBytes); // XP("ExecutionAddr = %d (0x%08X)\r\n", dw1.ExecutionAddr, dw1.ExecutionAddr); // // } if ((Charger.m_bCsuUpgradeFwMustVerify && Charger.m_bCsuUpgradeFwVerifyOK) || (!Charger.m_bCsuUpgradeFwMustVerify)) { DEBUG_INFO("Firmware transfer end %s\r\n", Charger.m_bCsuUpgradeFwMustVerify ? (Charger.m_bCsuUpgradeFwVerifyOK ? "(VERIFY: OK)" : "(VERIFY: [NG])" ) : ""); tx[6] = 0x01; tx[7] = 0x01; if(isUSB_CDC_IAP) { CDC_Transmit_FS((uint8_t *)tx, tx_len); } else { #ifdef MODIFY_DC_RS485_UPGRADE_ISSUE Prefix_UartTX(tx, CurRxBuf); HAL_UART_Transmit(pUartHandle, (uint8_t *)tx, tx_len , 0x0ffff); Postfix_UartTX(tx, CurRxBuf); #else HAL_UART_Transmit(&IAP_USART, (uint8_t *)tx, tx_len , 0x0ffff); #endif } osDelay(1000); NVIC_SystemReset(); } else { DEBUG_INFO("Firmware verify fail...\n\r"); tx[6] = 0x00; tx[7] = 0x00; } #else //FUNC_USE_STM32_SBSFU flash = NEW_CODE_ADDRESS; checksum = HAL_CRC_Calculate(&hcrc, (uint32_t *)flash, ((FLASH_AP_LENGTH-4)>>2)); flash = ((uint32_t)(NEW_CODE_ADDRESS+FLASH_AP_LENGTH-4)); #ifdef FUNC_CSU_UPGRADE_FW_VERIFY #if defined(DEBUG) || defined(RTOS_STAT) if (Charger.m_bCsuUpgradeFwMustVerify) DEBUG_INFO("Firmware transfer end, AP CRC checksum, flash: 0x%x, 0x%x (VERIFY: %s)\r\n", checksum, *((uint32_t *)flash), (Charger.m_bCsuUpgradeFwVerifyOK ? "OK" : "[NG]" )); else DEBUG_INFO("Firmware transfer end, AP CRC checksum, flash: 0x%x, 0x%x\r\n", checksum, *((uint32_t *)flash) ); #endif if(checksum == *((uint32_t *)flash) && ((Charger.m_bCsuUpgradeFwMustVerify && Charger.m_bCsuUpgradeFwVerifyOK) || (!Charger.m_bCsuUpgradeFwMustVerify))) #else #if defined(DEBUG) || defined(RTOS_STAT) DEBUG_INFO("Firmware transfer end, AP CRC checksum, flash: 0x%x, 0x%x\r\n", checksum, *((uint32_t *)flash) ); #endif if(checksum == *((uint32_t *)flash)) #endif //FUNC_CSU_UPGRADE_FW_VERIFY { if (FLASH_If_Write(UPGRADE_REQ_ADDRESS, (uint32_t *)&endFlag[0], 1) == FLASHIF_OK) { #if defined(DEBUG) || defined(RTOS_STAT) DEBUG_INFO("Firmware Confirm Tag write ok..\n\r"); #endif tx[6] = 0x01; tx[7] = 0x01; if(isUSB_CDC_IAP) { CDC_Transmit_FS((uint8_t *)tx, tx_len); } else { #ifdef MODIFY_DC_RS485_UPGRADE_ISSUE Prefix_UartTX(tx, CurRxBuf); HAL_UART_Transmit(pUartHandle, (uint8_t *)tx, tx_len , 0x0ffff); Postfix_UartTX(tx, CurRxBuf); #else HAL_UART_Transmit(&IAP_USART, (uint8_t *)tx, tx_len , 0x0ffff); #endif } osDelay(1000); NVIC_SystemReset(); } else { #if defined(DEBUG) || defined(RTOS_STAT) DEBUG_INFO("Firmware Confirm Tag write fail...\n\r"); #endif tx[6] = 0x00; tx[7] = 0x00; } } else { #if defined(DEBUG) || defined(RTOS_STAT) DEBUG_INFO("Firmware checksum compare fail...\n\r"); #endif tx[6] = 0x00; tx[7] = 0x00; } #endif //FUNC_USE_STM32_SBSFU if (Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_NO_CSU) { timerDisable(TIMER_IDX_UPDATE); } break; case PROTOCOL_MESSAGE_UPGRADE_ABOARD: #if defined(DEBUG) || defined(RTOS_STAT) DEBUG_INFO("Firmware update transfer aboard...\n\r"); #endif tx_len = 8; tx[0] = 0xaa; tx[1] = PROTOCOL_ADDR; tx[2] = CurRxBuf[1]; tx[3] = PROTOCOL_MESSAGE_UPGRADE_ABOARD; tx[4] = 0x01; tx[5] = 0x00; tx[6] = 0x01; tx[7] = 0x01; break; default: /* Todo: bin file receive aboard */ #if defined(DEBUG) || defined(RTOS_STAT) #ifdef FUNC_RS485_SLAVE DEBUG_INFO("Protocol message unknow (0x%02X)\n\r", CurRxBuf[3]); #else DEBUG_INFO("Protocol message unknow...\n\r"); #endif #endif tx_len = 8; tx[0] = 0xaa; tx[1] = PROTOCOL_ADDR; tx[2] = CurRxBuf[1]; tx[3] = CurRxBuf[3]; tx[4] = 0x01; tx[5] = 0x00; tx[6] = 0x00; tx[7] = 0x00; break; } } else { #ifndef FUNC_RS485_SLAVE #if defined(DEBUG) || defined(RTOS_STAT) DEBUG_INFO("Protocol check sum is wrong...\n\r"); #endif tx_len = 8; tx[0] = 0xaa; tx[1] = PROTOCOL_ADDR; tx[2] = CurRxBuf[1]; tx[3] = CurRxBuf[3]; tx[4] = 0x01; tx[5] = 0x00; tx[6] = 0x00; tx[7] = 0x00; #endif //FUNC_RS485_SLAVE } if(isUSB_CDC_IAP) { CDC_Transmit_FS((uint8_t *)tx, tx_len); } else { #ifdef FUNC_RS485_SLAVE #ifdef MODIFY_DC_RS485_UPGRADE_ISSUE #ifdef FUNC_CSU_SIGN_IN_VERIFY if (CurRxBuf != NULL) { if (CurRxBuf == UART_IAP_rx_buffer && (Charger.m_bCsuSignInMustVerify && !Charger.m_bCsuSignInVerifyOK)) { //XP("X\r\n"); //do not response #ifdef FUNC_CSU_PUBLIC_KEY_OPERATION if ( CurRxBuf[3] == PROTOCOL_MESSAGE_CONFIG_CSU_SIGN_IN_VERIFY || CurRxBuf[3] == PROTOCOL_MESSAGE_QUERY_EVSE_PUBLIC_KEY || CurRxBuf[3] == PROTOCOL_MESSAGE_CONFIG_EVSE_PUBLIC_KEY ) { Prefix_UartTX(tx, CurRxBuf); HAL_UART_Transmit(pUartHandle, (uint8_t *)tx, tx_len , 0x0ffff); Postfix_UartTX(tx, CurRxBuf); } #endif } else { Prefix_UartTX(tx, CurRxBuf); HAL_UART_Transmit(pUartHandle, (uint8_t *)tx, tx_len , 0x0ffff); Postfix_UartTX(tx, CurRxBuf); } } #else //FUNC_CSU_SIGN_IN_VERIFY if (CurRxBuf != NULL) { Prefix_UartTX(tx, CurRxBuf); HAL_UART_Transmit(pUartHandle, (uint8_t *)tx, tx_len , 0x0ffff); Postfix_UartTX(tx, CurRxBuf); } #endif //FUNC_CSU_SIGN_IN_VERIFY #else //MODIFY_DC_RS485_UPGRADE_ISSUE if (CurRxBuf != NULL) { tx[1] = Charger.m_RS485SlaveAddr; //Update Slave Address HAL_UART_Transmit(pUartHandle, (uint8_t *)tx, tx_len, 0xffff); } #endif //MODIFY_DC_RS485_UPGRADE_ISSUE #else //FUNC_RS485_SLAVE HAL_UART_Transmit(&IAP_USART, (uint8_t *)tx, tx_len, 0xffff); #endif //FUNC_RS485_SLAVE } #ifdef ENABLE_PRINT_IMCP_MSG #ifdef FUNC_RS485_SLAVE #ifdef PRINT_IMCP_MSG_ONLY_ON_UPDATEPORT if (CurRxBuf == UART_IAP_rx_buffer && CheckPrintImcpMsg(CurRxBuf[3])) { HTK_ByteArray2HexStr_XP(NULL, tx, 0, tx_len); } #else if (CheckPrintImcpMsg(CurRxBuf[3])) { HTK_ByteArray2HexStr_XP(NULL, tx, 0, tx_len); } #endif //PRINT_IMCP_MSG_ONLY_ON_UPDATEPORT #else //FUNC_RS485_SLAVE if (CheckPrintImcpMsg(UART_IAP_rx_buffer[3])) { HTK_ByteArray2HexStr_XP(NULL, tx, 0, tx_len); } #endif //FUNC_RS485_SLAVE #endif //ENABLE_PRINT_IMCP_MSG #ifdef FUNC_RS485_SLAVE // Clear rx_buffer and related varaible for(uint16_t i = 0; i < *pCurRxBuf_RxLen ; i++) CurRxBuf[i]=0; *pCurRxBuf_RxLen = 0; *pCurRecvEndFlag = 0; isUSB_CDC_IAP = OFF; #else // Clear rx_buffer and related varaible for(uint16_t i = 0; i < UART_IAP_rx_len ; i++) UART_IAP_rx_buffer[i]=0; UART_IAP_rx_len=0; UART_IAP_recv_end_flag=0; isUSB_CDC_IAP = OFF; #endif //FUNC_RS485_SLAVE } if(timer[TIMER_IDX_UPDATE].isAlarm == ON && Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_NO_CSU) { setChargerMode(MODE_IDLE); setLedMotion(LED_ACTION_IDLE); timerDisable(TIMER_IDX_UPDATE); } #ifdef FUNC_RS485_SLAVE HAL_UART_Receive_DMA(&IAP_USART,(uint8_t*)UART_IAP_rx_buffer, UART_BUFFER_SIZE); HAL_UART_Receive_DMA(&RS485_USART,(uint8_t*)UART_RS485_rx_buffer, UART_BUFFER_SIZE); #else HAL_UART_Receive_DMA(&IAP_USART,(uint8_t*)UART_IAP_rx_buffer, UART_BUFFER_SIZE); #endif //FUNC_RS485_SLAVE #ifdef FUNC_DEBUG_CONSOLE HAL_UART_Receive_DMA(&DEBUG_USART,(uint8_t*)UART_DEBUG_rx_buffer, UART_DEBUG_BUFFER_SIZE); #endif osDelay(1); } /* USER CODE END StartUartTask */ } #ifdef FUNC_DETECT_PP /*-------------------------------------------------------------------------------------------- Vehicle Rc Range of resistance ADC read ADC connectors (ohm) Rc for interpretation [h](V) (count) current by the EV supply (A) equipment (ohm) ---------------------------------------------------------------------------------------------- N/A Error condition >4500 >2.6 >3227 or disconnection of plug ---------------------------------------------------------------------------------------------- 13 1500 1100-2460 2.32~2.52 2879~3127 20 680 400-936 1.86~2.26 2308~2805 32 220 80-308 0.83~1.70 1031~2110 --------------------------------------------------------------------------------------------*/ void UpdatePPInfo_AdcVal(PPPInfo p, uint32_t v) //ADC value (count) { if (v > 3227) { p->m_CurCurr = 13; p->m_StatusID = 0x01; } //use MIN Current else if (v >= 2879 && v <= 3127) { p->m_CurCurr = 13; p->m_StatusID = 0x01; } //MIN Current else if (v >= 2308 && v <= 2805) { p->m_CurCurr = 20; p->m_StatusID = 0x02; } else if (v >= 1031 && v <= 2110) { p->m_CurCurr = 32; p->m_StatusID = 0x03; } else { p->m_CurCurr = 13; p->m_StatusID = 0x01; } //use MIN Current } #ifdef VO_SIMU_PP void UpdatePPInfo_CurrVal(PPPInfo p, uint16_t v) //Current value (A) { if (v == 13) { p->m_CurCurr = 13; p->m_StatusID = 0x01; } else if (v == 20) { p->m_CurCurr = 20; p->m_StatusID = 0x02; } else if (v == 32) { p->m_CurCurr = 32; p->m_StatusID = 0x03; } else if (v == 63) { p->m_CurCurr = 63; p->m_StatusID = 0x04; } else { p->m_CurCurr = 13; p->m_StatusID = 0x01; } } #endif //VO_SIMU_PP #endif //FUNC_DETECT_PP /* USER CODE BEGIN Header_StartAdcTask */ /** * @brief Function implementing the adcTask thread. * @param argument: Not used * @retval None */ /* USER CODE END Header_StartAdcTask */ #ifdef FUNC_DEBUG_MSG_CP_STATE const char *CP_STATE_TAG[7] = {"0:UNKNOW", "1:A(12V)", "2:B(9V)", "3:C(6V)", "4:D(3V)", "5:E(0V)", "6:F(-12V)"}; #endif void StartAdcTask(void const * argument) { /* USER CODE BEGIN StartAdcTask */ #ifdef FUNC_IDLE_UNTIL_READ_ALL_MEM IdleUntilReadAllMemory(); #endif //aadc uint8_t previous_cp_state = SYSTEM_STATE_A; #ifndef FUNC_POWER_CONSUMPTION_BY_METER_IC uint8_t updateMemReq = 0; struct TimeTick { uint32_t timeTick_Start; uint32_t timeTick_End; uint32_t timeTick_Delta; }timeTick; timeTick.timeTick_Start = HAL_GetTick(); #endif #ifdef FUNC_CP_ADC_MODIFY #ifdef NEW_CP_SPEC while (!Charger.m_bCpDetectModuleInitOK) { osDelay(10); } #else //NEW_CP_SPEC CpDetectModuleInitialize(); #endif //NEW_CP_SPEC #else //FUNC_CP_ADC_MODIFY CpDetectModuleInitialize( &CpBoundary, &SpecDefBoundary, &CpHysteresis); #endif //FUNC_CP_ADC_MODIFY #ifndef FUNC_POWER_CONSUMPTION_BY_METER_IC timerEnable(TIMER_IDX_POWER, 1000); #endif #ifdef FUNC_GUN_LOCK GL_Init(); //All Model #endif /* Infinite loop */ for(;;) { Relay_Control_Function() ; #ifdef FUNC_OUTP_TYPE_E if (Charger.m_bEnableTypeE) { SE_Relay_Control_Function(); } #endif // ADC chanel 1 if(isDMAEnd_ADC1) { #ifdef FUNC_TASK_MONITOR Charger.m_TaskMonitor.m_ADC.m_ADC1_Counter[0]++; #endif isDMAEnd_ADC1 = OFF; #ifdef VO_SIMU_CP CpCalculate(ADC1_Buffer, ADC1_CHANEL_COUNT*ADC1_SAMPLE_COUNT, &CpDetectionResult, Charger.m_VOCode.m_EnableSimuCP, &Charger.m_SimuData.m_CP); #else CpCalculate(ADC1_Buffer, ADC1_CHANEL_COUNT*ADC1_SAMPLE_COUNT, &CpDetectionResult); #endif Charger.CP_State = CpDetectionResult.State; // if (Charger.Mode!= MODE_DEBUG) { #ifdef MODIFY_ADCTASK_CP_STATE_CHANGE if((previous_cp_state != Charger.CP_State)) #else if((previous_cp_state != Charger.CP_State) && (Charger.CP_State !=SYSTEM_STATE_UNKNOWN )) #endif { #ifdef FUNC_DEBUG_MSG_CP_STATE XP("#CP: [%s] >>> [%s] (+%.3f, -%.3f)\r\n", CP_STATE_TAG[previous_cp_state], CP_STATE_TAG[Charger.CP_State], (CpDetectionResult.PositiveValue == 0 ? 0 : HTK_GetPosFromZero(CP_GET_OPA_VIN_USE_ADC(CpDetectionResult.PositiveValue))), (CpDetectionResult.NegativeValue == 0 ? 0 : HTK_GetNegFromZero(CP_GET_OPA_VIN_USE_ADC(CpDetectionResult.NegativeValue))) ); #endif previous_cp_state = Charger.CP_State; if(Charger.CP_State == SYSTEM_STATE_A) { user_pwm_setvalue(PWM_CH_CP, PWM_DUTY_FULL); // CP PWM duty set 100% Charger.Relay_Action=GPIO_RELAY_ACTION_OFF; #ifdef REDUCE_RELAY_CUT_OFF_TIME_WHEN_CP_C_TO_A Relay_Control_Function(); #endif if (Charger.Mode!= MODE_DEBUG) { Charger.memory.EVSE_Config.data.item.AcPlugInTimes++; Charger.memory.EVSE_Config.op_bits.update = ON; DEBUG_INFO("EVSE connector plug counts: %d\r\n", Charger.memory.EVSE_Config.data.item.AcPlugInTimes); } } } } if(HAL_ADC_Start_DMA(&hadc1, (uint32_t*)&ADC1_Buffer, ADC1_CHANEL_COUNT*ADC1_SAMPLE_COUNT)!=HAL_OK)Error_Handler(); } // ADC chanel 2 if(isDMAEnd_ADC2) { #ifdef FUNC_TASK_MONITOR Charger.m_TaskMonitor.m_ADC.m_ADC2_Counter[0]++; #endif isDMAEnd_ADC2 = OFF; for(uint16_t idx=0;idx MeterIC | [AX80_NACS => T1] ADC3_Buffer_Each[1][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 1]; //ADC3_IN14_1998 (PF4) ADC3_Buffer_Each[2][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 2]; //ADC3_IN15_Temp (PF5) ADC3_Buffer_Each[3][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 3]; //ADC3_IN4_GMI_VL1 (PF6) ADC3_Buffer_Each[4][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 4]; //ADC3_IN7_Current_L1 (PF9) => MeterIC | [AX80_NACS => T4] ADC3_Buffer_Each[5][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 5]; //ADC3_IN5_Current_L2 (PF7) => MeterIC | [AX80_NACS => T5] ADC3_Buffer_Each[6][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 6]; //ADC3_IN6_PP_GUN_DET (PF8) ADC3_Buffer_Each[7][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 7]; //ADC3_IN8_Voltage_L2 (PF10) => MeterIC | [AX80_NACS => T2] ADC3_Buffer_Each[8][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 8]; //ADC3_IN10_Voltage_L3 (PC0) => MeterIC | [AX80_NACS => T3] ADC3_Buffer_Each[9][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 9]; //ADC3_IN11_Current_L3 (PC1) => MeterIC | [AX80_NACS => T6] } else { ADC3_Buffer_Each[0][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 0]; //ADC3_IN9_Voltage_L1 (PF3) => MeterIC | [AX80 => RELAY1_Temp] ADC3_Buffer_Each[1][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 1]; //ADC3_IN14_1998 (PF4) ADC3_Buffer_Each[2][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 2]; //ADC3_IN15_Temp (PF5) ADC3_Buffer_Each[3][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 3]; //ADC3_IN4_GMI_VL1 (PF6) ADC3_Buffer_Each[4][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 4]; //ADC3_IN7_Current_L1 (PF9) => MeterIC | [AX80 => Input_N_L2_Temp] //ADC3_Buffer_Each[5][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 5]; //ADC3_IN5_Current_L2 (PF7) => MeterIC ADC3_Buffer_Each[6][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 6]; //ADC3_IN6_PP_GUN_DET (PF8) ADC3_Buffer_Each[7][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 7]; //ADC3_IN8_Voltage_L2 (PF10) => MeterIC | [AX80 => RELAY2_Temp] ADC3_Buffer_Each[8][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 8]; //ADC3_IN10_Voltage_L3 (PC0) => MeterIC | [AX80 => Input_L1_Temp] //ADC3_Buffer_Each[9][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 9]; //ADC3_IN11_Current_L3 (PC1) => MeterIC } #else //FUNC_AX80_NACS_ADD_6_TEMP_SENEOR ADC3_Buffer_Each[0][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 0]; //ADC3_IN9_Voltage_L1 (PF3) => MeterIC | [AX80 => RELAY1_Temp] ADC3_Buffer_Each[1][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 1]; //ADC3_IN14_1998 (PF4) ADC3_Buffer_Each[2][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 2]; //ADC3_IN15_Temp (PF5) ADC3_Buffer_Each[3][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 3]; //ADC3_IN4_GMI_VL1 (PF6) ADC3_Buffer_Each[4][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 4]; //ADC3_IN7_Current_L1 (PF9) => MeterIC | [AX80 => Input_N_L2_Temp] //ADC3_Buffer_Each[5][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 5]; //ADC3_IN5_Current_L2 (PF7) => MeterIC ADC3_Buffer_Each[6][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 6]; //ADC3_IN6_PP_GUN_DET (PF8) ADC3_Buffer_Each[7][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 7]; //ADC3_IN8_Voltage_L2 (PF10) => MeterIC | [AX80 => RELAY2_Temp] ADC3_Buffer_Each[8][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 8]; //ADC3_IN10_Voltage_L3 (PC0) => MeterIC | [AX80 => Input_L1_Temp] //ADC3_Buffer_Each[9][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 9]; //ADC3_IN11_Current_L3 (PC1) => MeterIC #endif //FUNC_AX80_NACS_ADD_6_TEMP_SENEOR } #ifdef FUNC_AW48_ADD_6_TEMP_SENEOR else if (Charger.m_bModelNameAW48_1P) { ADC3_Buffer_Each[0][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 0]; //ADC3_IN9_Voltage_L1 (PF3) => MeterIC | [AW48 => T1] ADC3_Buffer_Each[1][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 1]; //ADC3_IN14_1998 (PF4) ADC3_Buffer_Each[2][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 2]; //ADC3_IN15_Temp (PF5) ADC3_Buffer_Each[3][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 3]; //ADC3_IN4_GMI_VL1 (PF6) ADC3_Buffer_Each[4][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 4]; //ADC3_IN7_Current_L1 (PF9) => MeterIC | [AW48 => T4] ADC3_Buffer_Each[5][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 5]; //ADC3_IN5_Current_L2 (PF7) => MeterIC | [AW48 => T5] ADC3_Buffer_Each[6][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 6]; //ADC3_IN6_PP_GUN_DET (PF8) ADC3_Buffer_Each[7][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 7]; //ADC3_IN8_Voltage_L2 (PF10) => MeterIC | [AW48 => T2] ADC3_Buffer_Each[8][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 8]; //ADC3_IN10_Voltage_L3 (PC0) => MeterIC | [AW48 => T3] ADC3_Buffer_Each[9][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 9]; //ADC3_IN11_Current_L3 (PC1) => MeterIC | [AW48 => T6] } #endif //FUNC_AW48_ADD_6_TEMP_SENEOR #ifdef FUNC_AX48_NACS_ADD_6_TEMP_SENEOR else if (Charger.m_bModelNameAX48_NACS_1P) { ADC3_Buffer_Each[0][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 0]; //ADC3_IN9_Voltage_L1 (PF3) => MeterIC | [AX48_NACS => T1] ADC3_Buffer_Each[1][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 1]; //ADC3_IN14_1998 (PF4) ADC3_Buffer_Each[2][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 2]; //ADC3_IN15_Temp (PF5) ADC3_Buffer_Each[3][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 3]; //ADC3_IN4_GMI_VL1 (PF6) ADC3_Buffer_Each[4][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 4]; //ADC3_IN7_Current_L1 (PF9) => MeterIC | [AX48_NACS => T4] ADC3_Buffer_Each[5][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 5]; //ADC3_IN5_Current_L2 (PF7) => MeterIC | [AX48_NACS => T5] ADC3_Buffer_Each[6][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 6]; //ADC3_IN6_PP_GUN_DET (PF8) ADC3_Buffer_Each[7][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 7]; //ADC3_IN8_Voltage_L2 (PF10) => MeterIC | [AX48_NACS => T2] ADC3_Buffer_Each[8][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 8]; //ADC3_IN10_Voltage_L3 (PC0) => MeterIC | [AX48_NACS => T3] ADC3_Buffer_Each[9][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 9]; //ADC3_IN11_Current_L3 (PC1) => MeterIC | [AX48_NACS => T6] } #endif //FUNC_AX48_NACS_ADD_6_TEMP_SENEOR else //AX48 / AX32 { //ADC3_Buffer_Each[0][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 0]; //ADC3_IN9_Voltage_L1 (PF3) => MeterIC ADC3_Buffer_Each[1][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 1]; //ADC3_IN14_1998 (PF4) ADC3_Buffer_Each[2][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 2]; //ADC3_IN15_Temp (PF5) ADC3_Buffer_Each[3][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 3]; //ADC3_IN4_GMI_VL1 (PF6) //ADC3_Buffer_Each[4][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 4]; //ADC3_IN7_Current_L1 (PF9) => MeterIC //ADC3_Buffer_Each[5][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 5]; //ADC3_IN5_Current_L2 (PF7) => MeterIC ADC3_Buffer_Each[6][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 6]; //ADC3_IN6_PP_GUN_DET (PF8) //ADC3_Buffer_Each[7][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 7]; //ADC3_IN8_Voltage_L2 (PF10) => MeterIC //ADC3_Buffer_Each[8][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 8]; //ADC3_IN10_Voltage_L3 (PC0) => MeterIC //ADC3_Buffer_Each[9][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 9]; //ADC3_IN11_Current_L3 (PC1) => MeterIC } #else //FUNC_AX80_ADD_4_TEMP_SENEOR //ADC3_Buffer_Each[0][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 0]; //ADC3_IN9_Voltage_L1 (PF3) => MeterIC ADC3_Buffer_Each[1][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 1]; //ADC3_IN14_1998 (PF4) ADC3_Buffer_Each[2][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 2]; //ADC3_IN15_Temp (PF5) ADC3_Buffer_Each[3][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 3]; //ADC3_IN4_GMI_VL1 (PF6) //ADC3_Buffer_Each[4][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 4]; //ADC3_IN7_Current_L1 (PF9) => MeterIC //ADC3_Buffer_Each[5][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 5]; //ADC3_IN5_Current_L2 (PF7) => MeterIC ADC3_Buffer_Each[6][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 6]; //ADC3_IN6_PP_GUN_DET (PF8) //ADC3_Buffer_Each[7][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 7]; //ADC3_IN8_Voltage_L2 (PF10) => MeterIC //ADC3_Buffer_Each[8][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 8]; //ADC3_IN10_Voltage_L3 (PC0) => MeterIC //ADC3_Buffer_Each[9][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 9]; //ADC3_IN11_Current_L3 (PC1) => MeterIC #endif //FUNC_AX80_ADD_4_TEMP_SENEOR #else //FUNC_REPLACE_ADC_WITH_METER_IC ADC3_Buffer_Each[0][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 0]; //ADC3_IN9_Voltage_L1 (PF3) ADC3_Buffer_Each[1][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 1]; //ADC3_IN14_1998 (PF4) ADC3_Buffer_Each[2][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 2]; //ADC3_IN15_Temp (PF5) ADC3_Buffer_Each[3][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 3]; //ADC3_IN4_GMI_VL1 (PF6) ADC3_Buffer_Each[4][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 4]; //ADC3_IN7_Current_L1 (PF9) ADC3_Buffer_Each[5][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 5]; //ADC3_IN5_Current_L2 (PF7) ADC3_Buffer_Each[6][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 6]; //ADC3_IN6_PP_GUN_DET (PF8) ADC3_Buffer_Each[7][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 7]; //ADC3_IN8_Voltage_L2 (PF10) ADC3_Buffer_Each[8][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 8]; //ADC3_IN10_Voltage_L3 (PC0) ADC3_Buffer_Each[9][idx] = ADC3_Buffer[(idx*ADC3_CHANEL_COUNT) + 9]; //ADC3_IN11_Current_L3 (PC1) #endif //FUNC_REPLACE_ADC_WITH_METER_IC } //VT #ifndef FUNC_REPLACE_ADC_WITH_METER_IC filter_move_avg(&adc_value.ADC3_IN9_Voltage_L1, vRms_cal2(ADC3_Buffer_Each[0], ADC3_SAMPLE_COUNT)); //L1 filter_move_avg(&adc_value.ADC3_IN8_Voltage_L2, vRms_cal2(ADC3_Buffer_Each[7], ADC3_SAMPLE_COUNT)); //L2 filter_move_avg(&adc_value.ADC3_IN10_Voltage_L3, vRms_cal2(ADC3_Buffer_Each[8], ADC3_SAMPLE_COUNT)); //L3 #endif //MCU VDD filter_move_avg(&adc_value.ADC3_IN14_UL_1998, avg_cal(ADC3_Buffer_Each[1], ADC3_SAMPLE_COUNT)); //TEMP filter_move_avg(&adc_value.ADC3_IN15_Temp, avg_cal(ADC3_Buffer_Each[2], ADC3_SAMPLE_COUNT)); #ifdef VO_SIMU_NTC if (Charger.m_VOCode.m_EnableSimuNTC) { Charger.temperature.SystemAmbientTemp = Charger.m_SimuData.m_NtcTemp; } else { Charger.temperature.SystemAmbientTemp = getTemperature(adc_value.ADC3_IN15_Temp.value); } #else Charger.temperature.SystemAmbientTemp = getTemperature(adc_value.ADC3_IN15_Temp.value); #endif #ifdef FUNC_AX80_ADD_4_TEMP_SENEOR if (Charger.m_bModelNameAX80_1P) { #ifdef FUNC_AX80_NACS_ADD_6_TEMP_SENEOR if (Charger.m_bModelNameAX80_NACS_1P) { filter_move_avg(&adc_value.ADC3_IN9_AX80_NACS_T1, avg_cal(ADC3_Buffer_Each[0], ADC3_SAMPLE_COUNT)); filter_move_avg(&adc_value.ADC3_IN8_AX80_NACS_T2, avg_cal(ADC3_Buffer_Each[7], ADC3_SAMPLE_COUNT)); filter_move_avg(&adc_value.ADC3_IN10_AX80_NACS_T3, avg_cal(ADC3_Buffer_Each[8], ADC3_SAMPLE_COUNT)); filter_move_avg(&adc_value.ADC3_IN7_AX80_NACS_T4, avg_cal(ADC3_Buffer_Each[4], ADC3_SAMPLE_COUNT)); filter_move_avg(&adc_value.ADC3_IN5_AX80_NACS_T5, avg_cal(ADC3_Buffer_Each[5], ADC3_SAMPLE_COUNT)); filter_move_avg(&adc_value.ADC3_IN11_AX80_NACS_T6, avg_cal(ADC3_Buffer_Each[9], ADC3_SAMPLE_COUNT)); #ifdef FUNC_AX80_NACS_NEW_TEMP_SENSOR_COMPENSATION_20231214 #ifdef FUNC_AX80_NACS_TEMP_SENSOR_WITHOUT_COMPENSATION_20240903 #ifdef FUNC_AX80_NACS_TEMP_SENSOR_COMPENSATION_WITH_CURRENT_20240906 double v = 0; double powCurr = ((double)Charger.Current[0]/100.0) * ((double)Charger.Current[0]/100.0); double pow80 = 80 * 80; Charger.temperature.SystemAmbientTemp += 0; v = powCurr * (10.29 / pow80); Charger.temperature.AX80_NACS_T1_L1_IN = getTemperature(adc_value.ADC3_IN9_AX80_NACS_T1.value) + HTK_ROUND_U16(v); v = powCurr * (11.40 / pow80); Charger.temperature.AX80_NACS_T2_L2_IN = getTemperature(adc_value.ADC3_IN8_AX80_NACS_T2.value) + HTK_ROUND_U16(v); v = powCurr * (10.12 / pow80); Charger.temperature.AX80_NACS_T3_L1_OUT = getTemperature(adc_value.ADC3_IN10_AX80_NACS_T3.value) + HTK_ROUND_U16(v); v = powCurr * (9.75 / pow80); Charger.temperature.AX80_NACS_T4_L2_OUT = getTemperature(adc_value.ADC3_IN7_AX80_NACS_T4.value) + HTK_ROUND_U16(v); Charger.temperature.AX80_NACS_T5_L1_GUN = getTemperature(adc_value.ADC3_IN5_AX80_NACS_T5.value) + 0; Charger.temperature.AX80_NACS_T6_L2_GUN = getTemperature(adc_value.ADC3_IN11_AX80_NACS_T6.value) + 0; #else //FUNC_AX80_NACS_TEMP_SENSOR_COMPENSATION_WITH_CURRENT_20240906 { Charger.temperature.SystemAmbientTemp += 0; Charger.temperature.AX80_NACS_T1_L1_IN = getTemperature(adc_value.ADC3_IN9_AX80_NACS_T1.value) + 0; Charger.temperature.AX80_NACS_T2_L2_IN = getTemperature(adc_value.ADC3_IN8_AX80_NACS_T2.value) + 0; Charger.temperature.AX80_NACS_T3_L1_OUT = getTemperature(adc_value.ADC3_IN10_AX80_NACS_T3.value) + 0; Charger.temperature.AX80_NACS_T4_L2_OUT = getTemperature(adc_value.ADC3_IN7_AX80_NACS_T4.value) + 0; Charger.temperature.AX80_NACS_T5_L1_GUN = getTemperature(adc_value.ADC3_IN5_AX80_NACS_T5.value) + 0; Charger.temperature.AX80_NACS_T6_L2_GUN = getTemperature(adc_value.ADC3_IN11_AX80_NACS_T6.value) + 0; } #endif //FUNC_AX80_NACS_TEMP_SENSOR_COMPENSATION_WITH_CURRENT_20240906 #else //FUNC_AX80_NACS_TEMP_SENSOR_WITHOUT_COMPENSATION_20240903 { double v = 0; v = 2.38333 + (-1.7); Charger.temperature.SystemAmbientTemp += HTK_ROUND_U16(v); v = 23.8667 + (-4.73333); Charger.temperature.AX80_NACS_T1_L1_IN = getTemperature(adc_value.ADC3_IN9_AX80_NACS_T1.value) + HTK_ROUND_U16(v); v = 25.45 + (-5.71667); Charger.temperature.AX80_NACS_T2_L2_IN = getTemperature(adc_value.ADC3_IN8_AX80_NACS_T2.value) + HTK_ROUND_U16(v); v = 28.2833 + (-3.43333); Charger.temperature.AX80_NACS_T3_L1_OUT = getTemperature(adc_value.ADC3_IN10_AX80_NACS_T3.value) + HTK_ROUND_U16(v); v = 29.5333 + (-3.56667); Charger.temperature.AX80_NACS_T4_L2_OUT = getTemperature(adc_value.ADC3_IN7_AX80_NACS_T4.value) + HTK_ROUND_U16(v); Charger.temperature.AX80_NACS_T5_L1_GUN = getTemperature(adc_value.ADC3_IN5_AX80_NACS_T5.value) + 0; Charger.temperature.AX80_NACS_T6_L2_GUN = getTemperature(adc_value.ADC3_IN11_AX80_NACS_T6.value) + 0; } #endif //FUNC_AX80_NACS_TEMP_SENSOR_WITHOUT_COMPENSATION_20240903 #else //FUNC_AX80_NACS_NEW_TEMP_SENSOR_COMPENSATION_20231214 #ifdef FUNC_AX80_NACS_NEW_TEMP_SENSOR_COMPENSATION Charger.temperature.SystemAmbientTemp += 3; Charger.temperature.AX80_NACS_T1_L1_IN = getTemperature(adc_value.ADC3_IN9_AX80_NACS_T1.value) + 24; Charger.temperature.AX80_NACS_T2_L2_IN = getTemperature(adc_value.ADC3_IN8_AX80_NACS_T2.value) + 26; Charger.temperature.AX80_NACS_T3_L1_OUT = getTemperature(adc_value.ADC3_IN10_AX80_NACS_T3.value) + 29; Charger.temperature.AX80_NACS_T4_L2_OUT = getTemperature(adc_value.ADC3_IN7_AX80_NACS_T4.value) + 30; Charger.temperature.AX80_NACS_T5_L1_GUN = getTemperature(adc_value.ADC3_IN5_AX80_NACS_T5.value) + 0; Charger.temperature.AX80_NACS_T6_L2_GUN = getTemperature(adc_value.ADC3_IN11_AX80_NACS_T6.value) + 0; #else Charger.temperature.AX80_NACS_T1_L1_IN = getTemperature(adc_value.ADC3_IN9_AX80_NACS_T1.value); Charger.temperature.AX80_NACS_T2_L2_IN = getTemperature(adc_value.ADC3_IN8_AX80_NACS_T2.value); Charger.temperature.AX80_NACS_T3_L1_OUT = getTemperature(adc_value.ADC3_IN10_AX80_NACS_T3.value); Charger.temperature.AX80_NACS_T4_L2_OUT = getTemperature(adc_value.ADC3_IN7_AX80_NACS_T4.value); Charger.temperature.AX80_NACS_T5_L1_GUN = getTemperature(adc_value.ADC3_IN5_AX80_NACS_T5.value); Charger.temperature.AX80_NACS_T6_L2_GUN = getTemperature(adc_value.ADC3_IN11_AX80_NACS_T6.value); #endif #endif //FUNC_AX80_NACS_NEW_TEMP_SENSOR_COMPENSATION_20231214 { #ifdef FUNC_TEMP_SENSOR_WITH_NEG_VALUE int16_t v = 0; #else uint8_t v = 0; #endif if (Charger.temperature.SystemAmbientTemp > v) v = Charger.temperature.SystemAmbientTemp; if (Charger.temperature.CcsConnectorTemp > v) v = Charger.temperature.CcsConnectorTemp; Charger.temperature.Group1_MaxTemp = v; } { #ifdef FUNC_TEMP_SENSOR_WITH_NEG_VALUE int16_t v = 0; #else uint8_t v = 0; #endif #ifdef MODIFY_AX80_NACS_OTP_SPEC_20240911_JACK if (Charger.temperature.AX80_NACS_T1_L1_IN > v) v = Charger.temperature.AX80_NACS_T1_L1_IN; if (Charger.temperature.AX80_NACS_T2_L2_IN > v) v = Charger.temperature.AX80_NACS_T2_L2_IN; Charger.temperature.Group2_MaxTemp = v; v = 0; if (Charger.temperature.AX80_NACS_T3_L1_OUT > v) v = Charger.temperature.AX80_NACS_T3_L1_OUT; if (Charger.temperature.AX80_NACS_T4_L2_OUT > v) v = Charger.temperature.AX80_NACS_T4_L2_OUT; Charger.temperature.Group3_MaxTemp = v; v = 0; if (Charger.temperature.AX80_NACS_T5_L1_GUN > v) v = Charger.temperature.AX80_NACS_T5_L1_GUN; if (Charger.temperature.AX80_NACS_T6_L2_GUN > v) v = Charger.temperature.AX80_NACS_T6_L2_GUN; Charger.temperature.Group4_MaxTemp = v; #else //MODIFY_AX80_NACS_OTP_SPEC_20240911_JACK if (Charger.temperature.AX80_NACS_T1_L1_IN > v) v = Charger.temperature.AX80_NACS_T1_L1_IN; if (Charger.temperature.AX80_NACS_T2_L2_IN > v) v = Charger.temperature.AX80_NACS_T2_L2_IN; if (Charger.temperature.AX80_NACS_T3_L1_OUT > v) v = Charger.temperature.AX80_NACS_T3_L1_OUT; if (Charger.temperature.AX80_NACS_T4_L2_OUT > v) v = Charger.temperature.AX80_NACS_T4_L2_OUT; if (Charger.temperature.AX80_NACS_T5_L1_GUN > v) v = Charger.temperature.AX80_NACS_T5_L1_GUN; if (Charger.temperature.AX80_NACS_T6_L2_GUN > v) v = Charger.temperature.AX80_NACS_T6_L2_GUN; Charger.temperature.Group2_MaxTemp = v; #endif //MODIFY_AX80_NACS_OTP_SPEC_20240911_JACK } } else { filter_move_avg(&adc_value.ADC3_IN9_Relay1_Temp, avg_cal(ADC3_Buffer_Each[0], ADC3_SAMPLE_COUNT)); filter_move_avg(&adc_value.ADC3_IN8_Relay2_Temp, avg_cal(ADC3_Buffer_Each[7], ADC3_SAMPLE_COUNT)); filter_move_avg(&adc_value.ADC3_IN10_Input_L1_Temp, avg_cal(ADC3_Buffer_Each[8], ADC3_SAMPLE_COUNT)); filter_move_avg(&adc_value.ADC3_IN7_Input_N_L2_Temp, avg_cal(ADC3_Buffer_Each[4], ADC3_SAMPLE_COUNT)); #ifdef FUNC_AX80_NEW_TEMP_SENSOR_COMPENSATION Charger.temperature.AX80_Relay1Temp = getTemperature(adc_value.ADC3_IN9_Relay1_Temp.value) + 17; //16.95 Charger.temperature.AX80_Relay2Temp = getTemperature(adc_value.ADC3_IN8_Relay2_Temp.value) + 18; //17.55 Charger.temperature.AX80_Input_L1_Temp = getTemperature(adc_value.ADC3_IN10_Input_L1_Temp.value) + 13; //12.575 Charger.temperature.AX80_Input_N_L2_Temp = getTemperature(adc_value.ADC3_IN7_Input_N_L2_Temp.value) + 18; //17.9 #else Charger.temperature.AX80_Relay1Temp = getTemperature(adc_value.ADC3_IN9_Relay1_Temp.value); Charger.temperature.AX80_Relay2Temp = getTemperature(adc_value.ADC3_IN8_Relay2_Temp.value); Charger.temperature.AX80_Input_L1_Temp = getTemperature(adc_value.ADC3_IN10_Input_L1_Temp.value); Charger.temperature.AX80_Input_N_L2_Temp = getTemperature(adc_value.ADC3_IN7_Input_N_L2_Temp.value); #endif { #ifdef FUNC_TEMP_SENSOR_WITH_NEG_VALUE int16_t v = 0; #else uint8_t v = 0; #endif if (Charger.temperature.SystemAmbientTemp > v) v = Charger.temperature.SystemAmbientTemp; if (Charger.temperature.CcsConnectorTemp > v) v = Charger.temperature.CcsConnectorTemp; Charger.temperature.Group1_MaxTemp = v; } { #ifdef FUNC_TEMP_SENSOR_WITH_NEG_VALUE int16_t v = 0; #else uint8_t v = 0; #endif if (Charger.temperature.AX80_Relay1Temp > v) v = Charger.temperature.AX80_Relay1Temp; if (Charger.temperature.AX80_Relay2Temp > v) v = Charger.temperature.AX80_Relay2Temp; if (Charger.temperature.AX80_Input_L1_Temp > v) v = Charger.temperature.AX80_Input_L1_Temp; if (Charger.temperature.AX80_Input_N_L2_Temp > v) v = Charger.temperature.AX80_Input_N_L2_Temp; Charger.temperature.Group2_MaxTemp = v; } } #else //FUNC_AX80_NACS_ADD_6_TEMP_SENEOR filter_move_avg(&adc_value.ADC3_IN9_Relay1_Temp, avg_cal(ADC3_Buffer_Each[0], ADC3_SAMPLE_COUNT)); filter_move_avg(&adc_value.ADC3_IN8_Relay2_Temp, avg_cal(ADC3_Buffer_Each[7], ADC3_SAMPLE_COUNT)); filter_move_avg(&adc_value.ADC3_IN10_Input_L1_Temp, avg_cal(ADC3_Buffer_Each[8], ADC3_SAMPLE_COUNT)); filter_move_avg(&adc_value.ADC3_IN7_Input_N_L2_Temp, avg_cal(ADC3_Buffer_Each[4], ADC3_SAMPLE_COUNT)); #ifdef FUNC_AX80_NEW_TEMP_SENSOR_COMPENSATION Charger.temperature.AX80_Relay1Temp = getTemperature(adc_value.ADC3_IN9_Relay1_Temp.value) + 17; //16.95 Charger.temperature.AX80_Relay2Temp = getTemperature(adc_value.ADC3_IN8_Relay2_Temp.value) + 18; //17.55 Charger.temperature.AX80_Input_L1_Temp = getTemperature(adc_value.ADC3_IN10_Input_L1_Temp.value) + 13; //12.575 Charger.temperature.AX80_Input_N_L2_Temp = getTemperature(adc_value.ADC3_IN7_Input_N_L2_Temp.value) + 18; //17.9 #else Charger.temperature.AX80_Relay1Temp = getTemperature(adc_value.ADC3_IN9_Relay1_Temp.value); Charger.temperature.AX80_Relay2Temp = getTemperature(adc_value.ADC3_IN8_Relay2_Temp.value); Charger.temperature.AX80_Input_L1_Temp = getTemperature(adc_value.ADC3_IN10_Input_L1_Temp.value); Charger.temperature.AX80_Input_N_L2_Temp = getTemperature(adc_value.ADC3_IN7_Input_N_L2_Temp.value); #endif { #ifdef FUNC_TEMP_SENSOR_WITH_NEG_VALUE int16_t v = 0; #else uint8_t v = 0; #endif if (Charger.temperature.SystemAmbientTemp > v) v = Charger.temperature.SystemAmbientTemp; if (Charger.temperature.CcsConnectorTemp > v) v = Charger.temperature.CcsConnectorTemp; Charger.temperature.Group1_MaxTemp = v; } { #ifdef FUNC_TEMP_SENSOR_WITH_NEG_VALUE int16_t v = 0; #else uint8_t v = 0; #endif if (Charger.temperature.AX80_Relay1Temp > v) v = Charger.temperature.AX80_Relay1Temp; if (Charger.temperature.AX80_Relay2Temp > v) v = Charger.temperature.AX80_Relay2Temp; if (Charger.temperature.AX80_Input_L1_Temp > v) v = Charger.temperature.AX80_Input_L1_Temp; if (Charger.temperature.AX80_Input_N_L2_Temp > v) v = Charger.temperature.AX80_Input_N_L2_Temp; Charger.temperature.Group2_MaxTemp = v; } #endif //FUNC_AX80_NACS_ADD_6_TEMP_SENEOR } #ifdef FUNC_AW48_ADD_6_TEMP_SENEOR else if (Charger.m_bModelNameAW48_1P) { filter_move_avg(&adc_value.ADC3_IN9_AW48_T1, avg_cal(ADC3_Buffer_Each[0], ADC3_SAMPLE_COUNT)); filter_move_avg(&adc_value.ADC3_IN8_AW48_T2, avg_cal(ADC3_Buffer_Each[7], ADC3_SAMPLE_COUNT)); filter_move_avg(&adc_value.ADC3_IN10_AW48_T3, avg_cal(ADC3_Buffer_Each[8], ADC3_SAMPLE_COUNT)); filter_move_avg(&adc_value.ADC3_IN7_AW48_T4, avg_cal(ADC3_Buffer_Each[4], ADC3_SAMPLE_COUNT)); filter_move_avg(&adc_value.ADC3_IN5_AW48_T5, avg_cal(ADC3_Buffer_Each[5], ADC3_SAMPLE_COUNT)); filter_move_avg(&adc_value.ADC3_IN11_AW48_T6, avg_cal(ADC3_Buffer_Each[9], ADC3_SAMPLE_COUNT)); #ifdef FUNC_AW48_NEW_TEMP_SENSOR_COMPENSATION_20231214 #ifdef FUNC_AW48_NEW_TEMP_SENSOR_COMPENSATION_20240508 #ifdef FUNC_AW48_TEMP_SENSOR_WITHOUT_COMPENSATION_20240521 #ifdef FUNC_AW48_TEMP_SENSOR_COMPENSATION_AND_MODIFY_FORMULA_20240522 { // Charger.temperature.SystemAmbientTemp += 0; // Charger.temperature.AW48_T1_L1_IN = getTemperature_NACS(adc_value.ADC3_IN9_AW48_T1.value) + 6; // Charger.temperature.AW48_T2_L2_IN = getTemperature_NACS(adc_value.ADC3_IN8_AW48_T2.value) + 6; // Charger.temperature.AW48_T3_L1_OUT = getTemperature_NACS(adc_value.ADC3_IN10_AW48_T3.value) + 7; // Charger.temperature.AW48_T4_L2_OUT = getTemperature_NACS(adc_value.ADC3_IN7_AW48_T4.value) + 7; // Charger.temperature.AW48_T5_L1_GUN = getTemperature_NACS(adc_value.ADC3_IN5_AW48_T5.value) + 0; // Charger.temperature.AW48_T6_L2_GUN = getTemperature_NACS(adc_value.ADC3_IN11_AW48_T6.value) + 0; // #ifdef FUNC_AW48_TEMP_SENSOR_COMPENSATION_WITH_CURRENT_20240523 //#ifdef TEST_AW48_TEMP_SENSOR_COMPENSATION_WITH_CURRENT_20240523_REMOVE_COMPENSATION // Charger.temperature.SystemAmbientTemp += 0; // Charger.temperature.AW48_T1_L1_IN = getTemperature(adc_value.ADC3_IN9_AW48_T1.value) + 0; // Charger.temperature.AW48_T2_L2_IN = getTemperature(adc_value.ADC3_IN8_AW48_T2.value) + 0; // Charger.temperature.AW48_T3_L1_OUT = getTemperature(adc_value.ADC3_IN10_AW48_T3.value) + 0; // Charger.temperature.AW48_T4_L2_OUT = getTemperature(adc_value.ADC3_IN7_AW48_T4.value) + 0; // Charger.temperature.AW48_T5_L1_GUN = getTemperature(adc_value.ADC3_IN5_AW48_T5.value) + 0; // Charger.temperature.AW48_T6_L2_GUN = getTemperature(adc_value.ADC3_IN11_AW48_T6.value) + 0; //#else //TEST_AW48_TEMP_SENSOR_COMPENSATION_WITH_CURRENT_20240523_REMOVE_COMPENSATION #ifdef FUNC_AW48_TEMP_SENSOR_COMPENSATION_WITH_CURRENT_20240729 #ifdef FUNC_AW48_TEMP_SENSOR_COMPENSATION_WITH_CURRENT_20241007 double v = 0; double powCurr = ((double)Charger.Current[0]/100.0) * ((double)Charger.Current[0]/100.0); double pow48 = 48 * 48; Charger.temperature.SystemAmbientTemp += 0; v = powCurr * (17.28 / pow48); Charger.temperature.AW48_T1_L1_IN = getTemperature(adc_value.ADC3_IN9_AW48_T1.value) + HTK_ROUND_U16(v); v = powCurr * (18.34 / pow48); Charger.temperature.AW48_T2_L2_IN = getTemperature(adc_value.ADC3_IN8_AW48_T2.value) + HTK_ROUND_U16(v); v = powCurr * (20.64 / pow48); Charger.temperature.AW48_T3_L1_OUT = getTemperature(adc_value.ADC3_IN10_AW48_T3.value) + HTK_ROUND_U16(v); v = powCurr * (22.00 / pow48); Charger.temperature.AW48_T4_L2_OUT = getTemperature(adc_value.ADC3_IN7_AW48_T4.value) + HTK_ROUND_U16(v); Charger.temperature.AW48_T5_L1_GUN = getTemperature(adc_value.ADC3_IN5_AW48_T5.value) + 0; Charger.temperature.AW48_T6_L2_GUN = getTemperature(adc_value.ADC3_IN11_AW48_T6.value) + 0; #else //FUNC_AW48_TEMP_SENSOR_COMPENSATION_WITH_CURRENT_20241007 double v = 0; double powCurr = ((double)Charger.Current[0]/100.0) * ((double)Charger.Current[0]/100.0); double pow48 = 48 * 48; Charger.temperature.SystemAmbientTemp += 0; v = powCurr * (20.53 / pow48); Charger.temperature.AW48_T1_L1_IN = getTemperature(adc_value.ADC3_IN9_AW48_T1.value) + HTK_ROUND_U16(v); v = powCurr * (22.03 / pow48); Charger.temperature.AW48_T2_L2_IN = getTemperature(adc_value.ADC3_IN8_AW48_T2.value) + HTK_ROUND_U16(v); v = powCurr * (24.39 / pow48); Charger.temperature.AW48_T3_L1_OUT = getTemperature(adc_value.ADC3_IN10_AW48_T3.value) + HTK_ROUND_U16(v); v = powCurr * (23.39 / pow48); Charger.temperature.AW48_T4_L2_OUT = getTemperature(adc_value.ADC3_IN7_AW48_T4.value) + HTK_ROUND_U16(v); Charger.temperature.AW48_T5_L1_GUN = getTemperature(adc_value.ADC3_IN5_AW48_T5.value) + 0; Charger.temperature.AW48_T6_L2_GUN = getTemperature(adc_value.ADC3_IN11_AW48_T6.value) + 0; #endif //FUNC_AW48_TEMP_SENSOR_COMPENSATION_WITH_CURRENT_20241007 #else //FUNC_AW48_TEMP_SENSOR_COMPENSATION_WITH_CURRENT_20240729 double v = 0; double powCurr = ((double)Charger.Current[0]/100.0) * ((double)Charger.Current[0]/100.0); double pow48 = 48 * 48; Charger.temperature.SystemAmbientTemp += 0; v = powCurr * (11.97 / pow48); Charger.temperature.AW48_T1_L1_IN = getTemperature(adc_value.ADC3_IN9_AW48_T1.value) + HTK_ROUND_U16(v); v = powCurr * (14.98 / pow48); Charger.temperature.AW48_T2_L2_IN = getTemperature(adc_value.ADC3_IN8_AW48_T2.value) + HTK_ROUND_U16(v); v = powCurr * (28.55 / pow48); Charger.temperature.AW48_T3_L1_OUT = getTemperature(adc_value.ADC3_IN10_AW48_T3.value) + HTK_ROUND_U16(v); v = powCurr * (26.91 / pow48); Charger.temperature.AW48_T4_L2_OUT = getTemperature(adc_value.ADC3_IN7_AW48_T4.value) + HTK_ROUND_U16(v); Charger.temperature.AW48_T5_L1_GUN = getTemperature(adc_value.ADC3_IN5_AW48_T5.value) + 0; Charger.temperature.AW48_T6_L2_GUN = getTemperature(adc_value.ADC3_IN11_AW48_T6.value) + 0; #endif //FUNC_AW48_TEMP_SENSOR_COMPENSATION_WITH_CURRENT_20240729 //#endif //TEST_AW48_TEMP_SENSOR_COMPENSATION_WITH_CURRENT_20240523_REMOVE_COMPENSATION #else //FUNC_AW48_TEMP_SENSOR_COMPENSATION_WITH_CURRENT_20240523 Charger.temperature.SystemAmbientTemp += 0; Charger.temperature.AW48_T1_L1_IN = getTemperature(adc_value.ADC3_IN9_AW48_T1.value) + 6; Charger.temperature.AW48_T2_L2_IN = getTemperature(adc_value.ADC3_IN8_AW48_T2.value) + 6; Charger.temperature.AW48_T3_L1_OUT = getTemperature(adc_value.ADC3_IN10_AW48_T3.value) + 7; Charger.temperature.AW48_T4_L2_OUT = getTemperature(adc_value.ADC3_IN7_AW48_T4.value) + 7; Charger.temperature.AW48_T5_L1_GUN = getTemperature(adc_value.ADC3_IN5_AW48_T5.value) + 0; Charger.temperature.AW48_T6_L2_GUN = getTemperature(adc_value.ADC3_IN11_AW48_T6.value) + 0; #endif //FUNC_AW48_TEMP_SENSOR_COMPENSATION_WITH_CURRENT_20240523 } #else //FUNC_AW48_TEMP_SENSOR_COMPENSATION_AND_MODIFY_FORMULA_20240522 { double v = 0; Charger.temperature.SystemAmbientTemp += HTK_ROUND_U16(v); Charger.temperature.AW48_T1_L1_IN = getTemperature(adc_value.ADC3_IN9_AW48_T1.value) + HTK_ROUND_U16(v); Charger.temperature.AW48_T2_L2_IN = getTemperature(adc_value.ADC3_IN8_AW48_T2.value) + HTK_ROUND_U16(v); Charger.temperature.AW48_T3_L1_OUT = getTemperature(adc_value.ADC3_IN10_AW48_T3.value) + HTK_ROUND_U16(v); Charger.temperature.AW48_T4_L2_OUT = getTemperature(adc_value.ADC3_IN7_AW48_T4.value) + HTK_ROUND_U16(v); Charger.temperature.AW48_T5_L1_GUN = getTemperature(adc_value.ADC3_IN5_AW48_T5.value) + 0; Charger.temperature.AW48_T6_L2_GUN = getTemperature(adc_value.ADC3_IN11_AW48_T6.value) + 0; } #endif //FUNC_AW48_TEMP_SENSOR_COMPENSATION_AND_MODIFY_FORMULA_20240522 #else //FUNC_AW48_TEMP_SENSOR_WITHOUT_COMPENSATION_20240521 { double v = 0; v = 2.38333 + (-1.7); Charger.temperature.SystemAmbientTemp += HTK_ROUND_U16(v); v = 23.8667 + (-4.73333) + (-6.25); Charger.temperature.AW48_T1_L1_IN = getTemperature(adc_value.ADC3_IN9_AW48_T1.value) + HTK_ROUND_U16(v); v = 25.45 + (-5.71667) + (-6.5); Charger.temperature.AW48_T2_L2_IN = getTemperature(adc_value.ADC3_IN8_AW48_T2.value) + HTK_ROUND_U16(v); v = 28.2833 + (-3.43333); Charger.temperature.AW48_T3_L1_OUT = getTemperature(adc_value.ADC3_IN10_AW48_T3.value) + HTK_ROUND_U16(v); v = 29.5333 + (-3.56667); Charger.temperature.AW48_T4_L2_OUT = getTemperature(adc_value.ADC3_IN7_AW48_T4.value) + HTK_ROUND_U16(v); Charger.temperature.AW48_T5_L1_GUN = getTemperature(adc_value.ADC3_IN5_AW48_T5.value) + 0; Charger.temperature.AW48_T6_L2_GUN = getTemperature(adc_value.ADC3_IN11_AW48_T6.value) + 0; } #endif //FUNC_AW48_TEMP_SENSOR_WITHOUT_COMPENSATION_20240521 #else //FUNC_AW48_NEW_TEMP_SENSOR_COMPENSATION_20240508 { double v = 0; v = 2.38333 + (-1.7); Charger.temperature.SystemAmbientTemp += HTK_ROUND_U16(v); v = 23.8667 + (-4.73333); Charger.temperature.AW48_T1_L1_IN = getTemperature(adc_value.ADC3_IN9_AW48_T1.value) + HTK_ROUND_U16(v); v = 25.45 + (-5.71667); Charger.temperature.AW48_T2_L2_IN = getTemperature(adc_value.ADC3_IN8_AW48_T2.value) + HTK_ROUND_U16(v); v = 28.2833 + (-3.43333); Charger.temperature.AW48_T3_L1_OUT = getTemperature(adc_value.ADC3_IN10_AW48_T3.value) + HTK_ROUND_U16(v); v = 29.5333 + (-3.56667); Charger.temperature.AW48_T4_L2_OUT = getTemperature(adc_value.ADC3_IN7_AW48_T4.value) + HTK_ROUND_U16(v); Charger.temperature.AW48_T5_L1_GUN = getTemperature(adc_value.ADC3_IN5_AW48_T5.value) + 0; Charger.temperature.AW48_T6_L2_GUN = getTemperature(adc_value.ADC3_IN11_AW48_T6.value) + 0; } #endif //FUNC_AW48_NEW_TEMP_SENSOR_COMPENSATION_20240508 #else //FUNC_AW48_NEW_TEMP_SENSOR_COMPENSATION_20231214 #ifdef FUNC_AW48_NEW_TEMP_SENSOR_COMPENSATION Charger.temperature.SystemAmbientTemp += 3; Charger.temperature.AW48_T1_L1_IN = getTemperature(adc_value.ADC3_IN9_AW48_T1.value) + 24; Charger.temperature.AW48_T2_L2_IN = getTemperature(adc_value.ADC3_IN8_AW48_T2.value) + 26; Charger.temperature.AW48_T3_L1_OUT = getTemperature(adc_value.ADC3_IN10_AW48_T3.value) + 29; Charger.temperature.AW48_T4_L2_OUT = getTemperature(adc_value.ADC3_IN7_AW48_T4.value) + 30; Charger.temperature.AW48_T5_L1_GUN = getTemperature(adc_value.ADC3_IN5_AW48_T5.value) + 0; Charger.temperature.AW48_T6_L2_GUN = getTemperature(adc_value.ADC3_IN11_AW48_T6.value) + 0; #else Charger.temperature.AW48_T1_L1_IN = getTemperature(adc_value.ADC3_IN9_AW48_T1.value); Charger.temperature.AW48_T2_L2_IN = getTemperature(adc_value.ADC3_IN8_AW48_T2.value); Charger.temperature.AW48_T3_L1_OUT = getTemperature(adc_value.ADC3_IN10_AW48_T3.value); Charger.temperature.AW48_T4_L2_OUT = getTemperature(adc_value.ADC3_IN7_AW48_T4.value); Charger.temperature.AW48_T5_L1_GUN = getTemperature(adc_value.ADC3_IN5_AW48_T5.value); Charger.temperature.AW48_T6_L2_GUN = getTemperature(adc_value.ADC3_IN11_AW48_T6.value); #endif #endif //FUNC_AW48_NEW_TEMP_SENSOR_COMPENSATION_20231214 { #ifdef FUNC_TEMP_SENSOR_WITH_NEG_VALUE int16_t v = 0; #else uint8_t v = 0; #endif if (Charger.temperature.SystemAmbientTemp > v) v = Charger.temperature.SystemAmbientTemp; if (Charger.temperature.CcsConnectorTemp > v) v = Charger.temperature.CcsConnectorTemp; Charger.temperature.Group1_MaxTemp = v; } { #ifdef FUNC_TEMP_SENSOR_WITH_NEG_VALUE int16_t v = 0; #else uint8_t v = 0; #endif #ifdef MODIFY_AW48_OTP_SPEC_20240522_STEVEN #ifdef MODIFY_AW48_OTP_SPEC_20240802_STEVEN if (Charger.temperature.AW48_T1_L1_IN > v) v = Charger.temperature.AW48_T1_L1_IN; if (Charger.temperature.AW48_T2_L2_IN > v) v = Charger.temperature.AW48_T2_L2_IN; Charger.temperature.Group2_MaxTemp = v; v = 0; if (Charger.temperature.AW48_T3_L1_OUT > v) v = Charger.temperature.AW48_T3_L1_OUT; if (Charger.temperature.AW48_T4_L2_OUT > v) v = Charger.temperature.AW48_T4_L2_OUT; Charger.temperature.Group3_MaxTemp = v; v = 0; if (Charger.temperature.AW48_T5_L1_GUN > v) v = Charger.temperature.AW48_T5_L1_GUN; if (Charger.temperature.AW48_T6_L2_GUN > v) v = Charger.temperature.AW48_T6_L2_GUN; Charger.temperature.Group4_MaxTemp = v; #else //MODIFY_AW48_OTP_SPEC_20240802_STEVEN if (Charger.temperature.AW48_T1_L1_IN > v) v = Charger.temperature.AW48_T1_L1_IN; if (Charger.temperature.AW48_T2_L2_IN > v) v = Charger.temperature.AW48_T2_L2_IN; if (Charger.temperature.AW48_T5_L1_GUN > v) v = Charger.temperature.AW48_T5_L1_GUN; if (Charger.temperature.AW48_T6_L2_GUN > v) v = Charger.temperature.AW48_T6_L2_GUN; Charger.temperature.Group2_MaxTemp = v; v = 0; if (Charger.temperature.AW48_T3_L1_OUT > v) v = Charger.temperature.AW48_T3_L1_OUT; if (Charger.temperature.AW48_T4_L2_OUT > v) v = Charger.temperature.AW48_T4_L2_OUT; Charger.temperature.Group3_MaxTemp = v; #endif //MODIFY_AW48_OTP_SPEC_20240802_STEVEN #else //MODIFY_AW48_OTP_SPEC_20240522_STEVEN if (Charger.temperature.AW48_T1_L1_IN > v) v = Charger.temperature.AW48_T1_L1_IN; if (Charger.temperature.AW48_T2_L2_IN > v) v = Charger.temperature.AW48_T2_L2_IN; if (Charger.temperature.AW48_T3_L1_OUT > v) v = Charger.temperature.AW48_T3_L1_OUT; if (Charger.temperature.AW48_T4_L2_OUT > v) v = Charger.temperature.AW48_T4_L2_OUT; if (Charger.temperature.AW48_T5_L1_GUN > v) v = Charger.temperature.AW48_T5_L1_GUN; if (Charger.temperature.AW48_T6_L2_GUN > v) v = Charger.temperature.AW48_T6_L2_GUN; Charger.temperature.Group2_MaxTemp = v; #endif //MODIFY_AW48_OTP_SPEC_20240522_STEVEN } } #endif //FUNC_AW48_ADD_6_TEMP_SENEOR #ifdef FUNC_AX48_NACS_ADD_6_TEMP_SENEOR else if (Charger.m_bModelNameAX48_NACS_1P) { filter_move_avg(&adc_value.ADC3_IN9_AX48_NACS_T1, avg_cal(ADC3_Buffer_Each[0], ADC3_SAMPLE_COUNT)); filter_move_avg(&adc_value.ADC3_IN8_AX48_NACS_T2, avg_cal(ADC3_Buffer_Each[7], ADC3_SAMPLE_COUNT)); filter_move_avg(&adc_value.ADC3_IN10_AX48_NACS_T3, avg_cal(ADC3_Buffer_Each[8], ADC3_SAMPLE_COUNT)); filter_move_avg(&adc_value.ADC3_IN7_AX48_NACS_T4, avg_cal(ADC3_Buffer_Each[4], ADC3_SAMPLE_COUNT)); filter_move_avg(&adc_value.ADC3_IN5_AX48_NACS_T5, avg_cal(ADC3_Buffer_Each[5], ADC3_SAMPLE_COUNT)); filter_move_avg(&adc_value.ADC3_IN11_AX48_NACS_T6, avg_cal(ADC3_Buffer_Each[9], ADC3_SAMPLE_COUNT)); #ifdef FUNC_AX48_NACS_NEW_TEMP_SENSOR_COMPENSATION_20231214 #ifdef FUNC_AX48_NACS_NEW_TEMP_SENSOR_COMPENSATION_20240415 #ifdef FUNC_AX48_NACS_TEMP_SENSOR_WITHOUT_COMPENSATION_20240521 #ifdef FUNC_AX48_NACS_TEMP_SENSOR_COMPENSATION_AND_MODIFY_FORMULA_20240522 { // Charger.temperature.SystemAmbientTemp += 0; // Charger.temperature.AX48_NACS_T1_L1_IN = getTemperature_NACS(adc_value.ADC3_IN9_AX48_NACS_T1.value) + 6; // Charger.temperature.AX48_NACS_T2_L2_IN = getTemperature_NACS(adc_value.ADC3_IN8_AX48_NACS_T2.value) + 6; // Charger.temperature.AX48_NACS_T3_L1_OUT = getTemperature_NACS(adc_value.ADC3_IN10_AX48_NACS_T3.value) + 7; // Charger.temperature.AX48_NACS_T4_L2_OUT = getTemperature_NACS(adc_value.ADC3_IN7_AX48_NACS_T4.value) + 7; // Charger.temperature.AX48_NACS_T5_L1_GUN = getTemperature_NACS(adc_value.ADC3_IN5_AX48_NACS_T5.value) + 0; // Charger.temperature.AX48_NACS_T6_L2_GUN = getTemperature_NACS(adc_value.ADC3_IN11_AX48_NACS_T6.value) + 0; // #ifdef FUNC_AX48_NACS_TEMP_SENSOR_COMPENSATION_WITH_CURRENT_20240523 double v = 0; double powCurr = ((double)Charger.Current[0]/100.0) * ((double)Charger.Current[0]/100.0); double pow48 = 48 * 48; Charger.temperature.SystemAmbientTemp += 0; v = powCurr * (6 / pow48); Charger.temperature.AX48_NACS_T1_L1_IN = getTemperature(adc_value.ADC3_IN9_AX48_NACS_T1.value) + HTK_ROUND_U16(v); v = powCurr * (6 / pow48); Charger.temperature.AX48_NACS_T2_L2_IN = getTemperature(adc_value.ADC3_IN8_AX48_NACS_T2.value) + HTK_ROUND_U16(v); v = powCurr * (7 / pow48); Charger.temperature.AX48_NACS_T3_L1_OUT = getTemperature(adc_value.ADC3_IN10_AX48_NACS_T3.value) + HTK_ROUND_U16(v); v = powCurr * (12 / pow48); Charger.temperature.AX48_NACS_T4_L2_OUT = getTemperature(adc_value.ADC3_IN7_AX48_NACS_T4.value) + HTK_ROUND_U16(v); Charger.temperature.AX48_NACS_T5_L1_GUN = getTemperature(adc_value.ADC3_IN5_AX48_NACS_T5.value) + 0; Charger.temperature.AX48_NACS_T6_L2_GUN = getTemperature(adc_value.ADC3_IN11_AX48_NACS_T6.value) + 0; #else //FUNC_AX48_NACS_TEMP_SENSOR_COMPENSATION_WITH_CURRENT_20240523 Charger.temperature.SystemAmbientTemp += 0; Charger.temperature.AX48_NACS_T1_L1_IN = getTemperature(adc_value.ADC3_IN9_AX48_NACS_T1.value) + 6; Charger.temperature.AX48_NACS_T2_L2_IN = getTemperature(adc_value.ADC3_IN8_AX48_NACS_T2.value) + 6; Charger.temperature.AX48_NACS_T3_L1_OUT = getTemperature(adc_value.ADC3_IN10_AX48_NACS_T3.value) + 7; Charger.temperature.AX48_NACS_T4_L2_OUT = getTemperature(adc_value.ADC3_IN7_AX48_NACS_T4.value) + 7; Charger.temperature.AX48_NACS_T5_L1_GUN = getTemperature(adc_value.ADC3_IN5_AX48_NACS_T5.value) + 0; Charger.temperature.AX48_NACS_T6_L2_GUN = getTemperature(adc_value.ADC3_IN11_AX48_NACS_T6.value) + 0; #endif //FUNC_AX48_NACS_TEMP_SENSOR_COMPENSATION_WITH_CURRENT_20240523 } #else //FUNC_AX48_NACS_TEMP_SENSOR_COMPENSATION_AND_MODIFY_FORMULA_20240522 { Charger.temperature.SystemAmbientTemp += 0; Charger.temperature.AX48_NACS_T1_L1_IN = getTemperature(adc_value.ADC3_IN9_AX48_NACS_T1.value) + 0; Charger.temperature.AX48_NACS_T2_L2_IN = getTemperature(adc_value.ADC3_IN8_AX48_NACS_T2.value) + 0; Charger.temperature.AX48_NACS_T3_L1_OUT = getTemperature(adc_value.ADC3_IN10_AX48_NACS_T3.value) + 0; Charger.temperature.AX48_NACS_T4_L2_OUT = getTemperature(adc_value.ADC3_IN7_AX48_NACS_T4.value) + 0; Charger.temperature.AX48_NACS_T5_L1_GUN = getTemperature(adc_value.ADC3_IN5_AX48_NACS_T5.value) + 0; Charger.temperature.AX48_NACS_T6_L2_GUN = getTemperature(adc_value.ADC3_IN11_AX48_NACS_T6.value) + 0; } #endif //FUNC_AX48_NACS_TEMP_SENSOR_COMPENSATION_AND_MODIFY_FORMULA_20240522 #else //FUNC_AX48_NACS_TEMP_SENSOR_WITHOUT_COMPENSATION_20240521 { double v = 0; v = 2.38333 + (-1.7); Charger.temperature.SystemAmbientTemp += HTK_ROUND_U16(v); v = 23.8667 + (-4.73333) + (-3.7667) + (3); Charger.temperature.AX48_NACS_T1_L1_IN = getTemperature(adc_value.ADC3_IN9_AX48_NACS_T1.value) + HTK_ROUND_U16(v); v = 25.45 + (-5.71667) + (-4.6833) + (3); Charger.temperature.AX48_NACS_T2_L2_IN = getTemperature(adc_value.ADC3_IN8_AX48_NACS_T2.value) + HTK_ROUND_U16(v); v = 28.2833 + (-3.43333) + (-7.0333) + (7); Charger.temperature.AX48_NACS_T3_L1_OUT = getTemperature(adc_value.ADC3_IN10_AX48_NACS_T3.value) + HTK_ROUND_U16(v); v = 29.5333 + (-3.56667) + (-4.3333) + (4); Charger.temperature.AX48_NACS_T4_L2_OUT = getTemperature(adc_value.ADC3_IN7_AX48_NACS_T4.value) + HTK_ROUND_U16(v); Charger.temperature.AX48_NACS_T5_L1_GUN = getTemperature(adc_value.ADC3_IN5_AX48_NACS_T5.value) + 0; Charger.temperature.AX48_NACS_T6_L2_GUN = getTemperature(adc_value.ADC3_IN11_AX48_NACS_T6.value) + 0; } #endif //FUNC_AX48_NACS_TEMP_SENSOR_WITHOUT_COMPENSATION_20240521 #else //FUNC_AX48_NACS_NEW_TEMP_SENSOR_COMPENSATION_20240415 { double v = 0; v = 2.38333 + (-1.7); Charger.temperature.SystemAmbientTemp += HTK_ROUND_U16(v); v = 23.8667 + (-4.73333); Charger.temperature.AX48_NACS_T1_L1_IN = getTemperature(adc_value.ADC3_IN9_AX48_NACS_T1.value) + HTK_ROUND_U16(v); v = 25.45 + (-5.71667); Charger.temperature.AX48_NACS_T2_L2_IN = getTemperature(adc_value.ADC3_IN8_AX48_NACS_T2.value) + HTK_ROUND_U16(v); v = 28.2833 + (-3.43333); Charger.temperature.AX48_NACS_T3_L1_OUT = getTemperature(adc_value.ADC3_IN10_AX48_NACS_T3.value) + HTK_ROUND_U16(v); v = 29.5333 + (-3.56667); Charger.temperature.AX48_NACS_T4_L2_OUT = getTemperature(adc_value.ADC3_IN7_AX48_NACS_T4.value) + HTK_ROUND_U16(v); Charger.temperature.AX48_NACS_T5_L1_GUN = getTemperature(adc_value.ADC3_IN5_AX48_NACS_T5.value) + 0; Charger.temperature.AX48_NACS_T6_L2_GUN = getTemperature(adc_value.ADC3_IN11_AX48_NACS_T6.value) + 0; } #endif //FUNC_AX48_NACS_NEW_TEMP_SENSOR_COMPENSATION_20240415 #else //FUNC_AX48_NACS_NEW_TEMP_SENSOR_COMPENSATION_20231214 #ifdef FUNC_AX48_NACS_NEW_TEMP_SENSOR_COMPENSATION Charger.temperature.SystemAmbientTemp += 3; Charger.temperature.AX48_NACS_T1_L1_IN = getTemperature(adc_value.ADC3_IN9_AX48_NACS_T1.value) + 24; Charger.temperature.AX48_NACS_T2_L2_IN = getTemperature(adc_value.ADC3_IN8_AX48_NACS_T2.value) + 26; Charger.temperature.AX48_NACS_T3_L1_OUT = getTemperature(adc_value.ADC3_IN10_AX48_NACS_T3.value) + 29; Charger.temperature.AX48_NACS_T4_L2_OUT = getTemperature(adc_value.ADC3_IN7_AX48_NACS_T4.value) + 30; Charger.temperature.AX48_NACS_T5_L1_GUN = getTemperature(adc_value.ADC3_IN5_AX48_NACS_T5.value) + 0; Charger.temperature.AX48_NACS_T6_L2_GUN = getTemperature(adc_value.ADC3_IN11_AX48_NACS_T6.value) + 0; #else Charger.temperature.AX48_NACS_T1_L1_IN = getTemperature(adc_value.ADC3_IN9_AX48_NACS_T1.value); Charger.temperature.AX48_NACS_T2_L2_IN = getTemperature(adc_value.ADC3_IN8_AX48_NACS_T2.value); Charger.temperature.AX48_NACS_T3_L1_OUT = getTemperature(adc_value.ADC3_IN10_AX48_NACS_T3.value); Charger.temperature.AX48_NACS_T4_L2_OUT = getTemperature(adc_value.ADC3_IN7_AX48_NACS_T4.value); Charger.temperature.AX48_NACS_T5_L1_GUN = getTemperature(adc_value.ADC3_IN5_AX48_NACS_T5.value); Charger.temperature.AX48_NACS_T6_L2_GUN = getTemperature(adc_value.ADC3_IN11_AX48_NACS_T6.value); #endif #endif //FUNC_AX48_NACS_NEW_TEMP_SENSOR_COMPENSATION_20231214 { #ifdef FUNC_TEMP_SENSOR_WITH_NEG_VALUE int16_t v = 0; #else uint8_t v = 0; #endif if (Charger.temperature.SystemAmbientTemp > v) v = Charger.temperature.SystemAmbientTemp; if (Charger.temperature.CcsConnectorTemp > v) v = Charger.temperature.CcsConnectorTemp; Charger.temperature.Group1_MaxTemp = v; } { #ifdef FUNC_TEMP_SENSOR_WITH_NEG_VALUE int16_t v = 0; #else uint8_t v = 0; #endif #ifdef MODIFY_AX48_NACS_OTP_SPEC_20240522_STEVEN #ifdef MODIFY_AX48_NACS_OTP_SPEC_20240826_STEVEN if (Charger.temperature.AX48_NACS_T1_L1_IN > v) v = Charger.temperature.AX48_NACS_T1_L1_IN; if (Charger.temperature.AX48_NACS_T2_L2_IN > v) v = Charger.temperature.AX48_NACS_T2_L2_IN; Charger.temperature.Group2_MaxTemp = v; v = 0; if (Charger.temperature.AX48_NACS_T3_L1_OUT > v) v = Charger.temperature.AX48_NACS_T3_L1_OUT; if (Charger.temperature.AX48_NACS_T4_L2_OUT > v) v = Charger.temperature.AX48_NACS_T4_L2_OUT; Charger.temperature.Group3_MaxTemp = v; v = 0; if (Charger.temperature.AX48_NACS_T5_L1_GUN > v) v = Charger.temperature.AX48_NACS_T5_L1_GUN; if (Charger.temperature.AX48_NACS_T6_L2_GUN > v) v = Charger.temperature.AX48_NACS_T6_L2_GUN; Charger.temperature.Group4_MaxTemp = v; #else //MODIFY_AX48_NACS_OTP_SPEC_20240826_STEVEN if (Charger.temperature.AX48_NACS_T1_L1_IN > v) v = Charger.temperature.AX48_NACS_T1_L1_IN; if (Charger.temperature.AX48_NACS_T2_L2_IN > v) v = Charger.temperature.AX48_NACS_T2_L2_IN; if (Charger.temperature.AX48_NACS_T5_L1_GUN > v) v = Charger.temperature.AX48_NACS_T5_L1_GUN; if (Charger.temperature.AX48_NACS_T6_L2_GUN > v) v = Charger.temperature.AX48_NACS_T6_L2_GUN; Charger.temperature.Group2_MaxTemp = v; v = 0; if (Charger.temperature.AX48_NACS_T3_L1_OUT > v) v = Charger.temperature.AX48_NACS_T3_L1_OUT; if (Charger.temperature.AX48_NACS_T4_L2_OUT > v) v = Charger.temperature.AX48_NACS_T4_L2_OUT; Charger.temperature.Group3_MaxTemp = v; #endif //MODIFY_AX48_NACS_OTP_SPEC_20240826_STEVEN #else //MODIFY_AX48_NACS_OTP_SPEC_20240522_STEVEN if (Charger.temperature.AX48_NACS_T1_L1_IN > v) v = Charger.temperature.AX48_NACS_T1_L1_IN; if (Charger.temperature.AX48_NACS_T2_L2_IN > v) v = Charger.temperature.AX48_NACS_T2_L2_IN; if (Charger.temperature.AX48_NACS_T3_L1_OUT > v) v = Charger.temperature.AX48_NACS_T3_L1_OUT; if (Charger.temperature.AX48_NACS_T4_L2_OUT > v) v = Charger.temperature.AX48_NACS_T4_L2_OUT; if (Charger.temperature.AX48_NACS_T5_L1_GUN > v) v = Charger.temperature.AX48_NACS_T5_L1_GUN; if (Charger.temperature.AX48_NACS_T6_L2_GUN > v) v = Charger.temperature.AX48_NACS_T6_L2_GUN; Charger.temperature.Group2_MaxTemp = v; #endif //MODIFY_AX48_NACS_OTP_SPEC_20240522_STEVEN } } #endif //FUNC_AX48_NACS_ADD_6_TEMP_SENEOR else { #ifdef FUNC_TEMP_SENSOR_WITH_NEG_VALUE int16_t v = 0; #else uint8_t v = 0; #endif if (Charger.temperature.SystemAmbientTemp > v) v = Charger.temperature.SystemAmbientTemp; if (Charger.temperature.CcsConnectorTemp > v) v = Charger.temperature.CcsConnectorTemp; Charger.temperature.Group1_MaxTemp = v; } #endif //PE filter_move_avg(&adc_value.ADC3_IN4_GMI_VL1, avg_cal(ADC3_Buffer_Each[3], ADC3_SAMPLE_COUNT)); #ifdef FUNC_AW48_KENNY_TEST_DOUBLE_GF_ADC_VAL if (Charger.m_bModelNameAW48_1P) { adc_value.ADC3_IN4_GMI_VL1.value *= 2; } #endif //CT #ifndef FUNC_REPLACE_ADC_WITH_METER_IC Current_filter_move_avg(&adc_value.ADC3_IN7_Current_L1, cRms_cal(ADC3_Buffer_Each[4], ADC3_SAMPLE_COUNT)); Current_filter_move_avg(&adc_value.ADC3_IN5_Current_L2, cRms_cal(ADC3_Buffer_Each[5], ADC3_SAMPLE_COUNT)); Current_filter_move_avg(&adc_value.ADC3_IN11_Current_L3, cRms_cal(ADC3_Buffer_Each[9], ADC3_SAMPLE_COUNT)); #endif #ifdef FUNC_DETECT_PP if (Charger.m_bDetectPP) { filter_move_avg(&adc_value.ADC3_IN6_Gun_Detec, avg_cal(ADC3_Buffer_Each[6], ADC3_SAMPLE_COUNT)); { #ifdef VO_SIMU_PP if (Charger.m_VOCode.m_EnableSimuPP) { UpdatePPInfo_CurrVal(&Charger.m_PPInfo, Charger.m_SimuData.m_PPCurr); } else { UpdatePPInfo_AdcVal(&Charger.m_PPInfo, adc_value.ADC3_IN6_Gun_Detec.value); } #else //VO_SIMU_PP UpdatePPInfo_AdcVal(&Charger.m_PPInfo, adc_value.ADC3_IN6_Gun_Detec.value); #endif //VO_SIMU_PP } } #endif //FUNC_DETECT_PP #ifdef FUNC_DETECT_PP_NACS if (Charger.m_bDetectPP_NACS) { filter_move_avg(&adc_value.ADC3_IN6_Gun_Detec, avg_cal(ADC3_Buffer_Each[6], ADC3_SAMPLE_COUNT)); { //#ifdef VO_SIMU_PP // if (Charger.m_VOCode.m_EnableSimuPP) // { // UpdatePPInfo_CurrVal(&Charger.m_PPInfo, Charger.m_SimuData.m_PPCurr); // } // else // { // UpdatePPInfo_AdcVal(&Charger.m_PPInfo, adc_value.ADC3_IN6_Gun_Detec.value); // } //#else //VO_SIMU_PP // UpdatePPInfo_AdcVal(&Charger.m_PPInfo, adc_value.ADC3_IN6_Gun_Detec.value); //#endif //VO_SIMU_PP } } #endif //FUNC_DETECT_PP_NACS //Correction //VT #ifdef TEST_ACXXX_FAKEDATA #ifdef TEST_AC110_FAKEDATA Charger.Voltage[0] = rand() % 50 + 11000; Charger.Voltage[1] = rand() % 50 + 11000; Charger.Voltage[2] = rand() % 50 + 11000; #endif #ifdef TEST_AC220_FAKEDATA Charger.Voltage[0] = rand() % 50 + 22000; Charger.Voltage[1] = rand() % 50 + 22000; Charger.Voltage[2] = rand() % 50 + 22000; #endif #else //TEST_ACXXX_FAKEDATA #ifndef FUNC_REPLACE_ADC_WITH_METER_IC Charger.Voltage[0] = (uint16_t) (((adc_value.ADC3_IN9_Voltage_L1.value)*Charger.coefficient.gain_v[0])+Charger.coefficient.offset_v[0]) ; Charger.Voltage[1] = (uint16_t) (((adc_value.ADC3_IN8_Voltage_L2.value)*Charger.coefficient.gain_v[1])+Charger.coefficient.offset_v[1]) ; Charger.Voltage[2] = (uint16_t) (((adc_value.ADC3_IN10_Voltage_L3.value)*Charger.coefficient.gain_v[2])+Charger.coefficient.offset_v[2]) ; #endif #endif //TEST_ACXXX_FAKEDATA #ifndef FUNC_REPLACE_ADC_WITH_METER_IC //CT Charger.Current[0] = (uint16_t)((adc_value.ADC3_IN7_Current_L1.value*Charger.coefficient.gain_c[0])+Charger.coefficient.offset_c[0]); Charger.Current[1] = (uint16_t)((adc_value.ADC3_IN5_Current_L2.value*Charger.coefficient.gain_c[1])+Charger.coefficient.offset_c[1]); Charger.Current[2] = (uint16_t)((adc_value.ADC3_IN11_Current_L3.value*Charger.coefficient.gain_c[2])+Charger.coefficient.offset_c[2]); #endif //GMI Charger.Gmi_Voltage = (uint16_t) (((adc_value.ADC3_IN4_GMI_VL1.value)*Charger.coefficient.gain_gmi[0])+Charger.coefficient.offset_gmi[0]) ; #ifdef COLD_LOAD_PICKUP if(Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_NO_CSU){ // check Power drop is not alarm // Power drop detection #ifdef FUNC_REPLACE_ADC_WITH_METER_IC if((Charger.Voltage[0] <= ALARM_SPEC_POWER_DROP) && (!Charger.AC_DripisTure) && (Charger.Mode != MODE_INITIAL)) #else if((vRms_cal2(ADC3_Buffer_Each[0], ADC3_SAMPLE_COUNT) <= ALARM_SPEC_POWER_DROP) && (!Charger.AC_DripisTure) && (Charger.Mode != MODE_INITIAL)) #endif { if(Charger.counter.AC_Drip.fail > 1000) { //Charger.memory.EVSE_Config.data.item.isDispDebug = OFF; if((Charger.Mode == MODE_CHARGING) || (Charger.Mode == MODE_STOP)) { Charger.memory.coldLoadPickUp.data.item.isEnable = ON; Charger.memory.coldLoadPickUp.data.item.DateTime.year = Charger.cycle_info.startDateTime.year; Charger.memory.coldLoadPickUp.data.item.DateTime.month = Charger.cycle_info.startDateTime.month; Charger.memory.coldLoadPickUp.data.item.DateTime.day = Charger.cycle_info.startDateTime.day; Charger.memory.coldLoadPickUp.data.item.DateTime.hour = Charger.cycle_info.startDateTime.hour; Charger.memory.coldLoadPickUp.data.item.DateTime.min = Charger.cycle_info.startDateTime.min; Charger.memory.coldLoadPickUp.data.item.DateTime.sec = Charger.cycle_info.startDateTime.sec; Charger.memory.coldLoadPickUp.data.item.Duration = Charger.cycle_info.Duration; sprintf(Charger.memory.coldLoadPickUp.data.item.PlugType, EVSE_CONNECTOR_TYPE); Charger.memory.coldLoadPickUp.data.item.powerSum = Charger.cycle_info.Power_Consumption; Charger.memory.coldLoadPickUp.data.item.startType = Charger.cycle_info.StartType; //memcpy(Charger.memory.coldLoadPickUp.data.item.user, Charger.rfid.currentCard, 16); Charger.memory.coldLoadPickUp.op_bits.update = ON; } Charger.AC_DripisTure = ON ; } else Charger.counter.AC_Drip.fail ++ ; } #ifdef FUNC_REPLACE_ADC_WITH_METER_IC else if((Charger.Voltage[0] > (ALARM_SPEC_UV+ALARM_SPEC_OUV_HYSTERESIS))) #else else if((vRms_cal2(ADC3_Buffer_Each[0], ADC3_SAMPLE_COUNT) > (ALARM_SPEC_UV+ALARM_SPEC_OUV_HYSTERESIS))) #endif { Charger.counter.AC_Drip.fail = 0 ; if(Charger.AC_DripisTure) { Charger.AC_DripisTure = OFF ; DEBUG_INFO("Alarm AC Drip recover.\r\n"); } } } #endif //COLD_LOAD_PICKUP #ifndef FUNC_POWER_CONSUMPTION_BY_METER_IC // Power accumulate calculation if(timer[TIMER_IDX_POWER].isAlarm) { timeTick.timeTick_End = HAL_GetTick(); timeTick.timeTick_Delta = timeTick.timeTick_End - timeTick.timeTick_Start; timeTick.timeTick_Start = timeTick.timeTick_End; //L1 Power Consumption if(Charger.memory.EVSE_Config.data.item.Power_Consumption_L1_Cumulative >= 0xFFFFFFFF) { Charger.memory.EVSE_Config.data.item.Power_Consumption_L1_Cumulative = 0; } else { //unit : 0.0001kW , 0.1W *10 = W Charger.memory.EVSE_Config.data.item.Power_Consumption_L1_Cumulative += (uint32_t)((Charger.Voltage[0]/100.0)*(Charger.Current[0]/100.0)*(timeTick.timeTick_Delta/3600000.0)*10.0); } //L2 Power Consumption if(Charger.memory.EVSE_Config.data.item.Power_Consumption_L2_Cumulative >= 0xFFFFFFFF) { Charger.memory.EVSE_Config.data.item.Power_Consumption_L2_Cumulative = 0; } else { //unit : 0.0001kW , 0.1W *10 = W Charger.memory.EVSE_Config.data.item.Power_Consumption_L2_Cumulative += (uint32_t)((Charger.Voltage[1]/100.0)*(Charger.Current[1]/100.0)*(timeTick.timeTick_Delta/3600000.0)*10.0); } //L3 Power Consumption if(Charger.memory.EVSE_Config.data.item.Power_Consumption_L3_Cumulative >= 0xFFFFFFFF) { Charger.memory.EVSE_Config.data.item.Power_Consumption_L3_Cumulative = 0; } else { //unit : 0.0001kW , 0.1W *10 = W Charger.memory.EVSE_Config.data.item.Power_Consumption_L3_Cumulative += (uint32_t)((Charger.Voltage[2]/100.0)*(Charger.Current[2]/100.0)*(timeTick.timeTick_Delta/3600000.0)*10.0); } //totle Power Consumption if(Charger.memory.EVSE_Config.data.item.Power_Consumption_Cumulative >= 0xFFFFFFFF) { Charger.memory.EVSE_Config.data.item.Power_Consumption_Cumulative = 0; } else { //unit : 0.0001kW , 0.1W *10 = W Charger.memory.EVSE_Config.data.item.Power_Consumption_Cumulative = (Charger.memory.EVSE_Config.data.item.Power_Consumption_L1_Cumulative + Charger.memory.EVSE_Config.data.item.Power_Consumption_L2_Cumulative + Charger.memory.EVSE_Config.data.item.Power_Consumption_L3_Cumulative) ; } if(++updateMemReq>180) { Charger.memory.EVSE_Config.op_bits.update = ON; updateMemReq = 0; } timerRefresh(TIMER_IDX_POWER); } #endif //FUNC_POWER_CONSUMPTION_BY_METER_IC if(HAL_ADC_Start_DMA(&hadc3, (uint32_t*)&ADC3_Buffer, ADC3_CHANEL_COUNT*ADC3_SAMPLE_COUNT)!=HAL_OK)Error_Handler(); } osDelay(1); } /* USER CODE END StartAdcTask */ } /* USER CODE BEGIN Header_StartTimeoutTask */ /** * @brief Function implementing the timeoutTask thread. * @param argument: Not used * @retval None */ /* USER CODE END Header_StartTimeoutTask */ void StartTimeoutTask(void const * argument) { /* USER CODE BEGIN StartTimeoutTask */ #ifdef FUNC_IDLE_UNTIL_READ_ALL_MEM IdleUntilReadAllMemory(); #endif breathe.isUp = ON; for(int idx=0;idx timer[idx].timeoutSpec) { timer[idx].isAlarm = ON; } else { timer[idx].isAlarm = OFF; } } else { timer[idx].startTime = HAL_GetTick(); timer[idx].isAlarm = OFF; } } #ifdef FUNC_GUN_LOCK if (Charger.m_bUseGunLock) { GL_Proc(); } #endif //FUNC_GUN_LOCK /* Blink timer process */ for(int idx=0;idx (blinker[idx].isOn ? blinker[idx].blinkOnSpec : blinker[idx].blinkOffSpec)) { if(blinker[idx].blinkCount >= blinker[idx].blinkCountSpec) { if((HAL_GetTick() - blinker[idx].resetStartTime) > blinker[idx].blinkRestSpec) { if(!blinker[idx].blinkRestSpec) //no rest case blinker[idx].blinkisFinish = ON ; blinker[idx].blinkCount = 0; #ifdef FUNC_AW48_NET_LED if (Charger.m_bModelNameAW48_1P) { if (idx == BLINKER_IDX_LED_NET) { Proc_NetLedActionSubState(); } } #endif } else { blinker[idx].isOn= OFF; blinker[idx].blinkisFinish = ON ; } } else { if(blinker[idx].isOn) blinker[idx].blinkCount++; blinker[idx].blinkStartTime = HAL_GetTick(); blinker[idx].resetStartTime = HAL_GetTick(); blinker[idx].isOn ^= ON; if(blinker[idx].blinkRestSpec > 0) //had rest case blinker[idx].blinkisFinish = OFF ; } } } /* Flick timer process */ for(int idx=0;idx (flicker[idx].isOn ? flicker[idx].OnSpec : flicker[idx].OffSpec)) { flicker[idx].StartTime = HAL_GetTick(); flicker[idx].isOn ^= ON; } } /* Breathe timer process */ if(breathe.isUp) { breathe.countPause = 0; breathe.countDown = breathe.timeDown; if(++breathe.countUp >= breathe.timeUp) breathe.isUp = OFF; breathe.duty[0] = breathe.RGB[0]*breathe.countUp/breathe.timeUp; breathe.duty[1] = breathe.RGB[1]*breathe.countUp/breathe.timeUp; breathe.duty[2] = breathe.RGB[2]*breathe.countUp/breathe.timeUp; breathe.duty[3] = breathe.RGB[3]*breathe.countUp/breathe.timeUp; } else { breathe.countUp = 1000*BREATHE_LED_LOW_BOUNDARY/breathe.timeDown; if(breathe.countDown <= 1000*BREATHE_LED_LOW_BOUNDARY/breathe.timeDown) { //if(++breathe.countPause>250) //breathe ON->oFF need delay nedd Uncomment annotations breathe.isUp = ON; } else { if(breathe.countDown > 1000*BREATHE_LED_LOW_BOUNDARY/breathe.timeDown) breathe.countDown -=1; } breathe.duty[0] = breathe.RGB[0]*breathe.countDown/breathe.timeDown; breathe.duty[1] = breathe.RGB[1]*breathe.countDown/breathe.timeDown; breathe.duty[2] = breathe.RGB[2]*breathe.countDown/breathe.timeDown; breathe.duty[3] = breathe.RGB[3]*breathe.countDown/breathe.timeDown; } osDelay(1); } /* USER CODE END StartTimeoutTask */ } #ifdef FUNC_ENABLE_USART1_RFID /* USER CODE BEGIN Header_StartRfidTask */ /** * @brief Function implementing the rfidTask thread. * @param argument: Not used * @retval None */ /* USER CODE END Header_StartRfidTask */ void StartRfidTask(void const * argument) { /* USER CODE BEGIN StartRfidTask */ #ifdef FUNC_IDLE_UNTIL_READ_ALL_MEM IdleUntilReadAllMemory(); #endif //rrfid uint8_t cardType = 0; uint8_t tmpBuf[32]; uint8_t tx[UART_BUFFER_SIZE>>4]; uint8_t tx_len; HAL_GPIO_WritePin(OUT_RFID_Reset_GPIO_Port, OUT_RFID_Reset_Pin, GPIO_PIN_SET); /* Infinite loop */ for(;;) { // Read card SN if(!Charger.rfid.op_bits.reqHalt && !Charger.rfid.op_bits.reqBlockRead) { switch(cardType) { case 0x00: tx_len = 4; tx[0] = tx_len - 0x01; tx[1] = RFID_CMD_REQUEST_SN_14443A; tx[2] = 0x01; tx[3] = rfidCheckSumCal(tx, tx_len-1); cardType++; break; case 0x01: tx_len = 5; tx[0] = tx_len - 0x01; tx[1] = RFID_CMD_REQUEST_SN_14443B; tx[2] = 0x00; tx[3] = 0x00; tx[4] = rfidCheckSumCal(tx, tx_len-1); cardType++; break; case 0x02: tx_len = 9; tx[0] = tx_len - 0x01; tx[1] = RFID_CMD_REQUEST_SN_FELICA; tx[2] = 0x06; tx[3] = 0x00; tx[4] = 0xff; tx[5] = 0xff; tx[6] = 0x01; tx[7] = 0x00; tx[8] = rfidCheckSumCal(tx, tx_len-1); cardType++; break; default: cardType = 0; break; } HAL_UART_Transmit(&RFID_USART, (uint8_t *)tx, tx_len, 0xffff); osDelay(100); } if(Charger.rfid.op_bits.reqHalt) { tx_len = 3; tx[0] = tx_len - 0x01; tx[1] = RFID_CMD_HALT_14443A; tx[2] = rfidCheckSumCal(tx, tx_len-1); HAL_UART_Transmit(&RFID_USART, (uint8_t *)tx, tx_len, 0xffff); osDelay(100); } if(Charger.rfid.op_bits.reqBlockRead) { tx_len = 0x0b; tx[0] = tx_len - 0x01; tx[1] = RFID_CMD_BLOCK_READ; tx[2] = Charger.rfid.keyType; tx[3] = Charger.rfid.targetBlock; tx[4] = Charger.rfid.key[0]; tx[5] = Charger.rfid.key[1]; tx[6] = Charger.rfid.key[2]; tx[7] = Charger.rfid.key[3]; tx[8] = Charger.rfid.key[4]; tx[9] = Charger.rfid.key[5]; tx[10] = rfidCheckSumCal(tx, tx_len-1); HAL_UART_Transmit(&RFID_USART, (uint8_t *)tx, tx_len, 0xffff); osDelay(100); } // RFID module feedback process if(UART_RFID_recv_end_flag == ON) { if((rfidCheckSumCal(UART_RFID_rx_buffer, UART_RFID_rx_buffer[0]) == UART_RFID_rx_buffer[UART_RFID_rx_buffer[0]]) && (Charger.Mode != MODE_INITIAL) && (Charger.Mode != MODE_ALARM)) { switch(UART_RFID_rx_buffer[1]) { case RFID_CMD_LED: break; case RFID_CMD_REQUEST_SN_14443A: if(UART_RFID_rx_buffer[0] == 9) { Charger.rfid.snType = RFID_SN_TYPE_4BYTE; memset(&Charger.rfid.data_Sn[0], 0x00, ARRAY_SIZE(Charger.rfid.data_Sn)); for(uint8_t idx=0;idx<16;idx++) { if(idx<4) { Charger.rfid.data_Sn[idx] = UART_RFID_rx_buffer[idx+2]; } else { Charger.rfid.data_Sn[idx] = 0x00; } } if(isMode(MODE_IDLE)) { memset(&Charger.rfid.currentCard[0], 0x00, ARRAY_SIZE(Charger.rfid.currentCard)); } if(Charger.memory.EVSE_Config.data.item.RFID_SN_Endian) { DEBUG_INFO("RFID SN: %02X%02X%02X%02X\r\n", Charger.rfid.data_Sn[3], Charger.rfid.data_Sn[2], Charger.rfid.data_Sn[1], Charger.rfid.data_Sn[0]); sprintf((char *)tmpBuf, "%02X%02X%02X%02X", Charger.rfid.data_Sn[3], Charger.rfid.data_Sn[2], Charger.rfid.data_Sn[1], Charger.rfid.data_Sn[0]); memcpy(&Charger.rfid.nowCard[0], &tmpBuf[0], ARRAY_SIZE(Charger.rfid.currentCard)); } else { DEBUG_INFO("RFID SN: %02X%02X%02X%02X\r\n", Charger.rfid.data_Sn[0], Charger.rfid.data_Sn[1], Charger.rfid.data_Sn[2], Charger.rfid.data_Sn[3]); sprintf((char *)tmpBuf, "%02X%02X%02X%02X", Charger.rfid.data_Sn[0], Charger.rfid.data_Sn[1], Charger.rfid.data_Sn[2], Charger.rfid.data_Sn[3]); memcpy(&Charger.rfid.nowCard[0], &tmpBuf[0], ARRAY_SIZE(Charger.rfid.currentCard)); } } else if(UART_RFID_rx_buffer[0] == 0x0c) { Charger.rfid.snType = RFID_SN_TYPE_7BYTE; memset(&Charger.rfid.data_Sn[0], 0x00, ARRAY_SIZE(Charger.rfid.data_Sn)); for(uint8_t idx=0;idx<16;idx++) { if(idx<7) { Charger.rfid.data_Sn[idx] = UART_RFID_rx_buffer[idx+2]; } else { Charger.rfid.data_Sn[idx] = 0x00; } } if(isMode(MODE_IDLE)) { memset(&Charger.rfid.currentCard[0], 0x00, ARRAY_SIZE(Charger.rfid.currentCard)); } if(Charger.memory.EVSE_Config.data.item.RFID_SN_Endian) { DEBUG_INFO("RFID SN: %02X%02X%02X%02X%02X%02X%02X\r\n", Charger.rfid.data_Sn[6], Charger.rfid.data_Sn[5], Charger.rfid.data_Sn[4], Charger.rfid.data_Sn[3], Charger.rfid.data_Sn[1], Charger.rfid.data_Sn[1], Charger.rfid.data_Sn[0]); sprintf((char *)tmpBuf, "%02X%02X%02X%02X%02X%02X%02X", Charger.rfid.data_Sn[6], Charger.rfid.data_Sn[5], Charger.rfid.data_Sn[4], Charger.rfid.data_Sn[3], Charger.rfid.data_Sn[1], Charger.rfid.data_Sn[1], Charger.rfid.data_Sn[0]); memcpy(&Charger.rfid.nowCard[0], &tmpBuf[0], ARRAY_SIZE(Charger.rfid.currentCard)); } else { DEBUG_INFO("RFID SN: %02X%02X%02X%02X%02X%02X%02X\r\n", Charger.rfid.data_Sn[0], Charger.rfid.data_Sn[1], Charger.rfid.data_Sn[2], Charger.rfid.data_Sn[3], Charger.rfid.data_Sn[4], Charger.rfid.data_Sn[5], Charger.rfid.data_Sn[6]); sprintf((char *)tmpBuf, "%02X%02X%02X%02X%02X%02X%02X", Charger.rfid.data_Sn[0], Charger.rfid.data_Sn[1], Charger.rfid.data_Sn[2], Charger.rfid.data_Sn[3], Charger.rfid.data_Sn[4], Charger.rfid.data_Sn[5], Charger.rfid.data_Sn[6]); memcpy(&Charger.rfid.nowCard[0], &tmpBuf[0], ARRAY_SIZE(Charger.rfid.currentCard)); } } //PH if (Charger.memory.EVSE_Config.data.item.OfflinePolicy == RFID_USER_AUTH_PH ) { if(UART_RFID_rx_buffer[0] >= 9) { if(isMode(MODE_IDLE)) { if(Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_NO_CSU) { Charger.rfid.targetBlock = 0x02; Charger.rfid.keyType = 0x00; memset(&Charger.rfid.key[0], 0xff, 6); Charger.rfid.op_bits.reqBlockRead = ON; //control in RFID_CMD_BLOCK_READ to Valid_RFID_SN } } else if(isMode(MODE_CHARGING) || isMode(MODE_STOP)) { if ((Array_data_Check(Charger.rfid.currentCard,Charger.rfid.nowCard))&&(Charger.cycle_info.StartType != START_METHOD_BLE)) { if(Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_NO_CSU) { Charger.rfid.op_bits.reqStop = ON; setLedMotion(LED_ACTION_RFID_PASS); Charger.speaker.motion = SPEAKER_SHORT; timerEnable(TIMER_IDX_LED_TEMP, 3000); } DEBUG_WARN("reqStop = ON.\r\n"); } else { if(Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_NO_CSU) { setLedMotion(LED_ACTION_RFID_FAIL); Charger.speaker.motion = SPEAKER_BLINK; blinkerTimeSet(BLINKER_IDX_SPEAKER, 100, 100, SPEAK_RESET_RFID_TIME, 3) ; // SPEAK_RESET_RFID_TIME -> Avoid repeating timerEnable(TIMER_IDX_LED_TEMP, 3000); } DEBUG_WARN("reqStop = Fail\r\n"); } Charger.rfid.op_bits.reqHalt = ON; Charger.rfid.op_bits.reqBlockRead = OFF; } } } //White List else if (Charger.memory.EVSE_Config.data.item.OfflinePolicy == RFID_USER_AUTH_LOCAL_LIST) { DEBUG_WARN("OfflinePolicy is White List\r\n"); } //Free else if (Charger.memory.EVSE_Config.data.item.OfflinePolicy == RFID_USER_AUTH_FREE) { Charger.rfid.op_bits.reqHalt = ON; Charger.rfid.op_bits.reqBlockRead = OFF; if(isMode(MODE_IDLE)) { for(uint8_t idx=0;idx<16;idx++) { Charger.rfid.currentCard[idx] = Charger.rfid.data_Sn[idx]; } Charger.rfid.op_bits.reqStart = ON; memcpy(&Charger.rfid.currentCard[0], &tmpBuf[0], ARRAY_SIZE(Charger.rfid.currentCard)); if(Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_NO_CSU){ setLedMotion(LED_ACTION_RFID_PASS); Charger.speaker.motion = SPEAKER_SHORT; timerEnable(TIMER_IDX_LED_TEMP, 3000); } DEBUG_WARN("RFID authorize pass.\r\n"); } else if(isMode(MODE_CHARGING) || isMode(MODE_STOP)) { DEBUG_WARN("RFID authorize pass.\r\n"); if (Array_data_Check(Charger.rfid.currentCard,Charger.rfid.nowCard)) { Charger.rfid.op_bits.reqStop = ON; if(Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_NO_CSU){ setLedMotion(LED_ACTION_RFID_PASS); Charger.speaker.motion = SPEAKER_SHORT; timerEnable(TIMER_IDX_LED_TEMP, 3000); } DEBUG_WARN("reqStop = ON.\r\n"); } else { if(Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_NO_CSU){ setLedMotion(LED_ACTION_RFID_FAIL); Charger.speaker.motion = SPEAKER_BLINK; blinkerTimeSet(BLINKER_IDX_SPEAKER, 100, 100, SPEAK_RESET_RFID_TIME, 3) ; // SPEAK_RESET_RFID_TIME -> Avoid repeating timerEnable(TIMER_IDX_LED_TEMP, 3000); } DEBUG_WARN("reqStop = Fail\r\n"); } } } //NO charger else // Charger.memory.EVSE_Config.data.item.OfflinePolicy == RFID_USER_AUTH_NO_CHARGING { setLedMotion(LED_ACTION_RFID_FAIL); Charger.speaker.motion = SPEAKER_BLINK; blinkerTimeSet(BLINKER_IDX_SPEAKER, 100, 100, SPEAK_RESET_RFID_TIME, 3) ; // SPEAK_RESET_RFID_TIME -> Avoid repeating timerEnable(TIMER_IDX_LED_TEMP, 3000); Charger.rfid.op_bits.reqHalt = ON; Charger.rfid.op_bits.reqBlockRead = OFF; DEBUG_WARN("It is RFID NO charger mode \r\n"); } break; case RFID_CMD_REQUEST_SN_14443B: if(UART_RFID_rx_buffer[1] == RFID_CMD_REQUEST_SN_14443B) { Charger.rfid.snType = RFID_SN_TYPE_14443B; memset(&Charger.rfid.data_Sn[0], 0x00, ARRAY_SIZE(Charger.rfid.data_Sn)); for(uint8_t idx=0;idx<16;idx++) { if(idx<13) { Charger.rfid.data_Sn[idx] = UART_RFID_rx_buffer[idx+2]; } } if(isMode(MODE_IDLE)) memset(&Charger.rfid.nowCard[0], 0x00, ARRAY_SIZE(Charger.rfid.nowCard)); if(Charger.memory.EVSE_Config.data.item.RFID_SN_Endian) { DEBUG_INFO("RFID SN: %02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X\r\n", Charger.rfid.data_Sn[12], Charger.rfid.data_Sn[11], Charger.rfid.data_Sn[10], Charger.rfid.data_Sn[9], Charger.rfid.data_Sn[8], Charger.rfid.data_Sn[7], Charger.rfid.data_Sn[6], Charger.rfid.data_Sn[5], Charger.rfid.data_Sn[4], Charger.rfid.data_Sn[3], Charger.rfid.data_Sn[1], Charger.rfid.data_Sn[1], Charger.rfid.data_Sn[0]); sprintf((char *)tmpBuf, "%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", Charger.rfid.data_Sn[12], Charger.rfid.data_Sn[11], Charger.rfid.data_Sn[10], Charger.rfid.data_Sn[9], Charger.rfid.data_Sn[8], Charger.rfid.data_Sn[7], Charger.rfid.data_Sn[6], Charger.rfid.data_Sn[5], Charger.rfid.data_Sn[4], Charger.rfid.data_Sn[3], Charger.rfid.data_Sn[1], Charger.rfid.data_Sn[1], Charger.rfid.data_Sn[0]); memcpy(&Charger.rfid.nowCard[0], &tmpBuf[0], ARRAY_SIZE(Charger.rfid.nowCard)); } else { DEBUG_INFO("RFID SN: %02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X\r\n", Charger.rfid.data_Sn[0], Charger.rfid.data_Sn[1], Charger.rfid.data_Sn[2], Charger.rfid.data_Sn[3], Charger.rfid.data_Sn[4], Charger.rfid.data_Sn[5], Charger.rfid.data_Sn[6], Charger.rfid.data_Sn[7], Charger.rfid.data_Sn[8], Charger.rfid.data_Sn[9], Charger.rfid.data_Sn[10], Charger.rfid.data_Sn[11], Charger.rfid.data_Sn[12]); sprintf((char *)tmpBuf, "%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", Charger.rfid.data_Sn[0], Charger.rfid.data_Sn[1], Charger.rfid.data_Sn[2], Charger.rfid.data_Sn[3], Charger.rfid.data_Sn[4], Charger.rfid.data_Sn[5], Charger.rfid.data_Sn[6], Charger.rfid.data_Sn[7], Charger.rfid.data_Sn[8], Charger.rfid.data_Sn[9], Charger.rfid.data_Sn[10], Charger.rfid.data_Sn[11], Charger.rfid.data_Sn[12]); memcpy(&Charger.rfid.nowCard[0], &tmpBuf[0], ARRAY_SIZE(Charger.rfid.nowCard)); } } //White List if (Charger.memory.EVSE_Config.data.item.OfflinePolicy == RFID_USER_AUTH_LOCAL_LIST) { DEBUG_WARN("OfflinePolicy is White List\r\n"); } //Free else if (Charger.memory.EVSE_Config.data.item.OfflinePolicy == RFID_USER_AUTH_FREE) { Charger.rfid.op_bits.reqHalt = ON; Charger.rfid.op_bits.reqBlockRead = OFF; if(isMode(MODE_IDLE)) { for(uint8_t idx=0;idx<16;idx++) { Charger.rfid.currentCard[idx] = Charger.rfid.data_Sn[idx]; } Charger.rfid.op_bits.reqStart = ON; memcpy(&Charger.rfid.currentCard[0], &tmpBuf[0], ARRAY_SIZE(Charger.rfid.currentCard)); if(Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_NO_CSU){ setLedMotion(LED_ACTION_RFID_PASS); Charger.speaker.motion = SPEAKER_SHORT; timerEnable(TIMER_IDX_LED_TEMP, 3000); } DEBUG_WARN("RFID authorize pass.\r\n"); } else if(isMode(MODE_CHARGING) || isMode(MODE_STOP)) { DEBUG_WARN("RFID authorize pass.\r\n"); if (Array_data_Check(Charger.rfid.currentCard,Charger.rfid.nowCard)) { Charger.rfid.op_bits.reqStop = ON; if(Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_NO_CSU){ setLedMotion(LED_ACTION_RFID_PASS); Charger.speaker.motion = SPEAKER_SHORT; timerEnable(TIMER_IDX_LED_TEMP, 3000); } DEBUG_WARN("reqStop = ON.\r\n"); } else { if(Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_NO_CSU){ setLedMotion(LED_ACTION_RFID_FAIL); Charger.speaker.motion = SPEAKER_BLINK; blinkerTimeSet(BLINKER_IDX_SPEAKER, 100, 100, SPEAK_RESET_RFID_TIME, 3) ; // SPEAK_RESET_RFID_TIME -> Avoid repeating timerEnable(TIMER_IDX_LED_TEMP, 3000); } DEBUG_WARN("reqStop = Fail\r\n"); } } } //NO charger else // Charger.memory.EVSE_Config.data.item.OfflinePolicy == RFID_USER_AUTH_NO_CHARGING { setLedMotion(LED_ACTION_RFID_FAIL); Charger.speaker.motion = SPEAKER_BLINK; blinkerTimeSet(BLINKER_IDX_SPEAKER, 100, 100, SPEAK_RESET_RFID_TIME, 3) ; // SPEAK_RESET_RFID_TIME -> Avoid repeating timerEnable(TIMER_IDX_LED_TEMP, 3000); Charger.rfid.op_bits.reqHalt = ON; Charger.rfid.op_bits.reqBlockRead = OFF; DEBUG_WARN("It is RFID NO charger mode \r\n"); } break; case RFID_CMD_REQUEST_SN_FELICA: if(UART_RFID_rx_buffer[1] == RFID_CMD_REQUEST_SN_FELICA) { Charger.rfid.snType = RFID_SN_TYPE_FELICA; memset(&Charger.rfid.data_Sn[0], 0x00, ARRAY_SIZE(Charger.rfid.data_Sn)); for(uint8_t idx=0;idx<16;idx++) { if(idx<6) { Charger.rfid.data_Sn[idx] = UART_RFID_rx_buffer[idx+6]; } } if(isMode(MODE_IDLE)) memset(&Charger.rfid.nowCard[0], 0x00, ARRAY_SIZE(Charger.rfid.nowCard)); if(Charger.memory.EVSE_Config.data.item.RFID_SN_Endian) { DEBUG_INFO("RFID SN: %02X%02X%02X%02X%02X%02X\r\n", Charger.rfid.data_Sn[5], Charger.rfid.data_Sn[4], Charger.rfid.data_Sn[3], Charger.rfid.data_Sn[1], Charger.rfid.data_Sn[1], Charger.rfid.data_Sn[0]); sprintf((char *)tmpBuf, "%02X%02X%02X%02X%02X%02X", Charger.rfid.data_Sn[5], Charger.rfid.data_Sn[4], Charger.rfid.data_Sn[3], Charger.rfid.data_Sn[1], Charger.rfid.data_Sn[1], Charger.rfid.data_Sn[0]); memcpy(&Charger.rfid.nowCard[0], &tmpBuf[0], ARRAY_SIZE(Charger.rfid.nowCard)); } else { DEBUG_INFO("RFID SN: %02X%02X%02X%02X%02X%02X\r\n", Charger.rfid.data_Sn[0], Charger.rfid.data_Sn[1], Charger.rfid.data_Sn[2], Charger.rfid.data_Sn[3], Charger.rfid.data_Sn[4], Charger.rfid.data_Sn[5]); sprintf((char *)tmpBuf, "%02X%02X%02X%02X%02X%02X", Charger.rfid.data_Sn[0], Charger.rfid.data_Sn[1], Charger.rfid.data_Sn[2], Charger.rfid.data_Sn[3], Charger.rfid.data_Sn[4], Charger.rfid.data_Sn[5]); memcpy(&Charger.rfid.nowCard[0], &tmpBuf[0], ARRAY_SIZE(Charger.rfid.nowCard)); } } //White List if (Charger.memory.EVSE_Config.data.item.OfflinePolicy == RFID_USER_AUTH_LOCAL_LIST) { DEBUG_WARN("OfflinePolicy is White List\r\n"); } //Free else if (Charger.memory.EVSE_Config.data.item.OfflinePolicy == RFID_USER_AUTH_FREE) { Charger.rfid.op_bits.reqHalt = ON; Charger.rfid.op_bits.reqBlockRead = OFF; if(isMode(MODE_IDLE)) { for(uint8_t idx=0;idx<16;idx++) { Charger.rfid.currentCard[idx] = Charger.rfid.data_Sn[idx]; } Charger.rfid.op_bits.reqStart = ON; memcpy(&Charger.rfid.currentCard[0], &tmpBuf[0], ARRAY_SIZE(Charger.rfid.currentCard)); if(Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_NO_CSU){ setLedMotion(LED_ACTION_RFID_PASS); Charger.speaker.motion = SPEAKER_SHORT; timerEnable(TIMER_IDX_LED_TEMP, 3000); } DEBUG_WARN("RFID authorize pass.\r\n"); } else if(isMode(MODE_CHARGING) || isMode(MODE_STOP)) { DEBUG_WARN("RFID authorize pass.\r\n"); if (Array_data_Check(Charger.rfid.currentCard,Charger.rfid.nowCard)) { Charger.rfid.op_bits.reqStop = ON; if(Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_NO_CSU){ setLedMotion(LED_ACTION_RFID_PASS); Charger.speaker.motion = SPEAKER_SHORT; timerEnable(TIMER_IDX_LED_TEMP, 3000); } DEBUG_WARN("reqStop = ON.\r\n"); } else { if(Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_NO_CSU){ setLedMotion(LED_ACTION_RFID_FAIL); Charger.speaker.motion = SPEAKER_BLINK; blinkerTimeSet(BLINKER_IDX_SPEAKER, 100, 100, SPEAK_RESET_RFID_TIME, 3) ; // SPEAK_RESET_RFID_TIME -> Avoid repeating timerEnable(TIMER_IDX_LED_TEMP, 3000); } DEBUG_WARN("reqStop = Fail\r\n"); } } } //NO charger else // Charger.memory.EVSE_Config.data.item.OfflinePolicy == RFID_USER_AUTH_NO_CHARGING { setLedMotion(LED_ACTION_RFID_FAIL); Charger.speaker.motion = SPEAKER_BLINK; blinkerTimeSet(BLINKER_IDX_SPEAKER, 100, 100, SPEAK_RESET_RFID_TIME, 3) ; // SPEAK_RESET_RFID_TIME -> Avoid repeating timerEnable(TIMER_IDX_LED_TEMP, 3000); Charger.rfid.op_bits.reqHalt = ON; Charger.rfid.op_bits.reqBlockRead = OFF; DEBUG_WARN("It is RFID NO charger mode \r\n"); } osDelay(1000); break; case RFID_CMD_BLOCK_READ: if(UART_RFID_rx_buffer[1] == RFID_CMD_BLOCK_READ) { memcpy(Charger.rfid.data_Block, &UART_RFID_rx_buffer[2], 0x10); Charger.rfid.op_bits.reqHalt = ON; Charger.rfid.op_bits.reqBlockRead = OFF; //RFID_PH if(Valid_RFID_SN()) { if(isMode(MODE_IDLE)) { Charger.rfid.op_bits.reqStart = ON; setLedMotion(LED_ACTION_RFID_PASS); Charger.speaker.motion = SPEAKER_SHORT; timerEnable(TIMER_IDX_LED_TEMP, 3000); memcpy(&Charger.rfid.currentCard[0], &tmpBuf[0], ARRAY_SIZE(Charger.rfid.currentCard)); } else if(isMode(MODE_CHARGING) || isMode(MODE_STOP)) { Charger.rfid.op_bits.reqStop = ON; } DEBUG_WARN("RFID authorize pass.\r\n"); } else { setLedMotion(LED_ACTION_RFID_FAIL); Charger.speaker.motion = SPEAKER_BLINK; blinkerTimeSet(BLINKER_IDX_SPEAKER, 100, 100, SPEAK_RESET_RFID_TIME, 3) ; // SPEAK_RESET_RFID_TIME -> Avoid repeating timerEnable(TIMER_IDX_LED_TEMP, 3000); DEBUG_WARN("RFID authorize fault.\r\n"); } } break; case RFID_CMD_BLOCK_WRITE: break; case RFID_CMD_HALT_14443A: if(UART_RFID_rx_buffer[1] == RFID_CMD_HALT_14443A) { Charger.rfid.op_bits.reqHalt = OFF; DEBUG_INFO("RFID card(14443A) halt succcess.\r\n"); } break; case RFID_CMD_HALT_14443B: if(UART_RFID_rx_buffer[1] == RFID_CMD_HALT_14443B) { Charger.rfid.op_bits.reqHalt = OFF; DEBUG_INFO("RFID card(14443B) halt succcess.\r\n"); } break; case (RFID_CMD_BLOCK_READ ^ 0xff): Charger.rfid.op_bits.reqBlockRead = OFF; DEBUG_WARN("RFID cread block fail.\r\n"); break; default: break; } } // Clear rx_buffer and related varaible for(uint16_t i = 0; i < UART_RFID_rx_len ; i++) UART_RFID_rx_buffer[i]=0; UART_RFID_rx_len = 0; UART_RFID_recv_end_flag = OFF; } HAL_UART_Receive_DMA(&RFID_USART,(uint8_t*)UART_RFID_rx_buffer, (UART_BUFFER_SIZE>>4)); osDelay(300); } /* USER CODE END StartRfidTask */ } #endif //FUNC_ENABLE_USART1_RFID /* USER CODE BEGIN Header_StartLedSpeakerTask */ /** * @brief Function implementing the led_speakerTask thread. * @param argument: Not used * @retval None */ /* USER CODE END Header_StartLedSpeakerTask */ void StartLedSpeakerTask(void const * argument) { /* USER CODE BEGIN StartLedSpeakerTask */ //#ifdef FUNC_IDLE_UNTIL_READ_ALL_MEM // IdleUntilReadAllMemory(); //#endif uint16_t led_pwm_duty_now[4]; uint16_t breathe_duty_now[4]; //standard default for(uint8_t idx=0;idx<12;idx++) Charger.Led_Brightness[idx] = 0x33; /* //Night mode starndard default brightness Charger.Led_Brightness[0] = 0x11; //00:00~ 01:59 Charger.Led_Brightness[1] = 0x11; //02:00~ 03:59 Charger.Led_Brightness[2] = 0x11; //04:00~ 05:59 Charger.Led_Brightness[3] = 0x33; //06:00~ 07:59 Charger.Led_Brightness[4] = 0x33; //08:00~ 09:59 Charger.Led_Brightness[5] = 0x33; //10:00~ 11:59 Charger.Led_Brightness[6] = 0x33; //12:00~ 13:59 Charger.Led_Brightness[7] = 0x33; //14:00~ 15:59 Charger.Led_Brightness[8] = 0x33; //16:00~ 17:59 Charger.Led_Brightness[9] = 0x11; //18:00~ 19:59 Charger.Led_Brightness[10] = 0x11; //20:00~ 21:59 Charger.Led_Brightness[11] = 0x11; //22:00~ 23:59 */ /* Infinite loop */ for(;;) { led_pwm_duty_now[0] = getBrightnessDuty(Charger.led_pwm_duty[0]); led_pwm_duty_now[1] = getBrightnessDuty(Charger.led_pwm_duty[1]); led_pwm_duty_now[2] = getBrightnessDuty(Charger.led_pwm_duty[2]); led_pwm_duty_now[3] = getBrightnessDuty(Charger.led_pwm_duty[3]); breathe_duty_now[0] = getBrightnessDuty(breathe.duty[0]); breathe_duty_now[1] = getBrightnessDuty(breathe.duty[1]); breathe_duty_now[2] = getBrightnessDuty(breathe.duty[2]); breathe_duty_now[3] = getBrightnessDuty(breathe.duty[3]); if(timer[TIMER_IDX_LED_TEMP].isAlarm) { timerDisable(TIMER_IDX_LED_TEMP); setLedMotion(Charger.Led_Mode); } /* LED red process */ switch(Charger.led_R.motion) { case LED_MOTION_ON: user_pwm_setvalue(PWM_CH_LED_R, led_pwm_duty_now[0]); break; case LED_MOTION_BLINK: if(blinker[BLINKER_IDX_LED].isOn) { user_pwm_setvalue(PWM_CH_LED_R, led_pwm_duty_now[0]); } else { user_pwm_setvalue(PWM_CH_LED_R, PWM_DUTY_OFF); } break; case LED_MOTION_BREATHE: user_pwm_setvalue(PWM_CH_LED_R, breathe_duty_now[0]); break; case LED_MOTION_OFF: default: user_pwm_setvalue(PWM_CH_LED_R, PWM_DUTY_OFF); break; } /* LED green process */ switch(Charger.led_G.motion) { case LED_MOTION_ON: user_pwm_setvalue(PWM_CH_LED_G, led_pwm_duty_now[1]); break; case LED_MOTION_BLINK: if(blinker[BLINKER_IDX_LED].isOn) { user_pwm_setvalue(PWM_CH_LED_G, led_pwm_duty_now[1]); } else { user_pwm_setvalue(PWM_CH_LED_G, PWM_DUTY_OFF); } break; case LED_MOTION_BREATHE: user_pwm_setvalue(PWM_CH_LED_G, breathe_duty_now[1]); break; case LED_MOTION_OFF: default: user_pwm_setvalue(PWM_CH_LED_G, PWM_DUTY_OFF); break; } /* LED blue process */ switch(Charger.led_B.motion) { case LED_MOTION_ON: user_pwm_setvalue(PWM_CH_LED_B, led_pwm_duty_now[2]); break; case LED_MOTION_BLINK: if(blinker[BLINKER_IDX_LED].isOn) { user_pwm_setvalue(PWM_CH_LED_B, led_pwm_duty_now[2]); } else { user_pwm_setvalue(PWM_CH_LED_B, PWM_DUTY_OFF); } break; case LED_MOTION_BREATHE: user_pwm_setvalue(PWM_CH_LED_B, breathe_duty_now[2]); break; case LED_MOTION_OFF: default: user_pwm_setvalue(PWM_CH_LED_B, PWM_DUTY_OFF); break; } /* LED white process */ switch(Charger.led_W.motion) { case LED_MOTION_ON: user_pwm_setvalue(PWM_CH_LED_W, led_pwm_duty_now[3]); break; case LED_MOTION_BLINK: if(blinker[BLINKER_IDX_LED].isOn) { user_pwm_setvalue(PWM_CH_LED_W, led_pwm_duty_now[3]); } else { user_pwm_setvalue(PWM_CH_LED_W, PWM_DUTY_OFF); } break; case LED_MOTION_BREATHE: user_pwm_setvalue(PWM_CH_LED_W, breathe_duty_now[3]); break; case LED_MOTION_OFF: default: user_pwm_setvalue(PWM_CH_LED_W, PWM_DUTY_OFF); break; } #ifdef FUNC_AW48_NET_LED if (Charger.m_bModelNameAW48_1P) { //Net LED: Green switch (Charger.LedNet_G.motion) { case LED_MOTION_BREATHE: case LED_MOTION_ON: NETLED_SET_G(1); break; case LED_MOTION_BLINK: if(blinker[BLINKER_IDX_LED_NET].isOn) NETLED_SET_G(1); else NETLED_SET_G(0); break; case LED_MOTION_OFF: default: NETLED_SET_G(0); break; } //Net LED: Blue switch (Charger.LedNet_B.motion) { case LED_MOTION_BREATHE: case LED_MOTION_ON: NETLED_SET_B(1); break; case LED_MOTION_BLINK: if(blinker[BLINKER_IDX_LED_NET].isOn) NETLED_SET_B(1); else NETLED_SET_B(0); break; case LED_MOTION_OFF: default: NETLED_SET_B(0); break; } } #endif //FUNC_AW48_NET_LED /* LED breathe process */ if(flicker[FLICKER_IDX_BREATHE].isOn) HAL_GPIO_WritePin(OUT_LED_Breathe_GPIO_Port, OUT_LED_Breathe_Pin, GPIO_PIN_SET); else HAL_GPIO_WritePin(OUT_LED_Breathe_GPIO_Port, OUT_LED_Breathe_Pin, GPIO_PIN_RESET); /* Spearker process */ switch(Charger.speaker.motion) { case SPEAKER_LONG: timerEnable(TIMER_IDX_SPEAKER, 600); HAL_GPIO_WritePin(OUT_Speaker_GPIO_Port, OUT_Speaker_Pin, GPIO_PIN_SET); if(timer[TIMER_IDX_SPEAKER].isAlarm) { timerDisable(TIMER_IDX_SPEAKER); Charger.speaker.motion = SPEAKER_NONE; } break; case SPEAKER_SHORT: timerEnable(TIMER_IDX_SPEAKER, 200); HAL_GPIO_WritePin(OUT_Speaker_GPIO_Port, OUT_Speaker_Pin, GPIO_PIN_SET); if(timer[TIMER_IDX_SPEAKER].isAlarm) { timerDisable(TIMER_IDX_SPEAKER); Charger.speaker.motion = SPEAKER_NONE; } break; case SPEAKER_BLINK: if(blinker[BLINKER_IDX_SPEAKER].isOn) HAL_GPIO_WritePin(OUT_Speaker_GPIO_Port, OUT_Speaker_Pin, GPIO_PIN_SET); else HAL_GPIO_WritePin(OUT_Speaker_GPIO_Port, OUT_Speaker_Pin, GPIO_PIN_RESET); if(blinker[BLINKER_IDX_SPEAKER].blinkisFinish) { disblinkerTime(BLINKER_IDX_SPEAKER); } break; case SPEAKER_NONE: default: HAL_GPIO_WritePin(OUT_Speaker_GPIO_Port, OUT_Speaker_Pin, GPIO_PIN_RESET); break; } osDelay(1); } /* USER CODE END StartLedSpeakerTask */ } /* USER CODE BEGIN Header_StartCpTask */ #ifdef MODIFY_CP_TASK_CTRL_CP_PWM void CpTask_CtrlCpPwm_P0(void) { #ifdef FUNC_CCS //====================================================================== uint16_t MaxCurr = Charger.memory.EVSE_Config.data.item.MaxChargingCurrent; if (Charger.m_bRunCCS) //CCS Charge { user_pwm_setvalue(PWM_CH_CP, PWM_DUTY_5); Charger.MaxChargingCurrent_Previous = MaxCurr; } else //Normal Charge { #ifdef FUNC_MODIFY_CP_PWM_CTRL_20231225 if (Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_NO_CSU || Charger.m_bModelNameDC) { if ((MaxCurr >= 6) && (MaxCurr <= Charger.maxRatingCurrent)) { user_pwm_setvalue(PWM_CH_CP, GetCpPwmDuty(MaxCurr)); Charger.MaxChargingCurrent_Previous = MaxCurr; } else { user_pwm_setvalue(PWM_CH_CP, GetCpPwmDuty(Charger.maxRatingCurrent)); Charger.MaxChargingCurrent_Previous = Charger.maxRatingCurrent; } } else { if ((Charger.AC_MaxChargingCurrentOrDuty >= 6) && (Charger.AC_MaxChargingCurrentOrDuty <= Charger.maxRatingCurrent)) { user_pwm_setvalue(PWM_CH_CP, GetCpPwmDuty(Charger.AC_MaxChargingCurrentOrDuty)); } else { if (Charger.AC_MaxChargingCurrentOrDuty == 0) { user_pwm_setvalue(PWM_CH_CP, 0); } else if (Charger.AC_MaxChargingCurrentOrDuty == 1) { user_pwm_setvalue(PWM_CH_CP, 0); } else if (Charger.AC_MaxChargingCurrentOrDuty == 5) { user_pwm_setvalue(PWM_CH_CP, PWM_DUTY_5); } else if (Charger.AC_MaxChargingCurrentOrDuty == 100) { user_pwm_setvalue(PWM_CH_CP, PWM_DUTY_FULL); } else { user_pwm_setvalue(PWM_CH_CP, PWM_DUTY_FULL); } } Charger.MaxChargingCurrent_Previous = Charger.AC_MaxChargingCurrentOrDuty; } #else //FUNC_MODIFY_CP_PWM_CTRL_20231225 if ((MaxCurr >= 6) && (MaxCurr <= Charger.maxRatingCurrent)) { user_pwm_setvalue(PWM_CH_CP, GetCpPwmDuty(MaxCurr)); Charger.MaxChargingCurrent_Previous = MaxCurr; } else { user_pwm_setvalue(PWM_CH_CP, GetCpPwmDuty(Charger.maxRatingCurrent)); Charger.MaxChargingCurrent_Previous = Charger.maxRatingCurrent; } #endif //FUNC_MODIFY_CP_PWM_CTRL_20231225 } #else //FUNC_CCS //====================================================================== // uint16_t MaxCurr = Charger.memory.EVSE_Config.data.item.MaxChargingCurrent; // if (MaxCurr < 6) // { //#ifdef MODIFY_CP_TASK_CTRL_CP_PWM_BELOW_SIX // if (MaxCurr == 0) // { // user_pwm_setvalue(PWM_CH_CP, 0); // Charger.MaxChargingCurrent_Previous = MaxCurr; // } // else // { // user_pwm_setvalue(PWM_CH_CP, GetCpPwmDuty(6)); // Charger.MaxChargingCurrent_Previous = MaxCurr; // } //#else //MODIFY_CP_TASK_CTRL_CP_PWM_BELOW_SIX // user_pwm_setvalue(PWM_CH_CP, GetCpPwmDuty(6)); // Charger.MaxChargingCurrent_Previous = MaxCurr; //#endif //MODIFY_CP_TASK_CTRL_CP_PWM_BELOW_SIX // } // else if ((MaxCurr >= 6) && (MaxCurr <= Charger.maxRatingCurrent)) // { // user_pwm_setvalue(PWM_CH_CP, GetCpPwmDuty(MaxCurr)); // Charger.MaxChargingCurrent_Previous = MaxCurr; // } // else // { // user_pwm_setvalue(PWM_CH_CP, GetCpPwmDuty(Charger.maxRatingCurrent)); // Charger.MaxChargingCurrent_Previous = Charger.maxRatingCurrent; // } #endif //FUNC_CCS //====================================================================== } void CpTask_CtrlCpPwm_P1(void) { #ifdef FUNC_DETECT_PP if ( (Charger.m_bDetectPP && Charger.m_PPInfo.m_CurCurr != Charger.m_PPInfo.m_PreCurr) || ( (Charger.memory.EVSE_Config.data.item.MaxChargingCurrent != Charger.MaxChargingCurrent_Previous) && (Charger.memory.EVSE_Config.data.item.MaxChargingCurrent <= Charger.maxRatingCurrent) ) ) #else if ( (Charger.memory.EVSE_Config.data.item.MaxChargingCurrent != Charger.MaxChargingCurrent_Previous) && (Charger.memory.EVSE_Config.data.item.MaxChargingCurrent <= Charger.maxRatingCurrent) ) #endif { CpTask_CtrlCpPwm_P0(); } } #endif //MODIFY_CP_TASK_CTRL_CP_PWM #ifdef TRIM_CCID_SELFTEST void Proc_CCID_SelfTest(void) { // check Leak Module do CCID selftset. if (Charger.CCID_Module_Type == CCID_MODULE_CORMEX) { Charger.Test_LeakModuleisPass = Test_LeakModule(); } else if (Charger.CCID_Module_Type == CCID_MODULE_VAC) { Charger.Test_LeakModuleisPass = PASS; } else { DEBUG_INFO("Did not judge Leak module can't self test before charging.\r\n"); } XP("Proc CCID Self-Test(%d): %s\r\n", Charger.CCID_Module_Type, Charger.Test_LeakModuleisPass == PASS ? "OK" : "[NG]"); } #endif #ifdef FUNC_AUTO_MODIFY_CCID_MODULE uint8_t AutoModifyCCID(void) { uint8_t old = Charger.CCID_Module_Type; if (Test_LeakModule() == PASS) { Charger.m_bCCID_MustModify = HTK_FALSE; Charger.m_CCID_ModuleTestOK = Charger.CCID_Module_Type; return PASS; } else { Charger.CCID_Module_Type = (Charger.CCID_Module_Type == CCID_MODULE_CORMEX ? CCID_MODULE_VAC : CCID_MODULE_CORMEX); XP("#AutoModifyCCID: %s\r\n", CCID_MODULE_TYPE_STR); if (Test_LeakModule() == PASS) { Charger.m_bCCID_MustModify = HTK_TRUE; Charger.m_CCID_ModuleTestOK = Charger.CCID_Module_Type; return PASS; } else { Charger.m_bCCID_MustModify = HTK_FALSE; Charger.m_CCID_ModuleTestOK = CCID_MODULE_UNKNOW; Charger.CCID_Module_Type = old; return FAIL; } } } #endif #ifdef FUNC_AX32_USE_AS_1P_MODEL #ifdef MODIFY_AX32_RUN_3P_OR_1P_AUTOMATIC_AFTER_GC5 HTK_BOOL AX32_Is_3PModel_Run1P(void) { HTK_BOOL bRtn = HTK_FALSE; if (Charger.m_b3PhaseModel) { PMeterIC_ExtraInfo pEx = &Charger.m_MeterIcEx; int MaxVoltErr = 5000; //0.01V: 50V int MaxDegErr = 5; HTK_BOOL bCheckVolt3P = ( abs(Charger.Voltage[1] - Charger.Voltage[0]) < MaxVoltErr && abs(Charger.Voltage[2] - Charger.Voltage[0]) < MaxVoltErr && abs(Charger.Voltage[2] - Charger.Voltage[1]) < MaxVoltErr ); if (bCheckVolt3P) { //AC_PHASE_MODE_240_120_120_SEQ_OK(NG:Happen 1 times) if ( HTK_IS_BETWEEN_MIDDIFF(fabs(pEx->m_AngleDegree[0]), 240, MaxDegErr) && HTK_IS_BETWEEN_MIDDIFF(fabs(pEx->m_AngleDegree[1]), 120, MaxDegErr) && HTK_IS_BETWEEN_MIDDIFF(fabs(pEx->m_AngleDegree[2]), 120, MaxDegErr) ) { pEx->m_AcPhaseMode = AC_PHASE_MODE_240_120_120_SEQ_OK; } //AC_PHASE_MODE_120_120_240_SEQ_NG else if ( HTK_IS_BETWEEN_MIDDIFF(fabs(pEx->m_AngleDegree[0]), 120, MaxDegErr) && HTK_IS_BETWEEN_MIDDIFF(fabs(pEx->m_AngleDegree[1]), 120, MaxDegErr) && HTK_IS_BETWEEN_MIDDIFF(fabs(pEx->m_AngleDegree[2]), 240, MaxDegErr) ) { pEx->m_AcPhaseMode = AC_PHASE_MODE_120_120_240_SEQ_NG; } //AC_PHASE_MODE_360_360_360 (for RD test - L => L1, L2, L3) else if ( HTK_IS_BETWEEN_MIDDIFF(fabs(pEx->m_AngleDegree[0]), 360, MaxDegErr) && HTK_IS_BETWEEN_MIDDIFF(fabs(pEx->m_AngleDegree[1]), 360, MaxDegErr) && HTK_IS_BETWEEN_MIDDIFF(fabs(pEx->m_AngleDegree[2]), 360, MaxDegErr) ) { pEx->m_AcPhaseMode = AC_PHASE_MODE_360_360_360; } else { pEx->m_AcPhaseMode = AC_PHASE_MODE_UNKNOW; } } if (!bCheckVolt3P || pEx->m_AcPhaseMode == AC_PHASE_MODE_UNKNOW) { if ( (abs(Charger.Voltage[1] - Charger.Voltage[0]) < MaxVoltErr && abs(Charger.Voltage[2] - Charger.Voltage[0]) > MaxVoltErr) || (abs(Charger.Voltage[1] - Charger.Voltage[0]) > MaxVoltErr && abs(Charger.Voltage[2] - Charger.Voltage[0]) < MaxVoltErr) ) { //Conntect L1, L2 or L1, L3 ==> RUN 3P pEx->m_AcPhaseMode = AC_PHASE_MODE_UNKNOW; } else { pEx->m_AcPhaseMode = AC_PHASE_MODE_1P; } } if ( Charger.m_bModelNameAX32_3P #ifdef FUNC_AT32 || Charger.m_bModelNameAT32_3P #endif ) { #ifdef FUNC_AX32_AUTO_PHASE_WITHOUT_GENERATION_CODE if (pEx->m_AcPhaseMode == AC_PHASE_MODE_1P) { DEBUG_INFO("3P MODEL RUN 1P PROC \r\n"); bRtn = HTK_TRUE; } else { DEBUG_INFO("3P MODEL RUN 3P PROC \r\n"); } #else //FUNC_AX32_AUTO_PHASE_WITHOUT_GENERATION_CODE if (Charger.memory.EVSE_Config.data.item.ModelName[11] >= '0' && Charger.memory.EVSE_Config.data.item.ModelName[11] <= '4') { DEBUG_INFO("3P MODEL RUN 3P PROC (GEN_CODE == 0-4)\r\n"); } else { if (pEx->m_AcPhaseMode == AC_PHASE_MODE_1P) { DEBUG_INFO("3P MODEL RUN 1P PROC (GEN_CODE != 0-4 )\r\n"); bRtn = HTK_TRUE; } else { DEBUG_INFO("3P MODEL RUN 3P PROC (GEN_CODE != 0-4 )\r\n"); } } #endif //FUNC_AX32_AUTO_PHASE_WITHOUT_GENERATION_CODE } else if (Charger.m_bModelNameDC) { DEBUG_INFO("3P MODEL RUN 3P PROC (DC Model)\r\n"); } else { DEBUG_INFO("3P MODEL RUN 3P PROC\r\n"); } } return bRtn; } #endif //MODIFY_AX32_RUN_3P_OR_1P_AUTOMATIC_AFTER_GC5 #endif //FUNC_AX32_USE_AS_1P_MODEL //#ifdef FIXHW_AW48_CSU_EXIST_DELAY_CHECK //void AW48_CheckCSU(void) //{ // if (Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_NO_CSU) // { // if (IS_CSU_MOUNTED) // { // parseVersionInfoFromModelname(); //Update_McuCtrlMode() included // if (Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_CSU) // { // XP("\r\nAW48_CheckCSU() >>> MCU_CONTROL_MODE_CSU (%d sec)\r\n", (HAL_GetTick() - Charger.m_BootTick) / 1000 ); // setChargerMode(MODE_INITIAL); // } // } // } //} // //void AW48_WaitCSU(u32 MaxTick) //{ // XP("AW48_WaitCSU(): Begin\r\n"); // u32 TickBeg = HAL_GetTick(); // while (1) // { // HAL_IWDG_Refresh(&hiwdg); // osDelay(100); // if (IS_CSU_MOUNTED) // { // XP("AW48_WaitCSU(): End \r\n", (HAL_GetTick() - TickBeg) / 1000); //Test: 27s // AW48_CheckCSU(); // return; // } // // if (HTK_IsTimeout(TickBeg, MaxTick)) // { // XP("AW48_WaitCSU(): End \r\n", MaxTick / 1000); // return; // } // } //} // //#endif //FIXHW_AW48_CSU_EXIST_DELAY_CHECK /** * @brief Function implementing the cpTask thread. * @param argument: Not used * @retval None */ /* USER CODE END Header_StartCpTask */ void StartCpTask(void const * argument) { /* USER CODE BEGIN StartCpTask */ //ccp uint32_t duration_delta; Charger.Mode = MODE_INITIAL; Charger.Relay_Action=GPIO_RELAY_ACTION_OFF; setLedMotion(LED_ACTION_INIT); #ifdef FUNC_AW48_NET_LED if (Charger.m_bModelNameAW48_1P) { setNetLedMotion(Charger.am3352.NetLedActionState = NET_LED_ACTION_OFF); } #endif #ifdef FUNC_IDLE_UNTIL_READ_ALL_MEM IdleUntilReadAllMemory(); #endif //Check MCU control mode depend on GPIO state #ifdef FUNC_FORCE_RUN_CSU_MODE_WITH_DC_MODELNAME Update_McuCtrlMode(); #endif HAL_GPIO_WritePin(OUT_StateE_GPIO_Port, OUT_StateE_Pin, GPIO_PIN_RESET); #ifdef FUNC_AX32_TRIG_LEAKAGE if (Charger.m_b3PhaseModel) { TrigLeakage_Init(); } #endif #ifdef FUNC_AX80_ADD_TILT_SENSOR #ifdef FUNC_ADD_TILT_SENSOR_MODEL if (Charger.m_bUseTiltSensor) #else if (Charger.m_bModelNameAX80_1P) #endif { TILT_TrigLeakage_Init(); } #endif //FUNC_AX80_ADD_TILT_SENSOR /* Infinite loop */ for(;;) { if(Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_NO_CSU) { //=============================( MODIFY_CPTASK_TYPE_E )==============================[ NO CSU ] #ifdef MODIFY_CPTASK_HEAD Proc_CpTaskHead(HTK_FALSE); #endif switch(Charger.Mode) { case MODE_INITIAL: //=============================( MODIFY_CPTASK_TYPE_E / MODE_INITIAL ) setLedMotion(LED_ACTION_INIT); user_pwm_setvalue(PWM_CH_CP, PWM_DUTY_FULL); HAL_GPIO_WritePin(OUT_Leak_Test_GPIO_Port, OUT_Leak_Test_Pin, GPIO_PIN_SET); // for VAC LeakModule use if (Charger.ModelReadisOK ==PASS) { getRotarySwitchSetting( ); getGridTypeSwitchSetting( ); Charger.isTestLeakModule = ON ; #ifdef FUNC_AUTO_MODIFY_CCID_MODULE if (AutoModifyCCID() == PASS) #else if(Test_LeakModule() == PASS) #endif { DEBUG_INFO("Leak module self test pass when initial.\r\n"); osDelay(1000); if(Charger.isDebugEnable) setChargerMode(MODE_DEBUG); else { if(Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_NO_CSU){ // Cold load pick up check if((Charger.CP_State == SYSTEM_STATE_A) && Charger.memory.coldLoadPickUp.data.item.isEnable) { #ifndef FUNC_METER_IC_HISTORY recordChargingHis(OFF, END_STATUS_CODE_DROP); #endif Charger.memory.coldLoadPickUp.data.item.isEnable = OFF; Charger.memory.coldLoadPickUp.op_bits.update = ON; } } osDelay(5000) ; //wait hardware PE feedback data so delay some time //#ifdef FIXHW_AW48_CSU_EXIST_DELAY_CHECK // if (Charger.m_bModelNameAW48_1P) // { // AW48_WaitCSU(1000 * 30); // } //#endif setChargerMode(MODE_IDLE); } } else { Charger.Alarm_Code |= ALARM_LEAK_MODULE_FAIL; DEBUG_INFO("Leak module self test fail when initial.\r\n"); Charger.counter.LEAK_MODULE.isLatch = ON ; } Charger.isTestLeakModule = OFF ; } break; case MODE_IDLE: //=============================( MODIFY_CPTASK_TYPE_E / MODE_IDLE ) if(isModeChange()) { setLedMotion(LED_ACTION_IDLE); Charger.Relay_Action = GPIO_RELAY_ACTION_OFF; #ifdef MODIFY_CPTASK_TYPE_E Charger.SE_Relay_Action = GPIO_SE_RELAY_ACTION_OFF; Charger.m_OutpMode = OUTPMODE_NONE; #endif Charger.memory.EVSE_Config.data.item.MaxChargingCurrent = Charger.maxRatingCurrent; #ifdef MODIFY_AC_EVSE_STATUS_MAX_CHARGING_CURRENT_VARIABLE Charger.AC_MaxChargingCurrentOrDuty = Charger.maxRatingCurrent; #endif user_pwm_setvalue(PWM_CH_CP, PWM_DUTY_FULL); Charger.isSetStartTime = ON ; Charger.isOnSocketE = OFF; #ifdef FUNC_CCS Charger.m_bRunCCS = 0; Charger.m_bGotCsuCpDutyCmd = 0; #ifdef MODIFY_GOT_CSU_DUTY_CMD_PROCESS Charger.m_bPassGotCsuCpDutyCmd = 0; #endif #endif //FUNC_CCS #ifdef MODIFY_GUN_LOCK_SPEC_TIMES_TO_ALARM if (Charger.m_bUseGunLock) { Charger.m_GunLock_Counter = 0; Charger.m_GunUnlock_Counter = 0; } #endif #ifdef FUNC_PTB_METER_WM3M4C if (Charger.m_pWM3M4C != NULL) { if (Charger.m_pWM3M4C->m_bCharging) { Charger.m_pWM3M4C->m_bTrigEndCharge = HTK_TRUE; } } #endif #ifdef FUNC_AX32_USE_AS_1P_MODEL Charger.m_b3PhaseModelButUse1PhaseOnly = AX32_Is_3PModel_Run1P(); #endif } if (Charger.memory.EVSE_Config.data.item.AuthMode == AUTH_MODE_OCPP) { if( Charger.memory.coldLoadPickUp.data.item.isEnable || Charger.rfid.op_bits.reqStart) { osDelay(LED_RFID_TIME); // for Buzzer and RFID /Fail LED use setLedMotion(LED_ACTION_AUTHED); // Check start method type memset(&Charger.cycle_info.userId[0], 0x00, ARRAY_SIZE(Charger.cycle_info.userId)); if(Charger.rfid.op_bits.reqStart) { Charger.cycle_info.StartType = START_METHOD_RFID; memcpy(&Charger.cycle_info.userId[0], &Charger.rfid.currentCard[0], ARRAY_SIZE(Charger.rfid.currentCard)); Charger.istoHandShakeMode = ON ; } Charger.rfid.op_bits.reqStart = OFF; if(Charger.memory.coldLoadPickUp.data.item.isEnable) { Charger.memory.coldLoadPickUp.data.item.isEnable = OFF; Charger.memory.coldLoadPickUp.op_bits.update = ON; DEBUG_INFO("coldLoadPickUp ON to rand wait sec.\r\n"); #ifdef MODIFY_COLD_LOAD_PICKUP_DELAY ColdLoadPickup_Delay("coldLoadPickUp ON to rand wait sec."); #else osDelay((rand()%175000)+5000); //osDelay((rand()%5000)+5000); #endif Charger.istoHandShakeMode = ON ; } } if (Charger.istoHandShakeMode == ON) //charger can to HandShakeMode { if ( (Charger.CP_State == SYSTEM_STATE_B) || (Charger.CP_State == SYSTEM_STATE_C) || #ifdef MODIFY_CPTASK_TYPE_E ((Charger.CP_State == SYSTEM_STATE_A) || IsTypeEPlugIn()) #else //HAL_GPIO_ReadPin(IN_SocketE_Detect_GPIO_Port, IN_SocketE_Detect_Pin) #endif ) { #ifdef MODIFY_CPTASK_TYPE_E if (Charger.CP_State == SYSTEM_STATE_B || Charger.CP_State == SYSTEM_STATE_C) { Charger.m_OutpMode = OUTPMODE_CPGUN; } else if ((Charger.CP_State == SYSTEM_STATE_A) || IsTypeEPlugIn()) { Charger.m_OutpMode = OUTPMODE_TYPEE; } #endif timerDisable(TIMER_IDX_CP); Charger.istoHandShakeMode = OFF ; setChargerMode(MODE_HANDSHAKE); } else { timerEnable(TIMER_IDX_CP, 180000); } } } else if (Charger.memory.EVSE_Config.data.item.AuthMode == AUTH_MODE_FREE) { if ( (Charger.CP_State == SYSTEM_STATE_B) || (Charger.CP_State == SYSTEM_STATE_C) || #ifdef MODIFY_CPTASK_TYPE_E (Charger.CP_State == SYSTEM_STATE_A && IsTypeEPlugIn()) || #endif Charger.memory.coldLoadPickUp.data.item.isEnable ) { setLedMotion(LED_ACTION_AUTHED); // Check start method type memset(&Charger.cycle_info.userId[0], 0x00, ARRAY_SIZE(Charger.cycle_info.userId)); if(Charger.rfid.op_bits.reqStart) { Charger.cycle_info.StartType = START_METHOD_RFID; memcpy(&Charger.cycle_info.userId[0], &Charger.rfid.currentCard[0], ARRAY_SIZE(Charger.rfid.currentCard)); } else { #ifdef MODIFY_CPTASK_TYPE_E if (Charger.CP_State == SYSTEM_STATE_B || Charger.CP_State == SYSTEM_STATE_C || Charger.memory.coldLoadPickUp.data.item.isEnable) { Charger.cycle_info.StartType = START_METHOD_CP; Charger.m_OutpMode = OUTPMODE_CPGUN; } else if (Charger.CP_State == SYSTEM_STATE_A && IsTypeEPlugIn()) { Charger.cycle_info.StartType = START_METHOD_TYPEE; Charger.m_OutpMode = OUTPMODE_TYPEE; } #else Charger.cycle_info.StartType = START_METHOD_CP; #endif //MODIFY_CPTASK_TYPE_E } Charger.ble.isRequestOn = OFF; Charger.rfid.op_bits.reqStart = OFF; if(Charger.memory.coldLoadPickUp.data.item.isEnable) { Charger.memory.coldLoadPickUp.data.item.isEnable = OFF; Charger.memory.coldLoadPickUp.op_bits.update = ON; DEBUG_INFO("coldLoadPickUp ON to rand wait sec.\r\n"); #ifdef MODIFY_COLD_LOAD_PICKUP_DELAY ColdLoadPickup_Delay("coldLoadPickUp ON to rand wait sec."); #else osDelay((rand()%175000)+5000); #endif } setChargerMode(MODE_HANDSHAKE); } } break; case MODE_HANDSHAKE: //=============================( MODIFY_CPTASK_TYPE_E / MODE_HANDSHAKE ) if(isModeChange()) { Charger.isCP_in_B = OFF ; Charger.isTestLeakModule = ON ; #ifdef TRIM_CCID_SELFTEST Proc_CCID_SelfTest(); #endif //check Leak test pass if (Charger.Test_LeakModuleisPass) { #ifdef MODIFY_CP_TASK_CTRL_CP_PWM CpTask_CtrlCpPwm_P0(); #endif DEBUG_INFO("Leak module self test pass before charging.\r\n"); } else { Charger.Alarm_Code |= ALARM_LEAK_MODULE_FAIL; DEBUG_INFO("Leak module self test fail before charging.\r\n"); Charger.counter.LEAK_MODULE.retry ++ ; if (Charger.counter.LEAK_MODULE.retry >=2) { Charger.counter.LEAK_MODULE.isLatch = ON ; } } osDelay(300); Charger.isTestLeakModule = OFF ; } // to chaging moder if(Charger.CP_State == SYSTEM_STATE_C) { #ifdef MODIFY_CPTASK_TYPE_E Charger.m_OutpMode = OUTPMODE_CPGUN; #endif setChargerMode(MODE_CHARGING); if (Charger.isSetStartTime == ON) { Charger.cycle_info.startTimeTick = HAL_GetTick(); Charger.cycle_info.startDateTime.year = Charger.memory.EVSE_Config.data.item.SystemDateTime.year; Charger.cycle_info.startDateTime.month = Charger.memory.EVSE_Config.data.item.SystemDateTime.month; Charger.cycle_info.startDateTime.day = Charger.memory.EVSE_Config.data.item.SystemDateTime.day; Charger.cycle_info.startDateTime.hour = Charger.memory.EVSE_Config.data.item.SystemDateTime.hour; Charger.cycle_info.startDateTime.min = Charger.memory.EVSE_Config.data.item.SystemDateTime.min; Charger.cycle_info.startDateTime.sec = Charger.memory.EVSE_Config.data.item.SystemDateTime.sec; Charger.cycle_info.meterStart = Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_Total; } } /* * TODO: * 1. Check socket-E detect pin to determine charging mdoe */ #ifdef MODIFY_CPTASK_TYPE_E if (Charger.CP_State == SYSTEM_STATE_A && IsTypeEPlugIn()) #else //if((Charger.CP_State == SYSTEM_STATE_A) && HAL_GPIO_ReadPin(IN_SocketE_Detect_GPIO_Port, IN_SocketE_Detect_Pin)) #endif { Charger.isOnSocketE = ON; #ifdef MODIFY_CPTASK_TYPE_E Charger.m_OutpMode = OUTPMODE_TYPEE; user_pwm_setvalue(PWM_CH_CP, PWM_DUTY_FULL); #endif setChargerMode(MODE_CHARGING); if (Charger.isSetStartTime == ON) { Charger.cycle_info.startTimeTick = HAL_GetTick(); Charger.cycle_info.startDateTime.year = Charger.memory.EVSE_Config.data.item.SystemDateTime.year; Charger.cycle_info.startDateTime.month = Charger.memory.EVSE_Config.data.item.SystemDateTime.month; Charger.cycle_info.startDateTime.day = Charger.memory.EVSE_Config.data.item.SystemDateTime.day; Charger.cycle_info.startDateTime.hour = Charger.memory.EVSE_Config.data.item.SystemDateTime.hour; Charger.cycle_info.startDateTime.min = Charger.memory.EVSE_Config.data.item.SystemDateTime.min; Charger.cycle_info.startDateTime.sec = Charger.memory.EVSE_Config.data.item.SystemDateTime.sec; Charger.cycle_info.meterStart = Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_Total; } } if(Charger.CP_State == SYSTEM_STATE_B) { Charger.isCP_in_B = ON ; setLedMotion(LED_ACTION_CONNECTED); } //RFID remove gun if ((Charger.cycle_info.StartType == START_METHOD_RFID) && (Charger.CP_State == SYSTEM_STATE_A) && (Charger.isCP_in_B == ON)) { Charger.isCP_in_B = OFF ; setChargerMode(MODE_IDLE); } //FREE remove gun if ((Charger.cycle_info.StartType == START_METHOD_CP) && Charger.CP_State == SYSTEM_STATE_A) { setChargerMode(MODE_IDLE); } #ifdef MODIFY_CPTASK_TYPE_E //Type E remove plug if ((Charger.cycle_info.StartType == START_METHOD_TYPEE) && !IsTypeEPlugIn()) { setChargerMode(MODE_IDLE); } #endif break; case MODE_CHARGING: //=============================( MODIFY_CPTASK_TYPE_E / MODE_CHARGING ) if(isModeChange()) { #ifdef MODIFY_CPTASK_CSU_0_1_CHARGE_MODE CpTask_CtrlCpPwm_P0(); #endif setLedMotion(LED_ACTION_CHARGING); #ifdef FUNC_PTB_METER_WM3M4C if (Charger.m_pWM3M4C != NULL) { Charger.m_pWM3M4C->m_bTrigBegCharge = HTK_TRUE; } #endif } if ( #ifdef MODIFY_AW_CP_TASK_CSU_0_1_CHARGING_MODE_STOP_WITHOUT_STATE_C (!Charger.isOnSocketE && Charger.CP_State!=SYSTEM_STATE_C) || #else ((!Charger.isOnSocketE && Charger.CP_State!=SYSTEM_STATE_C) && (Charger.CP_State != SYSTEM_STATE_UNKNOWN)) || #endif #ifdef MODIFY_CPTASK_TYPE_E ((Charger.isOnSocketE) && !IsTypeEPlugIn()) || #else //((Charger.isOnSocketE) && !HAL_GPIO_ReadPin(IN_SocketE_Detect_GPIO_Port, IN_SocketE_Detect_Pin)) || #endif ((Charger.memory.EVSE_Config.data.item.AuthMode == AUTH_MODE_OCPP)?Charger.rfid.op_bits.reqStop:0) ) { setChargerMode(MODE_STOP); Charger.Relay_Action = GPIO_RELAY_ACTION_OFF; #ifdef MODIFY_CPTASK_TYPE_E Charger.SE_Relay_Action = GPIO_SE_RELAY_ACTION_OFF; #endif } else { #ifdef MODIFY_CPTASK_TYPE_E if (Charger.m_OutpMode == OUTPMODE_CPGUN && Charger.CP_State == SYSTEM_STATE_C) { Charger.Relay_Action = GPIO_RELAY_ACTION_ON; } else if (Charger.m_OutpMode == OUTPMODE_TYPEE && Charger.isOnSocketE && IsTypeEPlugIn()) { Charger.SE_Relay_Action = GPIO_SE_RELAY_ACTION_ON; } #else Charger.Relay_Action = GPIO_RELAY_ACTION_ON; #endif duration_delta = (HAL_GetTick() - Charger.cycle_info.startTimeTick); Charger.cycle_info.Duration = duration_delta; Charger.cycle_info.Power_Consumption = Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_Total - Charger.cycle_info.meterStart; #ifdef MODIFY_CP_TASK_CTRL_CP_PWM CpTask_CtrlCpPwm_P1(); #endif } break; case MODE_STOP: //=============================( MODIFY_CPTASK_TYPE_E / MODE_STOP ) if(isModeChange()) { if ((Charger.memory.EVSE_Config.data.item.AuthMode == AUTH_MODE_OCPP) && Charger.rfid.op_bits.reqStop) { osDelay(LED_RFID_TIME); // for Buzzer and RFID /Fail LED use } setLedMotion(LED_ACTION_STOP); Charger.isCP_in_B = OFF ; Charger.is_RFIDKeepCharger = ON ; Charger.isSetStartTime = OFF ; } if (Charger.memory.EVSE_Config.data.item.AuthMode == AUTH_MODE_OCPP) { //GB if(Charger.CP_State == SYSTEM_STATE_A) { Charger.cycle_info.endTimeTick = HAL_GetTick(); #ifndef FUNC_METER_IC_HISTORY recordChargingHis(OFF, END_STATUS_CODE_NORMAL); #endif Charger.rfid.op_bits.reqStop = OFF; setChargerMode(MODE_IDLE); Charger.Relay_Action = GPIO_RELAY_ACTION_OFF; timerDisable(TIMER_IDX_RFID_RELAY_OFF); Charger.isCP_in_B = OFF ; Charger.is_RFIDKeepCharger = OFF ; Charger.cycle_info.StartType = START_METHOD_NONE; } else { //rfid close PWM and relay if ((Charger.rfid.op_bits.reqStop == ON)&&Charger.cycle_info.StartType == START_METHOD_RFID) { Charger.rfid.op_bits.reqStop = OFF; user_pwm_setvalue(PWM_CH_CP, PWM_DUTY_FULL); // close pwm timerEnable( TIMER_IDX_RFID_RELAY_OFF, 3000); //is set wait 3 sec Charger.is_RFIDKeepCharger = OFF ; } if (timer[TIMER_IDX_RFID_RELAY_OFF].isAlarm == ON) //is wait 3 sec { timerDisable(TIMER_IDX_RFID_RELAY_OFF); Charger.Relay_Action = GPIO_RELAY_ACTION_OFF; #ifdef MODIFY_CPTASK_TYPE_E Charger.SE_Relay_Action = GPIO_SE_RELAY_ACTION_OFF; #endif setChargerMode(MODE_IDLE); Charger.cycle_info.StartType = START_METHOD_NONE; } //cp close or open PWM if((Charger.CP_State == SYSTEM_STATE_B)) { timerDisable(TIMER_IDX_RFID_RELAY_OFF); Charger.Relay_Action = GPIO_RELAY_ACTION_OFF; #ifdef MODIFY_CPTASK_TYPE_E Charger.SE_Relay_Action = GPIO_SE_RELAY_ACTION_OFF; #endif Charger.isCP_in_B = ON ; } else if (Charger.CP_State == SYSTEM_STATE_C ) { if ( Charger.isCP_in_B == ON && Charger.is_RFIDKeepCharger == ON) { Charger.is_RFIDKeepCharger = OFF ; Charger.isCP_in_B = OFF ; Charger.isTestLeakModule = ON ; #ifdef TRIM_CCID_SELFTEST Proc_CCID_SelfTest(); #endif //check Leak test pass if (Charger.Test_LeakModuleisPass) { timerEnable(TIMER_IDX_CP, 180000); #ifdef MODIFY_CP_TASK_CTRL_CP_PWM CpTask_CtrlCpPwm_P0(); #endif setChargerMode(MODE_CHARGING); DEBUG_INFO("Leak module self test pass before charging.\r\n"); } else { Charger.Alarm_Code |= ALARM_LEAK_MODULE_FAIL; DEBUG_INFO("Leak module self test fail before charging.\r\n"); Charger.counter.LEAK_MODULE.retry ++ ; if (Charger.counter.LEAK_MODULE.retry >=2) { Charger.counter.LEAK_MODULE.isLatch = ON ; } } osDelay(300); Charger.isTestLeakModule = OFF ; } } } } else if (Charger.memory.EVSE_Config.data.item.AuthMode == AUTH_MODE_FREE) { if (Charger.CP_State == SYSTEM_STATE_A) { Charger.cycle_info.endTimeTick = HAL_GetTick(); #ifndef FUNC_METER_IC_HISTORY recordChargingHis(OFF, END_STATUS_CODE_NORMAL); #endif Charger.ble.isRequestOff = OFF; Charger.rfid.op_bits.reqStop = OFF; setChargerMode(MODE_IDLE); } else { if (Charger.CP_State == SYSTEM_STATE_B) { Charger.isCP_in_B = ON ; } if((Charger.CP_State == SYSTEM_STATE_C)) { setChargerMode(MODE_CHARGING); } } } break; case MODE_ALARM: //=============================( MODIFY_CPTASK_TYPE_E / MODE_ALARM ) if(isModeChange()) { Charger.isSetStartTime = OFF ; //clear blink time , Prevent red light from being snatched by others disblinkerTime (BLINKER_IDX_LED) ; } Charger.Relay_Action = GPIO_RELAY_ACTION_OFF; #ifdef MODIFY_CPTASK_TYPE_E Charger.SE_Relay_Action = GPIO_SE_RELAY_ACTION_OFF; #endif //Set alarm led if ((Charger.Alarm_Code != Charger.Alarm_Code_before) && (blinker[BLINKER_IDX_LED].blinkisFinish)) { setLedMotion(LED_ACTION_ALARM); Charger.Alarm_Code_before = Charger.Alarm_Code ; } #ifdef FUNC_MODE_ALARM_TO_MODE_DEBUG if (Charger.isDebugEnable && Charger.Alarm_Code == 0) { setChargerMode(MODE_DEBUG); } else #endif if(Charger.Alarm_Code == 0x00) { Charger.Alarm_Code_before = Charger.Alarm_Code ; if (Charger.Mode_Before_Alarm == MODE_CHARGING) // in charging mode { if(Charger.CP_State == SYSTEM_STATE_A) // to idle { Charger.cycle_info.endTimeTick = HAL_GetTick(); #ifndef FUNC_METER_IC_HISTORY recordChargingHis(OFF, END_STATUS_CODE_NORMAL); #endif Charger.rfid.op_bits.reqStop = OFF; Charger.ble.isRequestOff = OFF; setChargerMode(MODE_IDLE); Charger.Relay_Action = GPIO_RELAY_ACTION_OFF; #ifdef MODIFY_CPTASK_TYPE_E Charger.SE_Relay_Action = GPIO_SE_RELAY_ACTION_OFF; #endif timerDisable(TIMER_IDX_RFID_RELAY_OFF); Charger.isCP_in_B = OFF ; Charger.is_RFIDKeepCharger = OFF ; Charger.cycle_info.StartType = START_METHOD_NONE; } else // to handshake { setChargerMode(MODE_HANDSHAKE); Charger.isCP_in_B = ON ; setLedMotion(LED_ACTION_CONNECTED); } } else if(Charger.Mode_Before_Alarm == MODE_STOP) // in stop mode { if(Charger.CP_State == SYSTEM_STATE_A) // to idle { Charger.cycle_info.endTimeTick = HAL_GetTick(); #ifndef FUNC_METER_IC_HISTORY recordChargingHis(OFF, END_STATUS_CODE_NORMAL); #endif Charger.rfid.op_bits.reqStop = OFF; setChargerMode(MODE_IDLE); Charger.Relay_Action = GPIO_RELAY_ACTION_OFF; #ifdef MODIFY_CPTASK_TYPE_E Charger.SE_Relay_Action = GPIO_SE_RELAY_ACTION_OFF; #endif timerDisable(TIMER_IDX_RFID_RELAY_OFF); Charger.isCP_in_B = OFF ; Charger.is_RFIDKeepCharger = OFF ; Charger.cycle_info.StartType = START_METHOD_NONE; } else if ((Charger.CP_State == SYSTEM_STATE_B) && (Charger.memory.EVSE_Config.data.item.AuthMode == AUTH_MODE_OCPP)) // OCPP { if ( ( ((Charger.cycle_info.StartType == START_METHOD_BLE) && (Charger.is_BLEKeepCharger == ON))|| // to handshake ((Charger.cycle_info.StartType == START_METHOD_RFID) && (Charger.is_RFIDKeepCharger == ON)) ) && ( Charger.isCP_in_B == ON ) ) { setChargerMode(MODE_HANDSHAKE); setLedMotion(LED_ACTION_CONNECTED); } else //to stop { setChargerMode(MODE_STOP); } } else if ((Charger.CP_State == SYSTEM_STATE_B) && (Charger.memory.EVSE_Config.data.item.AuthMode == AUTH_MODE_FREE)) //Free { if ( Charger.isCP_in_B == ON ) // to handshake { setChargerMode(MODE_HANDSHAKE); setLedMotion(LED_ACTION_CONNECTED); } else //to stop { setChargerMode(MODE_STOP); } } else //to stop { setChargerMode(MODE_STOP); } } else // idle { if(timer[TIMER_IDX_STATE_E].isAlarm == ON) { setChargerMode(MODE_IDLE); } } } break; case MODE_MAINTAIN: //=============================( MODIFY_CPTASK_TYPE_E / MODE_MAINTAIN ) if(isModeChange()) {} break; case MODE_DEBUG: //=============================( MODIFY_CPTASK_TYPE_E / MODE_DEBUG ) #ifdef FUNC_MODE_DEBUG_RELAY_ON_OFF_TEST_FOR_PHN_QE if(isModeChange()) { setLedMotion(LED_ACTION_DEBUG); #ifdef FUNC_MODE_DEBUG_RELAY_ON_OFF_DIFF_SEC timerEnable(TIMER_IDX_DEBUG, FUNC_MODE_DEBUG_RELAY_ON_SEC * 1000); #else timerEnable(TIMER_IDX_DEBUG, 2000); #endif } if (timer[TIMER_IDX_DEBUG].isAlarm && Charger.Alarm_Code == 0 && Charger.CP_State == SYSTEM_STATE_C) { if (Charger.Relay_Action == GPIO_RELAY_ACTION_ON) { Charger.Relay_Action = GPIO_RELAY_ACTION_OFF; #ifdef FUNC_MODE_DEBUG_RELAY_ON_OFF_DIFF_SEC timerRefresh(TIMER_IDX_DEBUG); timerEnable(TIMER_IDX_DEBUG, FUNC_MODE_DEBUG_RELAY_OFF_SEC * 1000); #else timerRefresh(TIMER_IDX_DEBUG); #endif } else if (Charger.Relay_Action == GPIO_RELAY_ACTION_OFF) { Charger.Relay_Action = GPIO_RELAY_ACTION_ON; #ifdef FUNC_MODE_DEBUG_REC_RELAY_ON_TIMES Charger.memory.EVSE_Config.data.item.m_ModeDebugRelayOnTimes++; Charger.memory.EVSE_Config.op_bits.update = ON; #endif #ifdef FUNC_MODE_DEBUG_RELAY_ON_OFF_DIFF_SEC timerRefresh(TIMER_IDX_DEBUG); timerEnable(TIMER_IDX_DEBUG, FUNC_MODE_DEBUG_RELAY_ON_SEC * 1000); #else timerRefresh(TIMER_IDX_DEBUG); #endif } } #else //FUNC_MODE_DEBUG_RELAY_ON_OFF_TEST_FOR_PHN_QE if(isModeChange()) { setLedMotion(LED_ACTION_DEBUG); Charger.Relay_Action = GPIO_RELAY_ACTION_ON; timerEnable(TIMER_IDX_DEBUG, 1000); } if(timer[TIMER_IDX_DEBUG].isAlarm || (Charger.Alarm_Code>0)) { Charger.Relay_Action = GPIO_RELAY_ACTION_OFF; #ifdef MODIFY_CPTASK_TYPE_E Charger.SE_Relay_Action = GPIO_SE_RELAY_ACTION_OFF; #endif Charger.isDebugModeCPtest = ON; } if(Charger.isDebugModeCPtest) { if(Charger.CP_State == SYSTEM_STATE_A) { Charger.Relay_Action = GPIO_RELAY_ACTION_OFF; #ifdef MODIFY_CPTASK_TYPE_E Charger.SE_Relay_Action = GPIO_SE_RELAY_ACTION_OFF; #endif Charger.memory.EVSE_Config.data.item.MaxChargingCurrent = Charger.maxRatingCurrent; #ifdef MODIFY_AC_EVSE_STATUS_MAX_CHARGING_CURRENT_VARIABLE Charger.AC_MaxChargingCurrentOrDuty = Charger.maxRatingCurrent; #endif user_pwm_setvalue(PWM_CH_CP, PWM_DUTY_FULL); } else if (Charger.CP_State == SYSTEM_STATE_B) { Charger.Relay_Action = GPIO_RELAY_ACTION_OFF; #ifdef MODIFY_CPTASK_TYPE_E Charger.SE_Relay_Action = GPIO_SE_RELAY_ACTION_OFF; #endif #ifdef MODIFY_CP_TASK_CTRL_CP_PWM CpTask_CtrlCpPwm_P1(); #endif } else if (Charger.CP_State == SYSTEM_STATE_C) { Charger.Relay_Action = GPIO_RELAY_ACTION_ON; #ifdef MODIFY_CP_TASK_CTRL_CP_PWM CpTask_CtrlCpPwm_P1(); #endif } } #endif //FUNC_MODE_DEBUG_RELAY_ON_OFF_TEST_FOR_PHN_QE break; } } else if (Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_CSU) { //=============================( MODIFY_CPTASK_TYPE_E )==============================[ WITH CSU ] /* MCU control mdoe with CSU */ if (!Charger.am3352.isRequestOn) { #ifdef FUNC_MODE_DEBUG_RELAY_ON_OFF_TEST_FOR_PHN_QE if (Charger.Mode != MODE_DEBUG) { Charger.Relay_Action = GPIO_RELAY_ACTION_OFF; } #else Charger.Relay_Action = GPIO_RELAY_ACTION_OFF; #endif //FUNC_MODE_DEBUG_RELAY_ON_OFF_TEST_FOR_PHN_QE } #ifdef MODIFY_CPTASK_HEAD Proc_CpTaskHead(HTK_TRUE); #endif switch(Charger.Mode) { case MODE_INITIAL: //=============================( MODIFY_CPTASK_TYPE_E / MODE_INITIAL ) setLedMotion(LED_ACTION_INIT); user_pwm_setvalue(PWM_CH_CP, PWM_DUTY_FULL); HAL_GPIO_WritePin(OUT_Leak_Test_GPIO_Port, OUT_Leak_Test_Pin, GPIO_PIN_SET); // for VAC LeakModule use #ifdef FUNC_RELAY_OFF_WHEN_CSU_CMD_TIMEOUT Charger.m_CSU_RxTick = HAL_GetTick(); #endif if (Charger.ModelReadisOK ==PASS) { getRotarySwitchSetting( ); getGridTypeSwitchSetting( ); Charger.isTestLeakModule = ON ; #ifdef FUNC_AUTO_MODIFY_CCID_MODULE if (AutoModifyCCID() == PASS) #else if(Test_LeakModule() == PASS) #endif { DEBUG_INFO("Leak module self test pass when initial.\r\n"); osDelay(1000); if(Charger.isDebugEnable) setChargerMode(MODE_DEBUG); else { setChargerMode(MODE_IDLE); if(Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_NO_CSU){ // Cold load pick up check if((Charger.CP_State == SYSTEM_STATE_A) && Charger.memory.coldLoadPickUp.data.item.isEnable) { #ifndef FUNC_METER_IC_HISTORY recordChargingHis(OFF, END_STATUS_CODE_DROP); #endif Charger.memory.coldLoadPickUp.data.item.isEnable = OFF; Charger.memory.coldLoadPickUp.op_bits.update = ON; } } } } else { Charger.Alarm_Code |= ALARM_LEAK_MODULE_FAIL; DEBUG_INFO("Leak module self test fail when initial.\r\n"); Charger.counter.LEAK_MODULE.isLatch = ON ; } Charger.isTestLeakModule = OFF ; } break; case MODE_IDLE: //=============================( MODIFY_CPTASK_TYPE_E / MODE_IDLE ) if(isModeChange()) { Charger.Relay_Action = GPIO_RELAY_ACTION_OFF; #ifdef MODIFY_SOCKET_E_OCP_USE_MAX_CHARGING_CURRENT Charger.memory.EVSE_Config.data.item.MaxChargingCurrent = Charger.maxRatingCurrent; #else //Charger.memory.EVSE_Config.data.item.MaxChargingCurrent = Charger.maxRatingCurrent; //need CSU command change #endif user_pwm_setvalue(PWM_CH_CP, PWM_DUTY_FULL); Charger.isSetStartTime = ON ; Charger.isOnSocketE = OFF; #ifdef FUNC_BLOCK_CSU_CONFIG_CP_PWM_DUTY Charger.m_bBlockCsuCpPwmDuty = HTK_DISABLE; #endif #ifdef FUNC_CCS Charger.m_bRunCCS = 0; Charger.m_bGotCsuCpDutyCmd = 0; #ifdef MODIFY_GOT_CSU_DUTY_CMD_PROCESS Charger.m_bPassGotCsuCpDutyCmd = 0; #endif #endif //FUNC_CCS #ifdef MODIFY_GUN_LOCK_SPEC_TIMES_TO_ALARM if (Charger.m_bUseGunLock) { Charger.m_GunLock_Counter = 0; Charger.m_GunUnlock_Counter = 0; } #endif #ifdef FUNC_AX32_USE_AS_1P_MODEL Charger.m_b3PhaseModelButUse1PhaseOnly = AX32_Is_3PModel_Run1P(); #endif #ifdef FUNC_SYSTEM_KEEP_INFO if (g_SystemKeepInfo.m_bUsed == HTK_TRUE) { g_SystemKeepInfo.m_bUsed = HTK_FALSE; } #endif } #ifdef FUNC_SYSTEM_KEEP_INFO if ( (Charger.CP_State != SYSTEM_STATE_A) || ( (Charger.CP_State == SYSTEM_STATE_A) && IsTypeEPlugIn() ) ) { if (g_SystemKeepInfo.m_bUsed == HTK_FALSE) { g_SystemKeepInfo.m_bUsed = HTK_TRUE; if (SystemKeepInfo_Check(&g_SystemKeepInfo)) { if (g_SystemKeepInfo.m_CsuIsRequestOn) { Charger.am3352.isRequestOn = g_SystemKeepInfo.m_CsuIsRequestOn; user_pwm_setvalue(PWM_CH_CP, g_SystemKeepInfo.m_CpPwmVal); Charger.m_bGotCsuCpDutyCmd = 1; DEBUG_INFO("# CP_PWM => %d\r\n", g_SystemKeepInfo.m_CpPwmVal); SystemKeepInfo_Display(&g_SystemKeepInfo); } } } } #endif //FUNC_SYSTEM_KEEP_INFO if (Charger.am3352.isRequestOn && #ifdef FUNC_CCS #ifdef MODIFY_GOT_CSU_DUTY_CMD_PROCESS (Charger.m_bGotCsuCpDutyCmd == 1 || Charger.m_bPassGotCsuCpDutyCmd == 1) && #else Charger.m_bGotCsuCpDutyCmd == 1 && #endif #endif //FUNC_CCS (Charger.CP_State != SYSTEM_STATE_A)) { setChargerMode(MODE_HANDSHAKE); } #ifdef MODIFY_CPTASK_TYPE_E if ( (Charger.am3352.isRequestOn) && (Charger.CP_State == SYSTEM_STATE_A && IsTypeEPlugIn()) ) { setChargerMode(MODE_HANDSHAKE); } #endif break; case MODE_HANDSHAKE: //=============================( MODIFY_CPTASK_TYPE_E / MODE_HANDSHAKE ) if(isModeChange()) { Charger.isCP_in_B = OFF ; Charger.isTestLeakModule = ON ; #ifdef TRIM_CCID_SELFTEST Proc_CCID_SelfTest(); #endif //check Leak test pass if (Charger.Test_LeakModuleisPass) { #ifdef MODIFY_CP_TASK_CTRL_CP_PWM #ifdef MODIFY_MODE_HANDSHAKE_STOP_PWM_WITHOUT_OK_STATE if (Charger.m_bSafetyRegulationGB) { if(Charger.CP_State == SYSTEM_STATE_B || Charger.CP_State == SYSTEM_STATE_C) { CpTask_CtrlCpPwm_P0(); } } else { CpTask_CtrlCpPwm_P0(); } #endif //MODIFY_MODE_HANDSHAKE_STOP_PWM_WITHOUT_OK_STATE #else //MODIFY_CP_TASK_CTRL_CP_PWM CpTask_CtrlCpPwm_P0(); #endif //MODIFY_CP_TASK_CTRL_CP_PWM osDelay(300); DEBUG_INFO("Leak module self test pass before charging.\r\n"); } else { Charger.Alarm_Code |= ALARM_LEAK_MODULE_FAIL; DEBUG_INFO("Leak module self test fail before charging.\r\n"); } Charger.isTestLeakModule = OFF ; } if(Charger.CP_State == SYSTEM_STATE_C) { #ifdef MODIFY_MODE_HANDSHAKE_STOP_PWM_WITHOUT_OK_STATE if (Charger.m_bSafetyRegulationGB) { Charger.m_bBlockCsuCpPwmDuty = HTK_DISABLE; if (Charger.m_CP_CurPWM == PWM_DUTY_FULL) { CpTask_CtrlCpPwm_P0(); } } #endif setChargerMode(MODE_CHARGING); timerDisable(TIMER_IDX_CP); if (Charger.isSetStartTime == ON) { Charger.cycle_info.startTimeTick = HAL_GetTick(); Charger.cycle_info.startDateTime.year = Charger.memory.EVSE_Config.data.item.SystemDateTime.year; Charger.cycle_info.startDateTime.month = Charger.memory.EVSE_Config.data.item.SystemDateTime.month; Charger.cycle_info.startDateTime.day = Charger.memory.EVSE_Config.data.item.SystemDateTime.day; Charger.cycle_info.startDateTime.hour = Charger.memory.EVSE_Config.data.item.SystemDateTime.hour; Charger.cycle_info.startDateTime.min = Charger.memory.EVSE_Config.data.item.SystemDateTime.min; Charger.cycle_info.startDateTime.sec = Charger.memory.EVSE_Config.data.item.SystemDateTime.sec; Charger.cycle_info.meterStart = Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_Total; } } if (Charger.CP_State == SYSTEM_STATE_B) { #ifdef MODIFY_MODE_HANDSHAKE_STOP_PWM_WITHOUT_OK_STATE if (Charger.m_bSafetyRegulationGB) { Charger.m_bBlockCsuCpPwmDuty = HTK_DISABLE; if (Charger.m_CP_CurPWM == PWM_DUTY_FULL) { CpTask_CtrlCpPwm_P0(); } } #endif Charger.isCP_in_B = ON ; } #ifdef MODIFY_CPTASK_TYPE_E if (Charger.CP_State == SYSTEM_STATE_A && IsTypeEPlugIn()) #else //if((Charger.CP_State == SYSTEM_STATE_A) && HAL_GPIO_ReadPin(IN_SocketE_Detect_GPIO_Port, IN_SocketE_Detect_Pin)) #endif { Charger.isOnSocketE = ON; setChargerMode(MODE_CHARGING); timerDisable(TIMER_IDX_CP); if (Charger.isSetStartTime == ON) { Charger.cycle_info.startTimeTick = HAL_GetTick(); Charger.cycle_info.startDateTime.year = Charger.memory.EVSE_Config.data.item.SystemDateTime.year; Charger.cycle_info.startDateTime.month = Charger.memory.EVSE_Config.data.item.SystemDateTime.month; Charger.cycle_info.startDateTime.day = Charger.memory.EVSE_Config.data.item.SystemDateTime.day; Charger.cycle_info.startDateTime.hour = Charger.memory.EVSE_Config.data.item.SystemDateTime.hour; Charger.cycle_info.startDateTime.min = Charger.memory.EVSE_Config.data.item.SystemDateTime.min; Charger.cycle_info.startDateTime.sec = Charger.memory.EVSE_Config.data.item.SystemDateTime.sec; Charger.cycle_info.meterStart = Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_Total; } } if(((Charger.CP_State == SYSTEM_STATE_A) && Charger.isCP_in_B) || !Charger.am3352.isRequestOn) { user_pwm_setvalue(PWM_CH_CP, PWM_DUTY_FULL); // close pwm setChargerMode(MODE_IDLE); timerDisable(TIMER_IDX_CP); } #ifdef MODIFY_MODE_HANDSHAKE_STOP_PWM_WITHOUT_OK_STATE if (Charger.m_bSafetyRegulationGB) { if ( (Charger.CP_State == SYSTEM_STATE_D || Charger.CP_State == SYSTEM_STATE_E) && (Charger.am3352.isRequestOn) ) { Charger.m_bBlockCsuCpPwmDuty = HTK_ENABLE; user_pwm_setvalue(PWM_CH_CP, PWM_DUTY_FULL); } } #endif break; case MODE_CHARGING: //=============================( MODIFY_CPTASK_TYPE_E / MODE_CHARGING ) if(isModeChange()) { #ifdef MODIFY_CPTASK_CSU_0_1_CHARGE_MODE CpTask_CtrlCpPwm_P0(); #endif } if ( #ifdef MODIFY_AW_CP_TASK_CSU_0_1_CHARGING_MODE_STOP_WITHOUT_STATE_C (!Charger.isOnSocketE && Charger.CP_State != SYSTEM_STATE_C) || #else ((!Charger.isOnSocketE) && (Charger.CP_State != SYSTEM_STATE_C) && (Charger.CP_State != SYSTEM_STATE_UNKNOWN)) || #endif #ifdef MODIFY_CPTASK_TYPE_E (Charger.isOnSocketE && !IsTypeEPlugIn()) || #else //((Charger.isOnSocketE) && !HAL_GPIO_ReadPin(IN_SocketE_Detect_GPIO_Port, IN_SocketE_Detect_Pin)) || #endif !Charger.am3352.isRequestOn ) { setChargerMode(MODE_STOP); if (Charger.CP_State != SYSTEM_STATE_C) { Charger.Relay_Action = GPIO_RELAY_ACTION_OFF; #ifdef MODIFY_MODE_CHARGING_STOP_PWM_WITHOUT_OK_STATE if (Charger.m_bSafetyRegulationGB) { if ( (Charger.CP_State == SYSTEM_STATE_D || Charger.CP_State == SYSTEM_STATE_E) && (Charger.am3352.isRequestOn) ) { Charger.m_bBlockCsuCpPwmDuty = HTK_ENABLE; user_pwm_setvalue(PWM_CH_CP, PWM_DUTY_FULL); } } #endif //MODIFY_MODE_CHARGING_STOP_PWM_WITHOUT_OK_STATE } } #ifdef FUNC_RELAY_OFF_WHEN_CSU_CMD_TIMEOUT else if (HTK_IsTimeout(Charger.m_CSU_RxTick, CSU_CMD_TIMEOUT_SEC * 1000)) { if (Charger.Relay_Action != GPIO_RELAY_ACTION_OFF) { Charger.Relay_Action = GPIO_RELAY_ACTION_OFF; XP("# RELAY => OFF\r\n"); } if (Charger.SE_Relay_Action != GPIO_SE_RELAY_ACTION_OFF) { Charger.SE_Relay_Action = GPIO_SE_RELAY_ACTION_OFF; XP("# RELAY_SE => OFF\r\n"); } #ifdef FUNC_REQUEST_OFF_WHEN_CSU_CMD_TIMEOUT if (Charger.am3352.isRequestOn != OFF) { Charger.am3352.isRequestOn = OFF; XP("# REQUEST => OFF\r\n"); } #endif } #endif //FUNC_RELAY_OFF_WHEN_CSU_CMD_TIMEOUT else { duration_delta = (HAL_GetTick() - Charger.cycle_info.startTimeTick); Charger.cycle_info.Duration = duration_delta; Charger.cycle_info.Power_Consumption = Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_Total - Charger.cycle_info.meterStart; } break; case MODE_STOP: //=============================( MODIFY_CPTASK_TYPE_E / MODE_STOP ) if(isModeChange()) { Charger.isSetStartTime = OFF ; Charger.isCP_in_B = OFF ; if (!Charger.am3352.isRequestOn) //represent swip card stop charge in 6V { Charger.rfid.op_bits.reqStop = ON ; } } if(!Charger.am3352.isRequestOn) { if (Charger.rfid.op_bits.reqStop == ON || (Charger.CP_State == SYSTEM_STATE_B)) //1. swip card stop charge in 6V. , 2.cp-> B then swip card stop charge { if(Charger.CP_State == SYSTEM_STATE_B) Charger.Relay_Action = GPIO_RELAY_ACTION_OFF; Charger.rfid.op_bits.reqStop = OFF; user_pwm_setvalue(PWM_CH_CP, PWM_DUTY_FULL); // close pwm timerEnable( TIMER_IDX_RFID_RELAY_OFF, 3000); //is set wait 3 sec Charger.cycle_info.endTimeTick = HAL_GetTick(); #ifndef FUNC_METER_IC_HISTORY recordChargingHis(OFF, END_STATUS_CODE_NORMAL); #endif Charger.isCP_in_B = OFF ; } if (timer[TIMER_IDX_RFID_RELAY_OFF].isAlarm == ON ) //is wait 3 sec { timerDisable(TIMER_IDX_RFID_RELAY_OFF); Charger.Relay_Action = GPIO_RELAY_ACTION_OFF; #ifdef FUNC_BLOCK_CSU_CONFIG_CP_PWM_DUTY Charger.m_bBlockCsuCpPwmDuty = HTK_DISABLE; #endif setChargerMode(MODE_IDLE); Charger.cycle_info.StartType = START_METHOD_NONE; } } else if ( (!Charger.isOnSocketE && Charger.CP_State == SYSTEM_STATE_A) || #ifdef MODIFY_CPTASK_TYPE_E (Charger.isOnSocketE && !IsTypeEPlugIn()) #else //(Charger.isOnSocketE && !HAL_GPIO_ReadPin(IN_SocketE_Detect_GPIO_Port, IN_SocketE_Detect_Pin)) #endif ) { user_pwm_setvalue(PWM_CH_CP, PWM_DUTY_FULL); // close pwm Charger.cycle_info.endTimeTick = HAL_GetTick(); #ifndef FUNC_METER_IC_HISTORY recordChargingHis(OFF, END_STATUS_CODE_NORMAL); #endif Charger.Relay_Action = GPIO_RELAY_ACTION_OFF; #ifdef FUNC_BLOCK_CSU_CONFIG_CP_PWM_DUTY Charger.m_bBlockCsuCpPwmDuty = HTK_DISABLE; #endif setChargerMode(MODE_IDLE); Charger.isCP_in_B = OFF ; } else // Charger.am3352.isRequestOn == 1 { if((Charger.CP_State == SYSTEM_STATE_B)) { timerDisable(TIMER_IDX_RFID_RELAY_OFF); Charger.Relay_Action = GPIO_RELAY_ACTION_OFF; Charger.isCP_in_B = ON ; } if((Charger.CP_State == SYSTEM_STATE_C) && (!Charger.am3352.isRequestOff) ) { #ifdef FUNC_BLOCK_CSU_CONFIG_CP_PWM_DUTY Charger.m_bBlockCsuCpPwmDuty = HTK_DISABLE; #endif setChargerMode(MODE_HANDSHAKE); } #ifdef MODIFY_MODE_STOP_STOP_PWM_WITHOUT_OK_STATE if (Charger.m_bSafetyRegulationGB) { if ( (Charger.CP_State == SYSTEM_STATE_D || Charger.CP_State == SYSTEM_STATE_E) && (Charger.am3352.isRequestOn) ) { Charger.m_bBlockCsuCpPwmDuty = HTK_ENABLE; user_pwm_setvalue(PWM_CH_CP, PWM_DUTY_FULL); } if ((Charger.CP_State == SYSTEM_STATE_B) && (Charger.am3352.isRequestOn)) { Charger.m_bBlockCsuCpPwmDuty = HTK_DISABLE; if (Charger.m_CP_CurPWM == PWM_DUTY_FULL) { CpTask_CtrlCpPwm_P0(); } } } #endif //MODIFY_MODE_STOP_STOP_PWM_WITHOUT_OK_STATE } break; case MODE_ALARM: //=============================( MODIFY_CPTASK_TYPE_E / MODE_ALARM ) if(isModeChange()) { Charger.isSetStartTime = OFF ; if (Charger.CSUisReady == ON ) { //clear blink time , Prevent red light from being snatched by others disblinkerTime (BLINKER_IDX_LED) ; //clear led Action Charger.am3352.LedActionState = 0 ; } } Charger.Relay_Action = GPIO_RELAY_ACTION_OFF; #ifdef MODIFY_CPTASK_TYPE_E_CSU_SE_RELAY_AUTO_OFF Charger.SE_Relay_Action = GPIO_SE_RELAY_ACTION_OFF; #endif #ifdef FUNC_MODE_ALARM_TO_MODE_DEBUG if (Charger.isDebugEnable && Charger.Alarm_Code == 0) { setChargerMode(MODE_DEBUG); } else #endif if(Charger.Alarm_Code == 0x00) { Charger.am3352.LedActionState = 0 ; if (Charger.Mode_Before_Alarm == MODE_CHARGING) // in charging mode { #ifdef FUNC_CCS #ifdef MODIFY_CPTASK_CSU_MODE_ALARM_GO_HANDSHAKE_WITH_NEW_CONDITION if(Charger.CP_State != SYSTEM_STATE_A && Charger.am3352.isRequestOn) #else if(Charger.CP_State == SYSTEM_STATE_B || Charger.CP_State == SYSTEM_STATE_C) #endif #else //FUNC_CCS if(Charger.CP_State == SYSTEM_STATE_B ) // to handshake #endif //FUNC_CCS { setChargerMode(MODE_HANDSHAKE); } else // to idle //SYSTEM_STATE_A { user_pwm_setvalue(PWM_CH_CP, PWM_DUTY_FULL); setChargerMode(MODE_IDLE); } } else if(Charger.Mode_Before_Alarm == MODE_STOP) { if (Charger.isCP_in_B == ON) // to handshake { setChargerMode(MODE_HANDSHAKE); } else // to stop { setChargerMode(MODE_STOP); } } else // to idle { if(timer[TIMER_IDX_STATE_E].isAlarm == ON) { setChargerMode(MODE_IDLE); } } } break; case MODE_DEBUG: //=============================( MODIFY_CPTASK_TYPE_E / MODE_DEBUG ) #ifdef FUNC_MODE_DEBUG_RELAY_ON_OFF_TEST_FOR_PHN_QE if(isModeChange()) { setLedMotion(LED_ACTION_DEBUG); #ifdef FUNC_MODE_DEBUG_RELAY_ON_OFF_DIFF_SEC timerEnable(TIMER_IDX_DEBUG, FUNC_MODE_DEBUG_RELAY_ON_SEC * 1000); #else timerEnable(TIMER_IDX_DEBUG, 2000); #endif } if (timer[TIMER_IDX_DEBUG].isAlarm && Charger.Alarm_Code == 0 && Charger.CP_State == SYSTEM_STATE_C) { if (Charger.Relay_Action == GPIO_RELAY_ACTION_ON) { Charger.Relay_Action = GPIO_RELAY_ACTION_OFF; #ifdef FUNC_MODE_DEBUG_RELAY_ON_OFF_DIFF_SEC timerRefresh(TIMER_IDX_DEBUG); timerEnable(TIMER_IDX_DEBUG, FUNC_MODE_DEBUG_RELAY_OFF_SEC * 1000); #else timerRefresh(TIMER_IDX_DEBUG); #endif } else if (Charger.Relay_Action == GPIO_RELAY_ACTION_OFF) { Charger.Relay_Action = GPIO_RELAY_ACTION_ON; #ifdef FUNC_MODE_DEBUG_REC_RELAY_ON_TIMES Charger.memory.EVSE_Config.data.item.m_ModeDebugRelayOnTimes++; Charger.memory.EVSE_Config.op_bits.update = ON; #endif #ifdef FUNC_MODE_DEBUG_RELAY_ON_OFF_DIFF_SEC timerRefresh(TIMER_IDX_DEBUG); timerEnable(TIMER_IDX_DEBUG, FUNC_MODE_DEBUG_RELAY_ON_SEC * 1000); #else timerRefresh(TIMER_IDX_DEBUG); #endif } } #else //FUNC_MODE_DEBUG_RELAY_ON_OFF_TEST_FOR_PHN_QE if(isModeChange()) { setLedMotion(LED_ACTION_DEBUG); Charger.Relay_Action = GPIO_RELAY_ACTION_ON; timerEnable(TIMER_IDX_DEBUG, 1000); } if(timer[TIMER_IDX_DEBUG].isAlarm || (Charger.Alarm_Code>0)) { Charger.Relay_Action = GPIO_RELAY_ACTION_OFF; #ifdef MODIFY_CPTASK_TYPE_E Charger.SE_Relay_Action = GPIO_SE_RELAY_ACTION_OFF; #endif Charger.isDebugModeCPtest = ON; } if(Charger.isDebugModeCPtest) { if(Charger.CP_State == SYSTEM_STATE_A) { Charger.Relay_Action = GPIO_RELAY_ACTION_OFF; #ifdef MODIFY_CPTASK_TYPE_E Charger.SE_Relay_Action = GPIO_SE_RELAY_ACTION_OFF; #endif Charger.memory.EVSE_Config.data.item.MaxChargingCurrent = Charger.maxRatingCurrent; #ifdef MODIFY_AC_EVSE_STATUS_MAX_CHARGING_CURRENT_VARIABLE Charger.AC_MaxChargingCurrentOrDuty = Charger.maxRatingCurrent; #endif user_pwm_setvalue(PWM_CH_CP, PWM_DUTY_FULL); } else if (Charger.CP_State == SYSTEM_STATE_B) { Charger.Relay_Action = GPIO_RELAY_ACTION_OFF; #ifdef MODIFY_CPTASK_TYPE_E Charger.SE_Relay_Action = GPIO_SE_RELAY_ACTION_OFF; #endif #ifdef MODIFY_CP_TASK_CTRL_CP_PWM CpTask_CtrlCpPwm_P1(); #endif } else if (Charger.CP_State == SYSTEM_STATE_C) { Charger.Relay_Action = GPIO_RELAY_ACTION_ON; #ifdef MODIFY_CP_TASK_CTRL_CP_PWM CpTask_CtrlCpPwm_P1(); #endif } } #endif //FUNC_MODE_DEBUG_RELAY_ON_OFF_TEST_FOR_PHN_QE break; default: setChargerMode(MODE_IDLE); break; } } else { /*By Pass Mode*/ } osDelay(1); } /* USER CODE END StartCpTask */ } /* USER CODE BEGIN Header_StartAlarmTask */ /** * @brief Function implementing the alarmTask thread. * @param argument: Not used * @retval None */ /* USER CODE END Header_StartAlarmTask */ void StartAlarmTask(void const * argument) { /* USER CODE BEGIN StartAlarmTask */ #ifdef FUNC_IDLE_UNTIL_READ_ALL_MEM IdleUntilReadAllMemory(); #endif //aalarm //timerEnable(TIMER_IDX_PE_DETECT, 30000); timerEnable(TIMER_IDX_PE_DETECT, 40000); #ifndef RECODE_METER_PRO380 #ifdef MODIFY_METER_EXT_PRO380 Charger.m_MeterPRO380.m_LastUpdateTick = HAL_GetTick(); #endif #endif //!RECODE_METER_PRO380 /* Infinite loop */ for(;;) { #ifdef FUNC_MODE_DEBUG_WITH_NORMAL_ALARM_DETECTE if(Charger.Mode != MODE_INITIAL) #else if(Charger.Mode != MODE_INITIAL && Charger.Mode != MODE_DEBUG) #endif { recordAlarmHis(); #ifdef FUNC_AX32_TRIG_LEAKAGE if (Charger.m_b3PhaseModel) { if (Charger.Alarm_Code & ALARM_RELAY_STATUS && //Relay Welding (!HTK_IsInTime(Charger.AlarmRelayWeldingOccurTick, 1000)) ) { TrigLeakage_Trig(); TrigLeakage_Proc(); } } #endif #ifdef FUNC_AX80_ADD_TILT_SENSOR #ifdef FUNC_ADD_TILT_SENSOR_MODEL if (Charger.m_bUseTiltSensor) #else if (Charger.m_bModelNameAX80_1P) #endif { if (Charger.Alarm_Code & ALARM_TILT_SENSOR && (!HTK_IsInTime(Charger.AlarmTiltSensorOccurTick, 1000)) ) { #ifdef FUNC_DISABLE_TILT_SENSOR_FOR_TEST if (HTK_IsInTime(Charger.m_BootTick, 1000 * 30)) { Charger.m_bDisableTiltSensorForTest = 1; Charger.Alarm_Code &= ~ALARM_TILT_SENSOR; DEBUG_ERROR("Alarm tilt sensor fault recover. [TEST MODE WITHOUT TILT SENSOR ALARM]\r\n"); Charger.counter.TiltSensor.fail = 0; } else { TILT_TrigLeakage_Trig(); TILT_TrigLeakage_Proc(); } #else TILT_TrigLeakage_Trig(); TILT_TrigLeakage_Proc(); #endif } } #endif //FUNC_AX80_ADD_TILT_SENSOR //================================ // CP fail alarm detect //================================ #ifdef CP_ALARM_PROTECT if ((Charger.CP_State == SYSTEM_STATE_UNKNOWN)&&(!(Charger.Alarm_Code & ALARM_MCU_TESTFAIL))) { #ifdef MODIFY_ALARM_CP_ERROR_RECOVER_USE_RESTORE if(!(Charger.Alarm_Code & ALARM_CP_ERROR)) { if (Charger.counter.CP.fail > 1000) { Charger.counter.CP.isOccurInCharging = (((Charger.Mode == MODE_CHARGING) || (Charger.Mode == MODE_STOP))?ON:OFF); Charger.Alarm_Code |= ALARM_CP_ERROR; DEBUG_ERROR("Alarm CP occur.\r\n"); Charger.counter.CP.restore = 0; } else { Charger.counter.CP.fail++; } } #endif //MODIFY_ALARM_CP_ERROR_RECOVER_USE_RESTORE } #ifdef MODIFY_ALARMTASK_CP_ERROR_RECOVER else if (Charger.CP_State != SYSTEM_STATE_UNKNOWN) #else else if ((Charger.CP_State != SYSTEM_STATE_UNKNOWN)&&(Charger.CP_State!=SYSTEM_STATE_D)&& (Charger.CP_State != SYSTEM_STATE_E)&&(Charger.CP_State != SYSTEM_STATE_F)) #endif { #ifdef MODIFY_ALARM_CP_ERROR_RECOVER_USE_RESTORE if (Charger.Alarm_Code & ALARM_CP_ERROR) { if (Charger.counter.CP.restore > 1000) { Charger.Alarm_Code &= ~ALARM_CP_ERROR; DEBUG_INFO("Alarm CP recover.\r\n"); Charger.counter.CP.fail = 0; } else { Charger.counter.CP.restore++; } } #endif //MODIFY_ALARM_CP_ERROR_RECOVER_USE_RESTORE } #ifdef FUNC_ALARM_CP_NEG_ERROR if ((!CP_IsInSpec_N12V(&CpDetectionResult))&&(!(Charger.Alarm_Code & ALARM_MCU_TESTFAIL))) { #ifdef MODIFY_ALARM_CP_NEG_ERROR_RECOVER_USE_RESTORE if (!(Charger.Alarm_Code & ALARM_CP_NEG_ERROR)) { if (Charger.counter.CP_Neg.fail > 1000) { Charger.counter.CP_Neg.isOccurInCharging = (((Charger.Mode == MODE_CHARGING) || (Charger.Mode == MODE_STOP))?ON:OFF); Charger.Alarm_Code |= ALARM_CP_NEG_ERROR; DEBUG_ERROR("Alarm CP_NEG occur.\r\n"); Charger.counter.CP_Neg.restore = 0; } else { Charger.counter.CP_Neg.fail++; } } #endif //MODIFY_ALARM_CP_NEG_ERROR_RECOVER_USE_RESTORE } else { #ifdef MODIFY_ALARM_CP_NEG_ERROR_RECOVER_USE_RESTORE if (Charger.Alarm_Code & ALARM_CP_NEG_ERROR) { if (Charger.counter.CP_Neg.restore > 1000) { Charger.Alarm_Code &= ~ALARM_CP_NEG_ERROR; DEBUG_INFO("Alarm CP_NEG recover.\r\n"); Charger.counter.CP_Neg.fail = 0; } else { Charger.counter.CP_Neg.restore++; } } #endif //MODIFY_ALARM_CP_NEG_ERROR_RECOVER_USE_RESTORE } #endif //FUNC_ALARM_CP_NEG_ERROR #endif //CP_ALARM_PROTECT //================================ // Over voltage alarm detect //================================ #ifdef OVP_PROTECT //-------------------------------- // L1 Over voltage if(Charger.Voltage[0] > ALARM_SPEC_OV) { if(Charger.counter.L1_OV.fail > 1000) { Charger.counter.L1_OV.restore = 0 ; if(!(Charger.Alarm_Code & ALARM_L1_OVER_VOLTAGE)) { Charger.Alarm_Code |= ALARM_L1_OVER_VOLTAGE; DEBUG_ERROR("Alarm L1_OV occur.\r\n"); } } else Charger.counter.L1_OV.fail++; } else if(Charger.Voltage[0] < (ALARM_SPEC_OV-ALARM_SPEC_OUV_HYSTERESIS)) { if((Charger.Alarm_Code & ALARM_L1_OVER_VOLTAGE)) { if (Charger.counter.L1_OV.restore > 1000 && blinker[BLINKER_IDX_LED].blinkisFinish) { Charger.counter.L1_OV.fail = 0 ; DEBUG_INFO("Alarm L1_OV is coldpickup ing..... \r\n"); Charger.counter.L1_OV.isOccurInCharging = ((Charger.CP_State == SYSTEM_STATE_B)?ON:OFF); if (Charger.counter.L1_OV.isOccurInCharging) { #ifdef MODIFY_COLD_LOAD_PICKUP_DELAY ColdLoadPickup_Delay("Alarm L1_OV is coldpickup ing..... "); #else osDelay((rand()%175000)+5000); #endif } Charger.Alarm_Code &= ~ALARM_L1_OVER_VOLTAGE; DEBUG_INFO("Alarm L1_OV recover.\r\n"); } else { Charger.counter.L1_OV.restore++; } } else { Charger.counter.L1_OV.fail = 0 ; Charger.counter.L1_OV.restore = 0 ; } } #ifdef FUNC_AUTO_IGNORE_AC_PHASE #ifdef FUNC_AX32_USE_AS_1P_MODEL if (Charger.m_b3PhaseModel && !Charger.m_b3PhaseModelButUse1PhaseOnly) #else if (Charger.m_b3PhaseModel) #endif { #endif //-------------------------------- // L2 Over voltage if(Charger.Voltage[1] > ALARM_SPEC_OV) { if(Charger.counter.L2_OV.fail > 1000) { Charger.counter.L2_OV.restore = 0 ; if(!(Charger.Alarm_Code & ALARM_L2_OVER_VOLTAGE)) { Charger.Alarm_Code |= ALARM_L2_OVER_VOLTAGE; DEBUG_ERROR("Alarm L2_OV occur.\r\n"); } } else Charger.counter.L2_OV.fail++; } else if(Charger.Voltage[1] < (ALARM_SPEC_OV-ALARM_SPEC_OUV_HYSTERESIS)) { if((Charger.Alarm_Code & ALARM_L2_OVER_VOLTAGE)) { if (Charger.counter.L2_OV.restore > 1000 && blinker[BLINKER_IDX_LED].blinkisFinish) { Charger.counter.L2_OV.fail = 0 ; DEBUG_INFO("Alarm L2_OV is coldpickup ing..... \r\n"); Charger.counter.L2_OV.isOccurInCharging = ((Charger.CP_State == SYSTEM_STATE_B)?ON:OFF); if (Charger.counter.L2_OV.isOccurInCharging) { #ifdef MODIFY_COLD_LOAD_PICKUP_DELAY ColdLoadPickup_Delay("Alarm L2_OV is coldpickup ing..... "); #else osDelay((rand()%175000)+5000); #endif } Charger.Alarm_Code &= ~ALARM_L2_OVER_VOLTAGE; DEBUG_INFO("Alarm L2_OV recover.\r\n"); } else { Charger.counter.L2_OV.restore++; } } else { Charger.counter.L2_OV.fail = 0 ; Charger.counter.L2_OV.restore = 0 ; } } //-------------------------------- // L3 Over voltage if(Charger.Voltage[2] > ALARM_SPEC_OV) { if(Charger.counter.L3_OV.fail > 1000) { Charger.counter.L3_OV.restore = 0 ; if(!(Charger.Alarm_Code & ALARM_L3_OVER_VOLTAGE)) { Charger.Alarm_Code |= ALARM_L3_OVER_VOLTAGE; DEBUG_ERROR("Alarm L3_OV occur.\r\n"); } } else Charger.counter.L3_OV.fail++; } else if(Charger.Voltage[2] < (ALARM_SPEC_OV-ALARM_SPEC_OUV_HYSTERESIS)) { if((Charger.Alarm_Code & ALARM_L3_OVER_VOLTAGE)) { if (Charger.counter.L3_OV.restore > 1000 && blinker[BLINKER_IDX_LED].blinkisFinish) { Charger.counter.L3_OV.fail = 0 ; DEBUG_INFO("Alarm L3_OV is coldpickup ing..... \r\n"); Charger.counter.L3_OV.isOccurInCharging = ((Charger.CP_State == SYSTEM_STATE_B)?ON:OFF); if (Charger.counter.L3_OV.isOccurInCharging) { #ifdef MODIFY_COLD_LOAD_PICKUP_DELAY ColdLoadPickup_Delay("Alarm L3_OV is coldpickup ing..... "); #else osDelay((rand()%175000)+5000); #endif } Charger.Alarm_Code &= ~ALARM_L3_OVER_VOLTAGE; DEBUG_INFO("Alarm L3_OV recover.\r\n"); } else { Charger.counter.L3_OV.restore++; } } else { Charger.counter.L3_OV.fail = 0 ; Charger.counter.L3_OV.restore = 0 ; } } #ifdef FUNC_AUTO_IGNORE_AC_PHASE } #endif #endif //OVP_PROTECT //================================ // Under voltage alarm detect //================================ #ifdef UVP_PROTECT //-------------------------------- // L1 Under voltage if(Charger.Voltage[0] < ALARM_SPEC_UV) { if(Charger.counter.L1_UV.fail > 1000) { Charger.counter.L1_UV.restore = 0 ; if(!(Charger.Alarm_Code & ALARM_L1_UNDER_VOLTAGE)) { Charger.Alarm_Code |= ALARM_L1_UNDER_VOLTAGE; DEBUG_ERROR("Alarm L1_UV occur.\r\n"); //************************ XP("Charger.Voltage[0] = %d\r\n", Charger.Voltage[0]); //************************ } } else Charger.counter.L1_UV.fail++; } else if(Charger.Voltage[0] > (ALARM_SPEC_UV+ALARM_SPEC_OUV_HYSTERESIS)) { if(Charger.Alarm_Code & ALARM_L1_UNDER_VOLTAGE) { if (Charger.counter.L1_UV.restore > 1000 && blinker[BLINKER_IDX_LED].blinkisFinish) { Charger.counter.L1_UV.fail = 0 ; DEBUG_INFO("Alarm L1_UV is coldpickup ing..... \r\n"); //Hao##### Charger.counter.L1_UV.isOccurInCharging = ((Charger.CP_State == SYSTEM_STATE_B)?ON:OFF); if (Charger.counter.L1_UV.isOccurInCharging) { #ifdef MODIFY_COLD_LOAD_PICKUP_DELAY ColdLoadPickup_Delay("Alarm L1_UV is coldpickup ing..... "); #else osDelay((rand()%175000)+5000); #endif } Charger.Alarm_Code &= ~ALARM_L1_UNDER_VOLTAGE; DEBUG_INFO("Alarm L1_UV recover.\r\n"); } else { Charger.counter.L1_UV.restore++ ; } } else { Charger.counter.L1_UV.restore = 0 ; Charger.counter.L1_UV.fail = 0 ; } } #ifdef FUNC_AUTO_IGNORE_AC_PHASE #ifdef FUNC_AX32_USE_AS_1P_MODEL if (Charger.m_b3PhaseModel && !Charger.m_b3PhaseModelButUse1PhaseOnly) #else if (Charger.m_b3PhaseModel) #endif { #endif //-------------------------------- // L2 Under voltage if(Charger.Voltage[1] < ALARM_SPEC_UV) { if(Charger.counter.L2_UV.fail > 1000) { Charger.counter.L2_UV.restore = 0 ; if(!(Charger.Alarm_Code & ALARM_L2_UNDER_VOLTAGE)) { Charger.Alarm_Code |= ALARM_L2_UNDER_VOLTAGE; DEBUG_ERROR("Alarm L2_UV occur.\r\n"); } } else Charger.counter.L2_UV.fail++; } else if(Charger.Voltage[1] > (ALARM_SPEC_UV+ALARM_SPEC_OUV_HYSTERESIS)) { if(Charger.Alarm_Code & ALARM_L2_UNDER_VOLTAGE) { if (Charger.counter.L2_UV.restore > 1000 && blinker[BLINKER_IDX_LED].blinkisFinish) { Charger.counter.L2_UV.fail = 0 ; DEBUG_INFO("Alarm L2_UV is coldpickup ing..... \r\n"); Charger.counter.L2_UV.isOccurInCharging = ((Charger.CP_State == SYSTEM_STATE_B)?ON:OFF); if (Charger.counter.L2_UV.isOccurInCharging) { #ifdef MODIFY_COLD_LOAD_PICKUP_DELAY ColdLoadPickup_Delay("Alarm L2_UV is coldpickup ing..... "); #else osDelay((rand()%175000)+5000); #endif } Charger.Alarm_Code &= ~ALARM_L2_UNDER_VOLTAGE; DEBUG_INFO("Alarm L2_UV recover.\r\n"); } else { Charger.counter.L2_UV.restore++ ; } } else { Charger.counter.L2_UV.restore = 0 ; Charger.counter.L2_UV.fail = 0 ; } } //-------------------------------- // L3 Under voltage if(Charger.Voltage[2] < ALARM_SPEC_UV) { if(Charger.counter.L3_UV.fail > 1000) { Charger.counter.L3_UV.restore = 0 ; if(!(Charger.Alarm_Code & ALARM_L3_UNDER_VOLTAGE)) { Charger.Alarm_Code |= ALARM_L3_UNDER_VOLTAGE; DEBUG_ERROR("Alarm L3_UV occur.\r\n"); } } else Charger.counter.L3_UV.fail++; } else if(Charger.Voltage[2] > (ALARM_SPEC_UV+ALARM_SPEC_OUV_HYSTERESIS)) { if(Charger.Alarm_Code & ALARM_L3_UNDER_VOLTAGE) { if (Charger.counter.L3_UV.restore > 1000 && blinker[BLINKER_IDX_LED].blinkisFinish) { Charger.counter.L3_UV.fail = 0 ; DEBUG_INFO("Alarm L3_UV is coldpickup ing..... \r\n"); Charger.counter.L3_UV.isOccurInCharging = ((Charger.CP_State == SYSTEM_STATE_B)?ON:OFF); if (Charger.counter.L3_UV.isOccurInCharging) { #ifdef MODIFY_COLD_LOAD_PICKUP_DELAY ColdLoadPickup_Delay("Alarm L3_UV is coldpickup ing..... "); #else osDelay((rand()%175000)+5000); #endif } Charger.Alarm_Code &= ~ALARM_L3_UNDER_VOLTAGE; DEBUG_INFO("Alarm L3_UV recover.\r\n"); } else { Charger.counter.L3_UV.restore++ ; } } else { Charger.counter.L3_UV.restore = 0 ; Charger.counter.L3_UV.fail = 0 ; } } #ifdef FUNC_AUTO_IGNORE_AC_PHASE } #endif #endif //UVP_PROTECT //================================ // Over current alarm detect //================================ #ifdef OCP_PROTECT #ifdef FUNC_OCP_WITH_PP { uint16_t CurMaxCurr = 0; //A uint16_t OC_BegThreshold = 0; //Occur: 0.01A uint16_t OC_EndThreshold = 0; //Recover: 0.01A #ifdef FUNC_CCS //// if (Charger.m_bRunCCS) //// { //// CurMaxCurr = Charger.maxRatingCurrent; //// } //// else //// { //// CurMaxCurr = HTK_GET_VAL_MIN(Charger.memory.EVSE_Config.data.item.MaxChargingCurrent, Charger.maxRatingCurrent); //// } CurMaxCurr = HTK_GET_VAL_MIN(Charger.memory.EVSE_Config.data.item.MaxChargingCurrent, Charger.maxRatingCurrent); #else CurMaxCurr = HTK_GET_VAL_MIN(Charger.memory.EVSE_Config.data.item.MaxChargingCurrent, Charger.maxRatingCurrent); #endif if (Charger.m_bDetectPP) { CurMaxCurr = HTK_GET_VAL_MIN(CurMaxCurr, Charger.m_PPInfo.m_CurCurr); } #ifdef MODIFY_SOCKET_E_OCP_USE_MAX_CHARGING_CURRENT if (Charger.isOnSocketE == ON) { CurMaxCurr = Charger.memory.EVSE_Config.data.item.MaxChargingCurrent; } #endif #ifdef MODIFY_OCP_PROC_WITH_MODELNAME_IDX_3_EURO_SPEC if (Charger.m_bModelNameWithEuroSpecOCP) #else if (Charger.memory.EVSE_Config.data.item.ModelName[3] == 'E') #endif { OC_BegThreshold = (CurMaxCurr * Charger.OCP_Magnification) + 0; OC_EndThreshold = (CurMaxCurr * Charger.OCP_Magnification) - 200; } else { if (CurMaxCurr > 20) { OC_BegThreshold = (CurMaxCurr * Charger.OCP_Magnification) + 0; OC_EndThreshold = (CurMaxCurr * Charger.OCP_Magnification) - 200; } else { OC_BegThreshold = (CurMaxCurr * 100) + 200; OC_EndThreshold = (CurMaxCurr * 100) + 0; } } Charger.m_OCP_CurMaxCurr = CurMaxCurr; Charger.m_OCP_BegThreshold = OC_BegThreshold; Charger.m_OCP_EndThreshold = OC_EndThreshold; #ifdef FUNC_SET_AT32_MODEL_SCP_SPEC_VAL_HIGHER_TO_AVOID_SCP_ALARM u32 CurSCP_SPEC = SCP_SPEC_VAL; if (Charger.m_bModelNameAT) { CurSCP_SPEC = (u32)SCP_SPEC_VAL * 1000; } #endif //-------------------------------- // L1 Over current #ifdef FUNC_SET_AT32_MODEL_SCP_SPEC_VAL_HIGHER_TO_AVOID_SCP_ALARM if((u32)Charger.Current[0] >= CurSCP_SPEC) #else if(Charger.Current[0] >= SCP_SPEC_VAL) #endif { if(Charger.counter.L1_OC.fail > 5) { if(!(Charger.Alarm_Code & ALARM_L1_CIRCUIT_SHORT)) { Charger.counter.L1_OC.isOccurInCharging = (((Charger.Mode == MODE_CHARGING) || (Charger.Mode == MODE_STOP))?ON:OFF); Charger.Alarm_Code |= ALARM_L1_CIRCUIT_SHORT; if (Charger.counter.L1_OC.isLatch == OFF) { Charger.counter.L1_OC.isLatch = ON ; setLedMotion(LED_ACTION_ALARM); timerDisable(TIMER_IDX_RETRY_OC); } DEBUG_INFO("Correction Current[0]: %f\r\n", Charger.Current[0]/100.0); DEBUG_ERROR("Alarm L1 SCP occur.\r\n"); } } else Charger.counter.L1_OC.fail++; } //#ifdef MODIFY_OCP_SPEC // else if(Charger.Current[0] > (Charger.memory.EVSE_Config.data.item.MaxChargingCurrent>=Charger.maxRatingCurrent?(Charger.maxRatingCurrent>20 ? ((Charger.maxRatingCurrent*Charger.OCP_Magnification)):((Charger.maxRatingCurrent+2)*100)) : (Charger.memory.EVSE_Config.data.item.MaxChargingCurrent>20?((Charger.memory.EVSE_Config.data.item.MaxChargingCurrent*Charger.OCP_Magnification )):((Charger.memory.EVSE_Config.data.item.MaxChargingCurrent+2)*100)))) //#else // else if(Charger.Current[0] > (Charger.memory.EVSE_Config.data.item.MaxChargingCurrent>=Charger.maxRatingCurrent?(Charger.maxRatingCurrent>20 ? ((Charger.maxRatingCurrent*Charger.OCP_Magnification)-100):((Charger.maxRatingCurrent+1)*100)) : (Charger.memory.EVSE_Config.data.item.MaxChargingCurrent>20?((Charger.memory.EVSE_Config.data.item.MaxChargingCurrent*Charger.OCP_Magnification )-100):((Charger.memory.EVSE_Config.data.item.MaxChargingCurrent+1)*100)))) //#endif else if (Charger.Current[0] > OC_BegThreshold) { if(Charger.counter.L1_OC.fail > 6000) { if(!(Charger.Alarm_Code & ALARM_L1_OVER_CURRENT)) { Charger.counter.L1_OC.isOccurInCharging = (((Charger.Mode == MODE_CHARGING) || (Charger.Mode == MODE_STOP))?ON:OFF); Charger.Alarm_Code |= ALARM_L1_OVER_CURRENT; DEBUG_INFO("Correction Current[0]: %f\r\n", Charger.Current[0]/100.0); DEBUG_ERROR("Alarm L1_OC occur.\r\n"); timerEnable(TIMER_IDX_RETRY_OC, ALARM_RETRY_INTERVAL_OC); Charger.counter.L1_OC.retry++; } } else Charger.counter.L1_OC.fail++; } //else if((Charger.Current[0] < ((Charger.memory.EVSE_Config.data.item.MaxChargingCurrent>=Charger.maxRatingCurrent)?((Charger.maxRatingCurrent>20?(Charger.maxRatingCurrent*Charger.OCP_Magnification )-200:((Charger.maxRatingCurrent+2)*100)-200)):( (Charger.memory.EVSE_Config.data.item.MaxChargingCurrent>20?((Charger.memory.EVSE_Config.data.item.MaxChargingCurrent*Charger.OCP_Magnification )-200):(((Charger.memory.EVSE_Config.data.item.MaxChargingCurrent+2)*100)-200)))))) else if (Charger.Current[0] < OC_EndThreshold) { Charger.counter.L1_OC.fail = 0; if (Charger.counter.L1_OC.retry> ALARM_OC_RETRY_COUNT) { if (Charger.counter.L1_OC.isLatch == OFF) { Charger.counter.L1_OC.isLatch = ON ; setLedMotion(LED_ACTION_ALARM); timerDisable(TIMER_IDX_RETRY_OC); } } else if((Charger.Alarm_Code & ALARM_L1_OVER_CURRENT) && (Charger.counter.L1_OC.retry <= ALARM_OC_RETRY_COUNT) && (timer[TIMER_IDX_RETRY_OC].isAlarm == ON) && blinker[BLINKER_IDX_LED].blinkisFinish ) { Charger.Alarm_Code &= ~ALARM_L1_OVER_CURRENT; Charger.Alarm_Code &= ~ALARM_L1_CIRCUIT_SHORT; DEBUG_INFO("Alarm L1_OC recover.\r\n"); if(!(Charger.Alarm_Code & ALARM_L1_OVER_CURRENT) && !(Charger.Alarm_Code & ALARM_L2_OVER_CURRENT) && !(Charger.Alarm_Code & ALARM_L3_OVER_CURRENT)) timerDisable(TIMER_IDX_RETRY_OC); } } #ifdef FUNC_AUTO_IGNORE_AC_PHASE #ifdef FUNC_AX32_USE_AS_1P_MODEL if (Charger.m_b3PhaseModel && !Charger.m_b3PhaseModelButUse1PhaseOnly) #else if (Charger.m_b3PhaseModel) #endif { #endif //-------------------------------- // L2 Over current #ifdef FUNC_SET_AT32_MODEL_SCP_SPEC_VAL_HIGHER_TO_AVOID_SCP_ALARM if((u32)Charger.Current[1] >= CurSCP_SPEC) #else if(Charger.Current[1] >= SCP_SPEC_VAL) #endif { if(Charger.counter.L2_OC.fail > 5) { if(!(Charger.Alarm_Code & ALARM_L2_CIRCUIT_SHORT)) { Charger.counter.L2_OC.isOccurInCharging = (((Charger.Mode == MODE_CHARGING) || (Charger.Mode == MODE_STOP))?ON:OFF); Charger.Alarm_Code |= ALARM_L2_CIRCUIT_SHORT; if (Charger.counter.L2_OC.isLatch == OFF) { Charger.counter.L2_OC.isLatch = ON ; setLedMotion(LED_ACTION_ALARM); timerDisable(TIMER_IDX_RETRY_OC); } DEBUG_INFO("Correction Current[1]: %f\r\n", Charger.Current[1]/100.0); DEBUG_ERROR("Alarm L2 SCP occur.\r\n"); } } else Charger.counter.L2_OC.fail++; } //#ifdef MODIFY_OCP_SPEC // else if(Charger.Current[1] > (Charger.memory.EVSE_Config.data.item.MaxChargingCurrent>=Charger.maxRatingCurrent?(Charger.maxRatingCurrent>20 ? ((Charger.maxRatingCurrent*Charger.OCP_Magnification)):((Charger.maxRatingCurrent+2)*100)) : (Charger.memory.EVSE_Config.data.item.MaxChargingCurrent>20?((Charger.memory.EVSE_Config.data.item.MaxChargingCurrent*Charger.OCP_Magnification )):((Charger.memory.EVSE_Config.data.item.MaxChargingCurrent+2)*100)))) //#else // else if(Charger.Current[1] > (Charger.memory.EVSE_Config.data.item.MaxChargingCurrent>=Charger.maxRatingCurrent?(Charger.maxRatingCurrent>20 ? ((Charger.maxRatingCurrent*Charger.OCP_Magnification)-100):((Charger.maxRatingCurrent+1)*100)) : (Charger.memory.EVSE_Config.data.item.MaxChargingCurrent>20?((Charger.memory.EVSE_Config.data.item.MaxChargingCurrent*Charger.OCP_Magnification )-100):((Charger.memory.EVSE_Config.data.item.MaxChargingCurrent+1)*100)))) //#endif else if (Charger.Current[1] > OC_BegThreshold) { if(Charger.counter.L2_OC.fail > 6000) { if(!(Charger.Alarm_Code & ALARM_L2_OVER_CURRENT)) { Charger.counter.L2_OC.isOccurInCharging = (((Charger.Mode == MODE_CHARGING) || (Charger.Mode == MODE_STOP))?ON:OFF); Charger.Alarm_Code |= ALARM_L2_OVER_CURRENT; DEBUG_INFO("Correction Current[1]: %f\r\n", Charger.Current[1]/100.0); DEBUG_ERROR("Alarm L2_OC occur.\r\n"); timerEnable(TIMER_IDX_RETRY_OC, ALARM_RETRY_INTERVAL_OC); Charger.counter.L2_OC.retry++; } } else Charger.counter.L2_OC.fail++; } //else if((Charger.Current[1] < ((Charger.memory.EVSE_Config.data.item.MaxChargingCurrent>=Charger.maxRatingCurrent)?((Charger.maxRatingCurrent>20?(Charger.maxRatingCurrent*Charger.OCP_Magnification )-200:((Charger.maxRatingCurrent+2)*100)-200)):( (Charger.memory.EVSE_Config.data.item.MaxChargingCurrent>20?((Charger.memory.EVSE_Config.data.item.MaxChargingCurrent*Charger.OCP_Magnification )-200):(((Charger.memory.EVSE_Config.data.item.MaxChargingCurrent+2)*100)-200)))))) else if (Charger.Current[1] < OC_EndThreshold) { Charger.counter.L2_OC.fail = 0; if (Charger.counter.L2_OC.retry > ALARM_OC_RETRY_COUNT) { if (Charger.counter.L2_OC.isLatch == OFF) { Charger.counter.L2_OC.isLatch = ON ; setLedMotion(LED_ACTION_ALARM); timerDisable(TIMER_IDX_RETRY_OC); } } else if((Charger.Alarm_Code & ALARM_L2_OVER_CURRENT) && (Charger.counter.L2_OC.retry <= ALARM_OC_RETRY_COUNT) && (timer[TIMER_IDX_RETRY_OC].isAlarm == ON) && blinker[BLINKER_IDX_LED].blinkisFinish ) { Charger.Alarm_Code &= ~ALARM_L2_OVER_CURRENT; Charger.Alarm_Code &= ~ALARM_L2_CIRCUIT_SHORT; DEBUG_INFO("Alarm L2_OC recover.\r\n"); if(!(Charger.Alarm_Code & ALARM_L1_OVER_CURRENT) && !(Charger.Alarm_Code & ALARM_L2_OVER_CURRENT) && !(Charger.Alarm_Code & ALARM_L3_OVER_CURRENT)) timerDisable(TIMER_IDX_RETRY_OC); } } //-------------------------------- // L3 Over current #ifdef FUNC_SET_AT32_MODEL_SCP_SPEC_VAL_HIGHER_TO_AVOID_SCP_ALARM if((u32)Charger.Current[2] >= CurSCP_SPEC) #else if(Charger.Current[2] >= SCP_SPEC_VAL) #endif { if(Charger.counter.L3_OC.fail > 5) { if(!(Charger.Alarm_Code & ALARM_L3_CIRCUIT_SHORT)) { Charger.counter.L3_OC.isOccurInCharging = (((Charger.Mode == MODE_CHARGING) || (Charger.Mode == MODE_STOP))?ON:OFF); Charger.Alarm_Code |= ALARM_L3_CIRCUIT_SHORT; if (Charger.counter.L3_OC.isLatch == OFF) { Charger.counter.L3_OC.isLatch = ON ; setLedMotion(LED_ACTION_ALARM); timerDisable(TIMER_IDX_RETRY_OC); } DEBUG_INFO("Correction Current[2]: %f\r\n", Charger.Current[2]/100.0); DEBUG_ERROR("Alarm L3 SCP occur.\r\n"); } } else Charger.counter.L3_OC.fail++; } //#ifdef MODIFY_OCP_SPEC // else if(Charger.Current[2] > (Charger.memory.EVSE_Config.data.item.MaxChargingCurrent>=Charger.maxRatingCurrent?(Charger.maxRatingCurrent>20 ? ((Charger.maxRatingCurrent*Charger.OCP_Magnification)):((Charger.maxRatingCurrent+2)*100)) : (Charger.memory.EVSE_Config.data.item.MaxChargingCurrent>20?((Charger.memory.EVSE_Config.data.item.MaxChargingCurrent*Charger.OCP_Magnification )):((Charger.memory.EVSE_Config.data.item.MaxChargingCurrent+2)*100)))) //#else // else if(Charger.Current[2] > (Charger.memory.EVSE_Config.data.item.MaxChargingCurrent>=Charger.maxRatingCurrent?(Charger.maxRatingCurrent>20 ? ((Charger.maxRatingCurrent*Charger.OCP_Magnification)-100):((Charger.maxRatingCurrent+1)*100)) : (Charger.memory.EVSE_Config.data.item.MaxChargingCurrent>20?((Charger.memory.EVSE_Config.data.item.MaxChargingCurrent*Charger.OCP_Magnification )-100):((Charger.memory.EVSE_Config.data.item.MaxChargingCurrent+1)*100)))) //#endif else if (Charger.Current[2] > OC_BegThreshold) { if(Charger.counter.L3_OC.fail > 6000) { if(!(Charger.Alarm_Code & ALARM_L3_OVER_CURRENT)) { Charger.counter.L3_OC.isOccurInCharging = (((Charger.Mode == MODE_CHARGING) || (Charger.Mode == MODE_STOP))?ON:OFF); Charger.Alarm_Code |= ALARM_L3_OVER_CURRENT; DEBUG_INFO("Correction Current[2]: %f\r\n", Charger.Current[2]/100.0); DEBUG_ERROR("Alarm L3_OC occur.\r\n"); timerEnable(TIMER_IDX_RETRY_OC, ALARM_RETRY_INTERVAL_OC); Charger.counter.L3_OC.retry++; } } else Charger.counter.L3_OC.fail++; } //else if((Charger.Current[2] < ((Charger.memory.EVSE_Config.data.item.MaxChargingCurrent>=Charger.maxRatingCurrent)?((Charger.maxRatingCurrent>20?(Charger.maxRatingCurrent*Charger.OCP_Magnification )-200:((Charger.maxRatingCurrent+2)*100)-200)):( (Charger.memory.EVSE_Config.data.item.MaxChargingCurrent>20?((Charger.memory.EVSE_Config.data.item.MaxChargingCurrent*Charger.OCP_Magnification )-200):(((Charger.memory.EVSE_Config.data.item.MaxChargingCurrent+2)*100)-200)))))) else if (Charger.Current[2] < OC_EndThreshold) { Charger.counter.L3_OC.fail = 0; if (Charger.counter.L3_OC.retry > ALARM_OC_RETRY_COUNT) { if (Charger.counter.L3_OC.isLatch == OFF) { Charger.counter.L3_OC.isLatch = ON ; setLedMotion(LED_ACTION_ALARM); timerDisable(TIMER_IDX_RETRY_OC); } } else if((Charger.Alarm_Code & ALARM_L3_OVER_CURRENT) && (Charger.counter.L3_OC.retry <= ALARM_OC_RETRY_COUNT) && (timer[TIMER_IDX_RETRY_OC].isAlarm == ON) && blinker[BLINKER_IDX_LED].blinkisFinish ) { Charger.Alarm_Code &= ~ALARM_L3_OVER_CURRENT; Charger.Alarm_Code &= ~ALARM_L3_CIRCUIT_SHORT; DEBUG_INFO("Alarm L3_OC recover.\r\n"); if(!(Charger.Alarm_Code & ALARM_L1_OVER_CURRENT) && !(Charger.Alarm_Code & ALARM_L2_OVER_CURRENT) && !(Charger.Alarm_Code & ALARM_L3_OVER_CURRENT)) timerDisable(TIMER_IDX_RETRY_OC); } } #ifdef FUNC_AUTO_IGNORE_AC_PHASE } #endif } #else //FUNC_OCP_WITH_PP //Old Procedure (Deleted) #endif //FUNC_OCP_WITH_PP #endif //OCP_PROTECT //================================ // Over temperature alarm detect //================================ #ifdef OTP_PROTECT #ifdef FUNC_AX80_ADD_4_TEMP_SENEOR #ifdef MODIFY_OTP_SPEC //if (Charger.temperature.MaxTemp > Charger.alarm_spec.OT_2) if ( (Charger.temperature.Group1_MaxTemp > Charger.alarm_spec.OT_G1_2) || ( #ifdef FUNC_AW48_ADD_6_TEMP_SENEOR #ifdef FUNC_AX48_NACS_ADD_6_TEMP_SENEOR #ifdef FUNC_AX80_NACS_ADD_6_TEMP_SENEOR (Charger.m_bModelNameAX80_1P || Charger.m_bModelNameAW48_1P || Charger.m_bModelNameAX48_NACS_1P || Charger.m_bModelNameAX80_NACS_1P) && #else //FUNC_AX80_NACS_ADD_6_TEMP_SENEOR (Charger.m_bModelNameAX80_1P || Charger.m_bModelNameAW48_1P || Charger.m_bModelNameAX48_NACS_1P) && #endif //FUNC_AX80_NACS_ADD_6_TEMP_SENEOR #else //FUNC_AX48_NACS_ADD_6_TEMP_SENEOR (Charger.m_bModelNameAX80_1P || Charger.m_bModelNameAW48_1P) && #endif //FUNC_AX48_NACS_ADD_6_TEMP_SENEOR #else //FUNC_AW48_ADD_6_TEMP_SENEOR Charger.m_bModelNameAX80_1P && #endif //FUNC_AW48_ADD_6_TEMP_SENEOR Charger.temperature.Group2_MaxTemp > Charger.alarm_spec.OT_G2_2 ) #ifdef MODIFY_AW48_OTP_SPEC_20240522_STEVEN #ifdef MODIFY_AW48_OTP_SPEC_20240802_STEVEN || ( (Charger.m_bModelNameAW48_1P) && ( Charger.temperature.Group3_MaxTemp > Charger.alarm_spec.OT_G3_2 || Charger.temperature.Group4_MaxTemp > Charger.alarm_spec.OT_G4_2 ) ) #else //MODIFY_AW48_OTP_SPEC_20240802_STEVEN || ( (Charger.m_bModelNameAW48_1P) && Charger.temperature.Group3_MaxTemp > Charger.alarm_spec.OT_G3_2 ) #endif //MODIFY_AW48_OTP_SPEC_20240802_STEVEN #endif //MODIFY_AW48_OTP_SPEC_20240522_STEVEN #ifdef MODIFY_AX48_NACS_OTP_SPEC_20240522_STEVEN #ifdef MODIFY_AX48_NACS_OTP_SPEC_20240826_STEVEN || ( (Charger.m_bModelNameAX48_NACS_1P) && ( Charger.temperature.Group3_MaxTemp > Charger.alarm_spec.OT_G3_2 || Charger.temperature.Group4_MaxTemp > Charger.alarm_spec.OT_G4_2 ) ) #else //MODIFY_AX48_NACS_OTP_SPEC_20240826_STEVEN || ( (Charger.m_bModelNameAX48_NACS_1P) && Charger.temperature.Group3_MaxTemp > Charger.alarm_spec.OT_G3_2 ) #endif //MODIFY_AX48_NACS_OTP_SPEC_20240826_STEVEN #endif //MODIFY_AX48_NACS_OTP_SPEC_20240522_STEVEN #ifdef MODIFY_AX80_NACS_OTP_SPEC_20240911_JACK || ( (Charger.m_bModelNameAX80_NACS_1P) && ( Charger.temperature.Group3_MaxTemp > Charger.alarm_spec.OT_G3_2 || Charger.temperature.Group4_MaxTemp > Charger.alarm_spec.OT_G4_2 ) ) #endif //MODIFY_AX80_NACS_OTP_SPEC_20240911_JACK ) #else if (Charger.temperature.MaxTemp > ALARM_SPEC_OT_2) #endif #else //FUNC_AX80_ADD_4_TEMP_SENEOR #ifdef MODIFY_OTP_SPEC if (Charger.temperature.SystemAmbientTemp > Charger.alarm_spec.OT_2) #else if (Charger.temperature.SystemAmbientTemp > ALARM_SPEC_OT_2) #endif #endif //FUNC_AX80_ADD_4_TEMP_SENEOR { if(Charger.counter.OT.fail > 2000) { if (Charger.counter.OT.isLatch == OFF) { Charger.counter.OT.isLatch = ON ; setLedMotion(LED_ACTION_ALARM); } if(!(Charger.Alarm_Code & ALARM_OVER_TEMPERATURE)) { Charger.counter.OT.isOccurInCharging = (((Charger.Mode == MODE_CHARGING) || (Charger.Mode == MODE_STOP))?ON:OFF); Charger.Alarm_Code |= ALARM_OVER_TEMPERATURE; DEBUG_ERROR("Latch OT2 occur.\r\n"); #ifdef FUNC_AX80_ADD_4_TEMP_SENEOR DEBUG_ERROR("OT_G1_MaxTemp = %d.\r\n",Charger.temperature.Group1_MaxTemp); #ifdef FUNC_AW48_ADD_6_TEMP_SENEOR #ifdef FUNC_AX48_NACS_ADD_6_TEMP_SENEOR #ifdef FUNC_AX80_NACS_ADD_6_TEMP_SENEOR if (Charger.m_bModelNameAX80_1P || Charger.m_bModelNameAW48_1P || Charger.m_bModelNameAX48_NACS_1P || Charger.m_bModelNameAX80_NACS_1P) #else //FUNC_AX80_NACS_ADD_6_TEMP_SENEOR if (Charger.m_bModelNameAX80_1P || Charger.m_bModelNameAW48_1P || Charger.m_bModelNameAX48_NACS_1P) #endif //FUNC_AX80_NACS_ADD_6_TEMP_SENEOR #else //FUNC_AX48_NACS_ADD_6_TEMP_SENEOR if (Charger.m_bModelNameAX80_1P || Charger.m_bModelNameAW48_1P) #endif //FUNC_AX48_NACS_ADD_6_TEMP_SENEOR #else if (Charger.m_bModelNameAX80_1P) #endif { DEBUG_ERROR("OT_G2_MaxTemp = %d.\r\n",Charger.temperature.Group2_MaxTemp); } #ifdef MODIFY_AW48_OTP_SPEC_20240522_STEVEN #ifdef MODIFY_AW48_OTP_SPEC_20240802_STEVEN if (Charger.m_bModelNameAW48_1P) { DEBUG_ERROR("OT_G3_MaxTemp = %d, OT_G4_MaxTemp = %d.\r\n",Charger.temperature.Group3_MaxTemp, Charger.temperature.Group4_MaxTemp); } #else //MODIFY_AW48_OTP_SPEC_20240802_STEVEN if (Charger.m_bModelNameAW48_1P) { DEBUG_ERROR("OT_G3_MaxTemp = %d.\r\n",Charger.temperature.Group3_MaxTemp); } #endif //MODIFY_AW48_OTP_SPEC_20240802_STEVEN #endif //MODIFY_AW48_OTP_SPEC_20240522_STEVEN #ifdef MODIFY_AX48_NACS_OTP_SPEC_20240522_STEVEN #ifdef MODIFY_AX48_NACS_OTP_SPEC_20240826_STEVEN if (Charger.m_bModelNameAX48_NACS_1P) { DEBUG_ERROR("OT_G3_MaxTemp = %d, OT_G4_MaxTemp = %d.\r\n",Charger.temperature.Group3_MaxTemp, Charger.temperature.Group4_MaxTemp); } #else //MODIFY_AX48_NACS_OTP_SPEC_20240826_STEVEN if (Charger.m_bModelNameAX48_NACS_1P) { DEBUG_ERROR("OT_G3_MaxTemp = %d.\r\n",Charger.temperature.Group3_MaxTemp); } #endif //MODIFY_AX48_NACS_OTP_SPEC_20240826_STEVEN #endif //MODIFY_AX48_NACS_OTP_SPEC_20240522_STEVEN #ifdef MODIFY_AX80_NACS_OTP_SPEC_20240911_JACK if (Charger.m_bModelNameAX80_NACS_1P) { DEBUG_ERROR("OT_G3_MaxTemp = %d, OT_G4_MaxTemp = %d.\r\n",Charger.temperature.Group3_MaxTemp, Charger.temperature.Group4_MaxTemp); } #endif //MODIFY_AX80_NACS_OTP_SPEC_20240911_JACK #else //FUNC_AX80_ADD_4_TEMP_SENEOR DEBUG_ERROR("Tmp = %d.\r\n",Charger.temperature.SystemAmbientTemp); #endif //FUNC_AX80_ADD_4_TEMP_SENEOR } } else Charger.counter.OT.fail++; } #ifdef FUNC_AX80_ADD_4_TEMP_SENEOR #ifdef MODIFY_OTP_SPEC //else if((Charger.temperature.MaxTemp > Charger.alarm_spec.OT_1) && (!Charger.counter.OT.isLatch)) else if ( ((Charger.temperature.Group1_MaxTemp > Charger.alarm_spec.OT_G1_1) && (!Charger.counter.OT.isLatch)) || ( #ifdef FUNC_AW48_ADD_6_TEMP_SENEOR #ifdef FUNC_AX48_NACS_ADD_6_TEMP_SENEOR #ifdef FUNC_AX80_NACS_ADD_6_TEMP_SENEOR (Charger.m_bModelNameAX80_1P || Charger.m_bModelNameAW48_1P || Charger.m_bModelNameAX48_NACS_1P || Charger.m_bModelNameAX80_NACS_1P) && #else //FUNC_AX80_NACS_ADD_6_TEMP_SENEOR (Charger.m_bModelNameAX80_1P || Charger.m_bModelNameAW48_1P || Charger.m_bModelNameAX48_NACS_1P) && #endif //FUNC_AX80_NACS_ADD_6_TEMP_SENEOR #else //FUNC_AX48_NACS_ADD_6_TEMP_SENEOR (Charger.m_bModelNameAX80_1P || Charger.m_bModelNameAW48_1P) && #endif //FUNC_AX48_NACS_ADD_6_TEMP_SENEOR #else Charger.m_bModelNameAX80_1P && #endif Charger.temperature.Group2_MaxTemp > Charger.alarm_spec.OT_G2_1 && !Charger.counter.OT.isLatch ) #ifdef MODIFY_AW48_OTP_SPEC_20240522_STEVEN #ifdef MODIFY_AW48_OTP_SPEC_20240802_STEVEN || ( (Charger.m_bModelNameAW48_1P) && ( Charger.temperature.Group3_MaxTemp > Charger.alarm_spec.OT_G3_1 || Charger.temperature.Group4_MaxTemp > Charger.alarm_spec.OT_G4_1 ) && !Charger.counter.OT.isLatch ) #else //MODIFY_AW48_OTP_SPEC_20240802_STEVEN || ( (Charger.m_bModelNameAW48_1P) && Charger.temperature.Group3_MaxTemp > Charger.alarm_spec.OT_G3_1 && !Charger.counter.OT.isLatch ) #endif //MODIFY_AW48_OTP_SPEC_20240802_STEVEN #endif //MODIFY_AW48_OTP_SPEC_20240522_STEVEN #ifdef MODIFY_AX48_NACS_OTP_SPEC_20240522_STEVEN #ifdef MODIFY_AX48_NACS_OTP_SPEC_20240826_STEVEN || ( (Charger.m_bModelNameAX48_NACS_1P) && ( Charger.temperature.Group3_MaxTemp > Charger.alarm_spec.OT_G3_1 || Charger.temperature.Group4_MaxTemp > Charger.alarm_spec.OT_G4_1 ) && !Charger.counter.OT.isLatch ) #else //MODIFY_AX48_NACS_OTP_SPEC_20240826_STEVEN || ( (Charger.m_bModelNameAX48_NACS_1P) && Charger.temperature.Group3_MaxTemp > Charger.alarm_spec.OT_G3_1 && !Charger.counter.OT.isLatch ) #endif //MODIFY_AX48_NACS_OTP_SPEC_20240826_STEVEN #endif //MODIFY_AX48_NACS_OTP_SPEC_20240522_STEVEN #ifdef MODIFY_AX80_NACS_OTP_SPEC_20240911_JACK || ( (Charger.m_bModelNameAX80_NACS_1P) && ( Charger.temperature.Group3_MaxTemp > Charger.alarm_spec.OT_G3_1 || Charger.temperature.Group4_MaxTemp > Charger.alarm_spec.OT_G4_1 ) && !Charger.counter.OT.isLatch ) #endif //MODIFY_AX80_NACS_OTP_SPEC_20240911_JACK ) #else else if((Charger.temperature.MaxTemp > ALARM_SPEC_OT_1) && (!Charger.counter.OT.isLatch)) #endif #else //FUNC_AX80_ADD_4_TEMP_SENEOR #ifdef MODIFY_OTP_SPEC else if((Charger.temperature.SystemAmbientTemp > Charger.alarm_spec.OT_1) && (!Charger.counter.OT.isLatch)) #else else if((Charger.temperature.SystemAmbientTemp > ALARM_SPEC_OT_1) && (!Charger.counter.OT.isLatch)) #endif #endif //FUNC_AX80_ADD_4_TEMP_SENEOR { if(Charger.counter.OT.fail > 1000) { if(!(Charger.Alarm_Code & ALARM_OVER_TEMPERATURE)) { Charger.counter.OT.isOccurInCharging = (((Charger.Mode == MODE_CHARGING) || (Charger.Mode == MODE_STOP))?ON:OFF); Charger.Alarm_Code |= ALARM_OVER_TEMPERATURE; DEBUG_ERROR("Alarm OT occur.\r\n"); #ifdef FUNC_GUN_TEMP_LATCH { static u8 nGunOTP = 0; u8 nTmp = nGunOTP; if (Charger.m_bModelNameAW48_1P) { if (Charger.temperature.AW48_T5_L1_GUN > Charger.alarm_spec.OT_G4_1 || Charger.temperature.AW48_T6_L2_GUN > Charger.alarm_spec.OT_G4_1) nGunOTP++; } else if (Charger.m_bModelNameAX48_NACS_1P) { if (Charger.temperature.AX48_NACS_T5_L1_GUN > Charger.alarm_spec.OT_G2_1 || Charger.temperature.AX48_NACS_T6_L2_GUN > Charger.alarm_spec.OT_G2_1) nGunOTP++; } else if (Charger.m_bModelNameAX80_NACS_1P) { if (Charger.temperature.AX80_NACS_T5_L1_GUN > Charger.alarm_spec.OT_G2_1 || Charger.temperature.AX80_NACS_T6_L2_GUN > Charger.alarm_spec.OT_G2_1) nGunOTP++; } if (nGunOTP >= 3) { Charger.counter.OT.isLatch = ON; nGunOTP = 0; } if (nTmp != nGunOTP) { DEBUG_ERROR("Alarm GUN_OT(%d) %s\r\n", nGunOTP, Charger.counter.OT.isLatch ? "=> LATCH" : ""); //Alarm GUN_OT(3) => LATCH } } #endif //FUNC_GUN_TEMP_LATCH } } else Charger.counter.OT.fail++; } #ifdef FUNC_AX80_ADD_4_TEMP_SENEOR #ifdef MODIFY_OTP_SPEC //else if((Charger.temperature.MaxTemp < (Charger.alarm_spec.OT_1 - Charger.alarm_spec.OT_HYSTERESIS)) && (!Charger.counter.OT.isLatch)) else if ( (Charger.temperature.Group1_MaxTemp < (Charger.alarm_spec.OT_G1_1 - Charger.alarm_spec.OT_G1_HYSTERESIS)) && (!Charger.counter.OT.isLatch) #ifdef FUNC_MODIFY_OTP_RECOVER_PROCESS && #else || #endif ( #ifdef FUNC_AW48_ADD_6_TEMP_SENEOR #ifdef FUNC_AX48_NACS_ADD_6_TEMP_SENEOR #ifdef FUNC_AX80_NACS_ADD_6_TEMP_SENEOR (Charger.m_bModelNameAX80_1P || Charger.m_bModelNameAW48_1P || Charger.m_bModelNameAX48_NACS_1P || Charger.m_bModelNameAX80_NACS_1P) && #else //FUNC_AX80_NACS_ADD_6_TEMP_SENEOR (Charger.m_bModelNameAX80_1P || Charger.m_bModelNameAW48_1P || Charger.m_bModelNameAX48_NACS_1P) && #endif //FUNC_AX80_NACS_ADD_6_TEMP_SENEOR #else //FUNC_AX48_NACS_ADD_6_TEMP_SENEOR (Charger.m_bModelNameAX80_1P || Charger.m_bModelNameAW48_1P) && #endif //FUNC_AX48_NACS_ADD_6_TEMP_SENEOR #else //FUNC_AW48_ADD_6_TEMP_SENEOR Charger.m_bModelNameAX80_1P && #endif //FUNC_AW48_ADD_6_TEMP_SENEOR Charger.temperature.Group2_MaxTemp < (Charger.alarm_spec.OT_G2_1 - Charger.alarm_spec.OT_G2_HYSTERESIS) && !Charger.counter.OT.isLatch ) #ifdef FUNC_MODIFY_OTP_RECOVER_PROCESS //Do nothing #else //FUNC_MODIFY_OTP_RECOVER_PROCESS #ifdef MODIFY_AW48_OTP_SPEC_20240522_STEVEN || ( (Charger.m_bModelNameAW48_1P) && Charger.temperature.Group3_MaxTemp < (Charger.alarm_spec.OT_G3_1 - Charger.alarm_spec.OT_G3_HYSTERESIS) && !Charger.counter.OT.isLatch ) #endif //MODIFY_AW48_OTP_SPEC_20240522_STEVEN #ifdef MODIFY_AX48_NACS_OTP_SPEC_20240522_STEVEN || ( (Charger.m_bModelNameAX48_NACS_1P) && Charger.temperature.Group3_MaxTemp < (Charger.alarm_spec.OT_G3_1 - Charger.alarm_spec.OT_G3_HYSTERESIS) && !Charger.counter.OT.isLatch ) #endif //MODIFY_AX48_NACS_OTP_SPEC_20240522_STEVEN #endif //FUNC_MODIFY_OTP_RECOVER_PROCESS ) #else else if((Charger.temperature.MaxTemp < (ALARM_SPEC_OT_1-ALARM_SPEC_OT_HYSTERESIS)) && (!Charger.counter.OT.isLatch)) #endif #else //FUNC_AX80_ADD_4_TEMP_SENEOR #ifdef MODIFY_OTP_SPEC else if((Charger.temperature.SystemAmbientTemp < (Charger.alarm_spec.OT_1 - Charger.alarm_spec.OT_HYSTERESIS)) && (!Charger.counter.OT.isLatch)) #else else if((Charger.temperature.SystemAmbientTemp < (ALARM_SPEC_OT_1-ALARM_SPEC_OT_HYSTERESIS)) && (!Charger.counter.OT.isLatch)) #endif #endif //FUNC_AX80_ADD_4_TEMP_SENEOR { #ifdef FUNC_MODIFY_OTP_RECOVER_PROCESS #ifdef MODIFY_AW48_OTP_SPEC_20240802_STEVEN if (Charger.m_bModelNameAW48_1P) { if ( Charger.temperature.Group3_MaxTemp < (Charger.alarm_spec.OT_G3_1 - Charger.alarm_spec.OT_G3_HYSTERESIS) && Charger.temperature.Group4_MaxTemp < (Charger.alarm_spec.OT_G4_1 - Charger.alarm_spec.OT_G4_HYSTERESIS) && !Charger.counter.OT.isLatch) { if((Charger.Alarm_Code & ALARM_OVER_TEMPERATURE) && blinker[BLINKER_IDX_LED].blinkisFinish) { Charger.counter.OT.retry++; Charger.Alarm_Code &= ~ALARM_OVER_TEMPERATURE; DEBUG_INFO("Alarm OT recover.\r\n"); } } } else if (Charger.m_bModelNameAX48_NACS_1P) { #ifdef MODIFY_AX48_NACS_OTP_SPEC_20240826_STEVEN if ( Charger.temperature.Group3_MaxTemp < (Charger.alarm_spec.OT_G3_1 - Charger.alarm_spec.OT_G3_HYSTERESIS) && Charger.temperature.Group4_MaxTemp < (Charger.alarm_spec.OT_G4_1 - Charger.alarm_spec.OT_G4_HYSTERESIS) && !Charger.counter.OT.isLatch) { if((Charger.Alarm_Code & ALARM_OVER_TEMPERATURE) && blinker[BLINKER_IDX_LED].blinkisFinish) { Charger.counter.OT.retry++; Charger.Alarm_Code &= ~ALARM_OVER_TEMPERATURE; DEBUG_INFO("Alarm OT recover.\r\n"); } } #else //MODIFY_AX48_NACS_OTP_SPEC_20240826_STEVEN if ( Charger.temperature.Group3_MaxTemp < (Charger.alarm_spec.OT_G3_1 - Charger.alarm_spec.OT_G3_HYSTERESIS) && !Charger.counter.OT.isLatch) { if((Charger.Alarm_Code & ALARM_OVER_TEMPERATURE) && blinker[BLINKER_IDX_LED].blinkisFinish) { Charger.counter.OT.retry++; Charger.Alarm_Code &= ~ALARM_OVER_TEMPERATURE; DEBUG_INFO("Alarm OT recover.\r\n"); } } #endif //MODIFY_AX48_NACS_OTP_SPEC_20240826_STEVEN } #ifdef MODIFY_AX80_NACS_OTP_SPEC_20240911_JACK else if (Charger.m_bModelNameAX80_NACS_1P) { if ( Charger.temperature.Group3_MaxTemp < (Charger.alarm_spec.OT_G3_1 - Charger.alarm_spec.OT_G3_HYSTERESIS) && Charger.temperature.Group4_MaxTemp < (Charger.alarm_spec.OT_G4_1 - Charger.alarm_spec.OT_G4_HYSTERESIS) && !Charger.counter.OT.isLatch) { if((Charger.Alarm_Code & ALARM_OVER_TEMPERATURE) && blinker[BLINKER_IDX_LED].blinkisFinish) { Charger.counter.OT.retry++; Charger.Alarm_Code &= ~ALARM_OVER_TEMPERATURE; DEBUG_INFO("Alarm OT recover.\r\n"); } } } #endif //MODIFY_AX80_NACS_OTP_SPEC_20240911_JACK else { Charger.counter.OT.fail = 0; if((Charger.Alarm_Code & ALARM_OVER_TEMPERATURE) && blinker[BLINKER_IDX_LED].blinkisFinish) { Charger.counter.OT.retry++; Charger.Alarm_Code &= ~ALARM_OVER_TEMPERATURE; DEBUG_INFO("Alarm OT recover.\r\n"); } } #else //MODIFY_AW48_OTP_SPEC_20240802_STEVEN if (Charger.m_bModelNameAW48_1P || Charger.m_bModelNameAX48_NACS_1P) { if ( Charger.temperature.Group3_MaxTemp < (Charger.alarm_spec.OT_G3_1 - Charger.alarm_spec.OT_G3_HYSTERESIS) && !Charger.counter.OT.isLatch) { if((Charger.Alarm_Code & ALARM_OVER_TEMPERATURE) && blinker[BLINKER_IDX_LED].blinkisFinish) { Charger.counter.OT.retry++; Charger.Alarm_Code &= ~ALARM_OVER_TEMPERATURE; DEBUG_INFO("Alarm OT recover.\r\n"); } } } else { Charger.counter.OT.fail = 0; if((Charger.Alarm_Code & ALARM_OVER_TEMPERATURE) && blinker[BLINKER_IDX_LED].blinkisFinish) { Charger.counter.OT.retry++; Charger.Alarm_Code &= ~ALARM_OVER_TEMPERATURE; DEBUG_INFO("Alarm OT recover.\r\n"); } } #endif //MODIFY_AW48_OTP_SPEC_20240802_STEVEN #else //FUNC_MODIFY_OTP_RECOVER_PROCESS Charger.counter.OT.fail = 0; if((Charger.Alarm_Code & ALARM_OVER_TEMPERATURE) && blinker[BLINKER_IDX_LED].blinkisFinish) { Charger.counter.OT.retry++; Charger.Alarm_Code &= ~ALARM_OVER_TEMPERATURE; DEBUG_INFO("Alarm OT recover.\r\n"); } #endif //FUNC_MODIFY_OTP_RECOVER_PROCESS } #endif //OTP_PROTECT //================================ // Current leakage alarm detect // TODO: ADC channel & spec need to check for other detection method //================================ #ifdef CCID_PROTECT if (Charger.CCID_Module_Type == CCID_MODULE_VAC) { //module test if((HAL_GPIO_ReadPin(IN_Leak_Error_GPIO_Port, IN_Leak_Error_Pin) == GPIO_PIN_SET) && (!Charger.isTestLeakModule)) { if(Charger.counter.LEAK.fail > 1000) { if(!(Charger.Alarm_Code & ALARM_LEAK_MODULE_FAIL)) { Charger.counter.LEAK.isOccurInCharging = (((Charger.Mode == MODE_CHARGING) || (Charger.Mode == MODE_STOP))?ON:OFF); Charger.Alarm_Code |= ALARM_LEAK_MODULE_FAIL; DEBUG_ERROR("Alarm leakage module error occur.\r\n"); timerEnable(TIMER_IDX_RETRY_LEAK, ALARM_RETRY_INTERVAL_LEAK); } } else Charger.counter.LEAK.fail++; } else { Charger.counter.LEAK.fail = 0; if((Charger.Alarm_Code & ALARM_LEAK_MODULE_FAIL) && (Charger.counter.LEAK.retry < ALARM_RETRY_COUNT) && (timer[TIMER_IDX_RETRY_LEAK].isAlarm == ON) && blinker[BLINKER_IDX_LED].blinkisFinish) { timerDisable(TIMER_IDX_RETRY_LEAK); Charger.Alarm_Code &= ~ALARM_LEAK_MODULE_FAIL; osDelay(1000); #ifdef DEBUG DEBUG_INFO("Alarm leakage module error recover.\r\n"); #endif } } //DC leakage if((HAL_GPIO_ReadPin(IN_Leak_DC_GPIO_Port, IN_Leak_DC_Pin) == GPIO_PIN_SET) && (!Charger.isTestLeakModule)) { if(Charger.counter.LEAK_DC.fail > 10) { if(!(Charger.Alarm_Code & ALARM_CURRENT_LEAK_DC)) { Charger.counter.LEAK_DC.isOccurInCharging = (((Charger.Mode == MODE_CHARGING) || (Charger.Mode == MODE_STOP))?ON:OFF); Charger.Alarm_Code |= ALARM_CURRENT_LEAK_DC; DEBUG_ERROR("Alarm DC leakage occur.\r\n"); timerEnable(TIMER_IDX_RETRY_LEAK_DC, ALARM_RETRY_INTERVAL_LEAK); Charger.counter.LEAK_DC.retry++; } if (timer[TIMER_IDX_RETRY_LEAK_DC].isAlarm == ON || (Charger.counter.LEAK_DC.retry >ALARM_RETRY_COUNT)) { timerDisable(TIMER_IDX_RETRY_LEAK_DC); //Charger.counter.LEAK.isLatch = ON ; if (Charger.counter.LEAK.isLatch == OFF) { Charger.counter.LEAK.isLatch = ON ; setLedMotion(LED_ACTION_ALARM); } DEBUG_ERROR("Alarm leakage DC isLatch.\r\n"); } } else Charger.counter.LEAK_DC.fail++; } else { Charger.counter.LEAK_DC.fail = 0; if((Charger.Alarm_Code & ALARM_CURRENT_LEAK_DC) && (Charger.counter.LEAK_DC.retry <= ALARM_RETRY_COUNT) && (timer[TIMER_IDX_RETRY_LEAK_DC].isAlarm == ON) && blinker[BLINKER_IDX_LED].blinkisFinish) { timerDisable(TIMER_IDX_RETRY_LEAK_DC); Charger.Alarm_Code &= ~ALARM_CURRENT_LEAK_DC; DEBUG_INFO("Alarm DC leakage recover.\r\n"); } } //AC leakage if((HAL_GPIO_ReadPin(IN_Leak_AC_GPIO_Port, IN_Leak_AC_Pin) == GPIO_PIN_SET) && (!Charger.isTestLeakModule)) { if(Charger.counter.LEAK_AC.fail > 10) { if(!(Charger.Alarm_Code & ALARM_CURRENT_LEAK_AC)) { Charger.counter.LEAK_AC.isOccurInCharging = (((Charger.Mode == MODE_CHARGING) || (Charger.Mode == MODE_STOP))?ON:OFF); Charger.Alarm_Code |= ALARM_CURRENT_LEAK_AC; DEBUG_ERROR("Alarm AC leakage occur.\r\n"); timerEnable(TIMER_IDX_RETRY_LEAK_AC, ALARM_RETRY_INTERVAL_LEAK); Charger.counter.LEAK_AC.retry++; } if (timer[TIMER_IDX_RETRY_LEAK_AC].isAlarm == ON || (Charger.counter.LEAK_AC.retry > ALARM_RETRY_COUNT)) { timerDisable(TIMER_IDX_RETRY_LEAK_AC); //Charger.counter.LEAK.isLatch = ON ; if (Charger.counter.LEAK.isLatch == OFF) { Charger.counter.LEAK.isLatch = ON ; setLedMotion(LED_ACTION_ALARM); } DEBUG_ERROR("Alarm leakage AC isLatch.\r\n"); } } else Charger.counter.LEAK_AC.fail++; } else { Charger.counter.LEAK_AC.fail = 0; if((Charger.Alarm_Code & ALARM_CURRENT_LEAK_AC) && (Charger.counter.LEAK_AC.retry <= ALARM_RETRY_COUNT) && (timer[TIMER_IDX_RETRY_LEAK_AC].isAlarm == ON) && blinker[BLINKER_IDX_LED].blinkisFinish ) { timerDisable(TIMER_IDX_RETRY_LEAK_AC); Charger.Alarm_Code &= ~ALARM_CURRENT_LEAK_AC; DEBUG_INFO("Alarm AC leakage recover.\r\n"); } } } else // Charger.CCID_Module_Type is CCID_MODULE_CORMEX { if((Charger.Leak_Current >= Charger.alarm_spec.Current_LEAK_AC) && (!Charger.isTestLeakModule)) // adc correction data to check { if(Charger.counter.LEAK.fail >= 5) { if(!(Charger.Alarm_Code & ALARM_CURRENT_LEAK_AC)) { #ifdef FUNC_MODIFY_LEAK_AC_DISPLAY XP("#Leak_Current (%d >= %d)\r\n", Charger.Leak_Current, Charger.alarm_spec.Current_LEAK_AC); #else XP("************************************************************\r\n"); XP("adc_value.ADC2_IN6_GF.value = %d\r\n", adc_value.ADC2_IN6_GF.value); XP("Charger.Leak_Current(mA) = %d\r\n", Charger.Leak_Current); XP("Charger.alarm_spec.Current_LEAK_AC(mA) = %d\r\n", Charger.alarm_spec.Current_LEAK_AC); XP("Charger.isTestLeakModule = %s\r\n", Charger.isTestLeakModule ? "ON" : "OFF"); XP("************************************************************\r\n"); #endif Charger.counter.LEAK.isOccurInCharging = (((Charger.Mode == MODE_CHARGING) || (Charger.Mode == MODE_STOP))?ON:OFF); Charger.Alarm_Code |= ALARM_CURRENT_LEAK_AC; //Hao##### CSU Charge error here DEBUG_ERROR("Alarm leakage occur.\r\n"); timerEnable(TIMER_IDX_RETRY_LEAK_AC, ALARM_RETRY_INTERVAL_LEAK); Charger.counter.LEAK.retry ++ ; } } else { Charger.counter.LEAK.fail++; } } else if (Charger.Leak_Current < (Charger.alarm_spec.Current_LEAK_AC - ALARM_SPEC_CURRENT_LEAK_HYSTERESIS)) // adc correction data to check { Charger.counter.LEAK.fail = 0; if (Charger.counter.LEAK.retry > ALARM_LEAK_RETRY_COUNT) { if (Charger.counter.LEAK.isLatch == OFF) { Charger.counter.LEAK.isLatch = ON ; setLedMotion(LED_ACTION_ALARM); } } else { if(((Charger.Alarm_Code & ALARM_CURRENT_LEAK_AC)||(Charger.Alarm_Code & ALARM_CURRENT_LEAK_DC)) && (Charger.counter.LEAK.retry <= ALARM_LEAK_RETRY_COUNT) && (timer[TIMER_IDX_RETRY_LEAK_AC].isAlarm == ON) && blinker[BLINKER_IDX_LED].blinkisFinish ) { timerDisable(TIMER_IDX_RETRY_LEAK_AC); osDelay(1000); Charger.Alarm_Code &= ~ALARM_CURRENT_LEAK_AC; DEBUG_INFO("Alarm leakage recover.\r\n"); } } } } #endif //CCID_PROTECT //================================ // Ground fail alarm detect // TODO: Spec need to check //================================ #ifdef GROUND_FAULT_PROTECT if(Charger.GroundingDetect==ON) { if (timer[TIMER_IDX_PE_DETECT].isAlarm == ON) // after 30 sec check (GMI adc_value > spec) and (GMI adc_value <= 1 ) { if(((adc_value.ADC3_IN4_GMI_VL1.value*100*3.3/4095) > (Charger.Voltage[0]*0.011)) || (adc_value.ADC3_IN4_GMI_VL1.value <= 1)) //Part FAIL { #ifdef TEST_GROUND_FAULT_PROTECT_TIME_TO_15_SEC if(Charger.counter.GF.fail > 15000) #else if(Charger.counter.GF.fail > 4000) #endif { if(!(Charger.Alarm_Code & ALARM_GROUND_FAIL)) { Charger.counter.GF.isOccurInCharging = (((Charger.Mode == MODE_CHARGING) || (Charger.Mode == MODE_STOP))?ON:OFF); Charger.Alarm_Code |= ALARM_GROUND_FAIL; DEBUG_ERROR("Alarm GF occur.\r\n"); #ifdef MODIFY_ALARM_GROUND_FAIL_RECOVER_USE_RESTORE Charger.counter.GF.restore = 0; #endif #ifdef DEBUG_ALARM_GROUND_FAIL XP("#adc_value.ADC3_IN4_GMI_VL1.value = %d\r\n", adc_value.ADC3_IN4_GMI_VL1.value); XP("#adc_value.ADC3_IN4_GMI_VL1.value*100*3.3/4095 = %f\r\n", adc_value.ADC3_IN4_GMI_VL1.value*100*3.3/4095); XP("#Charger.Voltage[0]*0.011 = %f\r\n", Charger.Voltage[0]*0.011); #endif } } else Charger.counter.GF.fail++; } else if((adc_value.ADC3_IN4_GMI_VL1.value*100*3.3/4095) < (Charger.Voltage[0]*0.00566)) { #ifdef MODIFY_ALARM_GROUND_FAIL_RECOVER_USE_RESTORE if((Charger.Alarm_Code & ALARM_GROUND_FAIL) && blinker[BLINKER_IDX_LED].blinkisFinish) { if (Charger.counter.GF.restore > 2000) { Charger.Alarm_Code &= ~ALARM_GROUND_FAIL; DEBUG_INFO("Alarm GF recover.\r\n"); Charger.counter.GF.fail = 0; } else { Charger.counter.GF.restore++; } } #else //MODIFY_ALARM_GROUND_FAIL_RECOVER_USE_RESTORE Charger.counter.GF.fail = 0; if((Charger.Alarm_Code & ALARM_GROUND_FAIL) && blinker[BLINKER_IDX_LED].blinkisFinish) { Charger.counter.GF.retry++; Charger.Alarm_Code &= ~ALARM_GROUND_FAIL; DEBUG_INFO("Alarm GF recover.\r\n"); } #endif //MODIFY_ALARM_GROUND_FAIL_RECOVER_USE_RESTORE } } else // before 30 sec check (GMI adc_value > spec) { if((adc_value.ADC3_IN4_GMI_VL1.value*100*3.3/4095) > (Charger.Voltage[0]*0.011)) { if(Charger.counter.GF.fail > 4000) { if(!(Charger.Alarm_Code & ALARM_GROUND_FAIL)) { Charger.counter.GF.isOccurInCharging = (((Charger.Mode == MODE_CHARGING) || (Charger.Mode == MODE_STOP))?ON:OFF); Charger.Alarm_Code |= ALARM_GROUND_FAIL; DEBUG_ERROR("Alarm GF occur.\r\n"); #ifdef MODIFY_ALARM_GROUND_FAIL_RECOVER_USE_RESTORE Charger.counter.GF.restore = 0; #endif } } else Charger.counter.GF.fail++; } else if((adc_value.ADC3_IN4_GMI_VL1.value*100*3.3/4095) < (Charger.Voltage[0]*0.00566)) { #ifdef MODIFY_ALARM_GROUND_FAIL_RECOVER_USE_RESTORE //Charger.counter.GF.fail = 0; if((Charger.Alarm_Code & ALARM_GROUND_FAIL) && blinker[BLINKER_IDX_LED].blinkisFinish) { if (Charger.counter.GF.restore > 2000) { Charger.Alarm_Code &= ~ALARM_GROUND_FAIL; DEBUG_INFO("Alarm GF recover.\r\n"); Charger.counter.GF.fail = 0; } else { Charger.counter.GF.restore++; } } #else //MODIFY_ALARM_GROUND_FAIL_RECOVER_USE_RESTORE Charger.counter.GF.fail = 0; if((Charger.Alarm_Code & ALARM_GROUND_FAIL) && blinker[BLINKER_IDX_LED].blinkisFinish) { //osDelay(3000); Charger.counter.GF.retry++; Charger.Alarm_Code &= ~ALARM_GROUND_FAIL; DEBUG_INFO("Alarm GF recover.\r\n"); } #endif //MODIFY_ALARM_GROUND_FAIL_RECOVER_USE_RESTORE } } } #endif //GROUND_FAULT_PROTECT //================================ // Relay status error detect // TODO: ADC channel & spec need to check //================================ #ifdef MODIFY_ALARM_DETECT_RELAY_WELDING_BLOCK #ifdef FUNC_USE_RELAY_B_CONTACT if (Charger.m_bUseRelayBContact) AlarmDetect_RelayWelding_UseGPIO(); else AlarmDetect_RelayWelding_UseADC(); #else AlarmDetect_RelayWelding_UseADC(); #endif //FUNC_USE_RELAY_B_CONTACT #endif //MODIFY_ALARM_DETECT_RELAY_WELDING_BLOCK //================================ // Emergency stop alarm detect //================================ #ifdef EMC_BUTTON_PROTECT if(HAL_GPIO_ReadPin(IN_Emergency_GPIO_Port, IN_Emergency_Pin) == GPIO_PIN_RESET) { if(Charger.counter.EMO.fail > 100) { if(!(Charger.Alarm_Code & ALARM_EMERGENCY_STOP)) { Charger.counter.EMO.isOccurInCharging = (((Charger.Mode == MODE_CHARGING) || (Charger.Mode == MODE_STOP))?ON:OFF); Charger.Alarm_Code |= ALARM_EMERGENCY_STOP; DEBUG_ERROR("Alarm EMO occur.\r\n"); } } else Charger.counter.EMO.fail++; } else { Charger.counter.EMO.fail = 0; if((Charger.Alarm_Code & ALARM_EMERGENCY_STOP) && blinker[BLINKER_IDX_LED].blinkisFinish) { Charger.counter.EMO.retry++; Charger.Alarm_Code &= ~ALARM_EMERGENCY_STOP; DEBUG_INFO("Alarm EMO recover.\r\n"); } } #endif //EMC_BUTTON_PROTECT //================================ // Handshaking timeout detect //================================ #ifdef HANDSHAKE_PROTECT if(timer[TIMER_IDX_CP].isAlarm == ON) { if(!(Charger.Alarm_Code & ALARM_HANDSHAKE_TIMEOUT)) { Charger.Alarm_Code |= ALARM_HANDSHAKE_TIMEOUT; timerDisable(TIMER_IDX_CP); Charger.rfid.op_bits.reqStart = OFF; Charger.istoHandShakeMode = OFF ; DEBUG_ERROR("Alarm handshake overtime occur.\r\n"); } } else { if((Charger.Alarm_Code & ALARM_HANDSHAKE_TIMEOUT)) { osDelay(10000); Charger.Alarm_Code &= ~ALARM_HANDSHAKE_TIMEOUT; DEBUG_INFO("Alarm handshake overtime recover.\r\n"); } } #endif //HANDSHAKE_PROTECT //================================ // Rotary Switch Maxium Current Error detect //================================ #ifdef ROTATE_SWITCH_CHECK if (Charger.isRotarySwitchError) { if(!(Charger.Alarm_Code & ALARM_ROTATORY_SWITCH_FAULT)) { Charger.Alarm_Code |= ALARM_ROTATORY_SWITCH_FAULT; if(Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_NO_CSU) { #ifdef FUNC_AW48_EXT_LED_BLINK_PERIOD_MORE_THAN_200MS if (Charger.m_bModelNameAW48_1P) { blinkerTimeSet(BLINKER_IDX_LED, AW48_EXTLED_BLINK_PERIOD, AW48_EXTLED_BLINK_PERIOD, 0, 1); } else { blinkerTimeSet(BLINKER_IDX_LED, 200, 200, 0, 1); } #else blinkerTimeSet(BLINKER_IDX_LED, 200, 200, 0, 1); #endif } DEBUG_INFO("Rotary Switch Maxium Current Error occur.\r\n"); } } #endif //ROTATE_SWITCH_CHECK //================================ // Meter communication timeout //================================ #ifdef METER_TIMEOUT_CHECK #ifdef FUNC_PTB_METER_WM3M4C if (Charger.m_bUseExtMeter_PRO380 || Charger.m_bUseExtMeter_WM3M4C) #else if (Charger.m_bUseExtMeter_PRO380) #endif { #ifdef RECODE_METER_PRO380 if (Charger.m_bUseExtMeter_PRO380 && Charger.m_pPRO380) { Charger.m_pPRO380->m_bCommTimeout = HTK_IsTimeout(Charger.m_pPRO380->m_LastUpdateTick, METER_EXT_COMM_TIMEOUT); } if (Charger.m_bUseExtMeter_WM3M4C && Charger.m_pWM3M4C) { Charger.m_pWM3M4C->m_bCommTimeout = HTK_IsTimeout(Charger.m_pWM3M4C->m_LastUpdateTick, METER_EXT_COMM_TIMEOUT); } if ( (Charger.m_bUseExtMeter_PRO380 && Charger.m_pPRO380 && Charger.m_pPRO380->m_bCommTimeout) || (Charger.m_bUseExtMeter_WM3M4C && Charger.m_pWM3M4C && Charger.m_pWM3M4C->m_bCommTimeout) ) #else #ifdef MODIFY_METER_EXT_PRO380 #ifdef FUNC_PTB_METER_WM3M4C if ( (Charger.m_bUseExtMeter_PRO380 && HTK_IsTimeout(Charger.m_MeterPRO380.m_LastUpdateTick, METER_EXT_COMM_TIMEOUT)) || (Charger.m_bUseExtMeter_WM3M4C && HTK_IsTimeout(Charger.m_pWM3M4C->m_LastUpdateTick, METER_EXT_COMM_TIMEOUT)) ) #else //FUNC_PTB_METER_WM3M4C if (HTK_IsTimeout(Charger.m_MeterPRO380.m_LastUpdateTick, METER_EXT_COMM_TIMEOUT)) #endif //FUNC_PTB_METER_WM3M4C #else //MODIFY_METER_EXT_PRO380 if (Charger.counter.Meter_Timeout.fail >= ALARM_SPEC_METER_TIMEOUT) #endif //MODIFY_METER_EXT_PRO380 #endif //RECODE_METER_PRO380 { if (!(Charger.Alarm_Code & ALARM_METER_TIMEOUT)) { Charger.Alarm_Code |= ALARM_METER_TIMEOUT; if (Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_NO_CSU) { #ifdef FUNC_AW48_EXT_LED_BLINK_PERIOD_MORE_THAN_200MS if (Charger.m_bModelNameAW48_1P) { blinkerTimeSet(BLINKER_IDX_LED, AW48_EXTLED_BLINK_PERIOD, AW48_EXTLED_BLINK_PERIOD, 0, 1); } else { blinkerTimeSet(BLINKER_IDX_LED, 200, 200, 0, 1); } #else blinkerTimeSet(BLINKER_IDX_LED, 200, 200, 0, 1); #endif } DEBUG_ERROR("Meter EXT COMM Timeout error occur.\r\n"); } } else { if (Charger.Alarm_Code & ALARM_METER_TIMEOUT) { Charger.Alarm_Code &= ~ALARM_METER_TIMEOUT; DEBUG_INFO("Meter EXT COMM Timeout error recover.\r\n"); } } } else { Charger.Alarm_Code &= ~ALARM_METER_TIMEOUT; } #endif //METER_TIMEOUT_CHECK #ifdef FUNC_WARNING_CODE #ifdef FUNC_EKM_OMNIMETER { const char s[] = "[WARN] Omnimeter timeout warning"; if (Charger.m_bUseExtMeter_OMNIMETER && Charger.m_pEKM_Omnimeter) { if (Charger.m_pEKM_Omnimeter->m_bCommTimeout) { if (!(Charger.Warning_Code & WARN_OMNIMETER_COMM_TIMEOUT)) { Charger.Warning_Code |= WARN_OMNIMETER_COMM_TIMEOUT; DEBUG_ERROR("%s occur.\r\n", s); } } else { if (Charger.Warning_Code & WARN_OMNIMETER_COMM_TIMEOUT) { Charger.Warning_Code &= ~WARN_OMNIMETER_COMM_TIMEOUT; DEBUG_ERROR("%s recover.\r\n", s); } } } else { if (Charger.Warning_Code & WARN_OMNIMETER_COMM_TIMEOUT) { Charger.Warning_Code &= ~WARN_OMNIMETER_COMM_TIMEOUT; DEBUG_ERROR("%s recover.\r\n", s); } } } #endif //FUNC_EKM_OMNIMETER #endif //FUNC_WARNING_CODE #ifdef FUNC_METER_IC_COMM_ALARM if (HTK_IsTimeout(Charger.m_MeterIC_LastUpdateTick, METER_IC_COMM_TIMEOUT)) { if (!(Charger.Alarm_Code & ALARM_METER_IC_TIMEOUT)) { Charger.Alarm_Code |= ALARM_METER_IC_TIMEOUT; if (Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_NO_CSU) { #ifdef FUNC_AW48_EXT_LED_BLINK_PERIOD_MORE_THAN_200MS if (Charger.m_bModelNameAW48_1P) { blinkerTimeSet(BLINKER_IDX_LED, AW48_EXTLED_BLINK_PERIOD, AW48_EXTLED_BLINK_PERIOD, 0, 1); } else { blinkerTimeSet(BLINKER_IDX_LED, 200, 200, 0, 1); } #else blinkerTimeSet(BLINKER_IDX_LED, 200, 200, 0, 1); #endif } DEBUG_ERROR("Meter IC COMM Timeout error occur.\r\n"); } } else { if (Charger.Alarm_Code & ALARM_METER_IC_TIMEOUT) { Charger.Alarm_Code &= ~ALARM_METER_IC_TIMEOUT; DEBUG_INFO("Meter IC COMM Timeout error recover.\r\n"); } } #endif //FUNC_METER_IC_COMM_ALARM #ifdef GUN_LOCK_ALARM if (Charger.m_bUseGunLock) { #ifdef MODIFY_GUN_LOCK_SPEC_TIMES_TO_ALARM static uint32_t AlarmOccurTick = 0; #endif if ( #ifdef FUNC_GUN_LOCK_TRIG_MODE ( Charger.m_GunLockTrigMode == GL_TRIG_MODE_RELAY && ( (GL_IsLock() && (Relay1_Action_Get() == GPIO_RELAY1_ACTION_OFF && Relay2_Action_Get() == GPIO_RELAY2_ACTION_OFF)) || (!GL_IsLock() && (Relay1_Action_Get() != GPIO_RELAY1_ACTION_OFF && Relay2_Action_Get() != GPIO_RELAY2_ACTION_OFF)) ) ) #else (GL_IsLock() && (Relay1_Action_Get() == GPIO_RELAY1_ACTION_OFF && Relay2_Action_Get() == GPIO_RELAY2_ACTION_OFF)) || (!GL_IsLock() && (Relay1_Action_Get() != GPIO_RELAY1_ACTION_OFF && Relay2_Action_Get() != GPIO_RELAY2_ACTION_OFF)) #endif #ifdef MODIFY_GUN_LOCK_SPEC_TIMES_TO_ALARM || (Charger.m_GunUnlock_Counter >= GUN_LOCK_PULSE_MAX_TIMES_CAUSE_ALARM) || (Charger.m_GunLock_Counter >= GUN_LOCK_PULSE_MAX_TIMES_CAUSE_ALARM) #endif ) { if (!(Charger.Alarm_Code & ALARM_LOCKER_FAULT)) { if (Charger.counter.GunLock.fail > 1000) { Charger.counter.GunLock.isOccurInCharging = (((Charger.Mode == MODE_CHARGING) || (Charger.Mode == MODE_STOP))?ON:OFF); Charger.Alarm_Code |= ALARM_LOCKER_FAULT; DEBUG_ERROR("Alarm GunLock occur.\r\n"); Charger.counter.GunLock.restore = 0; #ifdef MODIFY_GUN_LOCK_SPEC_TIMES_TO_ALARM AlarmOccurTick = HAL_GetTick();; #endif } else { Charger.counter.GunLock.fail++; } } #ifdef MODIFY_GUN_LOCK_SPEC_TIMES_TO_ALARM if (Charger.Alarm_Code & ALARM_LOCKER_FAULT && HTK_IsTimeout(AlarmOccurTick, 1000 * 10)) { if ( (Charger.m_GunUnlock_Counter >= GUN_LOCK_PULSE_MAX_TIMES_CAUSE_ALARM) || (Charger.m_GunLock_Counter >= GUN_LOCK_PULSE_MAX_TIMES_CAUSE_ALARM) ) { Charger.m_GunUnlock_Counter = 0; Charger.m_GunLock_Counter = 0; } } #endif } else { if (Charger.Alarm_Code & ALARM_LOCKER_FAULT) { if (Charger.counter.GunLock.restore > 1000) { Charger.Alarm_Code &= ~ALARM_LOCKER_FAULT; DEBUG_INFO("Alarm GunLock recover.\r\n"); Charger.counter.GunLock.fail = 0; #ifdef MODIFY_GUN_LOCK_SPEC_TIMES_TO_ALARM Charger.m_GunUnlock_Counter = 0; Charger.m_GunLock_Counter = 0; #endif } else { Charger.counter.GunLock.restore++; } } } } else { if (Charger.Alarm_Code & ALARM_LOCKER_FAULT) { Charger.Alarm_Code &= ~ALARM_LOCKER_FAULT; } } #endif //GUN_LOCK_ALARM #ifdef FUNC_AX80_ADD_TILT_SENSOR #ifdef FUNC_ADD_TILT_SENSOR_MODEL #ifdef FUNC_DISABLE_TILT_SENSOR_FOR_TEST if (Charger.m_bUseTiltSensor && !Charger.m_bDisableTiltSensorForTest) #else if (Charger.m_bUseTiltSensor) #endif #else //FUNC_ADD_TILT_SENSOR_MODEL if (Charger.m_bModelNameAX80_1P) #endif //FUNC_ADD_TILT_SENSOR_MODEL { AlarmDetect_TiltSensor(); } #endif //FUNC_AX80_ADD_TILT_SENSOR //================================ // Recover alarm info in state A //================================ if(Charger.CP_State == SYSTEM_STATE_A) { //SCP Recover if(Charger.Alarm_Code & ALARM_L1_CIRCUIT_SHORT) { Charger.Alarm_Code &= ~ALARM_L1_CIRCUIT_SHORT; DEBUG_INFO("Alarm L1 SCP recover.\r\n"); } if(Charger.Alarm_Code & ALARM_L2_CIRCUIT_SHORT) { Charger.Alarm_Code &= ~ALARM_L2_CIRCUIT_SHORT; DEBUG_INFO("Alarm L2 SCP recover.\r\n"); } if(Charger.Alarm_Code & ALARM_L3_CIRCUIT_SHORT) { Charger.Alarm_Code &= ~ALARM_L3_CIRCUIT_SHORT; DEBUG_INFO("Alarm L3 SCP recover.\r\n"); } //OCP Recover if(Charger.Alarm_Code & ALARM_L1_OVER_CURRENT) { Charger.Alarm_Code &= ~ALARM_L1_OVER_CURRENT; DEBUG_INFO("Alarm L1 OC recover.\r\n"); } if(Charger.Alarm_Code & ALARM_L2_OVER_CURRENT) { Charger.Alarm_Code &= ~ALARM_L2_OVER_CURRENT; DEBUG_INFO("Alarm L2 OC recover.\r\n"); } if(Charger.Alarm_Code & ALARM_L3_OVER_CURRENT) { Charger.Alarm_Code &= ~ALARM_L3_OVER_CURRENT; DEBUG_INFO("Alarm L3 OC recover.\r\n"); } timerDisable(TIMER_IDX_RETRY_OC); Charger.counter.L1_OC.fail = 0 ; Charger.counter.L1_OC.retry = 0 ; // clear retry times Charger.counter.L1_OC.isLatch = OFF ; Charger.counter.L2_OC.fail = 0 ; Charger.counter.L2_OC.retry = 0 ; // clear retry times Charger.counter.L2_OC.isLatch = OFF ; Charger.counter.L3_OC.fail = 0 ; Charger.counter.L3_OC.retry = 0 ; // clear retry times Charger.counter.L3_OC.isLatch = OFF ; //CCID Recover if (Charger.CCID_Module_Type == CCID_MODULE_VAC) { if ((HAL_GPIO_ReadPin(IN_Leak_AC_GPIO_Port, IN_Leak_AC_Pin) == GPIO_PIN_RESET) && (Charger.Alarm_Code & ALARM_CURRENT_LEAK_AC)) { Charger.Alarm_Code &= ~ALARM_CURRENT_LEAK_AC; DEBUG_INFO("Alarm leakage AC recover for VAC.\r\n"); } if ((HAL_GPIO_ReadPin(IN_Leak_DC_GPIO_Port, IN_Leak_DC_Pin) == GPIO_PIN_RESET) && (Charger.Alarm_Code & ALARM_CURRENT_LEAK_DC)) { Charger.Alarm_Code &= ~ALARM_CURRENT_LEAK_DC; DEBUG_INFO("Alarm leakage DC recover for VAC.\r\n"); } } else //Charger.CCID_Module_Type is CCID_MODULE_CORMEX { #ifdef MODIFY_ALARM_LEAKAGE_RECOVER if((Charger.Alarm_Code & ALARM_CURRENT_LEAK_AC)) { Charger.Alarm_Code &= ~ALARM_CURRENT_LEAK_AC; DEBUG_INFO("Alarm AC leakage recover.\r\n"); } #else if((Charger.Alarm_Code & ALARM_CURRENT_LEAK_AC)||(Charger.Alarm_Code & ALARM_CURRENT_LEAK_DC)) { Charger.Alarm_Code &= ~ALARM_CURRENT_LEAK_AC; DEBUG_INFO("Alarm leakage recover.\r\n"); } #endif //MODIFY_ALARM_LEAKAGE_RECOVER } Charger.counter.LEAK.fail = 0; timerDisable(TIMER_IDX_RETRY_LEAK) ; timerDisable(TIMER_IDX_RETRY_LEAK_AC) ; timerDisable(TIMER_IDX_RETRY_LEAK_DC) ; Charger.counter.LEAK.retry = 0 ; // clear latch times Charger.counter.LEAK_DC.retry = 0 ; // clear latch times Charger.counter.LEAK_AC.retry = 0 ; // clear latch times Charger.counter.LEAK.isLatch = OFF ; #ifdef FUNC_UNPLUG_GUN_TO_RELEASE_TEMP_LATCH Charger.counter.OT.isLatch = OFF; #endif //LEAK_MODULE selfrest Recover if (Charger.CCID_Module_Type == CCID_MODULE_VAC) { if(Charger.Alarm_Code & ALARM_LEAK_MODULE_FAIL & (HAL_GPIO_ReadPin(IN_Leak_Error_GPIO_Port, IN_Leak_Error_Pin) == GPIO_PIN_RESET)) // leak module is VAC { if ((Charger.counter.LEAK_MODULE.retry < 2) && (!Charger.counter.LEAK_MODULE.isLatch)) { Charger.Alarm_Code &= ~ALARM_LEAK_MODULE_FAIL; DEBUG_INFO("Alarm leakage module recover.\r\n"); } } } else //Charger.CCID_Module_Type is CCID_MODULE_CORMEX { if(Charger.Alarm_Code & ALARM_LEAK_MODULE_FAIL) // leak module is CORMEX { if ((Charger.counter.LEAK_MODULE.retry < 2) && (!Charger.counter.LEAK_MODULE.isLatch)) { Charger.Alarm_Code &= ~ALARM_LEAK_MODULE_FAIL; DEBUG_INFO("Alarm leakage module recover.\r\n"); } } } } } else if (Charger.Mode == MODE_DEBUG) { //================================ // Relay status error detect // TODO: ADC channel & spec need to check //================================ #ifdef MODIFY_ALARM_DETECT_RELAY_WELDING_BLOCK #ifdef FUNC_USE_RELAY_B_CONTACT if (Charger.m_bUseRelayBContact) AlarmDetect_RelayWelding_UseGPIO(); else AlarmDetect_RelayWelding_UseADC(); #else AlarmDetect_RelayWelding_UseADC(); #endif //FUNC_USE_RELAY_B_CONTACT #endif //MODIFY_ALARM_DETECT_RELAY_WELDING_BLOCK } #ifdef FUNC_RESET_DATA_AFTER_WRITE_NEW_MODELNAME if (Charger.m_bTrigToClearAlarmCode) { Charger.m_bTrigToClearAlarmCode = HTK_FALSE; Charger.Alarm_Code = 0; } #endif osDelay(1); } /* USER CODE END StartAlarmTask */ } /* USER CODE BEGIN Header_StartBleTask */ /** * @brief Function implementing the bleTask thread. * @param argument: Not used * @retval None */ /* USER CODE END Header_StartBleTask */ void StartBleTask(void const * argument) { /* USER CODE BEGIN StartBleTask */ #ifdef FUNC_IDLE_UNTIL_READ_ALL_MEM IdleUntilReadAllMemory(); #endif char tmpBuf[128]; uint8_t endFlag[4]={0x55,0xaa,0x55,0xaa}; __IO uint32_t flash; uint32_t checksum; uint32_t rndNumber; //===================================== // Module reset //===================================== HAL_GPIO_WritePin(OUT_BLE_RESET_GPIO_Port, OUT_BLE_RESET_Pin, GPIO_PIN_RESET); osDelay(60); HAL_GPIO_WritePin(OUT_BLE_RESET_GPIO_Port, OUT_BLE_RESET_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(OUT_BLE_DSR_GPIO_Port, OUT_BLE_DSR_Pin, GPIO_PIN_SET); Charger.ble.initSeq = 0; Charger.ble.isDataMode = OFF; UART_BLE_Init_OK = OFF; osDelay(1000); /* Infinite loop */ for(;;) { //===================================== // BLE module initialization process //===================================== switch(Charger.ble.initSeq) { case 0x00: HAL_UART_Transmit(&BLE_USART, (uint8_t *)BLE_CMD[BLE_CMD_SET_RESTORE], strlen(BLE_CMD[BLE_CMD_SET_RESTORE]), 0xffff); osDelay(BLE_INIT_DELAY); break; case 0x01: HAL_UART_Transmit(&BLE_USART, (uint8_t *)BLE_CMD[BLE_CMD_SET_ROLE], strlen(BLE_CMD[BLE_CMD_SET_ROLE]), 0xffff); osDelay(BLE_INIT_DELAY); break; case 0x02: HAL_UART_Transmit(&BLE_USART, (uint8_t *)BLE_CMD[BLE_CMD_SET_DTR], strlen(BLE_CMD[BLE_CMD_SET_DTR]), 0xffff); osDelay(BLE_INIT_DELAY); break; case 0x03: HAL_UART_Transmit(&BLE_USART, (uint8_t *)BLE_CMD[BLE_CMD_SET_DSR], strlen(BLE_CMD[BLE_CMD_SET_DSR]), 0xffff); osDelay(BLE_INIT_DELAY); break; case 0x04: HAL_UART_Transmit(&BLE_USART, (uint8_t *)BLE_CMD[BLE_CMD_SET_PAIRING_MODE], strlen(BLE_CMD[BLE_CMD_SET_PAIRING_MODE]), 0xffff); osDelay(BLE_INIT_DELAY); break; case 0x05: HAL_UART_Transmit(&BLE_USART, (uint8_t *)BLE_CMD[BLE_CMD_SET_SECURITY_MODE], strlen(BLE_CMD[BLE_CMD_SET_SECURITY_MODE]), 0xffff); osDelay(BLE_INIT_DELAY); break; case 0x06: HAL_UART_Transmit(&BLE_USART, (uint8_t *)BLE_CMD[BLE_CMD_SET_SECURITY_TYPE], strlen(BLE_CMD[BLE_CMD_SET_SECURITY_TYPE]), 0xffff); osDelay(BLE_INIT_DELAY); break; case 0x07: HAL_UART_Transmit(&BLE_USART, (uint8_t *)BLE_CMD[BLE_CMD_SET_DISCOVERABILITY], strlen(BLE_CMD[BLE_CMD_SET_DISCOVERABILITY]), 0xffff); osDelay(BLE_INIT_DELAY); break; case 0x08: HAL_UART_Transmit(&BLE_USART, (uint8_t *)BLE_CMD[BLE_CMD_SET_CONNECTABILITY], strlen(BLE_CMD[BLE_CMD_SET_CONNECTABILITY]), 0xffff); osDelay(BLE_INIT_DELAY); break; case 0x09: HAL_UART_Transmit(&BLE_USART, (uint8_t *)BLE_CMD[BLE_CMD_GET_ADDR], strlen(BLE_CMD[BLE_CMD_GET_ADDR]), 0xffff); osDelay(BLE_INIT_DELAY); break; case 0x0a: sprintf(tmpBuf, "%s\"BYTON_EVSE_%s\"\r\n", BLE_CMD[BLE_CMD_SET_NAME], Charger.ble.peripheral_mac); DEBUG_INFO("BLE module set name:BYTON_EVSE_%s\r\n", Charger.ble.peripheral_mac); HAL_UART_Transmit(&BLE_USART, (uint8_t *)tmpBuf, strlen(tmpBuf), 0xffff); osDelay(BLE_INIT_DELAY); break; case 0x0b: HAL_UART_Transmit(&BLE_USART, (uint8_t *)BLE_CMD[BLE_CMD_SET_MAX_POWER], strlen(BLE_CMD[BLE_CMD_SET_MAX_POWER]), 0xffff); osDelay(BLE_INIT_DELAY); break; case 0x0c: HAL_UART_Transmit(&BLE_USART, (uint8_t *)BLE_CMD[BLE_CMD_SET_MIN_INTERVAL], strlen(BLE_CMD[BLE_CMD_SET_MIN_INTERVAL]), 0xffff); osDelay(BLE_INIT_DELAY); break; case 0x0d: HAL_UART_Transmit(&BLE_USART, (uint8_t *)BLE_CMD[BLE_CMD_SET_MAX_INTERVAL], strlen(BLE_CMD[BLE_CMD_SET_MAX_INTERVAL]), 0xffff); osDelay(BLE_INIT_DELAY); break; case 0x0e: HAL_UART_Transmit(&BLE_USART, (uint8_t *)BLE_CMD[BLE_CMD_SET_TX_PHY], strlen(BLE_CMD[BLE_CMD_SET_TX_PHY]), 0xffff); osDelay(BLE_INIT_DELAY); break; case 0x0f: HAL_UART_Transmit(&BLE_USART, (uint8_t *)BLE_CMD[BLE_CMD_SET_RX_PHY], strlen(BLE_CMD[BLE_CMD_SET_RX_PHY]), 0xffff); osDelay(BLE_INIT_DELAY); break; case 0x10: HAL_UART_Transmit(&BLE_USART, (uint8_t *)BLE_CMD[BLE_CMD_SET_DATA_MODE], strlen(BLE_CMD[BLE_CMD_SET_DATA_MODE]), 0xffff); DEBUG_INFO("BLE module switch to data mode.\r\n"); osDelay(BLE_INIT_DELAY); default: UART_BLE_Init_OK = ON; break; } //===================================== // BLE central device connect status //===================================== if((HAL_GPIO_ReadPin(IN_BLE_DTR_GPIO_Port, IN_BLE_DTR_Pin) == GPIO_PIN_SET) && (UART_BLE_Init_OK == ON)) { // Device disconnect timerRefresh(TIMER_IDX_BLE); if(Charger.ble.loginRole == BLE_LOGIN_ROLE_ROOT || Charger.ble.loginRole == BLE_LOGIN_ROLE_USER) { DEBUG_INFO("BLE central device disconnect.\r\n."); Charger.ble.loginRole = BLE_LOGIN_ROLE_UNKOWN; } } else if((HAL_GPIO_ReadPin(IN_BLE_DTR_GPIO_Port, IN_BLE_DTR_Pin) == GPIO_PIN_RESET) && (UART_BLE_Init_OK == ON)) { // Device connect in if(Charger.ble.loginRole == BLE_LOGIN_ROLE_UNKOWN) { DEBUG_INFO("BLE central device connect.....wait sign in.\r\n."); osDelay(1000); } } //===================================== // Communication timeout process //===================================== if(timer[TIMER_IDX_BLE].isAlarm) { Charger.ble.loginRole = BLE_LOGIN_ROLE_UNKOWN; DEBUG_INFO("BLE no communication over time, disconnect central device.\r\n"); timerRefresh(TIMER_IDX_BLE); HAL_GPIO_WritePin(OUT_BLE_DSR_GPIO_Port, OUT_BLE_DSR_Pin, GPIO_PIN_RESET); osDelay(100); HAL_GPIO_WritePin(OUT_BLE_DSR_GPIO_Port, OUT_BLE_DSR_Pin, GPIO_PIN_SET); } //===================================== // BLE uart recieve data process //===================================== if(UART_BLE_recv_end_flag == ON) { if((HAL_GPIO_ReadPin(IN_BLE_DTR_GPIO_Port, IN_BLE_DTR_Pin) == GPIO_PIN_SET) || !Charger.ble.isDataMode) { // AT command rx process if(strstr((char *)UART_BLE_rx_buffer, BLE_CMD[BLE_CMD_SET_RESTORE])!=NULL) { Charger.ble.initSeq++; } if(strstr((char *)UART_BLE_rx_buffer, BLE_CMD[BLE_CMD_SET_ROLE])!=NULL) { Charger.ble.initSeq++; } if(strstr((char *)UART_BLE_rx_buffer, BLE_CMD[BLE_CMD_SET_DTR])!=NULL) { Charger.ble.initSeq++; } if(strstr((char *)UART_BLE_rx_buffer, BLE_CMD[BLE_CMD_SET_DSR])!=NULL) { Charger.ble.initSeq++; } if(strstr((char *)UART_BLE_rx_buffer, BLE_CMD[BLE_CMD_SET_PAIRING_MODE])!=NULL) { Charger.ble.initSeq++; } if(strstr((char *)UART_BLE_rx_buffer, BLE_CMD[BLE_CMD_SET_SECURITY_MODE])!=NULL) { Charger.ble.initSeq++; } if(strstr((char *)UART_BLE_rx_buffer, BLE_CMD[BLE_CMD_SET_SECURITY_TYPE])!=NULL) { Charger.ble.initSeq++; } if(strstr((char *)UART_BLE_rx_buffer, BLE_CMD[BLE_CMD_SET_DISCOVERABILITY])!=NULL) { Charger.ble.initSeq++; } if(strstr((char *)UART_BLE_rx_buffer, BLE_CMD[BLE_CMD_SET_CONNECTABILITY])!=NULL) { Charger.ble.initSeq++; } if(strstr((char *)UART_BLE_rx_buffer, BLE_CMD[BLE_CMD_GET_ADDR])!=NULL) { memcpy(Charger.ble.peripheral_mac, &UART_BLE_rx_buffer[strcspn((char *)UART_BLE_rx_buffer, ":")+1], 12); Charger.ble.peripheral_mac[12] = '\0'; DEBUG_INFO("Peripheral mac address: %s\r\n", Charger.ble.peripheral_mac); Charger.ble.initSeq++; } if(strstr((char *)UART_BLE_rx_buffer, BLE_CMD[BLE_CMD_SET_NAME])!=NULL) { Charger.ble.initSeq++; } if(strstr((char *)UART_BLE_rx_buffer, BLE_CMD[BLE_CMD_SET_MAX_POWER])!=NULL) { Charger.ble.initSeq++; } if(strstr((char *)UART_BLE_rx_buffer, BLE_CMD[BLE_CMD_SET_MIN_INTERVAL])!=NULL) { Charger.ble.initSeq++; } if(strstr((char *)UART_BLE_rx_buffer, BLE_CMD[BLE_CMD_SET_MAX_INTERVAL])!=NULL) { Charger.ble.initSeq++; } if(strstr((char *)UART_BLE_rx_buffer, BLE_CMD[BLE_CMD_SET_TX_PHY])!=NULL) { Charger.ble.initSeq++; } if(strstr((char *)UART_BLE_rx_buffer, BLE_CMD[BLE_CMD_SET_RX_PHY])!=NULL) { Charger.ble.initSeq++; } if(strstr((char *)UART_BLE_rx_buffer, BLE_CMD[BLE_CMD_SET_DATA_MODE])!=NULL) { Charger.ble.isDataMode = ON; Charger.ble.initSeq++; } } else { // Application protocol rx process uint8_t tx[UART_BUFFER_SIZE]; uint8_t tx_len; uint8_t chksum = 0; uint32_t tmp; if(isValidCheckSum_BLE() && (rndNumber != ((UART_BLE_rx_buffer[3]<<0) | (UART_BLE_rx_buffer[4]<<8) | (UART_BLE_rx_buffer[5]<<16) | (UART_BLE_rx_buffer[6]<<24)))) { // Timer reset timerRefresh(TIMER_IDX_BLE); rndNumber = ((UART_BLE_rx_buffer[3]<<0) | (UART_BLE_rx_buffer[4]<<8) | (UART_BLE_rx_buffer[5]<<16) | (UART_BLE_rx_buffer[6]<<24)); switch(UART_BLE_rx_buffer[2]) { case BLE_PROTOCOL_MESSAGE_SIGN_IN: DEBUG_INFO("BLE device sign request...%d\r\n", UART_BLE_rx_buffer[7]); tx_len = 5; tx[0] = (tx_len>>8)&0xff; tx[1] = (tx_len&0xff); tx[2] = UART_BLE_rx_buffer[2] + 0x80; tx[3] = 0x00; if(Charger.memory.EVSE_Config.data.item.bleConfig.isRegPuk) { if(UART_BLE_rx_buffer[7] == 0x00) { if(memcmp(&UART_BLE_rx_buffer[8], &Charger.memory.EVSE_Config.data.item.bleConfig.idRoot[0], ((UART_BLE_rx_buffer[0]<<8) | (UART_BLE_rx_buffer[1]<<0)-9)) == 0) { // Root sign in tx[3] = 0x02; Charger.ble.loginRole = BLE_LOGIN_ROLE_ROOT; DEBUG_INFO("Sign in as root.\r\n"); } } else { if(memcmp(&UART_BLE_rx_buffer[8], &Charger.memory.whiteList.data.item[0].pin[0], ((UART_BLE_rx_buffer[0]<<8) | (UART_BLE_rx_buffer[1]<<0)-9)) == 0) { // User sign in tx[3] = 0x03; Charger.ble.loginRole = BLE_LOGIN_ROLE_USER; DEBUG_INFO("Sign in as user.\r\n"); } } } else { if(UART_BLE_rx_buffer[7] == 0x00) { // Visitor tx[3] = 0x01; Charger.ble.loginRole = BLE_LOGIN_ROLE_VISITOR; memcpy(&Charger.ble.loginId[0], &UART_BLE_rx_buffer[8], ((UART_BLE_rx_buffer[0]<<8) | (UART_BLE_rx_buffer[1]<<0)-9) ); DEBUG_WARN("Sign in as visitor.\r\n"); } } for(uint16_t idx=0;idx<((tx[1] | (tx[0]<<8))-3);idx++) { chksum ^= tx[2 + idx]; } tx[4] = chksum; break; case BLE_PROTOCOL_MESSAGE_PUK_REG: DEBUG_INFO("BLE device PUK registe.%02x%02x%02x%02x%02x%02x%02x%02x\r\n", UART_BLE_rx_buffer[7], UART_BLE_rx_buffer[8], UART_BLE_rx_buffer[9], UART_BLE_rx_buffer[10], UART_BLE_rx_buffer[11], UART_BLE_rx_buffer[12], UART_BLE_rx_buffer[13], UART_BLE_rx_buffer[14]); tx_len = 11; tx[0] = (tx_len>>8)&0xff; tx[1] = (tx_len&0xff); tx[2] = UART_BLE_rx_buffer[2] + 0x80; tx[3] = 0x00; if(Charger.memory.EVSE_Config.data.item.bleConfig.isRegPuk) { if(memcmp(&Charger.ble.loginId[0], &Charger.memory.EVSE_Config.data.item.bleConfig.idRoot[0], ARRAY_SIZE(Charger.ble.loginId))) { tx[3] = 0x02; DEBUG_INFO("ID registered exist.\r\n"); } } else { if(Charger.ble.loginRole == BLE_LOGIN_ROLE_VISITOR) { if(memcmp(&UART_BLE_rx_buffer[7], &Charger.memory.EVSE_Config.data.item.bleConfig.puk[0], 8) == 0x00) { tx[3] = 0x01; // PIN list generation Charger.memory.EVSE_Config.data.item.bleConfig.isGenPin = ON; for(uint8_t idx=0;idx<20;idx++) { Charger.memory.whiteList.data.item[idx].listType = WHITE_LIST_TYPE_BLE; Charger.memory.whiteList.data.item[idx].pin[0] = (rand()%0x2b)+0x30; Charger.memory.whiteList.data.item[idx].pin[1] = (rand()%0x2b)+0x30; Charger.memory.whiteList.data.item[idx].pin[2] = (rand()%0x2b)+0x30; Charger.memory.whiteList.data.item[idx].pin[3] = (rand()%0x2b)+0x30; Charger.memory.whiteList.data.item[idx].pin[4] = (rand()%0x2b)+0x30; Charger.memory.whiteList.data.item[idx].pin[5] = (rand()%0x2b)+0x30; Charger.memory.whiteList.data.item[idx].isReg = OFF; } Charger.memory.whiteList.op_bits.update = ON; Charger.memory.EVSE_Config.data.item.bleConfig.isRegPuk = ON; memcpy(&Charger.memory.EVSE_Config.data.item.bleConfig.idRoot[0], &Charger.ble.loginId[0], ARRAY_SIZE(Charger.ble.loginId)); Charger.memory.EVSE_Config.op_bits.update = ON; DEBUG_INFO("Root registered and PIN list generate success.\r\n"); } } } memcpy(&tx[4], &UART_BLE_rx_buffer[7], 6); for(uint16_t idx=0;idx<((tx[1] | (tx[0]<<8))-3);idx++) { chksum ^= tx[2 + idx]; } tx[10] = chksum; break; case BLE_PROTOCOL_MESSAGE_PIN_GET: DEBUG_INFO("PIN get request.\r\n"); tx_len = 11; tx[0] = (tx_len>>8)&0xff; tx[1] = (tx_len&0xff); tx[2] = UART_BLE_rx_buffer[2] + 0x80;; tx[3] = 0x00; if(Charger.ble.loginRole == BLE_LOGIN_ROLE_ROOT) { tx[3] = 0x01; memcpy(&tx[4], &Charger.memory.whiteList.data.item[0].pin[0], 6); DEBUG_INFO("PIN: %s\r\n", Charger.memory.whiteList.data.item[0].pin); } for(uint16_t idx=0;idx<((tx[1] | (tx[0]<<8))-3);idx++) { chksum ^= tx[2 + idx]; } tx[10] = chksum; break; case BLE_PROTOCOL_MESSAGE_PIN_RENEW: DEBUG_INFO("BLE device PIN renew request.\r\n"); tx_len = 13; tx[0] = (tx_len>>8)&0xff; tx[1] = (tx_len&0xff); tx[2] = UART_BLE_rx_buffer[2] + 0x80;; tx[3] = 0x00; if((Charger.ble.loginRole == BLE_LOGIN_ROLE_ROOT)) { for(uint8_t idx=0;idx<20;idx++) { Charger.memory.whiteList.data.item[idx].listType = WHITE_LIST_TYPE_BLE; Charger.memory.whiteList.data.item[idx].pin[0] = (rand()%0x2b)+0x30; Charger.memory.whiteList.data.item[idx].pin[1] = (rand()%0x2b)+0x30; Charger.memory.whiteList.data.item[idx].pin[2] = (rand()%0x2b)+0x30; Charger.memory.whiteList.data.item[idx].pin[3] = (rand()%0x2b)+0x30; Charger.memory.whiteList.data.item[idx].pin[4] = (rand()%0x2b)+0x30; Charger.memory.whiteList.data.item[idx].pin[5] = (rand()%0x2b)+0x30; Charger.memory.whiteList.data.item[idx].isReg = OFF; } Charger.memory.whiteList.op_bits.update = ON; tx[3] = 0x01; memcpy(&tx[4], &Charger.memory.whiteList.data.item[0].pin[0], 6); DEBUG_INFO("PIN list renew: %s.\r\n", Charger.memory.whiteList.data.item[0].pin); } else DEBUG_WARN("Login id not root.\r\n"); for(uint16_t idx=0;idx<((tx[1] | (tx[0]<<8))-3);idx++) { chksum ^= tx[2 + idx]; } tx[4] = chksum; break; case BLE_PROTOCOL_MESSAGE_CHARGING_START: DEBUG_INFO("BLE device request charging start.\r\n"); tx_len = 0x08; tx[0] = (tx_len>>8)&0xff; tx[1] = (tx_len&0xff); tx[2] = UART_BLE_rx_buffer[2] + 0x80; if(Charger.Alarm_Code>0) { tx[3] = 0x02; if((Charger.Alarm_Code & ALARM_L1_OVER_VOLTAGE)) { tx[4] = 0x01; tx[5] = 0x22; tx[6] = 0x00; } else if((Charger.Alarm_Code & ALARM_L1_UNDER_VOLTAGE)) { tx[4] = 0x01; tx[5] = 0x22; tx[6] = 0x03; } else if((Charger.Alarm_Code & ALARM_L1_OVER_CURRENT)) { tx[4] = 0x01; tx[5] = 0x21; tx[6] = 0x16; } else if((Charger.Alarm_Code & ALARM_OVER_TEMPERATURE)) { tx[4] = 0x01; tx[5] = 0x22; tx[6] = 0x23; } else if((Charger.Alarm_Code & ALARM_GROUND_FAIL)) { tx[4] = 0x01; tx[5] = 0x22; tx[6] = 0x56; } else if((Charger.Alarm_Code & ALARM_CP_ERROR)) { tx[4] = 0x02; tx[5] = 0x37; tx[6] = 0x03; } else if((Charger.Alarm_Code & ALARM_CURRENT_LEAK_AC)||(Charger.Alarm_Code & ALARM_CURRENT_LEAK_DC)) { tx[4] = 0x01; tx[5] = 0x22; tx[6] = 0x33; } else if((Charger.Alarm_Code & ALARM_MCU_TESTFAIL)) { tx[4] = 0x01; tx[5] = 0x22; tx[6] = 0x57; } else if((Charger.Alarm_Code & ALARM_EMERGENCY_STOP)) { tx[4] = 0x01; tx[5] = 0x22; tx[6] = 0x51; } else if((Charger.Alarm_Code & ALARM_LEAK_MODULE_FAIL)) { tx[4] = 0x01; tx[5] = 0x10; tx[6] = 0x04; } else if((Charger.Alarm_Code & ALARM_RELAY_STATUS)) { tx[4] = 0x01; tx[5] = 0x22; tx[6] = 0x58; } DEBUG_WARN("EVSE in alarm state, can not start charging.\r\n"); } else { if((Charger.ble.loginRole == BLE_LOGIN_ROLE_ROOT) || (Charger.ble.loginRole == BLE_LOGIN_ROLE_USER)) { if(Charger.Mode == MODE_IDLE) { Charger.ble.isRequestOn = ON; tx[3] = 0x01; DEBUG_INFO("Start OK.\r\n"); } else { tx[3] = 0x00; DEBUG_WARN("EVSE not in IDLE.\r\n"); } } else { tx[3] = 0x00; DEBUG_WARN("Login first\r\n"); } tx[4] = 0x00; tx[5] = 0x00; tx[6] = 0x00; } for(uint16_t idx=0;idx<((tx[1] | (tx[0]<<8))-3);idx++) { chksum ^= tx[2 + idx]; } tx[7] = chksum; break; case BLE_PROTOCOL_MESSAGE_CHARGING_STOP: DEBUG_INFO("BLE device request charging stop.\r\n"); tx_len = 0x08; tx[0] = (tx_len>>8)&0xff; tx[1] = (tx_len&0xff); tx[2] = UART_BLE_rx_buffer[2] + 0x80; if(Charger.Alarm_Code>0) { tx[3] = 0x02; if((Charger.Alarm_Code & ALARM_L1_OVER_VOLTAGE)) { tx[4] = 0x01; tx[5] = 0x22; tx[6] = 0x00; } else if((Charger.Alarm_Code & ALARM_L1_UNDER_VOLTAGE)) { tx[4] = 0x01; tx[5] = 0x22; tx[6] = 0x03; } else if((Charger.Alarm_Code & ALARM_L1_OVER_CURRENT)) { tx[4] = 0x01; tx[5] = 0x21; tx[6] = 0x16; } else if((Charger.Alarm_Code & ALARM_OVER_TEMPERATURE)) { tx[4] = 0x01; tx[5] = 0x22; tx[6] = 0x23; } else if((Charger.Alarm_Code & ALARM_GROUND_FAIL)) { tx[4] = 0x01; tx[5] = 0x22; tx[6] = 0x56; } else if((Charger.Alarm_Code & ALARM_CP_ERROR)) { tx[4] = 0x02; tx[5] = 0x37; tx[6] = 0x03; } else if((Charger.Alarm_Code & ALARM_CURRENT_LEAK_AC)||(Charger.Alarm_Code & ALARM_CURRENT_LEAK_DC)) { tx[4] = 0x01; tx[5] = 0x22; tx[6] = 0x33; } else if((Charger.Alarm_Code & ALARM_MCU_TESTFAIL)) { tx[4] = 0x01; tx[5] = 0x22; tx[6] = 0x57; } else if((Charger.Alarm_Code & ALARM_EMERGENCY_STOP)) { tx[4] = 0x01; tx[5] = 0x22; tx[6] = 0x51; } else if((Charger.Alarm_Code & ALARM_LEAK_MODULE_FAIL)) { tx[4] = 0x01; tx[5] = 0x10; tx[6] = 0x04; } else if((Charger.Alarm_Code & ALARM_RELAY_STATUS)) { tx[4] = 0x01; tx[5] = 0x22; tx[6] = 0x58; } DEBUG_WARN("EVSE in alarm state, can not stop charging.\r\n"); } else { if((Charger.ble.loginRole == BLE_LOGIN_ROLE_ROOT) || (Charger.ble.loginRole == BLE_LOGIN_ROLE_USER)) { if((Charger.Mode == MODE_CHARGING) || (Charger.Mode == MODE_STOP)) { Charger.ble.isRequestOff = ON; tx[3] = 0x01; DEBUG_INFO("Stop OK.\r\n"); } else { tx[3] = 0x00; DEBUG_WARN("EVSE not in CHARGING.\r\n"); } } else { tx[3] = 0x00; DEBUG_WARN("Login first\r\n"); } tx[4] = 0x00; tx[5] = 0x00; tx[6] = 0x00; } for(uint16_t idx=0;idx<((tx[1] | (tx[0]<<8))-3);idx++) { chksum ^= tx[2 + idx]; } tx[7] = chksum; break; case BLE_PROTOCOL_MESSAGE_STATUS_QUERY: DEBUG_INFO("BLE device query EVSE status request.\r\n"); tx_len = 0x13; tx[0] = (tx_len>>8)&0xff; tx[1] = (tx_len&0xff); tx[2] = UART_BLE_rx_buffer[2] + 0x80; tx[3] = (((Charger.ble.loginRole == BLE_LOGIN_ROLE_ROOT) || (Charger.ble.loginRole == BLE_LOGIN_ROLE_USER))?Charger.Mode:0x00); tx[4] = (((Charger.ble.loginRole == BLE_LOGIN_ROLE_ROOT) || (Charger.ble.loginRole == BLE_LOGIN_ROLE_USER))?((((uint32_t)(Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_Total/10000))>>0) & 0xff):0x00); tx[5] = (((Charger.ble.loginRole == BLE_LOGIN_ROLE_ROOT) || (Charger.ble.loginRole == BLE_LOGIN_ROLE_USER))?((((uint32_t)(Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_Total/10000))>>8) & 0xff):0x00); tx[6] = (((Charger.ble.loginRole == BLE_LOGIN_ROLE_ROOT) || (Charger.ble.loginRole == BLE_LOGIN_ROLE_USER))?((((uint32_t)(Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_Total/10000))>>16) & 0xff):0x00); tx[7] = (((Charger.ble.loginRole == BLE_LOGIN_ROLE_ROOT) || (Charger.ble.loginRole == BLE_LOGIN_ROLE_USER))?((((uint32_t)(Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_Total/10000))>>24) & 0xff):0x00); tx[8] = (((Charger.ble.loginRole == BLE_LOGIN_ROLE_ROOT) || (Charger.ble.loginRole == BLE_LOGIN_ROLE_USER))?(((Charger.cycle_info.Power_Consumption/10)>>0) & 0xff):0x00); tx[9] = (((Charger.ble.loginRole == BLE_LOGIN_ROLE_ROOT) || (Charger.ble.loginRole == BLE_LOGIN_ROLE_USER))?(((Charger.cycle_info.Power_Consumption/10)>>8) & 0xff):0x00); tx[10] = (((Charger.ble.loginRole == BLE_LOGIN_ROLE_ROOT) || (Charger.ble.loginRole == BLE_LOGIN_ROLE_USER))?(((Charger.cycle_info.Duration/60000)>>0) & 0xff):0x00); tx[11] = (((Charger.ble.loginRole == BLE_LOGIN_ROLE_ROOT) || (Charger.ble.loginRole == BLE_LOGIN_ROLE_USER))?(((Charger.cycle_info.Duration/60000)>>8) & 0xff):0x00); if((Charger.Alarm_Code>0) && ((Charger.ble.loginRole == BLE_LOGIN_ROLE_ROOT) || (Charger.ble.loginRole == BLE_LOGIN_ROLE_USER))) { if((Charger.Alarm_Code & ALARM_L1_OVER_VOLTAGE)) { tx[12] = 0x01; tx[13] = 0x22; tx[14] = 0x00; } else if((Charger.Alarm_Code & ALARM_L1_UNDER_VOLTAGE)) { tx[12] = 0x01; tx[13] = 0x22; tx[14] = 0x03; } else if((Charger.Alarm_Code & ALARM_L1_OVER_CURRENT)) { tx[12] = 0x01; tx[13] = 0x21; tx[14] = 0x16; } else if((Charger.Alarm_Code & ALARM_OVER_TEMPERATURE)) { tx[12] = 0x01; tx[13] = 0x22; tx[14] = 0x23; } else if((Charger.Alarm_Code & ALARM_GROUND_FAIL)) { tx[12] = 0x01; tx[13] = 0x22; tx[14] = 0x56; } else if((Charger.Alarm_Code & ALARM_CP_ERROR)) { tx[12] = 0x02; tx[13] = 0x37; tx[14] = 0x03; } else if((Charger.Alarm_Code & ALARM_CURRENT_LEAK_AC)||(Charger.Alarm_Code & ALARM_CURRENT_LEAK_DC)) { tx[12] = 0x01; tx[13] = 0x22; tx[14] = 0x33; } else if((Charger.Alarm_Code & ALARM_MCU_TESTFAIL)) { tx[12] = 0x01; tx[13] = 0x22; tx[14] = 0x57; } else if((Charger.Alarm_Code & ALARM_EMERGENCY_STOP)) { tx[12] = 0x01; tx[13] = 0x22; tx[14] = 0x51; } else if((Charger.Alarm_Code & ALARM_LEAK_MODULE_FAIL)) { tx[12] = 0x01; tx[13] = 0x10; tx[14] = 0x04; } else if((Charger.Alarm_Code & ALARM_RELAY_STATUS)) { tx[12] = 0x01; tx[13] = 0x22; tx[14] = 0x58; } } else { tx[12] = 0x00; tx[13] = 0x00; tx[14] = 0x00; } tx[15] = Charger.memory.EVSE_Config.data.item.reservation.mode; tx[16] = Charger.memory.EVSE_Config.data.item.reservation.hour; tx[17] = Charger.memory.EVSE_Config.data.item.reservation.min; for(uint16_t idx=0;idx<((tx[1] | (tx[0]<<8))-3);idx++) { chksum ^= tx[2 + idx]; } tx[18] = chksum; break; case BLE_PROTOCOL_MESSAGE_RESERVATION: switch(UART_BLE_rx_buffer[7]) { case RESERVATION_DISABLE: DEBUG_INFO("BLE device reservation request disable.\r\n"); break; case RESERVATION_ONCE: DEBUG_INFO("BLE device reservation request once on %d:%d.\r\n", UART_BLE_rx_buffer[8], UART_BLE_rx_buffer[9]); break; case RESERVATION_ALWAYS: DEBUG_INFO("BLE device reservation request always on %d:%d.\r\n", UART_BLE_rx_buffer[8], UART_BLE_rx_buffer[9]); break; } tx_len = 0x05; tx[0] = (tx_len>>8)&0xff; tx[1] = (tx_len&0xff); tx[2] = UART_BLE_rx_buffer[2] + 0x80; Charger.memory.EVSE_Config.data.item.reservation.mode = UART_BLE_rx_buffer[7]; Charger.memory.EVSE_Config.data.item.reservation.hour = UART_BLE_rx_buffer[8]; Charger.memory.EVSE_Config.data.item.reservation.min = UART_BLE_rx_buffer[9]; Charger.memory.EVSE_Config.op_bits.update = ON; tx[3] = 0x01; for(uint16_t idx=0;idx<((tx[1] | (tx[0]<<8))-3);idx++) { chksum ^= tx[2 + idx]; } tx[4] = chksum; break; case BLE_PROTOCOL_MESSAGE_TIME_QUERY: DEBUG_INFO("BLE device query date time request.\r\n"); tx_len = 0x08; tx[0] = (tx_len>>8)&0xff; tx[1] = (tx_len&0xff); tx[2] = UART_BLE_rx_buffer[2] + 0x80; struct tm gm_date; gm_date.tm_year = Charger.memory.EVSE_Config.data.item.SystemDateTime.year-1900; gm_date.tm_mon = Charger.memory.EVSE_Config.data.item.SystemDateTime.month-1; gm_date.tm_mday = Charger.memory.EVSE_Config.data.item.SystemDateTime.day; gm_date.tm_hour = Charger.memory.EVSE_Config.data.item.SystemDateTime.hour; gm_date.tm_min = Charger.memory.EVSE_Config.data.item.SystemDateTime.min; gm_date.tm_sec = Charger.memory.EVSE_Config.data.item.SystemDateTime.sec; tmp = mktime(&gm_date); tx[3] = ((tmp >> 0)&0xff); tx[4] = ((tmp >> 8)&0xff); tx[5] = ((tmp >> 16)&0xff); tx[6] = ((tmp >> 24)&0xff); for(uint16_t idx=0;idx<((tx[1] | (tx[0]<<8))-3);idx++) { chksum ^= tx[2 + idx]; } tx[7] = chksum; break; case BLE_PROTOCOL_MESSAGE_TIME_CONFIG: DEBUG_INFO("BLE device config date time.\r\n"); tx_len = 0x09; tx[0] = (tx_len>>8)&0xff; tx[1] = (tx_len&0xff); tx[2] = UART_BLE_rx_buffer[2] + 0x80; if((Charger.ble.loginRole == BLE_LOGIN_ROLE_ROOT) || (Charger.ble.loginRole == BLE_LOGIN_ROLE_USER)) { struct tm *sm_date; tmp = (UART_BLE_rx_buffer[7]<<0) | (UART_BLE_rx_buffer[8]<<8) | (UART_BLE_rx_buffer[9]<<16) | (UART_BLE_rx_buffer[10]<<24); sm_date = gmtime(&tmp) ; setTime.Hours = sm_date->tm_hour; setTime.Minutes = sm_date->tm_min; setTime.Seconds = sm_date->tm_sec; setTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; setTime.StoreOperation = RTC_STOREOPERATION_RESET; if (HAL_RTC_SetTime(&hrtc, &setTime, RTC_FORMAT_BIN) != HAL_OK) { Error_Handler(); } setDate.Year = (sm_date->tm_year + 1900)-2000; setDate.Month = sm_date->tm_mon + 1; setDate.Date = sm_date->tm_mday; if (HAL_RTC_SetDate(&hrtc, &setDate, RTC_FORMAT_BIN) != HAL_OK) { Error_Handler(); } tx[3] = 0x01; DEBUG_INFO("RTC config OK.\r\n"); } else { tx[3] = 0x00; DEBUG_WARN("User con not config RTC.\r\n"); } tx[4] = UART_BLE_rx_buffer[7]; tx[5] = UART_BLE_rx_buffer[8]; tx[6] = UART_BLE_rx_buffer[9]; tx[7] = UART_BLE_rx_buffer[10]; for(uint16_t idx=0;idx<((tx[1] | (tx[0]<<8))-3);idx++) { chksum ^= tx[2 + idx]; } tx[8] = chksum; break; case BLE_PROTOCOL_MESSAGE_LED_QUERY: DEBUG_INFO("BLE device query led setting.\r\n"); tx_len = 0x08; tx[0] = (tx_len>>8)&0xff; tx[1] = (tx_len&0xff); tx[2] = UART_BLE_rx_buffer[2] + 0x80; /* TODO: Query led result here */ if((Charger.ble.loginRole == BLE_LOGIN_ROLE_ROOT) || (Charger.ble.loginRole == BLE_LOGIN_ROLE_USER)) { tx[3] = 0xff; tx[4] = 0xff; tx[5] = 0xff; tx[6] = 0xff; } else { tx[3] = 0x00; tx[4] = 0x00; tx[5] = 0x00; tx[6] = 0x00; } for(uint16_t idx=0;idx<((tx[1] | (tx[0]<<8))-3);idx++) { chksum ^= tx[2 + idx]; } tx[7] = chksum; break; case BLE_PROTOCOL_MESSAGE_LED_CONFIG: DEBUG_INFO("BLE device config led setting.\r\n"); tx_len = 0x09; tx[0] = (tx_len>>8)&0xff; tx[1] = (tx_len&0xff); tx[2] = UART_BLE_rx_buffer[2] + 0x80; /* TODO: Config led result here */ if((Charger.ble.loginRole == BLE_LOGIN_ROLE_ROOT) || (Charger.ble.loginRole == BLE_LOGIN_ROLE_USER)) tx[3] = 0x01; else tx[3] = 0x00; tx[4] = UART_BLE_rx_buffer[7]; tx[5] = UART_BLE_rx_buffer[8]; tx[6] = UART_BLE_rx_buffer[9]; tx[7] = UART_BLE_rx_buffer[10]; for(uint16_t idx=0;idx<((tx[1] | (tx[0]<<8))-3);idx++) { chksum ^= tx[2 + idx]; } tx[8] = chksum; break; case BLE_PROTOCOL_MESSAGE_CURRENT_LIMIT_QUERY: DEBUG_INFO("BLE device query current limit request.\r\n"); tx_len = 0x05; tx[0] = (tx_len>>8)&0xff; tx[1] = (tx_len&0xff); tx[2] = UART_BLE_rx_buffer[2] + 0x80; if((Charger.ble.loginRole == BLE_LOGIN_ROLE_ROOT) || (Charger.ble.loginRole == BLE_LOGIN_ROLE_USER)) { tx[3] = Charger.memory.EVSE_Config.data.item.MaxChargingCurrent; DEBUG_INFO("Query current limit: %02dA.\r\n", Charger.memory.EVSE_Config.data.item.MaxChargingCurrent); } else { tx[3] = 0x00; DEBUG_WARN("Please login first, before query current limit.\r\n"); } for(uint16_t idx=0;idx<((tx[1] | (tx[0]<<8))-3);idx++) { chksum ^= tx[2 + idx]; } tx[8] = chksum; break; case BLE_PROTOCOL_MESSAGE_CURRENT_LIMIT_CONFIG: DEBUG_INFO("BLE device config current limit.\r\n"); tx_len = 0x06; tx[0] = (tx_len>>8)&0xff; tx[1] = (tx_len&0xff); tx[2] = UART_BLE_rx_buffer[2] + 0x80; if((Charger.ble.loginRole == BLE_LOGIN_ROLE_ROOT) || (Charger.ble.loginRole == BLE_LOGIN_ROLE_USER)) { if(UART_BLE_rx_buffer[7]>Charger.maxRatingCurrent) { tx[3] = 0x02; Charger.memory.EVSE_Config.data.item.MaxChargingCurrent = Charger.maxRatingCurrent; DEBUG_INFO("Setting value over max rating value, set as max rating .\r\n"); } else { tx[3] = 0x01; Charger.memory.EVSE_Config.data.item.MaxChargingCurrent = UART_BLE_rx_buffer[7]; } DEBUG_INFO("Config current limit: %02dA\r\n", Charger.memory.EVSE_Config.data.item.MaxChargingCurrent); } else { tx[3] = 0x00; DEBUG_WARN("Please login first, before setting current limit.\r\n"); } tx[4] = UART_BLE_rx_buffer[7]; for(uint16_t idx=0;idx<((tx[1] | (tx[0]<<8))-3);idx++) { chksum ^= tx[2 + idx]; } tx[5] = chksum; break; case BLE_PROTOCOL_MESSAGE_FIRMWARE_VERSION_QUERY: DEBUG_INFO("BLE device query firmware version.\r\n"); tx_len = 4 + strlen(Charger.Ver_FW); tx[0] = (tx_len>>8)&0xff; tx[1] = (tx_len&0xff); tx[2] = UART_BLE_rx_buffer[2] + 0x80; for(uint16_t idx=0;idx>2)) == FLASHIF_OK) { DEBUG_INFO("Firmware transfer start address: 0x%x ,length: %d...Pass\n\r", flashdestination, (((UART_BLE_rx_buffer[1]) | (UART_BLE_rx_buffer[0])<<8)-12)); tx[3] = 0x01; } else { DEBUG_INFO("Firmware transfer start address: 0x%x, length: %d...Fail\n\r", flashdestination, (((UART_BLE_rx_buffer[1]) | (UART_BLE_rx_buffer[0])<<8)-12)); tx[3] = 0x00; } } else { tx[3] = 0x00; DEBUG_WARN("User can not upgrade transfer.\r\n"); } for(uint16_t idx=0;idx<((tx[1] | (tx[0]<<8))-3);idx++) { chksum ^= tx[2 + idx]; } tx[4] = chksum; break; case BLE_PROTOCOL_MESSAGE_FIRMWARE_END_REQ: tx_len = 5; tx[0] = 0x00; tx[1] = 0x05; tx[2] = UART_BLE_rx_buffer[2] + 0x80;; if(Charger.ble.loginRole == BLE_LOGIN_ROLE_ROOT) { flash = NEW_CODE_ADDRESS; checksum = HAL_CRC_Calculate(&hcrc, (uint32_t *)flash, ((FLASH_AP_LENGTH-4)>>2)); flash = ((uint32_t)(NEW_CODE_ADDRESS+FLASH_AP_LENGTH-4)); DEBUG_INFO("Firmware transfer end, AP CRC checksum, flash: 0x%x, 0x%x\r\n", checksum, *((uint32_t *)flash) ); if(checksum == *((uint32_t *)flash)) { if (FLASH_If_Write(UPGRADE_REQ_ADDRESS, (uint32_t *)&endFlag[0], 1) == FLASHIF_OK) { DEBUG_INFO("Firmware Confirm Tag write ok..\n\r"); tx[3] = 0x01; tx[4] = 0xB5; HAL_UART_Transmit(&IAP_USART, (uint8_t *)tx, sizeof(tx), 0xffff); osDelay(1000); NVIC_SystemReset(); } else { DEBUG_INFO("Firmware Confirm Tag write fail...\n\r"); tx[3] = 0x00; } } else { DEBUG_INFO("Firmware checksum compare fail...\n\r"); tx[3] = 0x00; } } else { tx[3] = 0x00; DEBUG_WARN("User can not upgrade stop.\r\n"); } for(uint16_t idx=0;idx<((tx[1] | (tx[0]<<8))-3);idx++) { chksum ^= tx[2 + idx]; } tx[4] = chksum; break; default: /* TODO: Unknow command response here */ tx_len = 5; tx[0] = 0x00; tx[1] = 0x05; tx[2] = UART_BLE_rx_buffer[2] + 0x80; tx[3] = 0x00; for(uint16_t idx=0;idx<((tx[1] | (tx[0]<<8))-3);idx++) { chksum ^= tx[2 + idx]; } tx[4] = chksum; DEBUG_ERROR("BLE unknow command.\r\n"); break; } } else { /* TODO: Protocol check sum error response here */ tx_len = 5; tx[0] = 0x00; tx[1] = 0x05; tx[2] = UART_BLE_rx_buffer[2] + 0x80; tx[3] = 0x00; for(uint16_t idx=0;idx<((tx[1] | (tx[0]<<8))-3);idx++) { chksum ^= tx[2 + idx]; } tx[4] = chksum; DEBUG_ERROR("BLE check sum validation error.\r\n"); } HAL_UART_Transmit(&BLE_USART, (uint8_t *)tx, tx_len, 0xffff); } UART_BLE_rx_len=0; UART_BLE_recv_end_flag = OFF; } HAL_UART_Receive_DMA(&BLE_USART, (uint8_t*)UART_BLE_rx_buffer, UART_BUFFER_SIZE); osDelay(1); } /* USER CODE END StartBleTask */ } #ifdef MODIFY_FLASH_OPERATION_20241104 void Proc_EVSE_Config(void) { #ifdef MODIFY_UNDEFINED_MODEL_NAME_AND_SN_ISSUE if (Charger.memory.EVSE_Config.data.item.ModelName[0] == 0xFF || Charger.memory.EVSE_Config.data.item.SerialNumber[0] == 0xFF) { Charger.memory.EVSE_Config.data.item.ModelName[MODEL_NAME_LEN - 1] = '\0'; Charger.memory.EVSE_Config.data.item.SerialNumber[SERIAL_NUM_LEN - 1] = '\0'; Charger.memory.EVSE_Config.op_bits.update = ON; } #endif //MODIFY_UNDEFINED_MODEL_NAME_AND_SN_ISSUE #ifdef FUNC_ZEROING_WHEN_MEM_CLEARNED if (Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_Total == HTK_U64_MAX || Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_L1 == HTK_U64_MAX || Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_L2 == HTK_U64_MAX || Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_L3 == HTK_U64_MAX) { Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_Total = 0; Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_L1 = 0; Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_L2 = 0; Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_L3 = 0; Charger.memory.EVSE_Config.op_bits.update = ON; } if (Charger.memory.EVSE_Config.data.item.AcPlugInTimes == HTK_U32_MAX) { Charger.memory.EVSE_Config.data.item.AcPlugInTimes = 0; Charger.memory.EVSE_Config.op_bits.update = ON; } #ifdef FUNC_MODE_DEBUG_REC_RELAY_ON_TIMES if (Charger.memory.EVSE_Config.data.item.m_ModeDebugRelayOnTimes == HTK_U32_MAX) { Charger.memory.EVSE_Config.data.item.m_ModeDebugRelayOnTimes = 0; Charger.memory.EVSE_Config.op_bits.update = ON; } #endif #endif //FUNC_ZEROING_WHEN_MEM_CLEARNED Charger.memory.EVSE_Config.data.item.isDispDebug = ON; sprintf(Charger.memory.EVSE_Config.data.item.System_ID, "%s%s", Charger.memory.EVSE_Config.data.item.ModelName, Charger.memory.EVSE_Config.data.item.SerialNumber); //sprintf((char *)tmpBuf, "%08x", ~HAL_CRC_Calculate(&hcrc, (uint32_t *)&Charger.memory.EVSE_Config.data.item.System_ID[0], (ARRAY_SIZE(Charger.memory.EVSE_Config.data.item.System_ID)>>2))); //memcpy(&Charger.memory.EVSE_Config.data.item.bleConfig.puk[0], &tmpBuf[0], ARRAY_SIZE(Charger.memory.EVSE_Config.data.item.bleConfig.puk)); //DEBUG_INFO("BLE PUK: %s\r\n", Charger.memory.EVSE_Config.data.item.bleConfig.puk); srand(Charger.memory.EVSE_Config.data.item.bleConfig.puk[0] | (Charger.memory.EVSE_Config.data.item.bleConfig.puk[1]<<8)); setTime.Hours = Charger.memory.EVSE_Config.data.item.SystemDateTime.hour; setTime.Minutes = Charger.memory.EVSE_Config.data.item.SystemDateTime.min; setTime.Seconds = Charger.memory.EVSE_Config.data.item.SystemDateTime.sec; setTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; setTime.StoreOperation = RTC_STOREOPERATION_RESET; if (HAL_RTC_SetTime(&hrtc, &setTime, RTC_FORMAT_BIN) != HAL_OK) { Error_Handler(); } setDate.Year = Charger.memory.EVSE_Config.data.item.SystemDateTime.year-2000; setDate.Month = Charger.memory.EVSE_Config.data.item.SystemDateTime.month; setDate.Date = Charger.memory.EVSE_Config.data.item.SystemDateTime.day; if (HAL_RTC_SetDate(&hrtc, &setDate, RTC_FORMAT_BIN) != HAL_OK) { Error_Handler(); } //CCLC_Corr_Gain_Par //VT #ifdef MODIFY_CORRECTION_CHECK if ( (Charger.memory.EVSE_Config.data.item.Correction_VL1[1][MCU_DATA] > Charger.memory.EVSE_Config.data.item.Correction_VL1[2][MCU_DATA]) && (Charger.memory.EVSE_Config.data.item.Correction_VL1[1][METER_DATA] > Charger.memory.EVSE_Config.data.item.Correction_VL1[2][METER_DATA]) ) #else if(Charger.memory.EVSE_Config.data.item.Correction_VL1[1][MCU_DATA] > Charger.memory.EVSE_Config.data.item.Correction_VL1[2][MCU_DATA]) #endif { CLC_Corr_Gain_Par( Charger.memory.EVSE_Config.data.item.Correction_VL1[1][METER_DATA],Charger.memory.EVSE_Config.data.item.Correction_VL1[2][METER_DATA] , Charger.memory.EVSE_Config.data.item.Correction_VL1[1][MCU_DATA],Charger.memory.EVSE_Config.data.item.Correction_VL1[2][MCU_DATA] , &Charger.coefficient.gain_v[0], &Charger.coefficient.offset_v[0]); } else { Charger.coefficient.gain_v[0] = 1; Charger.coefficient.offset_v[0] = 0; } #ifdef MODIFY_CORRECTION_CHECK if ( (Charger.memory.EVSE_Config.data.item.Correction_VL2[1][MCU_DATA] > Charger.memory.EVSE_Config.data.item.Correction_VL2[2][MCU_DATA]) && (Charger.memory.EVSE_Config.data.item.Correction_VL2[1][METER_DATA] > Charger.memory.EVSE_Config.data.item.Correction_VL2[2][METER_DATA]) ) #else if(Charger.memory.EVSE_Config.data.item.Correction_VL2[1][MCU_DATA] > Charger.memory.EVSE_Config.data.item.Correction_VL2[2][MCU_DATA]) #endif { CLC_Corr_Gain_Par( Charger.memory.EVSE_Config.data.item.Correction_VL2[1][METER_DATA],Charger.memory.EVSE_Config.data.item.Correction_VL2[2][METER_DATA] , Charger.memory.EVSE_Config.data.item.Correction_VL2[1][MCU_DATA],Charger.memory.EVSE_Config.data.item.Correction_VL2[2][MCU_DATA] , &Charger.coefficient.gain_v[1], &Charger.coefficient.offset_v[1]); } else { Charger.coefficient.gain_v[1] = 1; Charger.coefficient.offset_v[1] = 0; } #ifdef MODIFY_CORRECTION_CHECK if ( (Charger.memory.EVSE_Config.data.item.Correction_VL3[1][MCU_DATA] > Charger.memory.EVSE_Config.data.item.Correction_VL3[2][MCU_DATA]) && (Charger.memory.EVSE_Config.data.item.Correction_VL3[1][METER_DATA] > Charger.memory.EVSE_Config.data.item.Correction_VL3[2][METER_DATA]) ) #else if(Charger.memory.EVSE_Config.data.item.Correction_VL3[1][MCU_DATA] > Charger.memory.EVSE_Config.data.item.Correction_VL3[2][MCU_DATA]) #endif if(Charger.memory.EVSE_Config.data.item.Correction_VL3[1][MCU_DATA] > Charger.memory.EVSE_Config.data.item.Correction_VL3[2][MCU_DATA]) { CLC_Corr_Gain_Par( Charger.memory.EVSE_Config.data.item.Correction_VL3[1][METER_DATA],Charger.memory.EVSE_Config.data.item.Correction_VL3[2][METER_DATA] , Charger.memory.EVSE_Config.data.item.Correction_VL3[1][MCU_DATA],Charger.memory.EVSE_Config.data.item.Correction_VL3[2][MCU_DATA] , &Charger.coefficient.gain_v[2], &Charger.coefficient.offset_v[2]); } else { Charger.coefficient.gain_v[2] = 1; Charger.coefficient.offset_v[2] = 0; } //CT #ifdef MODIFY_CORRECTION_CHECK if ( (Charger.memory.EVSE_Config.data.item.Correction_CL1[1][MCU_DATA] > Charger.memory.EVSE_Config.data.item.Correction_CL1[2][MCU_DATA]) && (Charger.memory.EVSE_Config.data.item.Correction_CL1[1][METER_DATA] > Charger.memory.EVSE_Config.data.item.Correction_CL1[2][METER_DATA]) ) #else if(Charger.memory.EVSE_Config.data.item.Correction_CL1[1][MCU_DATA] > Charger.memory.EVSE_Config.data.item.Correction_CL1[2][MCU_DATA]) #endif { CLC_Corr_Gain_Par(Charger.memory.EVSE_Config.data.item.Correction_CL1[1][METER_DATA],Charger.memory.EVSE_Config.data.item.Correction_CL1[2][METER_DATA] , Charger.memory.EVSE_Config.data.item.Correction_CL1[1][MCU_DATA],Charger.memory.EVSE_Config.data.item.Correction_CL1[2][MCU_DATA] , &Charger.coefficient.gain_c[0], &Charger.coefficient.offset_c[0]); } else { Charger.coefficient.gain_c[0] = 1; Charger.coefficient.offset_c[0] = 0; } #ifdef MODIFY_CORRECTION_CHECK if ( (Charger.memory.EVSE_Config.data.item.Correction_CL2[1][MCU_DATA] > Charger.memory.EVSE_Config.data.item.Correction_CL2[2][MCU_DATA]) && (Charger.memory.EVSE_Config.data.item.Correction_CL2[1][METER_DATA] > Charger.memory.EVSE_Config.data.item.Correction_CL2[2][METER_DATA]) ) #else if(Charger.memory.EVSE_Config.data.item.Correction_CL2[1][MCU_DATA] > Charger.memory.EVSE_Config.data.item.Correction_CL2[2][MCU_DATA]) #endif { CLC_Corr_Gain_Par(Charger.memory.EVSE_Config.data.item.Correction_CL2[1][METER_DATA],Charger.memory.EVSE_Config.data.item.Correction_CL2[2][METER_DATA] , Charger.memory.EVSE_Config.data.item.Correction_CL2[1][MCU_DATA],Charger.memory.EVSE_Config.data.item.Correction_CL2[2][MCU_DATA] , &Charger.coefficient.gain_c[1], &Charger.coefficient.offset_c[1]); } else { Charger.coefficient.gain_c[1] = 1; Charger.coefficient.offset_c[1] = 0; } #ifdef MODIFY_CORRECTION_CHECK if ( (Charger.memory.EVSE_Config.data.item.Correction_CL3[1][MCU_DATA] > Charger.memory.EVSE_Config.data.item.Correction_CL3[2][MCU_DATA]) && (Charger.memory.EVSE_Config.data.item.Correction_CL3[1][METER_DATA] > Charger.memory.EVSE_Config.data.item.Correction_CL3[2][METER_DATA]) ) #else if(Charger.memory.EVSE_Config.data.item.Correction_CL3[1][MCU_DATA] > Charger.memory.EVSE_Config.data.item.Correction_CL3[2][MCU_DATA]) #endif if(Charger.memory.EVSE_Config.data.item.Correction_CL3[1][MCU_DATA] > Charger.memory.EVSE_Config.data.item.Correction_CL3[2][MCU_DATA]) { CLC_Corr_Gain_Par(Charger.memory.EVSE_Config.data.item.Correction_CL3[1][METER_DATA],Charger.memory.EVSE_Config.data.item.Correction_CL3[2][METER_DATA] , Charger.memory.EVSE_Config.data.item.Correction_CL3[1][MCU_DATA],Charger.memory.EVSE_Config.data.item.Correction_CL3[2][MCU_DATA] , &Charger.coefficient.gain_c[2], &Charger.coefficient.offset_c[2]); } else { Charger.coefficient.gain_c[2] = 1; Charger.coefficient.offset_c[2] = 0; } //LEAK if(Charger.memory.EVSE_Config.data.item.Correction_Leak[1][MCU_DATA] > Charger.memory.EVSE_Config.data.item.Correction_Leak[2][MCU_DATA]) { CLC_Corr_Gain_Par(Charger.memory.EVSE_Config.data.item.Correction_Leak[1][METER_DATA],Charger.memory.EVSE_Config.data.item.Correction_Leak[2][METER_DATA] , Charger.memory.EVSE_Config.data.item.Correction_Leak[1][MCU_DATA],Charger.memory.EVSE_Config.data.item.Correction_Leak[2][MCU_DATA] , &Charger.coefficient.gain_leak[0], &Charger.coefficient.offset_leak[0]); } else { Charger.coefficient.gain_leak[0] = 1; Charger.coefficient.offset_leak[0] = 0; } DEBUG_INFO("Charger.coefficient.gain_leak[0] = %f\r\n",Charger.coefficient.gain_leak[0]); DEBUG_INFO("Charger.coefficient.offset_leak[0] = %f\r\n",Charger.coefficient.offset_leak[0]); //GMI if(Charger.memory.EVSE_Config.data.item.Correction_GMI[1][MCU_DATA] > Charger.memory.EVSE_Config.data.item.Correction_GMI[2][MCU_DATA]) { CLC_Corr_Gain_Par2(Charger.memory.EVSE_Config.data.item.Correction_GMI[1][METER_DATA],Charger.memory.EVSE_Config.data.item.Correction_GMI[2][METER_DATA] , Charger.memory.EVSE_Config.data.item.Correction_GMI[1][MCU_DATA],Charger.memory.EVSE_Config.data.item.Correction_GMI[2][MCU_DATA] , &Charger.coefficient.gain_gmi[0], &Charger.coefficient.offset_gmi[0], &Charger.coefficient.offsetisPosOrNeg_gmi[0]); } else { Charger.coefficient.gain_gmi[0] = 1; Charger.coefficient.offset_gmi[0] = 0; } //DEBUG_INFO("Charger.coefficient.gain_gmi[0] = %f\r\n",Charger.coefficient.gain_gmi[0]); //DEBUG_INFO("Charger.coefficient.offset_gmi[0] = %f\r\n",Charger.coefficient.offset_gmi[0]); #ifdef FUNC_SHOW_CORRECTION_DATA { XP("[CORRECT DATA]======================\r\n"); XP("\r\n"); for (int i = 0; i < 4; i++) { XP("[%d][0] = 0x%04X, [%d][1] = 0x%04X\r\n", i, Charger.memory.EVSE_Config.data.item.Correction_VL1[i][0], i, Charger.memory.EVSE_Config.data.item.Correction_VL1[i][1]); } XP("\r\n"); for (int i = 0; i < 4; i++) { XP("[%d][0] = 0x%04X, [%d][1] = 0x%04X\r\n", i, Charger.memory.EVSE_Config.data.item.Correction_VL2[i][0], i, Charger.memory.EVSE_Config.data.item.Correction_VL2[i][1]); } XP("\r\n"); for (int i = 0; i < 4; i++) { XP("[%d][0] = 0x%04X, [%d][1] = 0x%04X\r\n", i, Charger.memory.EVSE_Config.data.item.Correction_VL3[i][0], i, Charger.memory.EVSE_Config.data.item.Correction_VL3[i][1]); } XP("\r\n"); for (int i = 0; i < 4; i++) { XP("[%d][0] = 0x%04X, [%d][1] = 0x%04X\r\n", i, Charger.memory.EVSE_Config.data.item.Correction_CL1[i][0], i, Charger.memory.EVSE_Config.data.item.Correction_CL1[i][1]); } XP("\r\n"); for (int i = 0; i < 4; i++) { XP("[%d][0] = 0x%04X, [%d][1] = 0x%04X\r\n", i, Charger.memory.EVSE_Config.data.item.Correction_CL2[i][0], i, Charger.memory.EVSE_Config.data.item.Correction_CL2[i][1]); } XP("\r\n"); for (int i = 0; i < 4; i++) { XP("[%d][0] = 0x%04X, [%d][1] = 0x%04X\r\n", i, Charger.memory.EVSE_Config.data.item.Correction_CL3[i][0], i, Charger.memory.EVSE_Config.data.item.Correction_CL3[i][1]); } XP("\r\n"); for (int i = 0; i < 4; i++) { XP("[%d][0] = 0x%04X, [%d][1] = 0x%04X\r\n", i, Charger.memory.EVSE_Config.data.item.Correction_Leak[i][0], i, Charger.memory.EVSE_Config.data.item.Correction_Leak[i][1]); } XP("\r\n"); for (int i = 0; i < 4; i++) { XP("[%d][0] = 0x%04X, [%d][1] = 0x%04X\r\n", i, Charger.memory.EVSE_Config.data.item.Correction_GMI[i][0], i, Charger.memory.EVSE_Config.data.item.Correction_GMI[i][1]); } XP("====================================\r\n"); } #endif //FUNC_SHOW_CORRECTION_DATA //DEBUG_INFO("Read MEM_ADDR_EVSE_CONFIG block(4k byte) pass.\r\n"); // Clean update & clear flag when model name not configured /* if(strlen(Charger.memory.EVSE_Config.data.item.ModelName)>20) { Charger.memory.EVSE_Config.op_bits.update = OFF; Charger.memory.EVSE_Config.op_bits.clear = OFF; Charger.memory.EVSE_Config.op_bits.backup = OFF; Charger.memory.EVSE_Config.op_bits.restore = OFF; } */ parseVersionInfoFromModelname(); } #endif //MODIFY_FLASH_OPERATION_20241104 /* USER CODE BEGIN Header_StartMemoryTask */ /** * @brief Function implementing the memoryTask thread. * @param argument: Not used * @retval None */ /* USER CODE END Header_StartMemoryTask */ void StartMemoryTask(void const * argument) { /* USER CODE BEGIN StartMemoryTask */ //mmemory //uint8_t tmpBuf[64]; uint8_t isSuccess; uint8_t ID[2]; BSP_W25Qx_Init(); BSP_W25Qx_Read_ID(ID); DEBUG_INFO("W25Qxxx ID is : 0x%02X 0x%02X \r\n",ID[0],ID[1]); Charger.memory.EVSE_Config.op_bits.read = ON; Charger.memory.coldLoadPickUp.op_bits.read = ON; Charger.memory.whiteList.op_bits.read = ON; Charger.memory.hisAlarm.op_bits.read = ON; #ifdef FUNC_METER_IC_HISTORY Charger.memory.hisMeterIC.op_bits.read = ON; #else Charger.memory.hisCharging.op_bits.read = ON; #endif /* Charger.memory.EVSE_Config.op_bits.clear = ON ; Charger.memory.EVSE_Config.op_bits.clear = ON; Charger.memory.coldLoadPickUp.op_bits.clear = ON; Charger.memory.whiteList.op_bits.clear = ON; Charger.memory.hisAlarm.op_bits.clear = ON; Charger.memory.hisCharging.op_bits.clear = ON; */ /* Infinite loop */ for(;;) { /* EVSE config operation */ if(Charger.memory.EVSE_Config.op_bits.read) { #ifdef FUNC_CALC_FLASH_CRC_IN_CRITICAL taskENTER_CRITICAL(); #endif #ifndef FUNC_CALC_FLASH_CRC_IN_CRITICAL osDelay(100); #endif // Read data from block if(BSP_W25Qx_Read(Charger.memory.EVSE_Config.data.value, MEM_ADDR_EVSE_CONFIG, W25Q16FV_BLOCK_SIZE)== W25Qx_OK) { #ifdef FUNC_FLASH_RESTORE_CONFIG_WHEN_PRIMARY_LOSS #ifdef FUNC_FLASH_CONFIG_APPEND_CRC u32 crc32 = HAL_CRC_Calculate(&hcrc, (u32*)Charger.memory.EVSE_Config.data.verify.buf, ((W25Q16FV_BLOCK_SIZE-4)>>2)); if ((Charger.memory.EVSE_Config.data.verify.crc32 == crc32 /*|| Charger.memory.EVSE_Config.data.verify.crc32 == HTK_U32_MAX*/)) #else if (1) #endif { DEBUG_INFO("Read MEM_ADDR_EVSE_CONFIG block(4k byte) pass.\r\n"); Proc_EVSE_Config(); Charger.ModelReadisOK = PASS; } else { static u8 bProc = 0; if (!bProc) { bProc = 1; DEBUG_WARN("MEM_ADDR_EVSE_CONFIG data area check sum error => restore from backup area.\r\n"); Charger.memory.EVSE_Config.op_bits.restore = ON; } else { Proc_EVSE_Config(); Charger.ModelReadisOK = PASS; } } #endif //FUNC_FLASH_RESTORE_CONFIG_WHEN_PRIMARY_LOSS Charger.memory.EVSE_Config.op_bits.read = OFF; } else { DEBUG_INFO("Read MEM_ADDR_EVSE_CONFIG block(4k byte) fail.\r\n"); } #ifdef FUNC_CALC_FLASH_CRC_IN_CRITICAL taskEXIT_CRITICAL(); #endif } if(Charger.memory.EVSE_Config.op_bits.update) { #ifdef FUNC_CALC_FLASH_CRC_IN_CRITICAL taskENTER_CRITICAL(); #endif #ifdef FUNC_AUTO_MODIFY_CCID_MODULE Charger.memory.EVSE_Config.op_bits.update = OFF; #endif isSuccess = PASS; #ifdef FUNC_FLASH_CONFIG_APPEND_CRC #ifndef FUNC_CALC_FLASH_CRC_IN_CRITICAL osDelay(100); #endif Charger.memory.EVSE_Config.data.verify.crc32 = HAL_CRC_Calculate(&hcrc, (u32*)Charger.memory.EVSE_Config.data.verify.buf, ((W25Q16FV_BLOCK_SIZE-4)>>2)); #endif // Erase block data if(BSP_W25Qx_Erase_Block(MEM_ADDR_EVSE_CONFIG) == W25Qx_OK) { // Write data to block for(uint16_t idx=0;idx<((W25Q16FV_BLOCK_SIZE)>>8);idx++) { if(BSP_W25Qx_Write(&Charger.memory.EVSE_Config.data.value[idx*W25Q16FV_PAGE_SIZE], MEM_ADDR_EVSE_CONFIG+(idx*W25Q16FV_PAGE_SIZE), W25Q16FV_PAGE_SIZE) != W25Qx_OK) { isSuccess = FAIL; } } if(isSuccess) DEBUG_INFO("Update MEM_ADDR_EVSE_CONFIG success.\r\n"); else DEBUG_WARN("Update MEM_ADDR_EVSE_CONFIG fail.\r\n"); #ifndef FUNC_AUTO_MODIFY_CCID_MODULE Charger.memory.EVSE_Config.op_bits.update = OFF; #endif #ifdef FUNC_FLASH_UPDATE_CONFIG_BOTH_PRIMARY_AND_BACKUP Charger.memory.EVSE_Config.op_bits.backup = ON; #endif } else { DEBUG_WARN("Update MEM_ADDR_EVSE_CONFIG block(4k byte) fail.\r\n"); } #ifdef FUNC_CALC_FLASH_CRC_IN_CRITICAL taskEXIT_CRITICAL(); #endif } if(Charger.memory.EVSE_Config.op_bits.clear) { // Erase block data if(BSP_W25Qx_Erase_Block(MEM_ADDR_EVSE_CONFIG) == W25Qx_OK) { // Read data from block if(BSP_W25Qx_Read(Charger.memory.EVSE_Config.data.value, MEM_ADDR_EVSE_CONFIG, W25Q16FV_BLOCK_SIZE)== W25Qx_OK) { DEBUG_INFO("Erase MEM_ADDR_EVSE_CONFIG block(4k byte) pass.\r\n"); Charger.memory.EVSE_Config.op_bits.clear = OFF; } else { DEBUG_WARN("Erase MEM_ADDR_EVSE_CONFIG block(4k byte) fail.\r\n"); } } else { DEBUG_WARN("Erase MEM_ADDR_EVSE_CONFIG block(4k byte) fail.\r\n"); } } if(Charger.memory.EVSE_Config.op_bits.backup) { #ifdef FUNC_CALC_FLASH_CRC_IN_CRITICAL taskENTER_CRITICAL(); #endif isSuccess = PASS; #ifndef FUNC_CALC_FLASH_CRC_IN_CRITICAL osDelay(100); #endif Charger.memory.EVSE_Config.data.verify.crc32 = HAL_CRC_Calculate(&hcrc, (u32*)Charger.memory.EVSE_Config.data.verify.buf, ((W25Q16FV_BLOCK_SIZE-4)>>2)); // Erase block data if(BSP_W25Qx_Erase_Block(MEM_ADDR_BACKUP_EVSE_CONFIG) == W25Qx_OK) { // Write data to block for(uint16_t idx=0;idx<((W25Q16FV_BLOCK_SIZE)>>8);idx++) { if(BSP_W25Qx_Write(&Charger.memory.EVSE_Config.data.value[idx*W25Q16FV_PAGE_SIZE], MEM_ADDR_BACKUP_EVSE_CONFIG+(idx*W25Q16FV_PAGE_SIZE), W25Q16FV_PAGE_SIZE) != W25Qx_OK) { isSuccess = FAIL; } } if(isSuccess) DEBUG_INFO("Backup MEM_ADDR_BACKUP_EVSE_CONFIG success.\r\n"); else DEBUG_WARN("Backup MEM_ADDR_BACKUP_EVSE_CONFIG fail.\r\n"); Charger.memory.EVSE_Config.op_bits.backup = OFF; #ifndef FUNC_FLASH_UPDATE_CONFIG_BOTH_PRIMARY_AND_BACKUP //Charger.memory.EVSE_Config.op_bits.clear = ON; #endif } else { DEBUG_WARN("Backup MEM_ADDR_BACKUP_EVSE_CONFIG block(4k byte) fail.\r\n"); } #ifdef FUNC_CALC_FLASH_CRC_IN_CRITICAL taskEXIT_CRITICAL(); #endif } if(Charger.memory.EVSE_Config.op_bits.restore) { // Restore data from backup block if(BSP_W25Qx_Read(Charger.memory.EVSE_Config.data.value, MEM_ADDR_BACKUP_EVSE_CONFIG, W25Q16FV_BLOCK_SIZE)== W25Qx_OK) { u32 crc32 = HAL_CRC_Calculate(&hcrc, (u32*)Charger.memory.EVSE_Config.data.verify.buf, ((W25Q16FV_BLOCK_SIZE-4)>>2)); if(Charger.memory.EVSE_Config.data.verify.crc32 == crc32) { DEBUG_INFO("Restore MEM_ADDR_BACKUP_EVSE_CONFIG block(4k byte) pass.\r\n"); // Update data to primary area Charger.memory.EVSE_Config.op_bits.update = ON; Proc_EVSE_Config(); Charger.ModelReadisOK = PASS; } else { DEBUG_WARN("[FLASH] MEM_ADDR_BACKUP_EVSE_CONFIG block check sum error.\r\n"); // TODO: static u8 bProc = 0; if (!bProc) { bProc = 1; setLedMotion(LED_ACTION_ALARM); Charger.memory.EVSE_Config.op_bits.read = ON; } } Charger.memory.EVSE_Config.op_bits.restore = OFF; } else { DEBUG_WARN("Restore MEM_ADDR_BACKUP_EVSE_CONFIG block(4k byte) fail.\r\n"); } } if((HAL_GPIO_ReadPin(IN_MEM_Erase_GPIO_Port, IN_MEM_Erase_Pin) == GPIO_PIN_RESET) && (Charger.Mode == MODE_IDLE) ) { //prevent idiot to pree this button too long to cause watchdog reset HAL_IWDG_Refresh(&hiwdg); if(Charger.counter.RST_CFG>3000) { // Reset EVSE configuration to factory default value Charger.memory.EVSE_Config.data.item.bleConfig.isGenPin = OFF; Charger.memory.EVSE_Config.data.item.bleConfig.isRegPuk = OFF; Charger.memory.EVSE_Config.data.item.AuthMode = AUTH_MODE_OCPP; Charger.memory.EVSE_Config.data.item.RFID_SN_Endian = RFID_ENDIAN_LITTLE; //Charger.memory.EVSE_Config.data.item.isAuthEnable = OFF; Charger.memory.EVSE_Config.data.item.OfflinePolicy = RFID_USER_AUTH_FREE ; //Charger.memory.EVSE_Config.data.item.Power_Consumption_Cumulative = 0; Charger.memory.EVSE_Config.data.item.reservation.mode = RESERVATION_DISABLE; Charger.memory.EVSE_Config.op_bits.update = ON; // Reset cold load pick up to factory default value Charger.memory.coldLoadPickUp.data.item.isEnable = OFF; Charger.memory.coldLoadPickUp.op_bits.update = ON; // Reset white list to factory default value for(uint8_t idx=0;idx<20;idx++) { Charger.memory.whiteList.data.item[idx].listType = 0xff; Charger.memory.whiteList.data.item[idx].isReg = OFF; memset(&Charger.memory.whiteList.data.item[idx].pin[0], 0x00, 6); memset(&Charger.memory.whiteList.data.item[idx].listID[0], 0x00, 6); } Charger.memory.whiteList.op_bits.update = ON; //restore led setLedMotion(LED_ACTION_RESTORE_SETTING) ; timerEnable(TIMER_IDX_LED_TEMP, 3000); setChargerMode(MODE_IDLE); osDelay(1000); } else Charger.counter.RST_CFG++; } else Charger.counter.RST_CFG = 0; /* Cold load pick up operation */ if(Charger.memory.coldLoadPickUp.op_bits.read) { osDelay(100); // Read data from block if(BSP_W25Qx_Read(Charger.memory.coldLoadPickUp.data.value, MEM_ADDR_COLD_LOAD_PICKUP, W25Q16FV_BLOCK_SIZE)== W25Qx_OK) { DEBUG_INFO("Read MEM_ADDR_COLD_LOAD_PICKUP block(4k byte) pass.\r\n"); Charger.memory.coldLoadPickUp.op_bits.read = OFF; } else { DEBUG_WARN("Read MEM_ADDR_COLD_LOAD_PICKUP block(4k byte) fail.\r\n"); } } if(Charger.memory.coldLoadPickUp.op_bits.update) { isSuccess = PASS; // Erase block data if(BSP_W25Qx_Erase_Block(MEM_ADDR_COLD_LOAD_PICKUP) == W25Qx_OK) { // Write data to block for(uint16_t idx=0;idx<((W25Q16FV_BLOCK_SIZE)>>8);idx++) { if(BSP_W25Qx_Write(&Charger.memory.coldLoadPickUp.data.value[idx*W25Q16FV_PAGE_SIZE], MEM_ADDR_COLD_LOAD_PICKUP+(idx*W25Q16FV_PAGE_SIZE), W25Q16FV_PAGE_SIZE) != W25Qx_OK) { isSuccess = FAIL; } } if(isSuccess) DEBUG_INFO("Update MEM_ADDR_COLD_LOAD_PICKUP success.\r\n"); else DEBUG_WARN("Update MEM_ADDR_COLD_LOAD_PICKUP fail.\r\n"); Charger.memory.coldLoadPickUp.op_bits.update = OFF; } else { DEBUG_WARN("Update MEM_ADDR_COLD_LOAD_PICKUP block(4k byte) fail.\r\n"); } } if(Charger.memory.coldLoadPickUp.op_bits.clear) { // Erase block data if(BSP_W25Qx_Erase_Block(MEM_ADDR_COLD_LOAD_PICKUP) == W25Qx_OK) { // Read data from block if(BSP_W25Qx_Read(Charger.memory.coldLoadPickUp.data.value, MEM_ADDR_COLD_LOAD_PICKUP, W25Q16FV_BLOCK_SIZE)== W25Qx_OK) { DEBUG_INFO("Erase MEM_ADDR_COLD_LOAD_PICKUP block(4k byte) pass.\r\n"); Charger.memory.coldLoadPickUp.op_bits.clear = OFF; } else { DEBUG_WARN("Erase MEM_ADDR_COLD_LOAD_PICKUP block(4k byte) fail.\r\n"); } } else { DEBUG_WARN("Erase MEM_ADDR_COLD_LOAD_PICKUP block(4k byte) fail.\r\n"); } } if(Charger.memory.coldLoadPickUp.op_bits.backup) { isSuccess = PASS; // Erase block data if(BSP_W25Qx_Erase_Block(MEM_ADDR_BACKUP_COLD_LOAD_PICKUP) == W25Qx_OK) { // Write data to block for(uint16_t idx=0;idx<((W25Q16FV_BLOCK_SIZE)>>8);idx++) { if(BSP_W25Qx_Write(&Charger.memory.coldLoadPickUp.data.value[idx*W25Q16FV_PAGE_SIZE], MEM_ADDR_BACKUP_COLD_LOAD_PICKUP+(idx*W25Q16FV_PAGE_SIZE), W25Q16FV_PAGE_SIZE) != W25Qx_OK) { isSuccess = FAIL; } } if(isSuccess) DEBUG_INFO("Backup MEM_ADDR_BACKUP_COLD_LOAD_PICKUP success.\r\n"); else DEBUG_WARN("Backup MEM_ADDR_BACKUP_COLD_LOAD_PICKUP fail.\r\n"); Charger.memory.coldLoadPickUp.op_bits.backup = OFF; Charger.memory.coldLoadPickUp.op_bits.clear = ON; } else { DEBUG_WARN("Backup MEM_ADDR_BACKUP_COLD_LOAD_PICKUP block(4k byte) fail.\r\n"); } } if(Charger.memory.coldLoadPickUp.op_bits.restore) { // Restore data from backup block if(BSP_W25Qx_Read(Charger.memory.coldLoadPickUp.data.value, MEM_ADDR_BACKUP_COLD_LOAD_PICKUP, W25Q16FV_BLOCK_SIZE)== W25Qx_OK) { DEBUG_INFO("Restore MEM_ADDR_BACKUP_COLD_LOAD_PICKUP block(4k byte) pass.\r\n"); Charger.memory.coldLoadPickUp.op_bits.restore = OFF; } else { DEBUG_WARN("Restore MEM_ADDR_BACKUP_COLD_LOAD_PICKUP block(4k byte) fail.\r\n"); } } /* White list operation */ if(Charger.memory.whiteList.op_bits.read) { osDelay(100); // Read data from block if(BSP_W25Qx_Read(Charger.memory.whiteList.data.value, MEM_ADDR_WHITE_LIST, W25Q16FV_BLOCK_SIZE)== W25Qx_OK) { DEBUG_INFO("Read MEM_ADDR_WHITE_LIST block(4k byte) pass.\r\n"); Charger.memory.whiteList.op_bits.read = OFF; } else { DEBUG_WARN("Read MEM_ADDR_WHITE_LIST block(4k byte) fail.\r\n"); } } if(Charger.memory.whiteList.op_bits.update) { isSuccess = PASS; // Erase block data if(BSP_W25Qx_Erase_Block(MEM_ADDR_WHITE_LIST) == W25Qx_OK) { // Write data to block for(uint16_t idx=0;idx<((W25Q16FV_BLOCK_SIZE)>>8);idx++) { if(BSP_W25Qx_Write(&Charger.memory.whiteList.data.value[idx*W25Q16FV_PAGE_SIZE], MEM_ADDR_WHITE_LIST+(idx*W25Q16FV_PAGE_SIZE), W25Q16FV_PAGE_SIZE) != W25Qx_OK) { isSuccess = FAIL; } } if(isSuccess) DEBUG_INFO("Update MEM_ADDR_WHITE_LIST success.\r\n"); else DEBUG_WARN("Update MEM_ADDR_WHITE_LIST fail.\r\n"); Charger.memory.whiteList.op_bits.update = OFF; } else { DEBUG_WARN("Update MEM_ADDR_WHITE_LIST block(4k byte) fail.\r\n"); } } if(Charger.memory.whiteList.op_bits.clear) { // Erase block data if(BSP_W25Qx_Erase_Block(MEM_ADDR_WHITE_LIST) == W25Qx_OK) { // Read data from block if(BSP_W25Qx_Read(Charger.memory.whiteList.data.value, MEM_ADDR_WHITE_LIST, W25Q16FV_BLOCK_SIZE)== W25Qx_OK) { DEBUG_INFO("Erase MEM_ADDR_WHITE_LIST block(4k byte) pass.\r\n"); Charger.memory.whiteList.op_bits.clear = OFF; } else { DEBUG_WARN("Erase MEM_ADDR_WHITE_LIST block(4k byte) fail.\r\n"); } } else { DEBUG_WARN("Erase MEM_ADDR_WHITE_LIST block(4k byte) fail.\r\n"); } } /* Alarm history operation */ if(Charger.memory.hisAlarm.op_bits.read) { osDelay(100); // Read data from block if(BSP_W25Qx_Read(Charger.memory.hisAlarm.data.value, MEM_ADDR_HIS_ALARM, W25Q16FV_BLOCK_SIZE)== W25Qx_OK) { DEBUG_INFO("Read MEM_ADDR_HIS_ALARM block(4k byte) pass.\r\n"); Charger.memory.hisAlarm.op_bits.read = OFF; } else { DEBUG_WARN("Read MEM_ADDR_HIS_ALARM block(4k byte) fail.\r\n"); } } if(Charger.memory.hisAlarm.op_bits.update) { isSuccess = PASS; // Write data to block for(uint16_t idx=0;idx<((W25Q16FV_BLOCK_SIZE)>>8);idx++) { if(BSP_W25Qx_Write(&Charger.memory.hisAlarm.data.value[idx*W25Q16FV_PAGE_SIZE], MEM_ADDR_HIS_ALARM+(idx*W25Q16FV_PAGE_SIZE), W25Q16FV_PAGE_SIZE) != W25Qx_OK) { isSuccess = FAIL; } } if(isSuccess) DEBUG_INFO("Update MEM_ADDR_HIS_ALARM success.\r\n"); else DEBUG_WARN("Update MEM_ADDR_HIS_ALARM fail.\r\n"); Charger.memory.hisAlarm.op_bits.update = OFF; } if(Charger.memory.hisAlarm.op_bits.clear) { // Erase block data if(BSP_W25Qx_Erase_Block(MEM_ADDR_HIS_ALARM) == W25Qx_OK) { // Read data from block if(BSP_W25Qx_Read(Charger.memory.hisAlarm.data.value, MEM_ADDR_HIS_ALARM, W25Q16FV_BLOCK_SIZE)== W25Qx_OK) { DEBUG_INFO("Erase MEM_ADDR_HIS_ALARM block(4k byte) pass.\r\n"); Charger.memory.hisAlarm.op_bits.clear = OFF; } else { DEBUG_WARN("Erase MEM_ADDR_HIS_ALARM block(4k byte) fail.\r\n"); } } else { DEBUG_WARN("Erase MEM_ADDR_HIS_ALARM block(4k byte) fail.\r\n"); } } if(Charger.memory.hisAlarm.op_bits.backup) { isSuccess = PASS; // Erase block data if(BSP_W25Qx_Erase_Block(MEM_ADDR_BACKUP_HIS_ALARM) == W25Qx_OK) { // Write data to block for(uint16_t idx=0;idx<((W25Q16FV_BLOCK_SIZE)>>8);idx++) { if(BSP_W25Qx_Write(&Charger.memory.hisAlarm.data.value[idx*W25Q16FV_PAGE_SIZE], MEM_ADDR_BACKUP_HIS_ALARM+(idx*W25Q16FV_PAGE_SIZE), W25Q16FV_PAGE_SIZE) != W25Qx_OK) { isSuccess = FAIL; } } if(isSuccess) DEBUG_INFO("Backup MEM_ADDR_BACKUP_HIS_ALARM success.\r\n"); else DEBUG_WARN("Backup MEM_ADDR_BACKUP_HIS_ALARM fail.\r\n"); Charger.memory.hisAlarm.op_bits.backup = OFF; Charger.memory.hisAlarm.op_bits.clear = ON; } else { DEBUG_WARN("Backup MEM_ADDR_BACKUP_HIS_ALARM block(4k byte) fail.\r\n"); } } if(Charger.memory.hisAlarm.op_bits.restore) { // Restore data from backup block if(BSP_W25Qx_Read(Charger.memory.hisAlarm.data.value, MEM_ADDR_BACKUP_HIS_ALARM, W25Q16FV_BLOCK_SIZE)== W25Qx_OK) { DEBUG_INFO("Restore MEM_ADDR_BACKUP_HIS_ALARM block(4k byte) pass.\r\n"); Charger.memory.hisAlarm.op_bits.restore = OFF; } else { DEBUG_WARN("Restore MEM_ADDR_BACKUP_HIS_ALARM block(4k byte) fail.\r\n"); } } #ifdef FUNC_METER_IC_HISTORY /* Meter IC calibration history operation */ if(Charger.memory.hisMeterIC.op_bits.read) { osDelay(100); // Read data from block if(BSP_W25Qx_Read(Charger.memory.hisMeterIC.data.value, MEM_ADDR_HIS_METERIC, W25Q16FV_BLOCK_SIZE)== W25Qx_OK) { DEBUG_INFO("Read MEM_ADDR_HIS_METERIC block(4k byte) pass.\r\n"); Charger.memory.hisMeterIC.op_bits.read = OFF; } else { DEBUG_INFO("Read MEM_ADDR_HIS_METERIC block(4k byte) fail.\r\n"); } } if(Charger.memory.hisMeterIC.op_bits.update) { isSuccess = PASS; // Write data to block for(uint16_t idx=0;idx<((W25Q16FV_BLOCK_SIZE)>>8);idx++) { if(BSP_W25Qx_Write(&Charger.memory.hisMeterIC.data.value[idx*W25Q16FV_PAGE_SIZE], MEM_ADDR_HIS_METERIC+(idx*W25Q16FV_PAGE_SIZE), W25Q16FV_PAGE_SIZE) != W25Qx_OK) { isSuccess = FAIL; } } if(isSuccess) DEBUG_INFO("Update MEM_ADDR_HIS_METERIC success.\r\n"); else DEBUG_WARN("Update MEM_ADDR_HIS_METERIC fail.\r\n"); Charger.memory.hisMeterIC.op_bits.update = OFF; } if(Charger.memory.hisMeterIC.op_bits.clear) { // Erase block data if(BSP_W25Qx_Erase_Block(MEM_ADDR_HIS_METERIC) == W25Qx_OK) { // Read data from block if(BSP_W25Qx_Read(Charger.memory.hisMeterIC.data.value, MEM_ADDR_HIS_METERIC, W25Q16FV_BLOCK_SIZE)== W25Qx_OK) { DEBUG_INFO("Erase MEM_ADDR_HIS_METERIC block(4k byte) pass.\r\n"); Charger.memory.hisMeterIC.op_bits.clear = OFF; } else { DEBUG_INFO("Erase MEM_ADDR_HIS_METERIC block(4k byte) fail.\r\n"); } } else { DEBUG_INFO("Erase MEM_ADDR_HIS_METERIC block(4k byte) fail.\r\n"); } } if(Charger.memory.hisMeterIC.op_bits.backup) { isSuccess = PASS; // Erase block data if(BSP_W25Qx_Erase_Block(MEM_ADDR_BACKUP_HIS_METERIC) == W25Qx_OK) { // Write data to block for(uint16_t idx=0;idx<((W25Q16FV_BLOCK_SIZE)>>8);idx++) { if(BSP_W25Qx_Write(&Charger.memory.hisMeterIC.data.value[idx*W25Q16FV_PAGE_SIZE], MEM_ADDR_BACKUP_HIS_METERIC+(idx*W25Q16FV_PAGE_SIZE), W25Q16FV_PAGE_SIZE) != W25Qx_OK) { isSuccess = FAIL; } } if(isSuccess) DEBUG_INFO("Backup MEM_ADDR_BACKUP_HIS_METERIC success.\r\n"); else DEBUG_WARN("Backup MEM_ADDR_BACKUP_HIS_METERIC fail.\r\n"); Charger.memory.hisMeterIC.op_bits.backup = OFF; Charger.memory.hisMeterIC.op_bits.clear = ON; } else { DEBUG_INFO("Backup MEM_ADDR_BACKUP_HIS_METERIC block(4k byte) fail.\r\n"); } } if(Charger.memory.hisMeterIC.op_bits.restore) { // Restore data from backup block if(BSP_W25Qx_Read(Charger.memory.hisMeterIC.data.value, MEM_ADDR_BACKUP_HIS_METERIC, W25Q16FV_BLOCK_SIZE)== W25Qx_OK) { DEBUG_INFO("Restore MEM_ADDR_BACKUP_HIS_METERIC block(4k byte) pass.\r\n"); Charger.memory.hisMeterIC.op_bits.restore = OFF; } else { DEBUG_INFO("Restore MEM_ADDR_BACKUP_HIS_METERIC block(4k byte) fail.\r\n"); } } #else //FUNC_METER_IC_HISTORY /* Charging history operation */ if(Charger.memory.hisCharging.op_bits.read) { osDelay(100); // Read data from block if(BSP_W25Qx_Read(Charger.memory.hisCharging.data.value, MEM_ADDR_HIS_CHARGING, W25Q16FV_BLOCK_SIZE)== W25Qx_OK) { DEBUG_INFO("Read MEM_ADDR_HIS_CHARGING block(4k byte) pass.\r\n"); Charger.memory.hisCharging.op_bits.read = OFF; } else { DEBUG_WARN("Read MEM_ADDR_HIS_CHARGING block(4k byte) fail.\r\n"); } } if(Charger.memory.hisCharging.op_bits.update) { isSuccess = PASS; // Write data to block for(uint16_t idx=0;idx<((W25Q16FV_BLOCK_SIZE)>>8);idx++) { if(BSP_W25Qx_Write(&Charger.memory.hisCharging.data.value[idx*W25Q16FV_PAGE_SIZE], MEM_ADDR_HIS_CHARGING+(idx*W25Q16FV_PAGE_SIZE), W25Q16FV_PAGE_SIZE) != W25Qx_OK) { isSuccess = FAIL; } } if(isSuccess) DEBUG_INFO("Update MEM_ADDR_HIS_CHARGING success.\r\n"); else DEBUG_WARN("Update MEM_ADDR_HIS_CHARGING fail.\r\n"); Charger.memory.hisCharging.op_bits.update = OFF; } if(Charger.memory.hisCharging.op_bits.clear) { // Erase block data if(BSP_W25Qx_Erase_Block(MEM_ADDR_HIS_CHARGING) == W25Qx_OK) { // Read data from block if(BSP_W25Qx_Read(Charger.memory.hisCharging.data.value, MEM_ADDR_HIS_CHARGING, W25Q16FV_BLOCK_SIZE)== W25Qx_OK) { DEBUG_INFO("Erase MEM_ADDR_HIS_CHARGING block(4k byte) pass.\r\n"); Charger.memory.hisCharging.op_bits.clear = OFF; } else { DEBUG_WARN("Erase MEM_ADDR_HIS_CHARGING block(4k byte) fail.\r\n"); } } else { DEBUG_WARN("Erase MEM_ADDR_HIS_CHARGING block(4k byte) fail.\r\n"); } } if(Charger.memory.hisCharging.op_bits.backup) { isSuccess = PASS; // Erase block data if(BSP_W25Qx_Erase_Block(MEM_ADDR_BACKUP_HIS_CHARGING) == W25Qx_OK) { // Write data to block for(uint16_t idx=0;idx<((W25Q16FV_BLOCK_SIZE)>>8);idx++) { if(BSP_W25Qx_Write(&Charger.memory.hisCharging.data.value[idx*W25Q16FV_PAGE_SIZE], MEM_ADDR_BACKUP_HIS_CHARGING+(idx*W25Q16FV_PAGE_SIZE), W25Q16FV_PAGE_SIZE) != W25Qx_OK) { isSuccess = FAIL; } } if(isSuccess) DEBUG_INFO("Backup MEM_ADDR_BACKUP_HIS_CHARGING success.\r\n"); else DEBUG_WARN("Backup MEM_ADDR_BACKUP_HIS_CHARGING fail.\r\n"); Charger.memory.hisCharging.op_bits.backup = OFF; Charger.memory.hisCharging.op_bits.clear = ON; } else { DEBUG_WARN("Backup MEM_ADDR_BACKUP_HIS_CHARGING block(4k byte) fail.\r\n"); } } if(Charger.memory.hisCharging.op_bits.restore) { // Restore data from backup block if(BSP_W25Qx_Read(Charger.memory.hisCharging.data.value, MEM_ADDR_BACKUP_HIS_CHARGING, W25Q16FV_BLOCK_SIZE)== W25Qx_OK) { DEBUG_INFO("Restore MEM_ADDR_BACKUP_HIS_CHARGING block(4k byte) pass.\r\n"); Charger.memory.hisCharging.op_bits.restore = OFF; } else { DEBUG_WARN("Restore MEM_ADDR_BACKUP_HIS_CHARGING block(4k byte) fail.\r\n"); } } #endif //FUNC_METER_IC_HISTORY #ifdef FUNC_IDLE_UNTIL_READ_ALL_MEM if (!Charger.m_bReadAllMemory) { #ifdef FUNC_METER_IC_HISTORY MeterIC_CaliHistory_ReadAll(); #endif Charger.m_bReadAllMemory = 1; } #endif osDelay(1); } /* USER CODE END StartMemoryTask */ } /* USER CODE BEGIN Header_StartWifiTask */ /** * @brief Function implementing the wifiTask thread. * @param argument: Not used * @retval None */ /* USER CODE END Header_StartWifiTask */ void StartWifiTask(void const * argument) { /* USER CODE BEGIN StartWifiTask */ #ifdef FUNC_IDLE_UNTIL_READ_ALL_MEM IdleUntilReadAllMemory(); #endif /* Infinite loop */ char tmpBuf[128]; //uint8_t endFlag[4]={0x55,0xaa,0x55,0xaa}; __IO uint32_t flash; //uint32_t checksum; uint32_t rndNumber; //===================================== // Module reset //===================================== HAL_GPIO_WritePin(OUT_BLE_RESET_GPIO_Port, OUT_BLE_RESET_Pin, GPIO_PIN_RESET); osDelay(60); HAL_GPIO_WritePin(OUT_BLE_RESET_GPIO_Port, OUT_BLE_RESET_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(OUT_BLE_DSR_GPIO_Port, OUT_BLE_DSR_Pin, GPIO_PIN_SET); Charger.wifi.initSeq = 0; Charger.wifi.isDataMode = OFF; UART_WIFI_Init_OK = OFF; osDelay(1000); /* Infinite loop */ for(;;) { //===================================== // WIFI module initialization process //===================================== switch(Charger.wifi.initSeq) { case 0x00: HAL_UART_Transmit(&WIFI_USART, (uint8_t *)WIFI_CMD[WIFI_CMD_SET_RESTORE], strlen(WIFI_CMD[WIFI_CMD_SET_RESTORE]), 0xffff); osDelay(WIFI_INIT_DELAY); break; case 0x01: HAL_UART_Transmit(&WIFI_USART, (uint8_t *)WIFI_CMD[WIFI_CMD_SET_DTR], strlen(WIFI_CMD[WIFI_CMD_SET_DTR]), 0xffff); osDelay(WIFI_INIT_DELAY); break; case 0x02: HAL_UART_Transmit(&WIFI_USART, (uint8_t *)WIFI_CMD[WIFI_CMD_SET_DSR], strlen(WIFI_CMD[WIFI_CMD_SET_DSR]), 0xffff); osDelay(WIFI_INIT_DELAY); break; case 0x03: HAL_UART_Transmit(&WIFI_USART, (uint8_t *)WIFI_CMD[WIFI_CMD_GET_ADDR], strlen(WIFI_CMD[WIFI_CMD_GET_ADDR]), 0xffff); osDelay(WIFI_INIT_DELAY); break; case 0x04: sprintf(tmpBuf, "%s\"EVSE_AP_%sP\"\r\n", WIFI_CMD[WIFI_CMD_SET_SSID], Charger.wifi.module_mac); DEBUG_INFO("WIFI module set name: EVSE_AP_%s\r\n", Charger.wifi.module_mac); HAL_UART_Transmit(&WIFI_USART, (uint8_t *)tmpBuf, strlen(tmpBuf), 0xffff); osDelay(WIFI_INIT_DELAY); break; case 0x05: HAL_UART_Transmit(&WIFI_USART, (uint8_t *)WIFI_CMD[WIFI_CMD_SET_CHANNEL], strlen(WIFI_CMD[WIFI_CMD_SET_CHANNEL]), 0xffff); osDelay(WIFI_INIT_DELAY); break; case 0x06: HAL_UART_Transmit(&WIFI_USART, (uint8_t *)WIFI_CMD[WIFI_CMD_SET_SECURITY_MODE], strlen(WIFI_CMD[WIFI_CMD_SET_SECURITY_MODE]), 0xffff); osDelay(WIFI_INIT_DELAY); break; case 0x07: sprintf(tmpBuf, "%s\"%s\"\r\n", WIFI_CMD[WIFI_CMD_SET_PASSWORD], Charger.memory.EVSE_Config.data.item.wifiConfig.passwd); HAL_UART_Transmit(&WIFI_USART, (uint8_t *)tmpBuf, strlen(tmpBuf), 0xffff); osDelay(WIFI_INIT_DELAY); break; case 0x08: HAL_UART_Transmit(&WIFI_USART, (uint8_t *)WIFI_CMD[WIFI_CMD_SET_DHCPSERVER], strlen(WIFI_CMD[WIFI_CMD_SET_DHCPSERVER]), 0xffff); osDelay(WIFI_INIT_DELAY); break; case 0x09: HAL_UART_Transmit(&WIFI_USART, (uint8_t *)WIFI_CMD[WIFI_CMD_SET_TCPSETVER_CONFIG], strlen(WIFI_CMD[WIFI_CMD_SET_TCPSETVER_CONFIG]), 0xffff); osDelay(WIFI_INIT_DELAY); break; case 0x0a: HAL_UART_Transmit(&WIFI_USART, (uint8_t *)WIFI_CMD[WIFI_CMD_SET_AP_ACTIVE], strlen(WIFI_CMD[WIFI_CMD_SET_AP_ACTIVE]), 0xffff); osDelay(WIFI_INIT_DELAY); break; case 0x0b: HAL_UART_Transmit(&WIFI_USART, (uint8_t *)WIFI_CMD[WIFI_CMD_SET_DATA_MODE], strlen(WIFI_CMD[WIFI_CMD_SET_DATA_MODE]), 0xffff); DEBUG_INFO("WIFI module switch to data mode.\r\n"); osDelay(WIFI_INIT_DELAY); default: UART_WIFI_Init_OK = ON; break; } //===================================== // WIFI central device connect status //===================================== if((HAL_GPIO_ReadPin(IN_BLE_DTR_GPIO_Port, IN_BLE_DTR_Pin) == GPIO_PIN_SET) && (UART_WIFI_Init_OK == ON)) { // Device disconnect timerRefresh(TIMER_IDX_WIFI); if(Charger.wifi.loginRole == WIFI_LOGIN_ROLE_ROOT || Charger.wifi.loginRole == WIFI_LOGIN_ROLE_USER) { DEBUG_INFO("WIFI client device disconnect.\r\n."); Charger.wifi.loginRole = WIFI_LOGIN_ROLE_UNKOWN; } } else if((HAL_GPIO_ReadPin(IN_BLE_DTR_GPIO_Port, IN_BLE_DTR_Pin) == GPIO_PIN_RESET) && (UART_WIFI_Init_OK == ON)) { // Device connect in if(Charger.wifi.loginRole == WIFI_LOGIN_ROLE_UNKOWN) { DEBUG_INFO("WIFI client device connect.....wait sign in.\r\n."); osDelay(1000); } } //===================================== // Communication timeout process //===================================== if(timer[TIMER_IDX_WIFI].isAlarm) { Charger.wifi.loginRole = WIFI_LOGIN_ROLE_UNKOWN; DEBUG_INFO("WIFI no communication over time, disconnect client device.\r\n"); timerRefresh(TIMER_IDX_WIFI); HAL_GPIO_WritePin(OUT_BLE_DSR_GPIO_Port, OUT_BLE_DSR_Pin, GPIO_PIN_RESET); osDelay(100); HAL_GPIO_WritePin(OUT_BLE_DSR_GPIO_Port, OUT_BLE_DSR_Pin, GPIO_PIN_SET); } //===================================== // WIFI uart recieve data process //===================================== if(UART_WIFI_recv_end_flag == ON) { if((HAL_GPIO_ReadPin(IN_BLE_DTR_GPIO_Port, IN_BLE_DTR_Pin) == GPIO_PIN_SET) || !Charger.wifi.isDataMode) { // AT command rx process if(strstr((char *)UART_WIFI_rx_buffer, WIFI_CMD[WIFI_CMD_SET_RESTORE])!=NULL) { Charger.wifi.initSeq++; } if(strstr((char *)UART_WIFI_rx_buffer, WIFI_CMD[WIFI_CMD_SET_DTR])!=NULL) { Charger.wifi.initSeq++; } if(strstr((char *)UART_WIFI_rx_buffer, WIFI_CMD[WIFI_CMD_SET_DSR])!=NULL) { Charger.wifi.initSeq++; } if(strstr((char *)UART_WIFI_rx_buffer, WIFI_CMD[WIFI_CMD_GET_ADDR])!=NULL) { memcpy(Charger.wifi.module_mac, &UART_WIFI_rx_buffer[strcspn((char *)UART_WIFI_rx_buffer, ":")+1], 12); Charger.wifi.module_mac[12] = '\0'; DEBUG_INFO("Wifi module mac address: %s\r\n", Charger.wifi.module_mac); Charger.wifi.initSeq++; } if(strstr((char *)UART_WIFI_rx_buffer, WIFI_CMD[WIFI_CMD_SET_SSID])!=NULL) { Charger.wifi.initSeq++; } if(strstr((char *)UART_WIFI_rx_buffer, WIFI_CMD[WIFI_CMD_SET_CHANNEL])!=NULL) { Charger.wifi.initSeq++; } if(strstr((char *)UART_WIFI_rx_buffer, WIFI_CMD[WIFI_CMD_SET_SECURITY_MODE])!=NULL) { Charger.wifi.initSeq++; } if(strstr((char *)UART_WIFI_rx_buffer, WIFI_CMD[WIFI_CMD_SET_PASSWORD])!=NULL) { Charger.wifi.initSeq++; } if(strstr((char *)UART_WIFI_rx_buffer, WIFI_CMD[WIFI_CMD_SET_DHCPSERVER])!=NULL) { Charger.wifi.initSeq++; } if(strstr((char *)UART_WIFI_rx_buffer, WIFI_CMD[WIFI_CMD_SET_TCPSETVER_CONFIG])!=NULL) { Charger.wifi.initSeq++; } if(strstr((char *)UART_WIFI_rx_buffer, WIFI_CMD[WIFI_CMD_SET_AP_ACTIVE])!=NULL) { Charger.wifi.initSeq++; } if(strstr((char *)UART_WIFI_rx_buffer, WIFI_CMD[WIFI_CMD_SET_DATA_MODE])!=NULL) { Charger.wifi.isDataMode = ON; Charger.wifi.initSeq++; } } else { // Application protocol rx process uint8_t tx[UART_BUFFER_SIZE]; uint8_t tx_len; uint8_t chksum = 0; if(isValidCheckSum_WIFI() && (rndNumber != ((UART_WIFI_rx_buffer[3]<<0) | (UART_WIFI_rx_buffer[4]<<8) | (UART_WIFI_rx_buffer[5]<<16) | (UART_WIFI_rx_buffer[6]<<24)))) { // Timer reset timerRefresh(TIMER_IDX_WIFI); rndNumber = ((UART_WIFI_rx_buffer[3]<<0) | (UART_WIFI_rx_buffer[4]<<8) | (UART_WIFI_rx_buffer[5]<<16) | (UART_WIFI_rx_buffer[6]<<24)); switch(UART_WIFI_rx_buffer[2]) { case WIFI_PROTOCOL_MESSAGE_SIGN_IN: DEBUG_INFO("WIFI device sign request...%d\r\n", UART_WIFI_rx_buffer[7]); tx_len = 5; tx[0] = (tx_len>>8)&0xff; tx[1] = (tx_len&0xff); tx[2] = UART_WIFI_rx_buffer[2] + 0x80; tx[3] = 0x00; for(uint16_t idx=0;idx<((tx[1] | (tx[0]<<8))-3);idx++) { chksum ^= tx[2 + idx]; } tx[4] = chksum; break; default: /* TODO: Unknow command response here */ tx_len = 5; tx[0] = 0x00; tx[1] = 0x05; tx[2] = UART_WIFI_rx_buffer[2] + 0x80; tx[3] = 0x00; for(uint16_t idx=0;idx<((tx[1] | (tx[0]<<8))-3);idx++) { chksum ^= tx[2 + idx]; } tx[4] = chksum; DEBUG_ERROR("WIFI unknow command.\r\n"); break; } } else { /* TODO: Protocol check sum error response here */ tx_len = 5; tx[0] = 0x00; tx[1] = 0x05; tx[2] = UART_WIFI_rx_buffer[2] + 0x80; tx[3] = 0x00; for(uint16_t idx=0;idx<((tx[1] | (tx[0]<<8))-3);idx++) { chksum ^= tx[2 + idx]; } tx[4] = chksum; DEBUG_ERROR("WIFI check sum validation error.\r\n"); } HAL_UART_Transmit(&WIFI_USART, (uint8_t *)tx, tx_len, 0xffff); } UART_WIFI_rx_len=0; UART_WIFI_recv_end_flag=0; } HAL_UART_Receive_DMA(&WIFI_USART, (uint8_t*)UART_WIFI_rx_buffer, UART_BUFFER_SIZE); osDelay(1); } /* USER CODE END StartWifiTask */ } /* USER CODE BEGIN Header_StartMeterTask */ /** * @brief Function implementing the MeterTask thread. * @param argument: Not used * @retval None */ /* USER CODE END Header_StartMeterTask */ void StartMeterTask(void const * argument) { /* USER CODE BEGIN StartMeterTask */ #ifdef FUNC_IDLE_UNTIL_READ_ALL_MEM IdleUntilReadAllMemory(); #endif #ifdef FUNC_WAIT_METER_IC_INIT_OK #ifdef FUNC_IDLE_UNTIL_INIT_METER_IC IdleUntilInitMeterIC(); #endif #endif //FUNC_WAIT_METER_IC_INIT_OK /* Infinite loop */ #ifdef RECODE_FUNC_METER_TASK #else uint8_t pollingStep = 0; uint8_t addr = 0x01; uint8_t meter_model; #endif HAL_GPIO_WritePin(Meter_DIR_GPIO_Port, Meter_DIR_Pin, GPIO_PIN_RESET); //#ifdef FUNC_TEST_PRO380_INIT_DE_HIGH_1_SEC // HAL_GPIO_WritePin(Meter_DIR_GPIO_Port, Meter_DIR_Pin, GPIO_PIN_SET); // osDelay(1000); // HAL_GPIO_WritePin(Meter_DIR_GPIO_Port, Meter_DIR_Pin, GPIO_PIN_RESET); //#endif //#ifndef RECODE_FUNC_METER_TASK timerEnable(TIMER_IDX_METER_POLLING, 500); //#endif static void* pTargetMeter = NULL; /* Infinite loop */ for(;;) { #ifdef RECODE_FUNC_METER_TASK if(timer[TIMER_IDX_METER_POLLING].isAlarm) { timerRefresh(TIMER_IDX_METER_POLLING); #endif if (Charger.m_bUseExtMeter_PRO380) { #ifdef RECODE_FUNC_METER_TASK #ifdef RECODE_METER_PRO380 static PPRO380 p = NULL; if (p == NULL) { p = (PPRO380)HTK_Malloc(sizeof(PRO380)); if (p != NULL) { Charger.m_pPRO380 = p; PRO380_Init(p, METER_PRO380_DEV_ADDR); } } else { if (pTargetMeter != (void*)p) { pTargetMeter = (void*)p; MX_UART4_Init_For_Meter_PRO380(); __HAL_UART_ENABLE_IT(&huart4, UART_IT_IDLE); } PRO380_Proc(p); } #endif //RECODE_METER_PRO380 #else //RECODE_FUNC_METER_TASK { meter_model = METER_MODEL_PRO380; if(UART_METER_recv_end_flag != ON) { // Polling meter info uint8_t tx[UART_BUFFER_SIZE]; uint8_t tx_len = 0; if(timer[TIMER_IDX_METER_POLLING].isAlarm) { timerRefresh(TIMER_IDX_METER_POLLING); switch(pollingStep) { case 0: tx_len = read_Energy_tx(meter_model, addr, &tx[0]); break; } HAL_GPIO_WritePin(Meter_DIR_GPIO_Port, Meter_DIR_Pin, GPIO_PIN_SET); osDelay(5); HAL_UART_Transmit(&METER_USART, (uint8_t *)tx, tx_len, 0xffff); osDelay(5); HAL_GPIO_WritePin(Meter_DIR_GPIO_Port, Meter_DIR_Pin, GPIO_PIN_RESET); osDelay(30); } } else { switch(pollingStep) { case 0: // Total enery if(read_Energy_rx(meter_model, addr, &UART_METER_rx_buffer[0], UART_METER_rx_len)) { //pollingStep++; //Only process case 0 (Total Energy) Charger.counter.Meter_Timeout.fail = 0; Charger.m_MeterPRO380.m_LastUpdateTick = HAL_GetTick(); } break; } memset(&UART_METER_rx_buffer[0], 0x00, ARRAY_SIZE(UART_METER_rx_buffer)); UART_METER_rx_len = 0; UART_METER_recv_end_flag = OFF; } HAL_UART_Receive_DMA(&METER_USART,(uint8_t*)UART_METER_rx_buffer, UART_BUFFER_SIZE); } #endif //RECODE_FUNC_METER_TASK } #ifdef FUNC_PTB_METER_WM3M4C if (Charger.m_bUseExtMeter_WM3M4C) { static PWM3M4C p = NULL; if (p == NULL) { p = (PWM3M4C)HTK_Malloc(sizeof(WM3M4C)); if (p != NULL) { Charger.m_pWM3M4C = p; WM3M4C_Init(p, METER_WM3M4C_DEV_ADDR); } } else { if (pTargetMeter != (void*)p) { pTargetMeter = (void*)p; MX_UART4_Init_For_PTB_Meter_WM3M4C(); __HAL_UART_ENABLE_IT(&huart4, UART_IT_IDLE); } WM3M4C_Proc(p); } } #endif //FUNC_PTB_METER_WM3M4C #ifdef FUNC_EKM_OMNIMETER if (Charger.m_bUseExtMeter_OMNIMETER) { static PEKM_Omnimeter p = NULL; if (p == NULL) { p = (PEKM_Omnimeter)HTK_Malloc(sizeof(EKM_Omnimeter)); if (p != NULL) { Charger.m_pEKM_Omnimeter = p; EKM_Omnimeter_Init(p); } } else { if (pTargetMeter != (void*)p) { pTargetMeter = (void*)p; MX_UART4_Init_For_EKM_Omnimeter(); __HAL_UART_ENABLE_IT(&huart4, UART_IT_IDLE); } EKM_Omnimeter_Proc(p); } } #endif //FUNC_EKM_OMNIMETER #ifdef RECODE_FUNC_METER_TASK } #endif osDelay(1); } /* USER CODE END StartMeterTask */ } /* Private application code --------------------------------------------------*/ /* USER CODE BEGIN Application */ #ifdef RECODE_FUNC_METER_IC_TASK void MeterIC_Proc(uint16_t* pUpdateMemReq) { #ifdef FUNC_METER_IC_ADE7858A //Meter IC { //meter_model = METER_MODEL_IC; #ifndef DEBUG_METER_IC HTK_UNUSED(MeterIC_KP); #endif double Volt[AC_PHASE_NUM_MAX] = { 0 }; double Curr[AC_PHASE_NUM_MAX] = { 0 }; static uint32_t EngPlusRaw[AC_PHASE_NUM_MAX] = { 0 }; #ifdef FUNC_METER_IC_POWER_FADEOUT static uint32_t ValidCurrTick = 0; #endif if(timer[TIMER_IDX_METER_IC_POLLING].isAlarm) { timerRefresh(TIMER_IDX_METER_IC_POLLING); //Check new calibration values if (Charger.m_MeterIC_TrigWriteCaliVals.m_Data != 0) //Find new calibration values { MeterIC_WriteCaliValsFromFlash(HTK_FALSE, HTK_TRUE); } //Read data from Meter IC and calculate { PMeterIC_MeasVals p = &Charger.m_MeterIC_MeasVals; uint8_t *RxBuf = I2C_METER_rx_buffer; ADE7858A_Get(AVRMS, RxBuf, &p->m_AVRMS, 4); //V1 ADE7858A_Get(BVRMS, RxBuf, &p->m_BVRMS, 4); //V2 ADE7858A_Get(CVRMS, RxBuf, &p->m_CVRMS, 4); //V3 #ifdef FUNC_METER_IC_READ_PHASE_ANGLE { PMeterIC_ExtraInfo pEx = &Charger.m_MeterIcEx; ADE7858A_Get(MMODE, RxBuf, &pEx->m_MMODE, 1); //MMODE ADE7858A_Get(COMPMODE, RxBuf, &pEx->m_COMPMODE, 2); //COMPMODE ADE7858A_Get(ANGLE0, RxBuf, &pEx->m_AngleReg[0], 2); //ANGLE0 ADE7858A_Get(ANGLE1, RxBuf, &pEx->m_AngleReg[1], 2); //ANGLE1 ADE7858A_Get(ANGLE2, RxBuf, &pEx->m_AngleReg[2], 2); //ANGLE2 ADE7858A_Get(Period, RxBuf, &p->m_Period, 2); //Period if (HTK_IS_BETWEEN_MIDDIFF(p->m_Period, 5120, 30)) //Datasheet "Period Measurement" { pEx->m_AcPeriodMode = AC_PERIOD_MODE_50HZ; for (u8 i = 0; i < 3; i++) { if (pEx->m_AngleReg[i] != 0) { pEx->m_AngleDegree[i] = METER_IC_ANGLE_REG_TO_DEGREE(50, pEx->m_AngleReg[i]); } } } else if (HTK_IS_BETWEEN_MIDDIFF(p->m_Period, 4267, 30)) { pEx->m_AcPeriodMode = AC_PERIOD_MODE_60HZ; for (u8 i = 0; i < 3; i++) { if (pEx->m_AngleReg[i] != 0) { pEx->m_AngleDegree[i] = METER_IC_ANGLE_REG_TO_DEGREE(60, pEx->m_AngleReg[i]); } } } else { pEx->m_AcPeriodMode = AC_PERIOD_MODE_UNKNOW; // for (u8 i = 0; i < 3; i++) // { // pEx.m_AngleDegree[i] = 0; // } } ADE7858A_Get(STATUS0, RxBuf, &pEx->m_STATUS0, 4); //STATUS0 ADE7858A_Get(STATUS1, RxBuf, &pEx->m_STATUS1, 4); //STATUS1 pEx->m_bSEQERR = BIT_GET(pEx->m_STATUS1, 19); //bit19 } #endif //FUNC_METER_IC_READ_PHASE_ANGLE ADE7858A_Get(AIRMS, RxBuf, &p->m_AIRMS, 4); //I1 ADE7858A_Get(BIRMS, RxBuf, &p->m_BIRMS, 4); //I2 ADE7858A_Get(CIRMS, RxBuf, &p->m_CIRMS, 4); //I3 ADE7858A_Get(AVRMS_LRIP, RxBuf, &p->m_AVRMS_LRIP, 4); //V1_LRIP ADE7858A_Get(BVRMS_LRIP, RxBuf, &p->m_BVRMS_LRIP, 4); //V2_LRIP ADE7858A_Get(CVRMS_LRIP, RxBuf, &p->m_CVRMS_LRIP, 4); //V3_LRIP ADE7858A_Get(AIRMS_LRIP, RxBuf, &p->m_AIRMS_LRIP, 4); //I1_LRIP ADE7858A_Get(BIRMS_LRIP, RxBuf, &p->m_BIRMS_LRIP, 4); //I2_LRIP ADE7858A_Get(CIRMS_LRIP, RxBuf, &p->m_CIRMS_LRIP, 4); //I3_LRIP ADE7858A_Get(AWATT, RxBuf, &p->m_AWATT, 4); //P1 ADE7858A_Get(BWATT, RxBuf, &p->m_BWATT, 4); //P2 ADE7858A_Get(CWATT, RxBuf, &p->m_CWATT, 4); //P3 if (ADE7858A_Get(AWATTHR, RxBuf, &p->m_AWATTHR, 4)) { EngPlusRaw[0] += HTK_GET_VAL_MAX(p->m_AWATTHR, 0); } //E1, only positive energy allowed if (ADE7858A_Get(BWATTHR, RxBuf, &p->m_BWATTHR, 4)) { EngPlusRaw[1] += HTK_GET_VAL_MAX(p->m_BWATTHR, 0); } //E2, only positive energy allowed if (ADE7858A_Get(CWATTHR, RxBuf, &p->m_CWATTHR, 4)) { EngPlusRaw[2] += HTK_GET_VAL_MAX(p->m_CWATTHR, 0); } //E3, only positive energy allowed Volt[0] = p->m_AVRMS * KV; //V Volt[1] = p->m_BVRMS * KV; //V Volt[2] = p->m_CVRMS * KV; //V #ifdef TEST_ACXXX_FAKEDATA HTK_UNUSED(Volt[0]); #endif #ifdef FUNC_METER_IC_VARIABLE_PARAM Curr[0] = p->m_AIRMS * MeterIC_KI; //A Curr[1] = p->m_BIRMS * MeterIC_KI; //A Curr[2] = p->m_CIRMS * MeterIC_KI; //A #else Curr[0] = p->m_AIRMS * KI; //A Curr[1] = p->m_BIRMS * KI; //A Curr[2] = p->m_CIRMS * KI; //A #endif for (uint8_t i = 0; i < AC_PHASE_NUM_MAX; i++) { #ifndef TEST_ACXXX_FAKEDATA #ifdef VO_SIMU_ACV if (Charger.m_VOCode.m_EnableSimuACV) { Charger.Voltage[i] = Charger.m_SimuData.m_AcvVolt; } else { Charger.Voltage[i] = (uint16_t)(Volt[i] * 100); //10mV } #else Charger.Voltage[i] = (uint16_t)(Volt[i] * 100); //10mV #endif //VO_SIMU_ACV #endif //TEST_ACXXX_FAKEDATA #ifdef VO_SIMU_ACA if (Charger.m_VOCode.m_EnableSimuACA) { if (Charger.m_b3PhaseModel || (!Charger.m_b3PhaseModel && i == 0)) { Charger.Current[i] = Charger.m_SimuData.m_AcaCurr; } } else { Charger.Current[i] = (uint16_t)(Curr[i] * 100); //10mA } #else Charger.Current[i] = (uint16_t)(Curr[i] * 100); //10mA #endif //VO_SIMU_ACA } #ifdef FUNC_METER_IC_POWER_FADEOUT if (Curr[0] > METER_IC_POWER_CONSUMPTION_MIN_CURR || Curr[1] > METER_IC_POWER_CONSUMPTION_MIN_CURR || Curr[2] > METER_IC_POWER_CONSUMPTION_MIN_CURR) { //ValidCurrTick = (int64_t)HAL_GetTick(); ValidCurrTick = HAL_GetTick(); } #endif #ifdef DEBUG_METER_IC XP("L1_Voltage: %f (%d)\r\n", Volt[0], p->m_AVRMS); XP("L2_Voltage: %f (%d)\r\n", Volt[1], p->m_BVRMS); XP("L3_Voltage: %f (%d)\r\n", Volt[2], p->m_CVRMS); XP("L1_Current: %f (%d)\r\n", Curr[0], p->m_AIRMS); XP("L2_Current: %f (%d)\r\n", Curr[1], p->m_BIRMS); XP("L3_Current: %f (%d)\r\n", Curr[2], p->m_CIRMS); double Volt_LRIP[AC_PHASE_NUM_MAX] = { 0 }; double Curr_LRIP[AC_PHASE_NUM_MAX] = { 0 }; Volt_LRIP[0] = p->m_AVRMS_LRIP * KV; //V Volt_LRIP[1] = p->m_BVRMS_LRIP * KV; //V Volt_LRIP[2] = p->m_CVRMS_LRIP * KV; //V #ifdef FUNC_METER_IC_VARIABLE_PARAM Curr_LRIP[0] = p->m_AIRMS_LRIP * MeterIC_KI ; //A Curr_LRIP[1] = p->m_BIRMS_LRIP * MeterIC_KI ; //A Curr_LRIP[2] = p->m_CIRMS_LRIP * MeterIC_KI ; //A #else Curr_LRIP[0] = p->m_AIRMS_LRIP * KI; //A Curr_LRIP[1] = p->m_BIRMS_LRIP * KI; //A Curr_LRIP[2] = p->m_CIRMS_LRIP * KI; //A #endif XP("L1_Voltage_LRIP: %f (%d)\r\n", Volt_LRIP[0], p->m_AVRMS_LRIP); XP("L2_Voltage_LRIP: %f (%d)\r\n", Volt_LRIP[1], p->m_BVRMS_LRIP); XP("L3_Voltage_LRIP: %f (%d)\r\n", Volt_LRIP[2], p->m_CVRMS_LRIP); XP("L1_Current_LRIP: %f (%d)\r\n", Curr_LRIP[0], p->m_AIRMS_LRIP); XP("L2_Current_LRIP: %f (%d)\r\n", Curr_LRIP[1], p->m_BIRMS_LRIP); XP("L3_Current_LRIP: %f (%d)\r\n", Curr_LRIP[2], p->m_CIRMS_LRIP); #ifdef FUNC_METER_IC_VARIABLE_PARAM double Power1 = p->m_AWATT * MeterIC_KP; //W double Power2 = p->m_BWATT * MeterIC_KP; //W double Power3 = p->m_CWATT * MeterIC_KP; //W #else double Power1 = p->m_AWATT * KP; //W double Power2 = p->m_BWATT * KP; //W double Power3 = p->m_CWATT * KP; //W #endif XP("L1_WATT(W): %f (%d, %u)\r\n", Power1, p->m_AWATT, (uint32_t)p->m_AWATT); XP("L2_WATT(W): %f (%d, %u)\r\n", Power2, p->m_BWATT, (uint32_t)p->m_BWATT); XP("L3_WATT(W): %f (%d, %u)\r\n", Power3, p->m_CWATT, (uint32_t)p->m_CWATT); #ifdef FUNC_METER_IC_VARIABLE_PARAM double Energy1 = p->m_AWATTHR * MeterIC_KE; //Wh double Energy2 = p->m_BWATTHR * MeterIC_KE; //Wh double Energy3 = p->m_CWATTHR * MeterIC_KE; //Wh #else double Energy1 = p->m_AWATTHR * KE; //Wh double Energy2 = p->m_BWATTHR * KE; //Wh double Energy3 = p->m_CWATTHR * KE; //Wh #endif XP("L1_WATTHR(Wh): %f (%d, %u)\r\n", Energy1, p->m_AWATTHR, (uint32_t)p->m_AWATTHR); XP("L2_WATTHR(Wh): %f (%d, %u)\r\n", Energy2, p->m_BWATTHR, (uint32_t)p->m_BWATTHR); XP("L3_WATTHR(Wh): %f (%d, %u)\r\n", Energy3, p->m_CWATTHR, (uint32_t)p->m_CWATTHR); #endif //DEBUG_METER_IC } } #ifdef FUNC_POWER_CONSUMPTION_BY_METER_IC if(timer[TIMER_IDX_POWER].isAlarm) { timerRefresh(TIMER_IDX_POWER); if (0) { } #ifdef FUNC_PTB_METER_WM3M4C else if (Charger.m_bUseExtMeter_WM3M4C && Charger.m_pWM3M4C) { uint64_t Eng = Charger.m_pWM3M4C->m_AccuEnergy1 / ((Charger.m_b3PhaseModel) ? 3 : 1); if (Charger.m_b3PhaseModel) { Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_L1 = Eng; Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_L2 = Eng; Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_L3 = Eng; Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_Total = Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_L1 + Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_L2 + Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_L3; } else { Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_L1 = Eng; Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_L2 = 0; Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_L3 = 0; Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_Total = Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_L1; } } #endif //FUNC_PTB_METER_WM3M4C else if (Charger.m_bUseExtMeter_PRO380 && Charger.m_pPRO380) //Use PRO380 { for (uint8_t i = 0; i < AC_PHASE_NUM_MAX; i++) { Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_Lx[i] = // //round off to 2 decimal place // //i.g. 0.53 (float: 0.52999..) => 52.999.. => 53 => 5300 (0.0001 kWh) => 0.53 kWh // (uint64_t)(HTK_ROUND_U64(Charger.m_MeterPRO380.m_AE_Lx_Total[i] * 100) * 100); //round off to 4 decimal place //i.g. 0.53 (float: 0.52999..) => 52.999.. => 53 => 5300 (0.0001 kWh) => 0.53 kWh #ifdef RECODE_METER_PRO380 ((uint64_t)(HTK_ROUND_U64(Charger.m_pPRO380->m_Lx_Total_active_energy[i].m_Val * 10000))); #else (uint64_t)(HTK_ROUND_U64(Charger.m_MeterPRO380.m_AE_Lx_Total[i] * 10000)); #endif } if (Charger.m_b3PhaseModel) { Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_Total = Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_L1 + Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_L2 + Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_L3; } else { Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_Total = Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_L1; } } else //Use Meter IC { static double EngPlus[AC_PHASE_NUM_MAX] = { 0 }; static double Eng[AC_PHASE_NUM_MAX] = { 0 }; for (uint8_t i = 0; i < AC_PHASE_NUM_MAX; i++) { #ifdef FUNC_METER_IC_VARIABLE_PARAM EngPlus[i] = EngPlusRaw[i] * MeterIC_KE; #else EngPlus[i] = EngPlusRaw[i] * KE; #endif EngPlusRaw[i] = 0; #ifdef FUNC_METER_IC_POWER_FADEOUT //Energy is calculated only when the current is greater than 0.5A and within METER_IC_POWER_FADEOUT_TIME double PlusVal = (HTK_GET_VAL(HTK_IsInTime(ValidCurrTick, METER_IC_POWER_FADEOUT_TIME), HTK_GET_VAL_MAX(EngPlus[i], 0), 0) * 10); //Unit: 0.1 Wh #else //Energy is calculated only when the current is greater than 0.5A double PlusVal = (HTK_GET_VAL(Curr[i] > METER_IC_POWER_CONSUMPTION_MIN_CURR, HTK_GET_VAL_MAX(EngPlus[i], 0), 0) * 10); //Unit: 0.1 Wh #endif Eng[i] += PlusVal; #ifdef DEBUG_METER_IC DEBUG_INFO("L%d_WATTHR(Wh): %f\r\n", i + 1, EngPlus[i]); DEBUG_INFO("L%d += %f (%f) [%llu, %.4f kWh]\r\n", i + 1, PlusVal, Eng[i], Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_Lx[i], Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_Lx[i] * 0.0001); #endif } #ifdef DEBUG_METER_IC double EngTotal = (Eng[0] + Eng[1] + Eng[2]); DEBUG_INFO("#Total Energy = %f [%llu, %.4f kWh]\r\n", EngTotal, Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_Total, Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_Total * 0.0001); #endif uint32_t EngIntPart[AC_PHASE_NUM_MAX] = { (uint32_t)Eng[0], (uint32_t)Eng[1], (uint32_t)Eng[2] }; if (EngIntPart[0] != 0 || EngIntPart[1] != 0 || EngIntPart[2] != 0) { uint32_t IntPart = 0; //Storage INTEGER part and keep the DECIMAL part for (uint8_t i = 0; i < AC_PHASE_NUM_MAX; i++) { IntPart = EngIntPart[i]; Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_Lx[i] += IntPart; Eng[i] -= IntPart; #ifdef DEBUG_METER_IC DEBUG_INFO("#PowerConsumptionCumulative_L%d = %llu (%d Added)\r\n", i + 1, Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_Lx[i], IntPart); #endif } if (Charger.m_b3PhaseModel) { Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_Total = Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_L1 + Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_L2 + Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_L3; } else { Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_Total = Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_L1; } #ifdef DEBUG_METER_IC DEBUG_INFO("#Power_Consumption_Cumulative = %llu\r\n", Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_Total); #endif } } //if(++updateMemReq >= METER_IC_POWER_CONSUMPTION_SAVE_MAX_COUNT) if(++(*pUpdateMemReq) >= METER_IC_POWER_CONSUMPTION_SAVE_MAX_COUNT) { //updateMemReq = 0; *pUpdateMemReq = 0; static uint64_t PreSaveEnergy = 0; if (PreSaveEnergy != Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_Total) { PreSaveEnergy = Charger.memory.EVSE_Config.data.item.PowerConsumptionCumulative_Total; #ifdef DEBUG_METER_IC DEBUG_INFO("#SAVE POWER CONSUMPTION DATA TO FLASH\r\n"); #endif Charger.memory.EVSE_Config.op_bits.update = ON; } } } #endif //FUNC_POWER_CONSUMPTION_BY_METER_IC } #endif //FUNC_METER_IC_ADE7858A } void StartMeterIcTask(void const * argument) { #ifdef FUNC_IDLE_UNTIL_READ_ALL_MEM IdleUntilReadAllMemory(); #endif #ifdef FUNC_METER_IC_ADE7858A while (Charger.ModelReadisOK != PASS ) { osDelay(100); } MeterIC_InitLoop(METER_IC_INIT_RETRY_NUM_MAX); timerEnable(TIMER_IDX_METER_IC_POLLING, METER_IC_TIMER_IDX_METER_POLLING_SPEC); #ifdef FUNC_POWER_CONSUMPTION_BY_METER_IC timerEnable(TIMER_IDX_POWER, METER_IC_TIMER_IDX_POWER_TIMEOUT_SPEC); //uint8_t updateMemReq = 0; uint16_t updateMemReq = 0; #endif #endif //FUNC_METER_IC_ADE7858A #ifdef FUNC_TMP100 if (Charger.m_bUseTMP100) { TMP100_Init(); } #endif while (1) { #ifdef FUNC_RESET_DATA_AFTER_WRITE_NEW_MODELNAME if (Charger.m_bTrigToRefreshMeterIcCaliVal) { Charger.m_bTrigToRefreshMeterIcCaliVal = HTK_FALSE; MeterIC_WriteCaliValsFromFlash(HTK_TRUE, HTK_TRUE); osDelay(1); } #endif MeterIC_Proc(&updateMemReq); #ifdef FUNC_TMP100 if (Charger.m_bUseTMP100) { static u8 c = 0; c++; if (c >= 10) { c = 0; TMP100_Proc(); osDelay(10); } } #endif //FUNC_TMP100 osDelay(1); } } #endif //RECODE_FUNC_METER_IC_TASK #ifdef MODIFY_IMCP void UpdateCheckSum(uint8_t *Buf, uint16_t Len) //Len: Total package length { uint16_t DataLen = Len - (IMCP_FM_HEAD_LEN + IMCP_FM_TAIL_LEN); uint8_t CheckSum = 0; //Update DataLen HTK_U16(Buf[IMCP_FM_DATALEN_LSB_IDX]) = DataLen; //Update CheckSum for (uint16_t i = 0; i < DataLen; i++) { CheckSum ^= Buf[IMCP_FM_DATA_BEG_IDX + i]; } Buf[Len - 1] = CheckSum; } #ifdef FUNC_RS485_SLAVE uint8_t isValidCheckSum_IAP(uint8_t *RxBuf) { uint8_t result = OFF; uint8_t chksum = 0x00; if ( (RxBuf[IMCP_FM_FRAMEID_IDX] == PROTOCOL_HEAD) && ( (RxBuf[IMCP_FM_DSTADDR_IDX] == PROTOCOL_ADDR) || (RxBuf[IMCP_FM_DSTADDR_IDX] == PROTOCOL_ADDR_AC_MAINBOARD) || (RxBuf[IMCP_FM_DSTADDR_IDX] == PROTOCOL_ADDR_BROADCAST) ) ) { uint16_t nCheckSumIdx = IMCP_FM_DATA_BEG_IDX + HTK_U16(RxBuf[IMCP_FM_DATALEN_LSB_IDX]); for(uint16_t i = IMCP_FM_DATA_BEG_IDX; i < nCheckSumIdx; i++) { chksum ^= RxBuf[i]; } if(chksum == RxBuf[nCheckSumIdx]) result = ON; } return result; } #else //FUNC_RS485_SLAVE uint8_t isValidCheckSum_IAP(void) { uint8_t result = OFF; uint8_t chksum = 0x00; if ( (UART_IAP_rx_buffer[IMCP_FM_FRAMEID_IDX] == PROTOCOL_HEAD) && ( (UART_IAP_rx_buffer[IMCP_FM_DSTADDR_IDX] == PROTOCOL_ADDR) || (UART_IAP_rx_buffer[IMCP_FM_DSTADDR_IDX] == PROTOCOL_ADDR_BROADCAST) ) ) { uint16_t nCheckSumIdx = IMCP_FM_DATA_BEG_IDX + HTK_U16(UART_IAP_rx_buffer[IMCP_FM_DATALEN_LSB_IDX]); for(uint16_t i = IMCP_FM_DATA_BEG_IDX; i < nCheckSumIdx; i++) { chksum ^= UART_IAP_rx_buffer[i]; } if(chksum == UART_IAP_rx_buffer[nCheckSumIdx]) result = ON; } return result; } #endif //FUNC_RS485_SLAVE #else //MODIFY_IMCP uint8_t isValidCheckSum_IAP(void) { uint8_t result = OFF; uint8_t chksum = 0x00; if((UART_IAP_rx_buffer[0] == PROTOCOL_HEAD) && ((UART_IAP_rx_buffer[2] == PROTOCOL_ADDR) | (UART_IAP_rx_buffer[2] == PROTOCOL_ADDR_BROADCAST))) { for(int idx=0;idx<(UART_IAP_rx_buffer[4] | (UART_IAP_rx_buffer[5]<<8));idx++) { chksum ^= UART_IAP_rx_buffer[6+ idx]; } if(chksum == UART_IAP_rx_buffer[6+(UART_IAP_rx_buffer[4] | (UART_IAP_rx_buffer[5]<<8))]) result = ON; } return result; } #endif //MODIFY_IMCP //------------------------------------------------------------------------------------------------- uint8_t isValidCheckSum_BLE(void) { uint8_t result = OFF; uint8_t chksum = 0x00; if(((UART_BLE_rx_buffer[1] | (UART_BLE_rx_buffer[0]<<8))-1) < UART_BUFFER_SIZE) { for(int idx=2;idx<((UART_BLE_rx_buffer[1] | (UART_BLE_rx_buffer[0]<<8))-1);idx++) { chksum ^= UART_BLE_rx_buffer[idx]; } if(chksum == UART_BLE_rx_buffer[(UART_BLE_rx_buffer[1] | (UART_BLE_rx_buffer[0]<<8))-1]) result = ON; } return result; } //------------------------------------------------------------------------------------------------- uint8_t isValidCheckSum_WIFI(void) { uint8_t result = OFF; uint8_t chksum = 0x00; if(((UART_WIFI_rx_buffer[1] | (UART_WIFI_rx_buffer[0]<<8))-1) < UART_BUFFER_SIZE) { for(int idx=2;idx<((UART_WIFI_rx_buffer[1] | (UART_WIFI_rx_buffer[0]<<8))-1);idx++) { chksum ^= UART_WIFI_rx_buffer[idx]; } if(chksum == UART_WIFI_rx_buffer[(UART_WIFI_rx_buffer[1] | (UART_WIFI_rx_buffer[0]<<8))-1]) result = ON; } return result; } //------------------------------------------------------------------------------------------------- #ifdef FUNC_DEBUG_MSG_SET_CHARGER_MODE char* getModeName(uint8_t mode); #endif void setChargerMode(uint8_t mode) { #ifdef FUNC_DEBUG_MSG_SET_CHARGER_MODE XP("#SET CHARGER MODE: [%s] >>> [%s]\r\n", getModeName(Charger.Mode_Previous), getModeName(mode)); #endif Charger.Mode_Previous = Charger.Mode; Charger.Mode = mode; } //------------------------------------------------------------------------------------------------- char* getModeName(uint8_t mode) { switch(mode) { case MODE_INITIAL: return "INITIAL"; case MODE_IDLE: return "IDLE"; case MODE_HANDSHAKE: return "HANDSHAKING"; case MODE_CHARGING: return "CHARGING"; case MODE_STOP: return "STOP"; case MODE_ALARM: return "ALARM"; case MODE_MAINTAIN: return "MAINTAIN"; case MODE_DEBUG: return "DEBUG"; default: return "UNKNOW"; } } //------------------------------------------------------------------------------------------------- uint8_t isModeChange(void) { uint8_t result = NO; if(!isMode(Charger.Mode_Previous)) { DEBUG_INFO("#MODE from %s to %s\r\n", getModeName(Charger.Mode_Previous), getModeName(Charger.Mode)); result |= YES; if(Charger.Mode == MODE_ALARM) { Charger.Mode_Before_Alarm = Charger.Mode_Previous; } Charger.Mode_Previous = Charger.Mode; } return result; } //------------------------------------------------------------------------------------------------- uint8_t isMode(uint8_t mode) { return ((Charger.Mode == mode)? YES : NO); } //------------------------------------------------------------------------------------------------- uint8_t rfidCheckSumCal(uint8_t *data, uint8_t length) { uint8_t result= 0x00; for(uint8_t idx=0;idx2000) { //result = FAIL; if(retry_cnt < 1 ) { HAL_Delay(270); HAL_GPIO_WritePin(OUT_Leak_Test_GPIO_Port , OUT_Leak_Test_Pin , GPIO_PIN_RESET); HAL_Delay(50); //40ms~1.2sec HAL_GPIO_WritePin(OUT_Leak_Test_GPIO_Port , OUT_Leak_Test_Pin , GPIO_PIN_SET); //HAL_Delay(40); //36ms retry_cnt ++ ; time_out_count = 0 ; } else { DEBUG_INFO("Leak module self test Fail in timeout.\r\n"); result = FAIL; break; } } else { time_out_count++; HAL_Delay(1); } } } } else // Charger.CCID_Module_Type is CCID_MODULE_CORMEX { SPWM_Switch(ON); HAL_Delay(1000); XP("#[SPWM] adc_value.ADC2_IN6_GF.value = %d\r\n",adc_value.ADC2_IN6_GF.value); if ((adc_value.ADC2_IN6_GF.value<3000)&&(adc_value.ADC2_IN6_GF.value>2000)) //25mA { DEBUG_INFO("#Test_LeakModule(): OK\r\n"); result = PASS ; } else { DEBUG_INFO("Test_LeakModule(): [NG]\r\n"); //DEBUG_INFO("adc_value.ADC2_IN6_GF.value = %d\n\r",adc_value.ADC2_IN6_GF.value); result = FAIL; } SPWM_Switch(OFF); } #endif //CCID_PROTECT return result; } //------------------------------------------------------------------------------------------------- uint8_t Valid_RFID_SN(void) { /* TODO: Validation logic check */ uint8_t result = FAIL; uint32_t crc_result; uint8_t sn_len; uint8_t *buf; if(Charger.rfid.snType == RFID_SN_TYPE_4BYTE) { // SN length: 4 sn_len = 4; } else if(Charger.rfid.snType == RFID_SN_TYPE_7BYTE) { // SN length: 7 sn_len = 7; } else { // SN length: 10 sn_len = 10; } buf = malloc(25 + sn_len); memcpy(buf, Charger.memory.EVSE_Config.data.item.System_ID, 25); memcpy(&buf[25], Charger.rfid.data_Sn, sn_len); crc_result = crc32(buf, 25 + sn_len); if(((Charger.rfid.data_Block[0] << 8) | (Charger.rfid.data_Block[1] << 0) | (Charger.rfid.data_Block[2] << 24) | (Charger.rfid.data_Block[3] << 16)) == ~crc_result) { result = PASS; } free(buf); return result; } //------------------------------------------------------------------------------------------------- void recordAlarmHis(void) { uint8_t isSuccess = FAIL; // Check record alarm request, if alarm code bit different with previous for(uint8_t errIdx=0;errIdx<32;errIdx++) { if(((Charger.Alarm_Code>>errIdx)&0x01) != ((Charger.Alarm_Code_Previous>>errIdx)&0x01)) { // Find empty memory space for(uint16_t idx=0;idx<(W25Q16FV_BLOCK_SIZE>>4);idx++) { if((Charger.memory.hisAlarm.data.item[idx].alarmCode == 0xffffffff) && (Charger.memory.hisAlarm.data.item[idx].mode == 0xff)) { isSuccess = PASS; Charger.memory.hisAlarm.data.item[idx].DateTime.year = Charger.memory.EVSE_Config.data.item.SystemDateTime.year; Charger.memory.hisAlarm.data.item[idx].DateTime.month = Charger.memory.EVSE_Config.data.item.SystemDateTime.month; Charger.memory.hisAlarm.data.item[idx].DateTime.day = Charger.memory.EVSE_Config.data.item.SystemDateTime.day; Charger.memory.hisAlarm.data.item[idx].DateTime.hour = Charger.memory.EVSE_Config.data.item.SystemDateTime.hour; Charger.memory.hisAlarm.data.item[idx].DateTime.min = Charger.memory.EVSE_Config.data.item.SystemDateTime.min; Charger.memory.hisAlarm.data.item[idx].DateTime.sec = Charger.memory.EVSE_Config.data.item.SystemDateTime.sec; Charger.memory.hisAlarm.data.item[idx].mode = Charger.Mode; if((Charger.Alarm_Code>>errIdx)&0x01) { // Record alarm occur Charger.memory.hisAlarm.data.item[idx].alarmCode = alarm_record_code[errIdx]; Charger.memory.hisAlarm.data.item[idx].isRecover = OFF; Charger.Alarm_Code_Previous |= (0x00000001<>4)-1)) { osDelay(500); Charger.memory.hisAlarm.op_bits.backup = ON; osDelay(500); } break; } } // If there is not any free space if(!isSuccess) { osDelay(500); Charger.memory.hisAlarm.op_bits.backup = ON; osDelay(500); } } } } //------------------------------------------------------------------------------------------------- #ifdef FUNC_METER_IC_HISTORY uint8_t recordMeterICHis(MeterIC_CaliValType Type, int32_t Val) { uint8_t isSuccess = FAIL; { for(uint16_t idx=0;idx>6);idx++) { if((Charger.memory.hisCharging.data.item[idx].Duration == 0xffffffff) && (Charger.memory.hisCharging.data.item[idx].powerSum == 0xffff) && (Charger.memory.hisCharging.data.item[idx].stopStatusCode == 0xffffffff) ) { isSuccess = PASS; Charger.memory.hisCharging.data.item[idx].DateTime.year = Charger.memory.coldLoadPickUp.data.item.DateTime.year; Charger.memory.hisCharging.data.item[idx].DateTime.month = Charger.memory.coldLoadPickUp.data.item.DateTime.month; Charger.memory.hisCharging.data.item[idx].DateTime.day = Charger.memory.coldLoadPickUp.data.item.DateTime.day; Charger.memory.hisCharging.data.item[idx].DateTime.hour = Charger.memory.coldLoadPickUp.data.item.DateTime.hour; Charger.memory.hisCharging.data.item[idx].DateTime.min = Charger.memory.coldLoadPickUp.data.item.DateTime.min; Charger.memory.hisCharging.data.item[idx].DateTime.sec = Charger.memory.coldLoadPickUp.data.item.DateTime.sec; Charger.memory.hisCharging.data.item[idx].Duration = Charger.memory.coldLoadPickUp.data.item.Duration; sprintf(Charger.memory.hisCharging.data.item[idx].PlugType, EVSE_CONNECTOR_TYPE); Charger.memory.hisCharging.data.item[idx].powerSum = Charger.memory.coldLoadPickUp.data.item.powerSum; Charger.memory.hisCharging.data.item[idx].startType = Charger.memory.coldLoadPickUp.data.item.startType; Charger.memory.hisCharging.data.item[idx].stopStatusCode = statusCode; memcpy(Charger.memory.hisCharging.data.item[idx].user, Charger.rfid.currentCard, 16); Charger.memory.hisCharging.op_bits.update = ON; // If speace is last item, move data to backup area //if(idx == ((W25Q16FV_BLOCK_SIZE>>4)-1)) //NG if(idx == ((W25Q16FV_BLOCK_SIZE>>6)-1)) { osDelay(500); Charger.memory.hisCharging.op_bits.backup = ON; } break; } } } else { for(uint16_t idx=0;idx<(W25Q16FV_BLOCK_SIZE>>6);idx++) { if((Charger.memory.hisCharging.data.item[idx].Duration == 0xffffffff) && (Charger.memory.hisCharging.data.item[idx].powerSum == 0xffff) && (Charger.memory.hisCharging.data.item[idx].stopStatusCode == 0xffffffff) ) { isSuccess = PASS; Charger.memory.hisCharging.data.item[idx].DateTime.year = Charger.cycle_info.startDateTime.year; Charger.memory.hisCharging.data.item[idx].DateTime.month = Charger.cycle_info.startDateTime.month; Charger.memory.hisCharging.data.item[idx].DateTime.day = Charger.cycle_info.startDateTime.day; Charger.memory.hisCharging.data.item[idx].DateTime.hour = Charger.cycle_info.startDateTime.hour; Charger.memory.hisCharging.data.item[idx].DateTime.min = Charger.cycle_info.startDateTime.min; Charger.memory.hisCharging.data.item[idx].DateTime.sec = Charger.cycle_info.startDateTime.sec; Charger.memory.hisCharging.data.item[idx].Duration = Charger.cycle_info.Duration; sprintf(Charger.memory.hisCharging.data.item[idx].PlugType, EVSE_CONNECTOR_TYPE); Charger.memory.hisCharging.data.item[idx].powerSum = Charger.cycle_info.Power_Consumption; Charger.memory.hisCharging.data.item[idx].startType = Charger.cycle_info.StartType; Charger.memory.hisCharging.data.item[idx].stopStatusCode = statusCode; memcpy(Charger.memory.hisCharging.data.item[idx].user, Charger.rfid.currentCard, 16); Charger.memory.hisCharging.op_bits.update = ON; // If speace is last item, move data to backup area //if(idx == ((W25Q16FV_BLOCK_SIZE>>4)-1)) //NG if(idx == ((W25Q16FV_BLOCK_SIZE>>6)-1)) { osDelay(500); Charger.memory.hisCharging.op_bits.backup = ON; } break; } } } // If there is not any free space if(!isSuccess) { osDelay(500); Charger.memory.hisCharging.op_bits.backup = ON; } return isSuccess; } #endif //FUNC_METER_IC_HISTORY //------------------------------------------------------------------------------------------------- void setLedMotion(uint8_t action) {//ssetled //standard #ifdef TEST_FOR_ENERGY_STAR if (action == LED_ACTION_IDLE_BACKEND_CONNECTED_SLEEP || action == LED_ACTION_IDLE_BACKEND_DISCONNECTED_SLEEP ) { #ifdef FUNC_AW48_NO_SLEEP_MODE_LED if (Charger.m_bModelNameAW48_1P) { Charger.m_bLedSleepModeForceMinBrightness = 0; } else { Charger.m_bLedSleepModeForceMinBrightness = 1; } #else Charger.m_bLedSleepModeForceMinBrightness = 1; #endif } else { Charger.m_bLedSleepModeForceMinBrightness = 0; } #endif switch(action) { case LED_ACTION_INIT: Charger.led_R.motion = LED_MOTION_ON; Charger.led_G.motion = LED_MOTION_ON; Charger.led_B.motion = LED_MOTION_ON; Charger.led_W.motion = LED_MOTION_OFF; LedOnRGBSet(1000, 1000, 1000, 0); break; case LED_ACTION_IDLE: Charger.led_R.motion = LED_MOTION_OFF; Charger.led_G.motion = LED_MOTION_ON; Charger.led_B.motion = LED_MOTION_OFF; Charger.led_W.motion = LED_MOTION_OFF; LedOnRGBSet(0, 1000, 0, 0); break; #ifdef MODIFY_LED_STATUS_202108 case LED_ACTION_IDLE_BACKEND_CONNECTED: Charger.led_R.motion = LED_MOTION_OFF; Charger.led_G.motion = LED_MOTION_ON; Charger.led_B.motion = LED_MOTION_OFF; Charger.led_W.motion = LED_MOTION_OFF; LedOnRGBSet(0, 1000, 0, 0); break; case LED_ACTION_IDLE_BACKEND_CONNECTED_SLEEP: #ifdef MODIFY_AW48_LED_NOT_USE_YELLOW_AND_BREATHE if (Charger.m_bModelNameAW48_1P) { Charger.led_R.motion = LED_MOTION_OFF; Charger.led_G.motion = LED_MOTION_ON; Charger.led_B.motion = LED_MOTION_OFF; Charger.led_W.motion = LED_MOTION_OFF; LedOnRGBSet(0, 1000, 0, 0); } else { Charger.led_R.motion = LED_MOTION_OFF; Charger.led_G.motion = LED_MOTION_BREATHE; Charger.led_B.motion = LED_MOTION_OFF; Charger.led_W.motion = LED_MOTION_OFF; LedOnRGBSet(0, 1000, 0, 0); #ifdef MODIFY_BREATHE_LED breatheTimeSet(BREATHE_LED_UP_SPEED, BREATHE_LED_DN_SPEED, 0, 1000, 0, 0 ); #endif } #else //MODIFY_AW48_LED_NOT_USE_YELLOW_AND_BREATHE Charger.led_R.motion = LED_MOTION_OFF; Charger.led_G.motion = LED_MOTION_BREATHE; Charger.led_B.motion = LED_MOTION_OFF; Charger.led_W.motion = LED_MOTION_OFF; LedOnRGBSet(0, 1000, 0, 0); #ifdef MODIFY_BREATHE_LED breatheTimeSet(BREATHE_LED_UP_SPEED, BREATHE_LED_DN_SPEED, 0, 1000, 0, 0 ); #endif #endif //MODIFY_AW48_LED_NOT_USE_YELLOW_AND_BREATHE break; case LED_ACTION_IDLE_BACKEND_DISCONNECTED: #ifdef MODIFY_AW48_LED_NOT_USE_YELLOW_AND_BREATHE if (Charger.m_bModelNameAW48_1P) { Charger.led_R.motion = LED_MOTION_OFF; Charger.led_G.motion = LED_MOTION_ON; Charger.led_B.motion = LED_MOTION_OFF; Charger.led_W.motion = LED_MOTION_OFF; LedOnRGBSet(0, 1000, 0, 0); } else { Charger.led_R.motion = LED_MOTION_ON; Charger.led_G.motion = LED_MOTION_ON; Charger.led_B.motion = LED_MOTION_OFF; Charger.led_W.motion = LED_MOTION_OFF; #ifdef MODIFY_LED_YELLOW_PARAMETER LedOnRGBSet(LED_YELLOW_R_VAL, LED_YELLOW_G_VAL, 0, 0); #else LedOnRGBSet(1000, 1000, 0, 0); #endif } #else //MODIFY_AW48_LED_NOT_USE_YELLOW_AND_BREATHE Charger.led_R.motion = LED_MOTION_ON; Charger.led_G.motion = LED_MOTION_ON; Charger.led_B.motion = LED_MOTION_OFF; Charger.led_W.motion = LED_MOTION_OFF; #ifdef MODIFY_LED_YELLOW_PARAMETER LedOnRGBSet(LED_YELLOW_R_VAL, LED_YELLOW_G_VAL, 0, 0); #else LedOnRGBSet(1000, 1000, 0, 0); #endif #endif //MODIFY_AW48_LED_NOT_USE_YELLOW_AND_BREATHE break; case LED_ACTION_IDLE_BACKEND_DISCONNECTED_SLEEP: #ifdef MODIFY_AW48_LED_NOT_USE_YELLOW_AND_BREATHE if (Charger.m_bModelNameAW48_1P) { Charger.led_R.motion = LED_MOTION_OFF; Charger.led_G.motion = LED_MOTION_ON; Charger.led_B.motion = LED_MOTION_OFF; Charger.led_W.motion = LED_MOTION_OFF; LedOnRGBSet(0, 1000, 0, 0); } else { Charger.led_R.motion = LED_MOTION_BREATHE; Charger.led_G.motion = LED_MOTION_BREATHE; Charger.led_B.motion = LED_MOTION_OFF; Charger.led_W.motion = LED_MOTION_OFF; #ifdef MODIFY_LED_YELLOW_PARAMETER LedOnRGBSet(LED_YELLOW_R_VAL, LED_YELLOW_G_VAL, 0, 0); #ifdef MODIFY_BREATHE_LED breatheTimeSet(BREATHE_LED_UP_SPEED, BREATHE_LED_DN_SPEED, LED_YELLOW_R_VAL, LED_YELLOW_G_VAL, 0, 0 ); #endif #else //MODIFY_LED_YELLOW_PARAMETER LedOnRGBSet(1000, 1000, 0, 0); #endif //MODIFY_LED_YELLOW_PARAMETER } #else //MODIFY_AW48_LED_NOT_USE_YELLOW_AND_BREATHE Charger.led_R.motion = LED_MOTION_BREATHE; Charger.led_G.motion = LED_MOTION_BREATHE; Charger.led_B.motion = LED_MOTION_OFF; Charger.led_W.motion = LED_MOTION_OFF; #ifdef MODIFY_LED_YELLOW_PARAMETER LedOnRGBSet(LED_YELLOW_R_VAL, LED_YELLOW_G_VAL, 0, 0); #ifdef MODIFY_BREATHE_LED breatheTimeSet(BREATHE_LED_UP_SPEED, BREATHE_LED_DN_SPEED, LED_YELLOW_R_VAL, LED_YELLOW_G_VAL, 0, 0 ); #endif #else //MODIFY_LED_YELLOW_PARAMETER LedOnRGBSet(1000, 1000, 0, 0); #endif //MODIFY_LED_YELLOW_PARAMETER #endif //MODIFY_AW48_LED_NOT_USE_YELLOW_AND_BREATHE break; case LED_ACTION_RESERVATION_MODE: Charger.led_R.motion = LED_MOTION_OFF; Charger.led_G.motion = LED_MOTION_BLINK; Charger.led_B.motion = LED_MOTION_OFF; Charger.led_W.motion = LED_MOTION_OFF; LedOnRGBSet(0, 1000, 0, 0); blinkerTimeSet(BLINKER_IDX_LED, 500, 500, 0, 1); break; #endif //MODIFY_LED_STATUS_202108 case LED_ACTION_AUTHED: Charger.led_R.motion = LED_MOTION_OFF; Charger.led_G.motion = LED_MOTION_OFF; Charger.led_B.motion = LED_MOTION_ON; Charger.led_W.motion = LED_MOTION_OFF; LedOnRGBSet(0, 0, 1000, 0); break; case LED_ACTION_CONNECTED: Charger.led_R.motion = LED_MOTION_OFF; Charger.led_G.motion = LED_MOTION_OFF; Charger.led_B.motion = LED_MOTION_ON; Charger.led_W.motion = LED_MOTION_OFF; LedOnRGBSet(0, 0, 1000, 0); break; case LED_ACTION_CHARGING: Charger.led_R.motion = LED_MOTION_OFF; Charger.led_G.motion = LED_MOTION_OFF; Charger.led_B.motion = LED_MOTION_BLINK; Charger.led_W.motion = LED_MOTION_OFF; LedOnRGBSet(0, 0, 1000, 0); blinkerTimeSet(BLINKER_IDX_LED, 500, 500, 0, 1); break; case LED_ACTION_STOP: #ifdef FUNC_MODIFY_AW48_LED_ACTION_TERMINATED_COMPLETE if (Charger.m_bModelNameAW48_1P) { Charger.led_R.motion = LED_MOTION_OFF; Charger.led_G.motion = LED_MOTION_BLINK; Charger.led_B.motion = LED_MOTION_OFF; Charger.led_W.motion = LED_MOTION_OFF; LedOnRGBSet(0, 1000, 0, 0); blinkerTimeSet(BLINKER_IDX_LED, 500, 500, 0, 1); } else { Charger.led_R.motion = LED_MOTION_OFF; Charger.led_G.motion = LED_MOTION_OFF; Charger.led_B.motion = LED_MOTION_ON; Charger.led_W.motion = LED_MOTION_OFF; LedOnRGBSet(0, 0, 1000, 0); } #else Charger.led_R.motion = LED_MOTION_OFF; Charger.led_G.motion = LED_MOTION_OFF; Charger.led_B.motion = LED_MOTION_ON; Charger.led_W.motion = LED_MOTION_OFF; LedOnRGBSet(0, 0, 1000, 0); #endif break; case LED_ACTION_ALARM: Charger.led_R.motion = LED_MOTION_BLINK; Charger.led_G.motion = LED_MOTION_OFF; Charger.led_B.motion = LED_MOTION_OFF; Charger.led_W.motion = LED_MOTION_OFF; LedOnRGBSet(1000, 0, 0, 0); //set alarm led blink duty if(Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_NO_CSU){ Charger.Alarm_LED = Charger.Alarm_Code; }else{ Charger.Alarm_LED = Charger.am3352.LedAlarmState; } if(Charger.Alarm_LED & ALARM_CP_ERROR) blinkerTimeSet(BLINKER_IDX_LED, 500 , 500, 0, 1); if((Charger.Alarm_LED & ALARM_L1_OVER_VOLTAGE) || (Charger.Alarm_LED & ALARM_L2_OVER_VOLTAGE) || (Charger.Alarm_LED & ALARM_L3_OVER_VOLTAGE)) blinkerTimeSet(BLINKER_IDX_LED, 500, 500, 3000, 1); if((Charger.Alarm_LED & ALARM_L1_UNDER_VOLTAGE) || (Charger.Alarm_LED & ALARM_L2_UNDER_VOLTAGE) || (Charger.Alarm_LED & ALARM_L3_UNDER_VOLTAGE)) blinkerTimeSet(BLINKER_IDX_LED, 500, 500, 3000, 2); if((Charger.Alarm_LED & ALARM_L1_OVER_CURRENT) || (Charger.Alarm_LED & ALARM_L2_OVER_CURRENT) || (Charger.Alarm_LED & ALARM_L3_OVER_CURRENT)) blinkerTimeSet(BLINKER_IDX_LED, 500, 500, 3000, 3); if(Charger.Alarm_LED & ALARM_OVER_TEMPERATURE) blinkerTimeSet(BLINKER_IDX_LED, 500, 500, 3000, 4); if(Charger.Alarm_LED & ALARM_CURRENT_LEAK_AC) blinkerTimeSet(BLINKER_IDX_LED, 500, 500, 3000, 5); if(Charger.Alarm_LED & ALARM_CURRENT_LEAK_DC) blinkerTimeSet(BLINKER_IDX_LED, 500, 500, 3000, 5); if(Charger.Alarm_LED & ALARM_GROUND_FAIL) blinkerTimeSet(BLINKER_IDX_LED, 500, 500, 3000, 6); if(Charger.Alarm_LED & ALARM_HANDSHAKE_TIMEOUT) blinkerTimeSet(BLINKER_IDX_LED, 500, 500, 0, 1); if(Charger.Alarm_LED & ALARM_EMERGENCY_STOP) blinkerTimeSet(BLINKER_IDX_LED, 500, 500, 3000, 7); if(Charger.Alarm_LED & ALARM_ROTATORY_SWITCH_FAULT) { #ifdef FUNC_AW48_EXT_LED_BLINK_PERIOD_MORE_THAN_200MS if (Charger.m_bModelNameAW48_1P) { blinkerTimeSet(BLINKER_IDX_LED, AW48_EXTLED_BLINK_PERIOD, AW48_EXTLED_BLINK_PERIOD, 0, 1); } else { blinkerTimeSet(BLINKER_IDX_LED, 200, 200, 0, 1); } #else blinkerTimeSet(BLINKER_IDX_LED, 200, 200, 0, 1); #endif } if(Charger.Alarm_LED & ALARM_METER_TIMEOUT) blinkerTimeSet(BLINKER_IDX_LED, 200, 200, 0, 1); #ifdef MODIFY_LED_ALARM_LATCH //self test error if ((Charger.Alarm_Code & ALARM_MCU_TESTFAIL) || (Charger.Alarm_Code & ALARM_RELAY_STATUS) || (Charger.Alarm_Code & ALARM_RELAY_DRIVE_FUALT ) || (Charger.Alarm_Code & ALARM_LEAK_MODULE_FAIL)) { Charger.led_R.motion = LED_MOTION_ON; Charger.led_G.motion = LED_MOTION_OFF; Charger.led_B.motion = LED_MOTION_OFF; Charger.led_W.motion = LED_MOTION_OFF; LedOnRGBSet(1000, 0, 0, 0); } #else //MODIFY_LED_ALARM_LATCH //OCP Latch if ((Charger.counter.L1_OC.isLatch == ON) || (Charger.counter.L2_OC.isLatch == ON) || (Charger.counter.L3_OC.isLatch == ON)) { Charger.led_R.motion = LED_MOTION_ON ; Charger.led_B.motion = LED_MOTION_ON ; LedOnRGBSet(1000, 0, 1000, 0); } //CCID Latch if (Charger.counter.LEAK.isLatch == ON) { Charger.led_R.motion = LED_MOTION_ON ; Charger.led_G.motion = LED_MOTION_ON ; #ifdef MODIFY_LED_YELLOW_PARAMETER LedOnRGBSet(LED_YELLOW_R_VAL, LED_YELLOW_G_VAL, 0, 0); #else LedOnRGBSet(1000, 1000, 0, 0); #endif } //OTP if (Charger.counter.OT.isLatch == ON) { Charger.led_R.motion = LED_MOTION_ON; Charger.led_G.motion = LED_MOTION_BLINK; Charger.led_B.motion = LED_MOTION_BLINK; Charger.led_W.motion = LED_MOTION_OFF; LedOnRGBSet(1000, 1000, 1000, 0); blinkerTimeSet(BLINKER_IDX_LED, 500 , 500, 0, 1); } //self test error if ((Charger.Alarm_Code & ALARM_MCU_TESTFAIL) || (Charger.Alarm_Code & ALARM_RELAY_STATUS) || (Charger.Alarm_Code & ALARM_RELAY_DRIVE_FUALT ) || (Charger.Alarm_Code & ALARM_LEAK_MODULE_FAIL)) { Charger.led_R.motion = LED_MOTION_ON; Charger.led_G.motion = LED_MOTION_OFF; Charger.led_B.motion = LED_MOTION_OFF; Charger.led_W.motion = LED_MOTION_OFF; LedOnRGBSet(1000, 0, 0, 0); } #endif //MODIFY_LED_ALARM_LATCH break; case LED_ACTION_MAINTAIN: #ifdef MODIFY_AW48_LED_NOT_USE_YELLOW_AND_BREATHE if (Charger.m_bModelNameAW48_1P) { Charger.led_R.motion = LED_MOTION_OFF; Charger.led_G.motion = LED_MOTION_BLINK; Charger.led_B.motion = LED_MOTION_OFF; Charger.led_W.motion = LED_MOTION_OFF; LedOnRGBSet(0, 1000, 0, 0); blinkerTimeSet(BLINKER_IDX_LED, 500, 500, 0, 1); } else { #ifdef MODIFY_LED_STATUS_202108 //Yellow blink Charger.led_R.motion = LED_MOTION_BLINK; Charger.led_G.motion = LED_MOTION_BLINK; Charger.led_B.motion = LED_MOTION_OFF; Charger.led_W.motion = LED_MOTION_OFF; #ifdef MODIFY_LED_YELLOW_PARAMETER LedOnRGBSet(LED_YELLOW_R_VAL, LED_YELLOW_G_VAL, 0, 0); #else LedOnRGBSet(1000, 1000, 0, 0); #endif blinkerTimeSet(BLINKER_IDX_LED, 500, 500, 0, 1); #else Charger.led_R.motion = LED_MOTION_OFF; Charger.led_G.motion = LED_MOTION_BLINK; Charger.led_B.motion = LED_MOTION_OFF; Charger.led_W.motion = LED_MOTION_OFF; LedOnRGBSet(0, 1000, 0, 0); blinkerTimeSet(BLINKER_IDX_LED, 500, 500, 0, 1); #endif } #else //MODIFY_AW48_LED_NOT_USE_YELLOW_AND_BREATHE #ifdef MODIFY_LED_STATUS_202108 //Yellow blink Charger.led_R.motion = LED_MOTION_BLINK; Charger.led_G.motion = LED_MOTION_BLINK; Charger.led_B.motion = LED_MOTION_OFF; Charger.led_W.motion = LED_MOTION_OFF; #ifdef MODIFY_LED_YELLOW_PARAMETER LedOnRGBSet(LED_YELLOW_R_VAL, LED_YELLOW_G_VAL, 0, 0); #else LedOnRGBSet(1000, 1000, 0, 0); #endif blinkerTimeSet(BLINKER_IDX_LED, 500, 500, 0, 1); #else Charger.led_R.motion = LED_MOTION_OFF; Charger.led_G.motion = LED_MOTION_BLINK; Charger.led_B.motion = LED_MOTION_OFF; Charger.led_W.motion = LED_MOTION_OFF; LedOnRGBSet(0, 1000, 0, 0); blinkerTimeSet(BLINKER_IDX_LED, 500, 500, 0, 1); #endif #endif //MODIFY_AW48_LED_NOT_USE_YELLOW_AND_BREATHE break; case LED_ACTION_RFID_PASS: Charger.led_R.motion = LED_MOTION_OFF; Charger.led_G.motion = LED_MOTION_BLINK; Charger.led_B.motion = LED_MOTION_OFF; Charger.led_W.motion = LED_MOTION_OFF; LedOnRGBSet(0, 1000, 0, 0); #ifdef FUNC_AW48_EXT_LED_BLINK_PERIOD_MORE_THAN_200MS if (Charger.m_bModelNameAW48_1P) { blinkerTimeSet(BLINKER_IDX_LED, AW48_EXTLED_BLINK_PERIOD, AW48_EXTLED_BLINK_PERIOD, 0, 1); } else { blinkerTimeSet(BLINKER_IDX_LED, 200, 200, 0, 1); } #else blinkerTimeSet(BLINKER_IDX_LED, 200, 200, 0, 1); #endif break; case LED_ACTION_RFID_FAIL: Charger.led_R.motion = LED_MOTION_BLINK; Charger.led_G.motion = LED_MOTION_OFF; Charger.led_B.motion = LED_MOTION_OFF; Charger.led_W.motion = LED_MOTION_OFF; LedOnRGBSet(1000, 0, 0, 0); #ifdef FUNC_AW48_EXT_LED_BLINK_PERIOD_MORE_THAN_200MS if (Charger.m_bModelNameAW48_1P) { blinkerTimeSet(BLINKER_IDX_LED, AW48_EXTLED_BLINK_PERIOD, AW48_EXTLED_BLINK_PERIOD, 0, 1); } else { blinkerTimeSet(BLINKER_IDX_LED, 200, 200, 0, 1); } #else blinkerTimeSet(BLINKER_IDX_LED, 200, 200, 0, 1); #endif break; case LED_ACTION_DEBUG: Charger.led_R.motion = LED_MOTION_BLINK; Charger.led_G.motion = LED_MOTION_BLINK; Charger.led_B.motion = LED_MOTION_BLINK; Charger.led_W.motion = LED_MOTION_BLINK; LedOnRGBSet(1000, 1000, 1000, 1000); blinkerTimeSet(BLINKER_IDX_LED, 500, 500, 0, 1); break; case LED_ACTION_ALL_OFF: Charger.led_R.motion = LED_MOTION_OFF; Charger.led_G.motion = LED_MOTION_OFF; Charger.led_B.motion = LED_MOTION_OFF; Charger.led_W.motion = LED_MOTION_OFF; LedOnRGBSet(0, 0, 0, 0); break ; case LED_ACTION_HANDSHAKE_FAIL: Charger.led_R.motion = LED_MOTION_BLINK; Charger.led_G.motion = LED_MOTION_OFF; Charger.led_B.motion = LED_MOTION_OFF; Charger.led_W.motion = LED_MOTION_OFF; LedOnRGBSet(1000, 0, 0, 0); blinkerTimeSet(BLINKER_IDX_LED, 500, 500, 0, 1); break; case LED_ACTION_INTERNET_DISCONNECT: #ifdef MODIFY_AW48_LED_NOT_USE_YELLOW_AND_BREATHE if (Charger.m_bModelNameAW48_1P) { Charger.led_R.motion = LED_MOTION_OFF; Charger.led_G.motion = LED_MOTION_ON; Charger.led_B.motion = LED_MOTION_OFF; Charger.led_W.motion = LED_MOTION_OFF; LedOnRGBSet(0, 1000, 0, 0); } else { Charger.led_R.motion = LED_MOTION_ON; Charger.led_G.motion = LED_MOTION_ON; Charger.led_B.motion = LED_MOTION_OFF; Charger.led_W.motion = LED_MOTION_OFF; #ifdef MODIFY_LED_YELLOW_PARAMETER LedOnRGBSet(LED_YELLOW_R_VAL, LED_YELLOW_G_VAL, 0, 0); #else LedOnRGBSet(1000, 1000, 0, 0); #endif } #else //MODIFY_AW48_LED_NOT_USE_YELLOW_AND_BREATHE Charger.led_R.motion = LED_MOTION_ON; Charger.led_G.motion = LED_MOTION_ON; Charger.led_B.motion = LED_MOTION_OFF; Charger.led_W.motion = LED_MOTION_OFF; #ifdef MODIFY_LED_YELLOW_PARAMETER LedOnRGBSet(LED_YELLOW_R_VAL, LED_YELLOW_G_VAL, 0, 0); #else LedOnRGBSet(1000, 1000, 0, 0); #endif #endif //MODIFY_AW48_LED_NOT_USE_YELLOW_AND_BREATHE break; case LED_ACTION_RESTORE_SETTING: Charger.led_R.motion = LED_MOTION_OFF; Charger.led_G.motion = LED_MOTION_OFF; Charger.led_B.motion = LED_MOTION_OFF; Charger.led_W.motion = LED_MOTION_BLINK; LedOnRGBSet(0, 0, 0, 1000); blinkerTimeSet(BLINKER_IDX_LED, 500, 500, 0, 1); break; #ifdef MODIFY_LED_STATUS_202108 #endif //MODIFY_LED_STATUS_202108 default : Charger.led_R.motion = LED_MOTION_OFF; Charger.led_G.motion = LED_MOTION_OFF; Charger.led_B.motion = LED_MOTION_OFF; Charger.led_W.motion = LED_MOTION_OFF; LedOnRGBSet(0, 0, 0, 0); break; } if((action != LED_ACTION_RFID_PASS) && (action != LED_ACTION_RFID_FAIL) && (action != LED_ACTION_BLE_CONNECT) && (action != LED_ACTION_BLE_DISABLE) && (action != LED_ACTION_HANDSHAKE_FAIL) && (action != LED_ACTION_RESTORE_SETTING)) { Charger.Led_Mode = action; } } //------------------------------------------------------------------------------------------------- #ifdef FUNC_CUSTOMIZED_LED_MODE_FROM_CSU void setLedMotion_User(uint8_t action, PLED_UserCfg p) { if (action != LED_ACTION_CUSTOMIZED_MODE || p == NULL) return; //Check data Charger.m_bLedSleepModeForceMinBrightness = 0; const u16 RGBMAX = 1000; if (p->m_R > RGBMAX) p->m_R = RGBMAX; if (p->m_G > RGBMAX) p->m_G = RGBMAX; if (p->m_B > RGBMAX) p->m_B = RGBMAX; if (p->m_Mode == LED_USER_MODE_SOLID) { Charger.led_R.motion = (p->m_R > 0 ? LED_MOTION_ON : LED_MOTION_OFF); Charger.led_G.motion = (p->m_G > 0 ? LED_MOTION_ON : LED_MOTION_OFF); Charger.led_B.motion = (p->m_B > 0 ? LED_MOTION_ON : LED_MOTION_OFF); Charger.led_W.motion = LED_MOTION_OFF; LedOnRGBSet(p->m_R, p->m_G, p->m_B, 0); } else if (p->m_Mode == LED_USER_MODE_BLINK) { Charger.led_R.motion = (p->m_R > 0 ? LED_MOTION_BLINK : LED_MOTION_OFF); Charger.led_G.motion = (p->m_G > 0 ? LED_MOTION_BLINK : LED_MOTION_OFF); Charger.led_B.motion = (p->m_B > 0 ? LED_MOTION_BLINK : LED_MOTION_OFF); Charger.led_W.motion = LED_MOTION_OFF; LedOnRGBSet(p->m_R, p->m_G, p->m_B, 0); if (p->Blink.m_Count > HTK_U8_MAX) p->Blink.m_Count = HTK_U8_MAX; blinkerTimeSet(BLINKER_IDX_LED, p->Blink.m_On_ms, p->Blink.m_Off_ms, p->Blink.m_Rest_ms, p->Blink.m_Count); } else if (p->m_Mode == LED_USER_MODE_BREATH) { Charger.led_R.motion = (p->m_R > 0 ? LED_MOTION_BREATHE : LED_MOTION_OFF); Charger.led_G.motion = (p->m_G > 0 ? LED_MOTION_BREATHE : LED_MOTION_OFF); Charger.led_B.motion = (p->m_B > 0 ? LED_MOTION_BREATHE : LED_MOTION_OFF); Charger.led_W.motion = LED_MOTION_OFF; LedOnRGBSet(p->m_R, p->m_G, p->m_B, 0); breatheTimeSet(p->Breath.m_Up_ms, p->Breath.m_Down_ms, p->m_R, p->m_G, p->m_B, 0); } else { } if (p->m_AutoRepeat) Charger.Led_Mode = action; } #endif //FUNC_CUSTOMIZED_LED_MODE_FROM_CSU //------------------------------------------------------------------------------------------------- #ifdef FUNC_AW48_NET_LED void setNetLedMotion(uint8_t action) { switch(action) { case NET_LED_ACTION_LTE_CONNECTING: Charger.LedNet_G.motion = LED_MOTION_BLINK; Charger.LedNet_B.motion = LED_MOTION_OFF; blinkerTimeSet(BLINKER_IDX_LED_NET, 200, 800, 0, 1); break; case NET_LED_ACTION_LTE_CONNECTED: Charger.LedNet_G.motion = LED_MOTION_ON; Charger.LedNet_B.motion = LED_MOTION_OFF; break; case NET_LED_ACTION_WIFI_CONNECTING: Charger.LedNet_G.motion = LED_MOTION_OFF; Charger.LedNet_B.motion = LED_MOTION_BLINK; blinkerTimeSet(BLINKER_IDX_LED_NET, 200, 800, 0, 1); break; case NET_LED_ACTION_WIFT_CONNECTED: Charger.LedNet_G.motion = LED_MOTION_OFF; Charger.LedNet_B.motion = LED_MOTION_ON; break; case NET_LED_ACTION_ETHERNET_CONNECTING: Charger.LedNet_G.motion = LED_MOTION_OFF; Charger.LedNet_B.motion = LED_MOTION_BLINK; blinkerTimeSet(BLINKER_IDX_LED_NET, 200, 800, 0, 1); break; case NET_LED_ACTION_ETHERNET_CONNECTED: Charger.LedNet_G.motion = LED_MOTION_OFF; Charger.LedNet_B.motion = LED_MOTION_ON; break; case NET_LED_ACTION_ALL_CONNECTING: Charger.am3352.NetLedActionSubState = NET_LED_ACTION_ETHERNET_CONNECTING_H; break; case NET_LED_ACTION_OFF: Charger.LedNet_G.motion = LED_MOTION_OFF; Charger.LedNet_B.motion = LED_MOTION_OFF; break; //(HIDE for NET_LED_ACTION_ALL_CONNECTING) --------------- case NET_LED_ACTION_LTE_CONNECTING_H: Charger.LedNet_G.motion = LED_MOTION_BLINK; Charger.LedNet_B.motion = LED_MOTION_OFF; blinkerTimeSet(BLINKER_IDX_LED_NET, 200, 800, 3000, 3); break; case NET_LED_ACTION_WIFI_CONNECTING_H: Charger.LedNet_G.motion = LED_MOTION_OFF; Charger.LedNet_B.motion = LED_MOTION_BLINK; blinkerTimeSet(BLINKER_IDX_LED_NET, 200, 800, 3000, 3); break; case NET_LED_ACTION_ETHERNET_CONNECTING_H: Charger.LedNet_G.motion = LED_MOTION_OFF; Charger.LedNet_B.motion = LED_MOTION_BLINK; blinkerTimeSet(BLINKER_IDX_LED_NET, 200, 800, 3000, 3); break; //--------------------------------------------------------- default: Charger.LedNet_G.motion = LED_MOTION_OFF; Charger.LedNet_B.motion = LED_MOTION_OFF; break; } } #endif //FUNC_AW48_NET_LED //------------------------------------------------------------------------------------------------- void HAL_ADC_LevelOutOfWindowCallback(ADC_HandleTypeDef* hadc) { #ifdef CCID_PROTECT if (Charger.CCID_Module_Type == CCID_MODULE_CORMEX) { if(hadc->Instance == ADC2) //use watch dog to check ccid level { if (!Charger.isTestLeakModule) { if(Charger.counter.WatchDogLeak >= 5) { if(!(Charger.Alarm_Code & ALARM_CURRENT_LEAK_AC)) { DEBUG_INFO("leak adc watch happen\r\n"); Charger.counter.LEAK.isOccurInCharging = (((Charger.Mode == MODE_CHARGING) || (Charger.Mode == MODE_STOP))?ON:OFF); Charger.Alarm_Code |= ALARM_CURRENT_LEAK_AC; timerEnable(TIMER_IDX_RETRY_LEAK_AC, ALARM_RETRY_INTERVAL_LEAK); Charger.counter.LEAK.retry++ ; Charger.Relay_Action = GPIO_RELAY_ACTION_OFF ; RELAY1_SET_DRIV(0); RELAY1_SET_HOLD(0); RELAY2_SET_DRIV(0); RELAY2_SET_HOLD(0); Charger.counter.WatchDogLeak = 0 ; } } else { Charger.counter.WatchDogLeak ++ ; } } } } #endif //CCID_PROTECT } //------------------------------------------------------------------------------------------------- void vApplicationStackOverflowHook( TaskHandle_t xTask, signed char *pcTaskName ) { DEBUG_ERROR("Stack overflow: %s\r\n", pcTaskName); osDelay(500); } //------------------------------------------------------------------------------------------------- void getlastRecord(void) { #ifdef FUNC_METER_IC_HISTORY for(uint16_t idx=0;idx>4);idx++) //NG for(uint16_t idx=0;idx<(W25Q16FV_BLOCK_SIZE>>6);idx++) { if((Charger.memory.hisCharging.data.item[idx].Duration == 0xffffffff) && (Charger.memory.hisCharging.data.item[idx].powerSum == 0xffff) && (Charger.memory.hisCharging.data.item[idx].stopStatusCode == 0xffffffff) ) { DEBUG_INFO("Charging record last index: %d\r\n", (idx)); break; } } #endif //FUNC_METER_IC_HISTORY //for(uint16_t idx=0;idx<(W25Q16FV_BLOCK_SIZE>>6);idx++) //NG for(uint16_t idx=0;idx<(W25Q16FV_BLOCK_SIZE>>4);idx++) { if((Charger.memory.hisAlarm.data.item[idx].alarmCode == 0xffffffff) && (Charger.memory.hisAlarm.data.item[idx].mode == 0xff)) { DEBUG_INFO("Alarm record last index: %d\r\n", (idx)); break; } } } //------------------------------------------------------------------------------------------------- #ifdef FUNC_ROTARY_CURR_MAP typedef struct _RotaryCurrItem { uint8_t m_nCurr; //(A) uint8_t m_bTestMode: 1; uint8_t m_bInvalidItem: 1; uint8_t m_bSlaveMode: 1; } RotaryCurrItem, *PRotaryCurrItem; #define ROTARY_CURR_ITEM_NUM (16) #define AX48_DEF_CURR (48) #define AX32_DEF_CURR (32) #ifdef FUNC_AX80 #define AX80_DEF_CURR (80) #endif #ifdef FUNC_AT32 #define AT32_DEF_CURR (32) #endif #ifdef FUNC_AW48 #define AW48_DEF_CURR (48) #endif const RotaryCurrItem RotaryCurrMap_AX48[ROTARY_CURR_ITEM_NUM] = { { AX48_DEF_CURR, 1, 0, 0 }, //0: Test Mode ************ { 6, 0, 0, 0 }, //1: 6A 10% { 8, 0, 0, 0 }, //2: 8A 13.33% { 10, 0, 0, 0 }, //3: 10A 16.67% { 13, 0, 0, 0 }, //4: 13A 21.67% { 16, 0, 0, 0 }, //5: 16A 26.67% { 20, 0, 0, 0 }, //6: 20A 33.33% { 25, 0, 0, 0 }, //7: 25A 41.67% { 30, 0, 0, 0 }, //8: 30A 50.00% { 32, 0, 0, 0 }, //9: 32A 53.33% { 40, 0, 0, 0 }, //A: 40A 66.67% { AX48_DEF_CURR, 0, 0, 0 }, //B: 48A 80.00% (DEFAULT) { AX48_DEF_CURR, 0, 1, 0 }, //C: Reserved ************* (Invalid) { AX48_DEF_CURR, 0, 1, 0 }, //D: Reserved ************* (Invalid) { 80, 0, 1, 0 }, //E: 80A 96.00% ????? (Invalid) { AX48_DEF_CURR, 0, 0, 1 }, //F: Slave Mode *********** }; #ifdef MODIFY_AX32_ROTATE_SWITCH_TABLE_20210915 const RotaryCurrItem RotaryCurrMap_AX32[ROTARY_CURR_ITEM_NUM] = { { AX32_DEF_CURR, 1, 0, 0 }, //0: Test Mode ************ { 6, 0, 0, 0 }, //1: 6A 10% { 8, 0, 0, 0 }, //2: 8A 13.33% { 10, 0, 0, 0 }, //3: 10A 16.67% { 13, 0, 0, 0 }, //4: 13A 21.67% { 16, 0, 0, 0 }, //5: 16A 26.67% { 20, 0, 0, 0 }, //6: 20A 33.33% { 25, 0, 0, 0 }, //7: 25A 41.67% { 30, 0, 0, 0 }, //8: 30A 50.00% { AX32_DEF_CURR, 0, 0, 0 }, //9: 32A 53.33% (DEFAULT) { AX32_DEF_CURR, 0, 1, 0 }, //A: 40A 66.67% (Invalid) { AX32_DEF_CURR, 0, 1, 0 }, //B: 48A 80.00% (Invalid) { AX32_DEF_CURR, 0, 1, 0 }, //C: Reserved ************* (Invalid) { AX32_DEF_CURR, 0, 1, 0 }, //D: Reserved ************* (Invalid) { 80, 0, 1, 0 }, //E: 80A 96.00% ????? (Invalid) { AX32_DEF_CURR, 0, 0, 1 }, //F: Slave Mode *********** }; #else // Old procedure (Deleted) #endif //MODIFY_AX32_ROTATE_SWITCH_TABLE_20210915 #ifdef FUNC_AT32 const RotaryCurrItem RotaryCurrMap_AT32[ROTARY_CURR_ITEM_NUM] = { { AT32_DEF_CURR, 1, 0, 0 }, //0: Test Mode ************ { 6, 0, 0, 0 }, //1: 6A 10% { 8, 0, 0, 0 }, //2: 8A 13.33% { 10, 0, 0, 0 }, //3: 10A 16.67% { 13, 0, 0, 0 }, //4: 13A 21.67% { 16, 0, 0, 0 }, //5: 16A 26.67% { 20, 0, 0, 0 }, //6: 20A 33.33% { 25, 0, 0, 0 }, //7: 25A 41.67% { 30, 0, 0, 0 }, //8: 30A 50.00% { AT32_DEF_CURR, 0, 0, 0 }, //9: 32A 53.33% (DEFAULT) { AT32_DEF_CURR, 0, 1, 0 }, //A: 40A 66.67% (Invalid) { AT32_DEF_CURR, 0, 1, 0 }, //B: 48A 80.00% (Invalid) { AT32_DEF_CURR, 0, 1, 0 }, //C: Reserved ************* (Invalid) { AT32_DEF_CURR, 0, 1, 0 }, //D: Reserved ************* (Invalid) { 80, 0, 1, 0 }, //E: 80A 96.00% ????? (Invalid) { AT32_DEF_CURR, 0, 0, 1 }, //F: Slave Mode *********** }; #endif //FUNC_AT32 #ifdef FUNC_AX80 const RotaryCurrItem RotaryCurrMap_AX80[ROTARY_CURR_ITEM_NUM] = { { AX80_DEF_CURR, 1, 0, 0 }, //0: Test Mode ************ { 6, 0, 0, 0 }, //1: 6A 10% { 8, 0, 0, 0 }, //2: 8A 13.33% { 10, 0, 0, 0 }, //3: 10A 16.67% { 13, 0, 0, 0 }, //4: 13A 21.67% { 16, 0, 0, 0 }, //5: 16A 26.67% { 20, 0, 0, 0 }, //6: 20A 33.33% { 25, 0, 0, 0 }, //7: 25A 41.67% { 30, 0, 0, 0 }, //8: 30A 50.00% { 32, 0, 0, 0 }, //9: 32A 53.33% { 40, 0, 0, 0 }, //A: 40A 66.67% { 48, 0, 0, 0 }, //B: 48A 80.00% { AX80_DEF_CURR, 0, 1, 0 }, //C: Reserved ************* (Invalid) { AX80_DEF_CURR, 0, 1, 0 }, //D: Reserved ************* (Invalid) { AX80_DEF_CURR, 0, 0, 0 }, //E: 80A 96.00% (DEFAULT) { AX80_DEF_CURR, 0, 0, 1 }, //F: Slave Mode *********** }; #endif //FUNC_AX80 #ifdef FUNC_AW48 const RotaryCurrItem RotaryCurrMap_AW48[ROTARY_CURR_ITEM_NUM] = { { AW48_DEF_CURR, 1, 0, 0 }, //0: X Test Mode ************ (Invalid) { 12, 0, 0, 0 }, //1: 12A 20.00% { 16, 0, 0, 0 }, //2: 16A 26.67% { 24, 0, 0, 0 }, //3: 24A 40.00% { 32, 0, 0, 0 }, //4: 32A 53.33% { 40, 0, 0, 0 }, //5: 40A 66.67% { AW48_DEF_CURR, 0, 0, 0 }, //6: 48A 80.00% (DEFAULT) { AW48_DEF_CURR, 0, 1, 0 }, //7: Reserved ************* (Invalid) { AW48_DEF_CURR, 0, 1, 0 }, //8: Reserved ************* (Invalid) { AW48_DEF_CURR, 0, 1, 0 }, //9: Reserved ************* (Invalid) { AW48_DEF_CURR, 0, 1, 0 }, //A: Reserved ************* (Invalid) { AW48_DEF_CURR, 0, 1, 0 }, //B: Reserved ************* (Invalid) { AW48_DEF_CURR, 0, 1, 0 }, //C: Reserved ************* (Invalid) { AW48_DEF_CURR, 0, 1, 0 }, //D: Reserved ************* (Invalid) { AW48_DEF_CURR, 0, 1, 0 }, //E: Reserved ************* (Invalid) { AW48_DEF_CURR, 0, 1, 0 }, //F: X Slave Mode *********** (Invalid) }; #endif //FUNC_AW48 #endif //FUNC_ROTARY_CURR_MAP void getRotarySwitchSetting(void) { uint8_t tmpBuf = 0; #ifdef ROTATE_SWITCH_HARDCODE tmpBuf = HC_ROTARY_SWITCH_SET_VAL; #else tmpBuf += (HAL_GPIO_ReadPin(IN_AC_Current_Set1_GPIO_Port, IN_AC_Current_Set1_Pin)?0:1)<<0; tmpBuf += (HAL_GPIO_ReadPin(IN_AC_Current_Set2_GPIO_Port, IN_AC_Current_Set2_Pin)?0:1)<<1; tmpBuf += (HAL_GPIO_ReadPin(IN_AC_Current_Set3_GPIO_Port, IN_AC_Current_Set3_Pin)?0:1)<<2; tmpBuf += (HAL_GPIO_ReadPin(IN_AC_Current_Set4_GPIO_Port, IN_AC_Current_Set4_Pin)?0:1)<<3; #endif //ROTATE_SWITCH_HARDCODE #ifdef FUNC_ROTARY_CURR_MAP #ifdef FUNC_AX80 RotaryCurrItem const *p = NULL; if (Charger.m_bModelNameAX80_1P) { p = &RotaryCurrMap_AX80[tmpBuf]; } else if (Charger.m_bModelNameAX48_1P) { p = &RotaryCurrMap_AX48[tmpBuf]; } else if (Charger.m_bModelNameAX32_3P || Charger.m_bModelNameDC) { p = &RotaryCurrMap_AX32[tmpBuf]; } #ifdef FUNC_AT32 else if (Charger.m_bModelNameAT32_3P) { p = &RotaryCurrMap_AT32[tmpBuf]; } #endif #ifdef FUNC_AW48 else if (Charger.m_bModelNameAW48_1P) { p = &RotaryCurrMap_AW48[tmpBuf]; } #endif else { p = &RotaryCurrMap_AX48[tmpBuf]; } #else RotaryCurrItem const *p = (Charger.m_b3PhaseModel ? &RotaryCurrMap_AX32[tmpBuf] : &RotaryCurrMap_AX48[tmpBuf]); #endif Charger.maxRatingCurrent = p->m_nCurr; Charger.isDebugEnable = p->m_bTestMode; Charger.isRotarySwitchError = p->m_bInvalidItem; XP("#[RotarySwitch(%c)] MaxCurr(%d), TestMode(%d), SwitchError(%d), SlaveMode(%d)\r\n", CharacterArray[tmpBuf], Charger.maxRatingCurrent, Charger.isDebugEnable, Charger.isRotarySwitchError, Charger.m_bRotarySlaveMode); #else //FUNC_ROTARY_CURR_MAP // Old procedure (Deleted) #endif //FUNC_ROTARY_CURR_MAP DEBUG_INFO("Current rating value: %d A\r\n", Charger.maxRatingCurrent); Charger.memory.EVSE_Config.data.item.MaxChargingCurrent = Charger.maxRatingCurrent; #ifdef MODIFY_AC_EVSE_STATUS_MAX_CHARGING_CURRENT_VARIABLE Charger.AC_MaxChargingCurrentOrDuty = Charger.maxRatingCurrent; #endif } //------------------------------------------------------------------------------// void CLC_Corr_Gain_Par(uint16_t SpecData_H ,uint16_t SpecData_L ,uint16_t MCUData_H , uint16_t MCUData_L , float *GainA , float *GainB ) { *GainA = (float)((float)(SpecData_H -SpecData_L) / (float)( MCUData_H - MCUData_L)) ; *GainB = (float)(SpecData_H - (float)(*GainA * MCUData_H)) ; } //------------------------------------------------------------------------------// void CLC_Corr_Gain_Par2(uint16_t SpecData_H ,uint16_t SpecData_L ,uint16_t MCUData_H , uint16_t MCUData_L , float *GainA , float *GainB , uint8_t *PosorNeg ) { *GainA = (float)((float)(SpecData_H -SpecData_L) / (float)( MCUData_H - MCUData_L)) ; if (SpecData_H > (*GainA * MCUData_H)) { *GainB = SpecData_H - (*GainA * MCUData_H) ; *PosorNeg = ON ; } else { *GainB = (*GainA * MCUData_H) - SpecData_H ; *PosorNeg = OFF ; } } //------------------------------------------------------------------------------ uint8_t Array_data_Check ( uint8_t *s1, uint8_t *s2 ) { uint8_t compare = 0; uint8_t result = PASS; for(compare=0;compare 0 && Charger.m_TripEnd == HTK_U32_MAX) { Charger.m_TripEnd = HAL_GetTick(); } #endif break; default: break; } } //-------------------------------------------------------------------------------- #ifdef FUNC_OUTP_TYPE_E void SE_Relay_Control_Function(void) { switch(Charger.SE_Relay_Action) { case GPIO_SE_RELAY_ACTION_ON: if(SE_Relay1_Action_Get() == GPIO_SE_RELAY1_ACTION_OFF) { SE_Relay_Action_Set(GPIO_SE_RELAY1_ACTION_ON); } if(timer[TIMER_IDX_SE_RELAY_1].isAlarm == ON) { SE_Relay_Action_Set(GPIO_SE_RELAY1_ACTION_HOLD); timerDisable(TIMER_IDX_SE_RELAY_1); Charger.SE_Relay_isOperationCompleted |= 0x11 ; } break; case GPIO_SE_RELAY_ACTION_OFF: timer[TIMER_IDX_SE_RELAY_1].isEnable = OFF; if(SE_Relay1_Action_Get() != GPIO_SE_RELAY1_ACTION_OFF) { SE_Relay_Action_Set(GPIO_SE_RELAY1_ACTION_OFF); } osDelay(10); Charger.SE_Relay_isOperationCompleted &= 0x00 ; break; default: break; } } #endif //FUNC_OUTP_TYPE_E //-------------------------------------------------------------------------------- uint8_t WatchDogLeakRawDataCheck_Event(void) { uint8_t result = PASS ; for(uint16_t idx = 0 ; idx < ADC2_SAMPLE_COUNT; idx++) { if (ADC2_Buffer_Each[1][idx] >= 4000) { result = FAIL; break; } } return result ; } //-------------------------------------------------------------------------------- uint16_t getBrightnessDuty(uint16_t max_duty) { uint8_t Lv_Brightness = 3; uint16_t duty = 1000; Lv_Brightness = (Charger.Led_Brightness[(Charger.memory.EVSE_Config.data.item.SystemDateTime.hour/2)]>>(((Charger.memory.EVSE_Config.data.item.SystemDateTime.hour+1)%2)*4))&0xf; switch(Lv_Brightness) { case 0: duty = max_duty/4; break; case 1: duty = max_duty/3; break; case 2: duty = max_duty/2; break; case 3: duty = max_duty; break; default: duty = max_duty; break; } #ifdef TEST_FOR_ENERGY_STAR //return duty / 10; //return duty / 4; if (Charger.m_bLedSleepModeForceMinBrightness) { duty = max_duty/4;; } return duty; #else return duty; #endif } //-------------------------------------------------------------------------------- void parseVersionInfoFromModelname(void) { #ifdef FUNC_XP_PARSE_VERSION_INFO_FROM_MODELNAME XP("Parse ModelName: %s\r\n", Charger.memory.EVSE_Config.data.item.ModelName); #endif #ifdef FUNC_VERSION_USE_NEW_SPEC_20240926 //do nothing #else //FUNC_VERSION_USE_NEW_SPEC_20240926 //-------------------------------------- // Version Naming Rule "tx.yz.ab.cddd.vv" //Version Naming Rule "a" for(uint8_t idx=0;idx<3;idx++) { switch(Charger.memory.EVSE_Config.data.item.ModelName[7+idx]) { case '1': // J1772 Plug Charger.Ver_FW[6] = '4'; break; case '2': // J1772 Socket Charger.Ver_FW[6] = '1'; break; case '3': // CE Plug Charger.Ver_FW[6] = '5'; break; case '4': // CE Socket Charger.Ver_FW[6] = '2'; break; case '5': // GB Plug Charger.Ver_FW[6] = '6'; break; case '6': // GB Socket Charger.Ver_FW[6] = '3'; break; #ifdef FUNC_ADD_FW_VER_WITH_GUN_TYPE_NACS case '9': // NACS Charger.Ver_FW[6] = '9'; break; #endif } } #endif //FUNC_VERSION_USE_NEW_SPEC_20240926 //Version Naming Rule "c" switch(Charger.memory.EVSE_Config.data.item.ModelName[10]) { case 'B': case 'U': //Blue tooth Charger.Ver_FW[9] = '3'; break; case 'W': // WIFI Charger.Ver_FW[9] = '1'; break; case 'T': // 3G/4G Charger.Ver_FW[9] = '2'; break; #ifdef FUNC_ADD_FW_VER_WITH_NET_TYPE_WIFI_AND_4G case 'D': Charger.Ver_FW[9] = '5'; break; #endif default: // LAN Charger.Ver_FW[9] = '0'; break; } //Version Naming Rule "d3" , Get rating power from model name memcpy(&Charger.Ver_FW[10], &Charger.memory.EVSE_Config.data.item.ModelName[4], 0x03); // Get vender code from model name memcpy(&Charger.Ver_FW[14], &Charger.memory.EVSE_Config.data.item.ModelName[12], 0x02); //-------------------------------------- //adc2 watchdog config data ADC_AnalogWDGConfTypeDef AnalogWDGConfig = {0}; AnalogWDGConfig.WatchdogMode = ADC_ANALOGWATCHDOG_SINGLE_REG; AnalogWDGConfig.HighThreshold = 3722; AnalogWDGConfig.LowThreshold = 372; AnalogWDGConfig.Channel = ADC_CHANNEL_6; #ifdef MODIFY_OCP_PROC_WITH_MODELNAME_IDX_3_EURO_SPEC HTK_BOOL bModelNameWithEuroSpecOCP = HTK_FALSE; #endif // CCID_Module_Type check Charger.CCID_Module_Type = CCID_MODULE_VAC ; switch(Charger.memory.EVSE_Config.data.item.ModelName[3]) { case 'E': //CE / European Market case 'T': //TR25 / Singapor Market case 'Z': //EV ready / French Market #ifdef MODIFY_OCP_PROC_WITH_MODELNAME_IDX_3_EURO_SPEC case 'M': //E + MID Meter case 'P': //E + PTB certification case 'I': //Z + TIC Meter pcb case 'F': //Z + MID Meter bModelNameWithEuroSpecOCP = HTK_TRUE; #endif Charger.CCID_Module_Type = CCID_MODULE_VAC ; AnalogWDGConfig.ITMode = DISABLE; //#ifdef MODIFY_OCP_MAGNIFICATION // Charger.OCP_Magnification = 125 ; //#else Charger.OCP_Magnification = 115 ; //#endif break; case 'U': //UL / North America Market Charger.CCID_Module_Type = CCID_MODULE_CORMEX ; #ifdef MODIFY_AW48_CCID_UL_SPEC_KENNY_20240401 //set at the other place // if (Charger.m_bModelNameAW48_1P) // { // Charger.alarm_spec.Current_LEAK_AC = 1700 ; // unit 0.01mA // } // else #endif //MODIFY_AW48_CCID_UL_SPEC_KENNY_20240401 { Charger.alarm_spec.Current_LEAK_AC = 1800 ; // unit 0.01mA } AnalogWDGConfig.ITMode = ENABLE; Charger.OCP_Magnification = 110 ; break; case 'G': //GB / China Market Charger.CCID_Module_Type = CCID_MODULE_CORMEX ; Charger.alarm_spec.Current_LEAK_AC = 2500 ; // unit 0.01mA AnalogWDGConfig.ITMode = ENABLE; Charger.OCP_Magnification = 110 ; break; case 'C': #ifdef FUNC_SUPPORT_MODEL_AXYC if (Charger.memory.EVSE_Config.data.item.ModelName[2] == 'Y') { bModelNameWithEuroSpecOCP = HTK_TRUE; Charger.CCID_Module_Type = CCID_MODULE_VAC ; AnalogWDGConfig.ITMode = DISABLE; Charger.OCP_Magnification = 115 ; } else { Charger.CCID_Module_Type = CCID_MODULE_CORMEX ; Charger.alarm_spec.Current_LEAK_AC = 2500 ; // unit 0.01mA AnalogWDGConfig.ITMode = ENABLE; Charger.OCP_Magnification = 110 ; } #else //FUNC_SUPPORT_MODEL_AXYC //CNS / Taiwan Market #ifdef FUNC_REPLACE_CORMEX_WITH_VAC_FOR_CNS_MODEL Charger.CCID_Module_Type = CCID_MODULE_VAC; #else Charger.CCID_Module_Type = CCID_MODULE_CORMEX ; #endif Charger.alarm_spec.Current_LEAK_AC = 2500 ; // unit 0.01mA AnalogWDGConfig.ITMode = ENABLE; Charger.OCP_Magnification = 110 ; #endif //FUNC_SUPPORT_MODEL_AXYC break; case 'J': //JARI / Japan Market Charger.CCID_Module_Type = CCID_MODULE_CORMEX ; Charger.alarm_spec.Current_LEAK_AC = 2500 ; // unit 0.01mA AnalogWDGConfig.ITMode = ENABLE; Charger.OCP_Magnification = 110 ; break; case 'K': //KC / Korea Market Charger.CCID_Module_Type = CCID_MODULE_CORMEX ; Charger.alarm_spec.Current_LEAK_AC = 1800 ; // unit 0.01mA AnalogWDGConfig.ITMode = ENABLE; Charger.OCP_Magnification = 110 ; break; case 'B': //British / UK Market Charger.CCID_Module_Type = CCID_MODULE_CORMEX ; Charger.alarm_spec.Current_LEAK_AC = 1800 ; // unit 0.01mA AnalogWDGConfig.ITMode = ENABLE; Charger.OCP_Magnification = 110 ; break; default: Charger.CCID_Module_Type = CCID_MODULE_VAC ; AnalogWDGConfig.ITMode = DISABLE; Charger.alarm_spec.Current_LEAK_AC = 1800 ; // unit 0.01mA Charger.OCP_Magnification = 110 ; break; } #ifdef MODIFY_OCP_PROC_WITH_MODELNAME_IDX_3_EURO_SPEC Charger.m_bModelNameWithEuroSpecOCP = bModelNameWithEuroSpecOCP; XP("#Use EuropeanSpecOCP: %s\r\n", Charger.m_bModelNameWithEuroSpecOCP ? "True" : "False"); #endif #ifdef FUNC_AUTO_MODIFY_CCID_MODULE XP("#Use CCID Module (ModelName: %s): %s\r\n", Charger.memory.EVSE_Config.data.item.ModelName, CCID_MODULE_TYPE_STR); if (Charger.m_bCCID_MustModify && Charger.m_CCID_ModuleTestOK != CCID_MODULE_UNKNOW) { Charger.CCID_Module_Type = Charger.m_CCID_ModuleTestOK; XP("#Use CCID Module (AutoModify): %s\r\n", CCID_MODULE_TYPE_STR); } #endif //adc2 watchdog config to register if (HAL_ADC_AnalogWDGConfig(&hadc2, &AnalogWDGConfig) != HAL_OK) { Error_Handler(); } #ifdef FUNC_AUTO_IGNORE_AC_PHASE Charger.m_b3PhaseModel = ( (Charger.memory.EVSE_Config.data.item.ModelName[2] == 'Y') || (Charger.memory.EVSE_Config.data.item.ModelName[2] == 'D') || (Charger.memory.EVSE_Config.data.item.ModelName[2] == 'W') ) ? 1 : 0; XP("#ThreePhaseModel: %s\r\n", Charger.m_b3PhaseModel ? "True" : "False"); #ifdef FUNC_CHECK_MODELNAME_AX_PRIFIX Charger.m_bModelNameAX = ( (Charger.memory.EVSE_Config.data.item.ModelName[0] == 'A') && (Charger.memory.EVSE_Config.data.item.ModelName[1] == 'X') ) ? 1 : 0; XP("#ModelNameAX: %s\r\n", Charger.m_bModelNameAX ? "True" : "False"); #endif #ifdef FUNC_AT32 Charger.m_bModelNameAT = ( (Charger.memory.EVSE_Config.data.item.ModelName[0] == 'A') && (Charger.memory.EVSE_Config.data.item.ModelName[1] == 'T') ) ? 1 : 0; XP("#ModelNameAT: %s\r\n", Charger.m_bModelNameAT ? "True" : "False"); Charger.m_bModelNameAT32_3P = Charger.m_bModelNameAT && ( Charger.m_b3PhaseModel // && (Charger.memory.EVSE_Config.data.item.ModelName[4] == '2') // && (Charger.memory.EVSE_Config.data.item.ModelName[5] == '2') // && (Charger.memory.EVSE_Config.data.item.ModelName[6] == '1') ) ? 1 : 0; XP("#ModelNameAT32_3P: %s\r\n", Charger.m_bModelNameAT32_3P ? "True" : "False"); #endif //FUNC_AT32 #ifdef FUNC_AX80 //ex: AXLU191001W1P0 Charger.m_bModelNameAX80_1P = Charger.m_bModelNameAX && ( !Charger.m_b3PhaseModel && (Charger.memory.EVSE_Config.data.item.ModelName[4] == '1') && (Charger.memory.EVSE_Config.data.item.ModelName[5] == '9') && (Charger.memory.EVSE_Config.data.item.ModelName[6] == '1') ) ? 1 : 0; XP("#ModelNameAX80_1P: %s\r\n", Charger.m_bModelNameAX80_1P ? "True" : "False"); Charger.m_bModelNameAX48_1P = Charger.m_bModelNameAX && ( !Charger.m_b3PhaseModel && !Charger.m_bModelNameAX80_1P // && (Charger.memory.EVSE_Config.data.item.ModelName[4] == '1') // && (Charger.memory.EVSE_Config.data.item.ModelName[5] == '1') // && (Charger.memory.EVSE_Config.data.item.ModelName[6] == '1') ) ? 1 : 0; XP("#ModelNameAX48_1P: %s\r\n", Charger.m_bModelNameAX48_1P ? "True" : "False"); #ifdef FUNC_AXSJ_USE_NEW_NACS_PCB Charger.m_bModelNameAXSJ = ( (Charger.memory.EVSE_Config.data.item.ModelName[0] == 'A') && (Charger.memory.EVSE_Config.data.item.ModelName[1] == 'X') && (Charger.memory.EVSE_Config.data.item.ModelName[2] == 'S') && (Charger.memory.EVSE_Config.data.item.ModelName[3] == 'J') ) ? 1 : 0; XP("#ModelNameAXSJ: %s\r\n", Charger.m_bModelNameAXSJ ? "True" : "False"); Charger.m_bModelNameAXSJ_AX48_NACS_1P = ( Charger.m_bModelNameAXSJ && (Charger.memory.EVSE_Config.data.item.ModelName[4] == '9') && (Charger.memory.EVSE_Config.data.item.ModelName[5] == '6') && (Charger.memory.EVSE_Config.data.item.ModelName[6] == '0') ) ? 1 : 0; XP("#ModelNameAXSJ_AX48_NACS_1P: %s\r\n", Charger.m_bModelNameAXSJ_AX48_NACS_1P ? "True" : "False"); Charger.m_bModelNameAXSJ_AX80_NACS_1P = ( Charger.m_bModelNameAXSJ && (Charger.memory.EVSE_Config.data.item.ModelName[4] == 'x') && (Charger.memory.EVSE_Config.data.item.ModelName[5] == 'x') && (Charger.memory.EVSE_Config.data.item.ModelName[6] == 'x') ) ? 1 : 0; XP("#ModelNameAXSJ_AX80_NACS_1P: %s\r\n", Charger.m_bModelNameAXSJ_AX80_NACS_1P ? "True" : "False"); #endif //FUNC_AXSJ_USE_NEW_NACS_PCB #ifdef FUNC_AX48_NACS Charger.m_bModelNameAX48_NACS_1P = Charger.m_bModelNameAX48_1P && (Charger.memory.EVSE_Config.data.item.ModelName[7] == '0') && (Charger.memory.EVSE_Config.data.item.ModelName[8] == '0') && (Charger.memory.EVSE_Config.data.item.ModelName[9] == '9'); #ifdef FUNC_AXSJ_USE_NEW_NACS_PCB Charger.m_bModelNameAX48_NACS_1P |= Charger.m_bModelNameAXSJ_AX48_NACS_1P; #endif #ifdef ADD_AX_NACS_PCB_USE_GEN_CODE_3 Charger.m_bModelNameAX48_NACS_1P |= (Charger.m_bModelNameAX48_1P && Charger.memory.EVSE_Config.data.item.ModelName[11] == '3'); #endif XP("#ModelNameAX48_NACS_1P: %s\r\n", Charger.m_bModelNameAX48_NACS_1P ? "True" : "False"); #ifdef FUNC_LIN_EN_SW if (Charger.m_bModelNameAX48_NACS_1P) { LIN_SW(HTK_FALSE); //PWM } #endif //FUNC_LIN_EN_SW #ifdef FUNC_TMP100 if (Charger.m_bModelNameAX48_NACS_1P || Charger.m_bModelNameAX80_NACS_1P) { Charger.m_bUseTMP100 = 1; } else { Charger.m_bUseTMP100 = 0; } XP("#UseTMP100: %s\r\n", Charger.m_bUseTMP100 ? "True" : "False"); #endif #endif //FUNC_AX48_NACS #ifdef FUNC_AX80_NACS Charger.m_bModelNameAX80_NACS_1P = Charger.m_bModelNameAX80_1P && (Charger.memory.EVSE_Config.data.item.ModelName[7] == '0') && (Charger.memory.EVSE_Config.data.item.ModelName[8] == '0') && (Charger.memory.EVSE_Config.data.item.ModelName[9] == '9'); #ifdef FUNC_AXSJ_USE_NEW_NACS_PCB Charger.m_bModelNameAX80_NACS_1P |= Charger.m_bModelNameAXSJ_AX80_NACS_1P; #endif #ifdef ADD_AX_NACS_PCB_USE_GEN_CODE_3 Charger.m_bModelNameAX80_NACS_1P |= (Charger.m_bModelNameAX80_1P && Charger.memory.EVSE_Config.data.item.ModelName[11] == '3'); #endif XP("#ModelNameAX80_NACS_1P: %s\r\n", Charger.m_bModelNameAX80_NACS_1P ? "True" : "False"); #ifdef FUNC_LIN_EN_SW if (Charger.m_bModelNameAX80_NACS_1P) { LIN_SW(HTK_FALSE); //PWM } #endif //FUNC_LIN_EN_SW #endif //FUNC_AX80_NACS Charger.m_bModelNameAX32_3P = Charger.m_bModelNameAX && ( Charger.m_b3PhaseModel // && (Charger.memory.EVSE_Config.data.item.ModelName[4] == '2') // && (Charger.memory.EVSE_Config.data.item.ModelName[5] == '2') // && (Charger.memory.EVSE_Config.data.item.ModelName[6] == '1') ) ? 1 : 0; XP("#ModelNameAX32_3P: %s\r\n", Charger.m_bModelNameAX32_3P ? "True" : "False"); #ifdef FUNC_AW48 Charger.m_bModelNameAW48_1P = !Charger.m_bModelNameAX && ( !Charger.m_b3PhaseModel && (Charger.memory.EVSE_Config.data.item.ModelName[0] == 'A') && (Charger.memory.EVSE_Config.data.item.ModelName[1] == 'W') && (Charger.memory.EVSE_Config.data.item.ModelName[4] == '1') && (Charger.memory.EVSE_Config.data.item.ModelName[5] == '1') && (Charger.memory.EVSE_Config.data.item.ModelName[6] == '1') ) ? 1 : 0; XP("#ModelNameAW48_1P: %s\r\n", Charger.m_bModelNameAW48_1P ? "True" : "False"); #ifdef MODIFY_AW48_CCID_UL_SPEC_KENNY_20240401 if (Charger.m_bModelNameAW48_1P) { Charger.alarm_spec.Current_LEAK_AC = 1700 ; // unit 0.01mA } #endif //MODIFY_AW48_CCID_UL_SPEC_KENNY_20240401 #ifdef FUNC_LIN_EN_SW if (Charger.m_bModelNameAW48_1P) { LIN_SW(HTK_FALSE); //PWM } #endif //FUNC_LIN_EN_SW #ifdef FUNC_AW48_EXT_LED if (Charger.m_bModelNameAW48_1P) { EXTLED_SET_POWER(1); } #endif //FUNC_AW48_EXT_LED #endif //FUNC_AW48 #ifdef RELAY_COMMON_GPIO if (Charger.m_bModelNameAW48_1P) { #ifdef AW48_NEW_PCB_WITH_CORRECT_RELAY_PIN Charger.m_RelayMode = 0; //New PCB #else Charger.m_RelayMode = 1; #endif } else { Charger.m_RelayMode = 0; } XP("#RelayMode: %d\r\n", Charger.m_RelayMode); #endif #ifdef FUNC_EKM_OMNIMETER Charger.m_bUseExtMeter_OMNIMETER = Charger.m_bModelNameAW48_1P; XP("#UseExtMeter_OMNIMETER: %s\r\n", Charger.m_bUseExtMeter_OMNIMETER ? "True" : "False"); #endif #ifdef FUNC_LIN_CP Charger.m_bUseLinCP = Charger.m_bModelNameAW48_1P; XP("#UseLinCP: %s\r\n", Charger.m_bUseLinCP ? "True" : "False"); #endif //FUNC_AW48 #endif //FUNC_AX80 #ifdef AUTO_MODIFY_FW_VERSION_PREFIX_V_WHEN_GET_AX48_MODELNAME_WITH_CSU UpdateFirmwareVersion(); #endif #ifdef FUNC_NEW_RELAY_MONITOR if (Charger.m_b3PhaseModel == 0) { //AX48 (1P) LN/LL use same formula Charger.alarm_spec.Relay_LL_DriveFault_Slop = 0.003266332; Charger.alarm_spec.Relay_LL_DriveFault_Offs = 0.28; #ifdef MODIFY_AW48_WELDING_THRESHOLD_KENNY_20240418 if (Charger.m_bModelNameAW48_1P) { Charger.alarm_spec.Relay_LL_Welding_Slop = 0.001894; Charger.alarm_spec.Relay_LL_Welding_Offs = 0.093333333; } else #endif //MODIFY_AW48_WELDING_THRESHOLD_KENNY_20240418 { Charger.alarm_spec.Relay_LL_Welding_Slop = 0.00318258; Charger.alarm_spec.Relay_LL_Welding_Offs = 0.093333333; } } else { //AX32 (3P) only LL Charger.alarm_spec.Relay_LL_DriveFault_Slop = 0.003661263; Charger.alarm_spec.Relay_LL_DriveFault_Offs = 1.340704304; Charger.alarm_spec.Relay_LL_Welding_Slop = 0.002794857; Charger.alarm_spec.Relay_LL_Welding_Offs = 0.391911683; } #endif //FUNC_NEW_RELAY_MONITOR #ifdef FUNC_METER_IC_VARIABLE_PARAM #ifdef FUNC_AX80 if (Charger.m_bModelNameAX80_1P) { MeterIC_KI = KI_AX80; MeterIC_KP = KP_AX80; MeterIC_KE = KE_AX80; } else if (Charger.m_bModelNameAX48_1P) { MeterIC_KI = KI_AX48; MeterIC_KP = KP_AX48; MeterIC_KE = KE_AX48; } else if (Charger.m_bModelNameAX32_3P) { MeterIC_KI = KI_AX32; MeterIC_KP = KP_AX32; MeterIC_KE = KE_AX32; } #ifdef FUNC_AT32 else if (Charger.m_bModelNameAT32_3P) { MeterIC_KI = KI_AT32; MeterIC_KP = KP_AT32; MeterIC_KE = KE_AT32; } #endif #ifdef FUNC_AW48 else if (Charger.m_bModelNameAW48_1P) { MeterIC_KI = KI_AW48; MeterIC_KP = KP_AW48; MeterIC_KE = KE_AW48; } #endif else { MeterIC_KI = KI_AX48; MeterIC_KP = KP_AX48; MeterIC_KE = KE_AX48; } XP("#MeterIC KI = %.10f, KP = %.10f, KE = %.10f\r\n", MeterIC_KI, MeterIC_KP, MeterIC_KE); #else //FUNC_AX80 if (Charger.m_b3PhaseModel == 0) { MeterIC_KI = KI_AX48; MeterIC_KP = KP_AX48; MeterIC_KE = KE_AX48; } else { MeterIC_KI = KI_AX32; MeterIC_KP = KP_AX32; MeterIC_KE = KE_AX32; } #endif //FUNC_AX80 #endif //FUNC_METER_IC_VARIABLE_PARAM #ifdef MODIFY_OTP_SPEC #ifdef FUNC_AX80_ADD_4_TEMP_SENEOR if (Charger.m_bModelNameAX80_1P) { #ifdef FUNC_AX80_NACS_ADD_6_TEMP_SENEOR if (Charger.m_bModelNameAX80_NACS_1P) { Charger.alarm_spec.OT_G1_1 = ALARM_SPEC_OT_G1_1_AX80_NACS; Charger.alarm_spec.OT_G1_2 = ALARM_SPEC_OT_G1_2_AX80_NACS; Charger.alarm_spec.OT_G1_HYSTERESIS = ALARM_SPEC_OT_G1_HYSTERESIS_AX80_NACS; Charger.alarm_spec.OT_G2_1 = ALARM_SPEC_OT_G2_1_AX80_NACS; Charger.alarm_spec.OT_G2_2 = ALARM_SPEC_OT_G2_2_AX80_NACS; Charger.alarm_spec.OT_G2_HYSTERESIS = ALARM_SPEC_OT_G2_HYSTERESIS_AX80_NACS; #ifdef MODIFY_AX80_NACS_OTP_SPEC_20240911_JACK Charger.alarm_spec.OT_G3_1 = ALARM_SPEC_OT_G3_1_AX80_NACS; Charger.alarm_spec.OT_G3_2 = ALARM_SPEC_OT_G3_2_AX80_NACS; Charger.alarm_spec.OT_G3_HYSTERESIS = ALARM_SPEC_OT_G3_HYSTERESIS_AX80_NACS; Charger.alarm_spec.OT_G4_1 = ALARM_SPEC_OT_G4_1_AX80_NACS; Charger.alarm_spec.OT_G4_2 = ALARM_SPEC_OT_G4_2_AX80_NACS; Charger.alarm_spec.OT_G4_HYSTERESIS = ALARM_SPEC_OT_G4_HYSTERESIS_AX80_NACS; #endif //MODIFY_AX80_NACS_OTP_SPEC_20240911_JACK } else { Charger.alarm_spec.OT_G1_1 = ALARM_SPEC_OT_G1_1_AX80; Charger.alarm_spec.OT_G1_2 = ALARM_SPEC_OT_G1_2_AX80; Charger.alarm_spec.OT_G1_HYSTERESIS = ALARM_SPEC_OT_G1_HYSTERESIS_AX80; Charger.alarm_spec.OT_G2_1 = ALARM_SPEC_OT_G2_1_AX80; Charger.alarm_spec.OT_G2_2 = ALARM_SPEC_OT_G2_2_AX80; Charger.alarm_spec.OT_G2_HYSTERESIS = ALARM_SPEC_OT_G2_HYSTERESIS_AX80; } #else //FUNC_AX80_NACS_ADD_6_TEMP_SENEOR Charger.alarm_spec.OT_G1_1 = ALARM_SPEC_OT_G1_1_AX80; Charger.alarm_spec.OT_G1_2 = ALARM_SPEC_OT_G1_2_AX80; Charger.alarm_spec.OT_G1_HYSTERESIS = ALARM_SPEC_OT_G1_HYSTERESIS_AX80; Charger.alarm_spec.OT_G2_1 = ALARM_SPEC_OT_G2_1_AX80; Charger.alarm_spec.OT_G2_2 = ALARM_SPEC_OT_G2_2_AX80; Charger.alarm_spec.OT_G2_HYSTERESIS = ALARM_SPEC_OT_G2_HYSTERESIS_AX80; #endif //FUNC_AX80_NACS_ADD_6_TEMP_SENEOR } #ifdef FUNC_AW48_ADD_6_TEMP_SENEOR else if (Charger.m_bModelNameAW48_1P) { Charger.alarm_spec.OT_G1_1 = ALARM_SPEC_OT_G1_1_AW48; Charger.alarm_spec.OT_G1_2 = ALARM_SPEC_OT_G1_2_AW48; Charger.alarm_spec.OT_G1_HYSTERESIS = ALARM_SPEC_OT_G1_HYSTERESIS_AW48; Charger.alarm_spec.OT_G2_1 = ALARM_SPEC_OT_G2_1_AW48; Charger.alarm_spec.OT_G2_2 = ALARM_SPEC_OT_G2_2_AW48; Charger.alarm_spec.OT_G2_HYSTERESIS = ALARM_SPEC_OT_G2_HYSTERESIS_AW48; #ifdef MODIFY_AW48_OTP_SPEC_20240522_STEVEN Charger.alarm_spec.OT_G3_1 = ALARM_SPEC_OT_G3_1_AW48; Charger.alarm_spec.OT_G3_2 = ALARM_SPEC_OT_G3_2_AW48; Charger.alarm_spec.OT_G3_HYSTERESIS = ALARM_SPEC_OT_G3_HYSTERESIS_AW48; #endif //MODIFY_AW48_OTP_SPEC_20240522_STEVEN #ifdef MODIFY_AW48_OTP_SPEC_20240802_STEVEN Charger.alarm_spec.OT_G4_1 = ALARM_SPEC_OT_G4_1_AW48; Charger.alarm_spec.OT_G4_2 = ALARM_SPEC_OT_G4_2_AW48; Charger.alarm_spec.OT_G4_HYSTERESIS = ALARM_SPEC_OT_G4_HYSTERESIS_AW48; #endif //MODIFY_AW48_OTP_SPEC_20240802_STEVEN } #endif #ifdef FUNC_AX48_NACS_ADD_6_TEMP_SENEOR else if (Charger.m_bModelNameAX48_NACS_1P) { Charger.alarm_spec.OT_G1_1 = ALARM_SPEC_OT_G1_1_AX48_NACS; Charger.alarm_spec.OT_G1_2 = ALARM_SPEC_OT_G1_2_AX48_NACS; Charger.alarm_spec.OT_G1_HYSTERESIS = ALARM_SPEC_OT_G1_HYSTERESIS_AX48_NACS; Charger.alarm_spec.OT_G2_1 = ALARM_SPEC_OT_G2_1_AX48_NACS; Charger.alarm_spec.OT_G2_2 = ALARM_SPEC_OT_G2_2_AX48_NACS; Charger.alarm_spec.OT_G2_HYSTERESIS = ALARM_SPEC_OT_G2_HYSTERESIS_AX48_NACS; #ifdef MODIFY_AX48_NACS_OTP_SPEC_20240522_STEVEN Charger.alarm_spec.OT_G3_1 = ALARM_SPEC_OT_G3_1_AX48_NACS; Charger.alarm_spec.OT_G3_2 = ALARM_SPEC_OT_G3_2_AX48_NACS; Charger.alarm_spec.OT_G3_HYSTERESIS = ALARM_SPEC_OT_G3_HYSTERESIS_AX48_NACS; #endif //MODIFY_AX48_NACS_OTP_SPEC_20240522_STEVEN #ifdef MODIFY_AX48_NACS_OTP_SPEC_20240826_STEVEN Charger.alarm_spec.OT_G4_1 = ALARM_SPEC_OT_G4_1_AX48_NACS; Charger.alarm_spec.OT_G4_2 = ALARM_SPEC_OT_G4_2_AX48_NACS; Charger.alarm_spec.OT_G4_HYSTERESIS = ALARM_SPEC_OT_G4_HYSTERESIS_AX48_NACS; #endif //MODIFY_AX48_NACS_OTP_SPEC_20240826_STEVEN } #endif //FUNC_AX48_NACS_ADD_6_TEMP_SENEOR else if (Charger.m_bModelNameAX48_1P) { Charger.alarm_spec.OT_G1_1 = ALARM_SPEC_OT_G1_1_AX48; Charger.alarm_spec.OT_G1_2 = ALARM_SPEC_OT_G1_2_AX48; Charger.alarm_spec.OT_G1_HYSTERESIS = ALARM_SPEC_OT_G1_HYSTERESIS_AX48; } else if (Charger.m_bModelNameAX32_3P) { Charger.alarm_spec.OT_G1_1 = ALARM_SPEC_OT_G1_1_AX32; Charger.alarm_spec.OT_G1_2 = ALARM_SPEC_OT_G1_2_AX32; Charger.alarm_spec.OT_G1_HYSTERESIS = ALARM_SPEC_OT_G1_HYSTERESIS_AX32; } #ifdef FUNC_AT32 else if (Charger.m_bModelNameAT32_3P) { Charger.alarm_spec.OT_G1_1 = ALARM_SPEC_OT_G1_1_AT32; Charger.alarm_spec.OT_G1_2 = ALARM_SPEC_OT_G1_2_AT32; Charger.alarm_spec.OT_G1_HYSTERESIS = ALARM_SPEC_OT_G1_HYSTERESIS_AT32; } #endif else { Charger.alarm_spec.OT_G1_1 = ALARM_SPEC_OT_G1_1_AX48; Charger.alarm_spec.OT_G1_2 = ALARM_SPEC_OT_G1_2_AX48; Charger.alarm_spec.OT_G1_HYSTERESIS = ALARM_SPEC_OT_G1_HYSTERESIS_AX48; } #else //FUNC_AX80_ADD_4_TEMP_SENEOR if (Charger.m_b3PhaseModel == 0) { Charger.alarm_spec.OT_1 = ALARM_SPEC_OT_1_AX48; Charger.alarm_spec.OT_2 = ALARM_SPEC_OT_2_AX48; Charger.alarm_spec.OT_HYSTERESIS = ALARM_SPEC_OT_HYSTERESIS_AX48; } else { Charger.alarm_spec.OT_1 = ALARM_SPEC_OT_1_AX32; Charger.alarm_spec.OT_2 = ALARM_SPEC_OT_2_AX32; Charger.alarm_spec.OT_HYSTERESIS = ALARM_SPEC_OT_HYSTERESIS_AX32; } #endif //FUNC_AX80_ADD_4_TEMP_SENEOR #endif //MODIFY_OTP_SPEC #endif //FUNC_AUTO_IGNORE_AC_PHASE #ifdef FUNC_AUTO_USE_EXT_METER #ifdef FUNC_FORCE_USE_METER_EXT_PRO380 Charger.m_bUseExtMeter_PRO380 = 1; XP("#UseExtMeter: FORCE Enable\r\n"); #else Charger.m_bUseExtMeter_PRO380 = ( (Charger.memory.EVSE_Config.data.item.ModelName[3] == 'M') #ifndef FUNC_PTB_METER_WM3M4C || (Charger.memory.EVSE_Config.data.item.ModelName[3] == 'P') #endif || (Charger.memory.EVSE_Config.data.item.ModelName[3] == 'I') || (Charger.memory.EVSE_Config.data.item.ModelName[3] == 'F') || (Charger.memory.EVSE_Config.data.item.ModelName[3] == 'L') #ifdef TEST_METER_PRO380_AND_WM3M4C_AT_THE_SAME_TIME_USE_MODELNAME_IDX_3_X || (Charger.memory.EVSE_Config.data.item.ModelName[3] == 'x') #endif ) ? 1 : 0; XP("#UseExtMeter_PRO380: %s\r\n", Charger.m_bUseExtMeter_PRO380 ? "Enable" : "Disable"); #endif //FUNC_FORCE_USE_METER_EXT_PRO380 #ifdef FUNC_PTB_METER_WM3M4C Charger.m_bUseExtMeter_WM3M4C = ( Charger.memory.EVSE_Config.data.item.ModelName[3] == 'P' #ifdef TEST_METER_PRO380_AND_WM3M4C_AT_THE_SAME_TIME_USE_MODELNAME_IDX_3_X || (Charger.memory.EVSE_Config.data.item.ModelName[3] == 'x') #endif ) ? 1 : 0; XP("#UseExtMeter_WM3M4C: %s\r\n", Charger.m_bUseExtMeter_WM3M4C ? "Enable" : "Disable"); #endif //FUNC_PTB_METER_WM3M4C #ifdef FUNC_ADD_TILT_SENSOR_MODEL { Charger.m_bUseTiltSensor = ( Charger.m_bModelNameAX80_1P || Charger.m_bModelNameAX48_NACS_1P #ifdef FUNC_AX80_NACS || Charger.m_bModelNameAX80_NACS_1P #endif #ifdef FUNC_AW48 || Charger.m_bModelNameAW48_1P #endif ) ? 1 : 0; XP("#UseTiltSensor: %s\r\n", Charger.m_bUseTiltSensor ? "Enable" : "Disable"); } #endif //FUNC_ADD_TILT_SENSOR_MODEL #endif //FUNC_AUTO_USE_EXT_METER #ifdef FUNC_RS485_SLAVE Charger.m_bRS485SlaveForDCModel = ( (Charger.memory.EVSE_Config.data.item.ModelName[0] == 'D') //response to DC Model ) ? 1 : 0; Charger.m_RS485SlaveAddr = (Charger.m_bRS485SlaveForDCModel ? PROTOCOL_ADDR_AC_MAINBOARD : PROTOCOL_ADDR); #endif #ifdef FUNC_FORCE_RUN_CSU_MODE_WITH_DC_MODELNAME Charger.m_bModelNameDC = ( (Charger.memory.EVSE_Config.data.item.ModelName[0] == 'D') //response to DC Model ) ? 1 : 0; Charger.m_bModelNameDCReadOK = 1; XP("#ModelNameDC: %s\r\n", Charger.m_bModelNameDC ? "True" : "False"); Update_McuCtrlMode(); #endif #ifdef FUNC_CSU_SIGN_IN_VERIFY Charger.m_bCsuSignInMustVerify = (Charger.m_bModelNameAW48_1P && (Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_CSU)); XP("#CsuSignInMustVerify: %s\r\n", Charger.m_bCsuSignInMustVerify ? "True" : "False"); #endif #ifdef FUNC_CSU_UPGRADE_FW_VERIFY Charger.m_bCsuUpgradeFwMustVerify = (Charger.m_bModelNameAW48_1P && (Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_CSU)); XP("#CsuUpgradeFwMustVerify: %s\r\n", Charger.m_bCsuUpgradeFwMustVerify ? "True" : "False"); #endif #ifdef FUNC_DETECT_PP { HTK_BOOL bDetectPP = HTK_FALSE; for (uint8_t i = 7; i <= 9; i++) { bDetectPP |= ( Charger.memory.EVSE_Config.data.item.ModelName[i] == '2' //IEC 62196-2 Type 1 / SAE J1772 Socket || Charger.memory.EVSE_Config.data.item.ModelName[i] == '4' //IEC 62196-2 Type 2 Socket || Charger.memory.EVSE_Config.data.item.ModelName[i] == '6' //GB/T AC Socket ) ? HTK_TRUE : HTK_FALSE; } Charger.m_bDetectPP = bDetectPP; XP("#DetectPP: %s\r\n", Charger.m_bDetectPP ? "Enable" : "Disable"); } #endif //FUNC_DETECT_PP #ifdef FUNC_DETECT_PP_NACS { HTK_BOOL bDetectPP_NACS = HTK_FALSE; #ifdef FUNC_AX80_NACS bDetectPP_NACS = Charger.m_bModelNameAX48_NACS_1P || Charger.m_bModelNameAX80_NACS_1P; #else bDetectPP_NACS = Charger.m_bModelNameAX48_NACS_1P; #endif Charger.m_bDetectPP_NACS = bDetectPP_NACS; XP("#DetectPP_NACS: %s\r\n", Charger.m_bDetectPP_NACS ? "Enable" : "Disable"); } #endif //FUNC_DETECT_PP_NACS #ifdef FUNC_GUN_LOCK { HTK_BOOL bUseGunLock = HTK_FALSE; for (uint8_t i = 7; i <= 9; i++) { bUseGunLock |= ( Charger.memory.EVSE_Config.data.item.ModelName[i] == '2' //IEC 62196-2 Type 1 / SAE J1772 Socket || Charger.memory.EVSE_Config.data.item.ModelName[i] == '4' //IEC 62196-2 Type 2 Socket || Charger.memory.EVSE_Config.data.item.ModelName[i] == '6' //GB/T AC Socket ) ? HTK_TRUE : HTK_FALSE; } Charger.m_bUseGunLock = bUseGunLock; XP("#UseGunLock: %s\r\n", Charger.m_bUseGunLock ? "Enable" : "Disable"); #ifdef FUNC_GUN_LOCK_TRIG_MODE if (IS_CSU_MOUNTED) //CSU Mounted { Charger.m_GunLockTrigMode = GL_TRIG_MODE_REQUEST; Charger.m_GunLockRequestMode_LockDelayTick = 0; } else //No CSU Mounted or DC Model { Charger.m_GunLockTrigMode = GL_TRIG_MODE_RELAY; } XP("#GunLockTrigMode: %d\r\n", (int)Charger.m_GunLockTrigMode); #endif } #endif //FUNC_GUN_LOCK #ifdef FUNC_USE_RELAY_B_CONTACT { HTK_BOOL bUseRelayBContact = HTK_FALSE; bUseRelayBContact = Charger.m_b3PhaseModel; ////#ifdef DISABLE_USE_RELAY_B_CONTACT_WITH_DC_MODELNAME //// if (Charger.m_bModelNameDC) //// bUseRelayBContact = HTK_FALSE; ////#endif #ifdef DISABLE_USE_RELAY_B_CONTACT_WITH_AX32_OLD_PCB bUseRelayBContact = HTK_FALSE; #endif Charger.m_bUseRelayBContact = bUseRelayBContact; XP("#UseRelayBContact: %s\r\n", Charger.m_bUseRelayBContact ? "True" : "False"); } #endif //FUNC_USE_RELAY_B_CONTACT #ifdef FUNC_OUTP_TYPE_E { //#ifdef FUNC_USE_MODELNAME_TO_JUDGE_TYPEE_ENABLE // HTK_BOOL bEnableTypeE = HTK_FALSE; // for (uint8_t i = 7; i <= 9; i++) // { // bEnableTypeE |= // ( // Charger.memory.EVSE_Config.data.item.ModelName[i] == '8' //Type E Socket // ) ? HTK_TRUE : HTK_FALSE; // // } // Charger.m_bEnableTypeE = bEnableTypeE; //#else #ifdef FUNC_ENABLE_TYPE_E_ONLY_IN_AX32 Charger.m_bEnableTypeE = Charger.m_b3PhaseModel; #else Charger.m_bEnableTypeE = HTK_TRUE; #endif //#endif //FUNC_USE_MODELNAME_TO_JUDGE_TYPEE_ENABLE XP("#TypeE: %s\r\n", Charger.m_bEnableTypeE ? "Enable" : "Disable"); } #endif //FUNC_OUTP_TYPE_E #ifdef FUNC_CP_ADC_MODIFY #ifdef NEW_CP_SPEC CpDetectModuleInitialize(Charger.memory.EVSE_Config.data.item.ModelName[3]); Charger.m_bCpDetectModuleInitOK = 1; #endif //NEW_CP_SPEC #endif //FUNC_CP_ADC_MODIFY #ifdef FUNC_RULE_GB_202108 Charger.m_bSafetyRegulationGB = (Charger.memory.EVSE_Config.data.item.ModelName[3] == 'G'); #endif #ifdef FUNC_UPDATE_ROTARY_SWITCH_SETTING_AFTER_PARSE_MODELNAME getRotarySwitchSetting(); #endif } void HTK_ByteArray2HexStr(const u8* buf, const u16 BegIdx, const u16 len, char* OutStr, u16 nMaxBytesPerLine, HTK_BOOL bSpace) { char sTmp[8] = { 0 }; strcpy(OutStr, "\0"); for (u16 i = BegIdx; i < (BegIdx + len); i++) { sprintf(sTmp, bSpace ? "%02X " : "%02X", buf[i]); strcat(OutStr, sTmp); if ((i - BegIdx) % nMaxBytesPerLine == (nMaxBytesPerLine - 1)) { strcat(OutStr, "\r\n"); } } } void HTK_ByteArray2HexStr_XP(const char* Title, const u8* buf, const u16 BegIdx, const u16 len) { static char OutStr[1024 * 3 + 8] = { 0 }; HTK_ByteArray2HexStr(buf, BegIdx, len, OutStr, 0, HTK_TRUE); XP("[%s] %s(%d)\r\n", (Title == NULL ? "" : Title), OutStr, len); } void HTK_ByteArray2HexStr_XT(const char* Title, const u8* buf, const u16 BegIdx, const u16 len) { static char OutStr[1024 * 3 + 8] = { 0 }; HTK_ByteArray2HexStr(buf, BegIdx, len, OutStr, 0, HTK_TRUE); XT("[%s] %s(%d)\r\n", (Title == NULL ? "" : Title), OutStr, len); } #ifdef ENABLE_PRINT_IMCP_MSG int CheckPrintImcpMsg(uint8_t MsgID) { #ifdef ENABLE_PRINT_IMCP_SPEC_MSG return ( // MsgID == PROTOCOL_MESSAGE_CONFIG_PARAMETER // || MsgID == PROTOCOL_MESSAGE_QUERY_METER_IC_MEAS_PARAMETER // || MsgID == PROTOCOL_MESSAGE_QUERY_METER_IC_CALI_PARAMETER // || MsgID == PROTOCOL_MESSAGE_CONFIG_METER_IC_CALI_PARAMETER MsgID == PROTOCOL_MESSAGE_CONFIG_RELAY_OUTPUT || MsgID == PROTOCOL_MESSAGE_CONFIG_MAX_CURRENT_PWM_DUTY || MsgID == PROTOCOL_MESSAGE_CONFIG_LEGACY_REQUEST ); #else return true; #endif //ENABLE_PRINT_IMCP_SPEC_MSG } #endif //ENABLE_PRINT_IMCP_MSG #ifdef MODIFY_COLD_LOAD_PICKUP_DELAY void ColdLoadPickup_Delay(const char* Description) { //osDelay((rand()%175000)+5000); int r = rand(); if (r < 0) { r = (-1) * r; } //uint32_t dt = (r % 175000) + 5000; //ms uint32_t dt = (r % (COLD_LOAD_PICKUP_DELAY_TIME_MAX_RANGE_SEC * 1000)) + 5000; //ms XP("ColdLoadPickup_Delay(ms) [%s]: %d\r\n", Description, dt); osDelay(dt); } #endif #ifdef MODIFY_CP_TASK_CTRL_CP_PWM uint16_t GetCpPwmDuty(uint16_t Curr) { #ifdef FUNC_AX80 if (Curr > Charger.maxRatingCurrent) { Curr = Charger.maxRatingCurrent; } #endif #ifdef FUNC_DETECT_PP if (Charger.m_bDetectPP) { PPPInfo p = &Charger.m_PPInfo; if (Curr > p->m_CurCurr) Curr = p->m_CurCurr; if (p->m_PreCurr != p->m_CurCurr) p->m_PreCurr = p->m_CurCurr; } #endif #ifdef FUNC_AX80 uint16_t rtn = 0; if (Curr >= 6 && Curr <= 51) { rtn = (uint16_t)((Curr / 0.6) * 10); } else if (Curr > 51 && Curr <= 80) { rtn = (uint16_t)((Curr / 2.5 + 64) * 10); } #else uint16_t rtn = (uint16_t)((Curr / 0.6) * 10); #endif XP("#GetCpPwmDuty(%d) => %d\r\n", Curr, rtn); return rtn; } #endif #ifdef HTK u8 GetBit1Num(u32 x) { u8 Num = 0; while (x) { Num++; x &= (x - 1); } return Num; } HTK_BOOL HTK_IsInTime(u32 BegTick, u32 MaxTick) { u32 EndTick = HAL_GetTick(); u32 ElapseTick = (EndTick >= BegTick ? EndTick - BegTick : HTK_U32_MAX - BegTick + EndTick); return ElapseTick <= MaxTick ? HTK_TRUE : HTK_FALSE; } HTK_BOOL HTK_IsTimeout(u32 BegTick, u32 MaxTick) { u32 EndTick = HAL_GetTick(); u32 ElapseTick = (EndTick >= BegTick ? EndTick - BegTick : HTK_U32_MAX - BegTick + EndTick); return ElapseTick > MaxTick ? HTK_TRUE : HTK_FALSE; } void HTK_Timer_Reset(PHTK_Timer p) { //XP("#\r\n\r\n"); p->m_bStart = HTK_FALSE; p->m_bTimeout = HTK_FALSE; p->m_BegTick = 0; p->m_MaxTick = 0; } void HTK_Timer_Start(PHTK_Timer p, u32 MaxTick) { //XP("#\r\n\r\n"); p->m_bStart = HTK_TRUE; p->m_BegTick = HAL_GetTick(); p->m_MaxTick = MaxTick; } HTK_BOOL HTK_Timer_CheckTimeout(PHTK_Timer p) { // return HTK_IsTimeout(p->m_BegTick, p->m_MaxTick); HTK_BOOL rtn = HTK_IsTimeout(p->m_BegTick, p->m_MaxTick); if (rtn == HTK_TRUE) { //XP("#\r\n\r\n"); p->m_bTimeout = HTK_TRUE; } return rtn; } uint8_t HTK_CheckSum_Calulate(uint8_t* pBeg, uint32_t len) { if (pBeg != NULL) { uint8_t CheckSum = 0; for (uint32_t i = 0; i < len; i++) { CheckSum ^= *(pBeg + i); } return CheckSum; } else { return 0; } } HTK_BOOL HTK_CheckSum_Update(uint8_t* pBeg, uint32_t len, uint8_t* pCheckSum) { if (pBeg != NULL && pCheckSum != NULL) { uint8_t CheckSum = HTK_CheckSum_Calulate(pBeg, len); *pCheckSum = CheckSum; return HTK_TRUE; } else { return HTK_FALSE; } } HTK_BOOL HTK_CheckSum_IsOK(uint8_t* pBeg, uint32_t len, uint8_t* pCheckSum) { if (pBeg != NULL && pCheckSum != NULL) { uint8_t CheckSum = HTK_CheckSum_Calulate(pBeg, len); return (*pCheckSum == CheckSum) ? HTK_TRUE : HTK_FALSE; } else { return HTK_FALSE; } } HTK_BOOL HTK_HexStrToByteArray(byte* Dst, int DstLen, const char* Src, int SrcLen) { if (DstLen * 2 + 1 != SrcLen) return HTK_FALSE; char buf[3] = { 0 }; for (int i = 0; i < DstLen; i++) { memcpy(buf, &Src[i * 2], 2); Dst[i] = strtol(buf, NULL, 16); } return HTK_TRUE; } void HTK_FillChar(char* buf, char c, int count) { if (buf != NULL) { memset(buf, c, count); buf[count] = '\0'; } } void HTK_PrintRow(char c, int count) { enum { MAX = 80 }; static char s_row[MAX + 1] = { 0 }; static int s_count = 0; if (count > MAX) { count = MAX; } if (c != s_row[0] || count != s_count) { HTK_FillChar(s_row, c, count); } s_count = count; XP("%s\r\n", s_row); return; } static HTK_MallocHandle s_MallocHandle; void HTK_Malloc_Init(void) { memset(&s_MallocHandle, 0, sizeof(s_MallocHandle)); //XP("HTK_Malloc_Init(): %d\r\n", HTK_Malloc_BlockTest(1024)); //XP("HTK_Malloc_Init(): %d\r\n", HTK_Malloc_BlockTest(8000)); XP("HTK_Malloc_Init(): %d\r\n", HTK_Malloc_BlockTest(512)); } void* HTK_Malloc(s32 size) { void* p = malloc(size); if (p != NULL) { s_MallocHandle.m_Allocated += size; s_MallocHandle.m_Reserved -= size; memset(p, 0, size); } XP("HTK_Malloc(%d) %s\r\n", size, (p == NULL) ? "*** [NG] ***" : "OK"); return p; } void HTK_Free(void* p) { if (p != NULL) { free(p); p = NULL; XP("HTK_Free: OK\r\n"); } } s32 HTK_Malloc_BlockTest(s32 size) { int Total = 0; for (int i = 1; ; i++) { void* p = HTK_Malloc(size); if (p == NULL) { break; } else { Total += size; } } s_MallocHandle.m_Total = Total; s_MallocHandle.m_Allocated = 0; s_MallocHandle.m_Reserved = Total; return Total; } #ifdef FUNC_SALT_AND_BLEND int Salt(u8* Mixture, int MixtureLen, u8* SaltMap, int SaltMapLen, u8* Data, int DataLen, u8 bRestore) { int SaltMapLenMin = GET_BOX_NUM(MixtureLen, 8); if (Mixture == NULL || SaltMap == NULL || Data == NULL || DataLen > MixtureLen || SaltMapLen < SaltMapLenMin) return FAIL; int SaltUsed = 0; //0 ~ (MixtureLen - DataLen) int i = 0; //0 ~ (MixtureLen - 1) int j = 0; //0 ~ (DataLen - 1) if (bRestore) { memset(Data, 0, DataLen); for (; i < MixtureLen; i++) { if (BIT_GET(SaltMap[i / 8], i % 8) == 0) { Data[j++] = Mixture[i]; if (j == DataLen) { return PASS; } } } } else { memset(Mixture, 0, MixtureLen); memset(SaltMap, 0, SaltMapLen); for (; i < MixtureLen; i++) { if (rand() % 2 == 0) //insert Data { if (j < DataLen) { Mixture[i] = Data[j++]; } else { Mixture[i] = rand() % 0x100; BIT_SET(SaltMap[i / 8], i % 8); } } else //insert Salt { if (SaltUsed < (MixtureLen - DataLen)) { Mixture[i] = rand() % 0x100; BIT_SET(SaltMap[i / 8], i % 8); SaltUsed++; } else { Mixture[i] = Data[j++]; } } } } return PASS; } int Blend(u8* Dst, u8* Src, int Len, u8 ShiftType, u8 bRestore) { if (Dst == NULL || Src == NULL || Len == 0) return FAIL; int n = 0; if (ShiftType == 1) //u8 { for (int i = 0; i < Len; i++) { u8 x = Src[i]; n = ((GetBit1Num(x) + i + 3) % 7 + 1) * (bRestore ? (-1) : (1)); Dst[i] = LOOP_SHIFT_U8(x, n); } } // else if (ShiftType == 2) //u16 // { // for (int i = 0; i < (Len / ShiftType); i += ShiftType) // { // u16 x = HTK_U16(Src[i]); // n = ((GetBit1Num(x) + i + 5) % 15 + 1) * (bRestore ? (-1) : (1)); // HTK_U16(Dst[i]) = LOOP_SHIFT_U16(x, n); // } // // } // else if (ShiftType == 4) //u32 // { // for (int i = 0; i < (Len / ShiftType); i += ShiftType) // { // u32 x = HTK_U32(Src[i]); // n = ((GetBit1Num(x) + i + 7) % 31 + 1) * (bRestore ? (-1) : (1)); // HTK_U32(Dst[i]) = LOOP_SHIFT_U32(x, n); // } // } else { return FAIL; } return PASS; } int DataEncryption(u8* Data, int DataLen, u8* EncryptedData, int EncryptedDataLen, u8 bDecryption) { enum { DATA_LEN = 64, SALT_LEN = 64, MIXTURE_LEN = DATA_LEN + SALT_LEN, SALTMAP_LEN = GET_BOX_NUM(MIXTURE_LEN, 8), ALL_LEN = MIXTURE_LEN + SALTMAP_LEN, }; if (DataLen != DATA_LEN || EncryptedDataLen != ALL_LEN) return FAIL; u8* p = EncryptedData; if (bDecryption) { #ifdef FUNC_SALT_AND_BLEND_DEBUG XP("----------------------------\r\n"); HTK_ByteArray2HexStr_XP("EncryptedData", p, 0, ALL_LEN); #endif // if (Blend(p, p, ALL_LEN, 4, 1) == FAIL) // return FAIL; //#ifdef FUNC_SALT_AND_BLEND_DEBUG // HTK_ByteArray2HexStr_XP("Blend-Rest-4B", p, 0, ALL_LEN); //#endif // // if (Blend(p, p, ALL_LEN, 2, 1) == FAIL) // return FAIL; //#ifdef FUNC_SALT_AND_BLEND_DEBUG // HTK_ByteArray2HexStr_XP("Blend-Rest-2B", p, 0, ALL_LEN); //#endif if (Blend(p, p, ALL_LEN, 1, 1) == FAIL) return FAIL; #ifdef FUNC_SALT_AND_BLEND_DEBUG HTK_ByteArray2HexStr_XP("Blend-Rest-1B", p, 0, ALL_LEN); #endif if (Salt(p, MIXTURE_LEN, p + MIXTURE_LEN, SALTMAP_LEN, Data, DataLen, 1) == FAIL) return FAIL; #ifdef FUNC_SALT_AND_BLEND_DEBUG HTK_ByteArray2HexStr_XP("Salt-Restore ", Data, 0, DATA_LEN); #endif } else { #ifdef FUNC_SALT_AND_BLEND_DEBUG XP("----------------------------\r\n"); HTK_ByteArray2HexStr_XP("RAW Data ", Data, 0, DataLen); #endif if (Salt(p, MIXTURE_LEN, p + MIXTURE_LEN, SALTMAP_LEN, Data, DataLen, 0) == FAIL) return FAIL; #ifdef FUNC_SALT_AND_BLEND_DEBUG HTK_ByteArray2HexStr_XP("Salt ", p, 0, ALL_LEN); #endif if (Blend(p, p, ALL_LEN, 1, 0) == FAIL) return FAIL; #ifdef FUNC_SALT_AND_BLEND_DEBUG HTK_ByteArray2HexStr_XP("Blend-1B ", p, 0, ALL_LEN); #endif // if (Blend(p, p, ALL_LEN, 2, 0) == FAIL) // return FAIL; //#ifdef FUNC_SALT_AND_BLEND_DEBUG // HTK_ByteArray2HexStr_XP("Blend-2B ", p, 0, ALL_LEN); //#endif // // if (Blend(p, p, ALL_LEN, 4, 0) == FAIL) // return FAIL; //#ifdef FUNC_SALT_AND_BLEND_DEBUG // HTK_ByteArray2HexStr_XP("Blend-4B ", p, 0, ALL_LEN); //#endif } return PASS; } #endif //FUNC_SALT_AND_BLEND #endif //HTK #ifdef FUNC_OUTP_TYPE_E HTK_BOOL IsTypeEPlugIn(void) { return HAL_GPIO_ReadPin(IN_SocketE_Detect_GPIO_Port, IN_SocketE_Detect_Pin) ? HTK_FALSE : HTK_TRUE; } #endif #ifdef MODIFY_CPTASK_HEAD void Proc_CpTaskHead(HTK_BOOL bCSU) { if(Charger.Alarm_Code > 0) // alarm occur { if(Charger.Mode != MODE_ALARM) { #ifdef FUNC_BLOCK_CSU_CMD_SET_DUTY_WHEN_ALARM_CP_F_STATE Charger.m_bBlockCsuCpPwmDutyWhenAlarmCpF = HTK_TRUE; #endif HAL_GPIO_WritePin(OUT_StateE_GPIO_Port, OUT_StateE_Pin, GPIO_PIN_SET); setChargerMode(MODE_ALARM); user_pwm_setvalue(PWM_CH_CP, 0); timerEnable(TIMER_IDX_STATE_E, 4000); Charger.isAlarmSetPWM = OFF ; } // CP E or F to X1 if(timer[TIMER_IDX_STATE_E].isAlarm == ON) { HAL_GPIO_WritePin(OUT_StateE_GPIO_Port, OUT_StateE_Pin, GPIO_PIN_RESET); if ( Charger.isAlarmSetPWM == OFF ) { Charger.isAlarmSetPWM = ON ; user_pwm_setvalue(PWM_CH_CP, PWM_DUTY_FULL); } #ifdef FUNC_BLOCK_CSU_CMD_SET_DUTY_WHEN_ALARM_CP_F_STATE if (Charger.m_bBlockCsuCpPwmDutyWhenAlarmCpF) { Charger.m_bBlockCsuCpPwmDutyWhenAlarmCpF = HTK_FALSE; } #endif } } else { if(Charger.Mode != MODE_ALARM) { if (!bCSU) { HAL_GPIO_WritePin(OUT_StateE_GPIO_Port, OUT_StateE_Pin, GPIO_PIN_RESET); //CCS communication, so skip this line } timerDisable(TIMER_IDX_STATE_E); } #ifdef FIX_OUTP_PWM_WHEN_ALARM_RECOVER_IN_4SEC #ifdef FUNC_BLOCK_CSU_CMD_SET_DUTY_WHEN_ALARM_CP_F_STATE if (Charger.m_bBlockCsuCpPwmDutyWhenAlarmCpF) { Charger.m_bBlockCsuCpPwmDutyWhenAlarmCpF = HTK_FALSE; } #endif #endif } #ifdef FUNC_GUN_LOCK_TRIG_MODE if (Charger.m_bUseGunLock) { if (Charger.m_GunLockTrigMode == GL_TRIG_MODE_REQUEST) { if (Charger.CP_State == SYSTEM_STATE_A && Charger.m_GunLockRequestMode_LockDelayTick != 0) { Charger.m_GunLockRequestMode_LockDelayTick = 0; } if (Charger.Alarm_Code > 0) { if (Charger.Alarm_Code & ALARM_EMERGENCY_STOP) { if (Charger.am3352.isRequestOn && !GL_IsLock()) { if (Charger.CP_State != SYSTEM_STATE_A) { GL_Trig(GL_MODE_LOCK); } } else if (!Charger.am3352.isRequestOn && GL_IsLock()) { GL_Trig(GL_MODE_UNLOCK); } } else //other alarm { if (GL_IsLock()) { GL_Trig(GL_MODE_UNLOCK); } } } else { if (Charger.am3352.isRequestOn && !GL_IsLock()) { if (Charger.CP_State != SYSTEM_STATE_A) { if (Charger.m_GunLockRequestMode_LockDelayTick == 0) { Charger.m_GunLockRequestMode_LockDelayTick = HAL_GetTick(); } else { if (HTK_IsTimeout(Charger.m_GunLockRequestMode_LockDelayTick, 3000)) { GL_Trig(GL_MODE_LOCK); Charger.m_GunLockRequestMode_LockDelayTick = 0; } } } } else if (!Charger.am3352.isRequestOn && GL_IsLock()) { GL_Trig(GL_MODE_UNLOCK); } } } } #endif } #endif //MODIFY_CPTASK_HEAD #ifdef FUNC_FORCE_RUN_CSU_MODE_WITH_DC_MODELNAME void Update_McuCtrlMode(void) { while (!Charger.m_bModelNameDCReadOK) { osDelay(100); } if (IS_CSU_MOUNTED || Charger.m_bModelNameDC == 1) { Charger.memory.EVSE_Config.data.item.MCU_Control_Mode = MCU_CONTROL_MODE_CSU; DEBUG_INFO("#MCU_CONTROL_MODE_CSU\r\n"); } else { Charger.memory.EVSE_Config.data.item.MCU_Control_Mode = MCU_CONTROL_MODE_NO_CSU; DEBUG_INFO("#MCU_CONTROL_MODE_NO_CSU\r\n"); if (Charger.memory.EVSE_Config.data.item.AuthMode > AUTH_MODE_FREE) { Charger.memory.EVSE_Config.data.item.AuthMode = AUTH_MODE_FREE ; DEBUG_INFO("#AuthMode set defualt AUTH_MODE_FREE \r\n"); } if (Charger.memory.EVSE_Config.data.item.OfflinePolicy > RFID_USER_AUTH_NO_CHARGING) { Charger.memory.EVSE_Config.data.item.OfflinePolicy = RFID_USER_AUTH_FREE ; DEBUG_INFO("#OfflinePolicy set defualt RFID_USER_AUTH_FREE \r\n"); } } } #endif //FUNC_FORCE_RUN_CSU_MODE_WITH_DC_MODELNAME #ifdef FUNC_IDLE_UNTIL_READ_ALL_MEM void IdleUntilReadAllMemory(void) { while (!Charger.m_bReadAllMemory) { osDelay(10); } } #endif #ifdef FUNC_IDLE_UNTIL_INIT_METER_IC void IdleUntilInitMeterIC(void) { while (!Charger.m_bInitMeterIC) { osDelay(10); } } #endif #ifdef FUNC_GUN_LOCK #define GL_GPIO_IS_LOCK ((HAL_GPIO_ReadPin(IN_LOCK_Status_GPIO_Port, IN_LOCK_Status_Pin) == GPIO_PIN_RESET) ? HTK_FALSE : HTK_TRUE) #define GL_GPIO_UNLOCK(x) (HAL_GPIO_WritePin(OUT_UNLOCK_L_GPIO_Port, OUT_UNLOCK_L_Pin , ((x) == 0) ? GPIO_PIN_RESET : GPIO_PIN_SET)) #define GL_GPIO_LOCK(x) (HAL_GPIO_WritePin(OUT_LOCK_L_GPIO_Port, OUT_LOCK_L_Pin, ((x) == 0) ? GPIO_PIN_RESET : GPIO_PIN_SET)) #define GL_GPIO_PULSE_WIDTH (290) //must < 300ms void GL_Init(void) { GL_GPIO_LOCK(0); GL_GPIO_UNLOCK(0); GL_Unlock(); } void GL_Lock(void) { GL_GPIO_LOCK(1); osDelay(GL_GPIO_PULSE_WIDTH); GL_GPIO_LOCK(0); } void GL_Unlock(void) { GL_GPIO_UNLOCK(1); osDelay(GL_GPIO_PULSE_WIDTH); GL_GPIO_UNLOCK(0); } HTK_BOOL GL_IsLock(void) { return GL_GPIO_IS_LOCK; } void GL_Trig(GL_MODE mode) { static uint32_t LastTrigTick = 0; const uint32_t MIN_TRIG_TICK_PERIOD = 500; #ifdef MODIFY_GUN_LOCK_SPEC_TIMES_TO_ALARM if ( (mode == GL_MODE_LOCK && Charger.m_GunLock_Counter > GUN_LOCK_PULSE_MAX_TIMES) || (mode == GL_MODE_UNLOCK && Charger.m_GunUnlock_Counter > GUN_LOCK_PULSE_MAX_TIMES) ) { return; } #endif if (HTK_IsInTime(LastTrigTick, MIN_TRIG_TICK_PERIOD)) { return; } LastTrigTick = HAL_GetTick(); switch(mode) { case GL_MODE_UNLOCK: if (!Charger.m_bTrigGunUnlock) //Trig unlock process { Charger.m_bTrigGunUnlock = HTK_TRUE; timerEnable(TIMER_IDX_GUN_LOCK, GL_GPIO_PULSE_WIDTH); GL_GPIO_UNLOCK(1); #ifdef MODIFY_GUN_LOCK_SPEC_TIMES_TO_ALARM //Charger.m_GunUnlock_Counter++; XP("#GL Unlock-H (%d)\r\n", Charger.m_GunUnlock_Counter); #else XP("#GL Unlock-H\r\n"); #endif } break; case GL_MODE_LOCK: if (!Charger.m_bTrigGunLock) //Trig lock process { Charger.m_bTrigGunLock = HTK_TRUE; timerEnable(TIMER_IDX_GUN_LOCK, GL_GPIO_PULSE_WIDTH); GL_GPIO_LOCK(1); #ifdef MODIFY_GUN_LOCK_SPEC_TIMES_TO_ALARM //Charger.m_GunLock_Counter++; XP("#GL Lock-H (%d)\r\n", Charger.m_GunLock_Counter); #else XP("#GL Lock-H\r\n"); #endif } break; } } void GL_Proc(void) { if (timer[TIMER_IDX_GUN_LOCK].isAlarm) { if (Charger.m_bTrigGunUnlock) { XP("#GL Timer: %d\r\n", (uint32_t)(HAL_GetTick() - timer[TIMER_IDX_GUN_LOCK].startTime)); timerDisable(TIMER_IDX_GUN_LOCK); Charger.m_bTrigGunUnlock = HTK_FALSE; GL_GPIO_UNLOCK(0); #ifdef MODIFY_GUN_LOCK_SPEC_TIMES_TO_ALARM XP("#GL Unlock-L (%d)\r\n", Charger.m_GunUnlock_Counter); Charger.m_GunUnlock_Counter++; #else XP("#GL Unlock-L\r\n"); #endif } if (Charger.m_bTrigGunLock) { XP("#GL Timer: %d\r\n", (uint32_t)(HAL_GetTick() - timer[TIMER_IDX_GUN_LOCK].startTime)); timerDisable(TIMER_IDX_GUN_LOCK); Charger.m_bTrigGunLock = HTK_FALSE; GL_GPIO_LOCK(0); #ifdef MODIFY_GUN_LOCK_SPEC_TIMES_TO_ALARM XP("#GL Lock-L (%d)\r\n", Charger.m_GunLock_Counter); Charger.m_GunLock_Counter++; #else XP("#GL Lock-L\r\n"); #endif } } } #endif //FUNC_GUN_LOCK #ifdef FUNC_AX32_TRIG_LEAKAGE #define TRIG_LEAKAGE_GPIO_IS_TRIGGERING ((HAL_GPIO_ReadPin(OUT_TrigLeakage_GPIO_Port, OUT_TrigLeakage_Pin) == GPIO_PIN_RESET) ? HTK_FALSE : HTK_TRUE) #define TRIG_LEAKAGE_GPIO_SET(x) (HAL_GPIO_WritePin(OUT_TrigLeakage_GPIO_Port, OUT_TrigLeakage_Pin , ((x) == 0) ? GPIO_PIN_RESET : GPIO_PIN_SET)) #define TRIG_LEAKAGE_GPIO_PULSE_WIDTH (450) //must < 500ms #define TRIG_LEAKAGE_MAX_TIMES (3) void TrigLeakage_Init(void) { XP("#TrigLeakage_Init\r\n"); TRIG_LEAKAGE_GPIO_SET(0); } void TrigLeakage_Trig(void) { static uint8_t TrigTimes = 0; static uint32_t LastTrigTick = 0; const uint32_t MIN_TRIG_TICK_PERIOD = 3000; //ms if (HTK_IsInTime(LastTrigTick, MIN_TRIG_TICK_PERIOD)) { return; } LastTrigTick = HAL_GetTick(); if (!Charger.m_bTrigLeakage) //Trig process { if (TrigTimes < TRIG_LEAKAGE_MAX_TIMES) { TrigTimes++; XP("#TrigLeakage_Proc (%d)\r\n", TrigTimes); Charger.m_bTrigLeakage = HTK_TRUE; timerEnable(TIMER_IDX_TRIG_LEAKAGE, TRIG_LEAKAGE_GPIO_PULSE_WIDTH); TRIG_LEAKAGE_GPIO_SET(1); XP("#TRIG_LEAKAGE-H\r\n"); } else { XP("#TrigLeakage_Proc FAIL (MAX Trig times = %d)\r\n", TRIG_LEAKAGE_MAX_TIMES); } } } //void TrigLeakage_SimpleTrig(void) //{ // TRIG_LEAKAGE_GPIO_SET(1); // osDelay(TRIG_LEAKAGE_GPIO_PULSE_WIDTH); // TRIG_LEAKAGE_GPIO_SET(0); //} void TrigLeakage_Proc(void) { if (timer[TIMER_IDX_TRIG_LEAKAGE].isAlarm) { if (Charger.m_bTrigLeakage) { XP("#TRIG_LEAKAGE-Timer: %d\r\n", (uint32_t)(HAL_GetTick() - timer[TIMER_IDX_TRIG_LEAKAGE].startTime)); timerDisable(TIMER_IDX_TRIG_LEAKAGE); Charger.m_bTrigLeakage = HTK_FALSE; TRIG_LEAKAGE_GPIO_SET(0); XP("#TRIG_LEAKAGE-L\r\n"); } } } #endif //FUNC_AX32_TRIG_LEAKAGE #ifdef MODIFY_ALARM_DETECT_RELAY_WELDING_BLOCK void AlarmDetect_RelayWelding_UseADC(void) { #ifdef RELAY_WELDING_PROTECT #ifdef VO_DISABLE_RELAY_WELDING if (!Charger.m_VOCode.m_DisableRelayWelding) #else if (1) #endif //VO_DISABLE_RELAY_WELDING { uint16_t MAX_FAIL_TIMES = 1000; if (Charger.GroundingSystem == GROUNGING_SYSTEM_LL || Charger.GroundingSystem == GROUNGING_SYSTEM_LN) { if ((Charger.Relay_Action == GPIO_RELAY_ACTION_ON) && (Charger.Relay_isOperationCompleted == 0x11) && ((adc_value.ADC3_IN4_GMI_VL1.value*100*3.3/4095) < (Charger.Voltage[0]*0.011))) { #ifdef FUNC_NEW_RELAY_MONITOR double threshold = Charger.Voltage[0] * //0.01V Charger.alarm_spec.Relay_LL_DriveFault_Slop + Charger.alarm_spec.Relay_LL_DriveFault_Offs; if(adc_value.ADC2_IN5_Welding.value < threshold) #endif { if(Charger.counter.RELAY_Drive_Fualt.fail > MAX_FAIL_TIMES) { if(!(Charger.Alarm_Code & ALARM_RELAY_DRIVE_FUALT)) { Charger.counter.RELAY.isOccurInCharging = (((Charger.Mode == MODE_CHARGING) || (Charger.Mode == MODE_STOP))?ON:OFF); Charger.Alarm_Code |= ALARM_RELAY_DRIVE_FUALT; DEBUG_ERROR("Alarm Welding Voltage = %d.\r\n",adc_value.ADC2_IN5_Welding.value); DEBUG_ERROR("Alarm relay ON status fault occur.\r\n"); } } else { Charger.counter.RELAY_Drive_Fualt.fail++; #ifdef DEBUG_RELAY_MONITOR_SHOW_INFO XP("#RelayDriveFault(%d): W(%.2f) T(%.2f)\r\n", Charger.counter.RELAY_Drive_Fualt.fail, adc_value.ADC2_IN5_Welding.value, threshold); #endif } } else { Charger.counter.RELAY_Drive_Fualt.fail = 0 ; } } else if ((Charger.Relay_Action == GPIO_RELAY_ACTION_OFF) && (Charger.Relay_isOperationCompleted == 0x00) && ((adc_value.ADC3_IN4_GMI_VL1.value*100*3.3/4095) < (Charger.Voltage[0]*0.011))) { #ifdef FUNC_NEW_RELAY_MONITOR double threshold = Charger.Voltage[0] * //0.01V Charger.alarm_spec.Relay_LL_Welding_Slop + Charger.alarm_spec.Relay_LL_Welding_Offs; if(adc_value.ADC2_IN5_Welding.value > threshold) #endif { if(Charger.counter.RELAY.fail > MAX_FAIL_TIMES) { if(!(Charger.Alarm_Code & ALARM_RELAY_STATUS)) { Charger.counter.RELAY.isOccurInCharging = (((Charger.Mode == MODE_CHARGING) || (Charger.Mode == MODE_STOP))?ON:OFF); Charger.Alarm_Code |= ALARM_RELAY_STATUS; #ifdef FUNC_AX32_TRIG_LEAKAGE Charger.AlarmRelayWeldingOccurTick = HAL_GetTick(); #endif DEBUG_ERROR("Alarm Welding Voltage = %d.\r\n",adc_value.ADC2_IN5_Welding.value); DEBUG_ERROR("Alarm relay OFF status fault occur.\r\n"); } } else { Charger.counter.RELAY.fail++; #ifdef DEBUG_RELAY_MONITOR_SHOW_INFO XP("#RelayWelding(%d): W(%.2f) T(%.2f)\r\n", Charger.counter.RELAY.fail, adc_value.ADC2_IN5_Welding.value, threshold); #endif } } else { Charger.counter.RELAY.fail = 0 ; } } } //------------------------------------------------- } #endif //RELAY_WELDING_PROTECT } #ifdef FUNC_USE_RELAY_B_CONTACT HTK_BOOL IsRelayContact_Closed(void) { return HAL_GPIO_ReadPin(IN_Relay_b_Contact_GPIO_Port, IN_Relay_b_Contact_Pin) == GPIO_PIN_SET ? HTK_TRUE : HTK_FALSE; } void AlarmDetect_RelayWelding_UseGPIO(void) { #ifdef RELAY_WELDING_PROTECT #ifdef VO_DISABLE_RELAY_WELDING if (!Charger.m_VOCode.m_DisableRelayWelding) #else if (1) #endif //VO_DISABLE_RELAY_WELDING { uint16_t MAX_FAIL_TIMES = 1000; if (Charger.GroundingSystem == GROUNGING_SYSTEM_LL || Charger.GroundingSystem == GROUNGING_SYSTEM_LN) { if ((Charger.Relay_Action == GPIO_RELAY_ACTION_ON) && (Charger.Relay_isOperationCompleted == 0x11) && ((adc_value.ADC3_IN4_GMI_VL1.value*100*3.3/4095) < (Charger.Voltage[0]*0.011))) { if (!IsRelayContact_Closed()) { if(Charger.counter.RELAY_Drive_Fualt.fail > MAX_FAIL_TIMES) { if(!(Charger.Alarm_Code & ALARM_RELAY_DRIVE_FUALT)) { Charger.counter.RELAY.isOccurInCharging = (((Charger.Mode == MODE_CHARGING) || (Charger.Mode == MODE_STOP))?ON:OFF); Charger.Alarm_Code |= ALARM_RELAY_DRIVE_FUALT; //DEBUG_ERROR("Alarm Welding Voltage = %d.\r\n",adc_value.ADC2_IN5_Welding.value); DEBUG_ERROR("Alarm relay ON status fault occur.\r\n"); } } else { Charger.counter.RELAY_Drive_Fualt.fail++; } } else { Charger.counter.RELAY_Drive_Fualt.fail = 0 ; } } else if ((Charger.Relay_Action == GPIO_RELAY_ACTION_OFF) && (Charger.Relay_isOperationCompleted == 0x00) && ((adc_value.ADC3_IN4_GMI_VL1.value*100*3.3/4095) < (Charger.Voltage[0]*0.011))) { if (IsRelayContact_Closed()) { if(Charger.counter.RELAY.fail > MAX_FAIL_TIMES) { if(!(Charger.Alarm_Code & ALARM_RELAY_STATUS)) { Charger.counter.RELAY.isOccurInCharging = (((Charger.Mode == MODE_CHARGING) || (Charger.Mode == MODE_STOP))?ON:OFF); Charger.Alarm_Code |= ALARM_RELAY_STATUS; #ifdef FUNC_AX32_TRIG_LEAKAGE Charger.AlarmRelayWeldingOccurTick = HAL_GetTick(); #endif //DEBUG_ERROR("Alarm Welding Voltage = %d.\r\n",adc_value.ADC2_IN5_Welding.value); DEBUG_ERROR("Alarm relay OFF status fault occur.\r\n"); } } else { Charger.counter.RELAY.fail++; } } else { Charger.counter.RELAY.fail = 0 ; } } } } #endif //RELAY_WELDING_PROTECT } #endif //FUNC_USE_RELAY_B_CONTACT #endif //MODIFY_ALARM_DETECT_RELAY_WELDING_BLOCK #ifdef MODIFY_DC_RS485_UPGRADE_ISSUE void RS485_TX_Enable(void) { HAL_GPIO_WritePin(OUT_Meter_485_DE_GPIO_Port, OUT_Meter_485_DE_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(OUT_Meter_485_RE_GPIO_Port, OUT_Meter_485_RE_Pin, GPIO_PIN_SET); osDelay(1); } void RS485_TX_Disable(void) { HAL_GPIO_WritePin(OUT_Meter_485_DE_GPIO_Port, OUT_Meter_485_DE_Pin, GPIO_PIN_RESET); HAL_GPIO_WritePin(OUT_Meter_485_RE_GPIO_Port, OUT_Meter_485_RE_Pin, GPIO_PIN_RESET); } void Prefix_UartTX(uint8_t* TxBuf, uint8_t* RxBuf) { if (RxBuf == UART_RS485_rx_buffer) { RS485_TX_Enable(); TxBuf[1] = Charger.m_RS485SlaveAddr; //Update Slave Address } } void Postfix_UartTX(uint8_t* TxBuf, uint8_t* RxBuf) { if (RxBuf == UART_RS485_rx_buffer) { RS485_TX_Disable(); } } #endif //MODIFY_DC_RS485_UPGRADE_ISSUE #ifdef FUNC_AX80_ADD_TILT_SENSOR //#define TILT_GPIO_IS_ACTION_ON ((HAL_GPIO_ReadPin(IN_Tilt_ActOn_GPIO_Port, IN_Tilt_ActOn_Pin) == GPIO_PIN_RESET) ? HTK_FALSE : HTK_TRUE) //#define TILT_GPIO_TEST_SET(x) (HAL_GPIO_WritePin(OUT_Tilt_Test_GPIO_Port, OUT_Tilt_Test_Pin , ((x) == 0) ? GPIO_PIN_RESET : GPIO_PIN_SET)) #define TILT_GPIO_IS_ACTION_ON ((HAL_GPIO_ReadPin(IN_Tilt_ActOn_GPIO_Port, IN_Tilt_ActOn_Pin) == GPIO_PIN_RESET) ? HTK_TRUE : HTK_FALSE) #define TILT_GPIO_TEST_SET(x) (HAL_GPIO_WritePin(OUT_Tilt_Test_GPIO_Port, OUT_Tilt_Test_Pin , ((x) == 0) ? GPIO_PIN_RESET : GPIO_PIN_SET)) #define TILT_TRIG_LEAKAGE_GPIO_IS_TRIGGERING ((HAL_GPIO_ReadPin(OUT_Tilt_DrvLeakage_GPIO_Port, OUT_Tilt_DrvLeakage_Pin) == GPIO_PIN_RESET) ? HTK_FALSE : HTK_TRUE) #define TILT_TRIG_LEAKAGE_GPIO_SET(x) (HAL_GPIO_WritePin(OUT_Tilt_DrvLeakage_GPIO_Port, OUT_Tilt_DrvLeakage_Pin , ((x) == 0) ? GPIO_PIN_RESET : GPIO_PIN_SET)) #define TILT_TRIG_LEAKAGE_GPIO_PULSE_WIDTH (450) //must < 500ms #define TILT_TRIG_LEAKAGE_MAX_TIMES (3) void TILT_TrigLeakage_Init(void) { XP("#TILT_TrigLeakage_Init\r\n"); TILT_TRIG_LEAKAGE_GPIO_SET(0); TILT_GPIO_TEST_SET(1); osDelay(1); if (TILT_GPIO_IS_ACTION_ON) { XP("#Tilt sensor test OK\r\n"); } else { XP("#Tilt sensor test [NG]\r\n"); } TILT_GPIO_TEST_SET(0); } void TILT_TrigLeakage_Trig(void) { static uint8_t TrigTimes = 0; static uint32_t LastTrigTick = 0; const uint32_t MIN_TRIG_TICK_PERIOD = 3000; //ms if (HTK_IsInTime(LastTrigTick, MIN_TRIG_TICK_PERIOD)) { return; } LastTrigTick = HAL_GetTick(); if (!Charger.m_bTILT_TrigLeakage) //Trig process { if (TrigTimes < TILT_TRIG_LEAKAGE_MAX_TIMES) { TrigTimes++; XP("#TILT_TrigLeakage_Proc (%d)\r\n", TrigTimes); Charger.m_bTILT_TrigLeakage = HTK_TRUE; timerEnable(TIMER_IDX_TILT_TRIG_LEAKAGE, TILT_TRIG_LEAKAGE_GPIO_PULSE_WIDTH); TILT_TRIG_LEAKAGE_GPIO_SET(1); XP("#TILT_TRIG_LEAKAGE-H\r\n"); } else { XP("#TILT_TrigLeakage_Proc FAIL (MAX Trig times = %d)\r\n", TILT_TRIG_LEAKAGE_MAX_TIMES); } } } //void TILT_TrigLeakage_SimpleTrig(void) //{ // TILT_TRIG_LEAKAGE_GPIO_SET(1); // osDelay(TILT_TRIG_LEAKAGE_GPIO_PULSE_WIDTH); // TILT_TRIG_LEAKAGE_GPIO_SET(0); //} void TILT_TrigLeakage_Proc(void) { if (timer[TIMER_IDX_TILT_TRIG_LEAKAGE].isAlarm) { if (Charger.m_bTILT_TrigLeakage) { XP("#TILT_TRIG_LEAKAGE-Timer: %d\r\n", (uint32_t)(HAL_GetTick() - timer[TIMER_IDX_TILT_TRIG_LEAKAGE].startTime)); timerDisable(TIMER_IDX_TILT_TRIG_LEAKAGE); Charger.m_bTILT_TrigLeakage = HTK_FALSE; TILT_TRIG_LEAKAGE_GPIO_SET(0); XP("#TILT_TRIG_LEAKAGE-L\r\n"); } } } void AlarmDetect_TiltSensor(void) { #ifdef VO_DISABLE_DETECT_TILT_SENSOR if (!Charger.m_VOCode.m_DisableDetectTiltSensor) #else if (1) #endif { uint16_t MAX_FAIL_TIMES = 1000; if (TILT_GPIO_IS_ACTION_ON) { if (Charger.counter.TiltSensor.fail > MAX_FAIL_TIMES) { if(!(Charger.Alarm_Code & ALARM_TILT_SENSOR)) { Charger.Alarm_Code |= ALARM_TILT_SENSOR; Charger.AlarmTiltSensorOccurTick = HAL_GetTick(); DEBUG_ERROR("Alarm tilt sensor fault occur.\r\n"); } } else { Charger.counter.TiltSensor.fail++; } } else { Charger.counter.TiltSensor.fail = 0 ; } } } #endif //FUNC_AX80_ADD_TILT_SENSOR #ifdef FUNC_TASK_MONITOR void StartMonitorTask(void const * argument) { #ifdef FUNC_IDLE_UNTIL_READ_ALL_MEM IdleUntilReadAllMemory(); #endif memset(&Charger.m_TaskMonitor, 0, sizeof(Charger.m_TaskMonitor)); #ifdef FUNC_MODIFY_TASK_MONITOR_20231227 enum { ADC_RESET_MAX = 1 }; #else enum { ADC_RESET_MAX = 10 }; #endif while (1) { //ADC { static PTaskADCInfo p = &Charger.m_TaskMonitor.m_ADC; if ( ( p->m_ADC1_Counter[0] != 0 && p->m_ADC2_Counter[0] != 0 && p->m_ADC3_Counter[0] != 0 ) && ( p->m_ADC1_Counter[0] == p->m_ADC1_Counter[1] || p->m_ADC2_Counter[0] == p->m_ADC2_Counter[1] || p->m_ADC3_Counter[0] == p->m_ADC3_Counter[1] ) ) { p->m_ContinueResetCounter++; p->m_TotalResetCounter++; XP("#TaskMonitor: ADC[%d/%d](%d, %d, %d) ADC->SR(0x%04X, 0x%04X, 0x%04X) => [NG] Reset %s\r\n", p->m_ContinueResetCounter, p->m_TotalResetCounter, p->m_ADC1_Counter[0], p->m_ADC2_Counter[0], p->m_ADC3_Counter[0], ADC1->SR, ADC2->SR, ADC3->SR, p->m_ContinueResetCounter > ADC_RESET_MAX ? "MCU" : "ADC"); if (p->m_ContinueResetCounter > ADC_RESET_MAX) { NVIC_SystemReset(); } else { isDMAEnd_ADC1 = OFF; isDMAEnd_ADC2 = OFF; isDMAEnd_ADC3 = OFF; HAL_ADC_Stop_DMA(&hadc1); HAL_ADC_Stop_DMA(&hadc2); HAL_ADC_Stop_DMA(&hadc3); //__HAL_ADC_CLEAR_FLAG(&hadc1, ADC_FLAG_STRT); //__HAL_ADC_CLEAR_FLAG(&hadc2, ADC_FLAG_STRT); //__HAL_ADC_CLEAR_FLAG(&hadc3, ADC_FLAG_STRT); MX_DMA_Init(); MX_ADC1_Init(); MX_ADC2_Init(); MX_ADC3_Init(); if(HAL_ADC_Start_DMA(&hadc1, (uint32_t*)&ADC1_Buffer, ADC1_CHANEL_COUNT*ADC1_SAMPLE_COUNT)!=HAL_OK)Error_Handler(); if(HAL_ADC_Start_DMA(&hadc2, (uint32_t*)&ADC2_Buffer, ADC2_CHANEL_COUNT*ADC2_SAMPLE_COUNT)!=HAL_OK)Error_Handler(); if(HAL_ADC_Start_DMA(&hadc3, (uint32_t*)&ADC3_Buffer, ADC3_CHANEL_COUNT*ADC3_SAMPLE_COUNT)!=HAL_OK)Error_Handler(); } } else { p->m_ContinueResetCounter = 0; p->m_ADC1_Counter[1] = p->m_ADC1_Counter[0]; p->m_ADC2_Counter[1] = p->m_ADC2_Counter[0]; p->m_ADC3_Counter[1] = p->m_ADC3_Counter[0]; } } osDelay(300); } } #endif //FUNC_TASK_MONITOR #ifdef FUNC_RS485_BLE_SW void RS485_SW(HTK_BOOL bON) { XP("#\r\n", (bON ? "ON" : "OFF")); HAL_GPIO_WritePin(RS485_SW_GPIO_Port, RS485_SW_Pin, bON ? GPIO_PIN_SET : GPIO_PIN_RESET); } void BLE_SW(HTK_BOOL bON) { XP("#\r\n", (bON ? "ON" : "OFF")); HAL_GPIO_WritePin(BLE_SW_GPIO_Port, BLE_SW_Pin, bON ? GPIO_PIN_SET : GPIO_PIN_RESET); } #endif //FUNC_RS485_BLE_SW #ifdef FUNC_LIN_EN_SW void LIN_EN(HTK_BOOL bEnable) { XP("#\r\n", (bEnable ? "Enable" : "Disable")); HAL_GPIO_WritePin(OUT_USB_DriveBus_GPIO_Port, OUT_USB_DriveBus_Pin, bEnable ? GPIO_PIN_SET : GPIO_PIN_RESET); } void LIN_SW(HTK_BOOL bUseLIN) { XP("#\r\n", (bUseLIN ? "LIN" : "PWM")); //TMUX6219 Table8-1 // EN SEL Select Source // 0 X All off // 1 0 S1 (CP-LIN) // 1 1 S2 (CP-PWM) HAL_GPIO_WritePin(LIN_PWM_SW_GPIO_Port, LIN_PWM_SW_Pin, bUseLIN ? GPIO_PIN_RESET : GPIO_PIN_SET); } #endif //FUNC_LIN_EN_SW #ifdef FUNC_LIN_CP void StartLinCpTask(void const * argument) { #ifdef FUNC_IDLE_UNTIL_READ_ALL_MEM IdleUntilReadAllMemory(); #endif do { osDelay(1000); } while (!Charger.m_bUseLinCP); static PLinCP p = NULL; if (p == NULL) { p = (PLinCP)HTK_Malloc(sizeof(LinCP)); if (p != NULL) { Charger.m_pLinCP = p; LIN_Init(p, USART1); } } LIN_EN(HTK_TRUE); //Test //LIN_SW(HTK_TRUE); //LIN_SW(HTK_FALSE); // SeVersionList data; // memset(&data, 0, sizeof(data)); // data.SeSelectedVersion = 0x01; // data.B1 = 0x02; // data.SeVersionPageNumber = 0x03; // data.SeSupportedVersion1 = 0x04; // data.SeSupportedVersion2 = 0x05; // data.SeSupportedVersion3 = 0x06; // data.SeSupportedVersion4 = 0x07; // data.SeSupportedVersion5 = 0x08; while (1) { // LIN_TxHeaderData(p, LINCPID_SE_VERSION_LIST, &data, sizeof(data)); // osDelay(30); // LIN_TxHeader(p, LINCPID_EV_VERSION_LIST); // osDelay(30); osDelay(1000); } } #endif //FUNC_LIN_CP #ifdef FUNC_AW48_NET_LED void Proc_NetLedActionSubState(void) { if (Charger.am3352.NetLedActionState == NET_LED_ACTION_ALL_CONNECTING) { //if(blinker[BLINKER_IDX_LED_NET].blinkisFinish) { if (Charger.am3352.NetLedActionSubState == NET_LED_ACTION_LTE_CONNECTING_H) { setNetLedMotion(Charger.am3352.NetLedActionSubState = NET_LED_ACTION_WIFI_CONNECTING_H); } else if (Charger.am3352.NetLedActionSubState == NET_LED_ACTION_WIFI_CONNECTING_H) { setNetLedMotion(Charger.am3352.NetLedActionSubState = NET_LED_ACTION_ETHERNET_CONNECTING_H); } else if (Charger.am3352.NetLedActionSubState == NET_LED_ACTION_ETHERNET_CONNECTING_H) { setNetLedMotion(Charger.am3352.NetLedActionSubState = NET_LED_ACTION_LTE_CONNECTING_H); } } } } #endif //FUNC_AW48_NET_LED #ifdef FUNC_AES256 HTK_BOOL AES256_Verify(u8* Data, int DataLen, u8* Key, u8* IV, u8* RemoteEncryptedData) { u8 PlainData[16] = { 0 }; memcpy(PlainData, Data, HTK_GET_VAL_MIN(DataLen, 16)); u8 EncryptedData[16]; size_t encryptedSize; // Fill padding data to 16 byte with PKCS7 PKCS7_Pad(PlainData, 4, 16, PlainData); //XP("strlen((char*)PlainData) = %d\r\n", strlen((char*)PlainData)); //?????????????????? // Encrypt data //AES256MainCBC(Key, PlainData, IV, strlen((char*)PlainData), EncryptedData, &encryptedSize, true); AES256MainCBC(Key, PlainData, IV, 16, EncryptedData, &encryptedSize, true); // DEBUG_INFO("AES256 Check ============================================\r\n"); // DEBUG_INFO("EncryptedSize: %d\r\n", encryptedSize); // for(uint8_t idx=0;idx<16;idx++) // DEBUG_INFO("PlainData[%d]: %02X\r\n", idx, PlainData[idx]); HTK_BOOL bRes = HTK_TRUE; for(uint8_t idx=0;idx<16;idx++) { // DEBUG_INFO("EncryptedData[%d]: %02X, RemoteEncryptedData[%d]: %02X\r\n", // idx, EncryptedData[idx], idx, RemoteEncryptedData[idx]); if (RemoteEncryptedData[idx] != EncryptedData[idx]) { bRes = HTK_FALSE; break; } } if (bRes) { DEBUG_INFO("\r\n"); return HTK_TRUE; } else { DEBUG_INFO("\r\n"); return HTK_FALSE; } } void AES256_Test(void) { /* AES test */ uint8_t Key[32] = { 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12 }; uint8_t IV[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }; uint8_t PlainData[] = { 0x11, 0x22, 0x33, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; uint8_t encryptedData[16]; size_t encryptedSize; // Fill padding data to 16 byte with PKCS7 PKCS7_Pad(PlainData, 4, 16, PlainData); // Encrypt data AES256MainCBC((u8*)Key, PlainData, IV, strlen((char*)PlainData), encryptedData, &encryptedSize, true); DEBUG_INFO("encryptedSize: %d\r\n", encryptedSize); for(uint8_t idx=0;idx<16;idx++) DEBUG_INFO("PlainData[%d]: %02X\r\n", idx, PlainData[idx]); for(uint8_t idx=0;idx<16;idx++) DEBUG_INFO("encryptedData[%d]: %02X\r\n", idx, encryptedData[idx]); { u8 Data[4] = { 0x11, 0x22, 0x33, 0x44 }; AES256_Verify(Data, 4, (u8*)Key, IV, encryptedData); } } #endif //FUNC_AES256 #ifdef FUNC_ECDSA HTK_BOOL ECDSA_Verify(u8* PublicKey, int PublicKeyLen, u8* Hash, int HashLen, u8* Signature, int SignatureLen) { cmox_ecc_handle_t Ecc_Ctx; cmox_ecc_retval_t retval; uint32_t fault_check = 0; if (PublicKeyLen != 64 || HashLen != 32 || SignatureLen != 64) { return HTK_FALSE; } enum { WORKING_BUFFER_SIZE = 2000 }; uint8_t* Working_Buffer = (uint8_t*)HTK_Malloc(WORKING_BUFFER_SIZE); if (Working_Buffer == NULL) { return HTK_FALSE; } HTK_BOOL bRtn = HTK_FALSE; if (cmox_initialize(NULL) != CMOX_INIT_SUCCESS) { XP("\r\n"); bRtn = HTK_FALSE; } else { cmox_ecc_construct(&Ecc_Ctx, CMOX_ECC256_MATH_FUNCS, Working_Buffer, WORKING_BUFFER_SIZE); for(uint8_t idx=0;idx<2;idx++) //2nd function call will get the correct result { retval = cmox_ecdsa_verify( &Ecc_Ctx, /* ECC context */ #ifdef FUNC_CSU_VERIFY_USE_ECDSA_CMOX_ECC_CURVE_SECP256R1 CMOX_ECC_CURVE_SECP256R1, //more safe then SECP256K1 #else CMOX_ECC_CURVE_SECP256K1, /* SECP256K1 ECC curve selected */ #endif PublicKey, PublicKeyLen, /* Public key for verification */ Hash, CMOX_SHA256_SIZE, /* Digest to verify */ Signature, SignatureLen, /* Data buffer to receive signature */ &fault_check); /* Fault check variable: to ensure no fault injection occurs during this API call */ static char* CMOX_ECC_RETVAL_STR[] = { "UNKNOW", //0 "SUCCESS", //1 "ERR_INTERNAL", //2 "ERR_BAD_PARAMETERS", //3 "ERR_INVALID_PUBKEY", //4 "ERR_INVALID_SIGNATURE", //5 "ERR_WRONG_RANDOM", //6 "ERR_MEMORY_FAIL", //7 "ERR_MATHCURVE_MISMATCH", //8 "ERR_ALGOCURVE_MISMATCH", //9 "AUTH_SUCCESS", //10 "AUTH_FAIL" //11 }; int StrIdx = 0; switch (retval) { case CMOX_ECC_SUCCESS: StrIdx = 1; break; case CMOX_ECC_ERR_INTERNAL: StrIdx = 2; break; case CMOX_ECC_ERR_BAD_PARAMETERS: StrIdx = 3; break; case CMOX_ECC_ERR_INVALID_PUBKEY: StrIdx = 4; break; case CMOX_ECC_ERR_INVALID_SIGNATURE: StrIdx = 5; break; case CMOX_ECC_ERR_WRONG_RANDOM: StrIdx = 6; break; case CMOX_ECC_ERR_MEMORY_FAIL: StrIdx = 7; break; case CMOX_ECC_ERR_MATHCURVE_MISMATCH: StrIdx = 8; break; case CMOX_ECC_ERR_ALGOCURVE_MISMATCH: StrIdx = 9; break; case CMOX_ECC_AUTH_SUCCESS: StrIdx = 10; break; case CMOX_ECC_AUTH_FAIL: StrIdx = 11; break; default: StrIdx = 0; break; } XP("[%d] retval = 0x%08X (CMOX_ECC_%s), fault_check = 0x%08X\r\n", idx, retval, CMOX_ECC_RETVAL_STR[StrIdx], fault_check); } /* Verify API returned value */ //XP("retval = 0x%08X, fault_check = 0x%08X\r\n", retval, fault_check); if ((retval == CMOX_ECC_AUTH_SUCCESS) && (fault_check == CMOX_ECC_AUTH_SUCCESS)) { XP("\r\n"); bRtn = HTK_TRUE; } else { XP("\r\n"); bRtn = HTK_FALSE; } cmox_ecc_cleanup(&Ecc_Ctx); } HTK_Free(Working_Buffer); return bRtn; } void ECDSA_VerifyTest(void) { u8 Public_Key[] = { 0x5A, 0x3D, 0x38, 0xEC, 0x72, 0x37, 0xA1, 0xB5, 0xF5, 0x2F, 0x3C, 0x34, 0x3C, 0x6E, 0x73, 0xBE, 0x31, 0x9B, 0x15, 0x13, 0xF5, 0x92, 0x9B, 0xE9, 0xD3, 0x9A, 0xD0, 0x43, 0xA7, 0xBC, 0xD1, 0x26, 0x81, 0x9C, 0x9A, 0x48, 0x1A, 0x3B, 0xE5, 0x32, 0xEE, 0xA9, 0x9D, 0x3C, 0x67, 0x30, 0x21, 0x63, 0xF4, 0x26, 0x56, 0x22, 0xE5, 0x39, 0x49, 0xEC, 0x54, 0x63, 0x6D, 0x2E, 0x98, 0x40, 0xE0, 0x19 }; u8 Known_Hash[] = { 0xB2, 0xED, 0x99, 0x21, 0x86, 0xA5, 0xCB, 0x19, 0xF6, 0x66, 0x8A, 0xAD, 0xE8, 0x21, 0xF5, 0x02, 0xC1, 0xD0, 0x09, 0x70, 0xDF, 0xD0, 0xE3, 0x51, 0x28, 0xD5, 0x1B, 0xAC, 0x46, 0x49, 0x91, 0x6C }; u8 Known_Signature[] = { 0x0F, 0x80, 0xBE, 0x7F, 0x68, 0xE9, 0x73, 0x80, 0x22, 0x9A, 0xFF, 0x81, 0xEC, 0xE4, 0xE8, 0xCA, 0xB7, 0x5D, 0xF6, 0x2D, 0x69, 0xEC, 0x06, 0xB9, 0xCA, 0x6D, 0x14, 0x72, 0x7A, 0x1C, 0xBE, 0xA7, 0xC7, 0xE5, 0x1A, 0xF3, 0x43, 0x7D, 0xFD, 0x60, 0x04, 0x5B, 0xE7, 0xF1, 0xB8, 0x9C, 0xEA, 0x19, 0xE8, 0x1D, 0xF0, 0xA7, 0xA7, 0x4F, 0xE3, 0x39, 0xFE, 0xB8, 0x0B, 0xF2, 0xFA, 0x1A, 0x93, 0x44 }; ECDSA_Verify(Public_Key, sizeof(Public_Key), Known_Hash, sizeof(Known_Hash), Known_Signature, sizeof(Known_Signature)); } #endif //FUNC_ECDSA #ifdef FUNC_VERIFY_TASK void StartVerifyTask(void const * argument) { static u8* p = Charger.m_VerifyTaskRxBuf; #ifdef FUNC_CSU_VERIFY_USE_ECDSA static u8* pKey = Charger.memory.EVSE_Config.data.item.m_CsuPublicKey; #else //Generator: https://seanwasere.com/generate-random-hex/ const u8 AES256_KEY[32] = { 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12 }; #endif while (1) { //#ifdef FIXHW_AW48_CSU_EXIST_DELAY_CHECK // if (Charger.m_bModelNameAW48_1P && Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_NO_CSU) // { // AW48_CheckCSU(); // } //#endif if (Charger.m_bCsuSignInMustVerify || Charger.m_bCsuUpgradeFwMustVerify) { if (Charger.m_bCsuSignInMustVerify && !Charger.m_bCsuSignInVerifyOK && Charger.m_bRunCsuSignInVerify) { #ifdef FUNC_CSU_VERIFY_USE_ECDSA Charger.m_bCsuSignInVerifyOK = ECDSA_Verify(pKey, CSU_PUBLIC_KEY_LEN, &p[10], 32, &p[42], 64); #else Charger.m_bCsuSignInVerifyOK = AES256_Verify(&p[6], 4, (u8*)AES256_KEY, &p[10], &p[26]); #endif Charger.m_bRunCsuSignInVerify = HTK_FALSE; if (Charger.m_bCsuSignInVerifyOK && Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_NO_CSU) { Update_McuCtrlMode(); } } else if (Charger.m_bCsuUpgradeFwMustVerify && !Charger.m_bCsuUpgradeFwVerifyOK && Charger.m_bRunCsuUpgradeFwVerify) { #ifdef FUNC_CSU_VERIFY_USE_ECDSA Charger.m_bCsuUpgradeFwVerifyOK = ECDSA_Verify(pKey, CSU_PUBLIC_KEY_LEN, &p[10], 32, &p[42], 64); #else Charger.m_bCsuUpgradeFwVerifyOK = AES256_Verify(&p[6], 4, (u8*)AES256_KEY, &p[10], &p[26]); #endif Charger.m_bRunCsuUpgradeFwVerify = HTK_FALSE; } } osDelay(100); } } #endif //FUNC_VERIFY_TASK /* USER CODE END Application */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/