From f4906a3f648d54db3d78e7993e794de99bc4e483 Mon Sep 17 00:00:00 2001 From: zhaohe Date: Fri, 11 Apr 2025 21:09:32 +0800 Subject: [PATCH] =?UTF-8?q?1021=20|=20=E4=BF=AE=E5=A4=8Dzcan=E6=8E=A5?= =?UTF-8?q?=E6=94=B6=E4=BB=A3=E7=A0=81=20=E4=B8=A2=E5=8C=85=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sdk/components/modbus/modbus_client.hpp | 8 +- .../zcan_board_module/zcan_board_module.cpp | 149 ++++ .../zcan_board_module/zcan_board_module.hpp | 82 ++ .../zcan_protocol_parser/zcan_protocol_parser.cpp | 955 +++++++++++++++++++++ .../zcan_protocol_parser/zcan_protocol_parser.hpp | 195 +++++ sdk/components/zcancmder/basic.cpp | 0 sdk/components/zcancmder/basic.hpp | 7 - .../zcancmder/protocol_event_bus_sender.hpp | 1 - sdk/components/zcancmder/type/zcan_rx_frame.hpp | 24 + .../zcancmder/type/zcan_rx_frame_pool.hpp | 40 + .../zcancmder/type/zcan_rx_frame_queue.hpp | 31 + sdk/components/zcancmder/zcan_board_module.cpp | 149 ---- sdk/components/zcancmder/zcan_board_module.hpp | 82 -- sdk/components/zcancmder/zcan_protocol_parser.cpp | 951 -------------------- sdk/components/zcancmder/zcan_protocol_parser.hpp | 195 ----- sdk/components/zcancmder/zcanreceiver.cpp | 90 +- sdk/components/zcancmder/zcanreceiver.hpp | 41 +- usrc/public_service/gservice.hpp | 2 +- usrc/version.h | 2 +- 19 files changed, 1528 insertions(+), 1476 deletions(-) create mode 100644 sdk/components/zcan_board_module/zcan_board_module.cpp create mode 100644 sdk/components/zcan_board_module/zcan_board_module.hpp create mode 100644 sdk/components/zcan_protocol_parser/zcan_protocol_parser.cpp create mode 100644 sdk/components/zcan_protocol_parser/zcan_protocol_parser.hpp delete mode 100644 sdk/components/zcancmder/basic.cpp delete mode 100644 sdk/components/zcancmder/basic.hpp create mode 100644 sdk/components/zcancmder/type/zcan_rx_frame.hpp create mode 100644 sdk/components/zcancmder/type/zcan_rx_frame_pool.hpp create mode 100644 sdk/components/zcancmder/type/zcan_rx_frame_queue.hpp delete mode 100644 sdk/components/zcancmder/zcan_board_module.cpp delete mode 100644 sdk/components/zcancmder/zcan_board_module.hpp delete mode 100644 sdk/components/zcancmder/zcan_protocol_parser.cpp delete mode 100644 sdk/components/zcancmder/zcan_protocol_parser.hpp diff --git a/sdk/components/modbus/modbus_client.hpp b/sdk/components/modbus/modbus_client.hpp index 0963f90..30358d9 100644 --- a/sdk/components/modbus/modbus_client.hpp +++ b/sdk/components/modbus/modbus_client.hpp @@ -1,10 +1,10 @@ #pragma once #include "modbus_processer.hpp" +#include "sdk/components/api/zi_uart_sender.hpp" +#include "sdk/components/hardware/uart/zuart_dma_receiver.hpp" +#include "sdk/components/zcan_board_module/zcan_board_module.hpp" +#include "sdk/components/zcancmder/zcanreceiver.hpp" #include "sdk/os/zos.hpp" -#include "sdk\components\api\zi_uart_sender.hpp" -#include "sdk\components\hardware\uart\zuart_dma_receiver.hpp" -#include "sdk\components\zcancmder\zcan_board_module.hpp" -#include "sdk\components\zcancmder\zcanreceiver.hpp" namespace iflytop { diff --git a/sdk/components/zcan_board_module/zcan_board_module.cpp b/sdk/components/zcan_board_module/zcan_board_module.cpp new file mode 100644 index 0000000..53b1bf2 --- /dev/null +++ b/sdk/components/zcan_board_module/zcan_board_module.cpp @@ -0,0 +1,149 @@ +#include "zcan_board_module.hpp" + +using namespace iflytop; +using namespace std; +void ZCanBoardModule::initialize(int32_t moduleId, hardware_config_t *hcfg) { + module_id = moduleId; + m_cfg = *hcfg; + + for (int i = 0; i < ZARRAY_SIZE(hcfg->input); i++) { + if (hcfg->input[i].pin == PinNull) { + break; + } + ZGPIO::InputGpioCfg_t *cfg = &hcfg->input[i]; + m_input[i].initAsInput(cfg->pin, cfg->mode, cfg->irqtype, cfg->mirror); + m_input_num++; + } + + for (int i = 0; i < ZARRAY_SIZE(hcfg->output); i++) { + if (hcfg->output[i].pin == PinNull) { + break; + } + ZGPIO::OutputGpioCfg_t *cfg = &hcfg->output[i]; + m_output[i].initAsOutput(cfg->pin, cfg->mode, cfg->mirror, cfg->initLevel); + m_output_num++; + } + + +} +int32_t ZCanBoardModule::getid(int32_t *id) { + *id = module_id; + return 0; +}; +// int32_t ZCanBoardModule::module_readio(int32_t *io) { +// *io = readinput(); +// return 0; +// }; +// int32_t ZCanBoardModule::module_writeio(int32_t idindex, int32_t io) { +// if (idindex < 0 || idindex >= ZARRAY_SIZE(m_output)) { +// return err::kparam_out_of_range; +// } +// m_output[idindex].setState(io); +// return 0; +// }; + +int32_t ZCanBoardModule::module_xxx_reg(int32_t param_id, bool read, int32_t &val) { + switch (param_id) { + PROCESS_REG(kreg_module_version, /* */ REG_GET(0x0001), ACTION_NONE); + PROCESS_REG(kreg_module_type, /* */ REG_GET(0), ACTION_NONE); + default: + return err::kmodule_not_find_reg; + break; + } + return 0; +} + +int32_t ZCanBoardModule::module_get_status(int32_t *status) { + *status = 0; + return 0; +} + +int32_t ZCanBoardModule::module_set_reg(int32_t param_id, int32_t param_value) { return module_xxx_reg(param_id, false, param_value); } +int32_t ZCanBoardModule::module_get_reg(int32_t param_id, int32_t *param_value) { return module_xxx_reg(param_id, true, *param_value); } + +int32_t ZCanBoardModule::readinput() { + int32_t inputval = 0; + for (int i = 0; i < m_input_num; i++) { + if (m_input[i].getStateUint32()) { + inputval |= (1 << i); + } + } + return inputval; +} +int32_t ZCanBoardModule::readoutput() { + int32_t outputval = 0; + for (int i = 0; i < m_output_num; i++) { + if (m_output[i].getStateUint32()) { + outputval |= (1 << i); + } + } + return outputval; +} + +int32_t ZCanBoardModule::readTemperature(int32_t sensorId, int32_t &temperature_val) { + if (sensorId < 0 || sensorId >= ZARRAY_SIZE(m_cfg.temperature_sensor)) { + return err::kmodule_not_find_reg; + } + + if (m_cfg.temperature_sensor[sensorId] == nullptr) { + return err::kmodule_not_find_reg; + } + return m_cfg.temperature_sensor[sensorId]->getTemperature(temperature_val); +} + +int32_t ZCanBoardModule::setPwmState(int32_t pwmId, int32_t state) { + if (pwmId < 0 || pwmId >= ZARRAY_SIZE(m_cfg.pwmctrl)) { + return err::kmodule_not_find_reg; + } + if (m_cfg.pwmctrl[pwmId] == nullptr) { + return err::kmodule_not_find_reg; + } + return m_cfg.pwmctrl[pwmId]->pwm_set_state(state); +} +int32_t ZCanBoardModule::getPwmState(int32_t pwmId, int32_t &state) { + if (pwmId < 0 || pwmId >= ZARRAY_SIZE(m_cfg.pwmctrl)) { + return err::kmodule_not_find_reg; + } + if (m_cfg.pwmctrl[pwmId] == nullptr) { + return err::kmodule_not_find_reg; + } + return m_cfg.pwmctrl[pwmId]->pwm_get_state(state); +} + +int32_t ZCanBoardModule::readPwmDuty(int32_t pwmId, int32_t &duty) { + if (pwmId < 0 || pwmId >= ZARRAY_SIZE(m_cfg.pwmctrl)) { + return err::kmodule_not_find_reg; + } + if (m_cfg.pwmctrl[pwmId] == nullptr) { + return err::kmodule_not_find_reg; + } + return m_cfg.pwmctrl[pwmId]->get_pwm_duty(duty); +} +int32_t ZCanBoardModule::setPwmDuty(int32_t pwmId, int32_t duty) { + if (pwmId < 0 || pwmId >= ZARRAY_SIZE(m_cfg.pwmctrl)) { + return err::kmodule_not_find_reg; + } + if (m_cfg.pwmctrl[pwmId] == nullptr) { + return err::kmodule_not_find_reg; + } + return m_cfg.pwmctrl[pwmId]->set_pwm_duty(duty); +} + +int32_t ZCanBoardModule::readPwmFreq(int32_t pwmId, int32_t &freq) { + if (pwmId < 0 || pwmId >= ZARRAY_SIZE(m_cfg.pwmctrl)) { + return err::kmodule_not_find_reg; + } + if (m_cfg.pwmctrl[pwmId] == nullptr) { + return err::kmodule_not_find_reg; + } + return m_cfg.pwmctrl[pwmId]->get_pwm_freq(freq); +} +int32_t ZCanBoardModule::setPwmFreq(int32_t pwmId, int32_t freq) { + if (pwmId < 0 || pwmId >= ZARRAY_SIZE(m_cfg.pwmctrl)) { + return err::kmodule_not_find_reg; + } + if (m_cfg.pwmctrl[pwmId] == nullptr) { + return err::kmodule_not_find_reg; + } + return m_cfg.pwmctrl[pwmId]->set_pwm_freq(freq); +} \ No newline at end of file diff --git a/sdk/components/zcan_board_module/zcan_board_module.hpp b/sdk/components/zcan_board_module/zcan_board_module.hpp new file mode 100644 index 0000000..68441dc --- /dev/null +++ b/sdk/components/zcan_board_module/zcan_board_module.hpp @@ -0,0 +1,82 @@ +// +// Created by zwsd +// + +#pragma once +#include "sdk/os/zos.hpp" +// +#include "a8000_protocol/protocol.hpp" +#include "sdk/chip/api/zi_adc.hpp" +#include "sdk/chip/api/zi_api.hpp" +#include "sdk/chip/api/zi_temperature.hpp" +#include "sdk/components/api/zi_module.hpp" + +/** + * @brief + * + * service: M3078 + * + * 监听事件: + * 依赖状态: + * 依赖服务: + * 作用: + * + * 推荐配置: + * 1. 识读模式:按键保持 + * 2. 波特率:9600 + * 3. 单次扫码时长:无限时 + * + */ + +namespace iflytop { +using namespace std; + +class ZCanBoardModule : public ZIModule { + public: + typedef struct { + ZGPIO::InputGpioCfg_t input[32]; + ZGPIO::OutputGpioCfg_t output[32]; + ZITemperature *temperature_sensor[8]; + ZIPWMCtrl *pwmctrl[8]; + } hardware_config_t; + + hardware_config_t m_cfg; + int32_t module_id; + + ZGPIO m_input[32]; + ZGPIO m_output[32]; + + int32_t m_input_num = 0; + int32_t m_output_num = 0; + + public: + virtual ~ZCanBoardModule() {} + + void initialize(int32_t moduleId, hardware_config_t *cfg); + virtual int32_t getid(int32_t *id) override; + // virtual int32_t module_readio(int32_t *io) override; + // virtual int32_t module_writeio(int32_t idindex, int32_t io) override; + + virtual int32_t module_set_reg(int32_t param_id, int32_t param_value); + virtual int32_t module_get_reg(int32_t param_id, int32_t *param_value); + virtual int32_t module_reset_reg() override { return 0; }; + + virtual int32_t module_get_status(int32_t *status); + + private: + int32_t module_xxx_reg(int32_t param_id, bool read, int32_t ¶m_value); + int32_t readinput(); + int32_t readoutput(); + int32_t readTemperature(int32_t sensorId, int32_t &temperature_val); + + int32_t readPwmDuty(int32_t pwmId, int32_t &duty); + int32_t setPwmDuty(int32_t pwmId, int32_t duty); + + int32_t readPwmFreq(int32_t pwmId, int32_t &freq); + int32_t setPwmFreq(int32_t pwmId, int32_t freq); + + int32_t setPwmState(int32_t pwmId, int32_t state); + int32_t getPwmState(int32_t pwmId, int32_t &state); +}; + +} // namespace iflytop diff --git a/sdk/components/zcan_protocol_parser/zcan_protocol_parser.cpp b/sdk/components/zcan_protocol_parser/zcan_protocol_parser.cpp new file mode 100644 index 0000000..b0472f7 --- /dev/null +++ b/sdk/components/zcan_protocol_parser/zcan_protocol_parser.cpp @@ -0,0 +1,955 @@ +#include "zcan_protocol_parser.hpp" + +#include +#include + +// +#include "public_service\ext_board_impl.hpp" +#include "sdk\components\mini_servo_motor\mini_servo_motor_ctrl_module.hpp" +#include "sdk\components\pipette_module\pipette_ctrl_module_v2.hpp" +#include "sdk\components\sensors\m3078\m3078_code_scaner.hpp" +#include "sdk\components\step_motor_ctrl_module\step_motor_ctrl_module.hpp" +#include "sdk\components\water_cooling_temperature_control_module\water_cooling_temperature_control_module.hpp" +#include "sdk\components\xy_robot_ctrl_module\xy_robot_ctrl_module.hpp" +#include "subboards\subboard40_and_50_temperature_ctrl\zcan_fan_ctrl_module.hpp" +#include "subboards\subboard90_optical_module\optical_module_v2.hpp" +#include "usrc\subboards\subboard100_idcard_reader\eeprom_service.hpp" +#include "usrc\subboards\subboard20_plate_clamp_case\plate_code_scaner_module.hpp" +// + +#include "sdk/os/zos.hpp" + +using namespace iflytop; +using namespace std; +#define TAG "PROTO" + +#define REGFN(fn) regCmdFn(k##fn, fn); + +static const char* hex2str(const char* hex, size_t len) { + static char buf[256]; + memset(buf, 0, sizeof(buf)); + for (size_t i = 0; i < len; i++) { + sprintf(buf + i * 2, "%02X", hex[i]); + } + return buf; +} + +void ZCanProtocolParser::initialize(ZCanReceiver* cancmder) { + m_cancmder = cancmder; + m_cancmder->registerListener(this); + + REGFN(module_ping); + REGFN(module_get_status); + REGFN(module_set_reg); + REGFN(module_get_reg); + REGFN(module_get_error); + REGFN(module_clear_error); + REGFN(module_stop); + REGFN(module_reset_reg); + + REGFN(step_motor_enable); + REGFN(step_motor_read_pos); + REGFN(step_motor_read_enc_pos); + REGFN(step_motor_easy_rotate); + REGFN(step_motor_easy_move_by); + REGFN(step_motor_easy_move_to); + REGFN(step_motor_easy_move_to_zero); + REGFN(step_motor_easy_set_current_pos); + REGFN(step_motor_easy_move_to_io); + REGFN(step_motor_active_cfg); + REGFN(step_motor_stop); + REGFN(step_motor_read_io_state); + REGFN(step_motor_easy_move_to_end_point); + REGFN(step_motor_easy_reciprocating_motion); + + REGFN(step_motor_read_tmc5130_status); + REGFN(step_motor_read_tmc5130_state); + REGFN(step_motor_read_io_index_in_stm32); + REGFN(step_motor_set_subdevice_reg); + REGFN(step_motor_get_subdevice_reg); + REGFN(step_motor_easy_move_to_zero_point_quick); + + REGFN(mini_servo_enable); + REGFN(mini_servo_read_pos); + REGFN(mini_servo_active_cfg); + REGFN(mini_servo_stop); + REGFN(mini_servo_set_mid_point); + REGFN(mini_servo_read_io_state); + + REGFN(mini_servo_move_to); + REGFN(mini_servo_rotate); + REGFN(mini_servo_rotate_with_torque); + REGFN(mini_servo_set_cur_pos); + + REGFN(extboard_read_inio); + REGFN(extboard_write_outio); + REGFN(extboard_read_muti_inio); + REGFN(extboard_read_inio_index_in_stm32); + REGFN(extboard_read_outio_index_in_stm32); + REGFN(extboard_read_outio); + + REGFN(code_scaner_start_scan); + REGFN(code_scaner_stop_scan); + REGFN(code_scaner_result_is_ready); + REGFN(code_scaner_get_result_length); + REGFN(code_scaner_read_scaner_result); + + REGFN(temp_controler_start_hearting); + REGFN(temp_controler_stop_hearting); + REGFN(temp_controler_set_peltier_power_level); + REGFN(temp_controler_set_pump_level); + REGFN(temp_controler_set_fan_level); + REGFN(temp_controler_enable_log); + + REGFN(fan_controler_set_speed); + REGFN(xymotor_enable); + REGFN(xymotor_move_by); + REGFN(xymotor_move_to); + REGFN(xymotor_move_to_zero); + REGFN(xymotor_read_pos); + REGFN(xymotor_read_inio); + REGFN(xymotor_read_inio_index_in_stm32); + REGFN(xymotor_set_pos); + REGFN(xymotor_motor_move_by_direct); + REGFN(xymotor_read_enc_direct); + +#if 1 + REGFN(a8000_optical_read_raw); + + REGFN(a8k_opt_v2_t_start_scan); + REGFN(a8k_opt_v2_f_start_scan); + REGFN(a8k_opt_v2_t_open_laster); + REGFN(a8k_opt_v2_t_close_laster); + REGFN(a8k_opt_v2_t_readVal); + REGFN(a8k_opt_v2_f_open_laster); + REGFN(a8k_opt_v2_f_close_laster); + REGFN(a8k_opt_v2_f_readVal); + REGFN(a8k_opt_v2_barcode_start_scan); + +#endif + + REGFN(a8000_idcard_reader_read_raw); + REGFN(a8000_idcard_write_raw); + REGFN(a8000_idcard_erase); + REGFN(a8000_idcard_earse_unlock); + + REGFN(plate_code_scaner_push_card_and_scan); + REGFN(plate_code_scaner_stop_scan); + REGFN(plate_code_scaner_read_result); + REGFN(plate_code_scaner_read_result_point_num); + REGFN(plate_code_scaner_read_code); + REGFN(plate_code_scaner_adc_readraw); + REGFN(plate_code_scaner_open_laser); + REGFN(plate_code_scaner_close_laser); + + REGFN(pipette_zmotor_enable); + REGFN(pipette_zmotor_move_zero); + REGFN(pipette_zmotor_move_to_zero_point_quick); + REGFN(pipette_zmotor_measure_distance); + REGFN(pipette_zmotor_read_measure_distance_result); + REGFN(pipette_zmotor_move_by); + REGFN(pipette_zmotor_move_to); + + REGFN(liquid_operation_clear_params); + REGFN(liquid_operation_set_gun_runparams); + REGFN(liquid_operation_set_zmotor_runparams); + REGFN(liquid_operation_enable_lld_record); + REGFN(liquid_operation_fresh_params); + + REGFN(pipette_init_device); + REGFN(pipette_put_tip); + REGFN(pipette_pump_move_to); + REGFN(pipette_lld); + REGFN(pipette_aspirate); + REGFN(pipette_distribu); + REGFN(pipette_shake_up); + REGFN(pipette_clear_hanging_liquid) + REGFN(pipette_lld_is_detect_liquid); + REGFN(pipette_get_sensor_sample_data); + REGFN(pipette_get_sensor_sample_data_num); + REGFN(pipette_zmotor_read_zero_point_state); + REGFN(pipette_zmotor_read_dev_status_cache); +} +void ZCanProtocolParser::_registerModule(uint16_t id, ZIModule* module) { m_modulers[id] = module; } +void ZCanProtocolParser::registerModule(ZIModule* module) { + int32_t moduleid = 0; + module->getid(&moduleid); + uint16_t id = moduleid; + _registerModule(id, module); +} + +void ZCanProtocolParser::processRxPacket(ZcanRxframe* rxframe) { + // printf("processRxPacket cmdid:%d moduleid:%d\n", rxcmd->cmdid, rxcmd->moduleId); + if (rxframe->cxt) _processRxPacket((ZIModule*)rxframe->cxt, (zcr_cmd_header_t*)rxframe->rxdata, rxframe->rxdataLen); +} + +bool ZCanProtocolParser::filterPacket(ZcanRxframe* rxframe) { + zcr_cmd_header_t* rxcmd = (zcr_cmd_header_t*)rxframe->rxdata; + int32_t len = rxframe->rxdataLen; + + uint16_t moduleid = rxcmd->moduleId; + auto it = m_modulers.find(moduleid); + if (it == m_modulers.end()) { + rxframe->cxt = nullptr; + return false; + } + rxframe->cxt = it->second; + return true; +} + +void ZCanProtocolParser::regCmdFn(int32_t cmdid, cmdcb_t cb) { + cmdfnlist[cmdfnNum].cmdid = cmdid; + cmdfnlist[cmdfnNum].cb = cb; + cmdfnNum++; +} +ZCanProtocolParser::cmdfn_t* ZCanProtocolParser::findcmdfn(int32_t cmdid) { + for (int i = 0; i < cmdfnNum; i++) { + if (cmdfnlist[i].cmdid == cmdid) { + return &cmdfnlist[i]; + } + } + return nullptr; +} + +static bool checkpacket(const zcr_cmd_header_t* header, int len) { + if (len < sizeof(zcr_cmd_header_t)) { + return false; + } + if ((header->datalen + sizeof(zcr_cmd_header_t) + 1) != len) { + return false; + } + + uint8_t* rawpacket = (uint8_t*)header; + uint8_t checksum = 0; + for (int i = 0; i < len - 1; i++) { + checksum += rawpacket[i]; + } + + if (checksum != rawpacket[len - 1]) { + return false; + } + + return true; +} + +void ZCanProtocolParser::_processRxPacket(ZIModule* module, zcr_cmd_header_t* rxcmd, int32_t len) { + int paramNum = (len) / sizeof(int32_t); + int32_t* ack = (int32_t*)&ackbuf[0]; + + cmdfn_t* fn = findcmdfn(rxcmd->cmdid); + if (!fn) { + ZLOGE(TAG, "cmd not support:%d,rx:%s", rxcmd->cmdid, hex2str((const char*)rxcmd, len)); + m_cancmder->sendErrorAck(rxcmd, err::kcmd_not_support); + return; + } + + if (!checkpacket(rxcmd, len)) { + ZLOGE(TAG, "check sum error,rx:%s(%d)", hex2str((const char*)rxcmd, len), len); + m_cancmder->sendErrorAck(rxcmd, err::kcheck_sum_error); + return; + } + + cmdcontxt_t cxt = {0}; + cxt.module = module; + cxt.rxcmd = rxcmd; + cxt.cmdid = rxcmd->cmdid; + cxt.params = (int32_t*)rxcmd->data; + cxt.paramRaw = rxcmd->data; + cxt.paramlen = rxcmd->datalen; + cxt.acklen = 0; + cxt.ackbuf = ackbuf; + + memset(ackbuf, 0, sizeof(ackbuf)); + int32_t ecode = module->bfcall(cxt.cmdid, cxt.paramRaw, cxt.paramlen); + if (ecode == 0) ecode = fn->cb(&cxt); + module->aftercall(cxt.cmdid, cxt.paramRaw, cxt.paramlen, cxt.ackbuf, cxt.acklen, ecode); + + if (ecode != 0) { + m_cancmder->sendErrorAck(rxcmd, ecode); + } else { + m_cancmder->sendBufAck(rxcmd, cxt.ackbuf, cxt.acklen); + } + return; +} + +#define CHECK_AND_GET_MODULE(paraNum) \ + auto* module = dynamic_cast(cxt->module); \ + if (module == nullptr) return err::kcmd_not_support; \ + if (paraNum >= 0 && paraNum != cxt->paramlen / 4) return err::kcmd_param_num_error; + +#define GET_MODULE(paraNum) \ + auto* module = dynamic_cast(cxt->module); \ + if (module == nullptr) return err::kcmd_not_support; + +#define MODULE_CLASS ZIModule +int32_t ZCanProtocolParser::module_ping(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(0); + return module->module_ping(); +} +int32_t ZCanProtocolParser::module_get_status(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(0); + int32_t* ack = (int32_t*)cxt->ackbuf; + cxt->acklen = 4; + return module->module_get_status(&ack[0]); +} +int32_t ZCanProtocolParser::module_set_reg(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(2); + return module->module_set_reg(cxt->params[0], cxt->params[1]); +} +int32_t ZCanProtocolParser::module_get_reg(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(1); + int32_t* ack = (int32_t*)cxt->ackbuf; + cxt->acklen = 4; + return module->module_get_reg(cxt->params[0], &ack[0]); +} + +int32_t ZCanProtocolParser::module_get_error(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(0); + int32_t* ack = (int32_t*)cxt->ackbuf; + cxt->acklen = 4; + return module->module_get_error(&ack[0]); +} +int32_t ZCanProtocolParser::module_clear_error(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(0); + return module->module_clear_error(); +} + +int32_t ZCanProtocolParser::module_stop(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(0); + return module->module_stop(); +} +int32_t ZCanProtocolParser::module_reset_reg(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(0); + return module->module_reset_reg(); +} +int32_t ZCanProtocolParser::module_active_cfg(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(0); + return module->module_active_cfg(); +} + +#undef MODULE_CLASS + +/*********************************************************************************************************************** + * ZIStepMotor * + ***********************************************************************************************************************/ + +#define MODULE_CLASS StepMotorCtrlModule + +int32_t ZCanProtocolParser::step_motor_enable(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(1); + return module->step_motor_enable(cxt->params[0]); +} +int32_t ZCanProtocolParser::step_motor_stop(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(1); + return module->step_motor_stop(cxt->params[0]); +} +int32_t ZCanProtocolParser::step_motor_read_pos(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(0); + int32_t* ack = (int32_t*)cxt->ackbuf; + cxt->acklen = 4; + return module->step_motor_read_pos(&ack[0]); +} + +int32_t ZCanProtocolParser::step_motor_read_enc_pos(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(0); + int32_t* ack = (int32_t*)cxt->ackbuf; + cxt->acklen = 4; + return module->step_motor_read_enc_pos(&ack[0]); +} + +int32_t ZCanProtocolParser::step_motor_easy_rotate(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(1); + return module->step_motor_easy_rotate(cxt->params[0]); +} + +int32_t ZCanProtocolParser::step_motor_easy_move_by(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(1); + return module->step_motor_easy_move_by(cxt->params[0]); +} +int32_t ZCanProtocolParser::step_motor_easy_move_to(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(1); + return module->step_motor_easy_move_to(cxt->params[0]); +} +int32_t ZCanProtocolParser::step_motor_easy_move_to_zero(cmdcontxt_t* cxt) { + GET_MODULE(0); + return module->step_motor_easy_move_to_zero(); +} +int32_t ZCanProtocolParser::step_motor_easy_set_current_pos(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(1); + return module->step_motor_easy_set_current_pos(cxt->params[0]); +} +int32_t ZCanProtocolParser::step_motor_easy_move_to_io(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(2); + return module->step_motor_easy_move_to_io(cxt->params[0], cxt->params[1]); +} + +int32_t ZCanProtocolParser::step_motor_active_cfg(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(0); + return module->step_motor_active_cfg(); +} +int32_t ZCanProtocolParser::step_motor_read_io_state(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(1); + int32_t* ack = (int32_t*)cxt->ackbuf; + cxt->acklen = 4; + return module->step_motor_read_io_state(cxt->params[0], ack); +} + +int32_t ZCanProtocolParser::step_motor_easy_move_to_end_point(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(0); + return module->step_motor_easy_move_to_end_point(); +} +// step_motor_easy_reciprocating_motion +int32_t ZCanProtocolParser::step_motor_easy_reciprocating_motion(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(3); + return module->step_motor_easy_reciprocating_motion(cxt->params[0], cxt->params[1], cxt->params[2]); +} + +int32_t ZCanProtocolParser::step_motor_read_tmc5130_status(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(0); + int32_t* ack = (int32_t*)cxt->ackbuf; + cxt->acklen = 4; + return module->step_motor_read_tmc5130_status(&ack[0]); +} +int32_t ZCanProtocolParser::step_motor_read_tmc5130_state(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(0); + int32_t* ack = (int32_t*)cxt->ackbuf; + cxt->acklen = 4; + return module->step_motor_read_tmc5130_state(&ack[0]); +} +int32_t ZCanProtocolParser::step_motor_read_io_index_in_stm32(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(1); + int32_t* ack = (int32_t*)cxt->ackbuf; + cxt->acklen = 4; + return module->step_motor_read_io_index_in_stm32(cxt->params[0], ack); +} + +int32_t ZCanProtocolParser::step_motor_set_subdevice_reg(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(2); + return module->step_motor_set_subdevice_reg(cxt->params[0], cxt->params[1]); +} + +int32_t ZCanProtocolParser::step_motor_get_subdevice_reg(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(1); + int32_t* ack = (int32_t*)cxt->ackbuf; + cxt->acklen = 4; + return module->step_motor_get_subdevice_reg(cxt->params[0], ack); +} + +int32_t ZCanProtocolParser::step_motor_easy_move_to_zero_point_quick(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(0); + return module->step_motor_easy_move_to_zero_point_quick(); +} + +#undef MODULE_CLASS +#define MODULE_CLASS MiniServoCtrlModule +// virtual int32_t mini_servo_enable(int32_t enable) = 0; +// virtual int32_t mini_servo_read_pos(int32_t* pos) = 0; +// virtual int32_t mini_servo_active_cfg() = 0; +// virtual int32_t mini_servo_stop(int32_t breakstop) = 0; + +// virtual int32_t mini_servo_rotate(int32_t direction) = 0; +// virtual int32_t mini_servo_move_to(int32_t position) = 0; + +// virtual int32_t mini_servo_set_mid_point() = 0; +// virtual int32_t mini_servo_read_io_state(int32_t ioindex) = 0; +int32_t ZCanProtocolParser::mini_servo_enable(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(1); + return module->mini_servo_enable(cxt->params[0]); +} +int32_t ZCanProtocolParser::mini_servo_read_pos(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(0); + int32_t* ack = (int32_t*)cxt->ackbuf; + cxt->acklen = 4; + return module->mini_servo_read_pos(&ack[0]); +} +int32_t ZCanProtocolParser::mini_servo_active_cfg(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(0); + return module->mini_servo_active_cfg(); +} +int32_t ZCanProtocolParser::mini_servo_stop(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(1); + return module->mini_servo_stop(cxt->params[0]); +} +int32_t ZCanProtocolParser::mini_servo_set_mid_point(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(0); + return module->mini_servo_set_mid_point(); +} +int32_t ZCanProtocolParser::mini_servo_read_io_state(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(1); + int32_t* ack = (int32_t*)cxt->ackbuf; + cxt->acklen = 4; + return module->mini_servo_read_io_state(cxt->params[0], ack); +} + +int32_t ZCanProtocolParser::mini_servo_move_to(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(1); + return module->mini_servo_move_to(cxt->params[0]); +} +int32_t ZCanProtocolParser::mini_servo_rotate(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(1); + return module->mini_servo_rotate(cxt->params[0]); +} +int32_t ZCanProtocolParser::mini_servo_rotate_with_torque(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(1); + return module->mini_servo_rotate_with_torque(cxt->params[0]); +} +int32_t ZCanProtocolParser::mini_servo_set_cur_pos(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(1); + return module->mini_servo_set_cur_pos(cxt->params[0]); +} + +#undef MODULE_CLASS + +/*********************************************************************************************************************** + * ZIBoard * + ***********************************************************************************************************************/ +#define MODULE_CLASS ExtBoardImpl +int32_t ZCanProtocolParser::extboard_read_inio(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(1); + int32_t* ack = (int32_t*)cxt->ackbuf; + cxt->acklen = 4; + return module->extboard_read_inio(cxt->params[0], ack); +} +int32_t ZCanProtocolParser::extboard_write_outio(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(2); + return module->kextboard_write_outio(cxt->params[0], cxt->params[1]); +} + +int32_t ZCanProtocolParser::extboard_read_muti_inio(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(0); + int32_t* ack = (int32_t*)cxt->ackbuf; + cxt->acklen = 4; + return module->extboard_read_muti_inio(ack); +} + +int32_t ZCanProtocolParser::extboard_read_inio_index_in_stm32(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(1); + int32_t* ack = (int32_t*)cxt->ackbuf; + cxt->acklen = 4; + return module->extboard_read_inio_index_in_stm32(cxt->params[0], ack); +} +int32_t ZCanProtocolParser::extboard_read_outio_index_in_stm32(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(1); + int32_t* ack = (int32_t*)cxt->ackbuf; + cxt->acklen = 4; + return module->extboard_read_outio_index_in_stm32(cxt->params[0], ack); +} + +int32_t ZCanProtocolParser::extboard_read_outio(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(1); + int32_t* ack = (int32_t*)cxt->ackbuf; + cxt->acklen = 4; + return module->extboard_read_outio(cxt->params[0], ack); +} + +#undef MODULE_CLASS + +/*********************************************************************************************************************** + * M3078CodeScanner * + ***********************************************************************************************************************/ +#define MODULE_CLASS M3078CodeScanner +int32_t ZCanProtocolParser::code_scaner_start_scan(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(0); + return module->code_scaner_start_scan(); +} + +int32_t ZCanProtocolParser::code_scaner_stop_scan(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(0); + return module->code_scaner_stop_scan(); +} + +int32_t ZCanProtocolParser::code_scaner_result_is_ready(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(0); + int32_t* ack = (int32_t*)cxt->ackbuf; + cxt->acklen = 4; + return module->code_scaner_result_is_ready(&ack[0]); +} + +int32_t ZCanProtocolParser::code_scaner_get_result_length(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(1); + int32_t* ack = (int32_t*)cxt->ackbuf; + cxt->acklen = 4; + return module->code_scaner_get_result_length(&ack[0]); +} + +int32_t ZCanProtocolParser::code_scaner_read_scaner_result(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(0); + cxt->acklen = ZCANCMD_PACKET_MAX_LEN; + int32_t suc = module->code_scaner_read_scaner_result(cxt->ackbuf, &cxt->acklen); + if (suc != 0) { + cxt->acklen = 0; + } + return suc; +} +#undef MODULE_CLASS + +/*********************************************************************************************************************** + * ZIPipetteCtrlModule * + ***********************************************************************************************************************/ + +#define MODULE_CLASS WaterCoolingTemperatureControlModule +int32_t ZCanProtocolParser::temp_controler_start_hearting(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(1); + return module->temp_controler_start_hearting(cxt->params[0]); +} +int32_t ZCanProtocolParser::temp_controler_stop_hearting(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(0); + return module->temp_controler_stop_hearting(); +} +int32_t ZCanProtocolParser::temp_controler_set_peltier_power_level(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(1); + return module->temp_controler_set_peltier_power_level(cxt->params[0]); +} +int32_t ZCanProtocolParser::temp_controler_set_pump_level(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(1); + return module->temp_controler_set_pump_level(cxt->params[0]); +} +int32_t ZCanProtocolParser::temp_controler_set_fan_level(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(1); + return module->temp_controler_set_fan_level(cxt->params[0]); +} +int32_t ZCanProtocolParser::temp_controler_enable_log(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(1); + return module->temp_controler_enable_log(cxt->params[0]); +} +#undef MODULE_CLASS + +#define MODULE_CLASS ZcanFanCtrlModule +int32_t ZCanProtocolParser::fan_controler_set_speed(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(1); + return module->fan_controler_set_speed(cxt->params[0]); +} +#undef MODULE_CLASS + +#define MODULE_CLASS XYRobotCtrlModule +int32_t ZCanProtocolParser::xymotor_enable(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(1); + return module->xymotor_enable(cxt->params[0]); +} + +int32_t ZCanProtocolParser::xymotor_move_by(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(2); + return module->xymotor_move_by(cxt->params[0], cxt->params[1]); +} + +int32_t ZCanProtocolParser::xymotor_move_to(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(2); + return module->xymotor_move_to(cxt->params[0], cxt->params[1]); +} + +int32_t ZCanProtocolParser::xymotor_move_to_zero(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(0); + return module->xymotor_move_to_zero(); +} + +int32_t ZCanProtocolParser::xymotor_read_pos(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(0); + int32_t* ack = (int32_t*)cxt->ackbuf; + cxt->acklen = 8; + return module->xymotor_read_pos(&ack[0], &ack[1]); +} + +int32_t ZCanProtocolParser::xymotor_read_inio(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(1); + int32_t* ack = (int32_t*)cxt->ackbuf; + cxt->acklen = 4; + return module->xymotor_read_inio(cxt->params[0], ack); +} + +int32_t ZCanProtocolParser::xymotor_read_inio_index_in_stm32(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(1); + int32_t* ack = (int32_t*)cxt->ackbuf; + cxt->acklen = 4; + return module->xymotor_read_inio_index_in_stm32(cxt->params[0], ack); +} + +int32_t ZCanProtocolParser::xymotor_set_pos(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(2); + return module->xymotor_set_pos(cxt->params[0], cxt->params[1]); +} + +int32_t ZCanProtocolParser::xymotor_motor_move_by_direct(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(2); + return module->xymotor_motor_move_by_direct(cxt->params[0], cxt->params[1]); +} + +int32_t ZCanProtocolParser::xymotor_read_enc_direct(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(0); + int32_t* ack = (int32_t*)cxt->ackbuf; + cxt->acklen = 8; + return module->xymotor_read_enc_direct(&ack[0], &ack[1]); +} + +#undef MODULE_CLASS + +/*********************************************************************************************************************** + * ZIA8000OpticalModule * + ***********************************************************************************************************************/ + +#define MODULE_CLASS OpticalModuleV2 +int32_t ZCanProtocolParser::a8000_optical_read_raw(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(1); + cxt->acklen = ZCANCMD_PACKET_MAX_LEN; + int32_t suc = module->a8000_optical_read_raw(cxt->params[0], cxt->ackbuf, &cxt->acklen); + if (suc != 0) { + cxt->acklen = 0; + } + return suc; +} + +int32_t ZCanProtocolParser::a8k_opt_v2_t_start_scan(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(3); + return module->a8k_opt_v2_t_start_scan(cxt->params[0], cxt->params[1], cxt->params[2]); +} +int32_t ZCanProtocolParser::a8k_opt_v2_f_start_scan(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(3); + return module->a8k_opt_v2_f_start_scan(cxt->params[0], cxt->params[1], cxt->params[2]); +} +int32_t ZCanProtocolParser::a8k_opt_v2_barcode_start_scan(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(5); + return module->a8k_opt_v2_barcode_start_scan(cxt->params[0], cxt->params[1], cxt->params[2], cxt->params[3], cxt->params[4]); +} + +int32_t ZCanProtocolParser::a8k_opt_v2_t_open_laster(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(2); + return module->a8k_opt_v2_t_open_laster(cxt->params[0], cxt->params[1]); +} +int32_t ZCanProtocolParser::a8k_opt_v2_t_close_laster(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(0); + return module->a8k_opt_v2_t_close_laster(); +} +int32_t ZCanProtocolParser::a8k_opt_v2_t_readVal(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(0); + int32_t* ack = (int32_t*)cxt->ackbuf; + cxt->acklen = 8; + return module->a8k_opt_v2_t_readVal(&ack[0], &ack[1]); +} +int32_t ZCanProtocolParser::a8k_opt_v2_f_open_laster(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(2); + return module->a8k_opt_v2_f_open_laster(cxt->params[0], cxt->params[1]); +} +int32_t ZCanProtocolParser::a8k_opt_v2_f_close_laster(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(0); + return module->a8k_opt_v2_f_close_laster(); +} +int32_t ZCanProtocolParser::a8k_opt_v2_f_readVal(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(0); + int32_t* ack = (int32_t*)cxt->ackbuf; + cxt->acklen = 8; + return module->a8k_opt_v2_f_readVal(&ack[0], &ack[1]); +} + +#undef MODULE_CLASS + +#define MODULE_CLASS EEPROMService +int32_t ZCanProtocolParser::a8000_idcard_reader_read_raw(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(1); + cxt->acklen = ZCANCMD_PACKET_MAX_LEN; + int32_t suc = module->a8000_idcard_reader_read_raw(cxt->params[0], cxt->ackbuf, &cxt->acklen); + if (suc != 0) { + cxt->acklen = 0; + } + return suc; +} + +int32_t ZCanProtocolParser::a8000_idcard_write_raw(cmdcontxt_t* cxt) { + GET_MODULE(); + if (cxt->paramlen <= 4) { + return err::kcmd_param_num_error; + } + return module->a8000_idcard_write_raw(cxt->params[0], &cxt->paramRaw[4], cxt->paramlen - 4); +} + +int32_t ZCanProtocolParser::a8000_idcard_erase(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(0); + return module->a8000_idcard_erase(); +} +int32_t ZCanProtocolParser::a8000_idcard_earse_unlock(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(0); + return module->a8000_idcard_earse_unlock(); +} + +#undef MODULE_CLASS + +#define MODULE_CLASS PlateCodeScanerModule +int32_t ZCanProtocolParser::plate_code_scaner_push_card_and_scan(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(1); + return module->plate_code_scaner_push_card_and_scan(cxt->params[0]); +} + +int32_t ZCanProtocolParser::plate_code_scaner_stop_scan(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(0); + return module->plate_code_scaner_stop_scan(); +} + +int32_t ZCanProtocolParser::plate_code_scaner_read_result(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(1); + cxt->acklen = ZCANCMD_PACKET_MAX_LEN; + int32_t suc = module->plate_code_scaner_read_result(cxt->params[0], cxt->ackbuf, &cxt->acklen); + if (suc != 0) { + cxt->acklen = 0; + } + return suc; +} + +int32_t ZCanProtocolParser::plate_code_scaner_read_result_point_num(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(0); + int32_t* ack = (int32_t*)cxt->ackbuf; + cxt->acklen = 4; + return module->plate_code_scaner_read_result_point_num(&ack[0]); +} + +int32_t ZCanProtocolParser::plate_code_scaner_read_code(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(0); + cxt->acklen = 4 * 4; + return module->plate_code_scaner_read_code(&cxt->params[0], &cxt->params[1], &cxt->params[2], &cxt->params[3]); +} + +int32_t ZCanProtocolParser::plate_code_scaner_adc_readraw(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(0); + int32_t* ack = (int32_t*)cxt->ackbuf; + cxt->acklen = 4; + return module->plate_code_scaner_adc_readraw(&ack[0]); +} + +int32_t ZCanProtocolParser::plate_code_scaner_open_laser(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(0); + return module->plate_code_scaner_open_laser(); +} + +int32_t ZCanProtocolParser::plate_code_scaner_close_laser(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(0); + return module->plate_code_scaner_close_laser(); +} + +#undef MODULE_CLASS + +/*********************************************************************************************************************** + * PipetteModuleV2 * + ***********************************************************************************************************************/ +#define MODULE_CLASS PipetteModuleV2 +int32_t ZCanProtocolParser::pipette_zmotor_enable(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(1); + return module->pipette_zmotor_enable(cxt->params[0]); +} +int32_t ZCanProtocolParser::pipette_zmotor_move_zero(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(0); + return module->pipette_zmotor_move_zero(); +} +int32_t ZCanProtocolParser::pipette_zmotor_move_to_zero_point_quick(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(0); + return module->pipette_zmotor_move_to_zero_point_quick(); +} +int32_t ZCanProtocolParser::pipette_zmotor_measure_distance(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(0); + return module->pipette_zmotor_measure_distance(); +} +int32_t ZCanProtocolParser::pipette_zmotor_read_measure_distance_result(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(0); + int32_t* ack = (int32_t*)cxt->ackbuf; + cxt->acklen = 4; + return module->pipette_zmotor_read_measure_distance_result(&ack[0]); +} +int32_t ZCanProtocolParser::pipette_zmotor_move_by(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(1); + return module->pipette_zmotor_move_by(cxt->params[0]); +} +int32_t ZCanProtocolParser::pipette_zmotor_move_to(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(1); + return module->pipette_zmotor_move_to(cxt->params[0]); +} + +int32_t ZCanProtocolParser::liquid_operation_clear_params(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(0); + return module->liquid_operation_clear_params(); +} + +int32_t ZCanProtocolParser::liquid_operation_set_gun_runparams(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(5); + return module->liquid_operation_set_gun_runparams(cxt->params[0], cxt->params[1], cxt->params[2], cxt->params[3], cxt->params[4]); +} + +int32_t ZCanProtocolParser::liquid_operation_set_zmotor_runparams(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(3); + return module->liquid_operation_set_zmotor_runparams(cxt->params[0], cxt->params[1], cxt->params[2]); +} + +int32_t ZCanProtocolParser::liquid_operation_enable_lld_record(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(0); + return module->liquid_operation_enable_lld_record(); +} + +int32_t ZCanProtocolParser::liquid_operation_fresh_params(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(0); + return module->liquid_operation_fresh_params(); +} + +int32_t ZCanProtocolParser::pipette_init_device(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(0); + return module->pipette_init_device(); +} +int32_t ZCanProtocolParser::pipette_put_tip(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(0); + return module->pipette_put_tip(); +} +int32_t ZCanProtocolParser::pipette_pump_move_to(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(1); + return module->pipette_pump_move_to(cxt->params[0]); +} +int32_t ZCanProtocolParser::pipette_lld(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(3); + return module->pipette_lld(cxt->params[0], cxt->params[1], cxt->params[2]); +} +int32_t ZCanProtocolParser::pipette_aspirate(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(1); + return module->pipette_aspirate(cxt->params[0]); +} +int32_t ZCanProtocolParser::pipette_distribu(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(1); + return module->pipette_distribu(cxt->params[0]); +} +int32_t ZCanProtocolParser::pipette_shake_up(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(2); + return module->pipette_shake_up(cxt->params[0], cxt->params[1]); +} + +/*********************************************************************************************************************** + * READ STASTE * + ***********************************************************************************************************************/ +int32_t ZCanProtocolParser::pipette_get_sensor_sample_data(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(1); + int32_t* ack = (int32_t*)cxt->ackbuf; + cxt->acklen = 12; + return module->pipette_get_sensor_sample_data(cxt->params[0], &ack[0], &ack[1], &ack[2]); +} +int32_t ZCanProtocolParser::pipette_get_sensor_sample_data_num(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(0); + int32_t* ack = (int32_t*)cxt->ackbuf; + cxt->acklen = 4; + return module->pipette_get_sensor_sample_data_num(&ack[0]); +} +int32_t ZCanProtocolParser::pipette_zmotor_read_zero_point_state(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(0); + int32_t* ack = (int32_t*)cxt->ackbuf; + cxt->acklen = 4; + return module->pipette_zmotor_read_zero_point_state(&ack[0]); +} +int32_t ZCanProtocolParser::pipette_zmotor_read_dev_status_cache(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(0); + int32_t* ack = (int32_t*)cxt->ackbuf; + cxt->acklen = 4; + return module->pipette_zmotor_read_dev_status_cache(&ack[0]); +} +int32_t ZCanProtocolParser::pipette_clear_hanging_liquid(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(1); + return module->pipette_clear_hanging_liquid(cxt->params[0]); +} + +int32_t ZCanProtocolParser::pipette_lld_is_detect_liquid(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(0); + int32_t* ack = (int32_t*)cxt->ackbuf; + cxt->acklen = 4; + return module->pipette_lld_is_detect_liquid(&ack[0]); +} + +#undef MODULE_CLASS diff --git a/sdk/components/zcan_protocol_parser/zcan_protocol_parser.hpp b/sdk/components/zcan_protocol_parser/zcan_protocol_parser.hpp new file mode 100644 index 0000000..ae25421 --- /dev/null +++ b/sdk/components/zcan_protocol_parser/zcan_protocol_parser.hpp @@ -0,0 +1,195 @@ +#pragma once +#include + +#include "a8000_protocol\protocol.hpp" +#include "sdk\components\api\zi_module.hpp" +#include "sdk\components\zcancmder\zcanreceiver.hpp" + +#define CMDFN(name) static int32_t name(cmdcontxt_t* cxt) +#define CMDFN_IMPL(name) int32_t ZCanProtocolParser::name(cmdcontxt_t* cxt) + +namespace iflytop { +class ZCanProtocolParser : public IZCanRxProcesser { + public: + typedef struct { + ZIModule* module; + zcr_cmd_header_t* rxcmd; + int32_t cmdid; + int32_t* params; + uint8_t* paramRaw; + int32_t paramlen; + int32_t acklen; + uint8_t* ackbuf; + } cmdcontxt_t; + + typedef int32_t (*cmdcb_t)(cmdcontxt_t* cxt); + + typedef struct { + int32_t cmdid; + cmdcb_t cb; + } cmdfn_t; + + private: + ZCanReceiver* m_cancmder = nullptr; + map m_modulers; + + uint8_t ackbuf[ZCANCMD_PACKET_MAX_LEN + 10]; + int32_t acklen = 0; + + cmdfn_t cmdfnlist[200]; + int32_t cmdfnNum = 0; + + public: + void initialize(ZCanReceiver* cancmder); + virtual bool filterPacket(ZcanRxframe* rxframe); + virtual void processRxPacket(ZcanRxframe* rxframe); + void registerModule(ZIModule* module); + ZIModule* getModule(int id) { return m_modulers[id]; } + + private: + void _registerModule(uint16_t id, ZIModule* module); + void _processRxPacket(ZIModule* module, zcr_cmd_header_t* rxcmd, int32_t len); + void regCmdFn(int32_t cmdid, cmdcb_t cb); + cmdfn_t* findcmdfn(int32_t cmdid); + + private: + CMDFN(module_ping); + CMDFN(module_get_status); + CMDFN(module_set_reg); + CMDFN(module_get_reg); + CMDFN(module_get_error); + CMDFN(module_clear_error); + CMDFN(module_stop); + CMDFN(module_active_cfg); + CMDFN(module_reset_reg); + + CMDFN(step_motor_enable); + CMDFN(step_motor_stop); + CMDFN(step_motor_read_pos); + CMDFN(step_motor_read_enc_pos); + CMDFN(step_motor_easy_rotate); + CMDFN(step_motor_easy_move_by); + CMDFN(step_motor_easy_move_to); + CMDFN(step_motor_easy_move_to_zero); + CMDFN(step_motor_easy_set_current_pos); + CMDFN(step_motor_easy_move_to_io); + CMDFN(step_motor_active_cfg); + CMDFN(step_motor_read_io_state); + CMDFN(step_motor_easy_move_to_end_point); + CMDFN(step_motor_read_tmc5130_status); + CMDFN(step_motor_read_tmc5130_state); + CMDFN(step_motor_read_io_index_in_stm32); + CMDFN(step_motor_set_subdevice_reg); + CMDFN(step_motor_get_subdevice_reg); + CMDFN(step_motor_easy_reciprocating_motion); + CMDFN(step_motor_easy_move_to_zero_point_quick); + + CMDFN(mini_servo_enable); + CMDFN(mini_servo_read_pos); + CMDFN(mini_servo_active_cfg); + CMDFN(mini_servo_stop); + CMDFN(mini_servo_set_mid_point); + CMDFN(mini_servo_read_io_state); + CMDFN(mini_servo_set_cur_pos); + + CMDFN(mini_servo_move_to); + CMDFN(mini_servo_rotate); + CMDFN(mini_servo_rotate_with_torque); + + CMDFN(extboard_read_inio); + CMDFN(extboard_write_outio); + CMDFN(extboard_read_muti_inio); + CMDFN(extboard_read_inio_index_in_stm32); + CMDFN(extboard_read_outio_index_in_stm32); + CMDFN(extboard_read_outio); + + CMDFN(code_scaner_start_scan); + CMDFN(code_scaner_stop_scan); + CMDFN(code_scaner_result_is_ready); + CMDFN(code_scaner_get_result_length); + CMDFN(code_scaner_read_scaner_result); + + CMDFN(temp_controler_start_hearting); + CMDFN(temp_controler_stop_hearting); + CMDFN(temp_controler_set_peltier_power_level); + CMDFN(temp_controler_set_pump_level); + CMDFN(temp_controler_set_fan_level); + CMDFN(temp_controler_enable_log); + + /*********************************************************************************************************************** + * 风扇控制 * + ***********************************************************************************************************************/ + CMDFN(fan_controler_set_speed); + CMDFN(xymotor_enable); + CMDFN(xymotor_move_by); + CMDFN(xymotor_move_to); + CMDFN(xymotor_move_to_zero); + CMDFN(xymotor_read_pos); + CMDFN(xymotor_read_inio); + CMDFN(xymotor_read_inio_index_in_stm32); + CMDFN(xymotor_set_pos); + CMDFN(xymotor_motor_move_by_direct); + CMDFN(xymotor_read_enc_direct); + +#if 1 + // CMDFN(a8000_optical_module_power_ctrl); + + CMDFN(a8000_optical_read_raw); + + CMDFN(a8k_opt_v2_t_start_scan); + CMDFN(a8k_opt_v2_f_start_scan); + CMDFN(a8k_opt_v2_t_open_laster); + CMDFN(a8k_opt_v2_t_close_laster); + CMDFN(a8k_opt_v2_t_readVal); + CMDFN(a8k_opt_v2_f_open_laster); + CMDFN(a8k_opt_v2_f_close_laster); + CMDFN(a8k_opt_v2_f_readVal); + CMDFN(a8k_opt_v2_barcode_start_scan); + +#endif + + CMDFN(a8000_idcard_reader_read_raw); + CMDFN(a8000_idcard_write_raw); + CMDFN(a8000_idcard_erase); + CMDFN(a8000_idcard_earse_unlock); + + CMDFN(plate_code_scaner_push_card_and_scan); + CMDFN(plate_code_scaner_stop_scan); + CMDFN(plate_code_scaner_read_result); + CMDFN(plate_code_scaner_read_result_point_num); + CMDFN(plate_code_scaner_read_code); + CMDFN(plate_code_scaner_adc_readraw); + CMDFN(plate_code_scaner_open_laser); + CMDFN(plate_code_scaner_close_laser); + // + + CMDFN(pipette_zmotor_enable); + CMDFN(pipette_zmotor_move_zero); + CMDFN(pipette_zmotor_move_to_zero_point_quick); + CMDFN(pipette_zmotor_measure_distance); + CMDFN(pipette_zmotor_read_measure_distance_result); + CMDFN(pipette_zmotor_move_by); + CMDFN(pipette_zmotor_move_to); + + CMDFN(liquid_operation_clear_params); + CMDFN(liquid_operation_set_gun_runparams); + CMDFN(liquid_operation_set_zmotor_runparams); + CMDFN(liquid_operation_enable_lld_record); + CMDFN(liquid_operation_fresh_params); + + CMDFN(pipette_init_device); + CMDFN(pipette_put_tip); + CMDFN(pipette_pump_move_to); + CMDFN(pipette_lld); + CMDFN(pipette_aspirate); + CMDFN(pipette_distribu); + CMDFN(pipette_shake_up); + CMDFN(pipette_clear_hanging_liquid); + CMDFN(pipette_lld_is_detect_liquid); + CMDFN(pipette_get_sensor_sample_data); + CMDFN(pipette_get_sensor_sample_data_num); + CMDFN(pipette_zmotor_read_zero_point_state); + CMDFN(pipette_zmotor_read_dev_status_cache); +}; + +} // namespace iflytop \ No newline at end of file diff --git a/sdk/components/zcancmder/basic.cpp b/sdk/components/zcancmder/basic.cpp deleted file mode 100644 index e69de29..0000000 diff --git a/sdk/components/zcancmder/basic.hpp b/sdk/components/zcancmder/basic.hpp deleted file mode 100644 index 94b0b0f..0000000 --- a/sdk/components/zcancmder/basic.hpp +++ /dev/null @@ -1,7 +0,0 @@ -// -// Created by zwsd -// - -#pragma once -#include "a8000_protocol\protocol.hpp" -#include "sdk/os/zos.hpp" diff --git a/sdk/components/zcancmder/protocol_event_bus_sender.hpp b/sdk/components/zcancmder/protocol_event_bus_sender.hpp index 28494b5..c9e8f70 100644 --- a/sdk/components/zcancmder/protocol_event_bus_sender.hpp +++ b/sdk/components/zcancmder/protocol_event_bus_sender.hpp @@ -1,7 +1,6 @@ #pragma once #include "a8000_protocol\protocol.hpp" -#include "basic.hpp" #include "sdk/os/zos.hpp" #include "sdk\components\zcancmder\zcanreceiver.hpp" #include "sdk\components\api\zi_module.hpp" diff --git a/sdk/components/zcancmder/type/zcan_rx_frame.hpp b/sdk/components/zcancmder/type/zcan_rx_frame.hpp new file mode 100644 index 0000000..75ff0a1 --- /dev/null +++ b/sdk/components/zcancmder/type/zcan_rx_frame.hpp @@ -0,0 +1,24 @@ +// +// Created by zwsd +// + +#pragma once +#include "sdk/os/zos.hpp" + +#ifdef HAL_CAN_MODULE_ENABLED +namespace iflytop { + +class ZcanRxframe { + public: + uint8_t rxdata[128]; + int rxdataLen = 0; + + uint8_t canPacketNum = 0; + uint8_t npacket = 0; + + void* cxt = nullptr; + bool isUsed = false; +}; + +} // namespace iflytop +#endif diff --git a/sdk/components/zcancmder/type/zcan_rx_frame_pool.hpp b/sdk/components/zcancmder/type/zcan_rx_frame_pool.hpp new file mode 100644 index 0000000..c39229e --- /dev/null +++ b/sdk/components/zcancmder/type/zcan_rx_frame_pool.hpp @@ -0,0 +1,40 @@ +// +// Created by zwsd +// + +#pragma once +#include "zcan_rx_frame.hpp" + +#ifdef HAL_CAN_MODULE_ENABLED +namespace iflytop { + +class ZcanRxframePool { + public: + ZcanRxframe buf[3]; + + void init() {} + + ZcanRxframe* alloc() { + for (int i = 0; i < 3; i++) { + if (!buf[i].isUsed) { + buf[i].isUsed = true; + return &buf[i]; + } + } + return NULL; + } + + void free(ZcanRxframe** ppframe) { + ZcanRxframe* frame = *ppframe; + if (frame == NULL) return; + frame->isUsed = false; + frame->rxdataLen = 0; + frame->canPacketNum = 0; + frame->npacket = 0; + frame->cxt = NULL; + *ppframe = NULL; + } +}; + +} // namespace iflytop +#endif diff --git a/sdk/components/zcancmder/type/zcan_rx_frame_queue.hpp b/sdk/components/zcancmder/type/zcan_rx_frame_queue.hpp new file mode 100644 index 0000000..c7df820 --- /dev/null +++ b/sdk/components/zcancmder/type/zcan_rx_frame_queue.hpp @@ -0,0 +1,31 @@ +// +// Created by zwsd +// + +#pragma once +#include "sdk/os/zos.hpp" +#include "zcan_rx_frame.hpp" + +#ifdef HAL_CAN_MODULE_ENABLED +namespace iflytop { + +class ZcanRxframeQueue { + uint8_t queueStorage[4 * sizeof(void*)] = {0}; + + QueueHandle_t handler = nullptr; + StaticQueue_t xQueueBuffer; + + public: + void init() { handler = xQueueCreateStatic(4, sizeof(void*), queueStorage, &xQueueBuffer); } + + void sendIRQ(ZcanRxframe* frame) { xQueueSendFromISR(handler, &frame, NULL); } + + ZcanRxframe* receive() { + ZcanRxframe* frame = NULL; + xQueueReceive(handler, &frame, 0); + return frame; + } +}; + +} // namespace iflytop +#endif diff --git a/sdk/components/zcancmder/zcan_board_module.cpp b/sdk/components/zcancmder/zcan_board_module.cpp deleted file mode 100644 index 53b1bf2..0000000 --- a/sdk/components/zcancmder/zcan_board_module.cpp +++ /dev/null @@ -1,149 +0,0 @@ -#include "zcan_board_module.hpp" - -using namespace iflytop; -using namespace std; -void ZCanBoardModule::initialize(int32_t moduleId, hardware_config_t *hcfg) { - module_id = moduleId; - m_cfg = *hcfg; - - for (int i = 0; i < ZARRAY_SIZE(hcfg->input); i++) { - if (hcfg->input[i].pin == PinNull) { - break; - } - ZGPIO::InputGpioCfg_t *cfg = &hcfg->input[i]; - m_input[i].initAsInput(cfg->pin, cfg->mode, cfg->irqtype, cfg->mirror); - m_input_num++; - } - - for (int i = 0; i < ZARRAY_SIZE(hcfg->output); i++) { - if (hcfg->output[i].pin == PinNull) { - break; - } - ZGPIO::OutputGpioCfg_t *cfg = &hcfg->output[i]; - m_output[i].initAsOutput(cfg->pin, cfg->mode, cfg->mirror, cfg->initLevel); - m_output_num++; - } - - -} -int32_t ZCanBoardModule::getid(int32_t *id) { - *id = module_id; - return 0; -}; -// int32_t ZCanBoardModule::module_readio(int32_t *io) { -// *io = readinput(); -// return 0; -// }; -// int32_t ZCanBoardModule::module_writeio(int32_t idindex, int32_t io) { -// if (idindex < 0 || idindex >= ZARRAY_SIZE(m_output)) { -// return err::kparam_out_of_range; -// } -// m_output[idindex].setState(io); -// return 0; -// }; - -int32_t ZCanBoardModule::module_xxx_reg(int32_t param_id, bool read, int32_t &val) { - switch (param_id) { - PROCESS_REG(kreg_module_version, /* */ REG_GET(0x0001), ACTION_NONE); - PROCESS_REG(kreg_module_type, /* */ REG_GET(0), ACTION_NONE); - default: - return err::kmodule_not_find_reg; - break; - } - return 0; -} - -int32_t ZCanBoardModule::module_get_status(int32_t *status) { - *status = 0; - return 0; -} - -int32_t ZCanBoardModule::module_set_reg(int32_t param_id, int32_t param_value) { return module_xxx_reg(param_id, false, param_value); } -int32_t ZCanBoardModule::module_get_reg(int32_t param_id, int32_t *param_value) { return module_xxx_reg(param_id, true, *param_value); } - -int32_t ZCanBoardModule::readinput() { - int32_t inputval = 0; - for (int i = 0; i < m_input_num; i++) { - if (m_input[i].getStateUint32()) { - inputval |= (1 << i); - } - } - return inputval; -} -int32_t ZCanBoardModule::readoutput() { - int32_t outputval = 0; - for (int i = 0; i < m_output_num; i++) { - if (m_output[i].getStateUint32()) { - outputval |= (1 << i); - } - } - return outputval; -} - -int32_t ZCanBoardModule::readTemperature(int32_t sensorId, int32_t &temperature_val) { - if (sensorId < 0 || sensorId >= ZARRAY_SIZE(m_cfg.temperature_sensor)) { - return err::kmodule_not_find_reg; - } - - if (m_cfg.temperature_sensor[sensorId] == nullptr) { - return err::kmodule_not_find_reg; - } - return m_cfg.temperature_sensor[sensorId]->getTemperature(temperature_val); -} - -int32_t ZCanBoardModule::setPwmState(int32_t pwmId, int32_t state) { - if (pwmId < 0 || pwmId >= ZARRAY_SIZE(m_cfg.pwmctrl)) { - return err::kmodule_not_find_reg; - } - if (m_cfg.pwmctrl[pwmId] == nullptr) { - return err::kmodule_not_find_reg; - } - return m_cfg.pwmctrl[pwmId]->pwm_set_state(state); -} -int32_t ZCanBoardModule::getPwmState(int32_t pwmId, int32_t &state) { - if (pwmId < 0 || pwmId >= ZARRAY_SIZE(m_cfg.pwmctrl)) { - return err::kmodule_not_find_reg; - } - if (m_cfg.pwmctrl[pwmId] == nullptr) { - return err::kmodule_not_find_reg; - } - return m_cfg.pwmctrl[pwmId]->pwm_get_state(state); -} - -int32_t ZCanBoardModule::readPwmDuty(int32_t pwmId, int32_t &duty) { - if (pwmId < 0 || pwmId >= ZARRAY_SIZE(m_cfg.pwmctrl)) { - return err::kmodule_not_find_reg; - } - if (m_cfg.pwmctrl[pwmId] == nullptr) { - return err::kmodule_not_find_reg; - } - return m_cfg.pwmctrl[pwmId]->get_pwm_duty(duty); -} -int32_t ZCanBoardModule::setPwmDuty(int32_t pwmId, int32_t duty) { - if (pwmId < 0 || pwmId >= ZARRAY_SIZE(m_cfg.pwmctrl)) { - return err::kmodule_not_find_reg; - } - if (m_cfg.pwmctrl[pwmId] == nullptr) { - return err::kmodule_not_find_reg; - } - return m_cfg.pwmctrl[pwmId]->set_pwm_duty(duty); -} - -int32_t ZCanBoardModule::readPwmFreq(int32_t pwmId, int32_t &freq) { - if (pwmId < 0 || pwmId >= ZARRAY_SIZE(m_cfg.pwmctrl)) { - return err::kmodule_not_find_reg; - } - if (m_cfg.pwmctrl[pwmId] == nullptr) { - return err::kmodule_not_find_reg; - } - return m_cfg.pwmctrl[pwmId]->get_pwm_freq(freq); -} -int32_t ZCanBoardModule::setPwmFreq(int32_t pwmId, int32_t freq) { - if (pwmId < 0 || pwmId >= ZARRAY_SIZE(m_cfg.pwmctrl)) { - return err::kmodule_not_find_reg; - } - if (m_cfg.pwmctrl[pwmId] == nullptr) { - return err::kmodule_not_find_reg; - } - return m_cfg.pwmctrl[pwmId]->set_pwm_freq(freq); -} \ No newline at end of file diff --git a/sdk/components/zcancmder/zcan_board_module.hpp b/sdk/components/zcancmder/zcan_board_module.hpp deleted file mode 100644 index c5de8ac..0000000 --- a/sdk/components/zcancmder/zcan_board_module.hpp +++ /dev/null @@ -1,82 +0,0 @@ -// -// Created by zwsd -// - -#pragma once -#include "sdk/os/zos.hpp" -// -#include "a8000_protocol\protocol.hpp" -#include "sdk/chip/api/zi_api.hpp" -#include "sdk/chip/api/zi_temperature.hpp" -#include "sdk\chip\api\zi_adc.hpp" -#include "sdk\components\api\zi_module.hpp" - -/** - * @brief - * - * service: M3078 - * - * 监听事件: - * 依赖状态: - * 依赖服务: - * 作用: - * - * 推荐配置: - * 1. 识读模式:按键保持 - * 2. 波特率:9600 - * 3. 单次扫码时长:无限时 - * - */ - -namespace iflytop { -using namespace std; - -class ZCanBoardModule : public ZIModule { - public: - typedef struct { - ZGPIO::InputGpioCfg_t input[32]; - ZGPIO::OutputGpioCfg_t output[32]; - ZITemperature *temperature_sensor[8]; - ZIPWMCtrl *pwmctrl[8]; - } hardware_config_t; - - hardware_config_t m_cfg; - int32_t module_id; - - ZGPIO m_input[32]; - ZGPIO m_output[32]; - - int32_t m_input_num = 0; - int32_t m_output_num = 0; - - public: - virtual ~ZCanBoardModule() {} - - void initialize(int32_t moduleId, hardware_config_t *cfg); - virtual int32_t getid(int32_t *id) override; - // virtual int32_t module_readio(int32_t *io) override; - // virtual int32_t module_writeio(int32_t idindex, int32_t io) override; - - virtual int32_t module_set_reg(int32_t param_id, int32_t param_value); - virtual int32_t module_get_reg(int32_t param_id, int32_t *param_value); - virtual int32_t module_reset_reg() override { return 0; }; - - virtual int32_t module_get_status(int32_t *status); - - private: - int32_t module_xxx_reg(int32_t param_id, bool read, int32_t ¶m_value); - int32_t readinput(); - int32_t readoutput(); - int32_t readTemperature(int32_t sensorId, int32_t &temperature_val); - - int32_t readPwmDuty(int32_t pwmId, int32_t &duty); - int32_t setPwmDuty(int32_t pwmId, int32_t duty); - - int32_t readPwmFreq(int32_t pwmId, int32_t &freq); - int32_t setPwmFreq(int32_t pwmId, int32_t freq); - - int32_t setPwmState(int32_t pwmId, int32_t state); - int32_t getPwmState(int32_t pwmId, int32_t &state); -}; - -} // namespace iflytop diff --git a/sdk/components/zcancmder/zcan_protocol_parser.cpp b/sdk/components/zcancmder/zcan_protocol_parser.cpp deleted file mode 100644 index a8cc447..0000000 --- a/sdk/components/zcancmder/zcan_protocol_parser.cpp +++ /dev/null @@ -1,951 +0,0 @@ -#include "zcan_protocol_parser.hpp" - -#include -#include - -// -#include "public_service\ext_board_impl.hpp" -#include "sdk\components\mini_servo_motor\mini_servo_motor_ctrl_module.hpp" -#include "sdk\components\pipette_module\pipette_ctrl_module_v2.hpp" -#include "sdk\components\sensors\m3078\m3078_code_scaner.hpp" -#include "sdk\components\step_motor_ctrl_module\step_motor_ctrl_module.hpp" -#include "sdk\components\water_cooling_temperature_control_module\water_cooling_temperature_control_module.hpp" -#include "sdk\components\xy_robot_ctrl_module\xy_robot_ctrl_module.hpp" -#include "subboards\subboard40_and_50_temperature_ctrl\zcan_fan_ctrl_module.hpp" -#include "subboards\subboard90_optical_module\optical_module_v2.hpp" -#include "usrc\subboards\subboard100_idcard_reader\eeprom_service.hpp" -#include "usrc\subboards\subboard20_plate_clamp_case\plate_code_scaner_module.hpp" -// - -#include "sdk/os/zos.hpp" - -using namespace iflytop; -using namespace std; -#define TAG "PROTO" - -#define REGFN(fn) regCmdFn(k##fn, fn); - -static const char* hex2str(const char* hex, size_t len) { - static char buf[256]; - memset(buf, 0, sizeof(buf)); - for (size_t i = 0; i < len; i++) { - sprintf(buf + i * 2, "%02X", hex[i]); - } - return buf; -} - -void ZCanProtocolParser::initialize(ZCanReceiver* cancmder) { - m_cancmder = cancmder; - m_cancmder->registerListener(this); - - REGFN(module_ping); - REGFN(module_get_status); - REGFN(module_set_reg); - REGFN(module_get_reg); - REGFN(module_get_error); - REGFN(module_clear_error); - REGFN(module_stop); - REGFN(module_reset_reg); - - REGFN(step_motor_enable); - REGFN(step_motor_read_pos); - REGFN(step_motor_read_enc_pos); - REGFN(step_motor_easy_rotate); - REGFN(step_motor_easy_move_by); - REGFN(step_motor_easy_move_to); - REGFN(step_motor_easy_move_to_zero); - REGFN(step_motor_easy_set_current_pos); - REGFN(step_motor_easy_move_to_io); - REGFN(step_motor_active_cfg); - REGFN(step_motor_stop); - REGFN(step_motor_read_io_state); - REGFN(step_motor_easy_move_to_end_point); - REGFN(step_motor_easy_reciprocating_motion); - - REGFN(step_motor_read_tmc5130_status); - REGFN(step_motor_read_tmc5130_state); - REGFN(step_motor_read_io_index_in_stm32); - REGFN(step_motor_set_subdevice_reg); - REGFN(step_motor_get_subdevice_reg); - REGFN(step_motor_easy_move_to_zero_point_quick); - - REGFN(mini_servo_enable); - REGFN(mini_servo_read_pos); - REGFN(mini_servo_active_cfg); - REGFN(mini_servo_stop); - REGFN(mini_servo_set_mid_point); - REGFN(mini_servo_read_io_state); - - REGFN(mini_servo_move_to); - REGFN(mini_servo_rotate); - REGFN(mini_servo_rotate_with_torque); - REGFN(mini_servo_set_cur_pos); - - REGFN(extboard_read_inio); - REGFN(extboard_write_outio); - REGFN(extboard_read_muti_inio); - REGFN(extboard_read_inio_index_in_stm32); - REGFN(extboard_read_outio_index_in_stm32); - REGFN(extboard_read_outio); - - REGFN(code_scaner_start_scan); - REGFN(code_scaner_stop_scan); - REGFN(code_scaner_result_is_ready); - REGFN(code_scaner_get_result_length); - REGFN(code_scaner_read_scaner_result); - - REGFN(temp_controler_start_hearting); - REGFN(temp_controler_stop_hearting); - REGFN(temp_controler_set_peltier_power_level); - REGFN(temp_controler_set_pump_level); - REGFN(temp_controler_set_fan_level); - REGFN(temp_controler_enable_log); - - REGFN(fan_controler_set_speed); - REGFN(xymotor_enable); - REGFN(xymotor_move_by); - REGFN(xymotor_move_to); - REGFN(xymotor_move_to_zero); - REGFN(xymotor_read_pos); - REGFN(xymotor_read_inio); - REGFN(xymotor_read_inio_index_in_stm32); - REGFN(xymotor_set_pos); - REGFN(xymotor_motor_move_by_direct); - REGFN(xymotor_read_enc_direct); - -#if 1 - REGFN(a8000_optical_read_raw); - - REGFN(a8k_opt_v2_t_start_scan); - REGFN(a8k_opt_v2_f_start_scan); - REGFN(a8k_opt_v2_t_open_laster); - REGFN(a8k_opt_v2_t_close_laster); - REGFN(a8k_opt_v2_t_readVal); - REGFN(a8k_opt_v2_f_open_laster); - REGFN(a8k_opt_v2_f_close_laster); - REGFN(a8k_opt_v2_f_readVal); - REGFN(a8k_opt_v2_barcode_start_scan); - -#endif - - REGFN(a8000_idcard_reader_read_raw); - REGFN(a8000_idcard_write_raw); - REGFN(a8000_idcard_erase); - REGFN(a8000_idcard_earse_unlock); - - REGFN(plate_code_scaner_push_card_and_scan); - REGFN(plate_code_scaner_stop_scan); - REGFN(plate_code_scaner_read_result); - REGFN(plate_code_scaner_read_result_point_num); - REGFN(plate_code_scaner_read_code); - REGFN(plate_code_scaner_adc_readraw); - REGFN(plate_code_scaner_open_laser); - REGFN(plate_code_scaner_close_laser); - - REGFN(pipette_zmotor_enable); - REGFN(pipette_zmotor_move_zero); - REGFN(pipette_zmotor_move_to_zero_point_quick); - REGFN(pipette_zmotor_measure_distance); - REGFN(pipette_zmotor_read_measure_distance_result); - REGFN(pipette_zmotor_move_by); - REGFN(pipette_zmotor_move_to); - - REGFN(liquid_operation_clear_params); - REGFN(liquid_operation_set_gun_runparams); - REGFN(liquid_operation_set_zmotor_runparams); - REGFN(liquid_operation_enable_lld_record); - REGFN(liquid_operation_fresh_params); - - REGFN(pipette_init_device); - REGFN(pipette_put_tip); - REGFN(pipette_pump_move_to); - REGFN(pipette_lld); - REGFN(pipette_aspirate); - REGFN(pipette_distribu); - REGFN(pipette_shake_up); - REGFN(pipette_clear_hanging_liquid) - REGFN(pipette_lld_is_detect_liquid); - REGFN(pipette_get_sensor_sample_data); - REGFN(pipette_get_sensor_sample_data_num); - REGFN(pipette_zmotor_read_zero_point_state); - REGFN(pipette_zmotor_read_dev_status_cache); -} -void ZCanProtocolParser::_registerModule(uint16_t id, ZIModule* module) { m_modulers[id] = module; } -void ZCanProtocolParser::registerModule(ZIModule* module) { - int32_t moduleid = 0; - module->getid(&moduleid); - uint16_t id = moduleid; - _registerModule(id, module); -} - -void ZCanProtocolParser::onRceivePacket(zcr_cmd_header_t* rxcmd, int32_t len) { - // printf("onRceivePacket cmdid:%d moduleid:%d\n", rxcmd->cmdid, rxcmd->moduleId); - uint16_t moduleid = rxcmd->moduleId; - auto it = m_modulers.find(moduleid); - if (it == m_modulers.end()) { - return; - } - - // ZLOGI(TAG, "rx(index:%d) cmdid:%d moduleid:%d", rxcmd->index,rxcmd->cmdid, moduleid); - - ZIModule* module = it->second; - int32_t cmdid = rxcmd->cmdid; - _onRceivePacket(module, rxcmd, len); -} - -void ZCanProtocolParser::regCmdFn(int32_t cmdid, cmdcb_t cb) { - cmdfnlist[cmdfnNum].cmdid = cmdid; - cmdfnlist[cmdfnNum].cb = cb; - cmdfnNum++; -} -ZCanProtocolParser::cmdfn_t* ZCanProtocolParser::findcmdfn(int32_t cmdid) { - for (int i = 0; i < cmdfnNum; i++) { - if (cmdfnlist[i].cmdid == cmdid) { - return &cmdfnlist[i]; - } - } - return nullptr; -} - -static bool checkpacket(const zcr_cmd_header_t* header, int len) { - if (len < sizeof(zcr_cmd_header_t)) { - return false; - } - if ((header->datalen + sizeof(zcr_cmd_header_t) + 1) != len) { - return false; - } - - uint8_t* rawpacket = (uint8_t*)header; - uint8_t checksum = 0; - for (int i = 0; i < len - 1; i++) { - checksum += rawpacket[i]; - } - - if (checksum != rawpacket[len - 1]) { - return false; - } - - return true; -} - -void ZCanProtocolParser::_onRceivePacket(ZIModule* module, zcr_cmd_header_t* rxcmd, int32_t len) { - int paramNum = (len) / sizeof(int32_t); - int32_t* ack = (int32_t*)&ackbuf[0]; - - cmdfn_t* fn = findcmdfn(rxcmd->cmdid); - if (!fn) { - ZLOGE(TAG, "cmd not support:%d,rx:%s", rxcmd->cmdid, hex2str((const char*)rxcmd, len)); - m_cancmder->sendErrorAck(rxcmd, err::kcmd_not_support); - return; - } - - if (!checkpacket(rxcmd, len)) { - ZLOGE(TAG, "check sum error,rx:%s(%d)", hex2str((const char*)rxcmd, len), len); - m_cancmder->sendErrorAck(rxcmd, err::kcheck_sum_error); - return; - } - - cmdcontxt_t cxt = {0}; - cxt.module = module; - cxt.rxcmd = rxcmd; - cxt.cmdid = rxcmd->cmdid; - cxt.params = (int32_t*)rxcmd->data; - cxt.paramRaw = rxcmd->data; - cxt.paramlen = rxcmd->datalen; - cxt.acklen = 0; - cxt.ackbuf = ackbuf; - - memset(ackbuf, 0, sizeof(ackbuf)); - int32_t ecode = module->bfcall(cxt.cmdid, cxt.paramRaw, cxt.paramlen); - if (ecode == 0) ecode = fn->cb(&cxt); - module->aftercall(cxt.cmdid, cxt.paramRaw, cxt.paramlen, cxt.ackbuf, cxt.acklen, ecode); - - if (ecode != 0) { - m_cancmder->sendErrorAck(rxcmd, ecode); - } else { - m_cancmder->sendBufAck(rxcmd, cxt.ackbuf, cxt.acklen); - } - return; -} - -#define CHECK_AND_GET_MODULE(paraNum) \ - auto* module = dynamic_cast(cxt->module); \ - if (module == nullptr) return err::kcmd_not_support; \ - if (paraNum >= 0 && paraNum != cxt->paramlen / 4) return err::kcmd_param_num_error; - -#define GET_MODULE(paraNum) \ - auto* module = dynamic_cast(cxt->module); \ - if (module == nullptr) return err::kcmd_not_support; - -#define MODULE_CLASS ZIModule -int32_t ZCanProtocolParser::module_ping(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(0); - return module->module_ping(); -} -int32_t ZCanProtocolParser::module_get_status(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(0); - int32_t* ack = (int32_t*)cxt->ackbuf; - cxt->acklen = 4; - return module->module_get_status(&ack[0]); -} -int32_t ZCanProtocolParser::module_set_reg(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(2); - return module->module_set_reg(cxt->params[0], cxt->params[1]); -} -int32_t ZCanProtocolParser::module_get_reg(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(1); - int32_t* ack = (int32_t*)cxt->ackbuf; - cxt->acklen = 4; - return module->module_get_reg(cxt->params[0], &ack[0]); -} - -int32_t ZCanProtocolParser::module_get_error(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(0); - int32_t* ack = (int32_t*)cxt->ackbuf; - cxt->acklen = 4; - return module->module_get_error(&ack[0]); -} -int32_t ZCanProtocolParser::module_clear_error(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(0); - return module->module_clear_error(); -} - -int32_t ZCanProtocolParser::module_stop(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(0); - return module->module_stop(); -} -int32_t ZCanProtocolParser::module_reset_reg(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(0); - return module->module_reset_reg(); -} -int32_t ZCanProtocolParser::module_active_cfg(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(0); - return module->module_active_cfg(); -} - -#undef MODULE_CLASS - -/*********************************************************************************************************************** - * ZIStepMotor * - ***********************************************************************************************************************/ - -#define MODULE_CLASS StepMotorCtrlModule - -int32_t ZCanProtocolParser::step_motor_enable(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(1); - return module->step_motor_enable(cxt->params[0]); -} -int32_t ZCanProtocolParser::step_motor_stop(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(1); - return module->step_motor_stop(cxt->params[0]); -} -int32_t ZCanProtocolParser::step_motor_read_pos(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(0); - int32_t* ack = (int32_t*)cxt->ackbuf; - cxt->acklen = 4; - return module->step_motor_read_pos(&ack[0]); -} - -int32_t ZCanProtocolParser::step_motor_read_enc_pos(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(0); - int32_t* ack = (int32_t*)cxt->ackbuf; - cxt->acklen = 4; - return module->step_motor_read_enc_pos(&ack[0]); -} - -int32_t ZCanProtocolParser::step_motor_easy_rotate(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(1); - return module->step_motor_easy_rotate(cxt->params[0]); -} - -int32_t ZCanProtocolParser::step_motor_easy_move_by(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(1); - return module->step_motor_easy_move_by(cxt->params[0]); -} -int32_t ZCanProtocolParser::step_motor_easy_move_to(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(1); - return module->step_motor_easy_move_to(cxt->params[0]); -} -int32_t ZCanProtocolParser::step_motor_easy_move_to_zero(cmdcontxt_t* cxt) { - GET_MODULE(0); - return module->step_motor_easy_move_to_zero(); -} -int32_t ZCanProtocolParser::step_motor_easy_set_current_pos(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(1); - return module->step_motor_easy_set_current_pos(cxt->params[0]); -} -int32_t ZCanProtocolParser::step_motor_easy_move_to_io(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(2); - return module->step_motor_easy_move_to_io(cxt->params[0], cxt->params[1]); -} - -int32_t ZCanProtocolParser::step_motor_active_cfg(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(0); - return module->step_motor_active_cfg(); -} -int32_t ZCanProtocolParser::step_motor_read_io_state(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(1); - int32_t* ack = (int32_t*)cxt->ackbuf; - cxt->acklen = 4; - return module->step_motor_read_io_state(cxt->params[0], ack); -} - -int32_t ZCanProtocolParser::step_motor_easy_move_to_end_point(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(0); - return module->step_motor_easy_move_to_end_point(); -} -// step_motor_easy_reciprocating_motion -int32_t ZCanProtocolParser::step_motor_easy_reciprocating_motion(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(3); - return module->step_motor_easy_reciprocating_motion(cxt->params[0], cxt->params[1], cxt->params[2]); -} - -int32_t ZCanProtocolParser::step_motor_read_tmc5130_status(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(0); - int32_t* ack = (int32_t*)cxt->ackbuf; - cxt->acklen = 4; - return module->step_motor_read_tmc5130_status(&ack[0]); -} -int32_t ZCanProtocolParser::step_motor_read_tmc5130_state(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(0); - int32_t* ack = (int32_t*)cxt->ackbuf; - cxt->acklen = 4; - return module->step_motor_read_tmc5130_state(&ack[0]); -} -int32_t ZCanProtocolParser::step_motor_read_io_index_in_stm32(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(1); - int32_t* ack = (int32_t*)cxt->ackbuf; - cxt->acklen = 4; - return module->step_motor_read_io_index_in_stm32(cxt->params[0], ack); -} - -int32_t ZCanProtocolParser::step_motor_set_subdevice_reg(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(2); - return module->step_motor_set_subdevice_reg(cxt->params[0], cxt->params[1]); -} - -int32_t ZCanProtocolParser::step_motor_get_subdevice_reg(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(1); - int32_t* ack = (int32_t*)cxt->ackbuf; - cxt->acklen = 4; - return module->step_motor_get_subdevice_reg(cxt->params[0], ack); -} - -int32_t ZCanProtocolParser::step_motor_easy_move_to_zero_point_quick(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(0); - return module->step_motor_easy_move_to_zero_point_quick(); -} - -#undef MODULE_CLASS -#define MODULE_CLASS MiniServoCtrlModule -// virtual int32_t mini_servo_enable(int32_t enable) = 0; -// virtual int32_t mini_servo_read_pos(int32_t* pos) = 0; -// virtual int32_t mini_servo_active_cfg() = 0; -// virtual int32_t mini_servo_stop(int32_t breakstop) = 0; - -// virtual int32_t mini_servo_rotate(int32_t direction) = 0; -// virtual int32_t mini_servo_move_to(int32_t position) = 0; - -// virtual int32_t mini_servo_set_mid_point() = 0; -// virtual int32_t mini_servo_read_io_state(int32_t ioindex) = 0; -int32_t ZCanProtocolParser::mini_servo_enable(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(1); - return module->mini_servo_enable(cxt->params[0]); -} -int32_t ZCanProtocolParser::mini_servo_read_pos(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(0); - int32_t* ack = (int32_t*)cxt->ackbuf; - cxt->acklen = 4; - return module->mini_servo_read_pos(&ack[0]); -} -int32_t ZCanProtocolParser::mini_servo_active_cfg(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(0); - return module->mini_servo_active_cfg(); -} -int32_t ZCanProtocolParser::mini_servo_stop(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(1); - return module->mini_servo_stop(cxt->params[0]); -} -int32_t ZCanProtocolParser::mini_servo_set_mid_point(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(0); - return module->mini_servo_set_mid_point(); -} -int32_t ZCanProtocolParser::mini_servo_read_io_state(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(1); - int32_t* ack = (int32_t*)cxt->ackbuf; - cxt->acklen = 4; - return module->mini_servo_read_io_state(cxt->params[0], ack); -} - -int32_t ZCanProtocolParser::mini_servo_move_to(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(1); - return module->mini_servo_move_to(cxt->params[0]); -} -int32_t ZCanProtocolParser::mini_servo_rotate(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(1); - return module->mini_servo_rotate(cxt->params[0]); -} -int32_t ZCanProtocolParser::mini_servo_rotate_with_torque(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(1); - return module->mini_servo_rotate_with_torque(cxt->params[0]); -} -int32_t ZCanProtocolParser::mini_servo_set_cur_pos(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(1); - return module->mini_servo_set_cur_pos(cxt->params[0]); -} - -#undef MODULE_CLASS - -/*********************************************************************************************************************** - * ZIBoard * - ***********************************************************************************************************************/ -#define MODULE_CLASS ExtBoardImpl -int32_t ZCanProtocolParser::extboard_read_inio(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(1); - int32_t* ack = (int32_t*)cxt->ackbuf; - cxt->acklen = 4; - return module->extboard_read_inio(cxt->params[0], ack); -} -int32_t ZCanProtocolParser::extboard_write_outio(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(2); - return module->kextboard_write_outio(cxt->params[0], cxt->params[1]); -} - -int32_t ZCanProtocolParser::extboard_read_muti_inio(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(0); - int32_t* ack = (int32_t*)cxt->ackbuf; - cxt->acklen = 4; - return module->extboard_read_muti_inio(ack); -} - -int32_t ZCanProtocolParser::extboard_read_inio_index_in_stm32(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(1); - int32_t* ack = (int32_t*)cxt->ackbuf; - cxt->acklen = 4; - return module->extboard_read_inio_index_in_stm32(cxt->params[0], ack); -} -int32_t ZCanProtocolParser::extboard_read_outio_index_in_stm32(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(1); - int32_t* ack = (int32_t*)cxt->ackbuf; - cxt->acklen = 4; - return module->extboard_read_outio_index_in_stm32(cxt->params[0], ack); -} - -int32_t ZCanProtocolParser::extboard_read_outio(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(1); - int32_t* ack = (int32_t*)cxt->ackbuf; - cxt->acklen = 4; - return module->extboard_read_outio(cxt->params[0], ack); -} - -#undef MODULE_CLASS - -/*********************************************************************************************************************** - * M3078CodeScanner * - ***********************************************************************************************************************/ -#define MODULE_CLASS M3078CodeScanner -int32_t ZCanProtocolParser::code_scaner_start_scan(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(0); - return module->code_scaner_start_scan(); -} - -int32_t ZCanProtocolParser::code_scaner_stop_scan(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(0); - return module->code_scaner_stop_scan(); -} - -int32_t ZCanProtocolParser::code_scaner_result_is_ready(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(0); - int32_t* ack = (int32_t*)cxt->ackbuf; - cxt->acklen = 4; - return module->code_scaner_result_is_ready(&ack[0]); -} - -int32_t ZCanProtocolParser::code_scaner_get_result_length(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(1); - int32_t* ack = (int32_t*)cxt->ackbuf; - cxt->acklen = 4; - return module->code_scaner_get_result_length(&ack[0]); -} - -int32_t ZCanProtocolParser::code_scaner_read_scaner_result(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(0); - cxt->acklen = ZCANCMD_PACKET_MAX_LEN; - int32_t suc = module->code_scaner_read_scaner_result(cxt->ackbuf, &cxt->acklen); - if (suc != 0) { - cxt->acklen = 0; - } - return suc; -} -#undef MODULE_CLASS - -/*********************************************************************************************************************** - * ZIPipetteCtrlModule * - ***********************************************************************************************************************/ - -#define MODULE_CLASS WaterCoolingTemperatureControlModule -int32_t ZCanProtocolParser::temp_controler_start_hearting(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(1); - return module->temp_controler_start_hearting(cxt->params[0]); -} -int32_t ZCanProtocolParser::temp_controler_stop_hearting(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(0); - return module->temp_controler_stop_hearting(); -} -int32_t ZCanProtocolParser::temp_controler_set_peltier_power_level(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(1); - return module->temp_controler_set_peltier_power_level(cxt->params[0]); -} -int32_t ZCanProtocolParser::temp_controler_set_pump_level(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(1); - return module->temp_controler_set_pump_level(cxt->params[0]); -} -int32_t ZCanProtocolParser::temp_controler_set_fan_level(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(1); - return module->temp_controler_set_fan_level(cxt->params[0]); -} -int32_t ZCanProtocolParser::temp_controler_enable_log(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(1); - return module->temp_controler_enable_log(cxt->params[0]); -} -#undef MODULE_CLASS - -#define MODULE_CLASS ZcanFanCtrlModule -int32_t ZCanProtocolParser::fan_controler_set_speed(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(1); - return module->fan_controler_set_speed(cxt->params[0]); -} -#undef MODULE_CLASS - -#define MODULE_CLASS XYRobotCtrlModule -int32_t ZCanProtocolParser::xymotor_enable(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(1); - return module->xymotor_enable(cxt->params[0]); -} - -int32_t ZCanProtocolParser::xymotor_move_by(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(2); - return module->xymotor_move_by(cxt->params[0], cxt->params[1]); -} - -int32_t ZCanProtocolParser::xymotor_move_to(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(2); - return module->xymotor_move_to(cxt->params[0], cxt->params[1]); -} - -int32_t ZCanProtocolParser::xymotor_move_to_zero(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(0); - return module->xymotor_move_to_zero(); -} - -int32_t ZCanProtocolParser::xymotor_read_pos(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(0); - int32_t* ack = (int32_t*)cxt->ackbuf; - cxt->acklen = 8; - return module->xymotor_read_pos(&ack[0], &ack[1]); -} - -int32_t ZCanProtocolParser::xymotor_read_inio(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(1); - int32_t* ack = (int32_t*)cxt->ackbuf; - cxt->acklen = 4; - return module->xymotor_read_inio(cxt->params[0], ack); -} - -int32_t ZCanProtocolParser::xymotor_read_inio_index_in_stm32(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(1); - int32_t* ack = (int32_t*)cxt->ackbuf; - cxt->acklen = 4; - return module->xymotor_read_inio_index_in_stm32(cxt->params[0], ack); -} - -int32_t ZCanProtocolParser::xymotor_set_pos(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(2); - return module->xymotor_set_pos(cxt->params[0], cxt->params[1]); -} - -int32_t ZCanProtocolParser::xymotor_motor_move_by_direct(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(2); - return module->xymotor_motor_move_by_direct(cxt->params[0], cxt->params[1]); -} - -int32_t ZCanProtocolParser::xymotor_read_enc_direct(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(0); - int32_t* ack = (int32_t*)cxt->ackbuf; - cxt->acklen = 8; - return module->xymotor_read_enc_direct(&ack[0], &ack[1]); -} - -#undef MODULE_CLASS - -/*********************************************************************************************************************** - * ZIA8000OpticalModule * - ***********************************************************************************************************************/ - -#define MODULE_CLASS OpticalModuleV2 -int32_t ZCanProtocolParser::a8000_optical_read_raw(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(1); - cxt->acklen = ZCANCMD_PACKET_MAX_LEN; - int32_t suc = module->a8000_optical_read_raw(cxt->params[0], cxt->ackbuf, &cxt->acklen); - if (suc != 0) { - cxt->acklen = 0; - } - return suc; -} - -int32_t ZCanProtocolParser::a8k_opt_v2_t_start_scan(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(3); - return module->a8k_opt_v2_t_start_scan(cxt->params[0], cxt->params[1], cxt->params[2]); -} -int32_t ZCanProtocolParser::a8k_opt_v2_f_start_scan(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(3); - return module->a8k_opt_v2_f_start_scan(cxt->params[0], cxt->params[1], cxt->params[2]); -} -int32_t ZCanProtocolParser::a8k_opt_v2_barcode_start_scan(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(5); - return module->a8k_opt_v2_barcode_start_scan(cxt->params[0], cxt->params[1], cxt->params[2], cxt->params[3], cxt->params[4]); -} - -int32_t ZCanProtocolParser::a8k_opt_v2_t_open_laster(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(2); - return module->a8k_opt_v2_t_open_laster(cxt->params[0], cxt->params[1]); -} -int32_t ZCanProtocolParser::a8k_opt_v2_t_close_laster(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(0); - return module->a8k_opt_v2_t_close_laster(); -} -int32_t ZCanProtocolParser::a8k_opt_v2_t_readVal(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(0); - int32_t* ack = (int32_t*)cxt->ackbuf; - cxt->acklen = 8; - return module->a8k_opt_v2_t_readVal(&ack[0], &ack[1]); -} -int32_t ZCanProtocolParser::a8k_opt_v2_f_open_laster(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(2); - return module->a8k_opt_v2_f_open_laster(cxt->params[0], cxt->params[1]); -} -int32_t ZCanProtocolParser::a8k_opt_v2_f_close_laster(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(0); - return module->a8k_opt_v2_f_close_laster(); -} -int32_t ZCanProtocolParser::a8k_opt_v2_f_readVal(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(0); - int32_t* ack = (int32_t*)cxt->ackbuf; - cxt->acklen = 8; - return module->a8k_opt_v2_f_readVal(&ack[0], &ack[1]); -} - -#undef MODULE_CLASS - -#define MODULE_CLASS EEPROMService -int32_t ZCanProtocolParser::a8000_idcard_reader_read_raw(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(1); - cxt->acklen = ZCANCMD_PACKET_MAX_LEN; - int32_t suc = module->a8000_idcard_reader_read_raw(cxt->params[0], cxt->ackbuf, &cxt->acklen); - if (suc != 0) { - cxt->acklen = 0; - } - return suc; -} - -int32_t ZCanProtocolParser::a8000_idcard_write_raw(cmdcontxt_t* cxt) { - GET_MODULE(); - if (cxt->paramlen <= 4) { - return err::kcmd_param_num_error; - } - return module->a8000_idcard_write_raw(cxt->params[0], &cxt->paramRaw[4], cxt->paramlen - 4); -} - -int32_t ZCanProtocolParser::a8000_idcard_erase(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(0); - return module->a8000_idcard_erase(); -} -int32_t ZCanProtocolParser::a8000_idcard_earse_unlock(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(0); - return module->a8000_idcard_earse_unlock(); -} - -#undef MODULE_CLASS - -#define MODULE_CLASS PlateCodeScanerModule -int32_t ZCanProtocolParser::plate_code_scaner_push_card_and_scan(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(1); - return module->plate_code_scaner_push_card_and_scan(cxt->params[0]); -} - -int32_t ZCanProtocolParser::plate_code_scaner_stop_scan(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(0); - return module->plate_code_scaner_stop_scan(); -} - -int32_t ZCanProtocolParser::plate_code_scaner_read_result(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(1); - cxt->acklen = ZCANCMD_PACKET_MAX_LEN; - int32_t suc = module->plate_code_scaner_read_result(cxt->params[0], cxt->ackbuf, &cxt->acklen); - if (suc != 0) { - cxt->acklen = 0; - } - return suc; -} - -int32_t ZCanProtocolParser::plate_code_scaner_read_result_point_num(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(0); - int32_t* ack = (int32_t*)cxt->ackbuf; - cxt->acklen = 4; - return module->plate_code_scaner_read_result_point_num(&ack[0]); -} - -int32_t ZCanProtocolParser::plate_code_scaner_read_code(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(0); - cxt->acklen = 4 * 4; - return module->plate_code_scaner_read_code(&cxt->params[0], &cxt->params[1], &cxt->params[2], &cxt->params[3]); -} - -int32_t ZCanProtocolParser::plate_code_scaner_adc_readraw(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(0); - int32_t* ack = (int32_t*)cxt->ackbuf; - cxt->acklen = 4; - return module->plate_code_scaner_adc_readraw(&ack[0]); -} - -int32_t ZCanProtocolParser::plate_code_scaner_open_laser(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(0); - return module->plate_code_scaner_open_laser(); -} - -int32_t ZCanProtocolParser::plate_code_scaner_close_laser(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(0); - return module->plate_code_scaner_close_laser(); -} - -#undef MODULE_CLASS - -/*********************************************************************************************************************** - * PipetteModuleV2 * - ***********************************************************************************************************************/ -#define MODULE_CLASS PipetteModuleV2 -int32_t ZCanProtocolParser::pipette_zmotor_enable(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(1); - return module->pipette_zmotor_enable(cxt->params[0]); -} -int32_t ZCanProtocolParser::pipette_zmotor_move_zero(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(0); - return module->pipette_zmotor_move_zero(); -} -int32_t ZCanProtocolParser::pipette_zmotor_move_to_zero_point_quick(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(0); - return module->pipette_zmotor_move_to_zero_point_quick(); -} -int32_t ZCanProtocolParser::pipette_zmotor_measure_distance(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(0); - return module->pipette_zmotor_measure_distance(); -} -int32_t ZCanProtocolParser::pipette_zmotor_read_measure_distance_result(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(0); - int32_t* ack = (int32_t*)cxt->ackbuf; - cxt->acklen = 4; - return module->pipette_zmotor_read_measure_distance_result(&ack[0]); -} -int32_t ZCanProtocolParser::pipette_zmotor_move_by(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(1); - return module->pipette_zmotor_move_by(cxt->params[0]); -} -int32_t ZCanProtocolParser::pipette_zmotor_move_to(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(1); - return module->pipette_zmotor_move_to(cxt->params[0]); -} - -int32_t ZCanProtocolParser::liquid_operation_clear_params(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(0); - return module->liquid_operation_clear_params(); -} - -int32_t ZCanProtocolParser::liquid_operation_set_gun_runparams(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(5); - return module->liquid_operation_set_gun_runparams(cxt->params[0], cxt->params[1], cxt->params[2], cxt->params[3], cxt->params[4]); -} - -int32_t ZCanProtocolParser::liquid_operation_set_zmotor_runparams(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(3); - return module->liquid_operation_set_zmotor_runparams(cxt->params[0], cxt->params[1], cxt->params[2]); -} - -int32_t ZCanProtocolParser::liquid_operation_enable_lld_record(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(0); - return module->liquid_operation_enable_lld_record(); -} - -int32_t ZCanProtocolParser::liquid_operation_fresh_params(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(0); - return module->liquid_operation_fresh_params(); -} - -int32_t ZCanProtocolParser::pipette_init_device(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(0); - return module->pipette_init_device(); -} -int32_t ZCanProtocolParser::pipette_put_tip(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(0); - return module->pipette_put_tip(); -} -int32_t ZCanProtocolParser::pipette_pump_move_to(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(1); - return module->pipette_pump_move_to(cxt->params[0]); -} -int32_t ZCanProtocolParser::pipette_lld(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(3); - return module->pipette_lld(cxt->params[0], cxt->params[1], cxt->params[2]); -} -int32_t ZCanProtocolParser::pipette_aspirate(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(1); - return module->pipette_aspirate(cxt->params[0]); -} -int32_t ZCanProtocolParser::pipette_distribu(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(1); - return module->pipette_distribu(cxt->params[0]); -} -int32_t ZCanProtocolParser::pipette_shake_up(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(2); - return module->pipette_shake_up(cxt->params[0], cxt->params[1]); -} - -/*********************************************************************************************************************** - * READ STASTE * - ***********************************************************************************************************************/ -int32_t ZCanProtocolParser::pipette_get_sensor_sample_data(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(1); - int32_t* ack = (int32_t*)cxt->ackbuf; - cxt->acklen = 12; - return module->pipette_get_sensor_sample_data(cxt->params[0], &ack[0], &ack[1], &ack[2]); -} -int32_t ZCanProtocolParser::pipette_get_sensor_sample_data_num(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(0); - int32_t* ack = (int32_t*)cxt->ackbuf; - cxt->acklen = 4; - return module->pipette_get_sensor_sample_data_num(&ack[0]); -} -int32_t ZCanProtocolParser::pipette_zmotor_read_zero_point_state(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(0); - int32_t* ack = (int32_t*)cxt->ackbuf; - cxt->acklen = 4; - return module->pipette_zmotor_read_zero_point_state(&ack[0]); -} -int32_t ZCanProtocolParser::pipette_zmotor_read_dev_status_cache(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(0); - int32_t* ack = (int32_t*)cxt->ackbuf; - cxt->acklen = 4; - return module->pipette_zmotor_read_dev_status_cache(&ack[0]); -} -int32_t ZCanProtocolParser::pipette_clear_hanging_liquid(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(1); - return module->pipette_clear_hanging_liquid(cxt->params[0]); -} - -int32_t ZCanProtocolParser::pipette_lld_is_detect_liquid(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(0); - int32_t* ack = (int32_t*)cxt->ackbuf; - cxt->acklen = 4; - return module->pipette_lld_is_detect_liquid(&ack[0]); -} - -#undef MODULE_CLASS diff --git a/sdk/components/zcancmder/zcan_protocol_parser.hpp b/sdk/components/zcancmder/zcan_protocol_parser.hpp deleted file mode 100644 index 0fe81fc..0000000 --- a/sdk/components/zcancmder/zcan_protocol_parser.hpp +++ /dev/null @@ -1,195 +0,0 @@ -#pragma once -#include - -#include "a8000_protocol\protocol.hpp" -#include "sdk\components\zcancmder\zcanreceiver.hpp" -#include "sdk\components\api\zi_module.hpp" - -#define CMDFN(name) static int32_t name(cmdcontxt_t* cxt) -#define CMDFN_IMPL(name) int32_t ZCanProtocolParser::name(cmdcontxt_t* cxt) - -namespace iflytop { -class ZCanProtocolParser : public IZCanReceiverListener { - public: - typedef struct { - ZIModule* module; - zcr_cmd_header_t* rxcmd; - int32_t cmdid; - int32_t* params; - uint8_t* paramRaw; - int32_t paramlen; - int32_t acklen; - uint8_t* ackbuf; - } cmdcontxt_t; - - typedef int32_t (*cmdcb_t)(cmdcontxt_t* cxt); - - typedef struct { - int32_t cmdid; - cmdcb_t cb; - } cmdfn_t; - - private: - ZCanReceiver* m_cancmder = nullptr; - map m_modulers; - - uint8_t ackbuf[ZCANCMD_PACKET_MAX_LEN + 10]; - int32_t acklen = 0; - - cmdfn_t cmdfnlist[200]; - int32_t cmdfnNum = 0; - - public: - void initialize(ZCanReceiver* cancmder); - virtual void onRceivePacket(zcr_cmd_header_t* rxcmd, int32_t len); - void registerModule(ZIModule* module); - ZIModule* getModule(int id) { return m_modulers[id]; } - - private: - void _registerModule(uint16_t id, ZIModule* module); - void _onRceivePacket(ZIModule* module, zcr_cmd_header_t* rxcmd, int32_t len); - void regCmdFn(int32_t cmdid, cmdcb_t cb); - cmdfn_t* findcmdfn(int32_t cmdid); - - private: - CMDFN(module_ping); - CMDFN(module_get_status); - CMDFN(module_set_reg); - CMDFN(module_get_reg); - CMDFN(module_get_error); - CMDFN(module_clear_error); - CMDFN(module_stop); - CMDFN(module_active_cfg); - CMDFN(module_reset_reg); - - - CMDFN(step_motor_enable); - CMDFN(step_motor_stop); - CMDFN(step_motor_read_pos); - CMDFN(step_motor_read_enc_pos); - CMDFN(step_motor_easy_rotate); - CMDFN(step_motor_easy_move_by); - CMDFN(step_motor_easy_move_to); - CMDFN(step_motor_easy_move_to_zero); - CMDFN(step_motor_easy_set_current_pos); - CMDFN(step_motor_easy_move_to_io); - CMDFN(step_motor_active_cfg); - CMDFN(step_motor_read_io_state); - CMDFN(step_motor_easy_move_to_end_point); - CMDFN(step_motor_read_tmc5130_status); - CMDFN(step_motor_read_tmc5130_state); - CMDFN(step_motor_read_io_index_in_stm32); - CMDFN(step_motor_set_subdevice_reg); - CMDFN(step_motor_get_subdevice_reg); - CMDFN(step_motor_easy_reciprocating_motion); - CMDFN(step_motor_easy_move_to_zero_point_quick); - - CMDFN(mini_servo_enable); - CMDFN(mini_servo_read_pos); - CMDFN(mini_servo_active_cfg); - CMDFN(mini_servo_stop); - CMDFN(mini_servo_set_mid_point); - CMDFN(mini_servo_read_io_state); - CMDFN(mini_servo_set_cur_pos); - - CMDFN(mini_servo_move_to); - CMDFN(mini_servo_rotate); - CMDFN(mini_servo_rotate_with_torque); - - CMDFN(extboard_read_inio); - CMDFN(extboard_write_outio); - CMDFN(extboard_read_muti_inio); - CMDFN(extboard_read_inio_index_in_stm32); - CMDFN(extboard_read_outio_index_in_stm32); - CMDFN(extboard_read_outio); - - CMDFN(code_scaner_start_scan); - CMDFN(code_scaner_stop_scan); - CMDFN(code_scaner_result_is_ready); - CMDFN(code_scaner_get_result_length); - CMDFN(code_scaner_read_scaner_result); - - CMDFN(temp_controler_start_hearting); - CMDFN(temp_controler_stop_hearting); - CMDFN(temp_controler_set_peltier_power_level); - CMDFN(temp_controler_set_pump_level); - CMDFN(temp_controler_set_fan_level); - CMDFN(temp_controler_enable_log); - - /*********************************************************************************************************************** - * 风扇控制 * - ***********************************************************************************************************************/ - CMDFN(fan_controler_set_speed); - CMDFN(xymotor_enable); - CMDFN(xymotor_move_by); - CMDFN(xymotor_move_to); - CMDFN(xymotor_move_to_zero); - CMDFN(xymotor_read_pos); - CMDFN(xymotor_read_inio); - CMDFN(xymotor_read_inio_index_in_stm32); - CMDFN(xymotor_set_pos); - CMDFN(xymotor_motor_move_by_direct); - CMDFN(xymotor_read_enc_direct); - -#if 1 - // CMDFN(a8000_optical_module_power_ctrl); - - CMDFN(a8000_optical_read_raw); - - CMDFN(a8k_opt_v2_t_start_scan); - CMDFN(a8k_opt_v2_f_start_scan); - CMDFN(a8k_opt_v2_t_open_laster); - CMDFN(a8k_opt_v2_t_close_laster); - CMDFN(a8k_opt_v2_t_readVal); - CMDFN(a8k_opt_v2_f_open_laster); - CMDFN(a8k_opt_v2_f_close_laster); - CMDFN(a8k_opt_v2_f_readVal); - CMDFN(a8k_opt_v2_barcode_start_scan); - -#endif - - CMDFN(a8000_idcard_reader_read_raw); - CMDFN(a8000_idcard_write_raw); - CMDFN(a8000_idcard_erase); - CMDFN(a8000_idcard_earse_unlock); - - CMDFN(plate_code_scaner_push_card_and_scan); - CMDFN(plate_code_scaner_stop_scan); - CMDFN(plate_code_scaner_read_result); - CMDFN(plate_code_scaner_read_result_point_num); - CMDFN(plate_code_scaner_read_code); - CMDFN(plate_code_scaner_adc_readraw); - CMDFN(plate_code_scaner_open_laser); - CMDFN(plate_code_scaner_close_laser); - // - - CMDFN(pipette_zmotor_enable); - CMDFN(pipette_zmotor_move_zero); - CMDFN(pipette_zmotor_move_to_zero_point_quick); - CMDFN(pipette_zmotor_measure_distance); - CMDFN(pipette_zmotor_read_measure_distance_result); - CMDFN(pipette_zmotor_move_by); - CMDFN(pipette_zmotor_move_to); - - CMDFN(liquid_operation_clear_params); - CMDFN(liquid_operation_set_gun_runparams); - CMDFN(liquid_operation_set_zmotor_runparams); - CMDFN(liquid_operation_enable_lld_record); - CMDFN(liquid_operation_fresh_params); - - CMDFN(pipette_init_device); - CMDFN(pipette_put_tip); - CMDFN(pipette_pump_move_to); - CMDFN(pipette_lld); - CMDFN(pipette_aspirate); - CMDFN(pipette_distribu); - CMDFN(pipette_shake_up); - CMDFN(pipette_clear_hanging_liquid); - CMDFN(pipette_lld_is_detect_liquid); - CMDFN(pipette_get_sensor_sample_data); - CMDFN(pipette_get_sensor_sample_data_num); - CMDFN(pipette_zmotor_read_zero_point_state); - CMDFN(pipette_zmotor_read_dev_status_cache); -}; - -} // namespace iflytop \ No newline at end of file diff --git a/sdk/components/zcancmder/zcanreceiver.cpp b/sdk/components/zcancmder/zcanreceiver.cpp index fadfdd8..13f30d3 100644 --- a/sdk/components/zcancmder/zcanreceiver.cpp +++ b/sdk/components/zcancmder/zcanreceiver.cpp @@ -9,7 +9,8 @@ using namespace zcr; #define TAG "ZCanCmder" -#define OVER_TIME_MS 5 +#define OVER_TIME_MS 5 +#define MAIN_DEVICE_CAN_ID 0 static void assign_packet_checksum(uint8_t *packet, int len) { uint8_t checksum = 0; @@ -38,16 +39,8 @@ void ZCanReceiver::initialize(CFG *cfg) { m_config = cfg; m_lock.init(); - /** - * @brief 初始化CAN - */ - - /** - * @brief 初始化消息接收buf - */ - m_rxFrameBuffer.dataIsReady = false; - m_rxFrameBuffer.id = 0; // 只接收来自主机的消息 - m_rxFrameBuffer.canPacketNum = 0; + m_rxFramePool.init(); + m_pendingMsgQueue.init(); /** * @brief 初始化过滤器 @@ -96,8 +89,7 @@ HAL_StatusTypeDef ZCanReceiver::initializeFilter() { /******************************************************************************* * 直接收来自主机的消息 * *******************************************************************************/ - filterId = (0); // - mask = (0); // + filterId = (MAIN_DEVICE_CAN_ID); // mask = (0xffffffff); // sFilterConfig.FilterBank = m_config->canFilterIndex0; // sFilterConfig.FilterMaskIdLow = mask & 0xffff; // @@ -113,7 +105,7 @@ HAL_StatusTypeDef ZCanReceiver::initializeFilter() { return HAL_Status; } -void ZCanReceiver::registerListener(IZCanReceiverListener *listener) { m_listenerList.push_back(listener); } +void ZCanReceiver::registerListener(IZCanRxProcesser *listener) { rxprocesser = listener; } // static inline const char *dumphex(uint8_t *packet, size_t len) { // static char buf[1024]; @@ -307,9 +299,6 @@ void ZCanReceiver::STM32_HAL_onCAN_RxFifo0MsgPending(CAN_HandleTypeDef *canHandl if (pHeader.RTR != CAN_RTR_DATA || pHeader.IDE != CAN_ID_STD) continue; if (pHeader.DLC == 0) continue; - // 上次接收到的消息还没有来的急处理 - if (m_rxFrameBuffer.dataIsReady) continue; - /** * @brief 处理接收到的数据 */ @@ -319,29 +308,39 @@ void ZCanReceiver::STM32_HAL_onCAN_RxFifo0MsgPending(CAN_HandleTypeDef *canHandl uint8_t frameoff = (aData[0] & 0x0F); // 只接收来自主机的消息 - if (from != m_rxFrameBuffer.id) continue; + if (from != MAIN_DEVICE_CAN_ID) continue; // 当frameoff==0,重置接收缓存 if (frameoff == 0) { - m_rxFrameBuffer.canPacketNum = 0; + if (curRxBuf != nullptr) { + m_rxFramePool.free(&curRxBuf); + } + curRxBuf = m_rxFramePool.alloc(); } + if (!curRxBuf) return; // 分配内存失败 + // 当接收到非期望frameoff的数据时,说明发生了丢包,重置接收缓存 - if (m_rxFrameBuffer.canPacketNum != frameoff) { - m_rxFrameBuffer.canPacketNum = 0; + if (curRxBuf->canPacketNum != frameoff) { + m_rxFramePool.free(&curRxBuf); continue; } // 接收到有效包 - if (m_rxFrameBuffer.canPacketNum < ZARRAY_SIZE(m_rxFrameBuffer.canPacket)) { - m_rxFrameBuffer.canPacket[m_rxFrameBuffer.canPacketNum].dlc = pHeader.DLC; - memcpy(m_rxFrameBuffer.canPacket[m_rxFrameBuffer.canPacketNum].aData, aData, 8); - m_rxFrameBuffer.canPacketNum++; + if (curRxBuf->rxdataLen + pHeader.DLC - 1 < sizeof(curRxBuf->rxdata)) { + memcpy(&curRxBuf->rxdata[curRxBuf->rxdataLen], &aData[1], pHeader.DLC - 1); + curRxBuf->canPacketNum++; + curRxBuf->rxdataLen += pHeader.DLC - 1; } if (nframe == frameoff + 1) { - m_rxFrameBuffer.npacket = nframe; - m_rxFrameBuffer.dataIsReady = true; + curRxBuf->npacket = nframe; + bool pass = rxprocesser->filterPacket(curRxBuf); + if (pass) { + m_pendingMsgQueue.sendIRQ(curRxBuf); + } else { + m_rxFramePool.free(&curRxBuf); + } } } @@ -355,39 +354,10 @@ void ZCanReceiver::STM32_HAL_onCAN_Error(CAN_HandleTypeDef *canHandle) { } void ZCanReceiver::processRx() { - auto *rxbuf = &m_rxFrameBuffer; - if (!rxbuf->dataIsReady) return; - - if (rxbuf->canPacketNum != rxbuf->npacket) { - ZLOGE(TAG, "lost packet"); - rxbuf->canPacketNum = 0; - rxbuf->npacket = 0; - rxbuf->dataIsReady = false; - return; - } - - // - // !处理接收到的数据! - // - - // 拷贝接收到的数据到processbuf中 - uint8_t *processbuf = m_rxPacketProcessBuf; - int32_t processlen = 0; - - for (size_t i = 0; i < rxbuf->canPacketNum; i++) { - if (rxbuf->canPacket[i].dlc == 0) continue; - memcpy(processbuf + processlen, rxbuf->canPacket[i].aData + 1, rxbuf->canPacket[i].dlc - 1); - processlen += rxbuf->canPacket[i].dlc - 1; - } - - // 重新开始接收CAN总线上的数据 - rxbuf->dataIsReady = false; - rxbuf->canPacketNum = 0; - rxbuf->npacket = 0; - - // 处理接收到的数据 - for (auto &var : m_listenerList) { - if (var) var->onRceivePacket((zcr_cmd_header_t *)processbuf, processlen); + auto *rx = m_pendingMsgQueue.receive(); + if (rx) { + // !处理接收到的数据! + if (rxprocesser) rxprocesser->processRxPacket(rx); } } diff --git a/sdk/components/zcancmder/zcanreceiver.hpp b/sdk/components/zcancmder/zcanreceiver.hpp index 9b2499a..068921b 100644 --- a/sdk/components/zcancmder/zcanreceiver.hpp +++ b/sdk/components/zcancmder/zcanreceiver.hpp @@ -3,18 +3,21 @@ // #pragma once -#include "a8000_protocol\protocol.hpp" -#include "basic.hpp" +#include "a8000_protocol/protocol.hpp" +#include "sdk/components/api/zi_module.hpp" #include "sdk/os/zos.hpp" -#include "sdk\components\api\zi_module.hpp" +#include "type/zcan_rx_frame.hpp" +#include "type/zcan_rx_frame_pool.hpp" +#include "type/zcan_rx_frame_queue.hpp" #ifdef HAL_CAN_MODULE_ENABLED namespace iflytop { using namespace zcr; -class IZCanReceiverListener { +class IZCanRxProcesser { public: - virtual void onRceivePacket(zcr_cmd_header_t *rxcmd, int32_t len) = 0; + virtual bool filterPacket(ZcanRxframe *rx) = 0; + virtual void processRxPacket(ZcanRxframe *rx) = 0; }; class ZCanReceiver : public ZCanIRQListener { @@ -32,22 +35,6 @@ class ZCanReceiver : public ZCanIRQListener { int packetRxOvertime_ms; // }; - class RXFrameBuffer { - typedef struct { - uint8_t dlc; - uint8_t aData[8]; /*8byte table*/ - } CANPacket; - - public: - uint16_t id = 0; - CANPacket canPacket[16] = {0}; // 最多16(2^4)帧数据 - uint8_t canPacketNum = 0; - uint8_t npacket = 0; - bool dataIsReady = false; - }; - - uint8_t txbuff[128]; - public: class LoopJobContext { public: @@ -60,9 +47,13 @@ class ZCanReceiver : public ZCanIRQListener { uint32_t m_lastPacketTicket = 0; // 上一次接收到消息的时间,用于判断与主机是否断开连接 HAL_StatusTypeDef m_lastTransmitStatus; // 上次调用can发送方法的返回值 - list m_listenerList; - RXFrameBuffer m_rxFrameBuffer; - uint8_t m_rxPacketProcessBuf[128]; // 单包数据最大包长 112(7 * 2^4) + uint8_t txbuff[128]; + + IZCanRxProcesser *rxprocesser; + + ZcanRxframePool m_rxFramePool; // 接收数据池 + ZcanRxframeQueue m_pendingMsgQueue; // 接收数据队列 + ZcanRxframe *curRxBuf = nullptr; // 当前接收数据 int txPacketInterval_ms = 0; zmutex m_lock; @@ -77,7 +68,7 @@ class ZCanReceiver : public ZCanIRQListener { uint8_t getDeviceId() { return m_config->deviceId; } void setTxPacketInterval(int interval_ms) { txPacketInterval_ms = interval_ms; } - virtual void registerListener(IZCanReceiverListener *listener); + virtual void registerListener(IZCanRxProcesser *listener); virtual int32_t sendBufAck(zcr_cmd_header_t *rx_cmd_header, uint8_t *data, int32_t len); virtual int32_t sendAck(zcr_cmd_header_t *rx_cmd_header, int32_t *ackvar, int32_t nack); virtual int32_t sendErrorAck(zcr_cmd_header_t *rx_cmd_header, int32_t errorcode); diff --git a/usrc/public_service/gservice.hpp b/usrc/public_service/gservice.hpp index aac521b..d0f75cb 100644 --- a/usrc/public_service/gservice.hpp +++ b/usrc/public_service/gservice.hpp @@ -2,7 +2,7 @@ #include #include "sdk/chip/chip.hpp" -#include "sdk/components/zcancmder/zcan_protocol_parser.hpp" +#include "sdk/components/zcan_protocol_parser/zcan_protocol_parser.hpp" #include "sdk/components/zcancmder/zcanreceiver.hpp" #include "sdk/os/zos.hpp" #include "sdk\components\zcancmder\protocol_event_bus_sender.hpp" diff --git a/usrc/version.h b/usrc/version.h index bdbd142..b1ab658 100644 --- a/usrc/version.h +++ b/usrc/version.h @@ -1,2 +1,2 @@ #pragma once -#define PC_VERSION 1020 +#define PC_VERSION 1021