Browse Source

update

master
zhaohe 2 years ago
parent
commit
78ca69f445
  1. 5
      components/zcancmder/zcanreceiver.cpp
  2. 2
      components/zcancmder/zcanreceiver.hpp
  3. 48
      components/zcancmder/zcanreceiver_master.cpp
  4. 3
      components/zcancmder/zcanreceiver_master.hpp
  5. 2
      components/zprotocols/zcancmder_v2

5
components/zcancmder/zcanreceiver.cpp

@ -173,8 +173,9 @@ void ZCanCmder::sendStatusReport(zcr_cmd_header_t *rxcmdheader, uint8_t *data, s
sendPacket(txbuff, sizeof(zcr_cmd_header_t) + len);
}
#endif
int32_t ZCanCmder::sendAck(zcr_cmd_header_t *rx_cmd_header, uint8_t *data, int32_t len) {
zlock_guard l(m_lock);
int32_t ZCanCmder::sendBufAck(zcr_cmd_header_t *rx_cmd_header, uint8_t *data, int32_t len) {
zlock_guard l(m_lock);
ZASSERT(sizeof(txbuff) > sizeof(zcr_cmd_header_t) + len);
zcr_cmd_header_t *txheader = (zcr_cmd_header_t *)txbuff;
memcpy(txheader, rx_cmd_header, sizeof(zcr_cmd_header_t));
txheader->packetType = kptv2_ack;

2
components/zcancmder/zcanreceiver.hpp

@ -71,7 +71,7 @@ class ZCanCmder : public ZCanIRQListener, public IZCanCmder {
void setTxPacketInterval(int interval_ms) { txPacketInterval_ms = interval_ms; }
virtual void registerListener(IZcanCmderListener *listener) override;
virtual int32_t sendAck(zcr_cmd_header_t *rx_cmd_header, uint8_t *data, int32_t len) override;
virtual int32_t sendBufAck(zcr_cmd_header_t *rx_cmd_header, uint8_t *data, int32_t len) override;
virtual int32_t sendAck(zcr_cmd_header_t *rx_cmd_header, int32_t *ackvar, int32_t nack) override;
virtual int32_t sendErrorAck(zcr_cmd_header_t *rx_cmd_header, int32_t errorcode) override;

48
components/zcancmder/zcanreceiver_master.cpp

@ -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 {

3
components/zcancmder/zcanreceiver_master.hpp

@ -64,8 +64,9 @@ class ZCanCommnaderMaster : public ZCanIRQListener, public IZcanCmderMaster {
CFG *createCFG();
void init(CFG *cfg);
void setTxPacketInterval(int interval_ms) { txPacketInterval_ms = interval_ms; }
void setTxPacketInterval(int interval_ms) { txPacketInterval_ms = interval_ms; }
virtual int32_t sendCmd(int32_t cmdid, int32_t moduleid, int32_t *param, size_t npara, int32_t *ack, size_t nack, int overtime_ms) override;
virtual int32_t sendCmdAndReceiveBuf(int32_t cmdid, int32_t moduleid, int32_t *param, size_t npara, uint8_t *ack, int32_t *rxsize, int overtime_ms) override;
public:
virtual void STM32_HAL_onCAN_RxFifo0MsgPending(CAN_HandleTypeDef *can);

2
components/zprotocols/zcancmder_v2

@ -1 +1 @@
Subproject commit 481aede1a713fc1e3a12d91970ee9aea6d722d7d
Subproject commit 4aed09f7ae4d1a12628abf0ef81e6a3ae88909c2
Loading…
Cancel
Save