|
|
@ -118,6 +118,53 @@ HAL_StatusTypeDef ZCanCommnaderMaster::initializeFilter() { |
|
|
|
ZLOGI(TAG, "HAL_CAN_ConfigFilter filterID1 %08x", filterId >> 3); |
|
|
|
return HAL_Status; |
|
|
|
} |
|
|
|
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) { |
|
|
|
zcr_cmd_header_t *cmdheader = (zcr_cmd_header_t *)txbuff; |
|
|
|
cmdheader->packetType = kptv2_cmd; |
|
|
|
cmdheader->packetindex = generateFreeIndex(); |
|
|
|
cmdheader->cmdmoduleid = MODULE_CMDID(cmdid); |
|
|
|
cmdheader->subcmdid = SUBCMDID(cmdid); |
|
|
|
cmdheader->submoduleid = submoduleid; |
|
|
|
// ZLOGI(TAG, "sendCmd %d %d %d %d", cmdheader->packetindex, cmdheader->cmdmoduleid, cmdheader->subcmdid, cmdheader->submoduleid);
|
|
|
|
int32_t *sendparam = (int32_t *)cmdheader->data; |
|
|
|
for (size_t i = 0; i < npara; i++) { |
|
|
|
sendparam[i] = param[i]; |
|
|
|
} |
|
|
|
int32_t txlen = sizeof(zcr_cmd_header_t) + npara * sizeof(int32_t); |
|
|
|
|
|
|
|
// 注册监听者
|
|
|
|
bool rxdataIsReady = false; |
|
|
|
int32_t errocode = 0; |
|
|
|
regListener(cmdheader->packetindex, [this, &rxdataIsReady, &ack, &rxsize, &errocode](CanPacketRxBuffer *report) { |
|
|
|
if (report->get_cmdheader()->packetType == kptv2_error_ack) { |
|
|
|
auto *error_ack = report->get_data_as<int32_t>(); |
|
|
|
errocode = *error_ack; |
|
|
|
} else if (*rxsize < report->get_datalen()) { |
|
|
|
errocode = err::kbuffer_not_enough; |
|
|
|
} else { |
|
|
|
*rxsize = report->get_datalen(); |
|
|
|
memcpy(ack, report->get_data(), *rxsize); |
|
|
|
} |
|
|
|
rxdataIsReady = true; |
|
|
|
}); |
|
|
|
|
|
|
|
// 发送消息
|
|
|
|
sendPacket(txbuff, txlen); |
|
|
|
|
|
|
|
// 等待回执
|
|
|
|
uint32_t enterticket = zos_get_tick(); |
|
|
|
while (!rxdataIsReady) { |
|
|
|
if (zos_haspassedms(enterticket) > (uint32_t)overtime_ms) { |
|
|
|
ZLOGE(TAG, "sendPacketBlock timeout"); |
|
|
|
unregListener(cmdheader->packetindex); |
|
|
|
return err::kovertime; |
|
|
|
} |
|
|
|
osDelay(1); |
|
|
|
} |
|
|
|
unregListener(cmdheader->packetindex); |
|
|
|
|
|
|
|
return errocode; |
|
|
|
} |
|
|
|
|
|
|
|
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) { |
|
|
|
zcr_cmd_header_t *cmdheader = (zcr_cmd_header_t *)txbuff; |
|
|
@ -143,7 +190,6 @@ int32_t ZCanCommnaderMaster::sendCmd(int32_t cmdid, int32_t submoduleid, int32_t |
|
|
|
// ZLOGI(TAG, "....................................");
|
|
|
|
if (report->get_cmdheader()->packetType == kptv2_error_ack) { |
|
|
|
auto *error_ack = report->get_data_as<int32_t>(); |
|
|
|
|
|
|
|
errocode = *error_ack; |
|
|
|
// ZLOGI(TAG, "error_ack %d %s", *error_ack, err::error2str(*error_ack));
|
|
|
|
} else { |
|
|
|