Browse Source

update

master
zhaohe 2 years ago
parent
commit
283569575d
  1. 107
      components/sensors/smtp2/smtp2.cpp
  2. 48
      components/sensors/smtp2/smtp2.hpp

107
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<int32_t()> 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);
}
}

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

Loading…
Cancel
Save