mod_candataprocess.c 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340
  1. #include "stdint.h"
  2. #include "string.h"
  3. #include "mod_candataprocess.h"
  4. #include "mod_spi.h"
  5. #include "sys_log.h"
  6. #include "sys_common.h"
  7. #include "lib_iso15765.h"
  8. #include "hal_can.h"
  9. #include "hal_timer.h"
  10. #define CAN_PAYLOAD_MAX_LEN 8
  11. #define SEND_CAN_BUF_MAX_LEN 64
  12. #define UINT32_DEFAULT_VAL 0xFFFFFFFF
  13. static uint8_t g_s_can_index;
  14. static uint8_t g_s_send_can_buf[SEND_CAN_BUF_MAX_LEN];
  15. /******************ISO15765**********************************/
  16. typedef struct {
  17. uint32_t frame_id;
  18. iso15765_t* process_handler;
  19. }HANDLER_T;
  20. static uint32_t getms()
  21. {
  22. return HAL_SysGetTickMs();;
  23. }
  24. static void on_error(n_rslt err_type)
  25. {
  26. DLOG_E("15765 parse err:%04x", err_type);
  27. }
  28. static uint8_t send_frame_via_can(cbus_id_type id_type, uint32_t id, cbus_fr_format fr_fmt, uint8_t dlc, uint8_t *dt)
  29. {
  30. //iso15765中can发送接口
  31. uint8_t can_id_type = 0;
  32. uint32_t can_id = 0;
  33. uint8_t payload_len = 0;
  34. uint8_t payload[8] = {0};
  35. uint8_t ret = 0;
  36. can_id_type = id_type;
  37. can_id = id;
  38. payload_len = dlc>8?8:dlc;
  39. memset(payload, 0, 8);
  40. memcpy(payload, dt, payload_len);
  41. DLOG_I("send can data:%d,data:%s", payload_len, SYS_Hex2str(payload, payload_len));
  42. ret = HAL_CanTxData(can_id_type, can_id, payload, payload_len);
  43. return 0;
  44. }
  45. static void parse_finish_callback(n_indn_t *info)
  46. {
  47. DLOG_I("parse finish");
  48. if(0 == info->rslt)
  49. {
  50. DLOG_I("parse success.rslt:0x%x,frame_id:0x%x,msg_sz:0x%x,data:",
  51. info->rslt,
  52. (info->n_ai.n_sa<<8)|(info->n_ai.n_ta),
  53. info->msg_sz);
  54. for (int i = 0; i < info->msg_sz; i++)
  55. {
  56. printf("%02X", info->msg[i]);
  57. }
  58. printf("\r\n");
  59. }
  60. else
  61. {
  62. DLOG_I("parse fail.rslt:0x%x,frame_id:0x%x",
  63. info->rslt,
  64. (info->n_ai.n_sa<<8)|(info->n_ai.n_ta));
  65. }
  66. }
  67. static n_req_t g_s_can_frame =
  68. {
  69. .n_ai.n_pr = 0x06,
  70. .n_ai.n_sa = 0x12,
  71. .n_ai.n_ta = 0xdf,
  72. .n_ai.n_ae = 0x00,
  73. .n_ai.n_tt = N_TA_T_PHY,
  74. .fr_fmt = CBUS_FR_FRM_STD,
  75. .msg = {0x22, 0xf1, 0x01, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09},
  76. .msg_sz = 0x0d,
  77. };
  78. static iso15765_t handler0 =
  79. {
  80. .addr_md = N_ADM_BMW,
  81. .fr_id_type = CBUS_ID_T_STANDARD,
  82. .clbs.send_frame = send_frame_via_can,
  83. .clbs.on_error = on_error,
  84. .clbs.get_ms = getms,
  85. .clbs.indn = parse_finish_callback,
  86. .config.stmin = 0x3,
  87. .config.bs = 0x0f,
  88. .config.n_bs = 100,
  89. .config.n_cr = 3
  90. };
  91. static iso15765_t handler1 =
  92. {
  93. .addr_md = N_ADM_BMW,
  94. .fr_id_type = CBUS_ID_T_STANDARD,
  95. .clbs.send_frame = send_frame_via_can,
  96. .clbs.on_error = on_error,
  97. .clbs.get_ms = getms,
  98. .clbs.indn = parse_finish_callback,
  99. .config.stmin = 0x3,
  100. .config.bs = 0x0f,
  101. .config.n_bs = 100,
  102. .config.n_cr = 3
  103. };
  104. static iso15765_t handler2 =
  105. {
  106. .addr_md = N_ADM_BMW,
  107. .fr_id_type = CBUS_ID_T_STANDARD,
  108. .clbs.send_frame = send_frame_via_can,
  109. .clbs.on_error = on_error,
  110. .clbs.get_ms = getms,
  111. .clbs.indn = parse_finish_callback,
  112. .config.stmin = 0x3,
  113. .config.bs = 0x0f,
  114. .config.n_bs = 100,
  115. .config.n_cr = 3
  116. };
  117. static iso15765_t handler3 =
  118. {
  119. .addr_md = N_ADM_BMW,
  120. .fr_id_type = CBUS_ID_T_STANDARD,
  121. .clbs.send_frame = send_frame_via_can,
  122. .clbs.on_error = on_error,
  123. .clbs.get_ms = getms,
  124. .clbs.indn = parse_finish_callback,
  125. .config.stmin = 0x3,
  126. .config.bs = 0x0f,
  127. .config.n_bs = 100,
  128. .config.n_cr = 3
  129. };
  130. HANDLER_T data_process_handler_list[] = {
  131. {
  132. .frame_id = UINT32_DEFAULT_VAL,
  133. .process_handler = &handler0,
  134. },
  135. {
  136. .frame_id = UINT32_DEFAULT_VAL,
  137. .process_handler = &handler1,
  138. },
  139. {
  140. .frame_id = UINT32_DEFAULT_VAL,
  141. .process_handler = &handler2,
  142. },
  143. {
  144. .frame_id = UINT32_DEFAULT_VAL,
  145. .process_handler = &handler3,
  146. },
  147. };
  148. int MOD_CanIso15765ParseInit(void)
  149. {
  150. //初始化iso15765解析句柄.
  151. int init_ret = N_OK;
  152. for (int i=0; i<sizeof(data_process_handler_list)/sizeof(HANDLER_T); i++)
  153. {
  154. init_ret = iso15765_init(data_process_handler_list[i].process_handler);
  155. if(N_OK != init_ret)
  156. {
  157. return -1;
  158. }
  159. }
  160. return N_OK;
  161. }
  162. void MOD_CanIso15765Parse(void)
  163. {
  164. //处理队列中的数据
  165. for (int i=0; i<sizeof(data_process_handler_list)/sizeof(HANDLER_T); i++)
  166. {
  167. iso15765_process(data_process_handler_list[i].process_handler);
  168. }
  169. }
  170. void MOD_CanPutDataToIso15765Parse(uint8_t* can_data, uint8_t data_len)
  171. {
  172. //将can数据放入15765处理队列接口
  173. uint32_t can_id;
  174. canbus_frame_t can_frame;
  175. memcpy(&can_id, &can_data[1], 4);
  176. can_frame.id = can_id; //֡帧id
  177. can_frame.fr_format = CBUS_FR_FRM_STD; //֡帧格式
  178. can_frame.id_type = CBUS_ID_T_STANDARD; //֡帧类型
  179. can_frame.dlc = can_data[5]; //֡帧长度
  180. memset(&can_frame.dt, 0, 8);
  181. memcpy(&can_frame.dt, &can_data[6], can_frame.dlc); //֡帧数据
  182. DLOG_I("put can to 15765 parse,can_id:0x%x,payload_len:%d,payload:%s",
  183. can_id,
  184. can_frame.dlc ,
  185. SYS_Hex2str(can_frame.dt, can_frame.dlc));
  186. // //开始往队列中放入数据
  187. // uint8_t find_frame_id_flag = 0;
  188. // for(int i=0; i<sizeof(data_process_handler_list)/sizeof(HANDLER_T); i++)
  189. // {
  190. // //先找下这个id有没有在列表里面,如果在的话就放进去,如果不在的话就重新找新的放入
  191. // if(data_process_handler_list[i].frame_id == can_frame.id)
  192. // {
  193. // LOG_D("find frame_id");
  194. // find_frame_id_flag = 1;
  195. // iso15765_enqueue(data_process_handler_list[i].process_handler, &can_frame);
  196. // }
  197. // }
  198. // if(0 == find_frame_id_flag)
  199. // {
  200. // //这个frame_id不在之前发过的历史列表里面,那找个新的放进去
  201. // for(int j=0; j<sizeof(data_process_handler_list)/sizeof(HANDLER_T); j++)
  202. // {
  203. // if(UINT32_DEFAULT_VAL == data_process_handler_list[j].frame_id)
  204. // {
  205. // LOG_D("not find frame_id, now set %d", j);
  206. // data_process_handler_list[j].frame_id = can_frame.id;
  207. // iso15765_enqueue(data_process_handler_list[j].process_handler, &can_frame);
  208. // break;
  209. // }
  210. // }
  211. // }
  212. }
  213. /******************ISO15765**********************************/
  214. /**********************************************
  215. * @brief: can发送接口
  216. * @param: data:指向要发送的数据组包buf
  217. * @param: len:数据长度
  218. * @return: 发送结果
  219. * @warning: xxxxxxx
  220. * 1.
  221. **********************************************/
  222. int MOD_CanTransferData(uint8_t* data, uint8_t len)
  223. {
  224. // uint8_t can_id_type = 0;
  225. // uint32_t can_id = 0;
  226. // uint8_t payload_len = 0;
  227. // uint8_t payload[8] = {0};
  228. // memset(payload, 0, 8);
  229. // g_s_can_index = data[0];
  230. // can_id_type = data[1];
  231. // memcpy(&can_id, &data[2], 4);
  232. // small_big_transfer32(&can_id);
  233. // payload_len = data[6];
  234. // memcpy(payload, &data[7], payload_len);
  235. // DLOG_I("tx_can_data,index:%d,type:%d,can_id:0x%x,payload_len:%d,payload:%s", g_s_can_index, can_id_type, can_id, payload_len,
  236. // SYS_Hex2str(payload, payload_len));
  237. // return HAL_CanTxData(can_id_type, can_id, payload, payload_len);
  238. // iso15765库
  239. g_s_can_frame.msg_sz = len>I15765_MSG_SIZE?I15765_MSG_SIZE:len;
  240. memset(&g_s_can_frame.msg, 0, I15765_MSG_SIZE);
  241. memcpy(&g_s_can_frame.msg, data, g_s_can_frame.msg_sz);
  242. DLOG_I("send can data to iso15765,size:%d,data:%S", g_s_can_frame.msg_sz, SYS_Hex2str(g_s_can_frame.msg, g_s_can_frame.msg_sz));
  243. iso15765_send(&handler1, &g_s_can_frame); //使用这个接口将数据发送到协议库
  244. }
  245. /**********************************************
  246. * @brief: can接收接口,处理接收到的can数据
  247. * @param: data:接收到的数据缓存空间
  248. * @param: data_len:收到的数据长度
  249. * @return: xxxxxxx
  250. * @warning: xxxxxxx
  251. * 1.
  252. **********************************************/
  253. void MOD_CanRxDataProcess(uint8_t* data, uint8_t data_len)
  254. {
  255. uint8_t can_id_type;
  256. uint32_t can_id;
  257. uint8_t can_payload_len;
  258. uint8_t can_payload_buf[8];
  259. uint8_t tmp_len = 0;
  260. can_id_type = data[0];
  261. memset(can_payload_buf, 0, 8);
  262. memcpy(&can_id, &data[1], 4);
  263. can_payload_len = data[5];
  264. memcpy(can_payload_buf, &data[6], can_payload_len);
  265. DLOG_I("rx_can_data,type:%d,can_id:0x%x,payload_len:%d,payload:%s",
  266. can_id_type,
  267. can_id,
  268. can_payload_len,
  269. SYS_Hex2str(can_payload_buf, can_payload_len));
  270. tmp_len = 0;
  271. g_s_send_can_buf[tmp_len] = TRANSFER_GET_CAN_RSP_CMD;
  272. tmp_len += 1;
  273. g_s_send_can_buf[tmp_len] = g_s_can_index;
  274. g_s_can_index ++;
  275. if (0x7D == g_s_can_index)
  276. {
  277. g_s_can_index = 0;
  278. }
  279. tmp_len += 1;
  280. g_s_send_can_buf[tmp_len] = can_id_type;
  281. tmp_len += 1;
  282. g_s_send_can_buf[tmp_len] = (can_id>>24)&0xFF;
  283. tmp_len += 1;
  284. g_s_send_can_buf[tmp_len] = (can_id>>16)&0xFF;
  285. tmp_len += 1;
  286. g_s_send_can_buf[tmp_len] = (can_id>>8)&0xFF;
  287. tmp_len += 1;
  288. g_s_send_can_buf[tmp_len] = can_id&0xFF;
  289. tmp_len += 1;
  290. g_s_send_can_buf[tmp_len] = can_payload_len;
  291. tmp_len += 1;
  292. memcpy(&g_s_send_can_buf[tmp_len], &can_payload_buf, can_payload_len);
  293. tmp_len += can_payload_len;
  294. MOD_SpiDataSend(BLE_CMD_TRANSFER, g_s_send_can_buf, tmp_len);
  295. }