From 023ac698d75bf1cc33a17844e98f8a3aea6a722c Mon Sep 17 00:00:00 2001 From: zhaohe Date: Wed, 24 Jan 2024 22:39:44 +0800 Subject: [PATCH] recode --- .settings/language.settings.xml | 4 +- Core/Src/main.c | 2 +- sdk | 2 +- usrc.bak/can_cmd_reg_fn_reg.cpp | 75 ++++++ usrc.bak/device.cpp | 221 +++++++++++++++++ usrc.bak/device.hpp | 70 ++++++ usrc.bak/driver/preportional_valve_ctrl.cpp | 104 ++++++++ usrc.bak/driver/preportional_valve_ctrl.hpp | 51 ++++ usrc.bak/main.cpp | 29 +++ usrc.bak/project.hpp | 24 ++ usrc.bak/uart_debug_fn_reg.cpp | 83 +++++++ usrc/can_cmd_reg_fn_reg.cpp | 75 ------ usrc/device.cpp | 221 ----------------- usrc/device.hpp | 70 ------ usrc/driver/preportional_valve_ctrl.cpp | 26 -- usrc/hardware.cpp | 363 ++++++++++++++++++++++++++++ usrc/hardware.hpp | 15 ++ usrc/main.cpp | 154 +++++++++++- usrc/main.hpp | 27 +++ usrc/project.hpp | 4 +- usrc/uart_debug_fn_reg.cpp | 83 ------- 21 files changed, 1209 insertions(+), 494 deletions(-) create mode 100644 usrc.bak/can_cmd_reg_fn_reg.cpp create mode 100644 usrc.bak/device.cpp create mode 100644 usrc.bak/device.hpp create mode 100644 usrc.bak/driver/preportional_valve_ctrl.cpp create mode 100644 usrc.bak/driver/preportional_valve_ctrl.hpp create mode 100644 usrc.bak/main.cpp create mode 100644 usrc.bak/project.hpp create mode 100644 usrc.bak/uart_debug_fn_reg.cpp delete mode 100644 usrc/can_cmd_reg_fn_reg.cpp delete mode 100644 usrc/device.cpp delete mode 100644 usrc/device.hpp create mode 100644 usrc/hardware.cpp create mode 100644 usrc/hardware.hpp create mode 100644 usrc/main.hpp delete mode 100644 usrc/uart_debug_fn_reg.cpp diff --git a/.settings/language.settings.xml b/.settings/language.settings.xml index 85fd87c..10c2faa 100644 --- a/.settings/language.settings.xml +++ b/.settings/language.settings.xml @@ -5,7 +5,7 @@ - + @@ -16,7 +16,7 @@ - + diff --git a/Core/Src/main.c b/Core/Src/main.c index 3261b76..c9f416b 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -106,7 +106,7 @@ int main(void) MX_CAN1_Init(); MX_USART2_UART_Init(); MX_USART3_UART_Init(); - MX_IWDG_Init(); + // MX_IWDG_Init(); /* USER CODE BEGIN 2 */ extern void umain(); diff --git a/sdk b/sdk index 22d7d68..5751b82 160000 --- a/sdk +++ b/sdk @@ -1 +1 @@ -Subproject commit 22d7d685c4a5adaa0e3515a290fdb5c31d594b39 +Subproject commit 5751b8278aab13053c715341d3c1fde48f770280 diff --git a/usrc.bak/can_cmd_reg_fn_reg.cpp b/usrc.bak/can_cmd_reg_fn_reg.cpp new file mode 100644 index 0000000..bd2f25c --- /dev/null +++ b/usrc.bak/can_cmd_reg_fn_reg.cpp @@ -0,0 +1,75 @@ +#include "device.hpp" + +using namespace iflytop; +using namespace std; + +namespace iflytop { +ZCanTrigleWarningLightCtlModule m_warningLightCtlModule; + +void can_cmd_reg_fn_reg() { + // registerListener + + m_warningLightCtlModule.initialize(&m_canReceiver); + m_warningLightCtlModule.regSubmodule(1, [&](uint8_t r, uint8_t g, uint8_t b, uint8_t beep) { triple_warning_light_ctl(r, g, b, beep); }); + + m_canReceiver.registerListener([](CanPacketRxBuffer *rxbuf, uint8_t *packet, size_t len) { + Cmdheader_t *cmdheader = (Cmdheader_t *)packet; + if (IS_CMD(cmdheader, kcmd_set_proportional_valve, 0)) { + int32_t valueid = CMD_GET_PARAM(cmdheader, 0); + int32_t value = CMD_GET_PARAM(cmdheader, 1); + if (valueid == 1) { + m_PreportionalValveHost.setValvePos(1, value); + m_canReceiver.sendAck(cmdheader, NULL, 0); + } else if (valueid == 2) { + m_PreportionalValveHost.setValvePos(2, value); + m_canReceiver.sendAck(cmdheader, NULL, 0); + } + } + }); + + m_canReceiver.registerListener([](CanPacketRxBuffer *rxbuf, uint8_t *packet, size_t len) { + Cmdheader_t *cmdheader = (Cmdheader_t *)packet; + if (IS_CMD(cmdheader, kcmd_air_compressor_read_pressure, 0)) { + int32_t ack = 0; + air_compressor_read_pressure(&ack); + m_canReceiver.sendAck(cmdheader, (uint8_t *)&ack, 4); + } + }); + m_canReceiver.registerListener([](CanPacketRxBuffer *rxbuf, uint8_t *packet, size_t len) { + Cmdheader_t *cmdheader = (Cmdheader_t *)packet; + if (IS_CMD(cmdheader, kcmd_air_compressor_ch_select, 0)) { + air_compressor_ch_select(CMD_GET_PARAM(cmdheader, 0)); + m_canReceiver.sendAck(cmdheader, NULL, 0); + } + }); + m_canReceiver.registerListener([](CanPacketRxBuffer *rxbuf, uint8_t *packet, size_t len) { + Cmdheader_t *cmdheader = (Cmdheader_t *)packet; + if (!IS_CMD(cmdheader, kcmd_air_compressor_valve1_set, 0)) return; + air_compressor_valve1_set(CMD_GET_PARAM(cmdheader, 0)); + m_canReceiver.sendAck(cmdheader, NULL, 0); + }); + + m_canReceiver.registerListener([](CanPacketRxBuffer *rxbuf, uint8_t *packet, size_t len) { + Cmdheader_t *cmdheader = (Cmdheader_t *)packet; + if (!IS_CMD(cmdheader, kcmd_air_compressor_valve2_set, 0)) return; + air_compressor_valve2_set(CMD_GET_PARAM(cmdheader, 0)); + m_canReceiver.sendAck(cmdheader, NULL, 0); + }); + m_canReceiver.registerListener([](CanPacketRxBuffer *rxbuf, uint8_t *packet, size_t len) { + Cmdheader_t *cmdheader = (Cmdheader_t *)packet; + if (!IS_CMD(cmdheader, kcmd_proportional_read_state, 0)) return; + + int32_t ack = 0; + int32_t ecode = preportional_valve_is_busy(&ack); + if (ecode != 0) { + m_canReceiver.sendErrorAck(cmdheader, ecode); + } else { + m_canReceiver.sendAck(cmdheader, (uint8_t *)&ack, 4); + } + }); + + // int32_t isbusy = 0; + // int32_t ecode = preportional_valve_is_busy(&isbusy); + // ZLOGI(TAG, "ackcode:%d ack:%d", ecode, isbusy); +} +} // namespace iflytop diff --git a/usrc.bak/device.cpp b/usrc.bak/device.cpp new file mode 100644 index 0000000..58e4d10 --- /dev/null +++ b/usrc.bak/device.cpp @@ -0,0 +1,221 @@ +#include "device.hpp" + +#include +#include + +#define TAG "DEV" +namespace iflytop { +IflytopCanProtocolStackProcesser m_protocolStack; + +TMC5130 m_motor1; +TMC5130 m_motor2; + +ZGPIO debuglight; + +ZGPIO triLight_R; +ZGPIO triLight_G; +ZGPIO triLight_B; +ZGPIO triLight_BEEP; + +ZGPIO m_input1; +ZGPIO m_input2; +ZGPIO m_input3; +ZGPIO m_input4; +ZGPIO m_input5; + +ZGPIO OUT_PD14; +ZGPIO OUT_PD15; + +ZCanReceiver m_canReceiver; +ZCanBasicOrderModule m_basicOrderModule; +ZCanPumpCtrlModule m_pumpCtrlModule; +HuachengPressureSensor m_huachengPressureSensor; +PreportionalValveCtrl m_PreportionalValveHost; +CmdSchedulerV2 cmdScheduler; + +void device_init() { + debuglight.initAsOutput(DEBUG_LIGHT_GPIO, ZGPIO::kMode_nopull, false, false); + ZHAL_CORE_REG(200, { debuglight.toggleState(); }); + + ZCanReceiver::CFG *cfg = m_canReceiver.createCFG(DEVICE_ID); + m_canReceiver.init(cfg); + // m_canReceiver.registerListener(this); + + /** + * @brief 基础模块 + */ + m_input1.initAsInput(PD11, ZGPIO::kMode_nopull, ZGPIO::kIRQ_noIrq, true /*mirror*/); + m_input2.initAsInput(PC5, ZGPIO::kMode_nopull, ZGPIO::kIRQ_noIrq, true /*mirror*/); + m_input3.initAsInput(PD12, ZGPIO::kMode_nopull, ZGPIO::kIRQ_noIrq, true /*mirror*/); + m_input4.initAsInput(PD13, ZGPIO::kMode_nopull, ZGPIO::kIRQ_noIrq, true /*mirror*/); + m_input5.initAsInput(PC6, ZGPIO::kMode_nopull, ZGPIO::kIRQ_noIrq, true /*mirror*/); + m_basicOrderModule.initialize(&m_canReceiver); + m_basicOrderModule.regInputCtl([](uint8_t id, bool &val) { + if (id == 1) { + val = m_input1.getState(); + return true; + } + if (id == 2) { + val = m_input2.getState(); + return true; + } + if (id == 3) { + val = m_input3.getState(); + return true; + } + if (id == 4) { + val = m_input4.getState(); + return true; + } + if (id == 5) { + val = m_input5.getState(); + return true; + } + return false; + }); + + m_PreportionalValveHost.initialize(&huart2); + /******************************************************************************* + * 蠕动泵驱动 * + *******************************************************************************/ + + { + TMC5130::cfg_t cfg = {.hspi = &MOTOR_SPI, .enn_pin = MOTOR1_ENN, .csn_pin = MOTOR1_CSN}; + + m_motor1.initialize(&cfg); + int32_t chipv = m_motor1.readChipVERSION(); + ZLOGI(TAG, "m_motor1:%lx", chipv); + m_motor1.setIHOLD_IRUN(1, 20, 0); + m_motor1.setMotorShaft(true); + + m_motor1.setAcceleration(300000); + m_motor1.setDeceleration(300000); + // m_motor1.rotate(1000000); + } + + { + TMC5130::cfg_t cfg = {.hspi = &MOTOR_SPI, .enn_pin = MOTOR2_ENN, .csn_pin = MOTOR2_CSN}; + + m_motor2.initialize(&cfg); + int32_t chipv = m_motor2.readChipVERSION(); + ZLOGI(TAG, "m_motor2:%lx", chipv); + m_motor2.setIHOLD_IRUN(1, 20, 0); // 5W + m_motor2.setMotorShaft(true); + + m_motor2.setAcceleration(300000); + m_motor2.setDeceleration(300000); + // m_motor1.rotate(1000000); + } + + m_pumpCtrlModule.initialize(&m_canReceiver); + m_pumpCtrlModule.regSubmodule(1, [&](int16_t acc_rpm2, int16_t rpm, int16_t idlepower, int16_t power) { + ZLOGI(TAG, "pump1 acc_rpm2:%d rpm:%d", acc_rpm2, rpm); + setmotor(&m_motor1, acc_rpm2, rpm, idlepower, power); + }); + m_pumpCtrlModule.regSubmodule(2, [&](int16_t acc_rpm2, int16_t rpm, int16_t idlepower, int16_t power) { + ZLOGI(TAG, "pump2 acc:%d rpm:%d", acc_rpm2, rpm); + setmotor(&m_motor2, acc_rpm2, rpm, idlepower, power); + }); + + /******************************************************************************* + * 三色指示灯 * + *******************************************************************************/ + + { + triLight_R.initAsOutput(PD8, ZGPIO::kMode_nopull, true, false); + triLight_G.initAsOutput(PD7, ZGPIO::kMode_nopull, true, false); + triLight_B.initAsOutput(PD9, ZGPIO::kMode_nopull, true, false); + triLight_BEEP.initAsOutput(PD10, ZGPIO::kMode_nopull, true, false); + } + + /******************************************************************************* + * 压力传感器 * + *******************************************************************************/ + + { + m_huachengPressureSensor.initialize(&m_canReceiver); + m_huachengPressureSensor.regSubmodule(1, [](DP600PressureSensor::sensor_data_t *data) { // + static ModbusBlockHost modbusBlockHost; + modbusBlockHost.initialize(&huart3); + int16_t val[1] = {0}; + bool suc = modbusBlockHost.readReg03Muti(1, 0x00, (uint16_t *)val, 1, 50); + if (!suc) { + return false; + } + data->precision = 3; + data->pressure_unit = 1; + data->value = val[0]; + data->zero_point = 0; + data->range_full_point = 0; + return true; + }); + m_huachengPressureSensor.regSubmodule(2, &huart3, 2); + m_huachengPressureSensor.regSubmodule(3, &huart3, 3); + m_huachengPressureSensor.regSubmodule(4, &huart3, 4); + } + + OUT_PD14.initAsOutput(PD14, ZGPIO::kMode_nopull, false, true); + OUT_PD15.initAsOutput(PD15, ZGPIO::kMode_nopull, true, false); +} + +void setmotor(TMC5130 *motor, int16_t acc_rpm2, int16_t rpm, int16_t idlepower, int16_t power) { + int32_t ppm = rpm / 60.0 * 51200; + int32_t acc = acc_rpm2 / 60.0 * 51200; + + int16_t _idlepower = 1; + int16_t _power = 31; + + if (idlepower > 0 && idlepower < 31) { + _idlepower = idlepower; + } + if (power > 0 && power < 31) { + _power = power; + } + + motor->setIHOLD_IRUN(_idlepower, _power, 10); // 5W + motor->setAcceleration(acc); + motor->setDeceleration(acc); + motor->rotate(ppm); +} + +void air_compressor_ch_select(int32_t val) { + if (val == 2) { // 内管路 + OUT_PD15.setState(1); + } else if (val == 1) { // 空气 + OUT_PD15.setState(0); + } +} +void air_compressor_valve1_set(int32_t val) { OUT_PD14.setState(val != 0); } +void air_compressor_valve2_set(int32_t val) { OUT_PD14.setState(val != 0); } +void air_compressor_read_pressure(int32_t *ack) { // + DP600PressureSensor::sensor_data_t d = m_huachengPressureSensor.readsensordata(2); + *ack = d.value; +} + +void triple_warning_light_ctl(uint8_t r, uint8_t g, uint8_t b, uint8_t warning) { + triLight_R.setState(r != 0); + triLight_G.setState(g != 0); + triLight_B.setState(b != 0); + triLight_BEEP.setState(warning != 0); +} + +int32_t preportional_valve_is_busy(int32_t *busy) { + int32_t valve1state = 0; + int32_t valve2state = 0; + int32_t err = 0; + *busy = 1; + + err = m_PreportionalValveHost.isBusy(1, &valve1state); + if (err != 0) return err; + err = m_PreportionalValveHost.isBusy(2, &valve2state); + if (err != 0) return err; + + if (valve1state == 0 && valve2state == 0) { + *busy = 0; + } else { + *busy = 1; + } + return 0; +} + +} // namespace iflytop diff --git a/usrc.bak/device.hpp b/usrc.bak/device.hpp new file mode 100644 index 0000000..82651da --- /dev/null +++ b/usrc.bak/device.hpp @@ -0,0 +1,70 @@ +#include +#include +#include + +#include "main.h" +#include "project.hpp" +// +// #include "sdk/components/single_axis_motor_control_v2/single_axis_motor_control_v2.hpp" +#include "sdk/components/iflytop_can_slave_modules/idcard_reader_service.hpp" +#include "sdk/components/single_axis_motor_control/single_axis_motor_control.hpp" +#include "sdk/hal/zhal.hpp" +#include "sdk\components\iflytop_can_slave_modules\io_control_service.hpp" +#include "sdk\components\iflytop_can_slave_v1\iflytop_can_slave.hpp" +#include "sdk\components\m3078\m3078_code_scaner.hpp" +#include "sdk\components\tmc\ic\ztmc4361A.hpp" +#include "sdk\components\tmc\ic\ztmc5130.hpp" +// +#include "sdk\components\huacheng_sensor\dp600_pressure_sensor.hpp" +#include "sdk\components\zcan_module\huacheng_pressure_sensor.hpp" +#include "sdk\components\zcan_module\zcan_basic_order_module.hpp" +#include "sdk\components\zcan_module\zcan_pump_ctrl_module.hpp" +#include "sdk\components\zcan_module\zcan_trigle_warning_light_ctl_module.hpp" +// + +#include "driver/preportional_valve_ctrl.hpp" +#include "iwdg.h" +#include "sdk\components\cmdscheduler\cmd_scheduler_v2.hpp" +#include "sdk\hal\zuart.hpp" + +namespace iflytop { +extern IflytopCanProtocolStackProcesser m_protocolStack; + +extern TMC5130 m_motor1; +extern TMC5130 m_motor2; + +extern ZGPIO debuglight; + +extern ZGPIO triLight_R; +extern ZGPIO triLight_G; +extern ZGPIO triLight_B; +extern ZGPIO triLight_BEEP; + +extern ZGPIO m_input1; +extern ZGPIO m_input2; +extern ZGPIO m_input3; +extern ZGPIO m_input4; +extern ZGPIO m_input5; + +extern ZGPIO OUT_PD14; +extern ZGPIO OUT_PD15; + +extern ZCanReceiver m_canReceiver; +extern ZCanBasicOrderModule m_basicOrderModule; +extern ZCanPumpCtrlModule m_pumpCtrlModule; +extern HuachengPressureSensor m_huachengPressureSensor; +extern CmdSchedulerV2 cmdScheduler; +// 比例阀 +extern PreportionalValveCtrl m_PreportionalValveHost; + +void device_init(); +void setmotor(TMC5130 *motor, int16_t acc_rpm2, int16_t rpm, int16_t idlepower, int16_t power); +void air_compressor_ch_select(int32_t val); +void air_compressor_valve1_set(int32_t val); +void air_compressor_valve2_set(int32_t val); +void air_compressor_read_pressure(int32_t *ack); +void triple_warning_light_ctl(uint8_t r, uint8_t g, uint8_t b, uint8_t warning); + +int32_t preportional_valve_is_busy(int32_t *busy); + +}; // namespace iflytop diff --git a/usrc.bak/driver/preportional_valve_ctrl.cpp b/usrc.bak/driver/preportional_valve_ctrl.cpp new file mode 100644 index 0000000..e6200b8 --- /dev/null +++ b/usrc.bak/driver/preportional_valve_ctrl.cpp @@ -0,0 +1,104 @@ +#include "preportional_valve_ctrl.hpp" +using namespace iflytop; + +#define WORK_STATE_REG 0x0000 +#define CTRL_STATE_REG 0x0001 +#define POS_STATE_REG 0x0013 + +void PreportionalValveCtrl::initialize(UART_HandleTypeDef* huart) { m_modbusBlockHost.initialize(huart); } + +int32_t PreportionalValveCtrl::setValvePos(int32_t valueid, int32_t pos) { // + + /** + * @brief 发送失败重发3次 + */ + for (size_t i = 0; i < 3; i++) { + int32_t err = _setValvePos(valueid, pos); + if (err == 0) return 0; + } + return 1; +} +int32_t PreportionalValveCtrl::_setValvePos(int32_t valueid, int32_t pos) { // + if (valueid > 255 || valueid < 1) { + return 1; + } + bool ret = m_modbusBlockHost.writeReg06(valueid, CTRL_STATE_REG, pos, 30); + if (!ret) return 1; + m_last_set_valve_ticket = HAL_GetTick(); + m_targetpos[valueid] = pos; + return 0; +} +int32_t PreportionalValveCtrl::getValvePos(int32_t valueid, int32_t* pos) { + // return m_modbusBlockHost.readReg03(valueid, POS_STATE_REG, pos, 30); + uint16_t pos16 = 0; + bool ret = m_modbusBlockHost.readReg03(valueid, POS_STATE_REG, &pos16, 30); + *pos = pos16; + if (!ret) return 1; + return 0; +} +int32_t PreportionalValveCtrl::getValveOrderPos(int32_t valueid, int32_t* pos) { + uint16_t pos16 = 0; + bool ret = m_modbusBlockHost.readReg03(valueid, CTRL_STATE_REG, &pos16, 30); + *pos = pos16; + if (!ret) return 1; + return 0; +} +#define TAG "PreportionalValveCtrl" + +int32_t PreportionalValveCtrl::isBusy(int32_t valueid, int32_t* busy) { +#if 1 + int32_t orderpos = 0; + int32_t pos = 0; + int32_t err = 0; + +#if 0 + err = getValveOrderPos(valueid, &orderpos); + if (err != 0) return err; +#endif + orderpos = m_targetpos[valueid]; + + err = getValvePos(valueid, &pos); + if (err != 0) return err; + + if (abs(m_targetpos[valueid] - pos) <= 11) { + *busy = 0; + } else { + *busy = 1; + } + return 0; +#endif + +#if 0 + + /** + * @brief + * 比例阀当前状态的更新是有延迟的,例如下发指令控制比例阀开合到90%,下发执行后(收到指令的回执), + * 此时读取比例阀状态,比例阀的状态并非运动中,而是stop,需要等待一段时间后,再读取状态,状态才是运动中。 + */ + if (haspassedms(m_last_set_valve_ticket) < 300) { + *busy = 1; + return 0; + } + int32_t valve1state = 0; + int32_t err = 0; + + err = getValveWorkState(1, &valve1state); + if (err != 0) return err; + + if (valve1state == kstate_stop) { + *busy = 0; + } else { + *busy = 1; + } + return 0; + +#endif +} + +int32_t PreportionalValveCtrl::getValveWorkState(int32_t valueid, int32_t* state) { + uint16_t state16 = 0; + bool ret = m_modbusBlockHost.readReg03(valueid, WORK_STATE_REG, &state16, 30); + *state = state16; + if (!ret) return 1; + return 0; +} \ No newline at end of file diff --git a/usrc.bak/driver/preportional_valve_ctrl.hpp b/usrc.bak/driver/preportional_valve_ctrl.hpp new file mode 100644 index 0000000..3baf7d5 --- /dev/null +++ b/usrc.bak/driver/preportional_valve_ctrl.hpp @@ -0,0 +1,51 @@ +// +// Created by zwsd +// + +#pragma once +#include +#include + +#include "sdk/hal/zhal.hpp" +#include "sdk\components\modbus\modbus_block_host.hpp" + +/** + * @brief + * + * https://iflytop1.feishu.cn/wiki/GQwCwHMqFiaJRwks80ncwaYKnSe + */ + +namespace iflytop { +using namespace std; +class PreportionalValveCtrl { + public: + typedef enum { + kstate_stop = 0x0, + kstate_running_forward = 0xaa, + kstate_running_backward = 0xbb, + kstate_err_state = 0xea, + } work_state_t; + + private: + /* data */ + ModbusBlockHost m_modbusBlockHost; + int32_t val = 0; + uint32_t m_last_set_valve_ticket = 0; + uint16_t m_targetpos[255]; + + public: + PreportionalValveCtrl(){}; + ~PreportionalValveCtrl(){}; + + void initialize(UART_HandleTypeDef* huart); + int32_t setValvePos(int32_t valueid, int32_t pos); + int32_t getValvePos(int32_t valueid, int32_t* pos); + int32_t getValveOrderPos(int32_t valueid, int32_t* pos); + int32_t isBusy(int32_t valueid, int32_t* busy); + int32_t getValveWorkState(int32_t valueid, int32_t* state); + + private: + int32_t _setValvePos(int32_t valueid, int32_t pos); +}; + +} // namespace iflytop \ No newline at end of file diff --git a/usrc.bak/main.cpp b/usrc.bak/main.cpp new file mode 100644 index 0000000..64fe625 --- /dev/null +++ b/usrc.bak/main.cpp @@ -0,0 +1,29 @@ +#include "device.hpp" +#define TAG "main" +namespace iflytop { +extern void uart_debug_fn_reg(); +extern void can_cmd_reg_fn_reg(); +}; // namespace iflytop + +using namespace iflytop; +extern "C"{ +void umain(void) { + ZHALCORE::cfg_t oscfg = { + .delayhtim = &DELAY_US_TIMER, + .debuguart = &DEBUG_UART, + }; + ZHALCORE::getInstance()->initialize(oscfg); + + ZLOGI(TAG, "pipeline_disinfection_liquid_path_control:%s", VERSION); + + device_init(); + uart_debug_fn_reg(); + can_cmd_reg_fn_reg(); + ZLOGI(TAG, "init done"); + while (1) { + cmdScheduler.schedule(); + ZHALCORE::getInstance()->loop(); + HAL_IWDG_Refresh(&hiwdg); + } +} +} diff --git a/usrc.bak/project.hpp b/usrc.bak/project.hpp new file mode 100644 index 0000000..074c2c0 --- /dev/null +++ b/usrc.bak/project.hpp @@ -0,0 +1,24 @@ +#pragma once + +#define VERSION "v1.2" +// 设备ID +#define DEVICE_ID (2) +// 调试串口 +#define DEBUG_UART huart1 +// 调试指示灯 +#define DEBUG_LIGHT_GPIO PE8 +// 微秒延迟定时器,注意该延时定时器需要按照以下文档进行配置 +// http://192.168.1.3:3000/zwikipedia/iflytop_wikipedia/src/branch/master/doc/stm32cubemx_us_timer.md +#define DELAY_US_TIMER htim6 +#define MICROSWITCH_NUM 6 +// +#define MOTOR_SPI hspi1 + +#define TMC5130_MOTOR_NUM 2 +#define MOTOR_CH(n) (n) +// FYBJ_PY +#define MOTOR2_CSN PA4 // +#define MOTOR2_ENN PE11 +// FYBJ_TJ_DRV +#define MOTOR1_CSN PC4 // +#define MOTOR1_ENN PE12 diff --git a/usrc.bak/uart_debug_fn_reg.cpp b/usrc.bak/uart_debug_fn_reg.cpp new file mode 100644 index 0000000..2f7816c --- /dev/null +++ b/usrc.bak/uart_debug_fn_reg.cpp @@ -0,0 +1,83 @@ +#include "device.hpp" + +#define TAG "UART_D" + +namespace iflytop { +using namespace std; + +void uart_debug_fn_reg() { + static ZUART uartreceiver; + static ZUART::cfg_t uartreceiver_cfg = { + .name = "uartreceiver", + .huart = &DEBUG_UART, + .rxbuffersize = 512, + .rxovertime_ms = 30, + }; + uartreceiver.initialize(&uartreceiver_cfg); + cmdScheduler.initialize(&uartreceiver); + cmdScheduler.regCMD("setmotor1", "(int16_t acc_rpm2, int16_t rpm, int16_t idlepower, int16_t power)", 4, + [](int32_t paramN, const char **paraV, ICmdParserACK *ack) { + int16_t acc_rpm2 = atoi(paraV[0]); + int16_t rpm = atoi(paraV[1]); + int16_t idlepower = atoi(paraV[2]); + int16_t power = atoi(paraV[3]); + setmotor(&m_motor1, acc_rpm2, rpm, idlepower, power); + ack->setNoneAck(0); + }); + cmdScheduler.regCMD("setmotor2", "(int16_t acc_rpm2, int16_t rpm, int16_t idlepower, int16_t power)", 4, + [](int32_t paramN, const char **paraV, ICmdParserACK *ack) { + int16_t acc_rpm2 = atoi(paraV[0]); + int16_t rpm = atoi(paraV[1]); + int16_t idlepower = atoi(paraV[2]); + int16_t power = atoi(paraV[3]); + setmotor(&m_motor2, acc_rpm2, rpm, idlepower, power); + ack->setNoneAck(0); + }); + cmdScheduler.regCMD("setlight", "(uint8_t r, uint8_t g, uint8_t b, uint8_t beep)", 4, [](int32_t paramN, const char **paraV, ICmdParserACK *ack) { + uint8_t r = atoi(paraV[0]); + uint8_t g = atoi(paraV[1]); + uint8_t b = atoi(paraV[2]); + uint8_t beep = atoi(paraV[3]); + triple_warning_light_ctl(r, g, b, beep); + ack->setNoneAck(0); + }); + cmdScheduler.regCMD("readio", "()", 0, [](int32_t paramN, const char **paraV, ICmdParserACK *ack) { + uint8_t sensorid = atoi(paraV[0]); + ZLOGI(TAG, "IO1:%d IO2:%d IO3:%d IO4:%d IO5:%d", m_input1.getState(), m_input2.getState(), m_input3.getState(), m_input4.getState(), m_input5.getState()); + ack->setNoneAck(0); + }); + + cmdScheduler.regCMD("air_compressor_ch_ctrl", "(id,val)", 2, [](int32_t paramN, const char **paraV, ICmdParserACK *ack) { + air_compressor_ch_select(atoi(paraV[0])); + ack->setNoneAck(0); + }); + + cmdScheduler.regCMD("set_proportional_valve", "(uint8_t id,uint8_t val)", 2, [](int32_t paramN, const char **paraV, ICmdParserACK *ack) { + int32_t id = atoi(paraV[0]); + int32_t val = atoi(paraV[1]); + m_PreportionalValveHost.setValvePos(id, val); + ack->setNoneAck(0); + }); + cmdScheduler.regCMD("pressure_sensor_read", "(id)", 1, [](int32_t paramN, const char **paraV, ICmdParserACK *ack) { + uint8_t id = atoi(paraV[0]); + DP600PressureSensor::sensor_data_t d = m_huachengPressureSensor.readsensordata(id); + ZLOGI(TAG, "pressure_sensor_read id:%d precision:%d pressure_unit:%d value:%d zero_point:%d range_full_point:%d", // + id, d.precision, d.pressure_unit, d.value, d.zero_point, d.range_full_point); + ack->setNoneAck(0); + }); + cmdScheduler.regCMD("air_compressor_valve1_set", "(value)", 1, [](int32_t paramN, const char **paraV, ICmdParserACK *ack) { + air_compressor_valve1_set(atoi(paraV[0])); + ack->setNoneAck(0); + }); + cmdScheduler.regCMD("air_compressor_valve2_set", "(value)", 1, [](int32_t paramN, const char **paraV, ICmdParserACK *ack) { + air_compressor_valve2_set(atoi(paraV[0])); + ack->setNoneAck(0); + }); + cmdScheduler.regCMD("preportional_valve_is_busy", "()", 0, [](int32_t paramN, const char **paraV, ICmdParserACK *ack) { + int32_t isbusy = 0; + int32_t ecode = preportional_valve_is_busy(&isbusy); + ZLOGI(TAG, "ackcode:%d ack:%d", ecode, isbusy); + ack->setNoneAck(0); + }); +} +} // namespace iflytop diff --git a/usrc/can_cmd_reg_fn_reg.cpp b/usrc/can_cmd_reg_fn_reg.cpp deleted file mode 100644 index bd2f25c..0000000 --- a/usrc/can_cmd_reg_fn_reg.cpp +++ /dev/null @@ -1,75 +0,0 @@ -#include "device.hpp" - -using namespace iflytop; -using namespace std; - -namespace iflytop { -ZCanTrigleWarningLightCtlModule m_warningLightCtlModule; - -void can_cmd_reg_fn_reg() { - // registerListener - - m_warningLightCtlModule.initialize(&m_canReceiver); - m_warningLightCtlModule.regSubmodule(1, [&](uint8_t r, uint8_t g, uint8_t b, uint8_t beep) { triple_warning_light_ctl(r, g, b, beep); }); - - m_canReceiver.registerListener([](CanPacketRxBuffer *rxbuf, uint8_t *packet, size_t len) { - Cmdheader_t *cmdheader = (Cmdheader_t *)packet; - if (IS_CMD(cmdheader, kcmd_set_proportional_valve, 0)) { - int32_t valueid = CMD_GET_PARAM(cmdheader, 0); - int32_t value = CMD_GET_PARAM(cmdheader, 1); - if (valueid == 1) { - m_PreportionalValveHost.setValvePos(1, value); - m_canReceiver.sendAck(cmdheader, NULL, 0); - } else if (valueid == 2) { - m_PreportionalValveHost.setValvePos(2, value); - m_canReceiver.sendAck(cmdheader, NULL, 0); - } - } - }); - - m_canReceiver.registerListener([](CanPacketRxBuffer *rxbuf, uint8_t *packet, size_t len) { - Cmdheader_t *cmdheader = (Cmdheader_t *)packet; - if (IS_CMD(cmdheader, kcmd_air_compressor_read_pressure, 0)) { - int32_t ack = 0; - air_compressor_read_pressure(&ack); - m_canReceiver.sendAck(cmdheader, (uint8_t *)&ack, 4); - } - }); - m_canReceiver.registerListener([](CanPacketRxBuffer *rxbuf, uint8_t *packet, size_t len) { - Cmdheader_t *cmdheader = (Cmdheader_t *)packet; - if (IS_CMD(cmdheader, kcmd_air_compressor_ch_select, 0)) { - air_compressor_ch_select(CMD_GET_PARAM(cmdheader, 0)); - m_canReceiver.sendAck(cmdheader, NULL, 0); - } - }); - m_canReceiver.registerListener([](CanPacketRxBuffer *rxbuf, uint8_t *packet, size_t len) { - Cmdheader_t *cmdheader = (Cmdheader_t *)packet; - if (!IS_CMD(cmdheader, kcmd_air_compressor_valve1_set, 0)) return; - air_compressor_valve1_set(CMD_GET_PARAM(cmdheader, 0)); - m_canReceiver.sendAck(cmdheader, NULL, 0); - }); - - m_canReceiver.registerListener([](CanPacketRxBuffer *rxbuf, uint8_t *packet, size_t len) { - Cmdheader_t *cmdheader = (Cmdheader_t *)packet; - if (!IS_CMD(cmdheader, kcmd_air_compressor_valve2_set, 0)) return; - air_compressor_valve2_set(CMD_GET_PARAM(cmdheader, 0)); - m_canReceiver.sendAck(cmdheader, NULL, 0); - }); - m_canReceiver.registerListener([](CanPacketRxBuffer *rxbuf, uint8_t *packet, size_t len) { - Cmdheader_t *cmdheader = (Cmdheader_t *)packet; - if (!IS_CMD(cmdheader, kcmd_proportional_read_state, 0)) return; - - int32_t ack = 0; - int32_t ecode = preportional_valve_is_busy(&ack); - if (ecode != 0) { - m_canReceiver.sendErrorAck(cmdheader, ecode); - } else { - m_canReceiver.sendAck(cmdheader, (uint8_t *)&ack, 4); - } - }); - - // int32_t isbusy = 0; - // int32_t ecode = preportional_valve_is_busy(&isbusy); - // ZLOGI(TAG, "ackcode:%d ack:%d", ecode, isbusy); -} -} // namespace iflytop diff --git a/usrc/device.cpp b/usrc/device.cpp deleted file mode 100644 index c47e3a3..0000000 --- a/usrc/device.cpp +++ /dev/null @@ -1,221 +0,0 @@ -#include "device.hpp" - -#include -#include - -#define TAG "DEV" -namespace iflytop { -IflytopCanProtocolStackProcesser m_protocolStack; - -TMC5130 m_motor1; -TMC5130 m_motor2; - -ZGPIO debuglight; - -ZGPIO triLight_R; -ZGPIO triLight_G; -ZGPIO triLight_B; -ZGPIO triLight_BEEP; - -ZGPIO m_input1; -ZGPIO m_input2; -ZGPIO m_input3; -ZGPIO m_input4; -ZGPIO m_input5; - -ZGPIO OUT_PD14; -ZGPIO OUT_PD15; - -ZCanReceiver m_canReceiver; -ZCanBasicOrderModule m_basicOrderModule; -ZCanPumpCtrlModule m_pumpCtrlModule; -HuachengPressureSensor m_huachengPressureSensor; -PreportionalValveCtrl m_PreportionalValveHost; -CmdSchedulerV2 cmdScheduler; - -void device_init() { - debuglight.initAsOutput(DEBUG_LIGHT_GPIO, ZGPIO::kMode_nopull, false, false); - ZHAL_CORE_REG(200, { debuglight.toggleState(); }); - - ZCanReceiver::CFG *cfg = m_canReceiver.createCFG(DEVICE_ID); - m_canReceiver.init(cfg); - // m_canReceiver.registerListener(this); - - /** - * @brief 基础模块 - */ - m_input1.initAsInput(PD11, ZGPIO::kMode_nopull, ZGPIO::kIRQ_noIrq, true /*mirror*/); - m_input2.initAsInput(PC5, ZGPIO::kMode_nopull, ZGPIO::kIRQ_noIrq, true /*mirror*/); - m_input3.initAsInput(PD12, ZGPIO::kMode_nopull, ZGPIO::kIRQ_noIrq, true /*mirror*/); - m_input4.initAsInput(PD13, ZGPIO::kMode_nopull, ZGPIO::kIRQ_noIrq, true /*mirror*/); - m_input5.initAsInput(PC6, ZGPIO::kMode_nopull, ZGPIO::kIRQ_noIrq, true /*mirror*/); - m_basicOrderModule.initialize(&m_canReceiver); - m_basicOrderModule.regInputCtl([](uint8_t id, bool &val) { - if (id == 1) { - val = m_input1.getState(); - return true; - } - if (id == 2) { - val = m_input2.getState(); - return true; - } - if (id == 3) { - val = m_input3.getState(); - return true; - } - if (id == 4) { - val = m_input4.getState(); - return true; - } - if (id == 5) { - val = m_input5.getState(); - return true; - } - return false; - }); - - m_PreportionalValveHost.initialize(&huart2); - /******************************************************************************* - * 蠕动泵驱动 * - *******************************************************************************/ - - { - TMC5130::cfg_t cfg = {.hspi = &MOTOR_SPI, .enn_pin = MOTOR1_ENN, .csn_pin = MOTOR1_CSN}; - - m_motor1.initialize(&cfg); - int32_t chipv = m_motor1.readChipVERSION(); - ZLOGI(TAG, "m_motor1:%lx", chipv); - m_motor1.setIHOLD_IRUN(1, 20, 0); - m_motor1.setMotorShaft(true); - - m_motor1.setAcceleration(300000); - m_motor1.setDeceleration(300000); - // m_motor1.rotate(1000000); - } - - { - TMC5130::cfg_t cfg = {.hspi = &MOTOR_SPI, .enn_pin = MOTOR2_ENN, .csn_pin = MOTOR2_CSN}; - - m_motor2.initialize(&cfg); - int32_t chipv = m_motor2.readChipVERSION(); - ZLOGI(TAG, "m_motor2:%lx", chipv); - m_motor2.setIHOLD_IRUN(1, 20, 0); // 5W - m_motor2.setMotorShaft(true); - - m_motor2.setAcceleration(300000); - m_motor2.setDeceleration(300000); - // m_motor1.rotate(1000000); - } - - m_pumpCtrlModule.initialize(&m_canReceiver); - m_pumpCtrlModule.regSubmodule(1, [&](int16_t acc_rpm2, int16_t rpm, int16_t idlepower, int16_t power) { - ZLOGI(TAG, "pump1 acc_rpm2:%d rpm:%d", acc_rpm2, rpm); - setmotor(&m_motor1, acc_rpm2, rpm, idlepower, power); - }); - m_pumpCtrlModule.regSubmodule(2, [&](int16_t acc_rpm2, int16_t rpm, int16_t idlepower, int16_t power) { - ZLOGI(TAG, "pump2 acc:%d rpm:%d", acc_rpm2, rpm); - setmotor(&m_motor2, acc_rpm2, rpm, idlepower, power); - }); - - /******************************************************************************* - * 三色指示灯 * - *******************************************************************************/ - - { - triLight_R.initAsOutput(PD8, ZGPIO::kMode_nopull, true, false); - triLight_G.initAsOutput(PD7, ZGPIO::kMode_nopull, true, false); - triLight_B.initAsOutput(PD9, ZGPIO::kMode_nopull, true, false); - triLight_BEEP.initAsOutput(PD10, ZGPIO::kMode_nopull, true, false); - } - - /******************************************************************************* - * 压力传感器 * - *******************************************************************************/ - - { - m_huachengPressureSensor.initialize(&m_canReceiver); - m_huachengPressureSensor.regSubmodule(1, [](DP600PressureSensor::sensor_data_t *data) { // - static ModbusBlockHost modbusBlockHost; - modbusBlockHost.initialize(&huart3); - int16_t val[1] = {0}; - bool suc = modbusBlockHost.readReg03Muti(1, 0x00, (uint16_t *)val, 1, 50); - if (!suc) { - return false; - } - data->precision = 3; - data->pressure_unit = 1; - data->value = val[0]; - data->zero_point = 0; - data->range_full_point = 0; - return true; - }); - m_huachengPressureSensor.regSubmodule(2, &huart3, 2); - m_huachengPressureSensor.regSubmodule(3, &huart3, 3); - m_huachengPressureSensor.regSubmodule(4, &huart3, 4); - } - - OUT_PD14.initAsOutput(PD14, ZGPIO::kMode_nopull, false, true); - OUT_PD15.initAsOutput(PD15, ZGPIO::kMode_nopull, false, true); -} - -void setmotor(TMC5130 *motor, int16_t acc_rpm2, int16_t rpm, int16_t idlepower, int16_t power) { - int32_t ppm = rpm / 60.0 * 51200; - int32_t acc = acc_rpm2 / 60.0 * 51200; - - int16_t _idlepower = 1; - int16_t _power = 31; - - if (idlepower > 0 && idlepower < 31) { - _idlepower = idlepower; - } - if (power > 0 && power < 31) { - _power = power; - } - - motor->setIHOLD_IRUN(_idlepower, _power, 10); // 5W - motor->setAcceleration(acc); - motor->setDeceleration(acc); - motor->rotate(ppm); -} - -void air_compressor_ch_select(int32_t val) { - if (val == 2) { // 内管路 - OUT_PD15.setState(1); - } else if (val == 1) { // 空气 - OUT_PD15.setState(0); - } -} -void air_compressor_valve1_set(int32_t val) { OUT_PD14.setState(val != 0); } -void air_compressor_valve2_set(int32_t val) { OUT_PD14.setState(val != 0); } -void air_compressor_read_pressure(int32_t *ack) { // - DP600PressureSensor::sensor_data_t d = m_huachengPressureSensor.readsensordata(2); - *ack = d.value; -} - -void triple_warning_light_ctl(uint8_t r, uint8_t g, uint8_t b, uint8_t warning) { - triLight_R.setState(r != 0); - triLight_G.setState(g != 0); - triLight_B.setState(b != 0); - triLight_BEEP.setState(warning != 0); -} - -int32_t preportional_valve_is_busy(int32_t *busy) { - int32_t valve1state = 0; - int32_t valve2state = 0; - int32_t err = 0; - *busy = 1; - - err = m_PreportionalValveHost.isBusy(1, &valve1state); - if (err != 0) return err; - err = m_PreportionalValveHost.isBusy(2, &valve2state); - if (err != 0) return err; - - if (valve1state == 0 && valve2state == 0) { - *busy = 0; - } else { - *busy = 1; - } - return 0; -} - -} // namespace iflytop diff --git a/usrc/device.hpp b/usrc/device.hpp deleted file mode 100644 index 82651da..0000000 --- a/usrc/device.hpp +++ /dev/null @@ -1,70 +0,0 @@ -#include -#include -#include - -#include "main.h" -#include "project.hpp" -// -// #include "sdk/components/single_axis_motor_control_v2/single_axis_motor_control_v2.hpp" -#include "sdk/components/iflytop_can_slave_modules/idcard_reader_service.hpp" -#include "sdk/components/single_axis_motor_control/single_axis_motor_control.hpp" -#include "sdk/hal/zhal.hpp" -#include "sdk\components\iflytop_can_slave_modules\io_control_service.hpp" -#include "sdk\components\iflytop_can_slave_v1\iflytop_can_slave.hpp" -#include "sdk\components\m3078\m3078_code_scaner.hpp" -#include "sdk\components\tmc\ic\ztmc4361A.hpp" -#include "sdk\components\tmc\ic\ztmc5130.hpp" -// -#include "sdk\components\huacheng_sensor\dp600_pressure_sensor.hpp" -#include "sdk\components\zcan_module\huacheng_pressure_sensor.hpp" -#include "sdk\components\zcan_module\zcan_basic_order_module.hpp" -#include "sdk\components\zcan_module\zcan_pump_ctrl_module.hpp" -#include "sdk\components\zcan_module\zcan_trigle_warning_light_ctl_module.hpp" -// - -#include "driver/preportional_valve_ctrl.hpp" -#include "iwdg.h" -#include "sdk\components\cmdscheduler\cmd_scheduler_v2.hpp" -#include "sdk\hal\zuart.hpp" - -namespace iflytop { -extern IflytopCanProtocolStackProcesser m_protocolStack; - -extern TMC5130 m_motor1; -extern TMC5130 m_motor2; - -extern ZGPIO debuglight; - -extern ZGPIO triLight_R; -extern ZGPIO triLight_G; -extern ZGPIO triLight_B; -extern ZGPIO triLight_BEEP; - -extern ZGPIO m_input1; -extern ZGPIO m_input2; -extern ZGPIO m_input3; -extern ZGPIO m_input4; -extern ZGPIO m_input5; - -extern ZGPIO OUT_PD14; -extern ZGPIO OUT_PD15; - -extern ZCanReceiver m_canReceiver; -extern ZCanBasicOrderModule m_basicOrderModule; -extern ZCanPumpCtrlModule m_pumpCtrlModule; -extern HuachengPressureSensor m_huachengPressureSensor; -extern CmdSchedulerV2 cmdScheduler; -// 比例阀 -extern PreportionalValveCtrl m_PreportionalValveHost; - -void device_init(); -void setmotor(TMC5130 *motor, int16_t acc_rpm2, int16_t rpm, int16_t idlepower, int16_t power); -void air_compressor_ch_select(int32_t val); -void air_compressor_valve1_set(int32_t val); -void air_compressor_valve2_set(int32_t val); -void air_compressor_read_pressure(int32_t *ack); -void triple_warning_light_ctl(uint8_t r, uint8_t g, uint8_t b, uint8_t warning); - -int32_t preportional_valve_is_busy(int32_t *busy); - -}; // namespace iflytop diff --git a/usrc/driver/preportional_valve_ctrl.cpp b/usrc/driver/preportional_valve_ctrl.cpp index e6200b8..4cc79e9 100644 --- a/usrc/driver/preportional_valve_ctrl.cpp +++ b/usrc/driver/preportional_valve_ctrl.cpp @@ -67,32 +67,6 @@ int32_t PreportionalValveCtrl::isBusy(int32_t valueid, int32_t* busy) { } return 0; #endif - -#if 0 - - /** - * @brief - * 比例阀当前状态的更新是有延迟的,例如下发指令控制比例阀开合到90%,下发执行后(收到指令的回执), - * 此时读取比例阀状态,比例阀的状态并非运动中,而是stop,需要等待一段时间后,再读取状态,状态才是运动中。 - */ - if (haspassedms(m_last_set_valve_ticket) < 300) { - *busy = 1; - return 0; - } - int32_t valve1state = 0; - int32_t err = 0; - - err = getValveWorkState(1, &valve1state); - if (err != 0) return err; - - if (valve1state == kstate_stop) { - *busy = 0; - } else { - *busy = 1; - } - return 0; - -#endif } int32_t PreportionalValveCtrl::getValveWorkState(int32_t valueid, int32_t* state) { diff --git a/usrc/hardware.cpp b/usrc/hardware.cpp new file mode 100644 index 0000000..c002161 --- /dev/null +++ b/usrc/hardware.cpp @@ -0,0 +1,363 @@ +#include "hardware.hpp" + +#include +#include + +#include "main.h" +#include "project.hpp" +// +// #include "sdk/components/single_axis_motor_control_v2/single_axis_motor_control_v2.hpp" +#include "sdk/components/iflytop_can_slave_modules/idcard_reader_service.hpp" +#include "sdk/components/single_axis_motor_control/single_axis_motor_control.hpp" +#include "sdk/hal/zhal.hpp" +#include "sdk\components\iflytop_can_slave_modules\io_control_service.hpp" +#include "sdk\components\iflytop_can_slave_v1\iflytop_can_slave.hpp" +#include "sdk\components\m3078\m3078_code_scaner.hpp" +#include "sdk\components\tmc\ic\ztmc4361A.hpp" +#include "sdk\components\tmc\ic\ztmc5130.hpp" +// +#include "driver/preportional_valve_ctrl.hpp" +#include "sdk\components\huacheng_sensor\dp600_pressure_sensor.hpp" +#include "sdk\components\zcan_module\huacheng_pressure_sensor.hpp" +#include "sdk\components\zcan_module\zcan_basic_order_module.hpp" +#include "sdk\components\zcan_module\zcan_pump_ctrl_module.hpp" +#include "sdk\components\zcan_module\zcan_trigle_warning_light_ctl_module.hpp" + +using namespace iflytop; +#define TAG "main" + +TMC5130 m_motor1; +TMC5130 m_motor2; + +ZGPIO triLight_R; +ZGPIO triLight_G; +ZGPIO triLight_Y; +ZGPIO triLight_BEEP; + +ZCanBasicOrderModule m_basicOrderModule; +ZCanPumpCtrlModule m_pumpCtrlModule; +ZCanTrigleWarningLightCtlModule m_warningLightCtlModule; +HuachengPressureSensor m_huachengPressureSensor; + +DP600PressureSensor m_dp600PressureSensor2; +DP600PressureSensor m_dp600PressureSensor3; +DP600PressureSensor m_dp600PressureSensor4; + +ZGPIO IO_PD13_IN; +ZGPIO IO_PC7_IN; + +ZGPIO OUT_PD14; +ZGPIO OUT_PD15; + +void setmotor(TMC5130 *motor, int16_t acc_rpm2, int16_t rpm, int16_t idlepower, int16_t power) { + int32_t ppm = rpm / 60.0 * 51200; + int32_t acc = acc_rpm2 / 60.0 * 51200; + + int16_t _idlepower = 1; + int16_t _power = 31; + + if (idlepower > 0 && idlepower < 31) { + _idlepower = idlepower; + } + if (power > 0 && power < 31) { + _power = power; + } + + motor->setIHOLD_IRUN(_idlepower, _power, 10); // 5W + motor->setAcceleration(acc); + motor->setDeceleration(acc); + motor->rotate(ppm); +} +PreportionalValveCtrl m_PreportionalValveHost; + +int32_t preportional_valve_is_busy(int32_t *busy) { + int32_t valve1state = 0; + int32_t valve2state = 0; + int32_t err = 0; + *busy = 1; + + err = m_PreportionalValveHost.isBusy(1, &valve1state); + if (err != 0) return err; + err = m_PreportionalValveHost.isBusy(2, &valve2state); + if (err != 0) return err; + + if (valve1state == 0 && valve2state == 0) { + *busy = 0; + } else { + *busy = 1; + } + return 0; +} + +void air_compressor_read_pressure(int32_t *ack) { // + DP600PressureSensor::sensor_data_t d = m_huachengPressureSensor.readsensordata(2); + *ack = d.value; +} + +void Hardware::initialize(int deviceId) { + m_device_id = deviceId; + // IO_PD13_IN.initAsInput(PD13, ZGPIO::kMode_nopull, ZGPIO::kIRQ_noIrq, false /*mirror*/); + // IO_PC7_IN.initAsInput(PC7, ZGPIO::kMode_nopull, ZGPIO::kIRQ_noIrq, false /*mirror*/); + { + TMC5130::cfg_t cfg = {.hspi = &MOTOR_SPI, .enn_pin = MOTOR1_ENN, .csn_pin = MOTOR1_CSN}; + + m_motor1.initialize(&cfg); + int32_t chipv = m_motor1.readChipVERSION(); + ZLOGI(TAG, "m_motor1:%lx", chipv); + m_motor1.setIHOLD_IRUN(1, 20, 0); + m_motor1.setMotorShaft(true); + + m_motor1.setAcceleration(300000); + m_motor1.setDeceleration(300000); + // m_motor1.rotate(1000000); + } + + { + TMC5130::cfg_t cfg = {.hspi = &MOTOR_SPI, .enn_pin = MOTOR2_ENN, .csn_pin = MOTOR2_CSN}; + + m_motor2.initialize(&cfg); + int32_t chipv = m_motor2.readChipVERSION(); + ZLOGI(TAG, "m_motor2:%lx", chipv); + m_motor2.setIHOLD_IRUN(1, 20, 0); // 5W + m_motor2.setMotorShaft(true); + + m_motor2.setAcceleration(300000); + m_motor2.setDeceleration(300000); + // m_motor2.rotate(1000000); + } + + triLight_R.initAsOutput(PD8, ZGPIO::kMode_nopull, true, false); + triLight_G.initAsOutput(PD7, ZGPIO::kMode_nopull, true, false); + triLight_Y.initAsOutput(PD9, ZGPIO::kMode_nopull, true, false); + triLight_BEEP.initAsOutput(PD10, ZGPIO::kMode_nopull, true, false); + +#if 0 + m_dp600PressureSensor2.initialize(&huart3, 2); + m_dp600PressureSensor3.initialize(&huart3, 3); + m_dp600PressureSensor4.initialize(&huart3, 4); + + OUT_PD14.initAsOutput(PD14, ZGPIO::kMode_nopull, false, true); + OUT_PD15.initAsOutput(PD15, ZGPIO::kMode_nopull, true, false); +#endif +} + +void dumpdp600data(DP600PressureSensor::sensor_data_t *data) { + ZLOGI(TAG, "value:%d", data->value); + ZLOGI(TAG, "zero_point:%d", data->zero_point); + ZLOGI(TAG, "range_full_point:%d", data->range_full_point); + ZLOGI(TAG, "precision:%d", data->precision); + ZLOGI(TAG, "pressure_unit:%d", data->pressure_unit); +} + +void packet_kcmd_read_huacheng_pressure_sensor_data(int id, DP600PressureSensor::sensor_data_t *dp600data, uint8_t *receipt, int32_t &receiptsize) { + receipt[0] = id; + receipt[1] = 0; + receipt[2] = dp600data->precision; + receipt[3] = dp600data->pressure_unit; + memcpy(receipt + 4, &dp600data->value, 2); + memcpy(receipt + 6, &dp600data->zero_point, 2); + memcpy(receipt + 8, &dp600data->range_full_point, 2); + receiptsize = 10; +} + +int32_t Hardware::process_rx_packet(from_where_t fromwhere, uint8_t *packet, int32_t len, uint8_t *receipt, int32_t &receiptsize, bool &matching) { + Cmdheader_t *cmdheader = (Cmdheader_t *)packet; + if (fromwhere == kuart) printf("rx: cmdid:%d subcmdid:%d id:%d\n", cmdheader->cmdid, cmdheader->subcmdid, cmdheader->data[0]); + + /** + * @brief Ping + */ + PROCESS_CMD(kcmd_ping, 0, m_device_id) { + receipt[0] = cmdheader->data[0]; + receiptsize = 1; + return 0; + } + + /** + * @brief 控制加液泵 + */ + PROCESS_CMD(kcmd_peristaltic_pump_ctl, 1, 1) { + int16_t acc = *(int16_t *)(&cmdheader->data[2]); + int16_t rpm = *(int16_t *)(&cmdheader->data[4]); + int16_t idlepower = cmdheader->data[6]; + int16_t power = cmdheader->data[7]; + + printf("kcmd_peristaltic_pump_ctl 1 acc:%d rpm:%d idlepower:%d power:%d\n", acc, rpm, idlepower, power); + + setmotor(&m_motor1, acc, rpm, idlepower, power); + receipt[0] = cmdheader->data[0]; + receiptsize = 1; + return 0; + } + + /** + * @brief 控制-喷液泵 + */ + PROCESS_CMD(kcmd_peristaltic_pump_ctl, 1, 2) { + int16_t acc = *(int16_t *)(&cmdheader->data[2]); + int16_t rpm = *(int16_t *)(&cmdheader->data[4]); + int16_t idlepower = cmdheader->data[6]; + int16_t power = cmdheader->data[7]; + printf("kcmd_peristaltic_pump_ctl 2 acc:%d rpm:%d idlepower:%d power:%d\n", acc, rpm, idlepower, power); + + setmotor(&m_motor2, acc, rpm, idlepower, power); + receipt[0] = cmdheader->data[0]; + receiptsize = 1; + return 0; + } + + /** + * @brief 三色指示灯控制 + */ + PROCESS_CMD(kcmd_triple_warning_light_ctl, 0, 1) { + /** + * @brief 0:设置状态 + * cmd: + * [0]:SENSORID + * [2]:红色灯状态 + * [3]:黄色灯状态 + * [4]:绿色灯状态 + * [5]:蜂鸣器状态 + * ack : b0:id + * ack_datalen : 1 + */ + uint8_t id = cmdheader->data[0]; + uint8_t r = cmdheader->data[2]; + uint8_t g = cmdheader->data[3]; + uint8_t b = cmdheader->data[4]; + uint8_t beep = cmdheader->data[5]; + + triLight_R.setState(r != 0); + triLight_G.setState(g != 0); + triLight_Y.setState(b != 0); + triLight_BEEP.setState(beep != 0); + + receipt[0] = cmdheader->data[0]; + receiptsize = 1; + } + + if ((cmdheader->cmdid == (uint16_t)kcmd_air_compressor_valve1_set) && (cmdheader->subcmdid == 0)) { + uint32_t val = *(uint32_t *)(&cmdheader->data[0]); + OUT_PD14.setState(val != 0); + matching = true; + } + + if ((cmdheader->cmdid == (uint16_t)kcmd_air_compressor_valve2_set) && (cmdheader->subcmdid == 0)) { + uint32_t val = *(uint32_t *)(&cmdheader->data[0]); + OUT_PD14.setState(val != 0); + matching = true; + } + + if ((cmdheader->cmdid == (uint16_t)kcmd_proportional_read_state) && (cmdheader->subcmdid == 0)) { + matching = true; + + int32_t ack = 0; + int32_t ecode = preportional_valve_is_busy(&ack); + + int32_t *p_receipt_32 = (int32_t *)receipt; + *p_receipt_32 = ack; + receiptsize = 4; + } + + if ((cmdheader->cmdid == (uint16_t)kcmd_set_proportional_valve) && (cmdheader->subcmdid == 0)) { + int32_t para0 = *(int32_t *)(&cmdheader->data[0]); + int32_t para1 = *(int32_t *)(&cmdheader->data[4]); + if (para0 == 1) { + matching = true; + m_PreportionalValveHost.setValvePos(1, para1); + } else if (para0 == 2) { + matching = true; + m_PreportionalValveHost.setValvePos(2, para1); + } + } + static DP600PressureSensor::sensor_data_t dp600data; + if ((cmdheader->cmdid == (uint16_t)kcmd_air_compressor_read_pressure) && (cmdheader->subcmdid == 0)) { + matching = true; + bool suc = m_dp600PressureSensor2.readVal(&dp600data); + if (!suc) return 1002; + int32_t *p_receipt_32 = (int32_t *)receipt; + *p_receipt_32 = dp600data.value; + receiptsize = 4; + } + +#if 0 + /** + * @brief 获取蒸发仓水浸状态 + */ + PROCESS_CMD(kcmd_proportional_read_water_immersion_sensor, 0, 0) { + ((int32_t *)receipt)[0] = !IO_PC7_IN.getState(); + receiptsize = 4; + return 0; + } + + /** + * @brief 获取设备底盘水浸传感器 + */ + PROCESS_CMD(kcmd_proportional_read_water_immersion_sensor, 0, 1) { + ((int32_t *)receipt)[0] = !IO_PD13_IN.getState(); + receiptsize = 4; + return 0; + } + +#endif + + /** + * @brief 液位测量压力传感器 + */ + PROCESS_CMD(kcmd_read_huacheng_pressure_sensor, 0, 1) { + static ModbusBlockHost modbusBlockHost; + modbusBlockHost.initialize(&huart3); + int16_t val[1] = {0}; + bool suc = modbusBlockHost.readReg03Muti(1, 0x00, (uint16_t *)val, 1, 50); + if (!suc) return 1002; + dp600data.precision = 3; + dp600data.pressure_unit = 1; + dp600data.value = val[0]; + dp600data.zero_point = 0; + dp600data.range_full_point = 0; + packet_kcmd_read_huacheng_pressure_sensor_data(cmdheader->data[0], &dp600data, receipt, receiptsize); + if (fromwhere == kuart) { + dumpdp600data(&dp600data); + } + return 0; + } + /** + * @brief 空压机压力传感器 + */ + PROCESS_CMD(kcmd_read_huacheng_pressure_sensor, 0, 2) { + bool suc = m_dp600PressureSensor2.readVal(&dp600data); + if (!suc) return 1002; + packet_kcmd_read_huacheng_pressure_sensor_data(cmdheader->data[0], &dp600data, receipt, receiptsize); + if (fromwhere == kuart) { + dumpdp600data(&dp600data); + } + return 0; + } + /** + * @brief 加液蠕动泵压力传感器 + */ + PROCESS_CMD(kcmd_read_huacheng_pressure_sensor, 0, 3) { + bool suc = m_dp600PressureSensor3.readVal(&dp600data); + if (!suc) return 1002; + packet_kcmd_read_huacheng_pressure_sensor_data(cmdheader->data[0], &dp600data, receipt, receiptsize); + if (fromwhere == kuart) { + dumpdp600data(&dp600data); + } + return 0; + } + /** + * @brief 喷射蠕动泵压力传感器 + */ + PROCESS_CMD(kcmd_read_huacheng_pressure_sensor, 0, 4) { + bool suc = m_dp600PressureSensor4.readVal(&dp600data); + if (!suc) return 1002; + packet_kcmd_read_huacheng_pressure_sensor_data(cmdheader->data[0], &dp600data, receipt, receiptsize); + if (fromwhere == kuart) { + dumpdp600data(&dp600data); + } + return 0; + } + + return 0; +} +void Hardware::loop() {} diff --git a/usrc/hardware.hpp b/usrc/hardware.hpp new file mode 100644 index 0000000..be3a8dc --- /dev/null +++ b/usrc/hardware.hpp @@ -0,0 +1,15 @@ +#include + +namespace iflytop { +class Hardware { + public: + typedef enum { kcan, kuart } from_where_t; + int32_t m_device_id = 0; + + public: + void initialize(int deviceId); + int32_t process_rx_packet(from_where_t fromwhere, uint8_t *packet, int32_t len, uint8_t *receipt, int32_t &receiptsize, bool &matching); + void loop(); +}; + +} // namespace iflytop diff --git a/usrc/main.cpp b/usrc/main.cpp index 64fe625..41c5549 100644 --- a/usrc/main.cpp +++ b/usrc/main.cpp @@ -1,29 +1,157 @@ -#include "device.hpp" +#include "main.hpp" + +#include +#include + +#include "main.h" +#include "project.hpp" +// +// #include "sdk/components/single_axis_motor_control_v2/single_axis_motor_control_v2.hpp" +#include "sdk/components/iflytop_can_slave_modules/idcard_reader_service.hpp" +#include "sdk/components/single_axis_motor_control/single_axis_motor_control.hpp" +#include "sdk/hal/zhal.hpp" +#include "sdk\components\iflytop_can_slave_modules\io_control_service.hpp" +#include "sdk\components\iflytop_can_slave_v1\iflytop_can_slave.hpp" +#include "sdk\components\m3078\m3078_code_scaner.hpp" +#include "sdk\components\tmc\ic\ztmc4361A.hpp" +#include "sdk\components\tmc\ic\ztmc5130.hpp" +// +#include "hardware.hpp" +#include "sdk\components\huacheng_sensor\dp600_pressure_sensor.hpp" +#include "sdk\components\string_utils.hpp" +#include "sdk\components\zcan_module\huacheng_pressure_sensor.hpp" +#include "sdk\components\zcan_module\zcan_basic_order_module.hpp" +#include "sdk\components\zcan_module\zcan_pump_ctrl_module.hpp" +#include "sdk\components\zcan_module\zcan_trigle_warning_light_ctl_module.hpp" + #define TAG "main" namespace iflytop { -extern void uart_debug_fn_reg(); -extern void can_cmd_reg_fn_reg(); -}; // namespace iflytop +Main gmain; +}; using namespace iflytop; -extern "C"{ -void umain(void) { + +void dumphexdata(uint8_t *data, int32_t len) { + for (int32_t i = 0; i < len; i++) { + printf("%02X ", data[i]); + } + printf("\n"); +} + +/******************************************************************************* + * GLOBAL * + *******************************************************************************/ + +IflytopCanProtocolStackProcesser m_protocolStack; +Hardware m_hardware; +ZGPIO debuglight; +ZCanReceiver m_canReceiver; + +/******************************************************************************* + * MESSAGE_HANDLER * + *******************************************************************************/ +/** + * @brief 处理CAN接收到消息 + */ +void Main::onRceivePacket(CanPacketRxBuffer *rxbuf, uint8_t *packet, size_t len) { + // ZLOGI(TAG, "onRceivePacket from %d %d", rxbuf->id, len); + static uint8_t rxdata[1024] = {0}; + memset(rxdata, 0, sizeof(rxdata)); + Cmdheader_t *cmdheader = (Cmdheader_t *)packet; + bool match = false; + int32_t receipt_size = 0; + int32_t ecode = m_hardware.process_rx_packet(Hardware::from_where_t::kcan, packet, len, rxdata, receipt_size, match); + if (match) { + if (ecode != 0) { + m_canReceiver.sendErrorAck(cmdheader, ecode); + } else { + m_canReceiver.sendAck(cmdheader, rxdata, receipt_size); + } + } +} +/** + * @brief 处理串口接收到的消息 + */ + +static void processUARTEachLine(char *packet, size_t len) { + static uint8_t rxdata[1024] = {0}; + int32_t receipt_size = 0; + bool match = false; + + memset(rxdata, 0, sizeof(rxdata)); + + // + int32_t bytelen = 0; + uint8_t *hexbytes = StringUtils::hex_str_to_bytes((char *)packet, len, bytelen); + if (hexbytes == NULL) { + ZLOGE(TAG, "hex_str_to_bytes failed"); + return; + } + dumphexdata(hexbytes, bytelen); + int32_t ecode = m_hardware.process_rx_packet(Hardware::kuart, hexbytes, bytelen, rxdata, receipt_size, match); + if (match) { + printf("match\n"); + if (ecode < 0) { + printf("ecode :%d\n", ecode); + return; + } + dumphexdata(rxdata, receipt_size); + } + printf("\n"); +} + +static void processUartRX(uint8_t *packet, size_t len) { + for (size_t i = 0; i < len; i++) { + if (packet[i] == '\n' || packet[i] == '\r') { + packet[i] = '\0'; + } + } + + for (size_t i = 0; i < len; i++) { + if (i == 0) { + processUARTEachLine((char *)packet, strlen((char *)packet)); + } else if (packet[i - 1] == '\0' && packet[i] != '\0') { + processUARTEachLine((char *)packet + i, strlen((char *)packet + i)); + } + } +} + +/******************************************************************************* + * MAIN * + *******************************************************************************/ +void Main::run() { ZHALCORE::cfg_t oscfg = { .delayhtim = &DELAY_US_TIMER, .debuguart = &DEBUG_UART, }; ZHALCORE::getInstance()->initialize(oscfg); - ZLOGI(TAG, "pipeline_disinfection_liquid_path_control:%s", VERSION); + ZLOGI(TAG, "little_disinfection_liquid_path_control:%s", VERSION); + + debuglight.initAsOutput(DEBUG_LIGHT_GPIO, ZGPIO::kMode_nopull, false, false); + ZHAL_CORE_REG(200, { debuglight.toggleState(); }); + + m_hardware.initialize(DEVICE_ID); + + static ZUART uartreceiver; + static ZUART::cfg_t uartreceiver_cfg = { + .name = "uartreceiver", + .huart = &DEBUG_UART, + .rxbuffersize = 512, + .rxovertime_ms = 30, + }; + uartreceiver.initialize(&uartreceiver_cfg); + uartreceiver.setrxcb([this](uint8_t *data, size_t len) { processUartRX(data, len); }); + uartreceiver.startRxIt(); + + ZCanReceiver::CFG *cfg = m_canReceiver.createCFG(DEVICE_ID); + m_canReceiver.init(cfg); + m_canReceiver.registerListener(this); - device_init(); - uart_debug_fn_reg(); - can_cmd_reg_fn_reg(); ZLOGI(TAG, "init done"); while (1) { - cmdScheduler.schedule(); ZHALCORE::getInstance()->loop(); - HAL_IWDG_Refresh(&hiwdg); + m_hardware.loop(); + uartreceiver.forceCchedule(); } } -} diff --git a/usrc/main.hpp b/usrc/main.hpp new file mode 100644 index 0000000..5767d46 --- /dev/null +++ b/usrc/main.hpp @@ -0,0 +1,27 @@ +#pragma once +#include +#include + +#include + +#include "sdk\components\iflytop_can_slave_modules\device_base_control_service.hpp" +#include "sdk\components\iflytop_can_slave_v1\iflytop_can_slave.hpp" +#include "sdk\components\zcanreceiver\zcanreceiver.hpp" +namespace iflytop { +using namespace std; +class Main : public ZCanRceiverListener { + private: + /* data */ + public: + virtual void onRceivePacket(CanPacketRxBuffer *rxbuf, uint8_t *packet, size_t len); + + Main(/* args */){}; + ~Main(){}; + void run(); +}; +extern Main gmain; +} // namespace iflytop + +extern "C" { +void umain(void) { iflytop::gmain.run(); } +} diff --git a/usrc/project.hpp b/usrc/project.hpp index 074c2c0..5c48e57 100644 --- a/usrc/project.hpp +++ b/usrc/project.hpp @@ -1,6 +1,6 @@ #pragma once -#define VERSION "v1.2" +#define VERSION "v1.1" // 设备ID #define DEVICE_ID (2) // 调试串口 @@ -21,4 +21,4 @@ #define MOTOR2_ENN PE11 // FYBJ_TJ_DRV #define MOTOR1_CSN PC4 // -#define MOTOR1_ENN PE12 +#define MOTOR1_ENN PE12 \ No newline at end of file diff --git a/usrc/uart_debug_fn_reg.cpp b/usrc/uart_debug_fn_reg.cpp deleted file mode 100644 index 2f7816c..0000000 --- a/usrc/uart_debug_fn_reg.cpp +++ /dev/null @@ -1,83 +0,0 @@ -#include "device.hpp" - -#define TAG "UART_D" - -namespace iflytop { -using namespace std; - -void uart_debug_fn_reg() { - static ZUART uartreceiver; - static ZUART::cfg_t uartreceiver_cfg = { - .name = "uartreceiver", - .huart = &DEBUG_UART, - .rxbuffersize = 512, - .rxovertime_ms = 30, - }; - uartreceiver.initialize(&uartreceiver_cfg); - cmdScheduler.initialize(&uartreceiver); - cmdScheduler.regCMD("setmotor1", "(int16_t acc_rpm2, int16_t rpm, int16_t idlepower, int16_t power)", 4, - [](int32_t paramN, const char **paraV, ICmdParserACK *ack) { - int16_t acc_rpm2 = atoi(paraV[0]); - int16_t rpm = atoi(paraV[1]); - int16_t idlepower = atoi(paraV[2]); - int16_t power = atoi(paraV[3]); - setmotor(&m_motor1, acc_rpm2, rpm, idlepower, power); - ack->setNoneAck(0); - }); - cmdScheduler.regCMD("setmotor2", "(int16_t acc_rpm2, int16_t rpm, int16_t idlepower, int16_t power)", 4, - [](int32_t paramN, const char **paraV, ICmdParserACK *ack) { - int16_t acc_rpm2 = atoi(paraV[0]); - int16_t rpm = atoi(paraV[1]); - int16_t idlepower = atoi(paraV[2]); - int16_t power = atoi(paraV[3]); - setmotor(&m_motor2, acc_rpm2, rpm, idlepower, power); - ack->setNoneAck(0); - }); - cmdScheduler.regCMD("setlight", "(uint8_t r, uint8_t g, uint8_t b, uint8_t beep)", 4, [](int32_t paramN, const char **paraV, ICmdParserACK *ack) { - uint8_t r = atoi(paraV[0]); - uint8_t g = atoi(paraV[1]); - uint8_t b = atoi(paraV[2]); - uint8_t beep = atoi(paraV[3]); - triple_warning_light_ctl(r, g, b, beep); - ack->setNoneAck(0); - }); - cmdScheduler.regCMD("readio", "()", 0, [](int32_t paramN, const char **paraV, ICmdParserACK *ack) { - uint8_t sensorid = atoi(paraV[0]); - ZLOGI(TAG, "IO1:%d IO2:%d IO3:%d IO4:%d IO5:%d", m_input1.getState(), m_input2.getState(), m_input3.getState(), m_input4.getState(), m_input5.getState()); - ack->setNoneAck(0); - }); - - cmdScheduler.regCMD("air_compressor_ch_ctrl", "(id,val)", 2, [](int32_t paramN, const char **paraV, ICmdParserACK *ack) { - air_compressor_ch_select(atoi(paraV[0])); - ack->setNoneAck(0); - }); - - cmdScheduler.regCMD("set_proportional_valve", "(uint8_t id,uint8_t val)", 2, [](int32_t paramN, const char **paraV, ICmdParserACK *ack) { - int32_t id = atoi(paraV[0]); - int32_t val = atoi(paraV[1]); - m_PreportionalValveHost.setValvePos(id, val); - ack->setNoneAck(0); - }); - cmdScheduler.regCMD("pressure_sensor_read", "(id)", 1, [](int32_t paramN, const char **paraV, ICmdParserACK *ack) { - uint8_t id = atoi(paraV[0]); - DP600PressureSensor::sensor_data_t d = m_huachengPressureSensor.readsensordata(id); - ZLOGI(TAG, "pressure_sensor_read id:%d precision:%d pressure_unit:%d value:%d zero_point:%d range_full_point:%d", // - id, d.precision, d.pressure_unit, d.value, d.zero_point, d.range_full_point); - ack->setNoneAck(0); - }); - cmdScheduler.regCMD("air_compressor_valve1_set", "(value)", 1, [](int32_t paramN, const char **paraV, ICmdParserACK *ack) { - air_compressor_valve1_set(atoi(paraV[0])); - ack->setNoneAck(0); - }); - cmdScheduler.regCMD("air_compressor_valve2_set", "(value)", 1, [](int32_t paramN, const char **paraV, ICmdParserACK *ack) { - air_compressor_valve2_set(atoi(paraV[0])); - ack->setNoneAck(0); - }); - cmdScheduler.regCMD("preportional_valve_is_busy", "()", 0, [](int32_t paramN, const char **paraV, ICmdParserACK *ack) { - int32_t isbusy = 0; - int32_t ecode = preportional_valve_is_busy(&isbusy); - ZLOGI(TAG, "ackcode:%d ack:%d", ecode, isbusy); - ack->setNoneAck(0); - }); -} -} // namespace iflytop