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