From a838d01d60b3b76ba3a38b6e3d0c1b90c5c9bd2a Mon Sep 17 00:00:00 2001 From: zhaohe Date: Thu, 9 Nov 2023 20:44:27 +0800 Subject: [PATCH] update --- src/iflytop/components/zcanreceiver/zcanhost.cpp | 42 ++++++++++++++++++++++++ src/iflytop/components/zcanreceiver/zcanhost.hpp | 30 +++++++++++++++-- 2 files changed, 69 insertions(+), 3 deletions(-) diff --git a/src/iflytop/components/zcanreceiver/zcanhost.cpp b/src/iflytop/components/zcanreceiver/zcanhost.cpp index d3553dc..00b2e4d 100644 --- a/src/iflytop/components/zcanreceiver/zcanhost.cpp +++ b/src/iflytop/components/zcanreceiver/zcanhost.cpp @@ -154,6 +154,20 @@ void ZCanHost::initialize(string can_if_name, int baudrate, bool enablLoopback) std::this_thread::sleep_for(std::chrono::milliseconds(ms)); return true; }; + + m_cmdMap["call"] = [this](int argc, char** argv, string& retval) { + if (argc == 1 + 1) { + call(atoi(argv[1])); + return true; + } else if (argc == 2 + 1) { + call(atoi(argv[1]), atoi(argv[2])); + return true; + } else if (argc == 3 + 1) { + call(atoi(argv[1]), atoi(argv[2]), atoi(argv[3])); + return true; + } + return false; + }; } static void prase_cmd(char* input, int inputlen, int& argc, char* argv[]) { @@ -440,3 +454,31 @@ int32_t ZCanHost::hpp272_read_c1000(int sensorid, hpp272_data_t& value) { memcpy(&value, &rx->data[2], sizeof(hpp272_data_t)); return 0; } + +int32_t ZCanHost::call(int32_t cmdid, int32_t* val0, int32_t nval) { + shared_ptr cmd = make_shared(); + cmd->cmdid = cmdid; + cmd->subcmdid = 0; + int32_t* p = (int32_t*)&cmd->data[0]; + for (int i = 0; i < nval; i++) { + p[i] = val0[i]; + } + cmd->len = 4 * nval; + + auto rx = m_zcanReceiverHost->sendcmdblock(cmd, 100); + if (!rx) { + return err::zecode(err::knoack); + } + + 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 val0, int32_t val1) { + int32_t val[2] = {val0, val1}; + return call(cmdid, val, 2); +} \ No newline at end of file diff --git a/src/iflytop/components/zcanreceiver/zcanhost.hpp b/src/iflytop/components/zcanreceiver/zcanhost.hpp index ab855a4..eaf1b11 100644 --- a/src/iflytop/components/zcanreceiver/zcanhost.hpp +++ b/src/iflytop/components/zcanreceiver/zcanhost.hpp @@ -13,10 +13,27 @@ namespace iflytop { using namespace std; using namespace zcr; using namespace core; +typedef enum { + kcmd_ping = 0, + kcmd_read_io = 1, + kcmd_set_io = 2, + kcmd_readadc_raw = 3, + + kcmd_m211887_operation = 1000, // 维萨拉压力传感器 + kcmd_read_presure_sensor = 1001, + kcmd_triple_warning_light_ctl = 1002, + 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; class ZCanHost { ENABLE_LOGGER(ZCanHost); + public: + private: shared_ptr m_zcanReceiverHost; map> m_cmdMap; @@ -96,18 +113,25 @@ class ZCanHost { } huacheng_pressure_sensor_read_c1005_t; int32_t huacheng_pressure_sensor_get_pa(huacheng_pressure_sensor_read_c1005_t* rawdata) { if (rawdata->unit == 0) { - int32_t pa = (int32_t)rawdata->value / (pow(10.0,rawdata->precision) ) * 1000000; + int32_t pa = (int32_t)rawdata->value / (pow(10.0, rawdata->precision)) * 1000000; return pa; } else if (rawdata->unit == 1) { - int32_t pa = (int32_t)rawdata->value / (pow(10.0,rawdata->precision) ) * 1000; + int32_t pa = (int32_t)rawdata->value / (pow(10.0, rawdata->precision)) * 1000; return pa; } else if (rawdata->unit == 2) { - int32_t pa = (int32_t)rawdata->value / (pow(10.0,rawdata->precision) ); + int32_t pa = (int32_t)rawdata->value / (pow(10.0, rawdata->precision)); return pa; } return -1; } int32_t huacheng_pressure_sensor_read_c1005(int sensorid, huacheng_pressure_sensor_read_c1005_t& value); + + int32_t call(int32_t cmdid); + int32_t call(int32_t cmdid, int32_t val0); + int32_t call(int32_t cmdid, int32_t val0, int32_t val1); + + private: + int32_t call(int32_t cmdid, int32_t* val0, int32_t nval); }; } // namespace iflytop \ No newline at end of file