Browse Source

V1209| 移液枪添加电缆连接测试

master
zhaohe 2 months ago
parent
commit
b4644edf11
  1. 63
      sdk/components/pipette_module/pipette_ctrl_module.cpp
  2. 2
      sdk/components/pipette_module/pipette_ctrl_module.hpp
  3. 53
      sdk/components/pipette_module/pipette_ctrl_module_test.cpp
  4. 7
      sdk/components/sensors/smtp2_v2/smtp2_v2.cpp
  5. 1
      sdk/components/sensors/smtp2_v2/smtp2_v2.hpp
  6. 8
      sdk/components/sensors/smtp2_v2/smtp_pressure_stream_processer.hpp
  7. 6
      sdk/components/zcan_protocol_parser/zcan_protocol_parser.cpp
  8. 1
      sdk/components/zcan_protocol_parser/zcan_protocol_parser.hpp
  9. 2
      usrc/a8000_protocol/protocol/cmdid.hpp
  10. 2
      usrc/version.h

63
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();

2
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 *

53
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;
}

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

1
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(); // 泵机复位

8
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

6
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);

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

2
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 {

2
usrc/version.h

@ -1,2 +1,2 @@
#pragma once
#define APP_VERSION 1208
#define APP_VERSION 1209
Loading…
Cancel
Save