|
|
@ -193,25 +193,17 @@ int32_t PipetteModule::pipette_zmotor_move_to_zero_point_quick() { |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
int32_t PipetteModule::pipette_pump_init_device(int32_t param__platinfo_cpyid) { |
|
|
|
thread_start_work(__FUNCTION__, [this, param__platinfo_cpyid]() { |
|
|
|
ZLOGI(TAG, "pipette_pump_init_device param__platinfo_cpyid: %d", param__platinfo_cpyid); |
|
|
|
|
|
|
|
int32_t platinfo_cpyid_setval = param__platinfo_cpyid; |
|
|
|
|
|
|
|
if (platinfo_cpyid_setval < 0) { |
|
|
|
platinfo_cpyid_setval = m_common_cfg.platform_info_cpyid; |
|
|
|
ZLOGI(TAG, "pipette_pump_init_device use common_cfg platinfo_cpyid: %d", platinfo_cpyid_setval); |
|
|
|
} |
|
|
|
int32_t PipetteModule::pipette_pump_init_device() { |
|
|
|
thread_start_work(__FUNCTION__, [this]() { |
|
|
|
ZLOGI(TAG, "pipette_pump_init_device use platinfo_cpyid: %d", m_common_cfg.platform_info_cpyid); |
|
|
|
|
|
|
|
check_platinfo_cpyid(platinfo_cpyid_setval); |
|
|
|
check_platinfo_cpyid(m_common_cfg.platform_info_cpyid); |
|
|
|
|
|
|
|
pump_apply_vcfg(kpm_v_max); // 默认配置
|
|
|
|
DO_IN_THREAD(m_smtp2.pump_init()); |
|
|
|
pump_waitfor_stop(); |
|
|
|
|
|
|
|
m_state.platinfo_cpyid = platinfo_cpyid_setval; |
|
|
|
platinfo_t *platform_info = get_platinfo_smart(m_state.platinfo_cpyid, &m_now_platinfo); |
|
|
|
platinfo_t *platform_info = get_platinfo_smart(m_common_cfg.platform_info_cpyid, &m_now_platinfo); |
|
|
|
clearPipetteGunState(); |
|
|
|
}); |
|
|
|
return 0; |
|
|
@ -228,7 +220,7 @@ int32_t PipetteModule::pipette_pump_take_tip() { |
|
|
|
* -> 直到tip状态被触发停止移动 |
|
|
|
*/ |
|
|
|
|
|
|
|
platinfo_t *platform_info = get_platinfo_smart(m_state.platinfo_cpyid, &m_now_platinfo); |
|
|
|
platinfo_t *platform_info = get_platinfo_smart(m_common_cfg.platform_info_cpyid, &m_now_platinfo); |
|
|
|
zm_move_to_block(platform_info->tip_picking_pos, kzm_v_default, 0); |
|
|
|
zm_move_by(platform_info->tip_picking_search_range, kzm_v_picking_tip, 0); |
|
|
|
bool takeTip = false; |
|
|
@ -241,10 +233,15 @@ int32_t PipetteModule::pipette_pump_take_tip() { |
|
|
|
break; |
|
|
|
} |
|
|
|
if (m_zm->isStoped()) break; |
|
|
|
ZLOGI(TAG, "wait for tip state trigger , %d", tipstate); |
|
|
|
thread_delay(1); |
|
|
|
} |
|
|
|
if (takeTip && platform_info->tip_picking_append_distance > 0) //
|
|
|
|
|
|
|
|
if (takeTip && platform_info->tip_picking_append_distance > 0) { |
|
|
|
ZLOGI(TAG, "wait for tip stable, append distance:%d", platform_info->tip_picking_append_distance); |
|
|
|
zm_move_by_block(platform_info->tip_picking_append_distance, kzm_v_picking_tip, 0); |
|
|
|
thread_delay(platform_info->tip_picking_settling_time); // 等待tip稳定
|
|
|
|
} |
|
|
|
|
|
|
|
// 移动到tip搜索位置,检查tip是否存在,如果不存在,则强制退tip一次
|
|
|
|
if (takeTip) { |
|
|
@ -252,6 +249,8 @@ int32_t PipetteModule::pipette_pump_take_tip() { |
|
|
|
for (int i = 0; i < 3; i++) { |
|
|
|
DO_IN_THREAD(m_smtp2.pump_get_tip_state(&tipstate)); |
|
|
|
if (tipstate == 0) { |
|
|
|
ZLOGI(TAG, "pipette_pump_take_tip tip is not exist, force put bak tip again"); |
|
|
|
pump_apply_vcfg(kpm_v_max); //
|
|
|
|
DO_IN_THREAD(m_smtp2.pump_init()); // 强制退tip
|
|
|
|
takeTip = false; |
|
|
|
break; |
|
|
@ -260,6 +259,7 @@ int32_t PipetteModule::pipette_pump_take_tip() { |
|
|
|
} |
|
|
|
|
|
|
|
zm_move_to_zero_quick_block(); |
|
|
|
pump_waitfor_stop(); |
|
|
|
ZLOGI(TAG, "pipette_pump_take_tip takeTip %s", takeTip ? "suc" : "fail"); |
|
|
|
}); |
|
|
|
return 0; |
|
|
@ -275,7 +275,7 @@ int32_t PipetteModule::pipette_pump_putbak_tip() { |
|
|
|
* -> 丢tip |
|
|
|
*/ |
|
|
|
|
|
|
|
platinfo_t *platform_info = get_platinfo_smart(m_state.platinfo_cpyid, &m_now_platinfo); |
|
|
|
platinfo_t *platform_info = get_platinfo_smart(m_common_cfg.platform_info_cpyid, &m_now_platinfo); |
|
|
|
int32_t putbakpos = platform_info->tip_picking_pos - 100; |
|
|
|
if (putbakpos < 0) putbakpos = 0; |
|
|
|
zm_move_to_block(putbakpos, kzm_v_default, 0); |
|
|
@ -303,7 +303,7 @@ int32_t PipetteModule::pipette_pump_deposit_tip() { |
|
|
|
* -> 丢tip |
|
|
|
*/ |
|
|
|
|
|
|
|
platinfo_t *platform_info = get_platinfo_smart(m_state.platinfo_cpyid, &m_now_platinfo); |
|
|
|
platinfo_t *platform_info = get_platinfo_smart(m_common_cfg.platform_info_cpyid, &m_now_platinfo); |
|
|
|
zm_move_to_block(platform_info->tip_deposit_pos, kzm_v_default, 0); |
|
|
|
|
|
|
|
pump_apply_vcfg(kpm_v_max); //
|
|
|
@ -319,13 +319,13 @@ int32_t PipetteModule::pipette_pump_deposit_tip() { |
|
|
|
return 0; |
|
|
|
} |
|
|
|
int32_t PipetteModule::pipette_pump_pierce_through(int32_t container_info_index, int32_t container_pos) { |
|
|
|
adjust_container_pos(&container_pos, m_state.platinfo_cpyid); |
|
|
|
adjust_container_pos(&container_pos, m_common_cfg.platform_info_cpyid); |
|
|
|
|
|
|
|
thread_start_work(__FUNCTION__, [this, container_info_index, container_pos]() { |
|
|
|
// check param
|
|
|
|
check_container_info_cpyid(container_info_index); |
|
|
|
|
|
|
|
platinfo_t *platform_info = get_platinfo_smart(m_state.platinfo_cpyid, &m_now_platinfo); |
|
|
|
platinfo_t *platform_info = get_platinfo_smart(m_common_cfg.platform_info_cpyid, &m_now_platinfo); |
|
|
|
container_info_t *container_info = get_container_info_smart(container_info_index, &m_now_container_info); |
|
|
|
|
|
|
|
zm_move_to_block(container_info->pierce_depth + container_pos, kzm_v_default, 0); |
|
|
@ -389,7 +389,7 @@ int32_t PipetteModule::pipette_pump_aspirate() { |
|
|
|
DO_IN_THREAD(m_smtp2.pump_set_io1_mode(0)); // lld输入高
|
|
|
|
// DO_IN_THREAD(m_smtp2.pump_set_io2_mode(0)); // 通用输入
|
|
|
|
|
|
|
|
platinfo_t *platform_info = get_platinfo_smart(m_state.platinfo_cpyid, &m_now_platinfo); |
|
|
|
platinfo_t *platform_info = get_platinfo_smart(m_common_cfg.platform_info_cpyid, &m_now_platinfo); |
|
|
|
liquid_info_t *liquidinfo = get_liquid_info_smart(acfg->liquid_cfg_index, &m_now_liquid_info); |
|
|
|
container_info_t *container_cfg = get_container_info_smart(acfg->container_info_index, &m_now_container_info); |
|
|
|
|
|
|
@ -400,7 +400,7 @@ int32_t PipetteModule::pipette_pump_aspirate() { |
|
|
|
|
|
|
|
clearPipetteGunState(); |
|
|
|
zm_move_to_zero_quick_block(); |
|
|
|
adjust_container_pos(&acfg->container_pos, m_state.platinfo_cpyid); |
|
|
|
adjust_container_pos(&acfg->container_pos, m_common_cfg.platform_info_cpyid); |
|
|
|
|
|
|
|
if (acfg->lld_enable) { |
|
|
|
_do_lld(acfg->container_pos, platform_info, container_cfg, liquidinfo); // 液面探测
|
|
|
@ -471,7 +471,8 @@ void PipetteModule::_do_lld(int32_t container_pos, platinfo_t *platform_info, co |
|
|
|
zm_move_to_lld_start_search_pos_block(container_pos, container_cfg, kzm_v_default, 0); |
|
|
|
// lld,zm移动到瓶底
|
|
|
|
ZLOGI(TAG, "-->zm move slow to container bottom pos"); |
|
|
|
zm_move_to(container_pos + container_cfg->container_depth - 50, kzm_v_lld, liquidinfo->plld_zm_vel); |
|
|
|
int32_t lld_end_pos = container_pos + container_cfg->container_depth - container_cfg->lld_end_pos_margin; |
|
|
|
zm_move_to(lld_end_pos, kzm_v_lld, liquidinfo->plld_zm_vel); |
|
|
|
|
|
|
|
/**
|
|
|
|
* @brief 等待压力大于阈值 |
|
|
@ -717,14 +718,14 @@ int32_t PipetteModule::pipette_pump_distribu_all() { |
|
|
|
if (dcfg->dest_container_has_liquid) check_liquid_info_cpyid(dcfg->dest_liquid_cfg_index); |
|
|
|
check_liquid_info_cpyid(m_pump_gun_state.liquid_type_cpyidx); |
|
|
|
check_container_info_cpyid(dcfg->dest_container_cpyid); |
|
|
|
check_platinfo_cpyid(m_state.platinfo_cpyid); |
|
|
|
check_platinfo_cpyid(m_common_cfg.platform_info_cpyid); |
|
|
|
|
|
|
|
platinfo_t *platform_info = nullptr; |
|
|
|
container_info_t *container_cfg = nullptr; |
|
|
|
liquid_info_t *liquidInGuninfo = nullptr; |
|
|
|
liquid_info_t *liquidinfo = nullptr; |
|
|
|
|
|
|
|
platform_info = get_platinfo_smart(m_state.platinfo_cpyid, &m_now_platinfo); |
|
|
|
platform_info = get_platinfo_smart(m_common_cfg.platform_info_cpyid, &m_now_platinfo); |
|
|
|
container_cfg = get_container_info_smart(dcfg->dest_container_cpyid, &m_now_container_info); |
|
|
|
liquidInGuninfo = get_liquid_info_smart(m_pump_gun_state.liquid_type_cpyidx, &m_now_liquid_in_gun_info); |
|
|
|
if (dcfg->dest_container_has_liquid) { |
|
|
@ -739,7 +740,7 @@ int32_t PipetteModule::pipette_pump_distribu_all() { |
|
|
|
if (dcfg->dest_container_has_liquid) dump("liquid_info", liquidinfo); |
|
|
|
dump("liquid_in_gun_info", liquidInGuninfo); |
|
|
|
|
|
|
|
adjust_container_pos(&dcfg->container_pos, m_state.platinfo_cpyid); |
|
|
|
adjust_container_pos(&dcfg->container_pos, m_common_cfg.platform_info_cpyid); |
|
|
|
int32_t container_pos = dcfg->container_pos; |
|
|
|
|
|
|
|
if (dcfg->distribu_type == 0) { |
|
|
|