diff --git a/.settings/language.settings.xml b/.settings/language.settings.xml index 68ccc9d..0c68457 100644 --- a/.settings/language.settings.xml +++ b/.settings/language.settings.xml @@ -5,7 +5,7 @@ - + @@ -16,7 +16,7 @@ - + diff --git a/sdk/components/pipette_module/pipette_ctrl_module_v2.cpp b/sdk/components/pipette_module/pipette_ctrl_module_v2.cpp index 5eeffdf..153f6e2 100644 --- a/sdk/components/pipette_module/pipette_ctrl_module_v2.cpp +++ b/sdk/components/pipette_module/pipette_ctrl_module_v2.cpp @@ -550,7 +550,7 @@ int32_t PipetteModule::do_pipette_distribut(int32_t ul, int32_t zmotor_v) { DO_IN_THREAD(befor_run()); int32_t distribut_ul = ul; - if (distribut_ul == 0) distribut_ul = m_state.load_val_ul + 1; + if (distribut_ul == 0) distribut_ul = m_state.load_val_ul; DO_IN_THREAD(m_smtp2.pump_distribut(m_config.aspirate_distribut_pump_vel, distribut_ul)); if (zmotor_v != 0) { submotor->moveBy(-LLF_DPOS, zmotor_v); @@ -566,7 +566,7 @@ int32_t PipetteModule::do_pipette_distribut(int32_t ul, int32_t zmotor_v) { m_thread.sleep(10); } }, - [this]() { // exit fn + [this, ul]() { // exit fn after_run(); m_smtp2.pump_stop(); m_zmotor->getMotor()->stop(); @@ -575,6 +575,10 @@ int32_t PipetteModule::do_pipette_distribut(int32_t ul, int32_t zmotor_v) { if (m_state.load_val_ul < 0) { m_state.load_val_ul = 0; } + if (ul == 0 && m_state.load_val_ul == 1) { + m_state.load_val_ul = 0; + } + m_state.lld_prepared = 0; ZLOGI(TAG, "do_pipette_distribut finish, load_val_ul:%d", m_state.load_val_ul); diff --git a/sdk/components/sensors/smtp2_v2/smtp2_v2.cpp b/sdk/components/sensors/smtp2_v2/smtp2_v2.cpp index 8acb5e4..eb6d5f0 100644 --- a/sdk/components/sensors/smtp2_v2/smtp2_v2.cpp +++ b/sdk/components/sensors/smtp2_v2/smtp2_v2.cpp @@ -16,7 +16,7 @@ using namespace smtp2; #define SEND_CMD(fmt, ...) sendcmd(true, 1, "/1" fmt "R\r", ##__VA_ARGS__); #define SEND_CMD_AUTO_RETRY(retry_times, fmt, ...) sendcmd(true, retry_times, "/1" fmt "R\r", ##__VA_ARGS__); #define SEND_CMD_NLOG(fmt, ...) sendcmd(false, 1, "/1" fmt "R\r", ##__VA_ARGS__); - +// 模式2 void SMTP2V2::initialize(UART_HandleTypeDef* uart, uint8_t id, DMA_HandleTypeDef* hdma_rx, DMA_HandleTypeDef* hdma_tx) { m_uart = uart; m_hdma_rx = hdma_rx; @@ -68,14 +68,14 @@ int32_t SMTP2V2::pump_get_motor_pos_ul(int32_t* ul) { } int32_t SMTP2V2::pump_stop() { return sendcmd(true, 1, "/1TR\r"); } -int32_t SMTP2V2::pump_set_vstart(int32_t vel) { return SEND_CMD("v%d", vel); } -int32_t SMTP2V2::pump_set_vstop(int32_t vel) { return SEND_CMD("c%d", vel); } -int32_t SMTP2V2::pump_set_vmax(int32_t vel) { return SEND_CMD("V%d", vel); } +int32_t SMTP2V2::pump_set_vstart(int32_t vel) { return SEND_CMD("N2v%d", vel * 319); } +int32_t SMTP2V2::pump_set_vstop(int32_t vel) { return SEND_CMD("N2c%d", vel * 319); } +int32_t SMTP2V2::pump_set_vmax(int32_t vel) { return SEND_CMD("N2V%d", vel * 319); } int32_t SMTP2V2::pump_set_acc_and_dec(int32_t acc, int32_t dec) { return SEND_CMD("L%d,%d", acc, dec); } int32_t SMTP2V2::pump_set_plld_start_delay(int32_t delay_ms) { return SEND_CMD("T%d", delay_ms); } int32_t SMTP2V2::pump_put_tip() { return SEND_CMD("E1"); } -int32_t SMTP2V2::pump_init(int32_t v) { return SEND_CMD("V%dZ", v); } +int32_t SMTP2V2::pump_init(int32_t v) { return SEND_CMD("N2V%dZ", v * 319); } int32_t SMTP2V2::pump_reset() { _sendcmd(true, "/1!0R\r"); // 复位指令没有回执,所以这里只能使用方法_sendcmd return 0; @@ -101,25 +101,36 @@ int32_t SMTP2V2::pump_move_to_ul(int32_t v, int32_t ul) { * ul:0->1000 */ ZLOGI(TAG, "pump_move_to_ul %d", ul); - int stepNum = ul / 0.319 + 0.5; //+0.5 是为了浮点数强转成正数时采用四舍五入的方式 - return SEND_CMD("N%dV%dA%d", 0 /*模式*/, v, stepNum); + int stepNum = ul * 1000; //+0.5 是为了浮点数强转成正数时采用四舍五入的方式 + return SEND_CMD("V%dA%d", v * 319, stepNum); } int32_t SMTP2V2::pump_aspirate(int32_t v, int32_t ul) { ZLOGI(TAG, "pump_aspirate %d", ul); - int stepNum = ul / 0.319 + 0.5; - return SEND_CMD("N%dV%dP%d", 0 /*模式*/, v, stepNum); + int stepNum = ul * 1000; + return SEND_CMD("V%dP%d", v * 319, stepNum); } int32_t SMTP2V2::pump_distribut(int32_t v, int32_t ul) { ZLOGI(TAG, "pump_distribut %d", ul); - int stepNum = ul / 0.319 + 0.5; - return SEND_CMD("N%dV%dD%d", 0 /*模式*/, v, stepNum); + + int32_t nownl = 0; + + int32_t ret = pump_get_state_as_int(kstate_pump_pos_nl, &nownl); + if (ret != 0) return ret; + + int stepNum = ul * 1000; + + if (stepNum > nownl) { + stepNum = nownl; + } + + return SEND_CMD("V%dD%d", v * 319, stepNum); } int32_t SMTP2V2::pump_distribut_plld(int32_t pumpv, int32_t pressure_threshold) { // M100V100t50,0R ZLOGI(TAG, "pump_distribut_plld %d %d", pumpv, pressure_threshold); - return SEND_CMD("V%dt%d,0", pumpv, pressure_threshold); + return SEND_CMD("V%dt%d,0", pumpv * 319, pressure_threshold); } int32_t SMTP2V2::pump_distribut_plld_get_state(int32_t* detected) { @@ -150,7 +161,7 @@ int32_t SMTP2V2::pump_clld_get_state(int32_t* detected) { // B, int32_t SMTP2V2::pump_distribut_mlld(int32_t pumpv, int32_t c_threshold, int32_t pressure_threshold) { ZLOGI(TAG, "pump_distribut_mlld %d %d %d", pumpv, c_threshold, pressure_threshold); - return SEND_CMD("V%dB%d,%d", pumpv, c_threshold, pressure_threshold); + return SEND_CMD("V%dB%d,%d", pumpv * 319, c_threshold, pressure_threshold); } int32_t SMTP2V2::pump_distribut_mlld_get_state(int32_t* detected) { int32_t isbusy; @@ -234,11 +245,20 @@ bool SMTP2V2::sendcmd_auto_retry(bool dump, int auto_retry_times, const char* cm if (_sendcmd(dump, cmd)) { return true; } - osDelay(10); + osDelay(50); m_rxNum = 0; } return false; } + +static const char* hex2str(const char* hex, size_t len) { + static char buf[256]; + memset(buf, 0, sizeof(buf)); + for (size_t i = 0; i < len; i++) { + sprintf(buf + i * 2, "%02X", hex[i]); + } + return buf; +} bool SMTP2V2::_sendcmd(bool dump, const char* cmd) { m_rxNum = 0; @@ -252,7 +272,7 @@ bool SMTP2V2::_sendcmd(bool dump, const char* cmd) { #if DUMP_HEX if (dump) { - ZLOGI(TAG, "rx:%s", m_rxbuf); + ZLOGI(TAG, "rx:(%d) (%s) %s", m_rxNum, hex2str(m_rxbuf, m_rxNum), m_rxbuf); } #endif @@ -286,5 +306,15 @@ bool SMTP2V2::_sendcmd_dma(const char* cmd) { return false; } m_rxNum = SMTP2_BUF_LEN - __HAL_DMA_GET_COUNTER(m_hdma_rx); + if (m_rxNum < 6) { + return false; + } + uint8_t errorcode = (uint8_t)m_rxbuf[2]; + if (errorcode < '@') { + return false; + } + if (m_rxbuf[m_rxNum - 1] != '\n' || m_rxbuf[m_rxNum - 2] != '\r' || m_rxbuf[m_rxNum - 3] != 3) { + return false; + } return true; } diff --git a/usrc/project_configs.h b/usrc/project_configs.h index 1efdacd..4023082 100644 --- a/usrc/project_configs.h +++ b/usrc/project_configs.h @@ -1,5 +1,5 @@ #pragma once -#define PC_VERSION 507 +#define PC_VERSION 508 #define PC_MANUFACTURER "http://www.iflytop.com/" #define PC_PROJECT_NAME "a8000_subboard" #define PC_IFLYTOP_ENABLE_OS 1