6 changed files with 145 additions and 719 deletions
-
202components/pipette_module/pipette_ctrl_module_v2.cpp
-
2components/pipette_module/pipette_ctrl_module_v2.hpp
-
466components/sensors/smtp2/smtp2.cpp
-
147components/sensors/smtp2/smtp2.hpp
-
41components/sensors/smtp2_v2/smtp2_v2.cpp
-
6components/sensors/smtp2_v2/smtp2_v2.hpp
@ -1,466 +0,0 @@ |
|||||
#include "smtp2.hpp"
|
|
||||
|
|
||||
#include <stdarg.h>
|
|
||||
#include <stdio.h>
|
|
||||
#include <stdlib.h>
|
|
||||
#include <string.h>
|
|
||||
|
|
||||
#include "a8000_protocol\protocol.hpp"
|
|
||||
using namespace iflytop; |
|
||||
#define TAG "SMTP2"
|
|
||||
|
|
||||
#define OVERTIME 30
|
|
||||
#define DUMP_HEX 1
|
|
||||
|
|
||||
/**
|
|
||||
* @brief 协议概述 |
|
||||
* 协议示例 |
|
||||
* /2A3000R\r |
|
||||
* /:命令开始 |
|
||||
* 2:设备ID |
|
||||
* A:命令,绝对移动 |
|
||||
* 3000:参数,移动到3000位置 |
|
||||
* R:执行命令 |
|
||||
* \r:命令结束 |
|
||||
* |
|
||||
* |
|
||||
* 1.命令的名称;命令区分大小写 |
|
||||
* 2.一个命令包含多个参数时候,通过逗号隔开 |
|
||||
* 3.命令后面没有跟参数则使用默认值 |
|
||||
* 4.多个命令可以拼接,例如:A3000A0R |
|
||||
* 5.一旦执行命令,泵就处于忙碌状态,且在命令完成之前不会接受除了查询类命令、终止命令[T]以外的新命令 |
|
||||
* |
|
||||
* |
|
||||
*/ |
|
||||
|
|
||||
/**
|
|
||||
* @brief |
|
||||
* |
|
||||
* 命令集 |
|
||||
* 命令名称 命令 |
|
||||
* 初始化 Z |
|
||||
* 泵运动 A |
|
||||
* 泵配置 L(设置加速和减速) v<n>开始速度 V<n>最高速度 S<n>设置预定速度 c<n>停止速度 K<n>背隙增量 N<n>选择增量模式 h<n>设置泵电机保持电流 m<n>设置泵电机运行电流 |
|
||||
* 执行命令 R |
|
||||
* 执行最后一个命令字符串 X |
|
||||
* 重复命令序列 G<n> |
|
||||
* 标记重复序列开始 g |
|
||||
* 延迟命令执行 M<n> |
|
||||
* 停止命令执行 H |
|
||||
* 设置 I/O1 输出 J<n> |
|
||||
* 终止 T |
|
||||
* 清除命令缓冲区 C |
|
||||
* E<n>弹出 Tip |
|
||||
* t<n1>,<n2>压力液面检测(pLLD),吸取或分配 |
|
||||
* ^<n> 电容式液面检测(cLLD) |
|
||||
* B<n1>,<n2>混合式液面检测 |
|
||||
* f<n>开启或停止压力数据流 |
|
||||
* +<n>继续传输压力数据 |
|
||||
* <p>设定压力传感器增益 |
|
||||
* r 复位 LLD 输出 |
|
||||
* *<n1>,<n2>实时温度补偿 |
|
||||
* q<n1>,<n2>操作验证 |
|
||||
* s<n>在 EEPROM 中存储命令字符串 |
|
||||
* e<n> 执行存储在 EEPROM 中的命令字符串 |
|
||||
* 链接 EEPROM 中存储的命令字符串 |
|
||||
* U<n>设置泵常规配置(PAGE:52) |
|
||||
* u<n1>,<n2>设置泵高级配置 |
|
||||
* Q 查询泵状态 |
|
||||
* =查询命令缓冲区 |
|
||||
* &报告固件版本 |
|
||||
* ?<n> 报告泵参数 |
|
||||
* |
|
||||
*/ |
|
||||
|
|
||||
/**
|
|
||||
* 错误码 |
|
||||
* 40h 60h @ ` 0 无错误 |
|
||||
* 41h 61h A a 1 初始化失败 |
|
||||
* 42h 62h B b 2 无效命令 |
|
||||
* 43h 63h C c 3 无效参数 |
|
||||
* 44h 64h D d 4 压力传感器故障 |
|
||||
* 45h 65h E e 5 超过压力 |
|
||||
* 46h 66h F f 6 LLD 错误 |
|
||||
* 47h 67h G g 7 设备未初始化 |
|
||||
* 48h 68h H h 8 Tip 弹出错误 |
|
||||
* 49h 69h I i 9 泵过载 |
|
||||
* 4Ah 6Ah J j 10 Tip 脱落 |
|
||||
* 4Bh 6Bh K k 11 CAN 总线故障 |
|
||||
* 4Ch 6Ch L l 12 无效校验和 |
|
||||
* 4Dh 6Dh M m 13 EEPROM 故障 |
|
||||
* 4Eh 6Eh N n 14 命令缓冲区为空 |
|
||||
* 4Fh 6Fh O o 15 命令溢出 |
|
||||
* 50h 70h P p 16 Tip 堵塞 |
|
||||
* 51h 71h Q q 17 吸入空气 |
|
||||
* 52h 72h R r 18 液体中有气泡/泡沫 |
|
||||
* 53h 73h S s 19 吸取/分配量不准确 |
|
||||
* |
|
||||
*/ |
|
||||
|
|
||||
static int32_t Get1fromfloat(const float& val) { |
|
||||
float temp1 = val; |
|
||||
int32_t t1 = (uint32_t)(temp1 * 10) % 10; |
|
||||
if (t1 > 4) { |
|
||||
temp1 = (float)(uint32_t)(temp1 + 1); |
|
||||
} else { |
|
||||
temp1 = (float)((uint32_t)(temp1)); |
|
||||
} |
|
||||
return (int32_t)temp1; |
|
||||
} |
|
||||
int32_t SMTP2::init_device() { |
|
||||
ZLOGI(TAG, "init_device"); |
|
||||
return doaction(fmt("/1ZR\r")); |
|
||||
} |
|
||||
int32_t SMTP2::init_device_block() { |
|
||||
return doaction_block([this]() { return init_device(); }); |
|
||||
} |
|
||||
|
|
||||
int32_t SMTP2::put_tip() { |
|
||||
// ZLOGI(TAG, "put_tip:%s", "/1E1R");
|
|
||||
ZLOGI(TAG, "put_tip"); |
|
||||
return doaction(fmt("/1E1R\r")); |
|
||||
} |
|
||||
int32_t SMTP2::put_tip_block() { |
|
||||
return doaction_block([this]() { return put_tip(); }); |
|
||||
} |
|
||||
int32_t SMTP2::move_to(int32_t pos) { |
|
||||
ZLOGI(TAG, "move_to %d", pos); |
|
||||
return doaction(fmt("/1N%dA%dR\r", 0, pos)); |
|
||||
} |
|
||||
|
|
||||
int32_t SMTP2::move_to_block(int32_t pos) { |
|
||||
return doaction_block([this, pos]() { return move_to(pos); }); |
|
||||
} |
|
||||
|
|
||||
int32_t SMTP2::move_to_ul(int32_t ul) { |
|
||||
/**
|
|
||||
* @brief 分辨率在0.319ul进行操作 |
|
||||
*/ |
|
||||
ZLOGI(TAG, "move_to_ul %d", ul); |
|
||||
float stepNumfloat = ul / 0.319; |
|
||||
int stepNum = Get1fromfloat(stepNumfloat); |
|
||||
return doaction(fmt("/1N%dA%dR\r", 0, stepNum)); |
|
||||
} |
|
||||
int32_t SMTP2::move_to_ul_block(int32_t ul) { |
|
||||
return doaction_block([this, ul]() { return move_to_ul(ul); }); |
|
||||
} |
|
||||
|
|
||||
int32_t SMTP2::set_resolution(int32_t resolution) { |
|
||||
ZLOGI(TAG, "set_resolution %d", resolution); |
|
||||
return doaction(fmt("/1N%dR\r", resolution)); |
|
||||
} |
|
||||
void SMTP2::stop() { |
|
||||
ZLOGI(TAG, "stop"); |
|
||||
doaction(fmt("/1T\r")); |
|
||||
} |
|
||||
|
|
||||
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 ret; |
|
||||
} |
|
||||
iflytop::err::error_t ecode = read_ack_error_code(m_rxbuf, rxlen); |
|
||||
if (ecode != err::ksucc) { |
|
||||
return ecode; |
|
||||
} |
|
||||
|
|
||||
val = read_ack_int_val(m_rxbuf, rxlen); |
|
||||
return err::ksucc; |
|
||||
} |
|
||||
|
|
||||
int32_t SMTP2::readpara_bool(int32_t paramidx, bool& val) { |
|
||||
int32_t valint = 0; |
|
||||
int32_t ret = readparaint(paramidx, valint); |
|
||||
if (ret != 0) return ret; |
|
||||
if (valint == 1) { |
|
||||
val = true; |
|
||||
} else { |
|
||||
val = false; |
|
||||
} |
|
||||
return err::ksucc; |
|
||||
} |
|
||||
|
|
||||
int32_t SMTP2::read_capacitance_val(int32_t& capval) { return readparaint(68, capval); } |
|
||||
|
|
||||
int32_t SMTP2::read_tip_state(bool& hastip) { return readpara_bool(31, hastip); } |
|
||||
|
|
||||
bool SMTP2::read_tip_state() { |
|
||||
bool hastip = false; |
|
||||
int32_t ret = read_tip_state(hastip); |
|
||||
if (ret != 0) { |
|
||||
return false; |
|
||||
} |
|
||||
return hastip; |
|
||||
} |
|
||||
|
|
||||
int32_t SMTP2::read_pos_ul(int32_t& ul) { |
|
||||
int32_t pos = 0; |
|
||||
int32_t ret = readparaint(3, pos); // 读取nl
|
|
||||
if (ret != 0) { |
|
||||
return ret; |
|
||||
} |
|
||||
ul = pos * 1000; |
|
||||
return 0; |
|
||||
} |
|
||||
int32_t SMTP2::read_pos_ul() { |
|
||||
int32_t ul = 0; |
|
||||
int32_t ret = read_pos_ul(ul); |
|
||||
if (ret != 0) return 0; |
|
||||
return ul; |
|
||||
} |
|
||||
|
|
||||
char* SMTP2::fmt(const char* fmt, ...) { |
|
||||
va_list args; |
|
||||
va_start(args, fmt); |
|
||||
vsprintf(txbuf, fmt, args); |
|
||||
va_end(args); |
|
||||
return txbuf; |
|
||||
} |
|
||||
|
|
||||
/**
|
|
||||
* @brief Get the State object |
|
||||
* |
|
||||
* @param state |
|
||||
* @param error |
|
||||
* @return int |
|
||||
*/ |
|
||||
int32_t SMTP2::getState(bool& isbusy, err::error_t& error) { |
|
||||
size_t rxlen = 0; |
|
||||
sprintf(txbuf, "/1Q\r"); |
|
||||
int ret = sendcmd(txbuf, m_rxbuf, sizeof(m_rxbuf), rxlen); |
|
||||
if (ret != 0) { |
|
||||
return ret; |
|
||||
} |
|
||||
uint8_t errorcode = (uint8_t)m_rxbuf[2]; |
|
||||
if (errorcode >= '`') { |
|
||||
isbusy = false; |
|
||||
errorcode = errorcode - '`'; |
|
||||
} else if (errorcode >= '@') { |
|
||||
isbusy = true; |
|
||||
errorcode = errorcode - '@'; |
|
||||
} |
|
||||
error = (err::error_t)errorcode; |
|
||||
return 0; |
|
||||
} |
|
||||
|
|
||||
void SMTP2::initialize(UART_HandleTypeDef* uart, DMA_HandleTypeDef* hdma_rx, DMA_HandleTypeDef* hdma_tx) { |
|
||||
m_uart = uart; |
|
||||
m_hdma_rx = hdma_rx; |
|
||||
m_hdma_tx = hdma_tx; |
|
||||
} |
|
||||
|
|
||||
int32_t SMTP2::getState() { |
|
||||
bool isbusy = false; |
|
||||
err::error_t error = err::ksucc; |
|
||||
int ret = getState(isbusy, error); |
|
||||
if (ret == 0) { |
|
||||
if (isbusy) { |
|
||||
return err::kdevice_is_busy; |
|
||||
} |
|
||||
return error; |
|
||||
} |
|
||||
return err::kdevice_is_offline; |
|
||||
} |
|
||||
|
|
||||
bool SMTP2::isOnline() { |
|
||||
if (getState() != err::kdevice_is_offline) { |
|
||||
return true; |
|
||||
} |
|
||||
return false; |
|
||||
} |
|
||||
|
|
||||
/*******************************************************************************
|
|
||||
* BASIC * |
|
||||
*******************************************************************************/ |
|
||||
|
|
||||
iflytop::err::error_t SMTP2::read_ack_error_code(char* rxbuf, size_t rxlen) { |
|
||||
if (rxlen < 3) { |
|
||||
return err::kdevice_is_offline; |
|
||||
} |
|
||||
uint8_t errorcode = (uint8_t)rxbuf[2]; |
|
||||
if (errorcode >= '`') { |
|
||||
errorcode = errorcode - '`'; |
|
||||
} else if (errorcode >= '@') { |
|
||||
errorcode = errorcode - '@'; |
|
||||
} |
|
||||
return (err::error_t)errorcode; |
|
||||
} |
|
||||
|
|
||||
int32_t SMTP2::read_ack_int_val(char* rxbuf, size_t rxlen) { |
|
||||
if (rxlen < 3) { |
|
||||
ZLOGW(TAG, "read_ack_int_val rxlen < 3"); |
|
||||
return 0; |
|
||||
} |
|
||||
|
|
||||
memset(m_rxprocessbuf, 0, sizeof(m_rxprocessbuf)); |
|
||||
memcpy(m_rxprocessbuf, rxbuf, rxlen); |
|
||||
|
|
||||
for (size_t i = 0; i < rxlen; i++) { |
|
||||
if (m_rxprocessbuf[i] == '\r' || m_rxprocessbuf[i] == '\n' || m_rxprocessbuf[i] == 0x03) { |
|
||||
m_rxprocessbuf[i] = 0; |
|
||||
break; |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
// "/0`3\r\n"
|
|
||||
int intval = atoi(m_rxprocessbuf + 3); |
|
||||
return intval; |
|
||||
} |
|
||||
|
|
||||
int32_t SMTP2::doaction(char* cmd) { |
|
||||
//
|
|
||||
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 ret; |
|
||||
} |
|
||||
|
|
||||
uint8_t state = (uint8_t)m_rxbuf[2]; |
|
||||
if (state >= '`') { |
|
||||
state = state - '`'; |
|
||||
} else if (state >= '@') { |
|
||||
state = state - '@'; |
|
||||
} |
|
||||
|
|
||||
if (state == 0) { |
|
||||
return 0; |
|
||||
} |
|
||||
return state + err::kSMTP2_NoError; |
|
||||
} |
|
||||
|
|
||||
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
|
|
||||
if (strcmp("/1Q\r", cmd) != 0) { |
|
||||
ZLOGI(TAG, "tx:%s", cmd); |
|
||||
} |
|
||||
#endif
|
|
||||
|
|
||||
if (m_hdma_rx) |
|
||||
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); |
|
||||
|
|
||||
#ifdef DUMP_HEX
|
|
||||
if (strcmp("/1Q\r", cmd) != 0) { |
|
||||
ZLOGI(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) { |
|
||||
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(); |
|
||||
HAL_UARTEx_ReceiveToIdle_DMA(m_uart, (uint8_t*)rxbuf, rxbuflen); |
|
||||
bool overtime_flag = false; |
|
||||
while (HAL_UART_GetState(m_uart) == HAL_UART_STATE_BUSY_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");
|
|
||||
overtime_flag = true; |
|
||||
break; |
|
||||
} |
|
||||
} |
|
||||
HAL_UART_DMAStop(m_uart); |
|
||||
if (overtime_flag) { |
|
||||
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) { |
|
||||
// m_huart->tx(cmd);
|
|
||||
memset(rxbuf, 0, rxbuflen); |
|
||||
printf("tx:%s\n", cmd); |
|
||||
HAL_UART_Transmit(m_uart, (uint8_t*)cmd, txlen, 1000); |
|
||||
|
|
||||
int rxnum = 0; |
|
||||
HAL_StatusTypeDef rxstatus = HAL_UART_Receive(m_uart, (uint8_t*)&rxbuf[0], 1, OVERTIME); |
|
||||
if (rxstatus != HAL_OK) { |
|
||||
rxlen = 0; |
|
||||
return err::kovertime; |
|
||||
} |
|
||||
rxnum++; |
|
||||
for (;; rxnum++) { |
|
||||
HAL_StatusTypeDef rxstatus = HAL_UART_Receive(m_uart, (uint8_t*)&rxbuf[rxnum], 1, 3); |
|
||||
if (rxstatus != HAL_OK) break; |
|
||||
if ('\n' == rxbuf[rxnum]) break; |
|
||||
if (rxnum >= int(rxbuflen - 2)) break; |
|
||||
} |
|
||||
// printf("SMTP2:m_rxbuf:(%d) %s\n", rxnum, rxbuf);
|
|
||||
rxlen = rxnum; |
|
||||
return 0; |
|
||||
} |
|
||||
|
|
||||
int32_t SMTP2::doaction_block(function<int32_t()> action) { |
|
||||
// 移液枪复位
|
|
||||
ThisThread thisThread; |
|
||||
int ret = action(); |
|
||||
if (ret != 0) { |
|
||||
return ret; |
|
||||
} |
|
||||
// 等待移液枪复位完成
|
|
||||
int32_t ecodetimes = 0; |
|
||||
while (true) { |
|
||||
// int32_t state = getState();
|
|
||||
osDelay(100); |
|
||||
|
|
||||
bool isbusy = false; |
|
||||
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; |
|
||||
} |
|
||||
} |
|
||||
} |
|
@ -1,147 +0,0 @@ |
|||||
#pragma once
|
|
||||
#include "a8000_protocol\protocol.hpp"
|
|
||||
#include "sdk\os\zos.hpp"
|
|
||||
namespace iflytop { |
|
||||
using namespace std; |
|
||||
|
|
||||
|
|
||||
/**
|
|
||||
* @brief |
|
||||
* |
|
||||
* ref:https://iflytop1.feishu.cn/wiki/VNNRwUJCtiuRDHkD1uScGIA1nMf
|
|
||||
* WARNING: |
|
||||
* 1,发送消息有一定概率失败,目前没有找到原因,暂时通过重发解决,一般重发一次,即可发送成功。 |
|
||||
*/ |
|
||||
class SMTP2 { |
|
||||
public: |
|
||||
|
|
||||
|
|
||||
private: |
|
||||
UART_HandleTypeDef* m_uart = nullptr; |
|
||||
uint8_t m_id = 0; |
|
||||
// const char* m_name = nullptr;
|
|
||||
|
|
||||
DMA_HandleTypeDef* m_hdma_rx; |
|
||||
DMA_HandleTypeDef* m_hdma_tx; |
|
||||
|
|
||||
char m_rxbuf[20] = {0}; |
|
||||
char m_rxprocessbuf[20] = {0}; |
|
||||
char txbuf[20]; |
|
||||
|
|
||||
int32_t nowpos = 0; |
|
||||
|
|
||||
public: |
|
||||
void initialize(UART_HandleTypeDef* uart, DMA_HandleTypeDef* hdma_rx, DMA_HandleTypeDef* hdma_tx); |
|
||||
/**
|
|
||||
* @brief 获取当前设备状态 |
|
||||
* |
|
||||
* @return int32_t 返回iflytop::err |
|
||||
*/ |
|
||||
int32_t getState(); |
|
||||
|
|
||||
bool isOnline(); |
|
||||
|
|
||||
/**
|
|
||||
* @brief 设备初始化 |
|
||||
* |
|
||||
* @return int |
|
||||
*/ |
|
||||
int32_t init_device(); |
|
||||
int32_t init_device_block(); |
|
||||
/**
|
|
||||
* @brief 放Tip |
|
||||
* |
|
||||
* @return int |
|
||||
*/ |
|
||||
int32_t put_tip(); |
|
||||
int32_t put_tip_block(); |
|
||||
|
|
||||
/**
|
|
||||
* @brief 移动到指定位置 |
|
||||
* |
|
||||
* @param pos |
|
||||
* @return int |
|
||||
*/ |
|
||||
int32_t move_to(int32_t pos); |
|
||||
int32_t move_to_block(int32_t pos); |
|
||||
/**
|
|
||||
* @brief 移动到指定位置 |
|
||||
* |
|
||||
* @param ul |
|
||||
* @return int |
|
||||
*/ |
|
||||
int32_t move_to_ul(int32_t ul); |
|
||||
int32_t move_to_ul_block(int32_t ul); |
|
||||
|
|
||||
/**
|
|
||||
* @brief 读取电容值 |
|
||||
* |
|
||||
* @return int (0->159),接触到水后数值会变成159 |
|
||||
*/ |
|
||||
int32_t read_capacitance_val(int32_t& capval); |
|
||||
|
|
||||
/**
|
|
||||
* @brief 读取tip脱落状态 |
|
||||
* |
|
||||
* @param hastip |
|
||||
* @return int |
|
||||
*/ |
|
||||
int32_t read_tip_state(bool& hastip); |
|
||||
bool read_tip_state(); |
|
||||
|
|
||||
/**
|
|
||||
* @brief 读取当前位置 |
|
||||
* |
|
||||
* @param ul |
|
||||
* @return int32_t |
|
||||
*/ |
|
||||
int32_t read_pos_ul(int32_t& ul); |
|
||||
int32_t read_pos_ul(); |
|
||||
/**
|
|
||||
* @brief 设置分辨率 |
|
||||
* |
|
||||
* @param resolution |
|
||||
* 0:0.319ul |
|
||||
* 1:0.0199ul |
|
||||
* 2:nl |
|
||||
* @return int |
|
||||
*/ |
|
||||
int32_t set_resolution(int32_t resolution); |
|
||||
|
|
||||
/**
|
|
||||
* @brief Get the State object |
|
||||
* |
|
||||
* @param isbusy |
|
||||
* @param error |
|
||||
* @return int |
|
||||
*/ |
|
||||
int32_t getState(bool& isbusy, iflytop::err::error_t& error); |
|
||||
/**
|
|
||||
* @brief |
|
||||
*/ |
|
||||
void stop(); |
|
||||
|
|
||||
int32_t doaction_block(function<int32_t()> action); |
|
||||
|
|
||||
private: |
|
||||
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, 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); |
|
||||
|
|
||||
char* fmt(const char* fmt, ...); |
|
||||
|
|
||||
int32_t readparaint(int32_t paramidx, int32_t& val); |
|
||||
int32_t readpara_bool(int32_t paramidx, bool& val); |
|
||||
|
|
||||
private: |
|
||||
}; |
|
||||
|
|
||||
} // namespace iflytop
|
|
Write
Preview
Loading…
Cancel
Save
Reference in new issue