|
|
@ -14,11 +14,13 @@ using namespace feite; |
|
|
|
} |
|
|
|
|
|
|
|
static void dumphex(char* tag, uint8_t* data, uint8_t len) { |
|
|
|
#if 0
|
|
|
|
printf("%s:", tag); |
|
|
|
for (int i = 0; i < len; i++) { |
|
|
|
printf("%02x ", data[i]); |
|
|
|
} |
|
|
|
printf("\n"); |
|
|
|
#endif
|
|
|
|
} |
|
|
|
void FeiTeServoMotor::initialize(UART_HandleTypeDef* uart, DMA_HandleTypeDef* hdma_rx, DMA_HandleTypeDef* hdma_tx) { |
|
|
|
m_uart = uart; |
|
|
@ -212,7 +214,7 @@ bool FeiTeServoMotor::reCalibration(int id, int16_t pos) { |
|
|
|
int16_t nowpos; |
|
|
|
DO(getNowPos(id, nowpos)); |
|
|
|
ZLOGI(TAG, "reCalibration id:%d nowpos:%d:%d", id, nowpos, pos); |
|
|
|
DO(setTargetPos(id, pos)); |
|
|
|
DO(setTargetPos(id, nowpos)); |
|
|
|
return true; |
|
|
|
} |
|
|
|
|
|
|
@ -268,6 +270,7 @@ bool FeiTeServoMotor::write_s16(uint8_t id, feite::reg_add_e add, uint8_t signbi |
|
|
|
} |
|
|
|
bool FeiTeServoMotor::write_reg(uint8_t id, bool async, uint8_t add, uint8_t* data, uint8_t len) { //
|
|
|
|
// ZLOGI(TAG, "write_reg id:%d add:%d len:%d", id, add, len);
|
|
|
|
|
|
|
|
cmd_header_t* cmd_header = (cmd_header_t*)m_txbuf; |
|
|
|
receipt_header_t* receipt_header = (receipt_header_t*)m_rxbuf; |
|
|
|
cmd_header->header = 0xffff; |
|
|
@ -280,6 +283,9 @@ bool FeiTeServoMotor::write_reg(uint8_t id, bool async, uint8_t add, uint8_t* da |
|
|
|
int txpacketlen = sizeof(cmd_header_t) + 1 + len + 1; |
|
|
|
int rxpacketlen = sizeof(receipt_header_t) + 1; |
|
|
|
|
|
|
|
ZASSERT(txpacketlen < sizeof(m_txbuf)); |
|
|
|
ZASSERT(rxpacketlen < sizeof(m_rxbuf)); |
|
|
|
|
|
|
|
uint8_t checksum = checksum_packet((uint8_t*)cmd_header, txpacketlen); |
|
|
|
m_txbuf[txpacketlen - 1] = checksum; |
|
|
|
if (!tx_and_rx(m_txbuf, txpacketlen, m_rxbuf, rxpacketlen, OVERTIME)) { |
|
|
@ -307,6 +313,9 @@ bool FeiTeServoMotor::read_reg(uint8_t id, uint8_t add, uint8_t* data, uint8_t l |
|
|
|
int rxpacketlen = sizeof(receipt_header_t) + 1 + len; |
|
|
|
|
|
|
|
uint8_t checksum = checksum_packet((uint8_t*)cmd_header, txpacketlen); |
|
|
|
ZASSERT(txpacketlen > 0); |
|
|
|
ZASSERT(txpacketlen < sizeof(m_txbuf)); |
|
|
|
ZASSERT(rxpacketlen < sizeof(m_rxbuf)); |
|
|
|
|
|
|
|
m_txbuf[txpacketlen - 1] = checksum; |
|
|
|
if (!tx_and_rx(m_txbuf, txpacketlen, m_rxbuf, rxpacketlen, OVERTIME)) { |
|
|
@ -323,6 +332,7 @@ bool FeiTeServoMotor::tx_and_rx(uint8_t* tx, uint8_t txdatalen, uint8_t* rx, uin |
|
|
|
uint32_t enter_ticket = HAL_GetTick(); |
|
|
|
dumphex("tx:", tx, txdatalen); |
|
|
|
|
|
|
|
#if 1
|
|
|
|
HAL_UART_Transmit(m_uart, tx, txdatalen, 1000); |
|
|
|
HAL_UART_Receive_DMA(m_uart, (uint8_t*)rx, expectrxsize); |
|
|
|
|
|
|
@ -345,9 +355,11 @@ bool FeiTeServoMotor::tx_and_rx(uint8_t* tx, uint8_t txdatalen, uint8_t* rx, uin |
|
|
|
} |
|
|
|
HAL_UART_DMAStop(m_uart); |
|
|
|
if (overtime_flag) { |
|
|
|
// ZLOGE(TAG, "txandrx overtime");
|
|
|
|
return false; |
|
|
|
} |
|
|
|
return true; |
|
|
|
#endif
|
|
|
|
} |
|
|
|
|
|
|
|
bool FeiTeServoMotor::readversion(uint8_t id, uint8_t& mainversion, uint8_t& subversion, uint8_t& miniserv_mainversion, uint8_t& miniserv_subversion) { |
|
|
|