6 changed files with 485 additions and 5 deletions
-
11components/errorcode/errorcode.hpp
-
252components/mini_servo_motor/feite_servo_motor.cpp
-
134components/mini_servo_motor/feite_servo_motor.hpp
-
48components/mini_servo_motor/mini_servo_motor_ctrl_module.cpp
-
40components/mini_servo_motor/mini_servo_motor_ctrl_module.hpp
-
5os/zos.hpp
@ -0,0 +1,252 @@ |
|||
#include "feite_servo_motor.hpp"
|
|||
using namespace iflytop; |
|||
using namespace std; |
|||
using namespace feite; |
|||
#define TAG "FeiTeServoMotor"
|
|||
#define OVERTIME 5
|
|||
#define DO(func) \
|
|||
if (!(func)) { \ |
|||
ZLOGE(TAG, "motor[%d] do %s fail", id, #func); \ |
|||
return false; \ |
|||
} |
|||
void FeiTeServoMotor::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; |
|||
} |
|||
bool FeiTeServoMotor::ping(uint8_t id) { |
|||
ping_cmd_t ping_cmd; |
|||
ping_resp_t ping_resp; |
|||
ping_cmd.header = 0xffff; |
|||
ping_cmd.id = id; |
|||
ping_cmd.len = 2; |
|||
ping_cmd.cmd = kping; |
|||
ping_cmd.checksum = checksum_packet((uint8_t*)&ping_cmd, sizeof(ping_cmd_t)); |
|||
|
|||
return tx_and_rx((uint8_t*)&ping_cmd, sizeof(ping_cmd_t), (uint8_t*)&ping_resp, sizeof(ping_resp_t), OVERTIME); |
|||
} |
|||
bool FeiTeServoMotor::write8(uint8_t id, feite::reg_add_e add, uint8_t regval) { |
|||
write8_cmd_t write8_cmd = {0}; |
|||
write8_resp_t write8_resp = {0}; |
|||
write8_cmd.header = 0xffff; |
|||
write8_cmd.id = id; |
|||
write8_cmd.len = 3 + 1; |
|||
write8_cmd.cmd = kwrite; |
|||
write8_cmd.regadd = add; |
|||
write8_cmd.regval = regval; |
|||
write8_cmd.checksum = checksum_packet((uint8_t*)&write8_cmd, sizeof(write8_cmd_t)); |
|||
return tx_and_rx((uint8_t*)&write8_cmd, sizeof(write8_cmd_t), (uint8_t*)&write8_resp, sizeof(write8_resp_t), OVERTIME); |
|||
} |
|||
bool FeiTeServoMotor::read8(uint8_t id, feite::reg_add_e add, uint8_t& regval) { |
|||
read8_cmd_t read8_cmd = {0}; |
|||
read8_resp_t read8_resp = {0}; |
|||
read8_cmd.header = 0xffff; |
|||
read8_cmd.id = id; |
|||
read8_cmd.len = 3 + 1; |
|||
read8_cmd.cmd = kread; |
|||
read8_cmd.regadd = add; |
|||
read8_cmd.readlen = 1; |
|||
read8_cmd.checksum = checksum_packet((uint8_t*)&read8_cmd, sizeof(read8_cmd_t)); |
|||
if (!tx_and_rx((uint8_t*)&read8_cmd, sizeof(read8_cmd_t), (uint8_t*)&read8_resp, sizeof(read8_resp_t), OVERTIME)) { |
|||
return false; |
|||
} |
|||
regval = read8_resp.data; |
|||
return true; |
|||
} |
|||
|
|||
bool FeiTeServoMotor::write16(uint8_t id, feite::reg_add_e add, uint16_t regval) { |
|||
write16_cmd_t write16_cmd = {0}; |
|||
write16_resp_t write16_resp = {0}; |
|||
write16_cmd.header = 0xffff; |
|||
write16_cmd.id = id; |
|||
write16_cmd.len = 3 + 2; |
|||
write16_cmd.cmd = kwrite; |
|||
write16_cmd.regadd = add; |
|||
write16_cmd.regval = regval; |
|||
write16_cmd.checksum = checksum_packet((uint8_t*)&write16_cmd, sizeof(write16_cmd_t)); |
|||
return tx_and_rx((uint8_t*)&write16_cmd, sizeof(write16_cmd_t), (uint8_t*)&write16_resp, sizeof(write16_resp_t), OVERTIME); |
|||
} |
|||
|
|||
bool FeiTeServoMotor::read_s16(uint8_t id, feite::reg_add_e add, int16_t& regval) { |
|||
uint16_t val = 0; |
|||
bool ret = read16(id, add, val); |
|||
if (!ret) return false; |
|||
|
|||
uint8_t sign = val >> 15; |
|||
uint16_t realval = val & 0x7fff; |
|||
if (sign == 0) { |
|||
regval = realval; |
|||
} else { |
|||
regval = -realval; |
|||
} |
|||
return true; |
|||
} |
|||
|
|||
bool FeiTeServoMotor::write_s16(uint8_t id, feite::reg_add_e add, int16_t regval) { |
|||
uint16_t val = 0; |
|||
if (regval >= 0) { |
|||
val = regval; |
|||
} else { |
|||
val = -regval; |
|||
val |= 0x8000; |
|||
} |
|||
return write16(id, add, val); |
|||
} |
|||
|
|||
bool FeiTeServoMotor::read16(uint8_t id, feite::reg_add_e add, uint16_t& regval) { |
|||
read16_cmd_t read16_cmd = {0}; |
|||
read16_resp_t read16_resp = {0}; |
|||
read16_cmd.header = 0xffff; |
|||
read16_cmd.id = id; |
|||
read16_cmd.len = 3 + 1; |
|||
read16_cmd.cmd = kread; |
|||
read16_cmd.regadd = add; |
|||
read16_cmd.readlen = 2; |
|||
read16_cmd.checksum = checksum_packet((uint8_t*)&read16_cmd, sizeof(read16_cmd_t)); |
|||
if (!tx_and_rx((uint8_t*)&read16_cmd, sizeof(read16_cmd_t), (uint8_t*)&read16_resp, sizeof(read16_resp_t), OVERTIME)) { |
|||
return false; |
|||
} |
|||
regval = read16_resp.data; |
|||
return true; |
|||
} |
|||
|
|||
bool FeiTeServoMotor::async_write8(uint8_t id, feite::reg_add_e add, uint8_t regval) { |
|||
write8_cmd_t write8_cmd = {0}; |
|||
write8_resp_t write8_resp = {0}; |
|||
write8_cmd.header = 0xffff; |
|||
write8_cmd.id = id; |
|||
write8_cmd.len = 3 + 1; |
|||
write8_cmd.cmd = kasyncWrite; |
|||
write8_cmd.regadd = add; |
|||
write8_cmd.regval = regval; |
|||
write8_cmd.checksum = checksum_packet((uint8_t*)&write8_cmd, sizeof(write8_cmd_t)); |
|||
return tx_and_rx((uint8_t*)&write8_cmd, sizeof(write8_cmd_t), (uint8_t*)&write8_resp, sizeof(write8_resp_t), OVERTIME); |
|||
} |
|||
bool FeiTeServoMotor::async_write16(uint8_t id, feite::reg_add_e add, uint16_t regval) { |
|||
write16_cmd_t write16_cmd = {0}; |
|||
write16_resp_t write16_resp = {0}; |
|||
write16_cmd.header = 0xffff; |
|||
write16_cmd.id = id; |
|||
write16_cmd.len = 3 + 2; |
|||
write16_cmd.cmd = kasyncWrite; |
|||
write16_cmd.regadd = add; |
|||
write16_cmd.regval = regval; |
|||
write16_cmd.checksum = checksum_packet((uint8_t*)&write16_cmd, sizeof(write16_cmd_t)); |
|||
return tx_and_rx((uint8_t*)&write16_cmd, sizeof(write16_cmd_t), (uint8_t*)&write16_resp, sizeof(write16_resp_t), OVERTIME); |
|||
} |
|||
|
|||
static int16_t getcalibrate(int16_t nowpos, int16_t aftercalibratepos) { |
|||
int16_t calibrate = aftercalibratepos - nowpos; |
|||
while (true) { |
|||
if (calibrate > 2047) { |
|||
calibrate -= 4094; |
|||
} else if (calibrate < -2047) { |
|||
calibrate += 4094; |
|||
} else { |
|||
break; |
|||
} |
|||
} |
|||
return calibrate; |
|||
} |
|||
|
|||
bool FeiTeServoMotor::setcurpos(int id, int16_t pos) { |
|||
/**
|
|||
* @brief |
|||
* 1. 记录当前模式 |
|||
* 2. 切换到位置模式 |
|||
* 3. 读取当前位置 |
|||
* 4. 读取当前位置校准数值 |
|||
* 5. 计算新的校准值 |
|||
* 6. 切换到速度模式(速度模式下不会因为位置的变化而导致舵机运动) |
|||
* 解锁写入 |
|||
* 6. 写入新的校准值 |
|||
* 锁定写入 |
|||
* 7. 切换回原来的模式 |
|||
*/ |
|||
if (pos < 0 || pos > 4095) { |
|||
ZLOGE(TAG, "setcurpos pos:%d out of range", pos); |
|||
return false; |
|||
} |
|||
|
|||
run_mode_e nowmode = getmode(id); |
|||
DO(setmode(id, kServoMode)); |
|||
uint16_t curpos; |
|||
DO(read16(id, kRegServoCurrentPos, curpos)); |
|||
int16_t curcalibrate; |
|||
DO(read_s16(id, kRegServoCalibration, curcalibrate)); |
|||
|
|||
int16_t realpos = curpos - curcalibrate; |
|||
int16_t newcalibrate = getcalibrate(realpos, pos); |
|||
|
|||
DO(setmode(id, kMotorMode)); |
|||
DO(write8(id, kRegServoLockFlag, 0)); |
|||
DO(write_s16(id, kRegServoCalibration, newcalibrate)); |
|||
DO(write8(id, kRegServoLockFlag, 1)); |
|||
|
|||
DO(setmode(id, nowmode)); |
|||
return true; |
|||
} |
|||
|
|||
#define DO(func) \
|
|||
if (!(func)) { \ |
|||
ZLOGE(TAG, "motor[%d] do %s fail", id, #func); \ |
|||
return false; \ |
|||
} |
|||
|
|||
bool FeiTeServoMotor::tx_and_rx(uint8_t* tx, uint8_t txdatalen, uint8_t* rx, uint8_t expectrxsize, uint16_t overtimems) { |
|||
uint32_t enter_ticket = HAL_GetTick(); |
|||
|
|||
HAL_UART_Transmit_DMA(m_uart, tx, txdatalen); |
|||
while (HAL_UART_GetState(m_uart) == HAL_UART_STATE_BUSY_TX) { |
|||
; |
|||
} |
|||
HAL_UART_Receive_DMA(m_uart, (uint8_t*)rx, expectrxsize); |
|||
|
|||
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(5); |
|||
int rxsize = expectrxsize - __HAL_DMA_GET_COUNTER(m_hdma_rx); |
|||
if (rxsize == expectrxsize) { |
|||
break; |
|||
} |
|||
if (zos_haspassedms(enter_ticket) > overtimems) { |
|||
if (expectrxsize != 0 && rxsize != 0) { |
|||
ZLOGW(TAG, "txandrx overtime rxsize:%d != expect_size:%d", rxsize, expectrxsize); |
|||
} |
|||
overtime_flag = true; |
|||
break; |
|||
} |
|||
} |
|||
HAL_UART_DMAStop(m_uart); |
|||
if (overtime_flag) { |
|||
return false; |
|||
} |
|||
return true; |
|||
} |
|||
|
|||
bool FeiTeServoMotor::readversion(uint8_t id, uint8_t& mainversion, uint8_t& subversion, uint8_t& miniserv_mainversion, uint8_t& miniserv_subversion) { |
|||
uint8_t data = 0; |
|||
DO(read8(id, kRegFirmwareMainVersion, data)); |
|||
mainversion = data; |
|||
DO(read8(id, kRegFirmwareSubVersion, data)); |
|||
subversion = data; |
|||
DO(read8(id, kRegServoMainVersion, data)); |
|||
miniserv_mainversion = data; |
|||
DO(read8(id, kRegServoSubVersion, data)); |
|||
miniserv_subversion = data; |
|||
return true; |
|||
} |
|||
bool FeiTeServoMotor::readposcalibration(uint8_t id, int16_t& poscalibration) { |
|||
return read_s16(id, kRegServoCalibration, poscalibration); |
|||
} |
|||
|
|||
uint8_t FeiTeServoMotor::checksum_packet(uint8_t* data, uint8_t len) { return checksum(&data[2], len - 3); } |
|||
uint8_t FeiTeServoMotor::checksum(uint8_t* data, uint8_t len) { |
|||
// CheckSum=~(ID+Length+Instruction+Parameter1+...ParameterN
|
|||
uint16_t sum = 0; |
|||
for (int i = 0; i < len; i++) { |
|||
sum += data[i]; |
|||
} |
|||
return ~(sum & 0xff); |
|||
} |
@ -0,0 +1,134 @@ |
|||
#pragma once
|
|||
#include <stdbool.h>
|
|||
#include <stdint.h>
|
|||
#include <stdio.h>
|
|||
#include <stdlib.h>
|
|||
|
|||
#include "sdk/os/zos.hpp"
|
|||
namespace iflytop { |
|||
namespace feite { |
|||
|
|||
typedef enum { |
|||
kping = 0x01, |
|||
kread = 0x02, |
|||
kwrite = 0x03, |
|||
kasyncWrite = 0x04, |
|||
} cmd_e; |
|||
|
|||
typedef enum { |
|||
kServoMode = 0, // 位置伺服模式 42 号地址来控制电机位置
|
|||
kMotorMode = 1, // 电机恒速模式 46 号地址运行速度来控制电机速度 BIT15 为方向位
|
|||
kOpenMotorMode = 2, // 扭矩电机模式 44 号地址来控制,1000满扭矩
|
|||
kStepMotorMode = 3, // 步进电机模式
|
|||
} run_mode_e; // reg:33
|
|||
|
|||
typedef enum { |
|||
kRegFirmwareMainVersion = 0, // 固件主版本号
|
|||
kRegFirmwareSubVersion = 1, // 固件次版本号
|
|||
kRegServoMainVersion = 3, // 舵机主版本号
|
|||
kRegServoSubVersion = 4, // 舵机次版本号
|
|||
kRegServoId = 5, // ID
|
|||
kRegServoBaudRate = 6, // 波特率
|
|||
kRegServoDelay = 7, // 返回延时
|
|||
kRegServoAckLevel = 8, // 应答状态级别
|
|||
kRegServoMinAngle = 9, // 最小角度限制
|
|||
kRegServoMaxAngle = 11, // 最大角度限制
|
|||
kRegServoMaxTemp = 13, // 最高温度上限
|
|||
kRegServoMaxVoltage = 14, // 最高输入电压
|
|||
kRegServoMinVoltage = 15, // 最低输入电压
|
|||
kRegServoMaxTorque = 16, // 最大扭矩
|
|||
kRegServoPhase = 18, // 相位
|
|||
kRegServoUnloadCondition = 19, // 卸载条件
|
|||
kRegServoLedAlarmCondition = 20, // LED 报警条件
|
|||
kRegServoP = 21, // P 比例系
|
|||
kRegServoD = 22, // D 微分系
|
|||
kRegServoI = 23, // I
|
|||
kRegServoMinStart = 24, // 最小启动
|
|||
kRegServoCwDeadZone = 26, // 顺时针不灵敏区
|
|||
kRegServoCcwDeadZone = 27, // 逆时针不灵敏
|
|||
kRegServoProtectCurrent = 28, // 保护电流
|
|||
kRegServoAngleResolution = 30, // 角度分辨
|
|||
|
|||
kRegServoCalibration = 31, // 位置校正
|
|||
kRegServoRunMode = 33, // 运行模式
|
|||
kRegServoProtectTorque = 34, // 保护扭矩
|
|||
kRegServoProtectTime = 35, // 保护时间
|
|||
kRegServoOverloadTorque = 36, // 过载扭矩
|
|||
kRegServoSpeedP = 37, // 速度闭环P比例参数
|
|||
kRegServoOverloadTime = 38, // 过流保护时间
|
|||
kRegServoSpeedI = 39, // 速度闭环I积分参数
|
|||
kRegServoTorqueSwitch = 40, // 扭矩开关
|
|||
kRegServoAcc = 41, // 加速度
|
|||
kRegServoTargetPos = 42, // 目标位置
|
|||
kRegServoRunTime = 44, // 运行时间
|
|||
kRegServoRunSpeed = 46, // 运行速度
|
|||
kRegServoTorqueLimit = 48, // 转矩限制
|
|||
kRegServoLockFlag = 55, // 锁标志
|
|||
kRegServoCurrentPos = 56, // 当前位置
|
|||
kRegServoCurrentSpeed = 58, // 当前速度
|
|||
kRegServoCurrentLoad = 60, // 当前负载
|
|||
kRegServoCurrentVoltage = 62, // 当前电压
|
|||
kRegServoCurrentTemp = 63, // 当前温度
|
|||
kRegServoAsyncWriteFlag = 64, // 异步写标志
|
|||
kRegServoStatus = 65, // 舵机状态
|
|||
kRegServoMoveFlag = 66, // 移动标志
|
|||
kRegServoCurrentCurrent = 69, // 当前电流
|
|||
|
|||
kRegServoCheckSpeed = 80, // 80 移动检查速度
|
|||
kRegServoDTime = 81, // 81 D控制时间
|
|||
kRegServoSpeedUnit = 82, // 82 速度单位系数
|
|||
kRegServoMinSpeedLimit = 83, // 83 最小速度限制
|
|||
kRegServoMaxSpeedLimit = 84, // 84 最大速度限制
|
|||
kRegServoAccLimit = 85, // 85 加速度限制
|
|||
kRegServoAccMultiple = 86, // 86 加速度倍数
|
|||
} reg_add_e; |
|||
|
|||
ZSTRUCT(ping_cmd_t, /* */ uint16_t header; uint8_t id; uint8_t len; uint8_t cmd; uint8_t checksum;) |
|||
ZSTRUCT(ping_resp_t, /* */ uint16_t header; uint8_t id; uint8_t len; uint8_t status; uint8_t checksum;) |
|||
ZSTRUCT(read8_cmd_t, /* */ uint16_t header; uint8_t id; uint8_t len; uint8_t cmd; uint8_t regadd; uint8_t readlen; uint8_t checksum;) |
|||
ZSTRUCT(read8_resp_t, /* */ uint16_t header; uint8_t id; uint8_t len; uint8_t status; uint8_t data; uint8_t checksum;) |
|||
ZSTRUCT(write8_cmd_t, /* */ uint16_t header; uint8_t id; uint8_t len; uint8_t cmd; uint8_t regadd; uint8_t regval; uint8_t checksum;) |
|||
ZSTRUCT(write8_resp_t, /* */ uint16_t header; uint8_t id; uint8_t len; uint8_t status; uint8_t checksum;) |
|||
ZSTRUCT(read16_cmd_t, /* */ uint16_t header; uint8_t id; uint8_t len; uint8_t cmd; uint8_t regadd; uint8_t readlen; uint8_t checksum;) |
|||
ZSTRUCT(read16_resp_t, /* */ uint16_t header; uint8_t id; uint8_t len; uint8_t status; uint16_t data; uint8_t checksum;) |
|||
ZSTRUCT(write16_cmd_t, /* */ uint16_t header; uint8_t id; uint8_t len; uint8_t cmd; uint8_t regadd; uint16_t regval; uint8_t checksum;) |
|||
ZSTRUCT(write16_resp_t, /* */ uint16_t header; uint8_t id; uint8_t len; uint8_t status; uint8_t checksum;) |
|||
|
|||
}; // namespace feite
|
|||
|
|||
using namespace feite; |
|||
class FeiTeServoMotor { |
|||
UART_HandleTypeDef* m_uart; |
|||
DMA_HandleTypeDef* m_hdma_rx; |
|||
DMA_HandleTypeDef* m_hdma_tx; |
|||
|
|||
public: |
|||
void initialize(UART_HandleTypeDef* uart, DMA_HandleTypeDef* hdma_rx, DMA_HandleTypeDef* hdma_tx); |
|||
bool ping(uint8_t id); |
|||
|
|||
bool setmode(uint8_t id, run_mode_e runmode); |
|||
run_mode_e getmode(uint8_t id); |
|||
|
|||
bool setcurpos(int id, int16_t pos); |
|||
bool readversion(uint8_t id, uint8_t& mainversion, uint8_t& subversion, uint8_t& miniserv_mainversion, uint8_t& miniserv_subversion); |
|||
bool readposcalibration(uint8_t id, int16_t& poscalibration); |
|||
|
|||
public: |
|||
bool write8(uint8_t id, feite::reg_add_e add, uint8_t regval); |
|||
bool read8(uint8_t id, feite::reg_add_e add, uint8_t& regval); |
|||
|
|||
bool write16(uint8_t id, feite::reg_add_e add, uint16_t regval); |
|||
bool read16(uint8_t id, feite::reg_add_e add, uint16_t& regval); |
|||
|
|||
bool read_s16(uint8_t id, feite::reg_add_e add, int16_t& regval); |
|||
bool write_s16(uint8_t id, feite::reg_add_e add, int16_t regval); |
|||
|
|||
bool async_write8(uint8_t id, feite::reg_add_e add, uint8_t regval); |
|||
bool async_write16(uint8_t id, feite::reg_add_e add, uint16_t regval); |
|||
|
|||
private: |
|||
bool tx_and_rx(uint8_t* tx, uint8_t txdatalen, uint8_t* rx, uint8_t expectrxsize, uint16_t overtimems); |
|||
uint8_t checksum(uint8_t* data, uint8_t len); |
|||
uint8_t checksum_packet(uint8_t* data, uint8_t len); |
|||
}; |
|||
} // namespace iflytop
|
@ -0,0 +1,48 @@ |
|||
#include "mini_servo_motor_ctrl_module.hpp"
|
|||
|
|||
#include "sdk\components\errorcode\errorcode.hpp"
|
|||
using namespace iflytop; |
|||
using namespace std; |
|||
|
|||
void MiniRobotCtrlModule::initialize(FeiTeServoMotor* bus, uint8_t id) { m_bus->write8(m_id, feite::kRegServoRunMode, feite::kServoMode); } |
|||
|
|||
int32_t MiniRobotCtrlModule::enable(u8 enable) { |
|||
bool suc = m_bus->write8(m_id, feite::reg_add_e::kRegServoTorqueSwitch, enable); |
|||
if (!suc) return err::kce_subdevice_overtime; |
|||
return err::ksucc; |
|||
} |
|||
int32_t MiniRobotCtrlModule::stop(u8 stop_type) { |
|||
/**
|
|||
* @brief 切换下当前运行模式再切换回来,可以停止舵机运行 |
|||
*/ |
|||
if (!m_bus->ping(m_id)) return err::kce_subdevice_overtime; |
|||
feite::run_mode_e runmode = m_bus->getmode(m_id); |
|||
if (runmode != feite::kServoMode) { |
|||
m_bus->setmode(m_id, feite::kServoMode); |
|||
} else { |
|||
m_bus->setmode(m_id, feite::kMotorMode); |
|||
} |
|||
m_bus->setmode(m_id, runmode); |
|||
return err::ksucc; |
|||
} |
|||
int32_t MiniRobotCtrlModule::position_calibrate(s32 nowpos) { |
|||
if (!m_bus->ping(m_id)) return err::kce_subdevice_overtime; |
|||
return 0; |
|||
} |
|||
int32_t MiniRobotCtrlModule::rotate(s32 speed, s32 run_time, function<void(rotate_cb_status_t& status)> status_cb) { return 0; } |
|||
int32_t MiniRobotCtrlModule::move_to(s32 pos, s32 speed, s32 torque, function<void(move_to_cb_status_t& status)> status_cb) { return 0; } |
|||
int32_t MiniRobotCtrlModule::move_by(s32 pos, s32 speed, s32 torque, function<void(move_by_cb_status_t& status)> status_cb) { return 0; } |
|||
int32_t MiniRobotCtrlModule::run_with_torque(s32 torque, s32 run_time, function<void(run_with_torque_cb_status_t& status)> status_cb) { return 0; } |
|||
int32_t MiniRobotCtrlModule::move_by_nolimit(s32 pos, s32 speed, s32 torque, function<void(move_by_nolimit_cb_status_t& status)> status_cb) { return 0; } |
|||
|
|||
int32_t MiniRobotCtrlModule::read_version(version_t& version) { return 0; } |
|||
int32_t MiniRobotCtrlModule::read_status(status_t& status) { return 0; } |
|||
int32_t MiniRobotCtrlModule::read_debug_info(debug_info_t& debug_info) { return 0; } |
|||
|
|||
int32_t MiniRobotCtrlModule::set_run_param(run_param_t& param) { return 0; } |
|||
int32_t MiniRobotCtrlModule::set_basic_param(basic_param_t& param) { return 0; } |
|||
int32_t MiniRobotCtrlModule::set_warning_limit_param(warning_limit_param_t& param) { return 0; } |
|||
|
|||
int32_t MiniRobotCtrlModule::get_run_param(run_param_t& param) { return 0; } |
|||
int32_t MiniRobotCtrlModule::get_basic_param(basic_param_t& param) { return 0; } |
|||
int32_t MiniRobotCtrlModule::get_warning_limit_param(warning_limit_param_t& param) { return 0; } |
@ -0,0 +1,40 @@ |
|||
#pragma once
|
|||
//
|
|||
#include "sdk/os/zos.hpp"
|
|||
//
|
|||
#include "feite_servo_motor.hpp"
|
|||
#include "sdk/components/zprotocols/zcancmder/api/i_mini_servo_module.hpp"
|
|||
|
|||
namespace iflytop { |
|||
class MiniRobotCtrlModule : public I_MiniServoModule { |
|||
FeiTeServoMotor* m_bus; |
|||
uint8_t m_id; |
|||
|
|||
s32 m_pos_shift; |
|||
|
|||
public: |
|||
void initialize(FeiTeServoMotor* bus, uint8_t id); |
|||
|
|||
virtual int32_t enable(u8 enable) override; |
|||
virtual int32_t stop(u8 stop_type) override; |
|||
virtual int32_t position_calibrate(s32 nowpos) override; |
|||
|
|||
virtual int32_t rotate(s32 speed, s32 run_time, function<void(rotate_cb_status_t& status)> status_cb) override; |
|||
virtual int32_t move_to(s32 pos, s32 speed, s32 torque, function<void(move_to_cb_status_t& status)> status_cb) override; |
|||
virtual int32_t move_by(s32 pos, s32 speed, s32 torque, function<void(move_by_cb_status_t& status)> status_cb) override; |
|||
virtual int32_t run_with_torque(s32 torque, s32 run_time, function<void(run_with_torque_cb_status_t& status)> status_cb) override; |
|||
virtual int32_t move_by_nolimit(s32 pos, s32 speed, s32 torque, function<void(move_by_nolimit_cb_status_t& status)> status_cb) override; |
|||
|
|||
virtual int32_t read_version(version_t& version) override; |
|||
virtual int32_t read_status(status_t& status) override; |
|||
virtual int32_t read_debug_info(debug_info_t& debug_info) override; |
|||
|
|||
virtual int32_t set_run_param(run_param_t& param) override; |
|||
virtual int32_t set_basic_param(basic_param_t& param) override; |
|||
virtual int32_t set_warning_limit_param(warning_limit_param_t& param) override; |
|||
|
|||
virtual int32_t get_run_param(run_param_t& param) override; |
|||
virtual int32_t get_basic_param(basic_param_t& param) override; |
|||
virtual int32_t get_warning_limit_param(warning_limit_param_t& param) override; |
|||
}; |
|||
} // namespace iflytop
|
Write
Preview
Loading…
Cancel
Save
Reference in new issue