/* 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 "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"
/* 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 */
uint32_t alarm_record_code[32] =
{
0x00012200, // Input OVP
0x00012203, // Input UVP
0x00012216, // Output 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, // Circuit short
0x00011033, // Maximum Output Current setup error
0x00011010, // AC output relay driving fault
0x00011035, // Ble module broken
0x00000000,
0x00000000,
0x00000000,
0x00000000,
0x00000000,
0x00000000,
0x00000000,
0x00000000,
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;
/* 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);
uint8_t recordChargingHis(uint8_t isColdLoadPickUp, uint32_t statusCode);
void setLedMotion(uint8_t action);
void SetADCWDGBoundary( void);
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) ;
uint8_t WatchDogLeakRawDataCheck_Event(void) ;
uint16_t getBrightnessDuty(uint16_t max_duty);
void parseVersionInfoFromModelname(void);
void HTK_GetBufferString(const u8* buf, const u8 len, char* szOutBuf);
void HTK_PrintBufferString(const u8* buf, const u8 len);
#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 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
/* 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);
void StartRfidTask(void const * argument);
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);
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_TYPE == FW_VER_TYPE_DEVELOP)
sprintf(Charger.Ver_FW, "D%4.2f.X0.0007.P0", FW_VER_NUM * 0.01);
#elif (FW_VER_TYPE == FW_VER_TYPE_FORMAL)
#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
//---------------
//sprintf(Charger.Ver_FW, "T%4.2f.X0.0011.P0", FW_VER_NUM * 0.00001);
#else //FORCE_VER_WITH_T_PREFIX
sprintf(Charger.Ver_FW, "V%4.2f.X0.0007.P0", FW_VER_NUM * 0.00001);
#endif //FORCE_VER_WITH_T_PREFIX
#elif (FW_VER_TYPE == FW_VER_TYPE_TEST)
sprintf(Charger.Ver_FW, "T%4.2f.X0.0007.P0", FW_VER_NUM * 0.00001);
#endif
#else //FUNC_FW_VER_TRACE
//sprintf(Charger.Ver_FW, "V0.05.X0.0007.P0");
//sprintf(Charger.Ver_FW, "V0.06.X0.0007.P0"); //20210611
#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);
}
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
UpdateFirmwareVersion();
sprintf(Charger.Ver_HW, "RA2");
HAL_GPIO_WritePin(OUT_PHY_Reset_GPIO_Port, OUT_PHY_Reset_Pin, GPIO_PIN_RESET);
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);
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 */
osThreadDef(adcTask, StartAdcTask, osPriorityRealtime, 0, 256);
adcTaskHandle = osThreadCreate(osThread(adcTask), NULL);
/* definition and creation of timeoutTask */
osThreadDef(timeoutTask, StartTimeoutTask, osPriorityAboveNormal, 0, 128);
timeoutTaskHandle = osThreadCreate(osThread(timeoutTask), NULL);
/* definition and creation of rfidTask */
osThreadDef(rfidTask, StartRfidTask, osPriorityIdle, 0, 256);
rfidTaskHandle = osThreadCreate(osThread(rfidTask), NULL);
/* definition and creation of led_speakerTask */
osThreadDef(led_speakerTask, StartLedSpeakerTask, osPriorityAboveNormal, 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
/* USER CODE BEGIN RTOS_THREADS */
/* add threads, ... */
/* 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 */
/* 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
#ifndef DISABLE_PRINT_RTOS_MSG
uint8_t pcWriteBuffer[1024];
#endif
uint8_t endFlag[4]={0x55,0xaa,0x55,0xaa};
__IO uint32_t flash;
uint32_t checksum;
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_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
dbgIdx++;
break;
case 1:
#ifdef FUNC_EMPX10_CUSTOMIZE
DEBUG_INFO("Firmware version: %s (AWeMP/ID:%d)\r\n", Charger.Ver_FW, Charger.m_EMPX10_RS485_ClientAddr);
#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
//DEBUG_INFO("MCU_Control_Mode: %x\r\n",Charger.memory.EVSE_Config.data.item.MCU_Control_Mode);
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");
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_SHOW_RELAY_INFO
DEBUG_INFO("Relay action: Main(%d)\r\n", Charger.Relay_Action);
#endif
dbgIdx++;
break;
case 3:
DEBUG_INFO("Original Voltage[0]: %f\r\n", adc_value.ADC3_IN9_Voltage_L1.value/100.0);
DEBUG_INFO("Original Current[0]: %f\r\n", adc_value.ADC3_IN7_Current_L1.value/100.0);
dbgIdx++;
break;
case 4:
DEBUG_INFO("Correction Voltage[0]: %f\r\n", Charger.Voltage[0]/100.0);
DEBUG_INFO("Correction Current[0]: %f\r\n", Charger.Current[0]/100.0);
dbgIdx++;
break;
case 5:
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 );
DEBUG_INFO("Charger.temperature.SystemAmbientTemp : %d(unit:C)\r\n", Charger.temperature.SystemAmbientTemp);
dbgIdx++;
break;
case 6:
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 7:
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));
#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));
#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");
}
DEBUG_INFO("CP state: %d\r\n", Charger.CP_State);
dbgIdx++;
break;
case 8:
DEBUG_INFO("Power_Consumption_Cumulative: %d (0.0001KWH)\r\n", Charger.memory.EVSE_Config.data.item.Power_Consumption_Cumulative);
DEBUG_INFO("Current rating value: %d A\r\n", Charger.maxRatingCurrent);
if (Charger.memory.EVSE_Config.data.item.MaxChargingCurrent>=20)
{
DEBUG_INFO("OCP tigger UL: %d\r\n", (Charger.memory.EVSE_Config.data.item.MaxChargingCurrent*110)-100 );
DEBUG_INFO("OCP tigger IEC: %d\r\n", (Charger.memory.EVSE_Config.data.item.MaxChargingCurrent*125)-100 );
}
else
{
DEBUG_INFO("OCP tigger UL: %d\r\n", (Charger.memory.EVSE_Config.data.item.MaxChargingCurrent+1)*100 );
DEBUG_INFO("OCP tigger IEC: %d\r\n", (Charger.memory.EVSE_Config.data.item.MaxChargingCurrent*125)-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
dbgIdx++;
break;
case 9:
if (Charger.Alarm_Code & ALARM_OVER_VOLTAGE)
DEBUG_INFO("ALARM_OVER_VOLTAGE \n\r");
if (Charger.Alarm_Code & ALARM_UNDER_VOLTAGE)
DEBUG_INFO("ALARM_UNDER_VOLTAGE \n\r");
if (Charger.Alarm_Code & ALARM_OVER_CURRENT)
DEBUG_INFO("ALARM_OVER_CURRENT \n\r");
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");
dbgIdx++;
break;
case 10:
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");
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_CIRCUIT_SHORT)
DEBUG_INFO("ALARM_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");
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 DEBUG_EMPX10_COMM
if (CurRxBuf == UART_RS485_rx_buffer)
{
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 //DEBUG_EMPX10_COMM
#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);
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_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;
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 ];
for(uint16_t idx=0;idx<(tx[4] | (tx[5]<<8));idx++)
{
chksum ^= tx[6 + idx];
}
tx[16] = chksum;
/*
tx[8] = ((Charger.memory.hisAlarm.data.item[UART_IAP_rx_buffer[7] | (UART_IAP_rx_buffer[8]<<8)].DateTime.year>>0) & 0xff);
tx[9] = ((Charger.memory.hisAlarm.data.item[UART_IAP_rx_buffer[7] | (UART_IAP_rx_buffer[8]<<8)].DateTime.year>>8) & 0xff);
tx[10] = ((Charger.memory.hisAlarm.data.item[UART_IAP_rx_buffer[7] | (UART_IAP_rx_buffer[8]<<8)].DateTime.month>>0) & 0xff);;
tx[11] = ((Charger.memory.hisAlarm.data.item[UART_IAP_rx_buffer[7] | (UART_IAP_rx_buffer[8]<<8)].DateTime.day>>0) & 0xff);
tx[12] = ((Charger.memory.hisAlarm.data.item[UART_IAP_rx_buffer[7] | (UART_IAP_rx_buffer[8]<<8)].DateTime.hour>>0) & 0xff);
tx[13] = ((Charger.memory.hisAlarm.data.item[UART_IAP_rx_buffer[7] | (UART_IAP_rx_buffer[8]<<8)].DateTime.min>>0) & 0xff);
tx[14] = ((Charger.memory.hisAlarm.data.item[UART_IAP_rx_buffer[7] | (UART_IAP_rx_buffer[8]<<8)].DateTime.sec>>0) & 0xff);
tx[15] = ((Charger.memory.hisAlarm.data.item[UART_IAP_rx_buffer[7] | (UART_IAP_rx_buffer[8]<<8)].alarmCode>>0) & 0xff);
tx[16] = ((Charger.memory.hisAlarm.data.item[UART_IAP_rx_buffer[7] | (UART_IAP_rx_buffer[8]<<8)].alarmCode>>8) & 0xff);
tx[17] = ((Charger.memory.hisAlarm.data.item[UART_IAP_rx_buffer[7] | (UART_IAP_rx_buffer[8]<<8)].alarmCode>>16) & 0xff);
tx[18] = ((Charger.memory.hisAlarm.data.item[UART_IAP_rx_buffer[7] | (UART_IAP_rx_buffer[8]<<8)].alarmCode>>24) & 0xff);
tx[19] = ((Charger.memory.hisAlarm.data.item[UART_IAP_rx_buffer[7] | (UART_IAP_rx_buffer[8]<<8)].mode>>0) & 0xff);
tx[20] = ((Charger.memory.hisAlarm.data.item[UART_IAP_rx_buffer[7] | (UART_IAP_rx_buffer[8]<<8)].isRecover>0) & 0xff);
for(uint16_t idx=0;idx<(tx[4] | (tx[5]<<8));idx++)
{
chksum ^= tx[6 + idx];
}
tx[21] = 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;
#ifdef FUNC_ZERO_CURRENT_WHEN_OUTP_OFF
if (Charger.Relay_Action == GPIO_RELAY_ACTION_ON)
{
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);
}
else
{
tx[6] = 0;
tx[7] = 0;
tx[8] = 0;
tx[9] = 0;
tx[10] = 0;
tx[11] = 0;
}
#else
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);
#endif
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;
//edward 2019/08/27
case PROTOCOL_MESSAGE_QUERY_EVSE_STATE:
tx_len = 21;
tx[0] = 0xaa;
tx[1] = PROTOCOL_ADDR;
tx[2] = CurRxBuf[1];
tx[3] = PROTOCOL_MESSAGE_QUERY_EVSE_STATE;
tx[4] = 14;
tx[5] = 0x00;
tx[6] = Charger.CP_State;
#ifdef MODIFY_AC_EVSE_STATUS_MAX_CHARGING_CURRENT_VARIABLE
tx[7] = (Charger.AC_MaxChargingCurrentOrDuty&0xff);
tx[8] = Charger.AC_MaxChargingCurrentOrDuty>>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;
tx[13] = 0x00;
if(Charger.Relay_Action == GPIO_RELAY_ACTION_ON)
{
tx[14] = 0x01;
}
else
{
tx[14] = 0x00;
}
tx[15] = 0x00;
tx[16] = 0x00;
tx[17] = 0x00;
tx[18] = Charger.maxRatingCurrent;
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;
tmpBuf += (HAL_GPIO_ReadPin(IN_GridType_Select_GPIO_Port, IN_GridType_Select_Pin)?0:1)<<4;
tmpBuf += (HAL_GPIO_ReadPin(IN_Grid_Groundding_GPIO_Port, IN_Grid_Groundding_Pin)?0:1)<<5;
tx[19] = tmpBuf;
for(uint16_t idx=0;idx<(tx[4] | (tx[5]<<8));idx++)
{
chksum ^= tx[6 + idx];
}
tx[20] = 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;
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;
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:
tx_len = 11;
tx[0] = 0xaa;
tx[1] = PROTOCOL_ADDR;
tx[2] = CurRxBuf[1];
tx[3] = PROTOCOL_MESSAGE_QUERY_POWER_CONSUME;
tx[4] = 4;
tx[5] = 0x00;
tx[6] = ((Charger.memory.EVSE_Config.data.item.Power_Consumption_Cumulative/100)&0xff);
tx[7] = ((Charger.memory.EVSE_Config.data.item.Power_Consumption_Cumulative/100)&0xff00)>>8;
tx[8] = ((Charger.memory.EVSE_Config.data.item.Power_Consumption_Cumulative/100)&0xff0000)>>16;
tx[9] = ((Charger.memory.EVSE_Config.data.item.Power_Consumption_Cumulative/100)&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_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;
/*
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.ModelName) && 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]))
{
//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;
#ifdef FUNC_SIMU_CHARGE_CURRENT_OUTPUT
case SIMU_CHARGE_CURRENT_CMD:
Charger.m_bEnableSimuChargeCurrent =
(
(
CurRxBuf[7] == SIMU_CHARGE_CURRENT_ON &&
HTK_U16(CurRxBuf[8]) == SIMU_CHARGE_CURRENT_ON_PWD
) ? 1 : 0
);
XP("#CSU_ParameterSimuCurr: %s\r\n", Charger.m_bEnableSimuChargeCurrent ? "ON" : "OFF");
break;
#endif //FUNC_SIMU_CHARGE_CURRENT_OUTPUT
#ifdef FUNC_SWITCH_RELAY_WELDING_PROTECT
case SIMU_SWITCH_RELAY_WELDING_CMD:
Charger.m_bDisableRelayWelding =
(
(
CurRxBuf[7] == SIMU_SWITCH_RELAY_WELDING_DISABLE &&
HTK_U16(CurRxBuf[8]) == SIMU_SWITCH_RELAY_WELDING_PWD
) ? 1 : 0
);
XP("#CSU_ParameterDisableRelayWelding: %s\r\n", Charger.m_bDisableRelayWelding ? "ON" : "OFF");
Charger.m_bDisableCCID = Charger.m_bDisableRelayWelding;
XP("#CSU_ParameterDisableCCID: %s\r\n", Charger.m_bDisableCCID ? "ON" : "OFF");
Charger.m_bSetOCP_32A = Charger.m_bDisableRelayWelding;
XP("#CSU_ParameterSetOCP_32A: %s\r\n", Charger.m_bSetOCP_32A ? "ON" : "OFF");
break;
#endif //FUNC_SWITCH_RELAY_WELDING_PROTECT
}
#ifdef FUNC_SIMU_CHARGE_CURRENT_OUTPUT
#ifdef FUNC_SWITCH_RELAY_WELDING_PROTECT
if (CurRxBuf[6] != SIMU_CHARGE_CURRENT_CMD && CurRxBuf[6] != SIMU_SWITCH_RELAY_WELDING_CMD)
{
Charger.memory.EVSE_Config.op_bits.update = ON;
}
#else //FUNC_SWITCH_RELAY_WELDING_PROTECT
if (CurRxBuf[6] != SIMU_CHARGE_CURRENT_CMD)
{
Charger.memory.EVSE_Config.op_bits.update = ON;
}
#endif //FUNC_SWITCH_RELAY_WELDING_PROTECT
#else //FUNC_SIMU_CHARGE_CURRENT_OUTPUT
Charger.memory.EVSE_Config.op_bits.update = ON;
#endif //FUNC_SIMU_CHARGE_CURRENT_OUTPUT
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;
#ifndef USE_OLD_ONE_STEP_CHARGE_FOR_AW_NOODOE
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_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
{
#ifdef FUNC_RELAY_OFF_WHEN_GET_TWICE_OFF_CMD
if (++CsuSetRelayOffCount >= 2)
{
CsuSetRelayOffCount = 0;
Charger.Relay_Action = GPIO_RELAY_ACTION_OFF ;
}
#else //FUNC_RELAY_OFF_WHEN_GET_TWICE_OFF_CMD
Charger.Relay_Action = GPIO_RELAY_ACTION_OFF ;
#endif //FUNC_RELAY_OFF_WHEN_GET_TWICE_OFF_CMD
}
#endif //USE_OLD_ONE_STEP_CHARGE_FOR_AW_NOODOE
#ifdef FUNC_CSU_CMD_DEBUG
XP("#CSU_Relay: %d\r\n", CurRxBuf[9]);
#endif
DEBUG_INFO("Set Relay Action By CSU: %d => %d\r\n", CurRxBuf[9], Charger.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();
}
break;
case PROTOCOL_MESSAGE_CONFIG_LED_ACTION_ALARM:
#ifdef FUNC_DISABLE_LED_CMD_CHECK
//do nothing
#else
if((Charger.am3352.LedActionState != CurRxBuf[6])||(Charger.am3352.LedAlarmState != (CurRxBuf[7]|(CurRxBuf[8]<<8)|(CurRxBuf[9]<<16)|(CurRxBuf[10]<<24))))
#endif
{
Charger.am3352.LedActionState = CurRxBuf[6];
Charger.am3352.LedAlarmState = (CurRxBuf[7]|(CurRxBuf[8]<<8)|(CurRxBuf[9]<<16)|(CurRxBuf[10]<<24));
#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;
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
(
(CurRxBuf[6] <= 32 && CurRxBuf[6] >= 6) ||
(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;
if(CurRxBuf[6] <= 32 && CurRxBuf[6] >= 6)
{
Charger.memory.EVSE_Config.data.item.MaxChargingCurrent = CurRxBuf[6];
#ifdef MODIFY_CP_TASK_CTRL_CP_PWM
user_pwm_setvalue(PWM_CH_CP, GetCpPwmDuty(Charger.memory.EVSE_Config.data.item.MaxChargingCurrent));
#else
//user_pwm_setvalue(PWM_CH_CP, PWM_DUTY_651(Charger.memory.EVSE_Config.data.item.MaxChargingCurrent));
#endif
tx[6] = 0x01;
}
else if (CurRxBuf[6] == PWM_DUTY_OFF)
{
user_pwm_setvalue(PWM_CH_CP, 0); // State F
tx[6] = 0x01;
}
else if (CurRxBuf[6] == 5)
{
user_pwm_setvalue(PWM_CH_CP, PWM_DUTY_5);
tx[6] = 0x01;
}
else if (CurRxBuf[6] == 100)
{
user_pwm_setvalue(PWM_CH_CP, PWM_DUTY_FULL);
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
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
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;
}
}
else
{
#ifdef FUNC_REQUEST_OFF_WHEN_GET_TWICE_OFF_CMD
if (++CsuSetRequestOffCount >= 2)
{
CsuSetRequestOffCount = 0;
Charger.am3352.isRequestOn = OFF;
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;
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);
//#ifdef FUNC_SHOW_CSU_CONFIG_LED_BRIGHTNESS
// XP("#CSU_SetLedBrightness(%d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d)\r\n",
// Charger.Led_Brightness[0],
// Charger.Led_Brightness[1],
// Charger.Led_Brightness[2],
// Charger.Led_Brightness[3],
// Charger.Led_Brightness[4],
// Charger.Led_Brightness[5],
// Charger.Led_Brightness[6],
// Charger.Led_Brightness[7],
// Charger.Led_Brightness[8],
// Charger.Led_Brightness[9],
// Charger.Led_Brightness[10],
// Charger.Led_Brightness[11]);
//#endif
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;
Charger.memory.hisCharging.op_bits.clear = ON;
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:
Charger.memory.hisCharging.op_bits.clear = ON;
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;
#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;
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;
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));
#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))
{
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;
}
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;
#ifdef FIX_RS485_UNKNOW_MSG
tx[0] = 0x55;
#else
tx[0] = 0xaa;
#endif
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;
#ifdef FIX_RS485_UNKNOW_MSG
tx[0] = 0x55;
#else
tx[0] = 0xaa;
#endif
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
if (CurRxBuf != NULL)
{
#ifdef FUNC_EMPX10_CUSTOMIZE_RS485_CLIENT_ADDRESS
if (CurRxBuf == UART_IAP_rx_buffer)
{
Prefix_UartTX(tx, CurRxBuf);
HAL_UART_Transmit(pUartHandle, (uint8_t *)tx, tx_len , 0x0ffff);
Postfix_UartTX(tx, CurRxBuf);
}
else if (CurRxBuf == UART_RS485_rx_buffer)
{
#ifdef FIX_RS485_UNKNOW_MSG
if (CurRxBuf[IMCP_FM_DSTADDR_IDX] == Charger.m_EMPX10_RS485_ClientAddr && tx[0] != 0x55)
#else
if (CurRxBuf[IMCP_FM_DSTADDR_IDX] == Charger.m_EMPX10_RS485_ClientAddr)
#endif
{
Prefix_UartTX(tx, CurRxBuf);
HAL_UART_Transmit(pUartHandle, (uint8_t *)tx, tx_len , 0x0ffff);
Postfix_UartTX(tx, CurRxBuf);
}
// else if (CurRxBuf[IMCP_FM_DSTADDR_IDX] == EMPX10_RS485_ADDR_BROADCAST)
// {
// Prefix_UartTX(tx, CurRxBuf);
// HAL_UART_Transmit(pUartHandle, (uint8_t *)tx, tx_len , 0x0ffff);
// Postfix_UartTX(tx, CurRxBuf);
// }
}
#else //FUNC_EMPX10_CUSTOMIZE_RS485_CLIENT_ADDRESS
Prefix_UartTX(tx, CurRxBuf);
HAL_UART_Transmit(pUartHandle, (uint8_t *)tx, tx_len , 0x0ffff);
Postfix_UartTX(tx, CurRxBuf);
#endif //FUNC_EMPX10_CUSTOMIZE_RS485_CLIENT_ADDRESS
}
#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 DEBUG_EMPX10_COMM
if (CurRxBuf == UART_RS485_rx_buffer)
{
HTK_ByteArray2HexStr_XP(NULL, tx, 0, tx_len);
}
#endif //DEBUG_EMPX10_COMM
#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
osDelay(1);
}
/* USER CODE END StartUartTask */
}
/* 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 */
//aadc
uint8_t previous_cp_state = SYSTEM_STATE_A;
#ifdef MODIFY_POWER_CONSUME_ACCU_TIMER
uint16_t updateMemReq = 0;
#else
uint8_t updateMemReq = 0;
#endif
struct TimeTick
{
uint32_t timeTick_Start;
uint32_t timeTick_End;
uint32_t timeTick_Delta;
}timeTick;
timeTick.timeTick_Start = HAL_GetTick();
#ifdef FUNC_CP_ADC_MODIFY
#ifdef NEW_CP_SPEC
while (!Charger.m_bCpDetectModuleInitOK)
{
osDelay(10);
}
#endif //NEW_CP_SPEC
#endif //FUNC_CP_ADC_MODIFY
#ifdef MODIFY_POWER_CONSUME_ACCU_TIMER
timerEnable(TIMER_IDX_POWER, POWER_CONSUME_ACCU_TIMEOUT_SPEC);
#else
timerEnable(TIMER_IDX_POWER, 1000);
#endif
/* Infinite loop */
for(;;)
{
Relay_Control_Function( ) ;
// ADC chanel 1
if(isDMAEnd_ADC1)
{
isDMAEnd_ADC1 = OFF;
CpCalculate(ADC1_Buffer, ADC1_CHANEL_COUNT*ADC1_SAMPLE_COUNT, &CpDetectionResult);
#ifdef FUNC_EMPX10_CUSTOMIZE_CP_STATE_OPERATION
if (Charger.am3352.isRequestOn == ON)
{
if (Charger.Alarm_Code == 0)
{
if (Charger.m_CP_CurPWM == PWM_DUTY_FULL)
{
Charger.CP_State = SYSTEM_STATE_B;
}
else
{
Charger.CP_State = SYSTEM_STATE_C;
}
}
else
{
Charger.CP_State = SYSTEM_STATE_B;
}
}
else
{
Charger.CP_State = SYSTEM_STATE_A;
}
#else
Charger.CP_State = CpDetectionResult.State;
#endif
#ifdef FUNC_RELAY_OFF_WHEN_CP_NOT_STATE_C
if (Charger.CP_State != SYSTEM_STATE_C)
{
Charger.Relay_Action = GPIO_RELAY_ACTION_OFF;
}
#endif
#ifdef FUNC_DEBUG_MSG_CP_STATE
if (previous_cp_state != Charger.CP_State)
{
XP("#CP: [%s] >>> [%s] (%+f, %+f)\r\n",
CP_STATE_TAG[previous_cp_state],
CP_STATE_TAG[Charger.CP_State],
(CpDetectionResult.PositiveValue == 0 ? 0 : CP_GET_OPA_VIN_USE_ADC(CpDetectionResult.PositiveValue)),
(CpDetectionResult.NegativeValue == 0 ? 0 : CP_GET_OPA_VIN_USE_ADC(CpDetectionResult.NegativeValue))
);
}
#endif
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
{
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;
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);
}
}
}
//DEBUG_INFO("HAL_GetTick() = %d\r\n",HAL_GetTick());
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)
{
isDMAEnd_ADC2 = OFF;
for(uint16_t idx=0;idx 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 ++ ;
}
else if((vRms_cal2(ADC3_Buffer_Each[0], ADC3_SAMPLE_COUNT) > (ALARM_SPEC_UV+ALARM_SPEC_OUV_HYSTERESIS)))
{
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
// 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;
if(Charger.memory.EVSE_Config.data.item.Power_Consumption_Cumulative >= 0xFFFFFFFF)
{
Charger.memory.EVSE_Config.data.item.Power_Consumption_Cumulative = 0;
}
else
{
#ifdef MODIFY_POWER_CONSUME_ACCU_TIMER
{
static double Energy = 0;
#ifdef FUNC_ZERO_CURRENT_WHEN_OUTP_OFF
u16 Curr = (Charger.Relay_Action == GPIO_RELAY_ACTION_ON) ? Charger.Current[0] : 0;
Energy += (((double)Charger.Voltage[0]/100.0)*((double)Curr/100.0)*((double)timeTick.timeTick_Delta/3600000.0)*10.0);
#else
Energy += (((double)Charger.Voltage[0]/100.0)*((double)Charger.Current[0]/100.0)*((double)timeTick.timeTick_Delta/3600000.0)*10.0);
#endif
if (Energy >= 1)
{
uint32_t EnergyIntPart = (uint32_t)Energy;
Charger.memory.EVSE_Config.data.item.Power_Consumption_Cumulative += EnergyIntPart;
Energy -= EnergyIntPart;
}
}
#else //MODIFY_POWER_CONSUME_ACCU_TIMER
//unit : 0.0001kW , 0.1W *10 = W
Charger.memory.EVSE_Config.data.item.Power_Consumption_Cumulative += (uint32_t)((Charger.Voltage[0]/100.0)*(Charger.Current[0]/100.0)*(timeTick.timeTick_Delta/3600000.0)*10.0);
#endif //MODIFY_POWER_CONSUME_ACCU_TIMER
}
#ifdef MODIFY_POWER_CONSUME_ACCU_TIMER
if((++updateMemReq) > (180 * (1000 / (double)POWER_CONSUME_ACCU_TIMEOUT_SPEC))) //Interval = POWER_CONSUME_ACCU_TIMEOUT_SPEC ms
#else
if(++updateMemReq>180) //Interval = 1000ms
#endif
{
Charger.memory.EVSE_Config.op_bits.update = ON;
updateMemReq = 0;
}
timerRefresh(TIMER_IDX_POWER);
}
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 */
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;
}
}
/*
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;
}
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 */
}
/* 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 */
//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 */
}
/* 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 */
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;
}
/*
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)
{
if (
(Charger.memory.EVSE_Config.data.item.MaxChargingCurrent != Charger.MaxChargingCurrent_Previous) &&
(Charger.memory.EVSE_Config.data.item.MaxChargingCurrent <= Charger.maxRatingCurrent)
)
{
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
/**
* @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);
//Check MCU control mode depend on GPIO state
#ifdef FUNC_FORCE_RUN_CSU_MODE_WITH_DC_MODELNAME
Update_McuCtrlMode();
#else
if(HAL_GPIO_ReadPin(IN_ACT_REQ_GPIO_Port, IN_ACT_REQ_Pin) == GPIO_PIN_RESET)
{
Charger.memory.EVSE_Config.data.item.MCU_Control_Mode = MCU_CONTROL_MODE_CSU;
DEBUG_INFO(" Check MCU_Control_Mode is CSU in CP task\r\n");
}
else
{
Charger.memory.EVSE_Config.data.item.MCU_Control_Mode = MCU_CONTROL_MODE_NO_CSU;
DEBUG_INFO(" MCU_Control_Mode is NO NO NO CSU in CP task\r\n");
}
#endif
//Charger.ModelReadisOK = FAIL ;
/* Infinite loop */
for(;;)
{
if(Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_NO_CSU)
{
#ifdef MODIFY_CPTASK_HEAD
Proc_CpTaskHead(HTK_FALSE);
#endif
// Cancel EV ready restart cp logic
if (Charger.Mode != MODE_HANDSHAKE)
{
timerDisable(TIMER_IDX_SIMU_DISCONNECT);
}
switch(Charger.Mode)
{
case 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)
{
recordChargingHis(OFF, END_STATUS_CODE_DROP);
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
/*
TEST CALI VAL
Charger.memory.EVSE_Config.data.item.Correction_VL1[1][0] = 0x0A59;
Charger.memory.EVSE_Config.data.item.Correction_VL1[1][1] = 0x0A91;
Charger.memory.EVSE_Config.data.item.Correction_VL1[2][0] = 0x0684;
Charger.memory.EVSE_Config.data.item.Correction_VL1[2][1] = 0x06A7;
Charger.memory.EVSE_Config.data.item.Correction_CL1[1][0] = 0x0139;
Charger.memory.EVSE_Config.data.item.Correction_CL1[1][1] = 0x0140;
Charger.memory.EVSE_Config.data.item.Correction_CL1[2][0] = 0x0062;
Charger.memory.EVSE_Config.data.item.Correction_CL1[2][1] = 0x0064;
Charger.memory.EVSE_Config.data.item.Correction_Leak[1][0] = 0x0632;
Charger.memory.EVSE_Config.data.item.Correction_Leak[1][1] = 0x05DC;
Charger.memory.EVSE_Config.data.item.Correction_Leak[2][0] = 0x0488;
Charger.memory.EVSE_Config.data.item.Correction_Leak[2][1] = 0x03E8;
Charger.memory.EVSE_Config.op_bits.update = ON;
*/
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:
if(isModeChange())
{
setLedMotion(LED_ACTION_IDLE);
Charger.Relay_Action = GPIO_RELAY_ACTION_OFF;
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 ;
}
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))
{
timerDisable(TIMER_IDX_CP);
Charger.istoHandShakeMode = OFF ;
setChargerMode(MODE_HANDSHAKE);
if (Charger.memory.EVSE_Config.data.item.ModelName[3] == 'E')
timerEnable(TIMER_IDX_SIMU_DISCONNECT, 30000);
}
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) ||
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
Charger.cycle_info.StartType = START_METHOD_CP;
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);
if (Charger.memory.EVSE_Config.data.item.ModelName[3] == 'E')
timerEnable(TIMER_IDX_SIMU_DISCONNECT, 30000);
}
}
break;
case 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)
{
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.Power_Consumption_Cumulative;
}
}
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);
}
// EV ready restart cp logic
if (Charger.memory.EVSE_Config.data.item.ModelName[3] == 'E')
{
if(timer[TIMER_IDX_SIMU_DISCONNECT].isAlarm == ON)
{
user_pwm_setvalue(PWM_CH_CP, PWM_DUTY_ZERO);
osDelay(4000);
user_pwm_setvalue(PWM_CH_CP, PWM_DUTY_FULL);
osDelay(600);
#ifdef MODIFY_CP_TASK_CTRL_CP_PWM
CpTask_CtrlCpPwm_P0();
#endif
timerDisable(TIMER_IDX_SIMU_DISCONNECT);
}
}
break;
case MODE_CHARGING:
if(isModeChange())
{
#ifdef MODIFY_CPTASK_CSU_0_1_CHARGE_MODE
CpTask_CtrlCpPwm_P0();
#endif
setLedMotion(LED_ACTION_CHARGING);
}
if (Charger.memory.EVSE_Config.data.item.AuthMode == AUTH_MODE_OCPP)
{
#ifdef MODIFY_AW_CP_TASK_CSU_0_1_CHARGING_MODE_STOP_WITHOUT_STATE_C
if(Charger.CP_State!=SYSTEM_STATE_C || Charger.rfid.op_bits.reqStop )
#else
if(((Charger.CP_State!=SYSTEM_STATE_C)&&(Charger.CP_State!=SYSTEM_STATE_UNKNOWN)) || Charger.rfid.op_bits.reqStop )
#endif
{
setChargerMode(MODE_STOP);
}
else
{
Charger.Relay_Action = GPIO_RELAY_ACTION_ON;
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.Power_Consumption_Cumulative - Charger.cycle_info.meterStart;
#ifdef MODIFY_CP_TASK_CTRL_CP_PWM
CpTask_CtrlCpPwm_P1();
#endif
}
}
else if (Charger.memory.EVSE_Config.data.item.AuthMode == AUTH_MODE_FREE)
{
#ifdef MODIFY_AW_CP_TASK_CSU_0_1_CHARGING_MODE_STOP_WITHOUT_STATE_C
if(Charger.CP_State!=SYSTEM_STATE_C)
#else
if((Charger.CP_State != SYSTEM_STATE_C) && (Charger.CP_State != SYSTEM_STATE_UNKNOWN))
#endif
{
setChargerMode(MODE_STOP);
Charger.Relay_Action = GPIO_RELAY_ACTION_OFF;
}
else
{
Charger.Relay_Action = GPIO_RELAY_ACTION_ON;
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.Power_Consumption_Cumulative - Charger.cycle_info.meterStart;
#ifdef MODIFY_CP_TASK_CTRL_CP_PWM
CpTask_CtrlCpPwm_P1();
#endif
}
}
break;
case 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();
recordChargingHis(OFF, END_STATUS_CODE_NORMAL);
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;
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;
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();
recordChargingHis(OFF, END_STATUS_CODE_NORMAL);
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:
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;
//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 ;
}
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();
recordChargingHis(OFF, END_STATUS_CODE_NORMAL);
Charger.rfid.op_bits.reqStop = OFF;
Charger.ble.isRequestOff = 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 // 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();
recordChargingHis(OFF, END_STATUS_CODE_NORMAL);
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 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:
if(isModeChange())
{}
break;
case MODE_DEBUG:
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;
Charger.isDebugModeCPtest = ON;
}
if(Charger.isDebugModeCPtest)
{
if(Charger.CP_State == SYSTEM_STATE_A)
{
Charger.Relay_Action = GPIO_RELAY_ACTION_OFF;
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_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
}
}
break;
}
}
else if(Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_CSU) //CP_CSU
{
/*
MCU control mdoe with CSU
*/
#ifdef MODIFY_CPTASK_HEAD
Proc_CpTaskHead(HTK_TRUE);
#endif
// Cancel EV ready restart cp logic
if (Charger.Mode != MODE_HANDSHAKE)
{
timerDisable(TIMER_IDX_SIMU_DISCONNECT);
}
switch(Charger.Mode)
{
case 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)
{
recordChargingHis(OFF, END_STATUS_CODE_DROP);
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:
if(isModeChange())
{
Charger.Relay_Action = GPIO_RELAY_ACTION_OFF;
Charger.memory.EVSE_Config.data.item.MaxChargingCurrent = Charger.maxRatingCurrent;
user_pwm_setvalue(PWM_CH_CP, PWM_DUTY_FULL);
Charger.isSetStartTime = ON ;
#ifdef FUNC_BLOCK_CSU_CONFIG_CP_PWM_DUTY
Charger.m_bBlockCsuCpPwmDuty = HTK_DISABLE;
#endif
}
if(Charger.am3352.isRequestOn &&
(Charger.CP_State != SYSTEM_STATE_A))
{
setChargerMode(MODE_HANDSHAKE);
if (Charger.memory.EVSE_Config.data.item.ModelName[3] == 'E')
timerEnable(TIMER_IDX_SIMU_DISCONNECT, 30000);
}
break;
case 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.Power_Consumption_Cumulative;
}
}
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 ;
}
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);
}
// EV ready restart cp logic
if (Charger.memory.EVSE_Config.data.item.ModelName[3] == 'E')
{
if(timer[TIMER_IDX_SIMU_DISCONNECT].isAlarm == ON)
{
user_pwm_setvalue(PWM_CH_CP, PWM_DUTY_ZERO);
osDelay(4000);
user_pwm_setvalue(PWM_CH_CP, PWM_DUTY_FULL);
osDelay(600);
#ifdef MODIFY_CP_TASK_CTRL_CP_PWM
CpTask_CtrlCpPwm_P0();
#endif
timerDisable(TIMER_IDX_SIMU_DISCONNECT);
timer[TIMER_IDX_SIMU_DISCONNECT].isAlarm = OFF ;
}
}
#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:
if(isModeChange())
{
#ifdef MODIFY_CPTASK_CSU_0_1_CHARGE_MODE
CpTask_CtrlCpPwm_P0();
#endif
}
#ifdef MODIFY_AW_CP_TASK_CSU_0_1_CHARGING_MODE_STOP_WITHOUT_STATE_C
if(Charger.CP_State != SYSTEM_STATE_C || !Charger.am3352.isRequestOn)
#else
if(!Charger.am3352.isRequestOn)
#endif
{
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");
}
#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
{
#ifdef USE_OLD_ONE_STEP_CHARGE_FOR_AW_NOODOE
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.Power_Consumption_Cumulative - Charger.cycle_info.meterStart;
}
break;
case 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.CP_State == SYSTEM_STATE_A) || !Charger.am3352.isRequestOn)
{
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();
recordChargingHis(OFF, END_STATUS_CODE_NORMAL);
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 //CP_State == SYSTEM_STATE_A
{
user_pwm_setvalue(PWM_CH_CP, PWM_DUTY_FULL); // close pwm
Charger.cycle_info.endTimeTick = HAL_GetTick();
recordChargingHis(OFF, END_STATUS_CODE_NORMAL);
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
#ifdef MODIFY_MODE_STOP_TO_CHARGE_PROCESS
setChargerMode(MODE_CHARGING);
#else
setChargerMode(MODE_HANDSHAKE);
#endif
}
#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:
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;
if(Charger.Alarm_Code == 0x00)
{
Charger.am3352.LedActionState = 0 ;
if (Charger.Mode_Before_Alarm == MODE_CHARGING) // in charging mode
{
if(Charger.CP_State == SYSTEM_STATE_B ) // to handshake
{
setChargerMode(MODE_HANDSHAKE);
}
else // to idle
{
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:
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;
Charger.isDebugModeCPtest = ON;
}
if(Charger.isDebugModeCPtest)
{
if(Charger.CP_State == SYSTEM_STATE_A)
{
Charger.Relay_Action = GPIO_RELAY_ACTION_OFF;
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_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
}
}
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 */
//aalarm
timerEnable(TIMER_IDX_PE_DETECT, 30000);
/* Infinite loop */
for(;;)
{
if(Charger.Mode != MODE_INITIAL && Charger.Mode != MODE_DEBUG)
{
recordAlarmHis();
//================================
// CP fail alarm detect
//================================
#ifdef CP_ALARM_PROTECT
if ((Charger.CP_State == SYSTEM_STATE_UNKNOWN)&&(!(Charger.Alarm_Code & ALARM_MCU_TESTFAIL)))
{
if(Charger.counter.CP.fail >1000)
{
if(!(Charger.Alarm_Code & ALARM_CP_ERROR))
{
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");
}
}
else
Charger.counter.CP.fail++;
}
#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
{
Charger.counter.CP.fail = 0;
if((Charger.Alarm_Code & ALARM_CP_ERROR))
{
osDelay(1000);
Charger.counter.CP.retry++;
Charger.Alarm_Code &= ~ALARM_CP_ERROR;
DEBUG_INFO("Alarm CP recover.\r\n");
}
}
#endif //CP_ALARM_PROTECT
//================================
// Over voltage alarm detect
//================================
#ifdef OVP_PROTECT
if(Charger.Voltage[0] > ALARM_SPEC_OV)
{
if(Charger.counter.OV.fail > 1000)
{
Charger.counter.OV.restore = 0 ;
if(!(Charger.Alarm_Code & ALARM_OVER_VOLTAGE))
{
Charger.Alarm_Code |= ALARM_OVER_VOLTAGE;
DEBUG_ERROR("Alarm OV occur.\r\n");
}
}
else
Charger.counter.OV.fail++;
}
else if(Charger.Voltage[0] < (ALARM_SPEC_OV-ALARM_SPEC_OUV_HYSTERESIS))
{
if((Charger.Alarm_Code & ALARM_OVER_VOLTAGE))
{
if (Charger.counter.OV.restore > 1000 && blinker[BLINKER_IDX_LED].blinkisFinish)
{
Charger.counter.OV.fail = 0 ;
DEBUG_INFO("Alarm OV is coldpickup ing..... \r\n");
Charger.counter.OV.isOccurInCharging = ((Charger.CP_State == SYSTEM_STATE_B)?ON:OFF);
if (Charger.counter.OV.isOccurInCharging)
{
#ifdef MODIFY_COLD_LOAD_PICKUP_DELAY
ColdLoadPickup_Delay("Alarm OV is coldpickup ing..... ");
#else
osDelay((rand()%175000)+5000);
#endif
}
Charger.Alarm_Code &= ~ALARM_OVER_VOLTAGE;
DEBUG_INFO("Alarm OV recover.\r\n");
}
else
{
Charger.counter.OV.restore++;
}
}
else
{
Charger.counter.OV.fail = 0 ;
Charger.counter.OV.restore = 0 ;
}
}
#endif //OVP_PROTECT
//================================
// Under voltage alarm detect
//================================
#ifdef UVP_PROTECT
if(Charger.Voltage[0] < ALARM_SPEC_UV)
{
if(Charger.counter.UV.fail > 1000)
{
Charger.counter.UV.restore = 0 ;
if(!(Charger.Alarm_Code & ALARM_UNDER_VOLTAGE))
{
Charger.Alarm_Code |= ALARM_UNDER_VOLTAGE;
DEBUG_ERROR("Alarm UV occur.\r\n");
}
}
else
Charger.counter.UV.fail++;
}
else if(Charger.Voltage[0] > (ALARM_SPEC_UV+ALARM_SPEC_OUV_HYSTERESIS))
{
if(Charger.Alarm_Code & ALARM_UNDER_VOLTAGE)
{
if (Charger.counter.UV.restore > 1000 && blinker[BLINKER_IDX_LED].blinkisFinish)
{
Charger.counter.UV.fail = 0 ;
DEBUG_INFO("Alarm UV is coldpickup ing..... \r\n");
Charger.counter.UV.isOccurInCharging = ((Charger.CP_State == SYSTEM_STATE_B)?ON:OFF);
if (Charger.counter.UV.isOccurInCharging)
{
#ifdef MODIFY_COLD_LOAD_PICKUP_DELAY
ColdLoadPickup_Delay("Alarm UV is coldpickup ing..... ");
#else
osDelay((rand()%175000)+5000);
#endif
}
Charger.Alarm_Code &= ~ALARM_UNDER_VOLTAGE;
DEBUG_INFO("Alarm UV recover.\r\n");
}
else
{
Charger.counter.UV.restore++ ;
}
}
else
{
Charger.counter.UV.restore = 0 ;
Charger.counter.UV.fail = 0 ;
}
}
#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
CurMaxCurr = HTK_GET_VAL_MIN(Charger.memory.EVSE_Config.data.item.MaxChargingCurrent, Charger.maxRatingCurrent);
#ifdef FUNC_SWITCH_RELAY_WELDING_PROTECT
if (Charger.m_bSetOCP_32A == 1)
{
CurMaxCurr = 32;
}
#endif
//// if (Charger.m_bDetectPP)
//// {
//// CurMaxCurr = HTK_GET_VAL_MIN(CurMaxCurr, Charger.m_PPInfo.m_CurCurr);
//// }
#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;
//--------------------------------
// L1 Over current
if(Charger.Current[0] >= 4800)
{
if(Charger.counter.OC.fail > 5)
{
if(!(Charger.Alarm_Code & ALARM_CIRCUIT_SHORT))
{
Charger.counter.OC.isOccurInCharging = (((Charger.Mode == MODE_CHARGING) || (Charger.Mode == MODE_STOP))?ON:OFF);
Charger.Alarm_Code |= ALARM_CIRCUIT_SHORT;
if (Charger.counter.OC.isLatch == OFF)
{
Charger.counter.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 SCP occur.\r\n");
}
}
else
Charger.counter.OC.fail++;
}
//else if(Charger.Current[0] > (Charger.memory.EVSE_Config.data.item.MaxChargingCurrent>=Charger.maxRatingCurrent ? Charger.maxRatingCurrent*Charger.OCP_Magnification : Charger.memory.EVSE_Config.data.item.MaxChargingCurrent*Charger.OCP_Magnification))
else if (Charger.Current[0] > OC_BegThreshold)
{
if(Charger.counter.OC.fail > 6000)
{
if(!(Charger.Alarm_Code & ALARM_OVER_CURRENT))
{
Charger.counter.OC.isOccurInCharging = (((Charger.Mode == MODE_CHARGING) || (Charger.Mode == MODE_STOP))?ON:OFF);
Charger.Alarm_Code |= ALARM_OVER_CURRENT;
DEBUG_INFO("Correction Current[0]: %f\r\n", Charger.Current[0]/100.0);
DEBUG_ERROR("Alarm OC occur.\r\n");
timerEnable(TIMER_IDX_RETRY_OC, ALARM_RETRY_INTERVAL_OC);
Charger.counter.OC.retry++;
}
}
else
Charger.counter.OC.fail++;
}
//else if(Charger.Current[0] < (Charger.memory.EVSE_Config.data.item.MaxChargingCurrent>=Charger.maxRatingCurrent ? ((Charger.maxRatingCurrent*Charger.OCP_Magnification)-200) : ((Charger.memory.EVSE_Config.data.item.MaxChargingCurrent*Charger.OCP_Magnification)-200)))
else if (Charger.Current[0] < OC_EndThreshold)
{
Charger.counter.OC.fail = 0;
if ((Charger.counter.OC.retry > ALARM_OC_RETRY_COUNT))
{
if (Charger.counter.OC.isLatch == OFF)
{
Charger.counter.OC.isLatch = ON ;
setLedMotion(LED_ACTION_ALARM);
timerDisable(TIMER_IDX_RETRY_OC);
}
}
else if((Charger.Alarm_Code & ALARM_OVER_CURRENT) &&
(Charger.counter.OC.retry <= ALARM_OC_RETRY_COUNT) &&
(timer[TIMER_IDX_RETRY_OC].isAlarm == ON) &&
blinker[BLINKER_IDX_LED].blinkisFinish )
{
timerDisable(TIMER_IDX_RETRY_OC);
osDelay(1000);
Charger.Alarm_Code &= ~ALARM_OVER_CURRENT;
Charger.Alarm_Code &= ~ALARM_CIRCUIT_SHORT;
DEBUG_INFO("Alarm OC recover.\r\n");
}
}
}
#else //FUNC_OCP_WITH_PP
//Old Procedure (Deleted)
#endif //FUNC_OCP_WITH_PP
#endif //OCP_PROTECT
//================================
// Over temperature alarm detect
//================================
#ifdef OTP_PROTECT
if (Charger.temperature.SystemAmbientTemp > ALARM_SPEC_OT_2)
{
if(Charger.counter.OT.fail > 2000)
{
if (Charger.counter.OT.isLatch == OFF)
{
Charger.counter.OT.isLatch = ON ;
setLedMotion(LED_ACTION_ALARM);
}
//Charger.counter.OT.isLatch = ON ;
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");
DEBUG_ERROR("Tmp = %d.\r\n",Charger.temperature.SystemAmbientTemp);
}
}
else
Charger.counter.OT.fail++;
}
else if((Charger.temperature.SystemAmbientTemp > ALARM_SPEC_OT_1) && (!Charger.counter.OT.isLatch))
{
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");
}
}
else
Charger.counter.OT.fail++;
}
else if((Charger.temperature.SystemAmbientTemp < (ALARM_SPEC_OT_1-ALARM_SPEC_OT_HYSTERESIS)) && (!Charger.counter.OT.isLatch))
{
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");
}
}
/*
// For multi step OTP logic
if(Charger.temperature.SystemAmbientTemp > ALARM_SPEC_OT_2)
{
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;
if(Charger.memory.EVSE_Config.data.item.MCU_Control_Mode == MCU_CONTROL_MODE_NO_CSU){
blinkerTimeSet(500, 500, 3000, 3);
}
DEBUG_ERROR("Alarm OT occur.\r\n");
}
}
else
Charger.counter.OT.fail++;
}
else if(Charger.temperature.SystemAmbientTemp > ALARM_SPEC_OT_1)
{
if(Charger.counter.OT.fail > 1000)
{
if(!timer[TIMER_IDX_RETRY_OT].isEnable || timer[TIMER_IDX_RETRY_OT].isAlarm)
{
Charger.memory.EVSE_Config.data.item.MaxChargingCurrent *= 0.75;
}
timerEnable(TIMER_IDX_RETRY_OT, ALARM_RETRY_INTERVAL_OT);
}
else
Charger.counter.OT.fail++;
}
else if(Charger.temperature.SystemAmbientTemp < (ALARM_SPEC_OT_1-ALARM_SPEC_OT_HYSTERESIS))
{
Charger.counter.OT.fail = 0;
if((Charger.Alarm_Code & ALARM_OVER_TEMPERATURE) &&
timer[TIMER_IDX_RETRY_OT].isAlarm)
{
Charger.memory.EVSE_Config.data.item.MaxChargingCurrent = Charger.maxRatingCurrent;
timerDisable(TIMER_IDX_RETRY_OT);
osDelay(3000);
Charger.counter.OT.retry++;
Charger.Alarm_Code &= ~ALARM_OVER_TEMPERATURE;
DEBUG_INFO("Alarm OT recover.\r\n");
}
}*/
#endif //OTP_PROTECT
#ifdef FUNC_EMP_FAN_CTRL_USE_LOCKER_IO
if (Charger.temperature.SystemAmbientTemp > 35)
{
if (GET_EMP_FAN == OFF)
{
DEBUG_ERROR("\r\n");
SET_EMP_FAN(ON);
}
}
else if (Charger.temperature.SystemAmbientTemp < 25)
{
if (GET_EMP_FAN == ON)
{
DEBUG_ERROR("\r\n");
SET_EMP_FAN(OFF);
}
}
#endif //FUNC_EMP_FAN_CTRL_USE_LOCKER_IO
//================================
// Current leakage alarm detect
// TODO: ADC channel & spec need to check for other detection method
//================================
#ifdef CCID_PROTECT
#ifdef FUNC_SWITCH_RELAY_WELDING_PROTECT
if (Charger.m_bDisableCCID == 0 && ((HAL_GetTick() - Charger.m_BootTick) / 1000) > 30)
{
#endif
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");
}
}
}
}
#ifdef FUNC_SWITCH_RELAY_WELDING_PROTECT
}
#endif
#endif //CCID_PROTECT
//================================
// Ground fail alarm detect
// TODO: Spec need to check
//================================
#ifdef GROUND_FAULT_PROTECT
if(Charger.GroundingDetect==ON){
#ifdef FUNC_RELAXSPEC_GROUND_FAULT_PROTECT
static double GF_SPEC_OCCUR = 0;
static double GF_SPEC_RECOVER = 0;
if (GF_SPEC_OCCUR == 0 || GF_SPEC_RECOVER == 0)
{
GF_SPEC_OCCUR = 3.0 / 220.0; //GF_SPEC_OCCUR = 0.013636(3.0)
GF_SPEC_RECOVER = 2.0 / 220.0; //GF_SPEC_RECOVER = 0.009091(2.0)
XP("GF_SPEC_OCCUR = %lf, GF_SPEC_RECOVER = %lf\r\n", GF_SPEC_OCCUR, GF_SPEC_RECOVER);
}
#endif
if (timer[TIMER_IDX_PE_DETECT].isAlarm == ON) // after 30 sec check (GMI adc_value > spec) and (GMI adc_value <= 1 )
{
#ifdef FUNC_RELAXSPEC_GROUND_FAULT_PROTECT
if(((adc_value.ADC3_IN4_GMI_VL1.value*100*3.3/4095) > (Charger.Voltage[0]*GF_SPEC_OCCUR)) || (adc_value.ADC3_IN4_GMI_VL1.value <= 1))
#else
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))
#endif
{
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");
}
}
else
Charger.counter.GF.fail++;
}
#ifdef FUNC_RELAXSPEC_GROUND_FAULT_PROTECT
else if((adc_value.ADC3_IN4_GMI_VL1.value*100*3.3/4095) < (Charger.Voltage[0]*GF_SPEC_RECOVER))
#else
else if((adc_value.ADC3_IN4_GMI_VL1.value*100*3.3/4095) < (Charger.Voltage[0]*0.00566))
#endif
{
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");
}
}
}
else // before 30 sec check (GMI adc_value > spec)
{
#ifdef FUNC_RELAXSPEC_GROUND_FAULT_PROTECT
if((adc_value.ADC3_IN4_GMI_VL1.value*100*3.3/4095) > (Charger.Voltage[0]*GF_SPEC_OCCUR))
#else
if((adc_value.ADC3_IN4_GMI_VL1.value*100*3.3/4095) > (Charger.Voltage[0]*0.011))
#endif
{
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");
}
}
else
Charger.counter.GF.fail++;
}
#ifdef FUNC_RELAXSPEC_GROUND_FAULT_PROTECT
else if((adc_value.ADC3_IN4_GMI_VL1.value*100*3.3/4095) < (Charger.Voltage[0]*GF_SPEC_RECOVER))
#else
else if((adc_value.ADC3_IN4_GMI_VL1.value*100*3.3/4095) < (Charger.Voltage[0]*0.00566))
#endif
{
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 //GROUND_FAULT_PROTECT
//================================
// Relay status error detect
// TODO: ADC channel & spec need to check
//================================
#ifdef RELAY_WELDING_PROTECT
#ifdef FUNC_SWITCH_RELAY_WELDING_PROTECT
if (Charger.m_bDisableRelayWelding == 0 && ((HAL_GetTick() - Charger.m_BootTick) / 1000) > 30)
{
#endif
//GROUNGING_SYSTEM_LL
if (Charger.GroundingSystem == GROUNGING_SYSTEM_LL)
{
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(adc_value.ADC2_IN5_Welding.value < ((Charger.Voltage[0]*0.0048)+3)) // for UL dloule L syste a=0.0048 b=0.03V
{
if(Charger.counter.RELAY_Drive_Fualt.fail > 1000)
{
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(adc_value.ADC2_IN5_Welding.value > 24) // 0.24 V
if(adc_value.ADC2_IN5_Welding.value > ALARM_SPEC_RELAY_LL)
{
if(Charger.counter.RELAY.fail > 1000)
{
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;
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 ;
}
}
}
else // 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(adc_value.ADC2_IN5_Welding.value < ALARM_SPEC_RELAY_LN_DRIVE_FAULT ) // old spec use
{
if(Charger.counter.RELAY.fail > 1000)
{
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.fail++;
}
else
{
Charger.counter.RELAY.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(adc_value.ADC2_IN5_Welding.value > ALARM_SPEC_RELAY_LN_WELDING)
{
if(Charger.counter.RELAY.fail > 1000)
{
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;
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 ;
}
}
}
#ifdef FUNC_SWITCH_RELAY_WELDING_PROTECT
}
#endif
#endif //RELAY_WELDING_PROTECT
//================================
// 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){
blinkerTimeSet(BLINKER_IDX_LED, 200, 200, 0, 1);
}
DEBUG_INFO("Rotary Switch Maxium Current Error occur.\r\n");
}
}
#endif //ROTATE_SWITCH_CHECK
//================================
// Recover alarm info in state A
//================================
if(Charger.CP_State == SYSTEM_STATE_A)
{
//SCP Recover
if(Charger.Alarm_Code & ALARM_CIRCUIT_SHORT)
{
Charger.Alarm_Code &= ~ALARM_CIRCUIT_SHORT;
DEBUG_INFO("Alarm SCP recover.\r\n");
}
//OCP Recover
if(Charger.Alarm_Code & ALARM_OVER_CURRENT)
{
Charger.Alarm_Code &= ~ALARM_OVER_CURRENT;
DEBUG_INFO("Alarm OC recover.\r\n");
}
Charger.counter.OC.fail = 0 ;
timerDisable(TIMER_IDX_RETRY_OC);
Charger.counter.OC.retry = 0 ; // clear retry times
Charger.counter.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_CCID_MODULE_CORMEX_RECOVER_AC_DC
if (Charger.Alarm_Code & ALARM_CURRENT_LEAK_AC)
{
Charger.Alarm_Code &= ~ALARM_CURRENT_LEAK_AC;
DEBUG_INFO("Alarm leakage AC recover.\r\n");
}
if (Charger.Alarm_Code & ALARM_CURRENT_LEAK_DC)
{
Charger.Alarm_Code &= ~ALARM_CURRENT_LEAK_DC;
DEBUG_INFO("Alarm leakage DC recover.\r\n");
}
#else //MODIFY_CCID_MODULE_CORMEX_RECOVER_AC_DC
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_CCID_MODULE_CORMEX_RECOVER_AC_DC
}
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 ;
//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 RELAY_WELDING_PROTECT
//GROUNGING_SYSTEM_LL
if (Charger.GroundingSystem == GROUNGING_SYSTEM_LL)
{
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(adc_value.ADC2_IN5_Welding.value < ((Charger.Voltage[0]*0.0048)+3)) // for UL dloule L syste a=0.0048 b=0.03V
{
if(Charger.counter.RELAY_Drive_Fualt.fail > 1000)
{
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(adc_value.ADC2_IN5_Welding.value > 24) // 0.24 V
if(adc_value.ADC2_IN5_Welding.value > ALARM_SPEC_RELAY_LL)
{
if(Charger.counter.RELAY.fail > 1000)
{
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;
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 ;
}
}
}
else // 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(adc_value.ADC2_IN5_Welding.value < ALARM_SPEC_RELAY_LN_DRIVE_FAULT ) // old spec use
{
if(Charger.counter.RELAY.fail > 1000)
{
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.fail++;
}
else
{
Charger.counter.RELAY.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(adc_value.ADC2_IN5_Welding.value > ALARM_SPEC_RELAY_LN_WELDING)
{
if(Charger.counter.RELAY.fail > 1000)
{
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;
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
}
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 */
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;
//HTK_ByteArray2HexStr_XP("BLE_RX: ", UART_BLE_rx_buffer, 0, 16);
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_OVER_VOLTAGE))
{
tx[4] = 0x01;
tx[5] = 0x22;
tx[6] = 0x00;
}
else if((Charger.Alarm_Code & ALARM_UNDER_VOLTAGE))
{
tx[4] = 0x01;
tx[5] = 0x22;
tx[6] = 0x03;
}
else if((Charger.Alarm_Code & ALARM_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_OVER_VOLTAGE))
{
tx[4] = 0x01;
tx[5] = 0x22;
tx[6] = 0x00;
}
else if((Charger.Alarm_Code & ALARM_UNDER_VOLTAGE))
{
tx[4] = 0x01;
tx[5] = 0x22;
tx[6] = 0x03;
}
else if((Charger.Alarm_Code & ALARM_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))?(((Charger.memory.EVSE_Config.data.item.Power_Consumption_Cumulative/10000)>>0) & 0xff):0x00);
tx[5] = (((Charger.ble.loginRole == BLE_LOGIN_ROLE_ROOT) || (Charger.ble.loginRole == BLE_LOGIN_ROLE_USER))?(((Charger.memory.EVSE_Config.data.item.Power_Consumption_Cumulative/10000)>>8) & 0xff):0x00);
tx[6] = (((Charger.ble.loginRole == BLE_LOGIN_ROLE_ROOT) || (Charger.ble.loginRole == BLE_LOGIN_ROLE_USER))?(((Charger.memory.EVSE_Config.data.item.Power_Consumption_Cumulative/10000)>>16) & 0xff):0x00);
tx[7] = (((Charger.ble.loginRole == BLE_LOGIN_ROLE_ROOT) || (Charger.ble.loginRole == BLE_LOGIN_ROLE_USER))?(((Charger.memory.EVSE_Config.data.item.Power_Consumption_Cumulative/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_OVER_VOLTAGE))
{
tx[12] = 0x01;
tx[13] = 0x22;
tx[14] = 0x00;
}
else if((Charger.Alarm_Code & ALARM_UNDER_VOLTAGE))
{
tx[12] = 0x01;
tx[13] = 0x22;
tx[14] = 0x03;
}
else if((Charger.Alarm_Code & ALARM_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
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;
}
//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;
}
//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 < 2; 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 < 2; 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 < 2; 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 < 2; 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");
// Check MCU control mode depend on GPIO state ~again~ , Prevent W25Qx from being empty(0xFF)
if(HAL_GPIO_ReadPin(IN_ACT_REQ_GPIO_Port, IN_ACT_REQ_Pin) == GPIO_PIN_RESET)
{
Charger.memory.EVSE_Config.data.item.MCU_Control_Mode = MCU_CONTROL_MODE_CSU;
DEBUG_INFO("Check MCU_Control_Mode is CSU in memmeory task\r\n");
}
else
{
Charger.memory.EVSE_Config.data.item.MCU_Control_Mode = MCU_CONTROL_MODE_NO_CSU;
if (Charger.memory.EVSE_Config.data.item.AuthMode > AUTH_MODE_FREE)
{
Charger.memory.EVSE_Config.data.item.AuthMode = AUTH_MODE_FREE ;
DEBUG_INFO("AuthMode is 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 is defualt RFID_USER_AUTH_FREE \r\n");
}
DEBUG_INFO("Check MCU_Control_Mode is NO NO NO CSU in memmeory task\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;
Charger.memory.hisCharging.op_bits.read = ON;
/*
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 backup block data
if(BSP_W25Qx_Erase_Block(MEM_ADDR_BACKUP_EVSE_CONFIG) == W25Qx_OK)
{
// Read data from block
if(BSP_W25Qx_Read(Charger.memory.EVSE_Config.data.value, MEM_ADDR_BACKUP_EVSE_CONFIG, W25Q16FV_BLOCK_SIZE)== W25Qx_OK)
{
DEBUG_INFO("Erase MEM_ADDR_BACKUP_EVSE_CONFIG block(4k byte) pass.\r\n");
Charger.memory.EVSE_Config.op_bits.clear = OFF;
}
else
{
DEBUG_WARN("Erase MEM_ADDR_BACKUP_EVSE_CONFIG block(4k byte) fail.\r\n");
}
}
else
{
DEBUG_WARN("Erase MEM_ADDR_BACKUP_EVSE_CONFIG block(4k byte) fail.\r\n");
}
//***************
// 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");
}
}
#ifdef FUNC_TEST_SIMU_LOAD_BUTTON
{
static int buttonDownCount = 0;
static HTK_BOOL bExec = HTK_FALSE;
if((HAL_GPIO_ReadPin(IN_MEM_Erase_GPIO_Port, IN_MEM_Erase_Pin) == GPIO_PIN_RESET))
{
if (buttonDownCount > 100 && !bExec)
{
bExec = HTK_TRUE;
Charger.m_bEnableSimuChargeCurrent = !Charger.m_bEnableSimuChargeCurrent;
XP("\r\n\r\n#BUTTON:ParameterSimuCurr: %s\r\n\r\n\r\n", Charger.m_bEnableSimuChargeCurrent ? "ON" : "OFF");
}
else
{
buttonDownCount++;
}
}
else
{
bExec = HTK_FALSE;
buttonDownCount = 0;
}
}
#else //FUNC_TEST_SIMU_LOAD_BUTTON
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;
#endif //FUNC_TEST_SIMU_LOAD_BUTTON
/*
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");
}
}
/*
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");
}
}
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 */
/* 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 */
}
/* Private application code --------------------------------------------------*/
/* USER CODE BEGIN Application */
#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;
#ifdef FUNC_EMPX10_CUSTOMIZE_RS485_CLIENT_ADDRESS
if (RxBuf[IMCP_FM_FRAMEID_IDX] != PROTOCOL_HEAD)
{
return FAIL;
}
else if (RxBuf == UART_IAP_rx_buffer)
{
if (RxBuf[IMCP_FM_DSTADDR_IDX] != PROTOCOL_ADDR &&
RxBuf[IMCP_FM_DSTADDR_IDX] != PROTOCOL_ADDR_AC_MAINBOARD &&
RxBuf[IMCP_FM_DSTADDR_IDX] != PROTOCOL_ADDR_BROADCAST)
{
return FAIL;
}
}
else if (RxBuf == UART_RS485_rx_buffer)
{
if (RxBuf[IMCP_FM_SRCADDR_IDX] != EMPX10_RS485_ADDR_CSU)
{
return FAIL;
}
else if (
RxBuf[IMCP_FM_DSTADDR_IDX] != Charger.m_EMPX10_RS485_ClientAddr &&
RxBuf[IMCP_FM_DSTADDR_IDX] != EMPX10_RS485_ADDR_BROADCAST)
{
return FAIL;
}
}
#else //FUNC_EMPX10_CUSTOMIZE_RS485_CLIENT_ADDRESS
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)
)
)
#endif //FUNC_EMPX10_CUSTOMIZE_RS485_CLIENT_ADDRESS
{
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;idx 30)
{
#endif
uint8_t DC_check = false;
uint8_t AC_check=false;
uint16_t time_out_count;
uint8_t retry_cnt = 0 ;
#ifdef FUNC_AUTO_MODIFY_CCID_MODULE
XP("#Test_LeakModule use CCID Module: %s\r\n", CCID_MODULE_TYPE_STR);
#endif
if (Charger.CCID_Module_Type == CCID_MODULE_VAC)
{
osDelay(500);
if(HAL_GPIO_ReadPin(IN_Leak_Error_GPIO_Port, IN_Leak_Error_Pin) == GPIO_PIN_SET)
{
DEBUG_INFO("VAC Leak Error pin ON.\r\n");
result = FAIL;
}
else
{
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
time_out_count = 0;
while(1)
{
if(HAL_GPIO_ReadPin(IN_Leak_DC_GPIO_Port, IN_Leak_DC_Pin) == GPIO_PIN_SET)
{
DC_check = true;
}
if(HAL_GPIO_ReadPin(IN_Leak_AC_GPIO_Port, IN_Leak_AC_Pin) == GPIO_PIN_SET)
{
AC_check = true;
}
//if(DC_check&&AC_check)
if ((DC_check&&AC_check) && (HAL_GPIO_ReadPin(IN_Leak_AC_GPIO_Port, IN_Leak_AC_Pin) == GPIO_PIN_RESET) && (HAL_GPIO_ReadPin(IN_Leak_DC_GPIO_Port, IN_Leak_DC_Pin) == GPIO_PIN_RESET))
{
break;
}
if(time_out_count>2000)
{
//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);
}
#ifdef FUNC_SWITCH_RELAY_WELDING_PROTECT
}
#endif
#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);
}
}
}
}
//-------------------------------------------------------------------------------------------------
uint8_t recordChargingHis(uint8_t isColdLoadPickUp, uint32_t statusCode)
{
uint8_t isSuccess = FAIL;
if(isColdLoadPickUp)
{
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.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))
{
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))
{
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;
}
//-------------------------------------------------------------------------------------------------
void setLedMotion(uint8_t action)
{//ssetled
//standard
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: //eMP: IDLE BACKEND ONLINE
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_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: //eMP: IDLE BACKEND OFFLINE
#ifdef FUNC_EMPX10_LED
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;
LedOnRGBSet(1000, 500, 0, 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_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:
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_ALARM:
#ifdef FUNC_EMPX10_LED_ALARM_FIX_20240730
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_EMERGENCY_STOP)
{
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, 3000, 7);
}
else
{
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 //FUNC_EMPX10_LED_ALARM_FIX_20240730
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_OVER_VOLTAGE)
blinkerTimeSet(BLINKER_IDX_LED, 500, 500, 3000, 1);
if(Charger.Alarm_LED & ALARM_UNDER_VOLTAGE)
blinkerTimeSet(BLINKER_IDX_LED, 500, 500, 3000, 2);
if(Charger.Alarm_LED & ALARM_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)
blinkerTimeSet(BLINKER_IDX_LED, 200, 200, 0, 1);
//OCP Latch
if (Charger.counter.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 ;
LedOnRGBSet(1000, 1000, 0, 0);
}
//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 //FUNC_EMPX10_LED_ALARM_FIX_20240730
break;
case LED_ACTION_MAINTAIN:
#ifdef FUNC_EMPX10_LED
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;
LedOnRGBSet(1000, 500, 0, 0);
#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);
#endif
blinkerTimeSet(BLINKER_IDX_LED, 500, 500, 0, 1);
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);
blinkerTimeSet(BLINKER_IDX_LED, 200, 200, 0, 1);
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);
blinkerTimeSet(BLINKER_IDX_LED, 200, 200, 0, 1);
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:
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;
LedOnRGBSet(1000, 1000, 0, 0);
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;
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;
}
}
//-------------------------------------------------------------------------------------------------
void HAL_ADC_LevelOutOfWindowCallback(ADC_HandleTypeDef* hadc)
{
#ifdef CCID_PROTECT
#ifdef FUNC_SWITCH_RELAY_WELDING_PROTECT
if (Charger.m_bDisableCCID == 0 && ((HAL_GetTick() - Charger.m_BootTick) / 1000) > 30)
{
#endif
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 ;
HAL_GPIO_WritePin(OUT_RelayDrv_L1_GPIO_Port, OUT_RelayDrv_L1_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(OUT_RelayHold_L1_GPIO_Port, OUT_RelayHold_L1_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(OUT_RelayDrv_L2_GPIO_Port, OUT_RelayDrv_L2_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(OUT_RelayHold_L2_GPIO_Port, OUT_RelayHold_L2_Pin, GPIO_PIN_RESET);
Charger.counter.WatchDogLeak = 0 ;
}
}
else
{
Charger.counter.WatchDogLeak ++ ;
}
}
}
}
#ifdef FUNC_SWITCH_RELAY_WELDING_PROTECT
}
#endif
#endif //CCID_PROTECT
}
//-------------------------------------------------------------------------------------------------
void SetADCWDGBoundary(void)
{
if(!ADCWDGHighThreshold)
{
//220V 3200 820
//110V 2640 1400
ADCWDGHighThreshold = 3200;
ADCWDGLowThreshold = 820;
}
ADC_AnalogWDGConfTypeDef AnalogWDGConfig = {0};
/*
* Configure the analog watchdog
*/
AnalogWDGConfig.WatchdogMode = ADC_ANALOGWATCHDOG_SINGLE_REG;
AnalogWDGConfig.HighThreshold = ADCWDGHighThreshold;
AnalogWDGConfig.LowThreshold = ADCWDGLowThreshold;
AnalogWDGConfig.Channel = ADC_CHANNEL_9;
AnalogWDGConfig.ITMode = ENABLE;
if (HAL_ADC_AnalogWDGConfig(&hadc3, &AnalogWDGConfig) != HAL_OK)
{
Error_Handler();
}
}
//-------------------------------------------------------------------------------------------------
void vApplicationStackOverflowHook( TaskHandle_t xTask, signed char *pcTaskName )
{
DEBUG_ERROR("Stack overflow: %s\r\n", pcTaskName);
osDelay(500);
}
//-------------------------------------------------------------------------------------------------
void getlastRecord(void)
{
for(uint16_t idx=0;idx<(W25Q16FV_BLOCK_SIZE>>4);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;
}
}
for(uint16_t idx=0;idx<(W25Q16FV_BLOCK_SIZE>>6);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;
}
}
}
//-------------------------------------------------------------------------------------------------
void getRotarySwitchSetting(void)
{
uint8_t tmpBuf = 0;
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;
Charger.isDebugEnable = OFF;
#ifdef FUNC_EMPX10_CUSTOMIZE_RS485_CLIENT_ADDRESS
if (!(((sbyte)tmpBuf) >= EMPX10_RS485_ADDR_MIN && ((sbyte)tmpBuf) <= EMPX10_RS485_ADDR_MAX))
{
Charger.isRotarySwitchError = ON;
}
DEBUG_INFO("Rotary switch (RS485 Addr) Setting: %d (%s)\r\n", tmpBuf, Charger.isRotarySwitchError ? "NG" : "OK");
Charger.m_EMPX10_RS485_ClientAddr = tmpBuf;
#ifdef FUNC_EMPX10_SET_FIXED_CURRENT_16A
Charger.maxRatingCurrent = 16;
#else //FUNC_EMPX10_SET_FIXED_CURRENT_16A
#ifdef FUNC_EMPX10_SET_FIXED_CURRENT_20A
Charger.maxRatingCurrent = 20;
#else
Charger.maxRatingCurrent = EVSE_MODEL_CURRENT_RATING;
#endif
#endif //FUNC_EMPX10_SET_FIXED_CURRENT_16A
#else //FUNC_EMPX10_CUSTOMIZE_RS485_CLIENT_ADDRESS
switch(tmpBuf)
{
case 0x00:
Charger.maxRatingCurrent = EVSE_MODEL_CURRENT_RATING;
DEBUG_INFO("Set maxRatingCurrent is Test mode\r\n");
Charger.isDebugEnable = ON;
break;
case 0x01:
Charger.maxRatingCurrent = (6>EVSE_MODEL_CURRENT_RATING?EVSE_MODEL_CURRENT_RATING:6);
Charger.isDebugEnable = OFF;
break;
case 0x02:
Charger.maxRatingCurrent = (8>EVSE_MODEL_CURRENT_RATING?EVSE_MODEL_CURRENT_RATING:8);
Charger.isDebugEnable = OFF;
break;
case 0x03:
Charger.maxRatingCurrent = (10>EVSE_MODEL_CURRENT_RATING?EVSE_MODEL_CURRENT_RATING:10);
Charger.isDebugEnable = OFF;
break;
case 0x04:
Charger.maxRatingCurrent = (13>EVSE_MODEL_CURRENT_RATING?EVSE_MODEL_CURRENT_RATING:13);
Charger.isDebugEnable = OFF;
break;
case 0x05:
Charger.maxRatingCurrent = (16>EVSE_MODEL_CURRENT_RATING?EVSE_MODEL_CURRENT_RATING:16);
Charger.isDebugEnable = OFF;
break;
case 0x06:
Charger.maxRatingCurrent = (20>EVSE_MODEL_CURRENT_RATING?EVSE_MODEL_CURRENT_RATING:20);
Charger.isDebugEnable = OFF;
break;
case 0x07:
Charger.maxRatingCurrent = (25>EVSE_MODEL_CURRENT_RATING?EVSE_MODEL_CURRENT_RATING:25);
Charger.isDebugEnable = OFF;
break;
case 0x08:
Charger.maxRatingCurrent = (32>EVSE_MODEL_CURRENT_RATING?EVSE_MODEL_CURRENT_RATING:32);
Charger.isDebugEnable = OFF;
break;
case 0x09:
Charger.maxRatingCurrent = (32>EVSE_MODEL_CURRENT_RATING?EVSE_MODEL_CURRENT_RATING:32);
Charger.isDebugEnable = OFF;
break ;
case 0x0a:
Charger.maxRatingCurrent = (30>EVSE_MODEL_CURRENT_RATING?EVSE_MODEL_CURRENT_RATING:30); // for JARI
Charger.isDebugEnable = OFF;
break ;
case 0x0b:
case 0x0c:
case 0x0d:
case 0x0e:
Charger.maxRatingCurrent = (32>EVSE_MODEL_CURRENT_RATING?EVSE_MODEL_CURRENT_RATING:32);
Charger.isRotarySwitchError = ON ;
Charger.isDebugEnable = OFF;
break ;
case 0x0f:
Charger.maxRatingCurrent = EVSE_MODEL_CURRENT_RATING;
DEBUG_INFO("Knob error Set maxRatingCurrent defualt 32A\r\n");
DEBUG_INFO("EVSE is Set Slave Mode\r\n");
Charger.isDebugEnable = OFF;
break;
default:
Charger.maxRatingCurrent = EVSE_MODEL_CURRENT_RATING;
DEBUG_INFO("knob default Set maxRatingCurrent defualt 32A\r\n");
Charger.isDebugEnable = OFF;
break;
}
#endif //FUNC_EMPX10_CUSTOMIZE_RS485_CLIENT_ADDRESS
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;
#endif //FUNC_TEST_RELAY_ALWAYS_ON
default:
break;
}
}
//--------------------------------------------------------------------------------
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)
{
#ifdef FUNC_EMP_LED_SET_MIN_BRIGHTNESS
case 0:
duty = max_duty/10;
break;
case 1:
duty = max_duty/10;
break;
#else //FUNC_EMP_LED_SET_MIN_BRIGHTNESS
case 0:
duty = max_duty/4;
break;
case 1:
duty = max_duty/3;
break;
#endif //FUNC_EMP_LED_SET_MIN_BRIGHTNESS
case 2:
duty = max_duty/2;
break;
case 3:
duty = max_duty;
break;
default:
duty = max_duty;
break;
}
return duty;
}
//--------------------------------------------------------------------------------
void parseVersionInfoFromModelname(void)
{
#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':
// WIFI + 4G
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);
//--------------------------------------
#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_CORMEX ;
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 ;
////#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 ;
Charger.alarm_spec.Current_LEAK_AC = 1800 ; // unit 0.01mA
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
Charger.OCP_Magnification = 110 ;
break;
case 'C':
//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
Charger.OCP_Magnification = 110 ;
break;
case 'J':
//JARI / Japan Market
Charger.CCID_Module_Type = CCID_MODULE_CORMEX ;
Charger.alarm_spec.Current_LEAK_AC = 2500 ; // unit 0.01mA
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
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
Charger.OCP_Magnification = 110 ;
break;
default:
Charger.CCID_Module_Type = CCID_MODULE_CORMEX ;
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
#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_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 };
//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)
{
//char OutStr[256] = { 0 };
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)
{
//char OutStr[256] = { 0 };
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)
{
uint16_t rtn = (uint16_t)((Curr / 0.6) * 10);
XP("#GetCpPwmDuty(%d) => %d\r\n", Curr, rtn);
return rtn;
}
#endif
#ifdef HTK
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;
}
}
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));
}
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;
}
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;
}
#endif //HTK
#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) //only in AX code
{
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
}
}
#endif //MODIFY_CPTASK_HEAD
#ifdef FUNC_FORCE_RUN_CSU_MODE_WITH_DC_MODELNAME
void Update_McuCtrlMode(void)
{
while (!Charger.m_bModelNameDCReadOK)
{
osDelay(100);
}
#ifdef FUNC_EMPX10_CUSTOMIZE_RUN_CSU_MODE
{
Charger.memory.EVSE_Config.data.item.MCU_Control_Mode = MCU_CONTROL_MODE_CSU;
DEBUG_INFO("#MCU_CONTROL_MODE_CSU\r\n");
}
#else
if (HAL_GPIO_ReadPin(IN_ACT_REQ_GPIO_Port, IN_ACT_REQ_Pin) == GPIO_PIN_RESET ||
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_EMPX10_CUSTOMIZE_RUN_CSU_MODE
}
#endif //FUNC_FORCE_RUN_CSU_MODE_WITH_DC_MODELNAME
#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)
{
#ifdef FUNC_EMPX10_CUSTOMIZE_RS485_CLIENT_ADDRESS
if (RxBuf == UART_IAP_rx_buffer)
{
TxBuf[1] = RxBuf[2];
}
else
#endif
if (RxBuf == UART_RS485_rx_buffer)
{
RS485_TX_Enable();
#ifdef FUNC_EMPX10_CUSTOMIZE_RS485_CLIENT_ADDRESS
//TxBuf[1] = RxBuf[2]; //Charger.m_EMPX10_RS485_ClientAddr;
TxBuf[1] = Charger.m_EMPX10_RS485_ClientAddr;
#else
TxBuf[1] = Charger.m_RS485SlaveAddr; //Update Slave Address
#endif
}
}
void Postfix_UartTX(uint8_t* TxBuf, uint8_t* RxBuf)
{
if (RxBuf == UART_RS485_rx_buffer)
{
RS485_TX_Disable();
}
}
#endif //MODIFY_DC_RS485_UPGRADE_ISSUE
/* USER CODE END Application */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/