diff --git a/components/sensors/smtp2/smtp2.cpp b/components/sensors/smtp2/smtp2.cpp index e78b00e..4b6533d 100644 --- a/components/sensors/smtp2/smtp2.cpp +++ b/components/sensors/smtp2/smtp2.cpp @@ -9,7 +9,7 @@ using namespace iflytop; #define TAG "SMTP2" -#define OVERTIME 20 +#define OVERTIME 30 #define DUMP_HEX 1 /** @@ -158,7 +158,7 @@ int32_t SMTP2::readparaint(int32_t paramidx, int32_t& val) { size_t rxlen = 0; int ret = sendcmd(fmt("/1?%d\r", paramidx), m_rxbuf, sizeof(m_rxbuf), rxlen); if (ret != 0) { - return -1; + return ret; } iflytop::err::error_t ecode = read_ack_error_code(m_rxbuf, rxlen); if (ecode != err::ksucc) { @@ -228,18 +228,19 @@ char* SMTP2::fmt(const char* fmt, ...) { int32_t SMTP2::getState(bool& isbusy, err::error_t& error) { size_t rxlen = 0; sprintf(txbuf, "/1Q\r"); - int ret = sendcmd(txbuf, strlen(txbuf), m_rxbuf, sizeof(m_rxbuf), rxlen); + int ret = sendcmd(txbuf, m_rxbuf, sizeof(m_rxbuf), rxlen); if (ret != 0) { - return -1; + return ret; } uint8_t errorcode = (uint8_t)m_rxbuf[2]; - if (errorcode > '`') { + if (errorcode >= '`') { isbusy = false; errorcode = errorcode - '`'; - } else if (errorcode > '@') { + } else if (errorcode >= '@') { isbusy = true; errorcode = errorcode - '@'; } + error = (err::error_t)errorcode; return 0; } @@ -278,9 +279,9 @@ iflytop::err::error_t SMTP2::read_ack_error_code(char* rxbuf, size_t rxlen) { return err::kdevice_is_offline; } uint8_t errorcode = (uint8_t)rxbuf[2]; - if (errorcode > '`') { + if (errorcode >= '`') { errorcode = errorcode - '`'; - } else if (errorcode > '@') { + } else if (errorcode >= '@') { errorcode = errorcode - '@'; } return (err::error_t)errorcode; @@ -309,13 +310,14 @@ int32_t SMTP2::read_ack_int_val(char* rxbuf, size_t rxlen) { int32_t SMTP2::doaction(char* cmd) { // - size_t rxlen = 0; - size_t txlen = strlen(cmd); - cmd[txlen] = '\r'; - cmd[txlen + 1] = 0; - int ret = sendcmd(cmd, txlen + 1, m_rxbuf, sizeof(m_rxbuf), rxlen); + size_t rxlen = 0; + size_t txlen = strlen(cmd); + // cmd[txlen] = '\r'; + cmd[txlen] = 0; + // cmd[txlen + 1] = 0; + int ret = sendcmd(cmd, m_rxbuf, sizeof(m_rxbuf), rxlen); if (ret != 0) { - return -1; + return ret; } uint8_t state = (uint8_t)m_rxbuf[2]; @@ -330,30 +332,51 @@ int32_t SMTP2::doaction(char* cmd) { } return state + err::kSMTP2_NoError; } -int32_t SMTP2::sendcmd(const char* cmd, char* rxbuf, size_t rxbuflen, size_t& rxlen) { return sendcmd(cmd, strlen(cmd), rxbuf, rxbuflen, rxlen); } -int32_t SMTP2::sendcmd(const char* cmd, size_t txlen, char* rxbuf, size_t rxbuflen, size_t& rxlen) { + +int32_t SMTP2::sendcmd(const char* cmd, char* rxbuf, size_t rxbuflen, size_t& rxlen) { + int32_t ecode = 0; + for (size_t i = 0; i < 5; i++) { + ecode = _sendcmd(cmd, rxbuf, rxbuflen, rxlen); + if (ecode == 0) { + break; + } + ZLOGI(TAG, "re send cmd %d", i); + } + return ecode; +} + +int32_t SMTP2::_sendcmd(const char* cmd, char* rxbuf, size_t rxbuflen, size_t& rxlen) { return _sendcmd(cmd, strlen(cmd), rxbuf, rxbuflen, rxlen); } +int32_t SMTP2::_sendcmd(const char* cmd, size_t txlen, char* rxbuf, size_t rxbuflen, size_t& rxlen) { if (!m_uart) return -1; int ret = 0; // size_t rxlen = 0; #ifdef DUMP_HEX - ZLOGI_NOT_END_LINE(TAG, "tx:%s", cmd); + if (strcmp("/1Q\r", cmd) != 0) { + ZLOGI_NOT_END_LINE(TAG, "tx:%s", cmd); + } #endif if (m_hdma_rx) - ret = sendcmd_dma(cmd, txlen, (char*)m_rxbuf, sizeof(m_rxbuf), rxlen); + ret = _sendcmd_dma(cmd, txlen, (char*)m_rxbuf, sizeof(m_rxbuf), rxlen); else - ret = sendcmd_block(cmd, txlen, (char*)m_rxbuf, sizeof(m_rxbuf), rxlen); + ret = _sendcmd_block(cmd, txlen, (char*)m_rxbuf, sizeof(m_rxbuf), rxlen); #ifdef DUMP_HEX - ZLOGI_NOT_END_LINE(TAG, "rx:%s", m_rxbuf); + if (strcmp("/1Q\r", cmd) != 0) { + ZLOGI_NOT_END_LINE(TAG, "rx:%s", m_rxbuf); + } #endif return ret; } -int32_t SMTP2::sendcmd_dma(const char* cmd, size_t txlen, char* rxbuf, size_t rxbuflen, size_t& rxlen) { +int32_t SMTP2::_sendcmd_dma(const char* cmd, size_t txlen, char* rxbuf, size_t rxbuflen, size_t& rxlen) { memset(rxbuf, 0, rxbuflen); + uint8_t rxdata; + // clear rx buf + while (HAL_UART_Receive(m_uart, &rxdata, 1, 1) == HAL_OK) { + } HAL_UART_Transmit(m_uart, (uint8_t*)cmd, txlen, 1000); uint32_t enter_ticket = HAL_GetTick(); @@ -363,19 +386,19 @@ int32_t SMTP2::sendcmd_dma(const char* cmd, size_t txlen, char* rxbuf, size_t rx HAL_UART_GetState(m_uart) == HAL_UART_STATE_BUSY_TX_RX) { osDelay(1); if (zos_haspassedms(enter_ticket) > OVERTIME) { - ZLOGW(TAG, "sendcmd_dma overtime"); + // ZLOGW(TAG, "sendcmd_dma overtime"); overtime_flag = true; break; } } HAL_UART_DMAStop(m_uart); if (overtime_flag) { - return -1; + return err::kovertime; } rxlen = rxbuflen - __HAL_DMA_GET_COUNTER(m_hdma_rx); return 0; } -int32_t SMTP2::sendcmd_block(const char* cmd, size_t txlen, char* rxbuf, size_t rxbuflen, size_t& rxlen) { +int32_t SMTP2::_sendcmd_block(const char* cmd, size_t txlen, char* rxbuf, size_t rxbuflen, size_t& rxlen) { // m_huart->tx(cmd); memset(rxbuf, 0, rxbuflen); // printf("tx:%s\n", cmd); @@ -385,7 +408,7 @@ int32_t SMTP2::sendcmd_block(const char* cmd, size_t txlen, char* rxbuf, size_t HAL_StatusTypeDef rxstatus = HAL_UART_Receive(m_uart, (uint8_t*)&rxbuf[0], 1, OVERTIME); if (rxstatus != HAL_OK) { rxlen = 0; - return -1; + return err::kovertime; } rxnum++; for (;; rxnum++) { @@ -407,21 +430,37 @@ int32_t SMTP2::doaction_block(function action) { return ret; } // 等待移液枪复位完成 + int32_t ecodetimes = 0; while (true) { - int32_t state = getState(); - if (state != err::kdevice_is_busy) { - if (state == 0) { - stop(); - return 0; - } else { - stop(); - return ret; + // int32_t state = getState(); + osDelay(100); + + bool isbusy; + err::error_t error; + + int32_t ecode = getState(isbusy, error); + if (ecode != 0) { + ecodetimes++; + if (ecodetimes > 3) { + return err::kovertime; } + continue; + } + + if (error != 0) { + ZLOGI(TAG, "error:%d", error); + stop(); + return error; } + + // 动作执行完成 + if (!isbusy) { + return 0; + } + if (thisThread.getExitFlag()) { stop(); return err::kmodule_opeation_break_by_user; } - thisThread.sleep(1000); } } diff --git a/components/sensors/smtp2/smtp2.hpp b/components/sensors/smtp2/smtp2.hpp index e455928..a0cb70b 100644 --- a/components/sensors/smtp2/smtp2.hpp +++ b/components/sensors/smtp2/smtp2.hpp @@ -4,39 +4,17 @@ namespace iflytop { using namespace std; + +/** + * @brief + * + * ref:https://iflytop1.feishu.cn/wiki/VNNRwUJCtiuRDHkD1uScGIA1nMf + * WARNING: + * 1,发送消息有一定概率失败,目前没有找到原因,暂时通过重发解决,一般重发一次,即可发送成功。 + */ class SMTP2 { public: -#if 0 - typedef enum { - kNoError = 0, // 无错误 - kInitFail = 1, // 初始化失败 - kInvalidCmd = 2, // 无效命令 - kInvalidArg = 3, // 无效参数 - kPressureSensorError = 4, // 压力传感器故障 - kOverPressure = 5, // 超过压力 - kLLDError = 6, // LLD 错误 - kDeviceNotInit = 7, // 设备未初始化 - kTipPopError = 8, // Tip 弹出错误 - kPumpOverload = 9, // 泵过载 - kTipDrop = 10, // Tip 脱落 - kCanBusError = 11, // CAN 总线故障 - kInvalidChecksum = 12, // 无效校验和 - kEEPROMError = 13, // EEPROM 故障 - kCmdBufferEmpty = 14, // 命令缓冲区为空 - kCmdBufferOverflow = 15, // 命令溢出 - kTipBlock = 16, // Tip 堵塞 - kAirSuction = 17, // 吸入空气 - kBubble = 18, // 液体中有气泡/泡沫 - kVolumeError = 19, // 吸取/分配量不准确 - } error_t; -#endif - -#if 0 - typedef enum { - kIdle = 0, - kBusy = 1, - } state_t; -#endif + private: UART_HandleTypeDef* m_uart = nullptr; @@ -149,9 +127,11 @@ class SMTP2 { int32_t doaction(char* cmd); int32_t sendcmd(const char* cmd, char* rxbuf, size_t rxbuflen, size_t& rxlen); - int32_t sendcmd(const char* cmd, size_t txlen, char* rxbuf, size_t rxbuflen, size_t& rxlen); - int32_t sendcmd_dma(const char* cmd, size_t txlen, char* rxbuf, size_t rxbuflen, size_t& rxlen); - int32_t sendcmd_block(const char* cmd, size_t txlen, char* rxbuf, size_t rxbuflen, size_t& rxlen); + + int32_t _sendcmd(const char* cmd, char* rxbuf, size_t rxbuflen, size_t& rxlen); + int32_t _sendcmd(const char* cmd, size_t txlen, char* rxbuf, size_t rxbuflen, size_t& rxlen); + int32_t _sendcmd_dma(const char* cmd, size_t txlen, char* rxbuf, size_t rxbuflen, size_t& rxlen); + int32_t _sendcmd_block(const char* cmd, size_t txlen, char* rxbuf, size_t rxbuflen, size_t& rxlen); iflytop::err::error_t read_ack_error_code(char* rxbuf, size_t rxlen); int32_t read_ack_int_val(char* rxbuf, size_t rxlen);