From 17b5cd5e7e493cc763528ce03d5b4976d2a39bd0 Mon Sep 17 00:00:00 2001 From: zhaohe Date: Mon, 13 Nov 2023 14:35:55 +0800 Subject: [PATCH] update --- src/iflytop/components/zcanreceiver/zcanhost.cpp | 43 ++++++++++++++++++++---- src/iflytop/components/zcanreceiver/zcanhost.hpp | 13 +++++-- 2 files changed, 46 insertions(+), 10 deletions(-) diff --git a/src/iflytop/components/zcanreceiver/zcanhost.cpp b/src/iflytop/components/zcanreceiver/zcanhost.cpp index 00b2e4d..3df3e6e 100644 --- a/src/iflytop/components/zcanreceiver/zcanhost.cpp +++ b/src/iflytop/components/zcanreceiver/zcanhost.cpp @@ -156,14 +156,18 @@ void ZCanHost::initialize(string can_if_name, int baudrate, bool enablLoopback) }; m_cmdMap["call"] = [this](int argc, char** argv, string& retval) { + int32_t ack = 0; if (argc == 1 + 1) { - call(atoi(argv[1])); + call(atoi(argv[1]), &ack); + retval = fmt::format("ACK:{}", ack); return true; } else if (argc == 2 + 1) { - call(atoi(argv[1]), atoi(argv[2])); + call(atoi(argv[1]), atoi(argv[2]), &ack); + retval = fmt::format("ACK:{}", ack); return true; } else if (argc == 3 + 1) { - call(atoi(argv[1]), atoi(argv[2]), atoi(argv[3])); + call(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]), &ack); + retval = fmt::format("ACK:{}", ack); return true; } return false; @@ -455,7 +459,7 @@ int32_t ZCanHost::hpp272_read_c1000(int sensorid, hpp272_data_t& value) { return 0; } -int32_t ZCanHost::call(int32_t cmdid, int32_t* val0, int32_t nval) { +int32_t ZCanHost::call(int32_t cmdid, int32_t* val0, int32_t nval, int32_t* ack, int32_t* acknum) { shared_ptr cmd = make_shared(); cmd->cmdid = cmdid; cmd->subcmdid = 0; @@ -470,15 +474,40 @@ int32_t ZCanHost::call(int32_t cmdid, int32_t* val0, int32_t nval) { return err::zecode(err::knoack); } + if (ack != nullptr && acknum != nullptr && rx->packetType == kpt_ack) { + int32_t rxdatasize = rx->len / 4; + for (int32_t i = 0; i < *acknum; i++) { + ack[i] = *(int32_t*)&(rx->data[i * 4]); + if (i >= rxdatasize) { + ack[i] = 0; + } + } + *acknum = rxdatasize; + } + if (rx->packetType == kpt_error_ack) { logger->error("call error ack,{}", *zuint16p(&rx->data[0])); return err::zecode(err::kfail); } return 0; } -int32_t ZCanHost::call(int32_t cmdid) { return call(cmdid, (int32_t*)nullptr, 0); } -int32_t ZCanHost::call(int32_t cmdid, int32_t val0) { return call(cmdid, &val0, 1); } +int32_t ZCanHost::call(int32_t cmdid, int32_t* ack) { + int32_t acknum = 1; + return call(cmdid, (int32_t*)nullptr, 0, ack, &acknum); +} +int32_t ZCanHost::call(int32_t cmdid, int32_t val0, int32_t* ack) { + int32_t val[1] = {val0}; + int32_t acknum = 1; + return call(cmdid, val, 1, ack, &acknum); +} +int32_t ZCanHost::call(int32_t cmdid, int32_t val0, int32_t val1, int32_t* ack) { + int32_t val[2] = {val0, val1}; + int32_t acknum = 1; + return call(cmdid, val, 2, ack, &acknum); +} +int32_t ZCanHost::call(int32_t cmdid) { return call(cmdid, (int32_t*)nullptr, 0, nullptr, nullptr); } +int32_t ZCanHost::call(int32_t cmdid, int32_t val0) { return call(cmdid, &val0, 1, nullptr, nullptr); } int32_t ZCanHost::call(int32_t cmdid, int32_t val0, int32_t val1) { int32_t val[2] = {val0, val1}; - return call(cmdid, val, 2); + return call(cmdid, val, 2, nullptr, nullptr); } \ No newline at end of file diff --git a/src/iflytop/components/zcanreceiver/zcanhost.hpp b/src/iflytop/components/zcanreceiver/zcanhost.hpp index eaf1b11..782d25b 100644 --- a/src/iflytop/components/zcanreceiver/zcanhost.hpp +++ b/src/iflytop/components/zcanreceiver/zcanhost.hpp @@ -25,8 +25,11 @@ 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} + kcmd_set_proportional_valve = 1006, // 设置比例阀 {4:valveId,4:valveValue} + kcmd_air_compressor_ch_select = 1007, // 空压机通道选择 {4:val} + kcmd_air_compressor_valve1_set = 1008, // 空压机阀门1控制 {4:val} + kcmd_air_compressor_valve2_set = 1009, // 空压机阀门2控制 {4:val} + kcmd_air_compressor_read_pressure = 1010, // 空压机阀读取压力 {}{4:val} } CmdID_t; class ZCanHost { @@ -130,8 +133,12 @@ class ZCanHost { int32_t call(int32_t cmdid, int32_t val0); int32_t call(int32_t cmdid, int32_t val0, int32_t val1); + int32_t call(int32_t cmdid, int32_t* ack); + int32_t call(int32_t cmdid, int32_t val0, int32_t* ack); + int32_t call(int32_t cmdid, int32_t val0, int32_t val1, int32_t* ack); + private: - int32_t call(int32_t cmdid, int32_t* val0, int32_t nval); + int32_t call(int32_t cmdid, int32_t* val0, int32_t nval, int32_t* ack, int32_t* acknum); }; } // namespace iflytop \ No newline at end of file