diff --git a/components/zcanreceiver/cmd.hpp b/components/zcanreceiver/cmd.hpp index 51810a1..f49a908 100644 --- a/components/zcanreceiver/cmd.hpp +++ b/components/zcanreceiver/cmd.hpp @@ -31,11 +31,16 @@ typedef enum { kcmd_high_power_electrical_ctl = 1003, kcmd_peristaltic_pump_ctl = 1004, kcmd_read_huacheng_pressure_sensor = 1005, + kcmd_set_proportional_valve = 1006, // {4:valveId,4:valveValue} + kcmd_air_compressor_ch_ctrl = 1007, // {4:chstate} } CmdID_t; } // namespace zcr } // namespace iflytop +#define IS_CMD(cmdheader, cmd, subcmd) ((cmdheader->cmdid == cmd) && (cmdheader->subcmdid == subcmd)) +#define CMD_GET_PARAM(cmdheader, index) (((int32_t*)cmdheader->data)[index]) + /** * @brief */ diff --git a/components/zcanreceiver/zcanreceiver.cpp b/components/zcanreceiver/zcanreceiver.cpp index a144397..88cedb8 100644 --- a/components/zcanreceiver/zcanreceiver.cpp +++ b/components/zcanreceiver/zcanreceiver.cpp @@ -198,6 +198,8 @@ bool ZCanReceiver::getRxMessage(CAN_RxHeaderTypeDef *pHeader, uint8_t aData[] /* } return false; } +void ZCanReceiver::registerListener(CanPacketRxBufferCB_t cb) { m_listenerCBList.push_back(cb); } + void ZCanReceiver::STM32_HAL_onCAN_RxFifo0MsgPending(CAN_HandleTypeDef *canHandle) { /** * @brief 中断上下文 @@ -268,6 +270,9 @@ void ZCanReceiver::loop() { for (auto &var : m_listenerList) { var->onRceivePacket(rxbuf, rxdata, dataoff); } + for (auto &var : m_listenerCBList) { + if (var) var(rxbuf, rxdata, dataoff); + } rxbuf->dataIsReady = false; } } diff --git a/components/zcanreceiver/zcanreceiver.hpp b/components/zcanreceiver/zcanreceiver.hpp index c658359..4026bf1 100644 --- a/components/zcanreceiver/zcanreceiver.hpp +++ b/components/zcanreceiver/zcanreceiver.hpp @@ -34,6 +34,8 @@ class ZCanRceiverListener { virtual void onRceivePacket(CanPacketRxBuffer *rxbuf, uint8_t *packet, size_t len) = 0; }; +typedef function CanPacketRxBufferCB_t; + class ZCanReceiver : public ZCanIRQListener { public: class CFG { @@ -65,6 +67,7 @@ class ZCanReceiver : public ZCanIRQListener { HAL_StatusTypeDef m_lastTransmitStatus; // 上次调用can发送方法的返回值 list m_listenerList; + list m_listenerCBList; CanPacketRxBuffer m_canPacketRxBuffer[1]; public: @@ -73,6 +76,7 @@ class ZCanReceiver : public ZCanIRQListener { void init(CFG *cfg); void registerListener(ZCanRceiverListener *listener); + void registerListener(CanPacketRxBufferCB_t cb); void sendPacket(uint8_t *packet, size_t len); void sendAck(Cmdheader_t *cmdheader, uint8_t *data, size_t len); void sendErrorAck(Cmdheader_t *cmdheader, int16_t errcode);