From 471d8e7354d4fdf03ae0a0c18498c3d6d09431f4 Mon Sep 17 00:00:00 2001 From: zhaohe Date: Thu, 2 Nov 2023 21:25:53 +0800 Subject: [PATCH] update --- chip/basic/base.hpp | 3 +- chip/chip.hpp | 1 + components/api/zi_uart_receiver.hpp | 19 +++++++++ components/cmdscheduler/cmd_scheduler_v2.cpp | 25 ++++-------- components/cmdscheduler/cmd_scheduler_v2.hpp | 12 ++++-- components/eq_20_asb_motor/eq20_servomotor.hpp | 3 +- components/hardware/uart/zuart_dma_receiver.cpp | 46 ++++++++++++++++++++++ components/hardware/uart/zuart_dma_receiver.hpp | 41 +++++++++++++++++++ .../mini_servo_motor_ctrl_module.hpp | 2 + .../pipette_module/pipette_ctrl_module_v2.hpp | 1 + .../sensors/i2ceeprom/m24lr64e_i2c_eeprom.hpp | 2 + components/sensors/m3078/m3078_code_scaner.hpp | 2 + components/step_motor_45/step_motor_45.hpp | 1 + .../step_motor_ctrl_module.hpp | 1 + .../water_cooling_temperature_control_module.hpp | 2 + .../xy_robot_ctrl_module/xy_robot_ctrl_module.hpp | 1 + components/zcancmder/zcan_board_module.hpp | 1 + components/zprotocols/zcancmder_v2 | 2 +- 18 files changed, 141 insertions(+), 24 deletions(-) create mode 100644 components/api/zi_uart_receiver.hpp create mode 100644 components/hardware/uart/zuart_dma_receiver.cpp create mode 100644 components/hardware/uart/zuart_dma_receiver.hpp diff --git a/chip/basic/base.hpp b/chip/basic/base.hpp index 521e743..022b62e 100644 --- a/chip/basic/base.hpp +++ b/chip/basic/base.hpp @@ -8,4 +8,5 @@ // #include "chip_helper.hpp" // -#include "critical_context.hpp" \ No newline at end of file +#include "critical_context.hpp" +// \ No newline at end of file diff --git a/chip/chip.hpp b/chip/chip.hpp index 8228137..e573e66 100644 --- a/chip/chip.hpp +++ b/chip/chip.hpp @@ -7,6 +7,7 @@ #include "zpwm_generator.hpp" #include "ztim.hpp" #include "zuart.hpp" + extern "C" { typedef struct { diff --git a/components/api/zi_uart_receiver.hpp b/components/api/zi_uart_receiver.hpp new file mode 100644 index 0000000..8714299 --- /dev/null +++ b/components/api/zi_uart_receiver.hpp @@ -0,0 +1,19 @@ +#pragma once +#include + +#include + +#include "sdk\components\zprotocols\zcancmder_v2\api\errorcode.hpp" + +namespace iflytop { +using namespace std; +class ZIUartReceiver { + public: + typedef function callback_t; + + public: + virtual ~ZIUartReceiver() {} + virtual void startRx(callback_t cb) = 0; + virtual int32_t gertRxBufSize() = 0; +}; +} // namespace iflytop \ No newline at end of file diff --git a/components/cmdscheduler/cmd_scheduler_v2.cpp b/components/cmdscheduler/cmd_scheduler_v2.cpp index 0364fbf..0ec46e7 100644 --- a/components/cmdscheduler/cmd_scheduler_v2.cpp +++ b/components/cmdscheduler/cmd_scheduler_v2.cpp @@ -33,27 +33,18 @@ void CmdSchedulerV2::regbasiccmd() { }); } -void CmdSchedulerV2::initialize(UART_HandleTypeDef* huart, uint32_t rxbufsize) { - m_rxbufsize = rxbufsize; - - m_uart = new ZUART(); +void CmdSchedulerV2::initialize(ZIUartReceiver* receiver) { + // m_uart = new ZUARTDmaReceiver(); + m_uart = receiver; ZASSERT(m_uart != NULL); - ZUART::cfg_t cfg; - cfg.huart = huart; - cfg.rxbuffersize = rxbufsize; - cfg.rxovertime_ms = 3; - cfg.name = "CmdSchedulerUart"; - - rxbuf = new char[rxbufsize + 1]; + m_rxbufsize = receiver->gertRxBufSize(); + rxbuf = new char[m_rxbufsize + 1]; ZASSERT(rxbuf != NULL); - m_uart->initialize(&cfg); - ZASSERT(m_uart->startRxIt()); - m_uart->setrxcb([this](uint8_t* data, size_t len) { - if (m_dataisready) { - return; - } + // m_uart->initialize(&cfg); + m_uart->startRx([this](uint8_t* data, size_t len) { + if (m_dataisready) return; memcpy(rxbuf, data, len); rxbuf[len] = '\0'; m_rxsize = len; diff --git a/components/cmdscheduler/cmd_scheduler_v2.hpp b/components/cmdscheduler/cmd_scheduler_v2.hpp index 672bf47..9d15cfa 100644 --- a/components/cmdscheduler/cmd_scheduler_v2.hpp +++ b/components/cmdscheduler/cmd_scheduler_v2.hpp @@ -3,8 +3,11 @@ #include #include "sdk/os/zos.hpp" +#include "sdk\components\hardware\uart\zuart_dma_receiver.hpp" #include "sdk\components\zprotocols\errorcode\errorcode.hpp" #include "sdk\components\zprotocols\zcancmder_v2\api\api.hpp" +// +#include "sdk\components\api\zi_uart_receiver.hpp" namespace iflytop { using namespace std; @@ -21,9 +24,9 @@ class CmdSchedulerV2 : public ICmdParser { private: map m_cmdMap; - ZUART* m_uart; - char* rxbuf; - int32_t m_rxsize = 0; + ZIUartReceiver* m_uart; + char* rxbuf; + int32_t m_rxsize = 0; uint32_t m_rxbufsize; @@ -32,7 +35,8 @@ class CmdSchedulerV2 : public ICmdParser { char cmdcache[1024] = {0}; public: - void initialize(UART_HandleTypeDef* huart, uint32_t rxbufsize); + void initialize(ZIUartReceiver* receiver); + virtual void regCMD(const char* cmdname, const char* helpinfo, int paraNum, ICmdFunction_t cmdimpl) override { registerCmd(cmdname, helpinfo, paraNum, cmdimpl); } void registerCmd(const char* cmdname, const char* helpinfo, int paraNum, ICmdFunction_t cmdimpl); // void tx(const char* data, int len); diff --git a/components/eq_20_asb_motor/eq20_servomotor.hpp b/components/eq_20_asb_motor/eq20_servomotor.hpp index 1f68769..5ff301e 100644 --- a/components/eq_20_asb_motor/eq20_servomotor.hpp +++ b/components/eq_20_asb_motor/eq20_servomotor.hpp @@ -105,6 +105,8 @@ class Eq20ServoMotor : public ZIModule, public ZIMotor { *******************************************************************************/ virtual int32_t getid(int32_t *id) override; + virtual int32_t module_ping() { return 0; }; + virtual int32_t module_stop() override; virtual int32_t module_break() override; virtual int32_t module_get_last_exec_status(int32_t *status) override; @@ -117,7 +119,6 @@ class Eq20ServoMotor : public ZIModule, public ZIMotor { virtual int32_t module_readio(int32_t *io) override; - virtual int32_t module_read_adc(int32_t adcindex, int32_t *adc) override; /******************************************************************************* diff --git a/components/hardware/uart/zuart_dma_receiver.cpp b/components/hardware/uart/zuart_dma_receiver.cpp new file mode 100644 index 0000000..ebf3b7b --- /dev/null +++ b/components/hardware/uart/zuart_dma_receiver.cpp @@ -0,0 +1,46 @@ +#include "zuart_dma_receiver.hpp" + +#include +#include +#include + +#include "sdk\chip\zirq_dispatcher.hpp" +using namespace iflytop; + +void ZUARTDmaReceiver::initialize(hardware_config_t *config) { + m_hw_config = *config; + m_rxbufsize = m_hw_config.rxbuffersize; + m_rxbuf = (uint8_t *)malloc(m_rxbufsize); + ZASSERT(m_rxbuf != nullptr); + ZASSERT(m_hw_config.huart != nullptr); + ZASSERT(m_hw_config.dma_rx != nullptr); + memset(m_rxbuf, 0, m_rxbufsize); + + m_dmaisstart = false; +} +void ZUARTDmaReceiver::startRx(callback_t cb) { + m_cb = cb; + HAL_UART_Receive_DMA(m_hw_config.huart, (uint8_t *)m_rxbuf, m_rxbufsize); + m_dmaisstart = true; + ChipTimIrqShceduler::instance().regPeriodJob([this](ChipTimIrqShceduler::Job *job) { periodJOBIrq(); }, 1); +} + +int32_t ZUARTDmaReceiver::gertRxBufSize() { return m_rxbufsize; } +void ZUARTDmaReceiver::periodJOBIrq() { // + + if (!m_dmaisstart) return; + + int rxsize = m_rxbufsize - __HAL_DMA_GET_COUNTER(m_hw_config.dma_rx); + if (rxsize != m_rxlen) { + m_rxlen = rxsize; + m_lastrxticket = zos_get_tick(); + } + + if (zos_haspassedms(m_lastrxticket) > m_hw_config.rxovertime_ms) { + if (m_cb) m_cb(m_rxbuf, m_rxlen); + + m_rxlen = 0; + HAL_UART_DMAStop(m_hw_config.huart); + HAL_UART_Receive_DMA(m_hw_config.huart, (uint8_t *)m_rxbuf, m_rxbufsize); + } +} diff --git a/components/hardware/uart/zuart_dma_receiver.hpp b/components/hardware/uart/zuart_dma_receiver.hpp new file mode 100644 index 0000000..273481d --- /dev/null +++ b/components/hardware/uart/zuart_dma_receiver.hpp @@ -0,0 +1,41 @@ +#pragma once +#include + +#include "sdk\components\api\zi_uart_receiver.hpp" +// +#include "sdk/os/zos.hpp" +namespace iflytop { +using namespace std; +class ZUARTDmaReceiver : public ZIUartReceiver { + public: + typedef struct { + UART_HandleTypeDef *huart; + DMA_HandleTypeDef *dma_rx; + int32_t rxbuffersize = 128; + int32_t rxovertime_ms = 3; + } hardware_config_t; + + private: + hardware_config_t m_hw_config; + + uint8_t *m_rxbuf = nullptr; + int32_t m_rxbufsize = 0; + bool m_dmaisstart = false; + + ZIUartReceiver::callback_t m_cb; + + int32_t m_lastrxticket = 0; + int32_t m_rxlen = 0; + + public: + ZUARTDmaReceiver() {} + void initialize(hardware_config_t *config); + + virtual void startRx(callback_t cb) override; + virtual int32_t gertRxBufSize() override; + + private: + void periodJOBIrq(); +}; + +} // namespace iflytop \ No newline at end of file diff --git a/components/mini_servo_motor/mini_servo_motor_ctrl_module.hpp b/components/mini_servo_motor/mini_servo_motor_ctrl_module.hpp index f0f19c3..45bb932 100644 --- a/components/mini_servo_motor/mini_servo_motor_ctrl_module.hpp +++ b/components/mini_servo_motor/mini_servo_motor_ctrl_module.hpp @@ -64,6 +64,8 @@ class MiniRobotCtrlModule : public I_MiniServoModule, public ZIModule, public ZI /******************************************************************************* * Motor * *******************************************************************************/ + virtual int32_t module_ping() { return 0; }; + virtual int32_t motor_enable(int32_t enable) override; virtual int32_t motor_rotate(int32_t direction, int32_t motor_velocity, int32_t acc) override; virtual int32_t motor_move_by(int32_t distance, int32_t motor_velocity, int32_t acc) override; diff --git a/components/pipette_module/pipette_ctrl_module_v2.hpp b/components/pipette_module/pipette_ctrl_module_v2.hpp index 215726e..ef8401c 100644 --- a/components/pipette_module/pipette_ctrl_module_v2.hpp +++ b/components/pipette_module/pipette_ctrl_module_v2.hpp @@ -42,6 +42,7 @@ class PipetteModule : public ZIModule, public ZIPipetteCtrlModule { /******************************************************************************* * Module * *******************************************************************************/ + virtual int32_t module_ping() { return 0; }; virtual int32_t module_enable(int32_t enable); diff --git a/components/sensors/i2ceeprom/m24lr64e_i2c_eeprom.hpp b/components/sensors/i2ceeprom/m24lr64e_i2c_eeprom.hpp index 94c6268..271c565 100644 --- a/components/sensors/i2ceeprom/m24lr64e_i2c_eeprom.hpp +++ b/components/sensors/i2ceeprom/m24lr64e_i2c_eeprom.hpp @@ -25,6 +25,8 @@ class M24LR64E_I2CEEPROM : public ZIModule { int32_t code_scaner_read_scaner_result(int32_t startadd, uint8_t* data, int32_t* len); public: + virtual int32_t module_ping() { return 0; }; + virtual int32_t getid(int32_t* id) override { *id = this->id; return 0; diff --git a/components/sensors/m3078/m3078_code_scaner.hpp b/components/sensors/m3078/m3078_code_scaner.hpp index 49acacc..0469520 100644 --- a/components/sensors/m3078/m3078_code_scaner.hpp +++ b/components/sensors/m3078/m3078_code_scaner.hpp @@ -79,6 +79,8 @@ class M3078CodeScanner : public ZIModule, public ZICodeScaner { void clearIdinfo(); public: + virtual int32_t ping() { return 0; }; + virtual int32_t getid(int32_t* id) override { *id = this->id; return 0; diff --git a/components/step_motor_45/step_motor_45.hpp b/components/step_motor_45/step_motor_45.hpp index 94f2d88..dae3038 100644 --- a/components/step_motor_45/step_motor_45.hpp +++ b/components/step_motor_45/step_motor_45.hpp @@ -100,6 +100,7 @@ class StepMotor45 : public ZIModule, public ZIMotor { /******************************************************************************* * OVERRIDE MODULE * *******************************************************************************/ + virtual int32_t module_ping() { return 0; }; virtual int32_t getid(int32_t *id) override; virtual int32_t module_stop() override; diff --git a/components/step_motor_ctrl_module/step_motor_ctrl_module.hpp b/components/step_motor_ctrl_module/step_motor_ctrl_module.hpp index 2c6653b..90706ce 100644 --- a/components/step_motor_ctrl_module/step_motor_ctrl_module.hpp +++ b/components/step_motor_ctrl_module/step_motor_ctrl_module.hpp @@ -112,6 +112,7 @@ class StepMotorCtrlModule : public I_StepMotorCtrlModule, public ZIModule, publi /******************************************************************************* * OVERRIDE MODULE * *******************************************************************************/ + virtual int32_t module_ping() { return 0; }; virtual int32_t getid(int32_t* id) override; virtual int32_t module_stop() override; diff --git a/components/water_cooling_temperature_control_module/water_cooling_temperature_control_module.hpp b/components/water_cooling_temperature_control_module/water_cooling_temperature_control_module.hpp index 2107fe4..262d2a7 100644 --- a/components/water_cooling_temperature_control_module/water_cooling_temperature_control_module.hpp +++ b/components/water_cooling_temperature_control_module/water_cooling_temperature_control_module.hpp @@ -80,12 +80,14 @@ class WaterCoolingTemperatureControlModule : public ZIModule { int32_t m_errorcode = 0; public: + WaterCoolingTemperatureControlModule(){}; virtual ~WaterCoolingTemperatureControlModule(){}; static void createDefaultConfig(config_t* cfg); void initialize(int32_t id, config_t* cfg, hardwared_config_t* hardwaredconfig); + virtual int32_t module_ping() { return 0; }; virtual int32_t getid(int32_t* id) override; diff --git a/components/xy_robot_ctrl_module/xy_robot_ctrl_module.hpp b/components/xy_robot_ctrl_module/xy_robot_ctrl_module.hpp index f2a2916..1b4382a 100644 --- a/components/xy_robot_ctrl_module/xy_robot_ctrl_module.hpp +++ b/components/xy_robot_ctrl_module/xy_robot_ctrl_module.hpp @@ -81,6 +81,7 @@ class XYRobotCtrlModule : public I_XYRobotCtrlModule, public ZIXYMotor, public Z void loop(); void dumpcfg(); + virtual int32_t module_ping() { return 0; }; virtual int32_t getid(int32_t* id); virtual int32_t module_stop(); diff --git a/components/zcancmder/zcan_board_module.hpp b/components/zcancmder/zcan_board_module.hpp index 3e88ece..a3c3e7b 100644 --- a/components/zcancmder/zcan_board_module.hpp +++ b/components/zcancmder/zcan_board_module.hpp @@ -46,6 +46,7 @@ class ZCanBoardModule : public ZIModule { virtual ~ZCanBoardModule() {} void initialize(int32_t moduleId, hardware_config_t *cfg); + virtual int32_t module_ping() { return 0; }; virtual int32_t getid(int32_t *id) override; virtual int32_t module_readio(int32_t *io) override; diff --git a/components/zprotocols/zcancmder_v2 b/components/zprotocols/zcancmder_v2 index 77d5673..b17e21e 160000 --- a/components/zprotocols/zcancmder_v2 +++ b/components/zprotocols/zcancmder_v2 @@ -1 +1 @@ -Subproject commit 77d567330a2d005341f413743a8c16828e53d270 +Subproject commit b17e21efac1f2625c635ba947c97641927e3ec38