diff --git a/components/zcanreceiver/zcanreceiver.cpp b/components/zcanreceiver/zcanreceiver.cpp index 2c5d1eb..ebef23e 100644 --- a/components/zcanreceiver/zcanreceiver.cpp +++ b/components/zcanreceiver/zcanreceiver.cpp @@ -107,7 +107,66 @@ HAL_StatusTypeDef ZCanReceiver::initializeFilter() { } void ZCanReceiver::registerListener(ZCanRceiverListener *listener) { m_listenerList.push_back(listener); } -void ZCanReceiver::sendPacket(uint8_t *packet, size_t len) {} +void ZCanReceiver::sendPacket(uint8_t *packet, size_t len) { + /** + * @brief + */ + int npacket = len / 8 + (len % 8 == 0 ? 0 : 1); + if (npacket > 255) { + ZLOGE(TAG, "sendPacket fail, len:%d", len); + return; + } + int finalpacketlen = len % 8 == 0 ? 8 : len % 8; + + for (uint8_t i = 0; i < npacket; i++) { + bool suc = false; + if (i == npacket - 1) { + suc = sendPacketSub(npacket, i, packet + i * 8, finalpacketlen, OVER_TIME_MS); + } else { + suc = sendPacketSub(npacket, i, packet + i * 8, 8, OVER_TIME_MS); + } + if (!suc) { + ZLOGE(TAG, "sendPacket fail, packet(%d:%d)", npacket, i); + return; + } + } +} + +bool ZCanReceiver::sendPacketSub(int npacket, int packetIndex, uint8_t *packet, size_t len, int overtimems) { + CAN_TxHeaderTypeDef pHeader; + uint8_t aData[8] /*8byte table*/; + uint32_t txMailBox = 0; + + uint32_t enterticket = chip_get_ticket(); + + memset(&pHeader, 0, sizeof(pHeader)); + memset(aData, 0, sizeof(aData)); + pHeader.StdId = 0x00; + pHeader.ExtId = (m_config->deviceId << 16) | (npacket << 8) | packetIndex; + pHeader.IDE = CAN_ID_EXT; + pHeader.RTR = CAN_RTR_DATA; + pHeader.DLC = len; + pHeader.TransmitGlobalTime = DISABLE; + + memcpy(aData, packet, len); + + m_lastTransmitStatus = HAL_CAN_AddTxMessage(m_config->canHandle, &pHeader, aData, &txMailBox); + if (m_lastTransmitStatus != HAL_OK) { + ZLOGE(TAG, "HAL_CAN_AddTxMessage fail"); + return false; + } + + while (HAL_CAN_IsTxMessagePending(m_config->canHandle, txMailBox)) { + if (haspassedms(enterticket) > (uint32_t)overtimems) { + m_lastTransmitStatus = HAL_TIMEOUT; + HAL_CAN_AbortTxRequest(m_config->canHandle, txMailBox); + return false; + } + // m_os->sleepMS(1); + } + return true; +} + bool ZCanReceiver::getRxMessage(CAN_RxHeaderTypeDef *pHeader, uint8_t aData[] /*8byte table*/) { /** * @brief 读取当前FIFO中缓存了多少帧的数据 @@ -170,7 +229,7 @@ void ZCanReceiver::STM32_HAL_onCAN_RxFifo0MsgPending(CAN_HandleTypeDef *canHandl memcpy(rxbuf->m_canPacket[rxbuf->m_canPacketNum].aData, aData, 8); rxbuf->m_canPacketNum++; } - if (nframe == frameId) { + if (nframe == frameId+1) { rxbuf->dataIsReady = true; } } diff --git a/components/zcanreceiver/zcanreceiver.hpp b/components/zcanreceiver/zcanreceiver.hpp index d4d2e92..a95af71 100644 --- a/components/zcanreceiver/zcanreceiver.hpp +++ b/components/zcanreceiver/zcanreceiver.hpp @@ -74,6 +74,7 @@ class ZCanReceiver : public ZCanIRQListener { void registerListener(ZCanRceiverListener *listener); void sendPacket(uint8_t *packet, size_t len); + bool sendPacketSub(int npacket, int packetIndex, uint8_t *packet, size_t len, int overtimems); public: virtual void STM32_HAL_onCAN_RxFifo0MsgPending(CAN_HandleTypeDef *can); diff --git a/hal/zhal_core.hpp b/hal/zhal_core.hpp index 7c94713..2dc8bb2 100644 --- a/hal/zhal_core.hpp +++ b/hal/zhal_core.hpp @@ -53,6 +53,6 @@ class ZHALCORE { void loop(); }; -#define ZHAL_CORE_REG(period_ms, job) ZHALCORE::getInstance()->regPeriodJob([this](ZHALCORE::Context& context) { job }, period_ms); +#define ZHAL_CORE_REG(period_ms, job) ZHALCORE::getInstance()->regPeriodJob([&](ZHALCORE::Context& context) { job }, period_ms); } // namespace iflytop \ No newline at end of file