CANTask.c 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. #include "bsp.h"
  2. #include "bsp_custom.h"
  3. #include "osasys.h"
  4. #include "ostask.h"
  5. #include "queue.h"
  6. #include "ps_event_callback.h"
  7. #include "cmisim.h"
  8. #include "cmimm.h"
  9. #include "cmips.h"
  10. #include "sockets.h"
  11. #include "psifevent.h"
  12. #include "ps_lib_api.h"
  13. #include "lwip/netdb.h"
  14. #include <cis_def.h>
  15. #include "debug_log.h"
  16. #include "slpman_ec616.h"
  17. #include "plat_config.h"
  18. #include "ec_tcpip_api.h"
  19. #include "hal_module_adapter.h"
  20. #include "UartTask.h"
  21. #include "MainTask.h"
  22. #include "app.h"
  23. #include "CANTask.h"
  24. #include "UDSService.h"
  25. #include "signal.h"
  26. extern UINT32 Timer_count;
  27. extern volatile BOOL Sleep_flag;
  28. CAN_Msg_Type CanRxMsg[2];
  29. /*线程声明*/
  30. #define PROC_CAN_RX_TASK_STACK_SIZE (1024)
  31. static StaticTask_t gProcess_Can_Rx_Task_t;
  32. static UINT8 gProcess_Can_Rx_TaskStack[PROC_CAN_RX_TASK_STACK_SIZE];
  33. static process_CAN gProcess_CAN_Task = PROCESS_CAN_STATE_IDLE;
  34. #define PROC_CAN_STATE_SWITCH(a) (gProcess_CAN_Task = a)
  35. volatile bool CAN_Sleep_State = false;
  36. UINT8 CanSendSlpHandler = 0xfd;
  37. extern updateBMSStatus MS_BMS_Update_Service();
  38. void CANTaskInit(void* arg)
  39. {
  40. osThreadAttr_t task_rx_attr,task_tx_attr;
  41. Can_InitType param;
  42. param.baudrate = CAN_250Kbps;
  43. param.mode = REQOP_NORMAL;
  44. param.packType = STD_PACK;
  45. memset(&task_rx_attr,0,sizeof(task_rx_attr));
  46. memset(gProcess_Can_Rx_TaskStack, 0, PROC_CAN_RX_TASK_STACK_SIZE);
  47. task_rx_attr.name = "Can_Task";
  48. task_rx_attr.stack_mem = gProcess_Can_Rx_TaskStack;
  49. task_rx_attr.stack_size = PROC_CAN_RX_TASK_STACK_SIZE;
  50. task_rx_attr.priority = osPriorityBelowNormal7;
  51. task_rx_attr.cb_mem = &gProcess_Can_Rx_Task_t;
  52. task_rx_attr.cb_size = sizeof(StaticTask_t);
  53. HAL_Can_Init(param);
  54. osDelay(1000);
  55. osThreadNew(Can_Receive, NULL, &task_rx_attr);
  56. }
  57. static void Can_Receive()
  58. {
  59. slpManSlpState_t State;
  60. uint8_t cnt,temp,udsFlag,msgFlag=0;
  61. UINT8 i,j = 0;
  62. while(true)
  63. {
  64. memset(CanRxMsg, 0, sizeof(CanRxMsg));
  65. switch(gProcess_CAN_Task)
  66. {
  67. case PROCESS_CAN_STATE_IDLE:
  68. CAN_Sleep_State = false;
  69. PROC_CAN_STATE_SWITCH(PROCESS_CAN_STATE_WORK);
  70. break;
  71. case PROCESS_CAN_STATE_WORK:
  72. if(Sleep_flag)
  73. {
  74. PROC_CAN_STATE_SWITCH(PROCESS_CAN_STATE_SLEEP);
  75. }
  76. if(HAL_Can_Receive(CanRxMsg)>0)
  77. {
  78. for(i=0; i<2; i++)
  79. {
  80. if(CanRxMsg[i].Id == 0x7A0)
  81. {
  82. udsFlag = 1;
  83. UDSService[i] = CanRxMsg[i].Data[0];
  84. UDSSubService[i] = CanRxMsg[i].Data[1];
  85. UDSSubServiceActionCode[i] = CanRxMsg[i].Data[2];
  86. if(UDSService[i] == 0x10)
  87. {
  88. if(UDSSubService[i] == 0x02)
  89. {
  90. UDSSwitch = 1;
  91. }
  92. }
  93. }
  94. else if(CanRxMsg[i].Id == 0x7A1)
  95. {
  96. if(CanRxMsg[i].Data[0] != 0x00)
  97. {
  98. msgFlag = 1;
  99. }
  100. else
  101. {
  102. msgFlag = 0;
  103. }
  104. }
  105. }
  106. if(udsFlag==1)
  107. {
  108. UDS_Service();
  109. udsFlag = 0;
  110. }
  111. else if(msgFlag == 1)
  112. {
  113. CanMsgTx1000ms();
  114. }
  115. }
  116. break;
  117. case PROCESS_CAN_STATE_SLEEP:
  118. {
  119. HAL_Can_Sleep();
  120. CAN_Sleep_State = true;
  121. while(true)
  122. {
  123. osDelay(60000/portTICK_PERIOD_MS);
  124. }
  125. osThreadExit();
  126. break;
  127. }
  128. }
  129. //osDelay(50);
  130. }
  131. }
  132. void CanMsgTx1000ms()
  133. {
  134. static UINT32 timerRecord = 0;
  135. UINT8 count = 0;
  136. CAN_Msg_Type canMsg;
  137. if(Timer_count - timerRecord > 0)
  138. {
  139. timerRecord = Timer_count;
  140. count = Timer_count%10;
  141. switch (count)
  142. {
  143. case 0: //send cell batt info 0x6A0、0x6A1
  144. canMsg.DLC = 8;
  145. canMsg.Id = COMOutTable[count*2];
  146. CANEncodeFunction( COMOutTable[count*2], canMsg.Data);
  147. HAL_Can_Transmit(canMsg);
  148. canMsg.DLC = 8;
  149. canMsg.Id = COMOutTable[count*2+1];
  150. CANEncodeFunction( COMOutTable[count*2+1], canMsg.Data);
  151. HAL_Can_Transmit(canMsg);
  152. break;
  153. case 1: //send cell batt info 0x6A2、0x6A3
  154. canMsg.DLC = 8;
  155. canMsg.Id = COMOutTable[count*2];
  156. CANEncodeFunction( COMOutTable[count*2], canMsg.Data);
  157. HAL_Can_Transmit(canMsg);
  158. canMsg.DLC = 8;
  159. canMsg.Id = COMOutTable[count*2+1];
  160. CANEncodeFunction( COMOutTable[count*2+1], canMsg.Data);
  161. HAL_Can_Transmit(canMsg);
  162. break;
  163. case 2: //send cell batt info 0x6A4、 0x6A5
  164. canMsg.DLC = 8;
  165. canMsg.Id = COMOutTable[count*2];
  166. CANEncodeFunction( COMOutTable[count*2], canMsg.Data);
  167. HAL_Can_Transmit(canMsg);
  168. canMsg.DLC = 8;
  169. canMsg.Id = COMOutTable[count*2+1];
  170. CANEncodeFunction( COMOutTable[count*2+1], canMsg.Data);
  171. HAL_Can_Transmit(canMsg);
  172. break;
  173. case 3: //send cell batt info 0x6A6、0x6B0
  174. canMsg.DLC = 8;
  175. canMsg.Id = COMOutTable[count*2];
  176. CANEncodeFunction( COMOutTable[count*2], canMsg.Data);
  177. HAL_Can_Transmit(canMsg);
  178. canMsg.DLC = 8;
  179. canMsg.Id = COMOutTable[count*2+1];
  180. CANEncodeFunction( COMOutTable[count*2+1], canMsg.Data);
  181. HAL_Can_Transmit(canMsg);
  182. break;
  183. case 4: //send batt temp info 0x6BA、0x6C0
  184. canMsg.DLC = 8;
  185. canMsg.Id = COMOutTable[count*2];
  186. CANEncodeFunction( COMOutTable[count*2], canMsg.Data);
  187. HAL_Can_Transmit(canMsg);
  188. canMsg.DLC = 8;
  189. canMsg.Id = COMOutTable[count*2+1];
  190. CANEncodeFunction( COMOutTable[count*2+1], canMsg.Data);
  191. HAL_Can_Transmit(canMsg);
  192. break;
  193. case 5: //send batt other info 0x6C1、0x6C2
  194. canMsg.DLC = 8;
  195. canMsg.Id = COMOutTable[count*2];
  196. CANEncodeFunction( COMOutTable[count*2], canMsg.Data);
  197. HAL_Can_Transmit(canMsg);
  198. canMsg.DLC = 8;
  199. canMsg.Id = COMOutTable[count*2+1];
  200. CANEncodeFunction( COMOutTable[count*2+1], canMsg.Data);
  201. HAL_Can_Transmit(canMsg);
  202. break;
  203. case 6: //send batt other info 0x6C3、0x6C4
  204. canMsg.DLC = 8;
  205. canMsg.Id = COMOutTable[count*2];
  206. CANEncodeFunction( COMOutTable[count*2], canMsg.Data);
  207. HAL_Can_Transmit(canMsg);
  208. canMsg.DLC = 8;
  209. canMsg.Id = COMOutTable[count*2+1];
  210. CANEncodeFunction( COMOutTable[count*2+1], canMsg.Data);
  211. HAL_Can_Transmit(canMsg);
  212. break;
  213. default:
  214. break;
  215. }
  216. }
  217. }