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