|
|
@ -33,10 +33,10 @@ |
|
|
|
|
|
|
|
#define THREAD_START_WORK(...) thread_start_work(__FUNCTION__, __VA_ARGS__)
|
|
|
|
|
|
|
|
#define PIPETTE_PREPARE_POS 250
|
|
|
|
#define PIPETTE_PREPARE_POS 450
|
|
|
|
#define LLD_PREPARE_DISTRIBUT_POS 50
|
|
|
|
// #define LLF_DPOS 1000
|
|
|
|
#define ASPIRATE_POS 150
|
|
|
|
#define ASPIRATE_POS 200
|
|
|
|
|
|
|
|
using namespace iflytop; |
|
|
|
// using namespace pipette_module_v3;
|
|
|
@ -324,6 +324,7 @@ int32_t PipetteModuleV2::pipette_init_device() { |
|
|
|
int32_t PipetteModuleV2::pipette_put_tip() { |
|
|
|
THREAD_START_WORK([this]() { |
|
|
|
DO_IN_THREAD(m_smtp2.pump_put_tip()); |
|
|
|
m_state.lld_prepared = 0; |
|
|
|
pump_waitfor_stop(); |
|
|
|
}); |
|
|
|
return 0; |
|
|
@ -331,11 +332,6 @@ int32_t PipetteModuleV2::pipette_put_tip() { |
|
|
|
|
|
|
|
int32_t PipetteModuleV2::pipette_lld_prepare() { |
|
|
|
THREAD_START_WORK([this]() { |
|
|
|
if (m_state.lld_prepared == 1) { |
|
|
|
ZLOGI(TAG, "has already prepared"); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
ZLOGI(TAG, "zmotor move to zero"); |
|
|
|
zm_move_to(0, m_cfg.zm_default_velocity); |
|
|
|
zm_waitfor_stop(); |
|
|
@ -347,6 +343,9 @@ int32_t PipetteModuleV2::pipette_lld_prepare() { |
|
|
|
DO_IN_THREAD(m_smtp2.pump_move_to_ul(m_cfg.pump_vmax, 0)); // 移动到零点
|
|
|
|
pump_waitfor_stop(); |
|
|
|
} |
|
|
|
ZLOGI(TAG, "pump move to 0"); |
|
|
|
DO_IN_THREAD(m_smtp2.pump_move_to_ul(m_cfg.pump_vmax, 0)); // 移动到中点
|
|
|
|
pump_waitfor_stop(); |
|
|
|
|
|
|
|
ZLOGI(TAG, "pump move to lld_prepare_pos %d", m_cfg.lld_prepare_pos); |
|
|
|
DO_IN_THREAD(m_smtp2.pump_move_to_ul(m_cfg.pump_vmax, m_cfg.lld_prepare_pos)); // 移动到中点
|
|
|
@ -375,17 +374,22 @@ int32_t PipetteModuleV2::pipette_aspirate_prepare() { |
|
|
|
ZLOGI(TAG, "pipette_aspirate_prepare"); |
|
|
|
m_state.load_val_ul = 0; |
|
|
|
int32_t nowpos = zm_get_now_pos(); |
|
|
|
int32_t bak = nowpos - 100; |
|
|
|
int32_t bak = nowpos - 200; |
|
|
|
if (bak < 0) bak = 0; |
|
|
|
|
|
|
|
zm_move_to(bak, m_cfg.zm_default_velocity); |
|
|
|
zm_waitfor_stop(); |
|
|
|
|
|
|
|
DO_IN_THREAD(m_smtp2.pump_move_to_ul(m_cfg.pump_vmax, 0)); |
|
|
|
pump_waitfor_stop(); |
|
|
|
// DO_IN_THREAD(m_smtp2.pump_move_to_ul(m_cfg.pump_vmax, 0));
|
|
|
|
// pump_waitfor_stop();
|
|
|
|
|
|
|
|
DO_IN_THREAD(m_smtp2.pump_move_to_ul(m_cfg.pump_vmax, ASPIRATE_POS)); |
|
|
|
pump_waitfor_stop(); |
|
|
|
int32_t nowul; |
|
|
|
DO_IN_THREAD(m_smtp2.pump_get_ul(&nowul)); |
|
|
|
|
|
|
|
if (nowul > ASPIRATE_POS) { |
|
|
|
DO_IN_THREAD(m_smtp2.pump_move_to_ul(m_cfg.pump_vmax, ASPIRATE_POS)); |
|
|
|
pump_waitfor_stop(); |
|
|
|
} |
|
|
|
|
|
|
|
zm_move_to(nowpos, m_cfg.zm_default_velocity); |
|
|
|
zm_waitfor_stop(); |
|
|
@ -483,12 +487,12 @@ int32_t PipetteModuleV2::pipette_aspirate(int32_t ul) { |
|
|
|
pump_waitfor_stop(); |
|
|
|
|
|
|
|
// 全部排空时,多分配10ul去掉挂液
|
|
|
|
if ((m_state.load_val_ul + dul) == 0) { |
|
|
|
m_smtp2.pump_aspirate(m_cfg.aspirate_pump_vel, -50); |
|
|
|
pump_waitfor_stop(); |
|
|
|
// for (size_t i = 0; i < 3; i++) {
|
|
|
|
// }
|
|
|
|
} |
|
|
|
// if ((m_state.load_val_ul + dul) == 0) {
|
|
|
|
// m_smtp2.pump_move_to_ul(m_cfg.aspirate_pump_vel, 0);
|
|
|
|
// pump_waitfor_stop();
|
|
|
|
// // for (size_t i = 0; i < 3; i++) {
|
|
|
|
// // }
|
|
|
|
// }
|
|
|
|
|
|
|
|
// stop
|
|
|
|
m_zm->stop(); |
|
|
@ -538,6 +542,31 @@ int32_t PipetteModuleV2::pipette_aspirate_and_verify(int32_t ul) { |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
int32_t PipetteModuleV2::pipette_clear_hanging_liquid(int32_t repeat_times) { |
|
|
|
// llf_startz
|
|
|
|
// llf_endz
|
|
|
|
THREAD_START_WORK([this, repeat_times]() { |
|
|
|
// 全部排空时,多分配10ul去掉挂液
|
|
|
|
m_smtp2.pump_move_to_ul(m_cfg.pump_vmax, 0); |
|
|
|
pump_waitfor_stop(); |
|
|
|
m_state.load_val_ul = 0; |
|
|
|
|
|
|
|
int32_t nowpos = zm_get_now_pos(); |
|
|
|
int32_t pos1 = nowpos - 100; |
|
|
|
int32_t pos2 = nowpos - 10; |
|
|
|
if (pos1 < 0) pos1 = 0; |
|
|
|
if (pos2 < 0) pos2 = 0; |
|
|
|
|
|
|
|
for (int i = 0; i < repeat_times; i++) { |
|
|
|
zm_move_to(pos1, m_cfg.zm_default_velocity); |
|
|
|
zm_waitfor_stop(); |
|
|
|
zm_move_to(pos2, m_cfg.zm_default_velocity); |
|
|
|
zm_waitfor_stop(); |
|
|
|
} |
|
|
|
}); |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
int32_t PipetteModuleV2::pipette_shake_up(int32_t ul, int32_t times) { |
|
|
|
if (m_state.load_val_ul != 0) { |
|
|
|
ZLOGE(TAG, "pipette_shake_up fail, load_val_ul %d != 0", m_state.load_val_ul); |
|
|
@ -1077,7 +1106,7 @@ void PipetteModuleV2::thread_start_work(const char *fnname, function<void()> fn) |
|
|
|
try { |
|
|
|
// before do
|
|
|
|
int32_t startpos = zm_get_now_pos(); |
|
|
|
// DO_IN_THREAD(m_smtp2.pump_get_motor_pos_ul(&pump_before_pos_ul));
|
|
|
|
// DO_IN_THREAD(m_smtp2.pump_get_ul(&pump_before_pos_ul));
|
|
|
|
|
|
|
|
// do fn
|
|
|
|
if (fn) fn(); |
|
|
@ -1086,7 +1115,7 @@ void PipetteModuleV2::thread_start_work(const char *fnname, function<void()> fn) |
|
|
|
m_smtp2.pump_stop(); |
|
|
|
|
|
|
|
// after do
|
|
|
|
// DO_IN_THREAD(m_smtp2.pump_get_motor_pos_ul(&pump_after_pos_ul));
|
|
|
|
// DO_IN_THREAD(m_smtp2.pump_get_ul(&pump_after_pos_ul));
|
|
|
|
int32_t endpos = zm_get_now_pos(); |
|
|
|
// m_state.dul = pump_after_pos_ul - pump_before_pos_ul;
|
|
|
|
m_state.dpos = endpos - startpos; |
|
|
|