You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

541 lines
17 KiB

2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
  1. #include "zcanreceiver_master.hpp"
  2. #include "project_configs.h"
  3. #include "sdk\components\zprotocols\errorcode\errorcode.hpp"
  4. #ifdef HAL_CAN_MODULE_ENABLED
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <string.h>
  8. using namespace iflytop;
  9. using namespace zcr;
  10. #define TAG "ZCanCommnaderMaster"
  11. #define OVER_TIME_MS 5
  12. #define MASK_32BIT(off) (0x01 << (off))
  13. ZCanCommnaderMaster::CFG *ZCanCommnaderMaster::createCFG() {
  14. CFG *cfg = new CFG();
  15. ZASSERT(cfg != NULL);
  16. cfg->deviceId = 0;
  17. #ifdef STM32F103xB
  18. cfg->canHandle = &hcan;
  19. #else
  20. cfg->canHandle = &hcan1;
  21. #endif
  22. cfg->canFilterIndex0 = 0;
  23. cfg->maxFilterNum = 7;
  24. cfg->rxfifoNum = CAN_RX_FIFO0;
  25. return cfg;
  26. }
  27. void ZCanCommnaderMaster::init(CFG *cfg) {
  28. HAL_StatusTypeDef hal_status;
  29. m_config = cfg;
  30. m_on_packet_map_lock.init();
  31. txlock.init();
  32. /**
  33. * @brief ʼCAN
  34. */
  35. /**
  36. * @brief ʼϢbuf
  37. */
  38. m_canPacketRxBuffer[0].dataIsReady = false;
  39. m_canPacketRxBuffer[0].id = 1; // ֻ����������������Ϣ
  40. m_canPacketRxBuffer[0].m_canPacketNum = 0;
  41. /**
  42. * @brief ʼ
  43. */
  44. hal_status = initializeFilter();
  45. if (hal_status != HAL_OK) {
  46. ZLOGE(TAG, "start can initializeFilter fail\r\n");
  47. return;
  48. }
  49. /**
  50. * @brief CAN
  51. */
  52. hal_status = HAL_CAN_Start(m_config->canHandle); // ����CAN
  53. if (hal_status != HAL_OK) {
  54. ZLOGE(TAG, "start can fail\r\n");
  55. return;
  56. }
  57. /**
  58. * @brief ص
  59. */
  60. ZCanIRQDispatcher::instance().regListener(this);
  61. HAL_StatusTypeDef status = activateRxIT();
  62. if (status != HAL_OK) {
  63. ZLOGE(TAG, "activateRxIT fail\r\n");
  64. return;
  65. }
  66. m_loopThread.init("ZCanCommnaderMaster", 1024, osPriorityAboveNormal);
  67. m_loopThread.start([this]() {
  68. while (true) {
  69. loop();
  70. osDelay(1);
  71. }
  72. });
  73. }
  74. HAL_StatusTypeDef ZCanCommnaderMaster::initializeFilter() {
  75. /**
  76. * @brief ID֡ʽ
  77. * [ 27:0 ]
  78. * [ STDID ] [ EXTID ]
  79. * [11 :9] [8:6] [5:0] [17:16] [15:8] [7:0]
  80. * ȼ ֡ ĿID ԴID
  81. */
  82. HAL_StatusTypeDef HAL_Status;
  83. CAN_FilterTypeDef sFilterConfig;
  84. uint32_t filterId;
  85. uint32_t mask;
  86. memset(&sFilterConfig, 0, sizeof(sFilterConfig));
  87. sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK; // ��ΪMASKģʽ
  88. sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT; // CAN_FILTERSCALE_16BIT
  89. sFilterConfig.FilterFIFOAssignment = m_config->rxfifoNum; // ������������rxfifoNum
  90. sFilterConfig.FilterActivation = ENABLE; // ����������
  91. sFilterConfig.SlaveStartFilterBank = m_config->maxFilterNum; // slave filter start index
  92. /*******************************************************************************
  93. * Ϣ *
  94. *******************************************************************************/
  95. filterId = (0); //
  96. mask = (0); //
  97. sFilterConfig.FilterBank = m_config->canFilterIndex0; //
  98. sFilterConfig.FilterMaskIdLow = mask & 0xffff; //
  99. sFilterConfig.FilterMaskIdHigh = (mask & 0xffff0000) >> 16; //
  100. sFilterConfig.FilterIdLow = filterId & 0xffff; //
  101. sFilterConfig.FilterIdHigh = (filterId & 0xffff0000) >> 16; //
  102. HAL_Status = HAL_CAN_ConfigFilter(m_config->canHandle, &sFilterConfig);
  103. if (HAL_Status != HAL_OK) {
  104. ZLOGE(TAG, "HAL_CAN_ConfigFilter filter0 fail");
  105. return HAL_Status;
  106. }
  107. ZLOGI(TAG, "HAL_CAN_ConfigFilter filterID1 %08x", filterId >> 3);
  108. return HAL_Status;
  109. }
  110. int32_t ZCanCommnaderMaster::sendCmdAndReceiveBuf(int32_t cmdid, int32_t subModuleid, int32_t *param, size_t npara, uint8_t *ack, int32_t *rxsize, int overtime_ms) {
  111. zcr_cmd_header_t *cmdheader = (zcr_cmd_header_t *)txbuff;
  112. cmdheader->packetType = kptv2_cmd;
  113. cmdheader->packetindex = generateFreeIndex();
  114. cmdheader->cmdMainId = MODULE_CMDID(cmdid);
  115. cmdheader->cmdSubId = CMD_SUB_ID(cmdid);
  116. cmdheader->subModuleid = subModuleid;
  117. // ZLOGI(TAG, "sendCmd %d %d %d %d", cmdheader->packetindex, cmdheader->cmdMainId, cmdheader->cmdSubId, cmdheader->subModuleid);
  118. int32_t *sendparam = (int32_t *)cmdheader->data;
  119. for (size_t i = 0; i < npara; i++) {
  120. sendparam[i] = param[i];
  121. }
  122. int32_t txlen = sizeof(zcr_cmd_header_t) + npara * sizeof(int32_t);
  123. // ע��������
  124. bool rxdataIsReady = false;
  125. int32_t errocode = 0;
  126. regListener(cmdheader->packetindex, [this, &rxdataIsReady, &ack, &rxsize, &errocode](CanPacketRxBuffer *report) {
  127. if (report->get_cmdheader()->packetType == kptv2_error_ack) {
  128. auto *error_ack = report->get_param_as<int32_t>();
  129. errocode = *error_ack;
  130. } else if (*rxsize < report->get_params_len()) {
  131. errocode = err::kbuffer_not_enough;
  132. } else {
  133. *rxsize = report->get_params_len();
  134. memcpy(ack, report->get_params(), *rxsize);
  135. }
  136. rxdataIsReady = true;
  137. });
  138. // ������Ϣ
  139. sendPacket(txbuff, txlen);
  140. // �ȴ���ִ
  141. uint32_t enterticket = zos_get_tick();
  142. while (!rxdataIsReady) {
  143. if (zos_haspassedms(enterticket) > (uint32_t)overtime_ms) {
  144. ZLOGE(TAG, "sendPacketBlock timeout");
  145. unregListener(cmdheader->packetindex);
  146. return err::kovertime;
  147. }
  148. osDelay(1);
  149. }
  150. unregListener(cmdheader->packetindex);
  151. return errocode;
  152. }
  153. void ZCanCommnaderMaster::sendRawPacket(uint8_t *packet, size_t len) { sendPacket(packet, len); }
  154. void ZCanCommnaderMaster::regRawPacketListener(rawpacket_t rawpacketcb) { m_rawpacketcb = rawpacketcb; }
  155. int32_t ZCanCommnaderMaster::sendCmd(int32_t cmdid, int32_t subModuleid, int32_t *param, size_t npara, int32_t *ack, size_t nack, int overtime_ms) {
  156. zcr_cmd_header_t *cmdheader = (zcr_cmd_header_t *)txbuff;
  157. cmdheader->packetType = kptv2_cmd;
  158. cmdheader->packetindex = generateFreeIndex();
  159. cmdheader->cmdMainId = MODULE_CMDID(cmdid);
  160. cmdheader->cmdSubId = CMD_SUB_ID(cmdid);
  161. cmdheader->subModuleid = subModuleid;
  162. // ZLOGI(TAG, "sendCmd %d %d %d %d", cmdheader->packetindex, cmdheader->cmdMainId, cmdheader->cmdSubId, cmdheader->subModuleid);
  163. int32_t *sendparam = (int32_t *)cmdheader->data;
  164. for (size_t i = 0; i < npara; i++) {
  165. sendparam[i] = param[i];
  166. }
  167. int32_t txlen = sizeof(zcr_cmd_header_t) + npara * sizeof(int32_t);
  168. /**
  169. * @brief ע
  170. */
  171. bool rxdataIsReady = false;
  172. int32_t errocode = 0;
  173. regListener(cmdheader->packetindex, [this, &rxdataIsReady, &ack, &nack, &errocode](CanPacketRxBuffer *report) {
  174. // ZLOGI(TAG, "....................................");
  175. if (report->get_cmdheader()->packetType == kptv2_error_ack) {
  176. auto *error_ack = report->get_param_as<int32_t>();
  177. errocode = *error_ack;
  178. // ZLOGI(TAG, "error_ack %d %s", *error_ack, err::error2str(*error_ack));
  179. } else {
  180. // ZLOGI(TAG, "%d %d", report->get_datalen(), nack);
  181. int32_t *rxbuf = report->get_param_as<int32_t>();
  182. if (ack != nullptr && nack != 0) {
  183. for (size_t i = 0; i < nack; i++) {
  184. // ZLOGI(TAG, "ack[%d] = %d", i, rxbuf[i]);
  185. ack[i] = rxbuf[i];
  186. }
  187. }
  188. }
  189. rxdataIsReady = true;
  190. });
  191. /**
  192. * @brief Ϣ
  193. */
  194. sendPacket(txbuff, txlen);
  195. /**
  196. * @brief ȴִ
  197. */
  198. uint32_t enterticket = zos_get_tick();
  199. while (!rxdataIsReady) {
  200. if (zos_haspassedms(enterticket) > (uint32_t)overtime_ms) {
  201. // ZLOGE(TAG, "sendPacketBlock timeout");
  202. unregListener(cmdheader->packetindex);
  203. return err::kovertime;
  204. }
  205. osDelay(1);
  206. }
  207. unregListener(cmdheader->packetindex);
  208. return errocode;
  209. }
  210. void ZCanCommnaderMaster::regEventPacketListener(onpacket_t on_event) { m_on_event = on_event; }
  211. void ZCanCommnaderMaster::regListener(uint16_t index, zcan_commnader_master_onpacket_t onack) {
  212. zlock_guard l(m_on_packet_map_lock);
  213. if (m_on_packet_map.size() > 10000) {
  214. ZLOGW(TAG, "m_on_packet_map.size() = %d>10000", m_on_packet_map.size());
  215. }
  216. ZCanCommnaderMasterListener listener;
  217. listener.on_ack = onack;
  218. m_on_packet_map[index] = listener;
  219. }
  220. void ZCanCommnaderMaster::unregListener(uint16_t index) {
  221. zlock_guard l(m_on_packet_map_lock);
  222. auto it = m_on_packet_map.find(index);
  223. if (it != m_on_packet_map.end()) {
  224. m_on_packet_map.erase(it);
  225. }
  226. }
  227. int ZCanCommnaderMaster::getListenerNum() {
  228. zlock_guard l(m_on_packet_map_lock);
  229. return m_on_packet_map.size();
  230. }
  231. bool ZCanCommnaderMaster::isListenerReg(uint16_t index) {
  232. zlock_guard l(m_on_packet_map_lock);
  233. auto it = m_on_packet_map.find(index);
  234. if (it != m_on_packet_map.end()) {
  235. return true;
  236. }
  237. return false;
  238. }
  239. void ZCanCommnaderMaster::callListener(CanPacketRxBuffer *report) {
  240. uint16_t index = report->get_cmdheader()->packetindex;
  241. if (m_rawpacketcb) {
  242. m_rawpacketcb(report->get_rx_raw(), report->get_rx_raw_len());
  243. }
  244. if (report->get_cmdheader()->packetType == kptv2_ack || report->get_cmdheader()->packetType == kptv2_error_ack) {
  245. zlock_guard l(m_on_packet_map_lock);
  246. auto it = m_on_packet_map.find(index);
  247. if (it != m_on_packet_map.end()) {
  248. if (it->second.on_ack) it->second.on_ack(report);
  249. }
  250. }
  251. if (report->get_cmdheader()->packetType == kptv2_event) {
  252. if (m_on_event) m_on_event(report->id, report->get_cmdheader(), report->get_params_len());
  253. }
  254. }
  255. uint16_t ZCanCommnaderMaster::generateFreeIndex() {
  256. m_index_off++;
  257. uint16_t count = 0;
  258. if (m_index_off == 0) m_index_off = 1;
  259. while (isListenerReg(m_index_off)) {
  260. m_index_off++;
  261. if (m_index_off == 0) m_index_off = 1;
  262. count++;
  263. if (count == 0) {
  264. ZLOGE(TAG, "generateFreeIndex fail");
  265. NVIC_SystemReset();
  266. }
  267. }
  268. return m_index_off;
  269. }
  270. void ZCanCommnaderMaster::sendPacket(uint8_t *packet, size_t len) {
  271. zlock_guard txlock_guard(txlock);
  272. /**
  273. * @brief
  274. */
  275. int npacket = len / 8 + (len % 8 == 0 ? 0 : 1);
  276. if (npacket > 255) {
  277. ZLOGE(TAG, "sendPacket fail, len:%d", len);
  278. return;
  279. }
  280. int finalpacketlen = len % 8 == 0 ? 8 : len % 8;
  281. for (uint8_t i = 0; i < npacket; i++) {
  282. bool suc = false;
  283. if (i == npacket - 1) {
  284. suc = sendPacketSub(npacket, i, packet + i * 8, finalpacketlen, OVER_TIME_MS);
  285. } else {
  286. suc = sendPacketSub(npacket, i, packet + i * 8, 8, OVER_TIME_MS);
  287. }
  288. if (!suc) {
  289. // ZLOGE(TAG, "sendPacket fail, packet(%d:%d)", npacket, i);
  290. return;
  291. }
  292. }
  293. }
  294. bool ZCanCommnaderMaster::sendPacketSub(int npacket, int packetIndex, uint8_t *packet, size_t len, int overtimems) {
  295. // ZLOGI(TAG, "sendPacketSub(%d:%d)", npacket, packetIndex);
  296. CAN_TxHeaderTypeDef pHeader;
  297. uint8_t aData[8] /*8byte table*/;
  298. uint32_t txMailBox = 0;
  299. uint32_t enterticket = zos_get_tick();
  300. memset(&pHeader, 0, sizeof(pHeader));
  301. memset(aData, 0, sizeof(aData));
  302. pHeader.StdId = 0x00;
  303. pHeader.ExtId = (m_config->deviceId << 16) | (npacket << 8) | packetIndex;
  304. pHeader.IDE = CAN_ID_EXT;
  305. pHeader.RTR = CAN_RTR_DATA;
  306. pHeader.DLC = len;
  307. pHeader.TransmitGlobalTime = DISABLE;
  308. memcpy(aData, packet, len);
  309. m_lastTransmitStatus = HAL_CAN_AddTxMessage(m_config->canHandle, &pHeader, aData, &txMailBox);
  310. if (m_lastTransmitStatus != HAL_OK) {
  311. ZLOGE(TAG, "HAL_CAN_AddTxMessage fail");
  312. return false;
  313. }
  314. while (HAL_CAN_IsTxMessagePending(m_config->canHandle, txMailBox)) {
  315. if (zos_haspassedms(enterticket) > (uint32_t)overtimems) {
  316. m_lastTransmitStatus = HAL_TIMEOUT;
  317. HAL_CAN_AbortTxRequest(m_config->canHandle, txMailBox);
  318. return false;
  319. }
  320. // m_os->sleepMS(1);
  321. }
  322. if (txPacketInterval_ms > 0) {
  323. osDelay(txPacketInterval_ms);
  324. }
  325. return true;
  326. }
  327. bool ZCanCommnaderMaster::getRxMessage(CAN_RxHeaderTypeDef *pHeader, uint8_t aData[] /*8byte table*/) {
  328. /**
  329. * @brief ȡǰFIFOл˶֡
  330. */
  331. uint32_t level = HAL_CAN_GetRxFifoFillLevel(m_config->canHandle, m_config->rxfifoNum);
  332. if (level == 0) {
  333. return false;
  334. }
  335. HAL_StatusTypeDef HAL_RetVal;
  336. HAL_RetVal = HAL_CAN_GetRxMessage(m_config->canHandle, m_config->rxfifoNum, pHeader, aData);
  337. if (HAL_OK == HAL_RetVal) {
  338. // �������յ���can��������
  339. return true;
  340. }
  341. return false;
  342. }
  343. void ZCanCommnaderMaster::initCanPacketRxBuffer(CanPacketRxBuffer *buf, uint16_t id) {
  344. if (buf == nullptr) return;
  345. buf->clear();
  346. buf->id = id;
  347. }
  348. CanPacketRxBuffer *ZCanCommnaderMaster::allocCanPacketRxBufferInIRQ(uint16_t id) {
  349. for (size_t i = 0; i < CAN_PACKET_RX_BUFFER_NUM; i++) {
  350. CanPacketRxBuffer *packetbuf = &m_canPacketRxBuffer[i];
  351. if (packetbuf->dataIsReady) {
  352. // �ȴ��ȴ��������ɺ��ͷ�
  353. if (packetbuf->dataIsProcessed) packetbuf->isUsed = false;
  354. } else {
  355. // �����Ѿ���ʼ���գ�����ʱδ����������buffer
  356. if (packetbuf->isUsed && zos_haspassedms(packetbuf->lastrxtime) > 100) {
  357. packetbuf->isUsed = false;
  358. }
  359. // ���ݿ�ʼ�����ˣ������յ���0�Ű�������buffer
  360. if (packetbuf->isUsed && id == packetbuf->id) {
  361. packetbuf->isUsed = false;
  362. }
  363. }
  364. }
  365. for (size_t i = 0; i < CAN_PACKET_RX_BUFFER_NUM; i++) {
  366. if (!m_canPacketRxBuffer[i].isUsed) {
  367. initCanPacketRxBuffer(&m_canPacketRxBuffer[i], id);
  368. m_canPacketRxBuffer[i].isUsed = true;
  369. return &m_canPacketRxBuffer[i];
  370. }
  371. }
  372. return nullptr;
  373. }
  374. CanPacketRxBuffer *ZCanCommnaderMaster::findCanPacketRxBufferInIRQ(uint16_t id) {
  375. for (size_t i = 0; i < CAN_PACKET_RX_BUFFER_NUM; i++) {
  376. if (!m_canPacketRxBuffer[i].dataIsReady && m_canPacketRxBuffer[i].isUsed && m_canPacketRxBuffer[i].id == id) {
  377. return &m_canPacketRxBuffer[i];
  378. }
  379. }
  380. return nullptr;
  381. }
  382. void ZCanCommnaderMaster::STM32_HAL_onCAN_RxFifo0MsgPending(CAN_HandleTypeDef *canHandle) {
  383. /**
  384. * @brief ж
  385. */
  386. // ZLOG_INFO("%s\n", __FUNCTION__);
  387. // printf("------------------%s\n", __FUNCTION__);
  388. if (canHandle != m_config->canHandle) {
  389. return;
  390. }
  391. /**
  392. * @brief canյϢ
  393. */
  394. CAN_RxHeaderTypeDef pHeader;
  395. uint8_t aData[8] /*8byte table*/;
  396. while (getRxMessage(&pHeader, aData)) {
  397. /**
  398. * @brief Ϣʽ
  399. *
  400. * [2] [3bit] [8bit] [8bit] [8bit]
  401. * , from frameNum frameId
  402. */
  403. uint8_t from = (pHeader.ExtId >> 16 & 0xFF);
  404. uint8_t nframe = (pHeader.ExtId & 0xFF00) >> 8;
  405. uint8_t frameId = (pHeader.ExtId & 0x00FF);
  406. CanPacketRxBuffer *rxbuf = nullptr;
  407. if (frameId == 0) {
  408. rxbuf = allocCanPacketRxBufferInIRQ(from);
  409. rxbuf->m_npacket = nframe;
  410. } else {
  411. rxbuf = findCanPacketRxBufferInIRQ(from);
  412. }
  413. if (!rxbuf) {
  414. ZLOGE(TAG, "board[%d] packetId[%d] find rx buff fail", from, frameId);
  415. return;
  416. }
  417. rxbuf->lastrxtime = zos_get_tick();
  418. if (rxbuf->m_canPacketNum < ZARRAY_SIZE(rxbuf->m_canPacket)) {
  419. rxbuf->m_canPacket[rxbuf->m_canPacketNum].dlc = pHeader.DLC;
  420. memcpy(rxbuf->m_canPacket[rxbuf->m_canPacketNum].aData, aData, 8);
  421. rxbuf->m_canPacketNum++;
  422. }
  423. /**
  424. * @brief
  425. */
  426. if (nframe == frameId + 1) {
  427. rxbuf->dataIsReady = true;
  428. rxbuf->dataIsProcessed = false;
  429. if ((rxbuf->m_canPacketNum) != rxbuf->m_npacket) rxbuf->lostpacket = true;
  430. }
  431. }
  432. // deactivateRxIT();
  433. }
  434. void ZCanCommnaderMaster::STM32_HAL_onCAN_Error(CAN_HandleTypeDef *canHandle) {
  435. if (canHandle != m_config->canHandle) {
  436. return;
  437. }
  438. ZLOGE(TAG, "onCAN_Error\r\n");
  439. }
  440. void ZCanCommnaderMaster::processReadyPacket(CanPacketRxBuffer *rxbuf) {
  441. int dataoff = 0;
  442. for (size_t i = 0; i < rxbuf->m_canPacketNum; i++) {
  443. memcpy(rxbuf->rxdata + dataoff, rxbuf->m_canPacket[i].aData, rxbuf->m_canPacket[i].dlc);
  444. dataoff += rxbuf->m_canPacket[i].dlc;
  445. rxbuf->rxdataSize = dataoff;
  446. }
  447. if (rxbuf->lostpacket) {
  448. ZLOGE(TAG, "lostpacket %d %d", rxbuf->m_canPacketNum, rxbuf->m_npacket);
  449. } else {
  450. callListener(rxbuf);
  451. }
  452. }
  453. void ZCanCommnaderMaster::loop() {
  454. /**
  455. * @brief MainLoop
  456. */
  457. for (size_t i = 0; i < CAN_PACKET_RX_BUFFER_NUM; i++) {
  458. if (m_canPacketRxBuffer[i].isUsed && m_canPacketRxBuffer[i].dataIsReady && !m_canPacketRxBuffer[i].dataIsProcessed) {
  459. processReadyPacket(&m_canPacketRxBuffer[i]);
  460. m_canPacketRxBuffer[i].dataIsProcessed = true;
  461. }
  462. }
  463. }
  464. HAL_StatusTypeDef ZCanCommnaderMaster::activateRxIT() {
  465. HAL_StatusTypeDef hal_status = HAL_ERROR;
  466. if (m_config->rxfifoNum == CAN_RX_FIFO0) {
  467. hal_status = HAL_CAN_ActivateNotification(m_config->canHandle, CAN_IT_RX_FIFO0_MSG_PENDING);
  468. } else if (m_config->rxfifoNum == CAN_RX_FIFO1) {
  469. hal_status = HAL_CAN_ActivateNotification(m_config->canHandle, CAN_IT_RX_FIFO1_MSG_PENDING);
  470. } else {
  471. ZLOGE(TAG, "start can HAL_CAN_ActivateNotification CAN_IT_RX_FIFO0_MSG_PENDING fail\r\n");
  472. return hal_status;
  473. }
  474. return hal_status;
  475. }
  476. HAL_StatusTypeDef ZCanCommnaderMaster::deactivateRxIT() {
  477. HAL_StatusTypeDef hal_status = HAL_ERROR;
  478. if (m_config->rxfifoNum == CAN_RX_FIFO0) {
  479. hal_status = HAL_CAN_DeactivateNotification(m_config->canHandle, CAN_IT_RX_FIFO0_MSG_PENDING);
  480. } else if (m_config->rxfifoNum == CAN_RX_FIFO1) {
  481. hal_status = HAL_CAN_DeactivateNotification(m_config->canHandle, CAN_IT_RX_FIFO1_MSG_PENDING);
  482. } else {
  483. ZLOGE(TAG, "start can HAL_CAN_ActivateNotification CAN_IT_RX_FIFO0_MSG_PENDING fail\r\n");
  484. return hal_status;
  485. }
  486. return hal_status;
  487. }
  488. size_t ZCanCommnaderMaster::safe_memcpy(void *dst, size_t dst_max_size, void *src, size_t src_len) { //
  489. size_t cpysize = dst_max_size < src_len ? dst_max_size : src_len;
  490. memcpy(dst, src, cpysize);
  491. return cpysize;
  492. }
  493. #endif