|
@ -107,7 +107,66 @@ HAL_StatusTypeDef ZCanReceiver::initializeFilter() { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void ZCanReceiver::registerListener(ZCanRceiverListener *listener) { m_listenerList.push_back(listener); } |
|
|
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*/) { |
|
|
bool ZCanReceiver::getRxMessage(CAN_RxHeaderTypeDef *pHeader, uint8_t aData[] /*8byte table*/) { |
|
|
/**
|
|
|
/**
|
|
|
* @brief 读取当前FIFO中缓存了多少帧的数据 |
|
|
* @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); |
|
|
memcpy(rxbuf->m_canPacket[rxbuf->m_canPacketNum].aData, aData, 8); |
|
|
rxbuf->m_canPacketNum++; |
|
|
rxbuf->m_canPacketNum++; |
|
|
} |
|
|
} |
|
|
if (nframe == frameId) { |
|
|
|
|
|
|
|
|
if (nframe == frameId+1) { |
|
|
rxbuf->dataIsReady = true; |
|
|
rxbuf->dataIsReady = true; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|