UartTask.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821
  1. /****************************************************************************
  2. *
  3. * Copy right: Qx.
  4. * File name: UartTask.c
  5. * Description: 串口任务
  6. * History: 2021-03-05
  7. *
  8. ****************************************************************************/
  9. #include "bsp.h"
  10. #include "bsp_custom.h"
  11. #include "osasys.h"
  12. #include "ostask.h"
  13. #include "queue.h"
  14. #include "ps_event_callback.h"
  15. #include "cmisim.h"
  16. #include "cmimm.h"
  17. #include "cmips.h"
  18. #include "sockets.h"
  19. #include "psifevent.h"
  20. #include "ps_lib_api.h"
  21. #include "lwip/netdb.h"
  22. //#include <cis_def.h>
  23. #include "debug_log.h"
  24. #include "slpman_ec616.h"
  25. #include "plat_config.h"
  26. #include "ec_tcpip_api.h"
  27. #include "hal_module_adapter.h"
  28. #include "UartTask.h"
  29. #include "MainTask.h"
  30. #include "app.h"
  31. #include "numeric.h"
  32. //全局变量输入区
  33. extern UINT32 Timer_count;
  34. extern volatile bool Sleep_flag;
  35. extern AppNVMDataType AppNVMData;
  36. //全局变量输出区
  37. UartReadMsgType UartReadMsg;
  38. osMutexId_t UartMutex = NULL;//Uart数据锁
  39. QueueHandle_t UartWriteCmdHandle = NULL;
  40. UINT8 BattChrgEndFlag;
  41. //
  42. extern ARM_DRIVER_USART Driver_USART1;
  43. static ARM_DRIVER_USART *USARTdrv = &Driver_USART1;
  44. volatile bool isRecvTimeout = false;
  45. volatile bool isRecvComplete = false;
  46. //线程声明区
  47. static StaticTask_t gProcess_Uart_Task_t;
  48. static UINT8 gProcess_Uart_TaskStack[PROC_UART_TASK_STACK_SIZE];
  49. static osThreadId_t UartTaskId = NULL;
  50. static process_Uart gProcess_Uart_Task = PROCESS_UART_STATE_IDLE;
  51. #define PROC_UART_STATE_SWITCH(a) (gProcess_Uart_Task = a)
  52. //函数声明区
  53. void USART_callback(uint32_t event);
  54. UINT8 Uart_Transmit_func(UINT8* Uart_Read_Msg,UINT8* Uart_Recv_Buffer);
  55. UINT8 Uart_WriteCmd_func(Uart_Write_Data_Type UartWriteData);
  56. UINT16 crc_chk(UINT8* data, UINT8 length);
  57. void battSOCDisplay(void);
  58. void battErrorStateDisplay(void);
  59. void battLockStateDisplay(UINT8 lockState);
  60. void SP_BMS_Update_Service(void);
  61. BOOL BattHeaterSwitch(UINT8* heaterSwitch);
  62. //Uart线程任务区
  63. static void UartTask(void* arg)
  64. {
  65. USARTdrv->Initialize(USART_callback);
  66. USARTdrv->PowerControl(ARM_POWER_FULL);
  67. USARTdrv->Control(ARM_USART_MODE_ASYNCHRONOUS |
  68. ARM_USART_DATA_BITS_8 |
  69. ARM_USART_PARITY_NONE |
  70. ARM_USART_STOP_BITS_1 |
  71. ARM_USART_FLOW_CONTROL_NONE, 9600);
  72. PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_IDLE);
  73. UINT16 Reg_Num = 0;
  74. UINT16 Uart_Uds_LEN;
  75. UINT16 Uart_Recv_LEN;
  76. UINT32 currentTimerCount=0;
  77. BOOL uartReadSuccessFlag = false;
  78. Uart_Read_Msg_Type Uart_Read_Msg;
  79. Uart_Write_Data_Type UartWriteData; //Uart控制命令
  80. if(UartWriteCmdHandle == NULL)//Uart控制命令传输指针
  81. {
  82. UartWriteCmdHandle = osMessageQueueNew(3,sizeof(Uart_Write_Data_Type), NULL);
  83. }
  84. if(UartMutex == NULL)
  85. {
  86. UartMutex = osMutexNew(NULL);
  87. }
  88. //上电起始控制区域
  89. UartWriteData.WriteCmd = 0x01;
  90. if(AppNVMData.isBattLocked)
  91. {
  92. UartWriteData.Data[0] = 0x00;
  93. UartWriteData.Data[1] = 0x00;
  94. }
  95. else
  96. {
  97. UartWriteData.Data[0] = 0x00;
  98. UartWriteData.Data[1] = 0x03;
  99. }
  100. osMessageQueuePut(UartWriteCmdHandle,&UartWriteData,0,1000);
  101. while (1)
  102. {
  103. switch (gProcess_Uart_Task)
  104. {
  105. case PROCESS_UART_STATE_IDLE:
  106. {
  107. osDelay(100);
  108. if(Sleep_flag)
  109. {
  110. PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_SLEEP);
  111. }
  112. else if(Timer_count%10==0)
  113. {
  114. #ifdef USING_PRINTF
  115. printf("[%d]Uart Timer 5s:%d\n",__LINE__,Timer_count);
  116. #endif
  117. if(osMessageQueueGet(UartWriteCmdHandle,&UartWriteData,0,0)==osOK)
  118. {
  119. #ifdef USING_PRINTF
  120. printf("[%d]UartWriteCmdHandle :%x\n",__LINE__,UartWriteData.WriteCmd);
  121. #endif
  122. PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_WRITE);
  123. }
  124. else
  125. PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_READ);
  126. }
  127. if(UartReadMsg.Header[2]>0)
  128. {
  129. uartReadSuccessFlag = true;
  130. }
  131. if(Timer_count-currentTimerCount >= 1)
  132. {
  133. if(AppNVMData.isBattLocked != 0)
  134. {
  135. battLockStateDisplay(TRUE);
  136. }
  137. if(uartReadSuccessFlag)
  138. {
  139. battSOCDisplay();
  140. battErrorStateDisplay();
  141. }
  142. }
  143. currentTimerCount = Timer_count;
  144. break;
  145. }
  146. case PROCESS_UART_STATE_READ:
  147. {
  148. osStatus_t result = osMutexAcquire(UartMutex, osWaitForever);
  149. Reg_Num = 0x21+BATT_CELL_VOL_NUM+BATT_TEMP_NUM + 2;//按照协议里面的0x21+X+N的结束地址
  150. Uart_Read_Msg.Bms_Address = BMS_ADDRESS_CODE;
  151. Uart_Read_Msg.Bms_Funcode = UART_READ_CODE;
  152. Uart_Read_Msg.Reg_Begin_H = 0x00;
  153. Uart_Read_Msg.Reg_Begin_L= 0x00;
  154. Uart_Read_Msg.Reg_Num_H = Reg_Num>>8;
  155. Uart_Read_Msg.Reg_Num_L = Reg_Num;
  156. Uart_Uds_LEN = Reg_Num*2;
  157. memset(UartReadMsg.Header,0x00,Uart_Uds_LEN);
  158. Uart_Recv_LEN = Uart_Transmit_func((UINT8 *)&Uart_Read_Msg,UartReadMsg.Header);
  159. UartReadMsg.len = Uart_Recv_LEN;
  160. PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_IDLE);
  161. if((UartReadMsg.data[(0x03+BATT_CELL_VOL_NUM)*2+1]&0x03)==0x02)
  162. {
  163. BattChrgEndFlag=TRUE;
  164. }
  165. else
  166. {
  167. BattChrgEndFlag=FALSE;
  168. }
  169. osMutexRelease(UartMutex);
  170. break;
  171. }
  172. case PROCESS_UART_STATE_WRITE:
  173. {
  174. Uart_WriteCmd_func(UartWriteData);
  175. PROC_UART_STATE_SWITCH(PROCESS_UART_STATE_IDLE);
  176. break;
  177. }
  178. case PROCESS_UART_STATE_SLEEP:
  179. {
  180. USARTdrv->PowerControl(ARM_POWER_LOW);
  181. while(TRUE)
  182. {
  183. osDelay(60000/portTICK_PERIOD_MS);
  184. }
  185. break;
  186. }
  187. }
  188. }
  189. }
  190. //Uart线程初始化
  191. void UartTaskInit(void *arg)
  192. {
  193. osThreadAttr_t task_attr;
  194. memset(&task_attr,0,sizeof(task_attr));
  195. memset(gProcess_Uart_TaskStack, 0xA5, PROC_UART_TASK_STACK_SIZE);
  196. task_attr.name = "Uart_Task";
  197. task_attr.stack_mem = gProcess_Uart_TaskStack;
  198. task_attr.stack_size = PROC_UART_TASK_STACK_SIZE;
  199. task_attr.priority = osPriorityBelowNormal7;
  200. task_attr.cb_mem = &gProcess_Uart_Task_t;
  201. task_attr.cb_size = sizeof(StaticTask_t);
  202. UartTaskId = osThreadNew(UartTask, NULL, &task_attr);
  203. }
  204. void UartTaskDeInit(void *arg)
  205. {
  206. osThreadTerminate(UartTaskId);
  207. UartTaskId = NULL;
  208. }
  209. //函数区
  210. //Uart回调程序
  211. void USART_callback(uint32_t event)
  212. {
  213. if(event & ARM_USART_EVENT_RX_TIMEOUT)
  214. {
  215. isRecvTimeout = true;
  216. }
  217. if(event & ARM_USART_EVENT_RECEIVE_COMPLETE)
  218. {
  219. isRecvComplete = true;
  220. }
  221. }
  222. //Uart校验程序
  223. UINT16 crc_chk(UINT8* data, UINT8 length)
  224. {
  225. UINT8 j;
  226. UINT16 reg_crc=0xFFFF;
  227. while(length--)
  228. {
  229. reg_crc ^= *data++;
  230. for(j=0;j<8;j++)
  231. {
  232. if(reg_crc & 0x01)
  233. {
  234. reg_crc=(reg_crc>>1) ^ 0xA001;
  235. }
  236. else
  237. {
  238. reg_crc=reg_crc >>1;
  239. }
  240. }
  241. }
  242. return reg_crc;
  243. }
  244. //Uart写命令函数
  245. UINT8 Uart_WriteCmd_func(Uart_Write_Data_Type UartWriteData)
  246. {
  247. Uart_Write_Msg_Type Uart_Write_Msg;
  248. UINT16 RegAddress = 0x0000;
  249. UINT16 CRC_chk_buffer;
  250. UINT8 timeout = 0x00;
  251. UINT8 Uart_Recv_Buffer[8];
  252. switch (UartWriteData.WriteCmd)
  253. {
  254. case 0x01:
  255. {
  256. RegAddress = 0x1B + BATT_CELL_VOL_NUM+BATT_TEMP_NUM+BATT_OTHER_TEMP_NUM;
  257. Uart_Write_Msg.Bms_Address = BMS_ADDRESS_CODE;
  258. Uart_Write_Msg.Bms_Funcode = UART_WRITE_CODE;
  259. Uart_Write_Msg.Reg_Begin_H = RegAddress>>8;
  260. Uart_Write_Msg.Reg_Begin_L = RegAddress;
  261. Uart_Write_Msg.Reg_Num_H = 0x00;
  262. Uart_Write_Msg.Reg_Num_L = 0x01;
  263. Uart_Write_Msg.Data_Count = 0x02;//要写入的字节数
  264. memcpy(Uart_Write_Msg.Data,UartWriteData.Data,2);
  265. CRC_chk_buffer = crc_chk((UINT8 *)&Uart_Write_Msg,sizeof(Uart_Write_Msg)-2);
  266. Uart_Write_Msg.CRC_L = CRC_chk_buffer;
  267. Uart_Write_Msg.CRC_H = CRC_chk_buffer>>8;
  268. break;
  269. }
  270. default:
  271. {
  272. UartWriteData.WriteCmd = 0x00;
  273. return 0;
  274. break;
  275. }
  276. }
  277. USARTdrv->Send((UINT8 *)&Uart_Write_Msg,sizeof(Uart_Write_Msg));
  278. #ifdef USING_PRINTF
  279. printf("Uart_Send_buffer: ");
  280. for(int i=0;i<sizeof(Uart_Write_Msg);i++)
  281. {
  282. printf("%x ",*((UINT8 *)&Uart_Write_Msg+i));
  283. }
  284. printf("\n");
  285. #endif
  286. USARTdrv->Receive(Uart_Recv_Buffer,8);
  287. while((isRecvTimeout == false) && (isRecvComplete == false))
  288. {
  289. timeout++;
  290. osDelay(100);
  291. if (timeout>=10)
  292. {
  293. timeout =0;
  294. isRecvTimeout = true;
  295. break;
  296. }
  297. }
  298. if (isRecvComplete == true)
  299. {
  300. #ifdef USING_PRINTF
  301. printf("Uart_Rece_buffer: ");
  302. for(int i=0;i<8;i++)
  303. {
  304. printf("%x ",Uart_Recv_Buffer[i]);
  305. }
  306. printf("n");
  307. #endif
  308. isRecvComplete = false;
  309. if(Uart_Recv_Buffer[1]==0x10)
  310. {
  311. return UartWriteData.WriteCmd;
  312. }
  313. else
  314. {
  315. return 0x00;
  316. }
  317. }
  318. else
  319. {
  320. isRecvTimeout = false;
  321. return 0x00;
  322. }
  323. }
  324. //Uart发送接收函数
  325. UINT8 Uart_Transmit_func(UINT8* Uart_Read_Msg,UINT8* Uart_Recv_Buffer)
  326. {
  327. UINT16 CRC_Rece_buffer;
  328. UINT16 CRC_chk_buffer;
  329. UINT16 Data_Len ;
  330. UINT8 timeout = 0x00;
  331. Data_Len = (*(Uart_Read_Msg+4)|*(Uart_Read_Msg+5))*2+5;
  332. CRC_chk_buffer = crc_chk(Uart_Read_Msg,6);
  333. *(Uart_Read_Msg+6) = CRC_chk_buffer;
  334. *(Uart_Read_Msg+7) = CRC_chk_buffer>>8;
  335. USARTdrv->Send(Uart_Read_Msg,8);
  336. // #ifdef USING_PRINTF
  337. // printf("Uart_Send_buffer: ");
  338. // for(int i=0;i<8;i++)
  339. // {
  340. // printf("%x ",*(Uart_Read_Msg+i));
  341. // }
  342. // printf("\n");
  343. // #endif
  344. USARTdrv->Receive(Uart_Recv_Buffer,Data_Len);
  345. while((isRecvTimeout == false) && (isRecvComplete == false))
  346. {
  347. timeout++;
  348. osDelay(100);
  349. if (timeout>=50)
  350. {
  351. timeout =0;
  352. isRecvTimeout = true;
  353. break;
  354. }
  355. }
  356. // #ifdef USING_PRINTF
  357. // printf("Uart_Rece_buffer1: ");
  358. // for(int i=0;i<Data_Len;i++)
  359. // {
  360. // printf("%x ",*(Uart_Recv_Buffer+i));
  361. // }
  362. // #endif
  363. if (isRecvComplete == true)
  364. {
  365. isRecvComplete = false;
  366. CRC_Rece_buffer =*(Uart_Recv_Buffer+Data_Len-1)<<8|*(Uart_Recv_Buffer+Data_Len-2);
  367. CRC_chk_buffer = crc_chk(Uart_Recv_Buffer,Data_Len-2);
  368. // #ifdef USING_PRINTF
  369. // printf("Uart_Rece_buffer after Crc: ");
  370. // for(int i=0;i<Data_Len;i++)
  371. // {
  372. // printf("%x ",*(Uart_Recv_Buffer+i));
  373. // }
  374. // printf("\tcrcchk:%x,%x\n ",CRC_chk_buffer,CRC_Rece_buffer);
  375. // #endif
  376. if (CRC_Rece_buffer == CRC_chk_buffer)//满足校验
  377. {
  378. return Data_Len;//此处指针移位出现重启问题
  379. }
  380. else //接收数据的校验不过
  381. {
  382. USARTdrv->Uninitialize();
  383. osDelay(1000);
  384. USARTdrv->Initialize(USART_callback);
  385. USARTdrv->PowerControl(ARM_POWER_FULL);
  386. USARTdrv->Control(ARM_USART_MODE_ASYNCHRONOUS |
  387. ARM_USART_DATA_BITS_8 |
  388. ARM_USART_PARITY_NONE |
  389. ARM_USART_STOP_BITS_1 |
  390. ARM_USART_FLOW_CONTROL_NONE, 9600);
  391. memset(Uart_Recv_Buffer,0xff,Data_Len);
  392. return 0;
  393. }
  394. }
  395. else
  396. {
  397. memset(Uart_Recv_Buffer,0x00,Data_Len);
  398. isRecvTimeout = false;
  399. return 0;
  400. }
  401. }
  402. /**
  403. \fn BOOL BattHeaterSwitch(UINT8* heaterSwitch)
  404. \param[in] (UINT8*) heaterSwitch: the heater switch state
  405. \brief according to the current switch state and all the cell temp, it will turn on/off the switch
  406. \return (BOOL) isNeedtoSwitch: true: need to send cmd to turn on/off the switch
  407. false: do not need to do anything
  408. */
  409. BOOL BattHeaterSwitch(UINT8* heaterSwitch)
  410. {
  411. BOOL isNeedtoSwitch = FALSE;
  412. UINT8 battCellTemp[BATT_TEMP_NUM];
  413. UINT8 maxCellTemp,minCellTemp;
  414. UINT8 i =0;
  415. UINT8 currentSwitchState = 0;
  416. //get the current switch state and the cell temp
  417. currentSwitchState = UartReadMsg.data[(0x1C+BATT_CELL_VOL_NUM+(BATT_TEMP_NUM+2))*2+1]&0x01;
  418. for(int i=0; i<BATT_TEMP_NUM; i++)
  419. {
  420. battCellTemp[i] = UartReadMsg.data[(0x06+BATT_CELL_VOL_NUM+i)*2+1];
  421. }
  422. //cal the maxtemp and mintemp
  423. maxCellTemp = battCellTemp[0];
  424. minCellTemp = battCellTemp[0];
  425. for(i=1;i<BATT_TEMP_NUM;i++)
  426. {
  427. maxCellTemp = max(maxCellTemp,battCellTemp[i]);
  428. minCellTemp = min(minCellTemp,battCellTemp[i]);
  429. }
  430. if(currentSwitchState==0) //当前状态为关闭,判断是否应该开启
  431. {
  432. if(minCellTemp<=5+40 && maxCellTemp<25+40)//温度偏移为40
  433. {
  434. *heaterSwitch = 1;
  435. isNeedtoSwitch = true;
  436. }
  437. }
  438. else //当前状态为开启,判断是否应该关闭
  439. {
  440. if(minCellTemp>10+40||maxCellTemp>30+40)
  441. {
  442. *heaterSwitch = 0;
  443. isNeedtoSwitch= true;
  444. }
  445. }
  446. return isNeedtoSwitch;
  447. }
  448. void battSOCDisplay()
  449. {
  450. static UINT8 workState;
  451. static UINT8 currentSoc;
  452. static UINT8 lightTimer = 0;
  453. UINT8 socLowLEDFlashPeriod = 10;//10*100 = 1000ms
  454. UINT8 chargeLEDFlashPeriod = 6;//6*100 = 600ms
  455. float dutyRatio = 0.4;
  456. UINT8 temp;
  457. if(AppNVMData.isBattLocked == TRUE)
  458. {
  459. return;
  460. }
  461. if(UartReadMsg.Header[2]>0)
  462. {
  463. temp = UartReadMsg.data[(0x03+BATT_CELL_VOL_NUM)*2+1]&0x03;
  464. workState = ((temp&0x01)<<01)|(temp>>0x01);
  465. currentSoc = UartReadMsg.data[(0x0B+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+2)*2+1];
  466. }
  467. #ifdef USING_PRINTF
  468. printf("current SOC = %d\n",currentSoc);
  469. printf("work state = %d\n",workState);
  470. #endif
  471. lightTimer++;
  472. if(workState == 0||workState == 2) //静置或放电状态
  473. {
  474. if(currentSoc<=10)
  475. {
  476. if(lightTimer<(UINT8)(socLowLEDFlashPeriod*dutyRatio))
  477. {
  478. NetSocDisplay(LED_SOC_0,LED_TURN_ON);
  479. NetSocDisplay(LED_SOC_1,LED_TURN_OFF);
  480. NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
  481. NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
  482. }
  483. else if(lightTimer>=(UINT8)(socLowLEDFlashPeriod*dutyRatio) && lightTimer<socLowLEDFlashPeriod)
  484. {
  485. NetSocDisplay(LED_SOC_0,LED_TURN_OFF);
  486. NetSocDisplay(LED_SOC_1,LED_TURN_OFF);
  487. NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
  488. NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
  489. }
  490. else
  491. {
  492. NetSocDisplay(LED_SOC_0,LED_TURN_OFF);
  493. NetSocDisplay(LED_SOC_1,LED_TURN_OFF);
  494. NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
  495. NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
  496. lightTimer = 0;
  497. }
  498. }
  499. else if(currentSoc>10&&currentSoc<=25)
  500. {
  501. NetSocDisplay(LED_SOC_0,LED_TURN_ON);
  502. NetSocDisplay(LED_SOC_1,LED_TURN_OFF);
  503. NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
  504. NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
  505. lightTimer = 0;
  506. }
  507. else if(currentSoc>25&&currentSoc<=50)
  508. {
  509. NetSocDisplay(LED_SOC_0,LED_TURN_ON);
  510. NetSocDisplay(LED_SOC_1,LED_TURN_ON);
  511. NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
  512. NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
  513. lightTimer = 0;
  514. }
  515. else if(currentSoc>50&&currentSoc<=75)
  516. {
  517. NetSocDisplay(LED_SOC_0,LED_TURN_ON);
  518. NetSocDisplay(LED_SOC_1,LED_TURN_ON);
  519. NetSocDisplay(LED_SOC_2,LED_TURN_ON);
  520. NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
  521. lightTimer = 0;
  522. }
  523. else if(currentSoc>75&&currentSoc<=100)
  524. {
  525. NetSocDisplay(LED_SOC_0,LED_TURN_ON);
  526. NetSocDisplay(LED_SOC_1,LED_TURN_ON);
  527. NetSocDisplay(LED_SOC_2,LED_TURN_ON);
  528. NetSocDisplay(LED_SOC_3,LED_TURN_ON);
  529. lightTimer = 0;
  530. }
  531. }
  532. else if(workState == 1)
  533. {
  534. if(currentSoc<=25)
  535. {
  536. if(lightTimer<(UINT8)(chargeLEDFlashPeriod*dutyRatio))
  537. {
  538. NetSocDisplay(LED_SOC_0,LED_TURN_ON);
  539. NetSocDisplay(LED_SOC_1,LED_TURN_OFF);
  540. NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
  541. NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
  542. }
  543. else if(lightTimer>=(UINT8)(chargeLEDFlashPeriod*dutyRatio) && lightTimer<chargeLEDFlashPeriod)
  544. {
  545. NetSocDisplay(LED_SOC_0,LED_TURN_OFF);
  546. NetSocDisplay(LED_SOC_1,LED_TURN_OFF);
  547. NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
  548. NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
  549. }
  550. else
  551. {
  552. NetSocDisplay(LED_SOC_0,LED_TURN_OFF);
  553. NetSocDisplay(LED_SOC_1,LED_TURN_OFF);
  554. NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
  555. NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
  556. lightTimer = 0;
  557. }
  558. }
  559. else if(currentSoc>25&&currentSoc<=50)
  560. {
  561. if(lightTimer<(UINT8)(chargeLEDFlashPeriod*dutyRatio))
  562. {
  563. NetSocDisplay(LED_SOC_0,LED_TURN_ON);
  564. NetSocDisplay(LED_SOC_1,LED_TURN_ON);
  565. NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
  566. NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
  567. }
  568. else if(lightTimer>=(UINT8)(chargeLEDFlashPeriod*dutyRatio) && lightTimer<chargeLEDFlashPeriod)
  569. {
  570. NetSocDisplay(LED_SOC_0,LED_TURN_ON);
  571. NetSocDisplay(LED_SOC_1,LED_TURN_OFF);
  572. NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
  573. NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
  574. }
  575. else
  576. {
  577. NetSocDisplay(LED_SOC_0,LED_TURN_ON);
  578. NetSocDisplay(LED_SOC_1,LED_TURN_OFF);
  579. NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
  580. NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
  581. lightTimer = 0;
  582. }
  583. }
  584. else if(currentSoc>50&&currentSoc<=75)
  585. {
  586. if(lightTimer<(UINT8)(chargeLEDFlashPeriod*dutyRatio))
  587. {
  588. NetSocDisplay(LED_SOC_0,LED_TURN_ON);
  589. NetSocDisplay(LED_SOC_1,LED_TURN_ON);
  590. NetSocDisplay(LED_SOC_2,LED_TURN_ON);
  591. NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
  592. }
  593. else if(lightTimer>=(UINT8)(chargeLEDFlashPeriod*dutyRatio) && lightTimer<chargeLEDFlashPeriod)
  594. {
  595. NetSocDisplay(LED_SOC_0,LED_TURN_ON);
  596. NetSocDisplay(LED_SOC_1,LED_TURN_ON);
  597. NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
  598. NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
  599. }
  600. else
  601. {
  602. NetSocDisplay(LED_SOC_0,LED_TURN_ON);
  603. NetSocDisplay(LED_SOC_1,LED_TURN_ON);
  604. NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
  605. NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
  606. lightTimer = 0;
  607. }
  608. }
  609. else if(currentSoc>75&&currentSoc<=97)
  610. {
  611. if(lightTimer<(UINT8)(chargeLEDFlashPeriod*dutyRatio))
  612. {
  613. NetSocDisplay(LED_SOC_0,LED_TURN_ON);
  614. NetSocDisplay(LED_SOC_1,LED_TURN_ON);
  615. NetSocDisplay(LED_SOC_2,LED_TURN_ON);
  616. NetSocDisplay(LED_SOC_3,LED_TURN_ON);
  617. }
  618. else if(lightTimer>=(UINT8)(chargeLEDFlashPeriod*dutyRatio) && lightTimer<chargeLEDFlashPeriod)
  619. {
  620. NetSocDisplay(LED_SOC_0,LED_TURN_ON);
  621. NetSocDisplay(LED_SOC_1,LED_TURN_ON);
  622. NetSocDisplay(LED_SOC_2,LED_TURN_ON);
  623. NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
  624. }
  625. else
  626. {
  627. NetSocDisplay(LED_SOC_0,LED_TURN_ON);
  628. NetSocDisplay(LED_SOC_1,LED_TURN_ON);
  629. NetSocDisplay(LED_SOC_2,LED_TURN_ON);
  630. NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
  631. lightTimer = 0;
  632. }
  633. }
  634. else if(currentSoc>97&&currentSoc<=100)
  635. {
  636. NetSocDisplay(LED_SOC_0,LED_TURN_ON);
  637. NetSocDisplay(LED_SOC_1,LED_TURN_ON);
  638. NetSocDisplay(LED_SOC_2,LED_TURN_ON);
  639. NetSocDisplay(LED_SOC_3,LED_TURN_ON);
  640. }
  641. }
  642. }
  643. void battErrorStateDisplay()
  644. {
  645. static UINT32 errorState;
  646. static UINT8 errorLightTimer = 0;
  647. //static UINT32 currentTimerCount=0;
  648. UINT8 errorLEDFlashPeriod = 6;//600ms
  649. float errorDutyRatio = 0.4;
  650. if(AppNVMData.isBattLocked == TRUE)
  651. {
  652. return;
  653. }
  654. if(UartReadMsg.Header[2]>0)
  655. {
  656. MEMCPY(&errorState,&(UartReadMsg.data[(0x09+BATT_CELL_VOL_NUM+BATT_TEMP_NUM+2)*2]),4);
  657. }
  658. errorLightTimer++;
  659. //errorState = testErrorState;
  660. #ifdef USING_PRINTF
  661. printf("error state = %d\n",errorState);
  662. #endif
  663. if(errorState != 0)
  664. {
  665. if(errorLightTimer<(UINT8)(errorLEDFlashPeriod*errorDutyRatio))
  666. {
  667. FaultDisplay(LED_TURN_ON);
  668. }
  669. else if(errorLightTimer>=(UINT8)(errorLEDFlashPeriod*errorDutyRatio) && errorLightTimer<errorLEDFlashPeriod)
  670. {
  671. FaultDisplay(LED_TURN_OFF);
  672. }
  673. else
  674. {
  675. FaultDisplay(LED_TURN_OFF);
  676. errorLightTimer = 0;
  677. }
  678. }
  679. else
  680. {
  681. FaultDisplay(LED_TURN_OFF);
  682. errorLightTimer = 0;
  683. }
  684. }
  685. void battLockStateDisplay(UINT8 lockState)
  686. {
  687. static UINT8 currentState = 0;
  688. static UINT8 errorLightTimer = 0;
  689. //static UINT32 currentTimerCount=0;
  690. UINT8 errorLEDFlashPeriod = 10;//1000ms
  691. float errorDutyRatio = 0.4;
  692. printf("lockState = %d\ncurrent State = %d\n",lockState,currentState);
  693. if(lockState==0)//no error
  694. {
  695. if(currentState!=lockState)
  696. {
  697. NetSocDisplay(LED_SOC_0,LED_TURN_OFF);
  698. NetSocDisplay(LED_SOC_1,LED_TURN_OFF);
  699. NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
  700. NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
  701. FaultDisplay(LED_TURN_OFF);
  702. currentState = lockState;
  703. errorLightTimer = 0;
  704. }
  705. else
  706. {
  707. return;
  708. }
  709. }
  710. else // error occurred, errorState = 1
  711. {
  712. if(errorLightTimer<(UINT8)(errorLEDFlashPeriod*errorDutyRatio))
  713. {
  714. NetSocDisplay(LED_SOC_0,LED_TURN_ON);
  715. NetSocDisplay(LED_SOC_1,LED_TURN_ON);
  716. NetSocDisplay(LED_SOC_2,LED_TURN_ON);
  717. NetSocDisplay(LED_SOC_3,LED_TURN_ON);
  718. FaultDisplay(LED_TURN_ON);
  719. }
  720. else if(errorLightTimer>=(UINT8)(errorLEDFlashPeriod*errorDutyRatio) && errorLightTimer<errorLEDFlashPeriod)
  721. {
  722. NetSocDisplay(LED_SOC_0,LED_TURN_OFF);
  723. NetSocDisplay(LED_SOC_1,LED_TURN_OFF);
  724. NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
  725. NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
  726. FaultDisplay(LED_TURN_OFF);
  727. }
  728. else
  729. {
  730. NetSocDisplay(LED_SOC_0,LED_TURN_OFF);
  731. NetSocDisplay(LED_SOC_1,LED_TURN_OFF);
  732. NetSocDisplay(LED_SOC_2,LED_TURN_OFF);
  733. NetSocDisplay(LED_SOC_3,LED_TURN_OFF);
  734. FaultDisplay(LED_TURN_OFF);
  735. errorLightTimer = 0;
  736. }
  737. }
  738. errorLightTimer++;
  739. }
  740. UINT8 decryptionAlgorithm (UINT16 cipherText)
  741. {
  742. UINT16 plainText = 1;
  743. UINT16 publicKeyD = 43;
  744. UINT16 publicKeyN = 10961;
  745. cipherText = cipherText % publicKeyN;
  746. while(publicKeyD >0)
  747. {
  748. if(publicKeyD % 2 ==1)
  749. {
  750. plainText = plainText * cipherText % publicKeyN;
  751. }
  752. publicKeyD = publicKeyD/2;
  753. cipherText = (cipherText * cipherText) % publicKeyN;
  754. }
  755. return (UINT8)plainText;
  756. }
  757. UINT16 encryptionAlgorithm (UINT8 plainText)
  758. {
  759. UINT16 cipherText = 1;
  760. UINT16 privateKeyE = 37507;
  761. UINT16 privateKeyN = 10961;
  762. plainText = plainText % privateKeyN;
  763. while(privateKeyE >0)
  764. {
  765. if(privateKeyE % 2 ==1)
  766. {
  767. cipherText = cipherText * plainText % privateKeyN;
  768. }
  769. privateKeyE = privateKeyE/2;
  770. cipherText = (plainText * plainText) % privateKeyN;
  771. }
  772. return cipherText;
  773. }
  774. UINT8 SP_BMS_Update_CheckSUM(UINT8* pSendData,UINT8 len)
  775. {
  776. UINT8 ret = 0;
  777. UINT8 i=0;
  778. for(i=0;i<len;i++)
  779. {
  780. ret +=*(pSendData+i);
  781. }
  782. return ret&0xFF;
  783. }