diff --git a/a8000_protocol b/a8000_protocol index d80b765..70de851 160000 --- a/a8000_protocol +++ b/a8000_protocol @@ -1 +1 @@ -Subproject commit d80b7654e9b5343d12f15755a4f8e6b1f98e135a +Subproject commit 70de85131a9ed15cbd296a887a180267b46fd114 diff --git a/sdk/components/pipette_module/pipette_ctrl_module_v2.cpp b/sdk/components/pipette_module/pipette_ctrl_module_v2.cpp index 06eb879..990fb27 100644 --- a/sdk/components/pipette_module/pipette_ctrl_module_v2.cpp +++ b/sdk/components/pipette_module/pipette_ctrl_module_v2.cpp @@ -69,7 +69,7 @@ void PipetteModuleV2::initialize(int32_t id, config_t *config, hardward_config_t } void PipetteModuleV2::create_default_cfg(config_t *defaultcfg) { - defaultcfg->limit_ul = 250; + // defaultcfg->limit_ul = 250; defaultcfg->pump_acc = 18; defaultcfg->pump_dec = 18; defaultcfg->pump_vstart = 200; @@ -155,7 +155,7 @@ int32_t PipetteModuleV2::module_xxx_reg_impl(int32_t param_id, bool read, int32_ /*********************************************************************************************************************** * CFG * ***********************************************************************************************************************/ - XXX_CFG_REG(limit_ul); + // XXX_CFG_REG(limit_ul); XXX_CFG_REG(pump_acc); XXX_CFG_REG(pump_dec); XXX_CFG_REG(pump_vstart); @@ -677,7 +677,7 @@ int32_t PipetteModuleV2::pipette_get_aspirate_infer_eigen_time_result(int32_t *r int32_t PipetteModuleV2::pipette_pump_move_to(int32_t pumpv, int32_t ul) { THREAD_START_WORK([this, pumpv, ul]() { - DO_IN_THREAD(m_smtp2.pump_aspirate(pumpv, ul)); + DO_IN_THREAD(m_smtp2.pump_move_to_ul(pumpv, ul)); pump_waitfor_stop(); m_smtp2.pump_stop(); }); @@ -708,18 +708,13 @@ int32_t PipetteModuleV2::pipette_lld(int32_t lldtype, int32_t maxzpos, int32_t c // 1. 泵机移动到0位 DO_IN_THREAD(m_smtp2.pump_distribut_all(m_cfg.pump_vmax)); + pump_waitfor_stop(); // 2. 读取初值 DO_IN_THREAD(m_smtp2.pump_get_capacitance(&start_capacitance)); DO_IN_THREAD(m_smtp2.pump_get_pressure(&start_pressure)); start_motor_pos = m_zm->getXACTUAL(); - // 先分配一点体积,消除一些误差。 - // ZLOGI(TAG, "start lld before distribut %d ul", m_cfg.lld_prepare_pre_distribut_ul); - // DO_IN_THREAD(m_smtp2.pump_aspirate(m_cfg.pump_vmax, -m_cfg.lld_prepare_pre_distribut_ul)); - // pump_waitfor_stop(); - // ZLOGI(TAG, "lld before distribut ok"); - ZLOGI(TAG, "start lld"); if (lldtype == kclld) { DO_IN_THREAD(m_smtp2.pump_clld(c_threshold)); @@ -777,6 +772,11 @@ int32_t PipetteModuleV2::pipette_lld(int32_t lldtype, int32_t maxzpos, int32_t c return 0; } +int32_t PipetteModuleV2::pipette_lld_is_detect_liquid(int32_t *detect) { + *detect = m_state.detected_liquid; + return 0; +} + int32_t PipetteModuleV2::pipette_aspirate(int32_t llfrpm, int32_t llftpos, int32_t pumpv, int32_t ul) { // pipette_aspirate if (ul < 0) { @@ -784,11 +784,6 @@ int32_t PipetteModuleV2::pipette_aspirate(int32_t llfrpm, int32_t llftpos, int32 return err::kparam_out_of_range; } - if (ul > m_cfg.limit_ul) { - ZLOGE(TAG, "pipette_aspirate %d fail , final ul (%d)> limit ul %d", ul, ul, m_cfg.limit_ul); - return err::kparam_out_of_range; - } - THREAD_START_WORK([this, llfrpm, llftpos, pumpv, ul]() { DO_IN_THREAD(m_smtp2.pump_aspirate(pumpv, ul)); @@ -869,6 +864,23 @@ int32_t PipetteModuleV2::pipette_shake_up(int32_t llfrpm, int32_t maxzpos, int32 return 0; } +int32_t PipetteModuleV2::pipette_clear_hanging_liquid(int32_t repeat_times) { + // llf_startz + // llf_endz + THREAD_START_WORK([this, repeat_times]() { + for (int i = 0; i < repeat_times; i++) { + m_smtp2.pump_move_to_ul(m_cfg.pump_vmax, 0); + pump_waitfor_stop(); + + m_smtp2.pump_move_to_ul(m_cfg.pump_vmax, 50); + pump_waitfor_stop(); + } + m_smtp2.pump_move_to_ul(m_cfg.pump_vmax, 0); + pump_waitfor_stop(); + }); + return 0; +} + /*********************************************************************************************************************** * EXT_API_UTILS * ***********************************************************************************************************************/ @@ -1203,8 +1215,6 @@ int32_t PipetteModuleV2::bfcall(int32_t cmdid, uint8_t *param, int32_t len) { if (cmdid == kpipette_zmotor_measure_distance) goto check_motor_is_enable; if (cmdid == kpipette_zmotor_move_to) goto check_motor_has_moveto_zero; - - if (cmdid == kpipette_init_device) goto suc; if (cmdid == kpipette_put_tip) goto suc; if (cmdid == kpipette_pump_move_to) goto suc; diff --git a/sdk/components/pipette_module/pipette_ctrl_module_v2.hpp b/sdk/components/pipette_module/pipette_ctrl_module_v2.hpp index c27fd39..ea908a5 100644 --- a/sdk/components/pipette_module/pipette_ctrl_module_v2.hpp +++ b/sdk/components/pipette_module/pipette_ctrl_module_v2.hpp @@ -52,7 +52,7 @@ class PipetteModuleV2 : public ZIModule { } snesor_sample_data_t; typedef struct { - int32_t limit_ul; // 泵机限制 + // int32_t limit_ul; // 泵机限制 int32_t pump_acc; // 泵机速度参数 int32_t pump_dec; // 泵机速度参数 int32_t pump_vstart; // 泵机速度参数 @@ -98,7 +98,7 @@ class PipetteModuleV2 : public ZIModule { } config_t; typedef struct { - int32_t enable; // 电机使能 + int32_t enable; // 电机使能 int32_t pipette_is_inited; // 泵机是否初始化 int32_t dul; // 吸吐变化量 int32_t detected_liquid; // 检测到液面 @@ -173,10 +173,12 @@ class PipetteModuleV2 : public ZIModule { virtual int32_t pipette_put_tip(); virtual int32_t pipette_pump_move_to(int32_t pumpv, int32_t ul); virtual int32_t pipette_lld(int32_t lldtype, int32_t maxzpos, int32_t c_threshold, int32_t p_threshold); + virtual int32_t pipette_lld_is_detect_liquid(int32_t *detect); + virtual int32_t pipette_aspirate(int32_t llfrpm, int32_t llftpos, int32_t pumpv, int32_t ul); virtual int32_t pipette_distribu(int32_t llfrpm, int32_t pumpv, int32_t ul); virtual int32_t pipette_shake_up(int32_t llfrpm, int32_t maxzpos, int32_t pumpv, int32_t ul, int32_t times); - + virtual int32_t pipette_clear_hanging_liquid(int32_t repeat_times); /*********************************************************************************************************************** * READ_STATE * ***********************************************************************************************************************/ diff --git a/sdk/components/sensors/smtp2_v2/smtp2_v2.cpp b/sdk/components/sensors/smtp2_v2/smtp2_v2.cpp index f13853f..ba6ee98 100644 --- a/sdk/components/sensors/smtp2_v2/smtp2_v2.cpp +++ b/sdk/components/sensors/smtp2_v2/smtp2_v2.cpp @@ -66,10 +66,22 @@ int32_t SMTP2V2::pump_get_ul(int32_t* ul) { return ret; } -int32_t SMTP2V2::pump_set_io1_mode(int32_t mode) { return setstate(true, "/1u%d,%dR\r", kcfg_io1_mode, mode); } -int32_t SMTP2V2::pump_set_io2_mode(int32_t mode) { return setstate(true, "/1u%d,%dR\r", kcfg_io2_mode, mode); } -int32_t SMTP2V2::pump_set_tip_size(int32_t size) { return setstate(true, "/1u%d,%dR\r", kcfg_tip_size, size); } -int32_t SMTP2V2::pump_enable_temp_compensation(int32_t enable) { return setstate(true, "/1u%d,%dR\r", kcfg_auto_temp_compensation, enable); } +int32_t SMTP2V2::pump_set_io1_mode(int32_t mode) { + ZLOGI(TAG, "pump_set_io1_mode %d", mode); + return setstate(true, "/1u%d,%dR\r", kcfg_io1_mode, mode); +} +int32_t SMTP2V2::pump_set_io2_mode(int32_t mode) { + ZLOGI(TAG, "pump_set_io2_mode %d", mode); + return setstate(true, "/1u%d,%dR\r", kcfg_io2_mode, mode); +} +int32_t SMTP2V2::pump_set_tip_size(int32_t size) { + ZLOGI(TAG, "pump_set_tip_size %d", size); + return setstate(true, "/1u%d,%dR\r", kcfg_tip_size, size); +} +int32_t SMTP2V2::pump_enable_temp_compensation(int32_t enable) { + ZLOGI(TAG, "pump_enable_temp_compensation %d", enable); + return setstate(true, "/1u%d,%dR\r", kcfg_auto_temp_compensation, enable); +} int32_t SMTP2V2::pump_stop() { return setstate(true, "/1TR\r"); } int32_t SMTP2V2::pump_set_vstart(int32_t vel) { return setstate(true, "/1N2v%dR\r", vel * 319); } diff --git a/sdk/components/zcancmder/zcan_protocol_parser.cpp b/sdk/components/zcancmder/zcan_protocol_parser.cpp index eec6836..2f5f94f 100644 --- a/sdk/components/zcancmder/zcan_protocol_parser.cpp +++ b/sdk/components/zcancmder/zcan_protocol_parser.cpp @@ -166,6 +166,8 @@ void ZCanProtocolParser::initialize(IZCanReceiver* cancmder) { 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); @@ -915,150 +917,16 @@ int32_t ZCanProtocolParser::pipette_zmotor_read_dev_status_cache(cmdcontxt_t* cx cxt->acklen = 4; return module->pipette_zmotor_read_dev_status_cache(&ack[0]); } - -#if 0 -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_lld_prepare(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(0); - return module->pipette_lld_prepare(); -} -int32_t ZCanProtocolParser::pipette_lld(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(0); - return module->pipette_lld(); -} -int32_t ZCanProtocolParser::pipette_aspirate_prepare(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(0); - return module->pipette_aspirate_prepare(); -} -int32_t ZCanProtocolParser::pipette_set_llf_velocity(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(1); - return module->pipette_set_llf_velocity(cxt->params[0]); -} -int32_t ZCanProtocolParser::pipette_set_aspirate_operation_verifi_p_thre(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(1); - return module->pipette_set_aspirate_operation_verifi_p_thre(cxt->params[0]); -} -int32_t ZCanProtocolParser::pipette_set_aspirate_operation_verifi_eigen_time(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(1); - return module->pipette_set_aspirate_operation_verifi_eigen_time(cxt->params[0]); -} -int32_t ZCanProtocolParser::pipette_set_aspirate_operation_verifi_tolerance(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(1); - return module->pipette_set_aspirate_operation_verifi_tolerance(cxt->params[0]); -} -int32_t ZCanProtocolParser::pipette_aspirate(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(1); - return module->pipette_aspirate(cxt->params[0]); -} -int32_t ZCanProtocolParser::pipette_aspirate_and_verify(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(1); - return module->pipette_aspirate_and_verify(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]); -} -int32_t ZCanProtocolParser::pipette_aspirate_infer_pressure(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(1); - return module->pipette_aspirate_infer_pressure(cxt->params[0]); -} -int32_t ZCanProtocolParser::pipette_aspirate_infer_eigen_time(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(1); - return module->pipette_aspirate_infer_eigen_time(cxt->params[0]); -} -int32_t ZCanProtocolParser::pipette_get_aspirate_infer_pressure_result(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(0); - int32_t* ack = (int32_t*)cxt->ackbuf; - cxt->acklen = 4; - return module->pipette_get_aspirate_infer_pressure_result(&ack[0]); -} -int32_t ZCanProtocolParser::pipette_get_aspirate_infer_eigen_time_result(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(0); - int32_t* ack = (int32_t*)cxt->ackbuf; - cxt->acklen = 4; - return module->pipette_get_aspirate_infer_eigen_time_result(&ack[0]); -} -int32_t ZCanProtocolParser::pipette_get_sensor_sample_data(cmdcontxt_t* cxt) { +int32_t ZCanProtocolParser::pipette_clear_hanging_liquid(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]); + 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]); } -// pipette_lld_test -int32_t ZCanProtocolParser::pipette_lld_test(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(0); - return module->pipette_lld_test(); -} - -int32_t ZCanProtocolParser::pipette_set_lld_startz(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(1); - return module->pipette_set_lld_startz(cxt->params[0]); -} - -int32_t ZCanProtocolParser::pipette_set_lld_endz(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(1); - return module->pipette_set_lld_endz(cxt->params[0]); -} - -int32_t ZCanProtocolParser::pipette_set_lld_type(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(1); - return module->pipette_set_lld_type(cxt->params[0]); -} - -int32_t ZCanProtocolParser::pipette_set_lld_c_threshold(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(1); - return module->pipette_set_lld_c_threshold(cxt->params[0]); -} - -int32_t ZCanProtocolParser::pipette_set_lld_p_threshold(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(1); - return module->pipette_set_lld_p_threshold(cxt->params[0]); -} - -int32_t ZCanProtocolParser::pipette_set_llf_startz(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(1); - return module->pipette_set_llf_startz(cxt->params[0]); -} -int32_t ZCanProtocolParser::pipette_set_llf_endz(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(1); - return module->pipette_set_llf_endz(cxt->params[0]); -} -// pipette_clear_hanging_liquid -int32_t ZCanProtocolParser::pipette_clear_hanging_liquid(cmdcontxt_t* cxt) { - CHECK_AND_GET_MODULE(1); - return module->pipette_clear_hanging_liquid(cxt->params[0]); -} -#endif #undef MODULE_CLASS \ No newline at end of file diff --git a/sdk/components/zcancmder/zcan_protocol_parser.hpp b/sdk/components/zcancmder/zcan_protocol_parser.hpp index b83ff02..bc13bd4 100644 --- a/sdk/components/zcancmder/zcan_protocol_parser.hpp +++ b/sdk/components/zcancmder/zcan_protocol_parser.hpp @@ -180,11 +180,12 @@ class ZCanProtocolParser : public IZCanReceiverListener { 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/usrc/project_configs.h b/usrc/project_configs.h index 9f75fbb..5edb9df 100644 --- a/usrc/project_configs.h +++ b/usrc/project_configs.h @@ -1,5 +1,5 @@ #pragma once -#define PC_VERSION 603 +#define PC_VERSION 604 #define PC_MANUFACTURER "http://www.iflytop.com/" #define PC_PROJECT_NAME "a8000_subboard" #define PC_IFLYTOP_ENABLE_OS 1