diff --git a/sdk/components/pipette_module/pipette_ctrl_module.cpp b/sdk/components/pipette_module/pipette_ctrl_module.cpp index bd3467c..bec8d9f 100644 --- a/sdk/components/pipette_module/pipette_ctrl_module.cpp +++ b/sdk/components/pipette_module/pipette_ctrl_module.cpp @@ -25,14 +25,18 @@ void PipetteModule::initialize(int32_t id, hardward_config_t *hardwaredcfg) { / m_zm->getGState(); // 读取状态,清空下复位标识 m_piette_gun_io1.initAsInput(hardwaredcfg->IO1, ZGPIO::kMode_pullup, ZGPIO::kIRQ_noIrq, hardwaredcfg->IO1Mirror); - // 设置泵机压力数据流走232 - // m_smtp2.pump_reset(); + ZASSERT(hardwaredcfg->uart232); + EXHAL_UART_BindUart("pipette-uart232", hardwaredcfg->uart232); + EXHAL_UART_RegListener(hardwaredcfg->uart232, [this](UART_HandleTypeDef *huart, uint8_t *data, size_t len) { // + smtpPressureStreamProcesser.process_rx(data[0]); + }); + EXHAL_UART_ITStartAutoReadOneByte(hardwaredcfg->uart232); + osDelay(1000); - // m_smtp2.sendcmd_direct("/1f0R\r"); m_smtp2.pump_set_pressure_data_stream_port(1); - // 测试泵机连接性 - test_connectivity(); - // 参数初始化 + m_smtp2.pump_reset(); + osDelay(1000); + parameter_init(); // 同步参数到步进电机 zm_sync_base_cfg(); @@ -42,54 +46,9 @@ void PipetteModule::initialize(int32_t id, hardward_config_t *hardwaredcfg) { / // 上报压力流 ! 不能一直打开压力流,一直打开压力流,会导致SMTP2无法响应其他命令 // m_smtp2.sendcmd_direct("/1f1f0R\r"); - ZASSERT(hardwaredcfg->uart232); - EXHAL_UART_BindUart("pipette-uart232", hardwaredcfg->uart232); - EXHAL_UART_RegListener(hardwaredcfg->uart232, [this](UART_HandleTypeDef *huart, uint8_t *data, size_t len) { // - smtpPressureStreamProcesser.process_rx(data[0]); - }); - EXHAL_UART_ITStartAutoReadOneByte(hardwaredcfg->uart232); } -void PipetteModule::test_connectivity() { - bool io1_connected = false; - bool io1_reverse = false; - bool uart485_connected = false; - bool uart232_connected = false; - - uart485_connected = m_smtp2.pump_ping(); - - //! 测试IO1是否联通 - if (uart485_connected) { - // 设置IO1为通用输出模式 - m_smtp2.pump_set_io1_mode(2); - - // 设置IO1为低电平 - m_smtp2.pump_set_io1_state(0); - osDelay(2); - bool io1_state1 = m_piette_gun_io1.getState(); - - // 设置IO1为高电平 - m_smtp2.pump_set_io1_state(1); // lld输入高 - osDelay(2); - bool io1_state2 = m_piette_gun_io1.getState(); - io1_connected = (!io1_state1 && io1_state2) || (io1_state1 && !io1_state2); - io1_reverse = io1_state1 && !io1_state2; - } - - //! 测试232是否联通 - uart232_connected = false; - - ZLOGI(TAG, "===================== connectivity test report =========================="); - ZLOGI(TAG, "= uart485_connected :%d", uart485_connected); - ZLOGI(TAG, "= io1_connected :%d(%s)", io1_connected, io1_reverse ? "Err:Reverse" : ""); - ZLOGI(TAG, "= uart232_connected :%d", uart232_connected); - ZLOGI(TAG, "="); - - m_state.test_pipette_io1_connected = io1_connected; - m_state.test_pipette_io1_reverse = io1_reverse; - m_state.test_pipette_uart485_connected = uart485_connected; - m_state.test_pipette_uart232_connected = uart232_connected; -} +void PipetteModule::test_connectivity() {} int32_t PipetteModule::module_stop() { m_thread.stop(); diff --git a/sdk/components/pipette_module/pipette_ctrl_module.hpp b/sdk/components/pipette_module/pipette_ctrl_module.hpp index c307d0d..e9ac5f7 100644 --- a/sdk/components/pipette_module/pipette_ctrl_module.hpp +++ b/sdk/components/pipette_module/pipette_ctrl_module.hpp @@ -334,6 +334,8 @@ class PipetteModule : public ZIModule { virtual int32_t pipette_test_move_to_pierce_pos(int32_t container_pos, int32_t container_cpyid); virtual int32_t pipette_test_move_to_lld_end_pos(int32_t container_pos, int32_t container_cpyid); + virtual int32_t pipette_test_connectivity(); + int32_t get_zmotor_standby_pos() { return 0 + zmbcfg.dzero - zmbcfg.io_trigger_append_distance; } /*********************************************************************************************************************** * Utils * diff --git a/sdk/components/pipette_module/pipette_ctrl_module_test.cpp b/sdk/components/pipette_module/pipette_ctrl_module_test.cpp index 3dcfb39..c92fb91 100644 --- a/sdk/components/pipette_module/pipette_ctrl_module_test.cpp +++ b/sdk/components/pipette_module/pipette_ctrl_module_test.cpp @@ -136,3 +136,56 @@ int32_t PipetteModule::pipette_test_move_to_lld_end_pos(int32_t container_pos, i }); return 0; } + +int32_t PipetteModule::pipette_test_connectivity() { + bool io1_connected = false; + bool io1_reverse = false; + bool uart485_connected = false; + bool uart232_connected = false; + + m_smtp2.pump_set_pressure_data_stream_port(0); + m_smtp2.pump_reset(); + osDelay(1000); + + uart485_connected = m_smtp2.pump_ping(); + + //! 测试IO1是否联通 + if (uart485_connected) { + // 设置IO1为通用输出模式 + m_smtp2.pump_set_io1_mode(2); + + // 设置IO1为低电平 + m_smtp2.pump_set_io1_state(0); + osDelay(2); + bool io1_state1 = m_piette_gun_io1.getState(); + + // 设置IO1为高电平 + m_smtp2.pump_set_io1_state(1); // lld输入高 + osDelay(2); + bool io1_state2 = m_piette_gun_io1.getState(); + io1_connected = (!io1_state1 && io1_state2) || (io1_state1 && !io1_state2); + io1_reverse = io1_state1 && !io1_state2; + } + + //! 测试232是否联通 + if (smtpPressureStreamProcesser.hasRxSomeCmd()) { + uart232_connected = true; + } else { + uart232_connected = false; + } + + ZLOGI(TAG, "===================== connectivity test report =========================="); + ZLOGI(TAG, "= uart485_connected :%d", uart485_connected); + ZLOGI(TAG, "= io1_connected :%d(%s)", io1_connected, io1_reverse ? "Err:Reverse" : ""); + ZLOGI(TAG, "= uart232_connected :%d", uart232_connected); + ZLOGI(TAG, "="); + + m_state.test_pipette_io1_connected = io1_connected; + m_state.test_pipette_io1_reverse = io1_reverse; + m_state.test_pipette_uart485_connected = uart485_connected; + m_state.test_pipette_uart232_connected = uart232_connected; + + m_smtp2.pump_set_pressure_data_stream_port(1); // 恢复232输出 + m_smtp2.pump_reset(); + return 0; +} diff --git a/sdk/components/sensors/smtp2_v2/smtp2_v2.cpp b/sdk/components/sensors/smtp2_v2/smtp2_v2.cpp index 1b4270a..8fec5b1 100644 --- a/sdk/components/sensors/smtp2_v2/smtp2_v2.cpp +++ b/sdk/components/sensors/smtp2_v2/smtp2_v2.cpp @@ -112,6 +112,11 @@ int32_t SMTP2V2::pump_init() { ZLOGI(TAG, "pump_init"); return runaction(true, "/1ZR\r"); } +int32_t SMTP2V2::pump_init_with_pressure() { + ZLOGI(TAG, "pump_init"); + return runaction(true, "/1f1Zf0R\r"); +} + int32_t SMTP2V2::pump_put_tip() { ZLOGI(TAG, "pump_put_tip"); return runaction(true, "/1E0R\r"); @@ -263,7 +268,7 @@ int32_t SMTP2V2::pump_aspirate_plld(int32_t pressure_threshold, VelCfg* vcfg) { // return runaction(true, "/1N2L%d,%dv%dc%dV%df1t%d,1f0R\r", // // vcfg->acc, vcfg->dec, vcfg->vstart * 1000, vcfg->vstop * 1000, vcfg->vmax * 1000, // // pressure_threshold); - return runaction(true, "/1N2L%d,%dv%dc%dV%dt%d,1R\r", // + return runaction(true, "/1N2L%d,%dv%dc%dV%dt%d,1R\r", // vcfg->acc, vcfg->dec, vcfg->vstart * 1000, vcfg->vstop * 1000, vcfg->vmax * 1000, // pressure_threshold); } diff --git a/sdk/components/sensors/smtp2_v2/smtp2_v2.hpp b/sdk/components/sensors/smtp2_v2/smtp2_v2.hpp index 2f6f329..b9054b9 100644 --- a/sdk/components/sensors/smtp2_v2/smtp2_v2.hpp +++ b/sdk/components/sensors/smtp2_v2/smtp2_v2.hpp @@ -228,6 +228,7 @@ class SMTP2V2 { * ACTION * ***********************************************************************************************************************/ int32_t pump_init(); // 泵机初始化(归零) + int32_t pump_init_with_pressure(); // 泵机初始化(归零) int32_t pump_put_tip(); // 丢弃TIP int32_t pump_factory_reset(); // 泵机复位 int32_t pump_reset(); // 泵机复位 diff --git a/sdk/components/sensors/smtp2_v2/smtp_pressure_stream_processer.hpp b/sdk/components/sensors/smtp2_v2/smtp_pressure_stream_processer.hpp index 8fdda79..556d7b7 100644 --- a/sdk/components/sensors/smtp2_v2/smtp_pressure_stream_processer.hpp +++ b/sdk/components/sensors/smtp2_v2/smtp_pressure_stream_processer.hpp @@ -15,7 +15,8 @@ class SmtpPressureStreamProcesser { char m_state = '`'; int32_t m_pressure = 0; char m_pressure_cache[10]; - int32_t m_pressure_uuid = 0; + int32_t m_pressure_uuid = 0; + bool m_has_rx_some_cmd = false; public: void process_rx(char data) { @@ -26,6 +27,10 @@ class SmtpPressureStreamProcesser { m_rxbuf[m_rxnum] = data; m_rxnum++; + if (m_rxbuf[m_rxnum - 1] == 0x0d) { + m_has_rx_some_cmd = true; + } + if (m_rxbuf[m_rxnum - 1] == 0x0a && m_rxbuf[m_rxnum - 2] == 0x0d && m_rxbuf[1] == '0') { if ((m_rxnum - 6) != 4) return; @@ -69,5 +74,6 @@ class SmtpPressureStreamProcesser { __enable_irq(); return ret; } + bool hasRxSomeCmd() const { return m_has_rx_some_cmd; } }; } // namespace iflytop diff --git a/sdk/components/zcan_protocol_parser/zcan_protocol_parser.cpp b/sdk/components/zcan_protocol_parser/zcan_protocol_parser.cpp index a644124..a92b14e 100644 --- a/sdk/components/zcan_protocol_parser/zcan_protocol_parser.cpp +++ b/sdk/components/zcan_protocol_parser/zcan_protocol_parser.cpp @@ -213,6 +213,7 @@ void ZCanProtocolParser::initialize(ZCanReceiver* cancmder) { REGFN(pipette_test_move_to_fix_water_level_pos); REGFN(pipette_test_move_to_pierce_pos); REGFN(pipette_test_move_to_lld_end_pos); + REGFN(pipette_test_connectivity); } void ZCanProtocolParser::_registerModule(uint16_t id, ZIModule* module) { m_modulers[id] = module; } void ZCanProtocolParser::registerModule(ZIModule* module) { _registerModule(module->getid(), module); } @@ -1248,6 +1249,11 @@ int32_t ZCanProtocolParser::pipette_test_move_to_lld_end_pos(cmdcontxt_t* cxt) { CHECK_AND_GET_MODULE(2); return module->pipette_test_move_to_lld_end_pos(cxt->params[0], cxt->params[1]); } +int32_t ZCanProtocolParser::pipette_test_connectivity(cmdcontxt_t* cxt) { + CHECK_AND_GET_MODULE(0); + return module->pipette_test_connectivity(); +} + // pipette_zmotor_move_to_tip_deposit int32_t ZCanProtocolParser::pipette_zmotor_move_to_tip_deposit(cmdcontxt_t* cxt) { CHECK_AND_GET_MODULE(0); diff --git a/sdk/components/zcan_protocol_parser/zcan_protocol_parser.hpp b/sdk/components/zcan_protocol_parser/zcan_protocol_parser.hpp index 82ba540..382acd8 100644 --- a/sdk/components/zcan_protocol_parser/zcan_protocol_parser.hpp +++ b/sdk/components/zcan_protocol_parser/zcan_protocol_parser.hpp @@ -236,6 +236,7 @@ class ZCanProtocolParser : public IZCanRxProcesser { CMDFN(pipette_test_move_to_pierce_pos); CMDFN(pipette_test_move_to_lld_end_pos); CMDFN(pipette_zmotor_move_to_tip_deposit); + CMDFN(pipette_test_connectivity); }; diff --git a/usrc/a8000_protocol/protocol/cmdid.hpp b/usrc/a8000_protocol/protocol/cmdid.hpp index e4deaf5..c78a7ba 100644 --- a/usrc/a8000_protocol/protocol/cmdid.hpp +++ b/usrc/a8000_protocol/protocol/cmdid.hpp @@ -192,7 +192,7 @@ typedef enum { kpipette_test_move_to_fix_water_level_pos = 0x7608, // int32_t container_pos, int32_t container_cpyid, kpipette_test_move_to_pierce_pos = 0x7609, // int32_t container_pos, int32_t container_cpyid, kpipette_test_move_to_lld_end_pos = 0x760A, // int32_t container_pos, int32_t container_cpyid, - + kpipette_test_connectivity = 0x760B, // 测试电缆连接性 {}, ack:{} } cmdid_t; typedef struct { diff --git a/usrc/version.h b/usrc/version.h index 29843a0..c83c8cc 100644 --- a/usrc/version.h +++ b/usrc/version.h @@ -1,2 +1,2 @@ #pragma once -#define APP_VERSION 1208 +#define APP_VERSION 1209