Browse Source

v604

master
zhaohe 8 months ago
parent
commit
67a440b434
  1. 2
      a8000_protocol
  2. 42
      sdk/components/pipette_module/pipette_ctrl_module_v2.cpp
  3. 8
      sdk/components/pipette_module/pipette_ctrl_module_v2.hpp
  4. 20
      sdk/components/sensors/smtp2_v2/smtp2_v2.cpp
  5. 142
      sdk/components/zcancmder/zcan_protocol_parser.cpp
  6. 3
      sdk/components/zcancmder/zcan_protocol_parser.hpp
  7. 2
      usrc/project_configs.h

2
a8000_protocol

@ -1 +1 @@
Subproject commit d80b7654e9b5343d12f15755a4f8e6b1f98e135a
Subproject commit 70de85131a9ed15cbd296a887a180267b46fd114

42
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;

8
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 *
***********************************************************************************************************************/

20
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); }

142
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

3
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

2
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

Loading…
Cancel
Save