|
@@ -32,13 +32,19 @@
|
|
|
#include "app.h"
|
|
|
#include "numeric.h"
|
|
|
#include "Fota.h"
|
|
|
-
|
|
|
+#include "signal.h"
|
|
|
//全局变量输入区
|
|
|
extern UINT32 Timer_count;
|
|
|
-extern volatile bool Sleep_flag;
|
|
|
+extern volatile BOOL Sleep_flag;
|
|
|
extern AppNVMDataType AppNVMData;
|
|
|
//全局变量输出区
|
|
|
-UartReadMsgType UartReadMsg;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+BOOL UartBattInfoRecvFlag = false;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
osMutexId_t UartMutex = NULL;//Uart数据锁
|
|
|
QueueHandle_t UartWriteCmdHandle = NULL;
|
|
|
UINT8 BattChrgEndFlag;
|
|
@@ -59,11 +65,14 @@ static process_Uart gProcess_Uart_Task = PROCESS_UART_STATE_IDLE;
|
|
|
//函数声明区
|
|
|
void USART_callback(uint32_t event);
|
|
|
UINT8 Uart_DataRecv_func(UINT8* Uart_Read_Msg,UINT8* Uart_Recv_Buffer);
|
|
|
+static BOOL uartBattInfoDecode(UINT8* dataPtr);
|
|
|
UINT8 Uart_WriteCmd_func(Uart_Write_Data_Type UartWriteData);
|
|
|
UINT16 crc_chk(UINT8* data, UINT8 length);
|
|
|
void battSOCDisplay(void);
|
|
|
void battErrorStateDisplay(void);
|
|
|
+void battWarningStateDisplay(void);
|
|
|
void battLockStateDisplay(UINT8 lockState);
|
|
|
+void relayPWMControl(void);
|
|
|
void SP_BMS_Update_Service(void);
|
|
|
BOOL BattHeaterSwitch(UINT8* heaterSwitch);
|
|
|
UINT16 encryptionAlgorithm (UINT16 plainText);
|
|
@@ -93,6 +102,8 @@ static void UartTask(void* arg)
|
|
|
BOOL uartReadSuccessFlag = false;
|
|
|
Uart_Read_Msg_Type Uart_Read_Msg;
|
|
|
Uart_Write_Data_Type UartWriteData; //Uart控制命令
|
|
|
+ UartReadMsgType UartReadMsg;
|
|
|
+ memset(&(UartReadMsg.UartFlag),0x00,sizeof(UartReadMsgType));
|
|
|
if(UartWriteCmdHandle == NULL)//Uart控制命令传输指针
|
|
|
{
|
|
|
UartWriteCmdHandle = osMessageQueueNew(3,sizeof(Uart_Write_Data_Type), NULL);
|
|
@@ -144,6 +155,13 @@ static void UartTask(void* arg)
|
|
|
{
|
|
|
uartReadSuccessFlag = true;
|
|
|
}
|
|
|
+ else
|
|
|
+ {
|
|
|
+ uartReadSuccessFlag = false;
|
|
|
+ }
|
|
|
+ #ifdef USING_PRINTF
|
|
|
+ printf("uartReadSuccessFlag = %d\n",uartReadSuccessFlag);
|
|
|
+ #endif
|
|
|
if(Timer_count-currentTimerCount >= 1)
|
|
|
{
|
|
|
if(AppNVMData.isBattLocked != 0)
|
|
@@ -155,6 +173,13 @@ static void UartTask(void* arg)
|
|
|
battSOCDisplay();
|
|
|
battErrorStateDisplay();
|
|
|
}
|
|
|
+ else
|
|
|
+ {
|
|
|
+ #ifdef USING_PRINTF
|
|
|
+ printf("battWarningStateDisplay\n");
|
|
|
+ #endif
|
|
|
+ battWarningStateDisplay();
|
|
|
+ }
|
|
|
}
|
|
|
currentTimerCount = Timer_count;
|
|
|
if(BMS_Fota_update_flag)
|
|
@@ -179,7 +204,7 @@ static void UartTask(void* arg)
|
|
|
}
|
|
|
case PROCESS_UART_STATE_READ:
|
|
|
{
|
|
|
- osStatus_t result = osMutexAcquire(UartMutex, osWaitForever);
|
|
|
+
|
|
|
Reg_Num = 0x21+BATT_CELL_VOL_NUM+BATT_TEMP_NUM + 2;//按照协议里面的0x21+X+N的结束地址
|
|
|
Uart_Read_Msg.Bms_Address = BMS_ADDRESS_CODE;
|
|
|
Uart_Read_Msg.Bms_Funcode = UART_READ_CODE;
|
|
@@ -188,19 +213,21 @@ static void UartTask(void* arg)
|
|
|
Uart_Read_Msg.Reg_Num_H = Reg_Num>>8;
|
|
|
Uart_Read_Msg.Reg_Num_L = Reg_Num;
|
|
|
Uart_Uds_LEN = Reg_Num*2;
|
|
|
+ memset(UartReadMsg.Header,0x00,Uart_Uds_LEN);
|
|
|
Uart_Recv_LEN = Uart_DataRecv_func((UINT8 *)&Uart_Read_Msg,UartReadMsg.Header);
|
|
|
- osMutexRelease(UartMutex);
|
|
|
+ //osMutexRelease(UartMutex);
|
|
|
if(Uart_Recv_LEN>0)
|
|
|
{
|
|
|
- UartReadMsg.UartFlag = TRUE;
|
|
|
+ UartBattInfoRecvFlag = TRUE;
|
|
|
+ uartBattInfoDecode(UartReadMsg.data);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- UartReadMsg.UartFlag = FALSE;
|
|
|
+ UartBattInfoRecvFlag = FALSE;
|
|
|
}
|
|
|
UartReadMsg.len = Uart_Recv_LEN;
|
|
|
PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_IDLE);
|
|
|
- if((UartReadMsg.data[(0x03+BATT_CELL_VOL_NUM)*2+1]&0x03)==0x02)
|
|
|
+ if( battWorkState ==0x02)
|
|
|
{
|
|
|
BattChrgEndFlag=TRUE;
|
|
|
}
|
|
@@ -208,7 +235,7 @@ static void UartTask(void* arg)
|
|
|
{
|
|
|
BattChrgEndFlag=FALSE;
|
|
|
}
|
|
|
- #ifdef USING_PRINTF1
|
|
|
+ #ifdef USING_PRINTF
|
|
|
printf("\nUart_Recv_buffer: ");
|
|
|
for(int i=0;i<Uart_Recv_LEN;i++)
|
|
|
{
|
|
@@ -239,9 +266,103 @@ static void UartTask(void* arg)
|
|
|
osThreadExit();
|
|
|
break;
|
|
|
}
|
|
|
+
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+//Uart 接收的数据解码
|
|
|
+static BOOL uartBattInfoDecode(UINT8* dataPtr)
|
|
|
+{
|
|
|
+ OsaUtcTimeTValue TimeStracture;
|
|
|
+ //BattInfoType battInfo;
|
|
|
+ UINT8 i,temp=0;
|
|
|
+ UINT8 TEMP_NUM = BATT_TEMP_NUM + BATT_OTHER_TEMP_NUM;
|
|
|
+ UINT16 Batt_current;
|
|
|
+ for(i=0;i<BATT_CELL_VOL_NUM;i++)
|
|
|
+ {
|
|
|
+ battCellU[i] = (dataPtr[(0x02+i)*2] << 8) | dataPtr[(0x02+i)*2 + 1];
|
|
|
+ }
|
|
|
+
|
|
|
+ battWorkState = (dataPtr[(0x03+BATT_CELL_VOL_NUM)*2+1])&0x03;//电池状态(原始数据),0表示静置,1表示放电,2表示充电
|
|
|
+
|
|
|
+ for(i=0; i<BATT_TEMP_NUM; i++)
|
|
|
+ {
|
|
|
+ battCellTemp[i] = dataPtr[(0x06+BATT_CELL_VOL_NUM+i)*2+1];
|
|
|
+ }
|
|
|
+ MOSTemp = dataPtr[(0x06+BATT_CELL_VOL_NUM+BATT_TEMP_NUM)*2+1];
|
|
|
+ packTemp = dataPtr[(0x06+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+1)*2+1];
|
|
|
+
|
|
|
+ Batt_current = (dataPtr[(0x02+BATT_CELL_VOL_NUM)*2]<<8)|(dataPtr[(0x02+BATT_CELL_VOL_NUM)*2+1]);
|
|
|
+ #ifdef USING_PRINTF
|
|
|
+ printf("Batt_current = %x\n",Batt_current);
|
|
|
+ #endif
|
|
|
+ //原始数据:充电为负,放电为正
|
|
|
+ if (Batt_current>0x8000) //为负,充电数据
|
|
|
+ {
|
|
|
+ Batt_current = (UINT16)((UINT16)(~(Batt_current))+1);
|
|
|
+ Batt_current = Batt_current/10;
|
|
|
+ Batt_current = -Batt_current + 0x2710;//平台数据:充电为负
|
|
|
+ //Batt_current = Batt_current;
|
|
|
+ }
|
|
|
+ else //为正,数据
|
|
|
+ {
|
|
|
+ Batt_current = Batt_current/10;
|
|
|
+ Batt_current = Batt_current + 0x2710;//平台数据:充电为负
|
|
|
+ //Batt_current = Batt_current;
|
|
|
+ }
|
|
|
+ battI = Batt_current;
|
|
|
+ #ifdef USING_PRINTF
|
|
|
+ printf("battI = %x\n",battI);
|
|
|
+ #endif
|
|
|
+ //bit0 ~ bit31 represent cell0 ~ cell31
|
|
|
+ battBalanceoInfo = dataPtr[(0x06+BATT_CELL_VOL_NUM+TEMP_NUM)*2+1] | (dataPtr[(0x06+BATT_CELL_VOL_NUM+TEMP_NUM)*2] <<8) + (dataPtr[(0x07+BATT_CELL_VOL_NUM+TEMP_NUM)*2+1]<<16) | (dataPtr[(0x07+BATT_CELL_VOL_NUM+TEMP_NUM)*2] <<24);
|
|
|
+
|
|
|
+ bmsHwVersion = dataPtr[(0x08+BATT_CELL_VOL_NUM+TEMP_NUM)*2+1];
|
|
|
+ bmsSwVersion = dataPtr[(0x08+BATT_CELL_VOL_NUM+TEMP_NUM)*2];
|
|
|
+
|
|
|
+ temp = ((dataPtr[(0x09+BATT_CELL_VOL_NUM+TEMP_NUM)*2+1])>>1)&0x03;
|
|
|
+ battMOSSwitchState = ((temp&0x01)<<1)|((temp&0x02)>>1);
|
|
|
+ if(AppNVMData.isBattLocked==TRUE)
|
|
|
+ {
|
|
|
+ battMOSSwitchState = battMOSSwitchState |(0x01<<2);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ battMOSSwitchState = battMOSSwitchState |(0x00<<2);
|
|
|
+ }
|
|
|
+ battWarningState = (dataPtr[(0x09+BATT_CELL_VOL_NUM+TEMP_NUM)*2+0]<<16) | (dataPtr[(0x0A+BATT_CELL_VOL_NUM+TEMP_NUM)*2+0] << 8) |(dataPtr[(0x0A+BATT_CELL_VOL_NUM+TEMP_NUM)*2+1]);
|
|
|
+ battSOC = dataPtr[(0x0B+BATT_CELL_VOL_NUM+TEMP_NUM)*2+1];
|
|
|
+ battSOH = dataPtr[(0x0C+BATT_CELL_VOL_NUM+TEMP_NUM)*2+1];
|
|
|
+ battPackVol =((dataPtr[(0x18+BATT_CELL_VOL_NUM+TEMP_NUM)*2])<<8|(dataPtr[(0x18+BATT_CELL_VOL_NUM+TEMP_NUM)*2+1]))/10; //uint 100mV
|
|
|
+ maxCellVol = (dataPtr[(0x19+BATT_CELL_VOL_NUM+TEMP_NUM)*2] << 8) | dataPtr[(0x19+BATT_CELL_VOL_NUM+TEMP_NUM)*2 + 1];
|
|
|
+ minCellVol = (dataPtr[(0x1A+BATT_CELL_VOL_NUM+TEMP_NUM)*2] << 8) | dataPtr[(0x1A+BATT_CELL_VOL_NUM+TEMP_NUM)*2 + 1];
|
|
|
+
|
|
|
+ battHeatEnableState = dataPtr[(0x1C+BATT_CELL_VOL_NUM+TEMP_NUM)*2+1]&0x01;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ maxCellTemp = 0x00;
|
|
|
+ minCellTemp = 0xFF;
|
|
|
+ for(i=0;i<BATT_TEMP_NUM;i++)
|
|
|
+ {
|
|
|
+ maxCellTemp = max(maxCellTemp,battCellTemp[i]);
|
|
|
+ minCellTemp = min(minCellTemp,battCellTemp[i]);
|
|
|
+ }
|
|
|
+ nbSwVersion = APPSWVERSION;
|
|
|
+ nbHwVersion = HWVERSION;
|
|
|
+
|
|
|
+ return true;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
//Uart线程初始化
|
|
|
void UartTaskInit(void *arg)
|
|
|
{
|
|
@@ -358,7 +479,7 @@ UINT8 Uart_WriteCmd_func(Uart_Write_Data_Type UartWriteData)
|
|
|
{
|
|
|
printf("%x ",Uart_Recv_Buffer[i]);
|
|
|
}
|
|
|
- printf("n");
|
|
|
+ printf("\n");
|
|
|
#endif
|
|
|
isRecvComplete = false;
|
|
|
if(Uart_Recv_Buffer[1]==0x10)
|
|
@@ -416,30 +537,26 @@ UINT8 Uart_DataRecv_func(UINT8* Uart_Read_Msg,UINT8* Uart_Recv_Buffer)
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- #ifdef USING_PRINTF
|
|
|
- printf("%s[%d]\r\n",__FUNCTION__, __LINE__);
|
|
|
- printf("timeout = %d\n",timeout);
|
|
|
- #endif
|
|
|
- #ifdef USING_PRINTF1
|
|
|
- printf("Uart_Rece_buffer: ");
|
|
|
- for(int i=0;i<Data_Len;i++)
|
|
|
- {
|
|
|
- printf("%x ",*(Uart_Recv_Buffer+i));
|
|
|
- }
|
|
|
- #endif
|
|
|
+ #ifdef USING_PRINTF
|
|
|
+ printf("Uart_Rece_buffer1: ");
|
|
|
+ for(int i=0;i<Data_Len;i++)
|
|
|
+ {
|
|
|
+ printf("%x ",*(Uart_Recv_Buffer+i));
|
|
|
+ }
|
|
|
+ #endif
|
|
|
if (isRecvComplete == true)
|
|
|
{
|
|
|
isRecvComplete = false;
|
|
|
CRC_Rece_buffer =*(Uart_Recv_Buffer+Data_Len-1)<<8|*(Uart_Recv_Buffer+Data_Len-2);
|
|
|
CRC_chk_buffer = crc_chk(Uart_Recv_Buffer,Data_Len-2);
|
|
|
- // #ifdef USING_PRINTF
|
|
|
- // printf("Uart_Rece_buffer after Crc: ");
|
|
|
- // for(int i=0;i<Data_Len;i++)
|
|
|
- // {
|
|
|
- // printf("%x ",*(Uart_Recv_Buffer+i));
|
|
|
- // }
|
|
|
- // printf("\tcrcchk:%x,%x\n ",CRC_chk_buffer,CRC_Rece_buffer);
|
|
|
- // #endif
|
|
|
+ #ifdef USING_PRINTF
|
|
|
+ printf("Uart_Rece_buffer after Crc: ");
|
|
|
+ for(int i=0;i<Data_Len;i++)
|
|
|
+ {
|
|
|
+ printf("%x ",*(Uart_Recv_Buffer+i));
|
|
|
+ }
|
|
|
+ printf("\tcrcchk:%x,%x\n ",CRC_chk_buffer,CRC_Rece_buffer);
|
|
|
+ #endif
|
|
|
if (CRC_Rece_buffer == CRC_chk_buffer)//满足校验
|
|
|
{
|
|
|
return Data_Len;//此处指针移位出现重启问题
|
|
@@ -479,32 +596,17 @@ BOOL BattHeaterSwitch(UINT8* heaterSwitch)
|
|
|
{
|
|
|
BOOL isNeedtoSwitch = FALSE;
|
|
|
|
|
|
- UINT8 battCellTemp[BATT_TEMP_NUM];
|
|
|
- UINT8 maxCellTemp,minCellTemp;
|
|
|
-
|
|
|
UINT8 i =0;
|
|
|
UINT8 currentSwitchState = 0;
|
|
|
|
|
|
//get the current switch state and the cell temp
|
|
|
- currentSwitchState = UartReadMsg.data[(0x1C+BATT_CELL_VOL_NUM+(BATT_TEMP_NUM+2))*2+1]&0x01;
|
|
|
- for(int i=0; i<BATT_TEMP_NUM; i++)
|
|
|
- {
|
|
|
- battCellTemp[i] = UartReadMsg.data[(0x06+BATT_CELL_VOL_NUM+i)*2+1];
|
|
|
- }
|
|
|
-
|
|
|
- //cal the maxtemp and mintemp
|
|
|
- maxCellTemp = battCellTemp[0];
|
|
|
- minCellTemp = battCellTemp[0];
|
|
|
- for(i=1;i<BATT_TEMP_NUM;i++)
|
|
|
- {
|
|
|
- maxCellTemp = max(maxCellTemp,battCellTemp[i]);
|
|
|
- minCellTemp = min(minCellTemp,battCellTemp[i]);
|
|
|
- }
|
|
|
-
|
|
|
+ currentSwitchState = battMOSSwitchState & 0x01;
|
|
|
+
|
|
|
+
|
|
|
|
|
|
if(currentSwitchState==0) //当前状态为关闭,判断是否应该开启
|
|
|
{
|
|
|
- if(minCellTemp<=5+40 && maxCellTemp<25+40)//温度偏移为40
|
|
|
+ if(minCellTemp<=5+40 && maxCellTemp<25+40 && battSOC>=12)//温度偏移为40
|
|
|
{
|
|
|
*heaterSwitch = 1;
|
|
|
isNeedtoSwitch = true;
|
|
@@ -512,7 +614,7 @@ BOOL BattHeaterSwitch(UINT8* heaterSwitch)
|
|
|
}
|
|
|
else //当前状态为开启,判断是否应该关闭
|
|
|
{
|
|
|
- if(minCellTemp>10+40||maxCellTemp>30+40)
|
|
|
+ if(minCellTemp>10+40 || maxCellTemp>30+40 || battSOC<10)
|
|
|
{
|
|
|
*heaterSwitch = 0;
|
|
|
isNeedtoSwitch= true;
|
|
@@ -523,8 +625,7 @@ BOOL BattHeaterSwitch(UINT8* heaterSwitch)
|
|
|
|
|
|
void battSOCDisplay()
|
|
|
{
|
|
|
- static UINT8 workState;
|
|
|
- static UINT8 currentSoc;
|
|
|
+
|
|
|
static UINT8 lightTimer = 0;
|
|
|
UINT8 socLowLEDFlashPeriod = 10;//10*100 = 1000ms
|
|
|
UINT8 chargeLEDFlashPeriod = 6;//6*100 = 600ms
|
|
@@ -536,195 +637,187 @@ void battSOCDisplay()
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- if(UartReadMsg.Header[2]>0)
|
|
|
- {
|
|
|
- temp = UartReadMsg.data[(0x03+BATT_CELL_VOL_NUM)*2+1]&0x03;
|
|
|
- workState = ((temp&0x01)<<01)|(temp>>0x01);
|
|
|
- currentSoc = UartReadMsg.data[(0x0B+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+2)*2+1];
|
|
|
- }
|
|
|
- #ifdef USING_PRINTF1
|
|
|
- printf("current SOC = %d\n",currentSoc);
|
|
|
- printf("work state = %d\n",workState);
|
|
|
- #endif
|
|
|
-
|
|
|
- lightTimer++;
|
|
|
-
|
|
|
- if(workState == 0||workState == 2) //静置或放电状态
|
|
|
- {
|
|
|
- if(currentSoc<=10)
|
|
|
+ if(UartBattInfoRecvFlag == true)
|
|
|
+ {
|
|
|
+ lightTimer++;
|
|
|
+
|
|
|
+ if(battWorkState == 0||battWorkState == 1) //静置或放电状态
|
|
|
{
|
|
|
- if(lightTimer<(UINT8)(socLowLEDFlashPeriod*dutyRatio))
|
|
|
- {
|
|
|
- NetSocDisplay(LED_SOC_0,LED_TURN_ON);
|
|
|
- NetSocDisplay(LED_SOC_1,LED_TURN_OFF);
|
|
|
- NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
|
|
|
- NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
|
|
|
- }
|
|
|
- else if(lightTimer>=(UINT8)(socLowLEDFlashPeriod*dutyRatio) && lightTimer<socLowLEDFlashPeriod)
|
|
|
- {
|
|
|
- NetSocDisplay(LED_SOC_0,LED_TURN_OFF);
|
|
|
- NetSocDisplay(LED_SOC_1,LED_TURN_OFF);
|
|
|
- NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
|
|
|
- NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
|
|
|
- }
|
|
|
- else
|
|
|
+ if(battSOC<=10)
|
|
|
{
|
|
|
- NetSocDisplay(LED_SOC_0,LED_TURN_OFF);
|
|
|
- NetSocDisplay(LED_SOC_1,LED_TURN_OFF);
|
|
|
- NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
|
|
|
- NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
|
|
|
- lightTimer = 0;
|
|
|
- }
|
|
|
- }
|
|
|
- else if(currentSoc>10&¤tSoc<=25)
|
|
|
- {
|
|
|
- NetSocDisplay(LED_SOC_0,LED_TURN_ON);
|
|
|
- NetSocDisplay(LED_SOC_1,LED_TURN_OFF);
|
|
|
- NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
|
|
|
- NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
|
|
|
- lightTimer = 0;
|
|
|
- }
|
|
|
- else if(currentSoc>25&¤tSoc<=50)
|
|
|
- {
|
|
|
- NetSocDisplay(LED_SOC_0,LED_TURN_ON);
|
|
|
- NetSocDisplay(LED_SOC_1,LED_TURN_ON);
|
|
|
- NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
|
|
|
- NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
|
|
|
- lightTimer = 0;
|
|
|
- }
|
|
|
- else if(currentSoc>50&¤tSoc<=75)
|
|
|
- {
|
|
|
- NetSocDisplay(LED_SOC_0,LED_TURN_ON);
|
|
|
- NetSocDisplay(LED_SOC_1,LED_TURN_ON);
|
|
|
- NetSocDisplay(LED_SOC_2,LED_TURN_ON);
|
|
|
- NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
|
|
|
- lightTimer = 0;
|
|
|
- }
|
|
|
- else if(currentSoc>75&¤tSoc<=100)
|
|
|
- {
|
|
|
- NetSocDisplay(LED_SOC_0,LED_TURN_ON);
|
|
|
- NetSocDisplay(LED_SOC_1,LED_TURN_ON);
|
|
|
- NetSocDisplay(LED_SOC_2,LED_TURN_ON);
|
|
|
- NetSocDisplay(LED_SOC_3,LED_TURN_ON);
|
|
|
- lightTimer = 0;
|
|
|
- }
|
|
|
- }
|
|
|
- else if(workState == 1)
|
|
|
- {
|
|
|
- if(currentSoc<=25)
|
|
|
- {
|
|
|
- if(lightTimer<(UINT8)(chargeLEDFlashPeriod*dutyRatio))
|
|
|
+ if(lightTimer<(UINT8)(socLowLEDFlashPeriod*dutyRatio))
|
|
|
+ {
|
|
|
+ NetSocDisplay(LED_SOC_0,LED_TURN_ON);
|
|
|
+ NetSocDisplay(LED_SOC_1,LED_TURN_OFF);
|
|
|
+ NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
|
|
|
+ NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
|
|
|
+ }
|
|
|
+ else if(lightTimer>=(UINT8)(socLowLEDFlashPeriod*dutyRatio) && lightTimer<socLowLEDFlashPeriod)
|
|
|
+ {
|
|
|
+ NetSocDisplay(LED_SOC_0,LED_TURN_OFF);
|
|
|
+ NetSocDisplay(LED_SOC_1,LED_TURN_OFF);
|
|
|
+ NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
|
|
|
+ NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ NetSocDisplay(LED_SOC_0,LED_TURN_OFF);
|
|
|
+ NetSocDisplay(LED_SOC_1,LED_TURN_OFF);
|
|
|
+ NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
|
|
|
+ NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
|
|
|
+ lightTimer = 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if(battSOC>10&&battSOC<=25)
|
|
|
{
|
|
|
NetSocDisplay(LED_SOC_0,LED_TURN_ON);
|
|
|
NetSocDisplay(LED_SOC_1,LED_TURN_OFF);
|
|
|
NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
|
|
|
NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
|
|
|
- }
|
|
|
- else if(lightTimer>=(UINT8)(chargeLEDFlashPeriod*dutyRatio) && lightTimer<chargeLEDFlashPeriod)
|
|
|
- {
|
|
|
- NetSocDisplay(LED_SOC_0,LED_TURN_OFF);
|
|
|
- NetSocDisplay(LED_SOC_1,LED_TURN_OFF);
|
|
|
- NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
|
|
|
- NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- NetSocDisplay(LED_SOC_0,LED_TURN_OFF);
|
|
|
- NetSocDisplay(LED_SOC_1,LED_TURN_OFF);
|
|
|
- NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
|
|
|
- NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
|
|
|
lightTimer = 0;
|
|
|
- }
|
|
|
- }
|
|
|
- else if(currentSoc>25&¤tSoc<=50)
|
|
|
- {
|
|
|
- if(lightTimer<(UINT8)(chargeLEDFlashPeriod*dutyRatio))
|
|
|
- {
|
|
|
- NetSocDisplay(LED_SOC_0,LED_TURN_ON);
|
|
|
- NetSocDisplay(LED_SOC_1,LED_TURN_ON);
|
|
|
- NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
|
|
|
- NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
|
|
|
}
|
|
|
- else if(lightTimer>=(UINT8)(chargeLEDFlashPeriod*dutyRatio) && lightTimer<chargeLEDFlashPeriod)
|
|
|
+ else if(battSOC>25&&battSOC<=50)
|
|
|
{
|
|
|
NetSocDisplay(LED_SOC_0,LED_TURN_ON);
|
|
|
- NetSocDisplay(LED_SOC_1,LED_TURN_OFF);
|
|
|
+ NetSocDisplay(LED_SOC_1,LED_TURN_ON);
|
|
|
NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
|
|
|
NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- NetSocDisplay(LED_SOC_0,LED_TURN_ON);
|
|
|
- NetSocDisplay(LED_SOC_1,LED_TURN_OFF);
|
|
|
- NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
|
|
|
- NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
|
|
|
lightTimer = 0;
|
|
|
}
|
|
|
- }
|
|
|
- else if(currentSoc>50&¤tSoc<=75)
|
|
|
- {
|
|
|
- if(lightTimer<(UINT8)(chargeLEDFlashPeriod*dutyRatio))
|
|
|
+ else if(battSOC>50&&battSOC<=75)
|
|
|
{
|
|
|
NetSocDisplay(LED_SOC_0,LED_TURN_ON);
|
|
|
NetSocDisplay(LED_SOC_1,LED_TURN_ON);
|
|
|
NetSocDisplay(LED_SOC_2,LED_TURN_ON);
|
|
|
NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
|
|
|
+ lightTimer = 0;
|
|
|
}
|
|
|
- else if(lightTimer>=(UINT8)(chargeLEDFlashPeriod*dutyRatio) && lightTimer<chargeLEDFlashPeriod)
|
|
|
- {
|
|
|
- NetSocDisplay(LED_SOC_0,LED_TURN_ON);
|
|
|
- NetSocDisplay(LED_SOC_1,LED_TURN_ON);
|
|
|
- NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
|
|
|
- NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
|
|
|
- }
|
|
|
- else
|
|
|
+ else if(battSOC>75&&battSOC<=100)
|
|
|
{
|
|
|
NetSocDisplay(LED_SOC_0,LED_TURN_ON);
|
|
|
NetSocDisplay(LED_SOC_1,LED_TURN_ON);
|
|
|
- NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
|
|
|
- NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
|
|
|
+ NetSocDisplay(LED_SOC_2,LED_TURN_ON);
|
|
|
+ NetSocDisplay(LED_SOC_3,LED_TURN_ON);
|
|
|
lightTimer = 0;
|
|
|
}
|
|
|
-
|
|
|
}
|
|
|
- else if(currentSoc>75&¤tSoc<=97)
|
|
|
+ else if(battWorkState == 2)
|
|
|
{
|
|
|
- if(lightTimer<(UINT8)(chargeLEDFlashPeriod*dutyRatio))
|
|
|
+ if(battSOC<=25)
|
|
|
{
|
|
|
- NetSocDisplay(LED_SOC_0,LED_TURN_ON);
|
|
|
- NetSocDisplay(LED_SOC_1,LED_TURN_ON);
|
|
|
- NetSocDisplay(LED_SOC_2,LED_TURN_ON);
|
|
|
- NetSocDisplay(LED_SOC_3,LED_TURN_ON);
|
|
|
+ if(lightTimer<(UINT8)(chargeLEDFlashPeriod*dutyRatio))
|
|
|
+ {
|
|
|
+ NetSocDisplay(LED_SOC_0,LED_TURN_ON);
|
|
|
+ NetSocDisplay(LED_SOC_1,LED_TURN_OFF);
|
|
|
+ NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
|
|
|
+ NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
|
|
|
+ }
|
|
|
+ else if(lightTimer>=(UINT8)(chargeLEDFlashPeriod*dutyRatio) && lightTimer<chargeLEDFlashPeriod)
|
|
|
+ {
|
|
|
+ NetSocDisplay(LED_SOC_0,LED_TURN_OFF);
|
|
|
+ NetSocDisplay(LED_SOC_1,LED_TURN_OFF);
|
|
|
+ NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
|
|
|
+ NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ NetSocDisplay(LED_SOC_0,LED_TURN_OFF);
|
|
|
+ NetSocDisplay(LED_SOC_1,LED_TURN_OFF);
|
|
|
+ NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
|
|
|
+ NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
|
|
|
+ lightTimer = 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if(battSOC>25&&battSOC<=50)
|
|
|
+ {
|
|
|
+ if(lightTimer<(UINT8)(chargeLEDFlashPeriod*dutyRatio))
|
|
|
+ {
|
|
|
+ NetSocDisplay(LED_SOC_0,LED_TURN_ON);
|
|
|
+ NetSocDisplay(LED_SOC_1,LED_TURN_ON);
|
|
|
+ NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
|
|
|
+ NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
|
|
|
+ }
|
|
|
+ else if(lightTimer>=(UINT8)(chargeLEDFlashPeriod*dutyRatio) && lightTimer<chargeLEDFlashPeriod)
|
|
|
+ {
|
|
|
+ NetSocDisplay(LED_SOC_0,LED_TURN_ON);
|
|
|
+ NetSocDisplay(LED_SOC_1,LED_TURN_OFF);
|
|
|
+ NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
|
|
|
+ NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ NetSocDisplay(LED_SOC_0,LED_TURN_ON);
|
|
|
+ NetSocDisplay(LED_SOC_1,LED_TURN_OFF);
|
|
|
+ NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
|
|
|
+ NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
|
|
|
+ lightTimer = 0;
|
|
|
+ }
|
|
|
}
|
|
|
- else if(lightTimer>=(UINT8)(chargeLEDFlashPeriod*dutyRatio) && lightTimer<chargeLEDFlashPeriod)
|
|
|
+ else if(battSOC>50&&battSOC<=75)
|
|
|
{
|
|
|
- NetSocDisplay(LED_SOC_0,LED_TURN_ON);
|
|
|
- NetSocDisplay(LED_SOC_1,LED_TURN_ON);
|
|
|
- NetSocDisplay(LED_SOC_2,LED_TURN_ON);
|
|
|
- NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
|
|
|
+ if(lightTimer<(UINT8)(chargeLEDFlashPeriod*dutyRatio))
|
|
|
+ {
|
|
|
+ NetSocDisplay(LED_SOC_0,LED_TURN_ON);
|
|
|
+ NetSocDisplay(LED_SOC_1,LED_TURN_ON);
|
|
|
+ NetSocDisplay(LED_SOC_2,LED_TURN_ON);
|
|
|
+ NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
|
|
|
+ }
|
|
|
+ else if(lightTimer>=(UINT8)(chargeLEDFlashPeriod*dutyRatio) && lightTimer<chargeLEDFlashPeriod)
|
|
|
+ {
|
|
|
+ NetSocDisplay(LED_SOC_0,LED_TURN_ON);
|
|
|
+ NetSocDisplay(LED_SOC_1,LED_TURN_ON);
|
|
|
+ NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
|
|
|
+ NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ NetSocDisplay(LED_SOC_0,LED_TURN_ON);
|
|
|
+ NetSocDisplay(LED_SOC_1,LED_TURN_ON);
|
|
|
+ NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
|
|
|
+ NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
|
|
|
+ lightTimer = 0;
|
|
|
+ }
|
|
|
+
|
|
|
}
|
|
|
- else
|
|
|
+ else if(battSOC>75&&battSOC<=97)
|
|
|
+ {
|
|
|
+ if(lightTimer<(UINT8)(chargeLEDFlashPeriod*dutyRatio))
|
|
|
+ {
|
|
|
+ NetSocDisplay(LED_SOC_0,LED_TURN_ON);
|
|
|
+ NetSocDisplay(LED_SOC_1,LED_TURN_ON);
|
|
|
+ NetSocDisplay(LED_SOC_2,LED_TURN_ON);
|
|
|
+ NetSocDisplay(LED_SOC_3,LED_TURN_ON);
|
|
|
+ }
|
|
|
+ else if(lightTimer>=(UINT8)(chargeLEDFlashPeriod*dutyRatio) && lightTimer<chargeLEDFlashPeriod)
|
|
|
+ {
|
|
|
+ NetSocDisplay(LED_SOC_0,LED_TURN_ON);
|
|
|
+ NetSocDisplay(LED_SOC_1,LED_TURN_ON);
|
|
|
+ NetSocDisplay(LED_SOC_2,LED_TURN_ON);
|
|
|
+ NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ NetSocDisplay(LED_SOC_0,LED_TURN_ON);
|
|
|
+ NetSocDisplay(LED_SOC_1,LED_TURN_ON);
|
|
|
+ NetSocDisplay(LED_SOC_2,LED_TURN_ON);
|
|
|
+ NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
|
|
|
+ lightTimer = 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if(battSOC>97&&battSOC<=100)
|
|
|
{
|
|
|
NetSocDisplay(LED_SOC_0,LED_TURN_ON);
|
|
|
NetSocDisplay(LED_SOC_1,LED_TURN_ON);
|
|
|
NetSocDisplay(LED_SOC_2,LED_TURN_ON);
|
|
|
- NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
|
|
|
- lightTimer = 0;
|
|
|
- }
|
|
|
+ NetSocDisplay(LED_SOC_3,LED_TURN_ON);
|
|
|
+ }
|
|
|
}
|
|
|
- else if(currentSoc>97&¤tSoc<=100)
|
|
|
- {
|
|
|
- NetSocDisplay(LED_SOC_0,LED_TURN_ON);
|
|
|
- NetSocDisplay(LED_SOC_1,LED_TURN_ON);
|
|
|
- NetSocDisplay(LED_SOC_2,LED_TURN_ON);
|
|
|
- NetSocDisplay(LED_SOC_3,LED_TURN_ON);
|
|
|
- }
|
|
|
}
|
|
|
|
|
|
}
|
|
|
+
|
|
|
void battErrorStateDisplay()
|
|
|
-{
|
|
|
- static UINT32 errorState;
|
|
|
+{
|
|
|
static UINT8 errorLightTimer = 0;
|
|
|
//static UINT32 currentTimerCount=0;
|
|
|
|
|
@@ -736,46 +829,84 @@ void battErrorStateDisplay()
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- if(UartReadMsg.Header[2]>0)
|
|
|
- {
|
|
|
- errorState = ((UartReadMsg.data[(0x09+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+2)*2])<<8)|0|((UartReadMsg.data[(0x0A+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+2)*2])<<24)|((UartReadMsg.data[(0x0A+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+2)*2+1])<<16);
|
|
|
- //MEMCPY(&errorState,&(UartReadMsg.data[(0x09+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+2)*2]),4);
|
|
|
- }
|
|
|
+ if(UartBattInfoRecvFlag == true)
|
|
|
+ {
|
|
|
|
|
|
- errorLightTimer++;
|
|
|
-
|
|
|
- //errorState = testErrorState;
|
|
|
- #ifdef USING_PRINTF1
|
|
|
- for(int k=0;k<UartReadMsg.Header[2];k++)
|
|
|
- printf("%x ",UartReadMsg.data[k]);
|
|
|
- printf("error state = %x\n",errorState);
|
|
|
- #endif
|
|
|
- if(errorState != 0)
|
|
|
- {
|
|
|
- if(errorLightTimer<(UINT8)(errorLEDFlashPeriod*errorDutyRatio))
|
|
|
- {
|
|
|
- FaultDisplay(LED_TURN_ON);
|
|
|
-
|
|
|
- }
|
|
|
- else if(errorLightTimer>=(UINT8)(errorLEDFlashPeriod*errorDutyRatio) && errorLightTimer<errorLEDFlashPeriod)
|
|
|
+ errorLightTimer++;
|
|
|
+
|
|
|
+ if(battWarningState != 0)
|
|
|
{
|
|
|
- FaultDisplay(LED_TURN_OFF);
|
|
|
+ if(errorLightTimer<(UINT8)(errorLEDFlashPeriod*errorDutyRatio))
|
|
|
+ {
|
|
|
+
|
|
|
+ FaultDisplay(LED_TURN_ON);
|
|
|
+
|
|
|
+ }
|
|
|
+ else if(errorLightTimer>=(UINT8)(errorLEDFlashPeriod*errorDutyRatio) && errorLightTimer<errorLEDFlashPeriod)
|
|
|
+ {
|
|
|
+
|
|
|
+ FaultDisplay(LED_TURN_OFF);
|
|
|
+
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+
|
|
|
+ FaultDisplay(LED_TURN_OFF);
|
|
|
+ errorLightTimer = 0;
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
FaultDisplay(LED_TURN_OFF);
|
|
|
- errorLightTimer = 0;
|
|
|
- }
|
|
|
-
|
|
|
+ errorLightTimer = 0;
|
|
|
+ }
|
|
|
}
|
|
|
- else
|
|
|
- {
|
|
|
- FaultDisplay(LED_TURN_OFF);
|
|
|
- errorLightTimer = 0;
|
|
|
- }
|
|
|
}
|
|
|
|
|
|
+void battWarningStateDisplay()
|
|
|
+{
|
|
|
+ static UINT8 warningLightTimer = 0;
|
|
|
+ //static UINT32 currentTimerCount=0;
|
|
|
+
|
|
|
+ UINT8 warningLEDFlashPeriod = 6;//600ms
|
|
|
+ float warningDutyRatio = 0.4;
|
|
|
+
|
|
|
+ if(AppNVMData.isBattLocked == TRUE)
|
|
|
+ {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(UartBattInfoRecvFlag == false)
|
|
|
+ {
|
|
|
+ warningLightTimer++;
|
|
|
+
|
|
|
+ //if(battWarningState != 0)
|
|
|
+ {
|
|
|
+ if(warningLightTimer<(UINT8)(warningLEDFlashPeriod*warningDutyRatio))
|
|
|
+ {
|
|
|
+ NetSocDisplay(LED_SOC_0,LED_TURN_ON);
|
|
|
+ FaultDisplay(LED_TURN_ON);
|
|
|
+
|
|
|
+ }
|
|
|
+ else if(warningLightTimer>=(UINT8)(warningLEDFlashPeriod*warningDutyRatio) && warningLightTimer<warningLEDFlashPeriod)
|
|
|
+ {
|
|
|
+ NetSocDisplay(LED_SOC_0,LED_TURN_OFF);
|
|
|
+ FaultDisplay(LED_TURN_OFF);
|
|
|
+
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ NetSocDisplay(LED_SOC_0,LED_TURN_OFF);
|
|
|
+ FaultDisplay(LED_TURN_OFF);
|
|
|
+ warningLightTimer = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
|
|
|
|
|
|
void battLockStateDisplay(UINT8 lockState)
|
|
@@ -837,7 +968,30 @@ void battLockStateDisplay(UINT8 lockState)
|
|
|
}
|
|
|
errorLightTimer++;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
+void relayPWMControl()
|
|
|
+{
|
|
|
+ static UINT8 timerCount=0;
|
|
|
+ //printf("timerCout=%d\n",timerCount);
|
|
|
+ if(timerCount<2)
|
|
|
+ {
|
|
|
+ relayControl(TRUE);
|
|
|
+ timerCount++;
|
|
|
+ }
|
|
|
+ else if(timerCount>=2 && timerCount<5)
|
|
|
+ {
|
|
|
+ relayControl(FALSE);
|
|
|
+ timerCount++;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ relayControl(FALSE);
|
|
|
+ timerCount = 0;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
UINT8 decryptionAlgorithm (UINT16 cipherText)
|
|
|
{
|
|
|
UINT16 plainText = 1;
|
|
@@ -1731,6 +1885,7 @@ void SP_BMS_Update_Service() //超力源BMS升级服务
|
|
|
|
|
|
UINT8 SP_BMS_Update_Query(UINT8* pSend,UINT32 sendLen, UINT8* pRead, UINT32 readLen, UINT32 timeout)
|
|
|
{
|
|
|
+
|
|
|
UINT8 timeCount = 0;
|
|
|
UINT8 j=0;
|
|
|
USARTdrv->Send(pSend,sendLen);
|