|
|
@ -19,14 +19,14 @@ void MiniRobotCtrlModule::initialize(FeiTeServoMotor* bus, uint8_t id) { |
|
|
|
|
|
|
|
int32_t MiniRobotCtrlModule::enable(u8 enable) { |
|
|
|
bool suc = m_bus->write_u8(m_id, feite::reg_add_e::kRegServoTorqueSwitch, enable); |
|
|
|
if (!suc) return err::kce_subdevice_overtime; |
|
|
|
if (!suc) return err::ksubdevice_overtime; |
|
|
|
return err::ksucc; |
|
|
|
} |
|
|
|
int32_t MiniRobotCtrlModule::stop(u8 stop_type) { |
|
|
|
/**
|
|
|
|
* @brief 切换下当前运行模式再切换回来,可以停止舵机运行 |
|
|
|
*/ |
|
|
|
if (!m_bus->ping(m_id)) return err::kce_subdevice_overtime; |
|
|
|
if (!m_bus->ping(m_id)) return err::ksubdevice_overtime; |
|
|
|
feite::run_mode_e runmode = m_bus->getmode(m_id); |
|
|
|
if (runmode == feite::kServoMode) { |
|
|
|
m_bus->setmode(m_id, feite::kMotorMode); |
|
|
@ -38,20 +38,20 @@ int32_t MiniRobotCtrlModule::stop(u8 stop_type) { |
|
|
|
return err::ksucc; |
|
|
|
} |
|
|
|
int32_t MiniRobotCtrlModule::position_calibrate(s32 nowpos) { |
|
|
|
if (nowpos < 0 || nowpos > 4095) return err::kce_param_out_of_range; |
|
|
|
if (!m_bus->ping(m_id)) return err::kce_subdevice_overtime; |
|
|
|
if (!m_bus->reCalibration(m_id, nowpos)) return err::kce_subdevice_overtime; |
|
|
|
if (nowpos < 0 || nowpos > 4095) return err::kparam_out_of_range; |
|
|
|
if (!m_bus->ping(m_id)) return err::ksubdevice_overtime; |
|
|
|
if (!m_bus->reCalibration(m_id, nowpos)) return err::ksubdevice_overtime; |
|
|
|
return 0; |
|
|
|
} |
|
|
|
int32_t MiniRobotCtrlModule::rotate(s32 speed, s32 torque, s32 run_time, action_cb_status_t status_cb) { |
|
|
|
ZLOGI(TAG, "rotate speed:%d torque:%d run_time:%d", speed, torque, run_time); |
|
|
|
m_thread.stop(); |
|
|
|
if (!m_bus->ping(m_id)) return err::kce_subdevice_overtime; |
|
|
|
if (!m_bus->ping(m_id)) return err::ksubdevice_overtime; |
|
|
|
|
|
|
|
limit_input(torque, 0, 1000); |
|
|
|
limit_input(speed, -200000, 200000); |
|
|
|
|
|
|
|
if (!m_bus->rotate(m_id, speed, torque)) return err::kce_subdevice_overtime; |
|
|
|
if (!m_bus->rotate(m_id, speed, torque)) return err::ksubdevice_overtime; |
|
|
|
|
|
|
|
m_thread.start([this, speed, torque, run_time, status_cb]() { |
|
|
|
int32_t entertime = zos_get_tick(); |
|
|
@ -75,13 +75,13 @@ int32_t MiniRobotCtrlModule::move_to(s32 pos, s32 speed, s32 torque, action_cb_s |
|
|
|
ZLOGI(TAG, "move_to pos:%d speed:%d torque:%d", pos, speed, torque); |
|
|
|
m_thread.stop(); |
|
|
|
|
|
|
|
if (!m_bus->ping(m_id)) return err::kce_subdevice_overtime; |
|
|
|
if (!m_bus->ping(m_id)) return err::ksubdevice_overtime; |
|
|
|
|
|
|
|
limit_input(torque, 0, 1000); |
|
|
|
limit_input(pos, 0, 4095); |
|
|
|
|
|
|
|
// m_bus->moveTo(m_id, pos, speed, torque);
|
|
|
|
if (!m_bus->moveTo(m_id, pos, speed, torque)) return err::kce_subdevice_overtime; |
|
|
|
if (!m_bus->moveTo(m_id, pos, speed, torque)) return err::ksubdevice_overtime; |
|
|
|
|
|
|
|
m_thread.start([this, pos, speed, torque, status_cb]() { |
|
|
|
while (true) { |
|
|
@ -105,11 +105,11 @@ int32_t MiniRobotCtrlModule::move_to(s32 pos, s32 speed, s32 torque, action_cb_s |
|
|
|
int32_t MiniRobotCtrlModule::move_forward(s32 torque) { |
|
|
|
ZLOGI(TAG, "move_forward torque:%d", torque); |
|
|
|
|
|
|
|
if (!m_bus->ping(m_id)) return err::kce_subdevice_overtime; |
|
|
|
if (!m_bus->ping(m_id)) return err::ksubdevice_overtime; |
|
|
|
limit_input(torque, 0, 1000); |
|
|
|
|
|
|
|
m_thread.stop(); |
|
|
|
if (!m_bus->moveTo(m_id, 4095, 0, torque)) return err::kce_subdevice_overtime; |
|
|
|
if (!m_bus->moveTo(m_id, 4095, 0, torque)) return err::ksubdevice_overtime; |
|
|
|
m_thread.start([this, torque]() { |
|
|
|
while (true) { |
|
|
|
if (m_thread.getExitFlag()) break; |
|
|
@ -124,11 +124,11 @@ int32_t MiniRobotCtrlModule::move_forward(s32 torque) { |
|
|
|
int32_t MiniRobotCtrlModule::move_backward(s32 torque) { |
|
|
|
ZLOGI(TAG, "move_backward torque:%d", torque); |
|
|
|
|
|
|
|
if (!m_bus->ping(m_id)) return err::kce_subdevice_overtime; |
|
|
|
if (!m_bus->ping(m_id)) return err::ksubdevice_overtime; |
|
|
|
limit_input(torque, 0, 1000); |
|
|
|
|
|
|
|
m_thread.stop(); |
|
|
|
if (!m_bus->moveTo(m_id, 0, 0, torque)) return err::kce_subdevice_overtime; |
|
|
|
if (!m_bus->moveTo(m_id, 0, 0, torque)) return err::ksubdevice_overtime; |
|
|
|
m_thread.start([this, torque]() { |
|
|
|
while (true) { |
|
|
|
if (m_thread.getExitFlag()) break; |
|
|
@ -144,7 +144,7 @@ int32_t MiniRobotCtrlModule::move_by(s32 dpos, s32 speed, s32 torque, action_cb_ |
|
|
|
ZLOGI(TAG, "move_by pos:%d speed:%d torque:%d", dpos, speed, torque); |
|
|
|
m_thread.stop(); |
|
|
|
|
|
|
|
if (!m_bus->ping(m_id)) return err::kce_subdevice_overtime; |
|
|
|
if (!m_bus->ping(m_id)) return err::ksubdevice_overtime; |
|
|
|
limit_input(torque, 0, 1000); |
|
|
|
limit_input(speed, -200000, 200000); |
|
|
|
|
|
|
@ -160,16 +160,16 @@ int32_t MiniRobotCtrlModule::move_by(s32 dpos, s32 speed, s32 torque, action_cb_ |
|
|
|
return 0; |
|
|
|
} |
|
|
|
int32_t MiniRobotCtrlModule::run_with_torque(s32 torque, s32 run_time, action_cb_status_t status_cb) { |
|
|
|
return err::kce_operation_not_support; |
|
|
|
return err::koperation_not_support; |
|
|
|
#if 0
|
|
|
|
ZLOGI(TAG, "run_with_torque torque:%d run_time:%d", torque, run_time); |
|
|
|
m_thread.stop(); |
|
|
|
|
|
|
|
if (!m_bus->ping(m_id)) return err::kce_subdevice_overtime; |
|
|
|
if (!m_bus->ping(m_id)) return err::ksubdevice_overtime; |
|
|
|
if (torque > 1000) torque = 1000; |
|
|
|
if (torque < 0) torque = 0; |
|
|
|
|
|
|
|
if (!m_bus->moveWithTorque(m_id, torque)) return err::kce_subdevice_overtime; |
|
|
|
if (!m_bus->moveWithTorque(m_id, torque)) return err::ksubdevice_overtime; |
|
|
|
|
|
|
|
m_thread.start([this, torque, run_time, status_cb]() { |
|
|
|
int32_t entertime = zos_get_tick(); |
|
|
@ -177,7 +177,7 @@ int32_t MiniRobotCtrlModule::run_with_torque(s32 torque, s32 run_time, action_cb |
|
|
|
while (true) { |
|
|
|
if (m_thread.getExitFlag() && run_time != 0) { |
|
|
|
stop(0); |
|
|
|
call_status_cb(status_cb, err::kce_break_by_user); |
|
|
|
call_status_cb(status_cb, err::kmodule_opeation_break_by_user); |
|
|
|
break; |
|
|
|
} |
|
|
|
if (m_thread.getExitFlag() && run_time == 0) { |
|
|
@ -199,19 +199,19 @@ int32_t MiniRobotCtrlModule::run_with_torque(s32 torque, s32 run_time, action_cb |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
int32_t MiniRobotCtrlModule::move_by_nolimit(s32 pos, s32 speed, s32 torque, action_cb_status_t status_cb) { return err::kce_operation_not_support; } |
|
|
|
int32_t MiniRobotCtrlModule::move_by_nolimit(s32 pos, s32 speed, s32 torque, action_cb_status_t status_cb) { return err::koperation_not_support; } |
|
|
|
|
|
|
|
int32_t MiniRobotCtrlModule::read_version(version_t& version) { |
|
|
|
uint8_t mainversion, subversion, miniserv_mainversion, miniserv_subversion; |
|
|
|
if (!m_bus->readversion(m_id, mainversion, subversion, miniserv_mainversion, miniserv_subversion)) return err::kce_subdevice_overtime; |
|
|
|
if (!m_bus->readversion(m_id, mainversion, subversion, miniserv_mainversion, miniserv_subversion)) return err::ksubdevice_overtime; |
|
|
|
version.version = mainversion << 24 | subversion << 16 | miniserv_mainversion << 8 | miniserv_subversion; |
|
|
|
return 0; |
|
|
|
} |
|
|
|
int32_t MiniRobotCtrlModule::read_status(status_t& status) { |
|
|
|
if (!m_bus->ping(m_id)) return err::kce_subdevice_overtime; |
|
|
|
if (!m_bus->ping(m_id)) return err::ksubdevice_overtime; |
|
|
|
|
|
|
|
FeiTeServoMotor::detailed_status_t feitestatus; |
|
|
|
if (!m_bus->read_detailed_status(m_id, &feitestatus)) return err::kce_subdevice_overtime; |
|
|
|
if (!m_bus->read_detailed_status(m_id, &feitestatus)) return err::ksubdevice_overtime; |
|
|
|
status.torque = feitestatus.torque; |
|
|
|
status.speed = feitestatus.vel; |
|
|
|
status.pos = feitestatus.pos; |
|
|
@ -224,9 +224,9 @@ int32_t MiniRobotCtrlModule::read_status(status_t& status) { |
|
|
|
return 0; |
|
|
|
} |
|
|
|
int32_t MiniRobotCtrlModule::read_detailed_status(detailed_status_t& debug_info) { |
|
|
|
if (!m_bus->ping(m_id)) return err::kce_subdevice_overtime; |
|
|
|
if (!m_bus->ping(m_id)) return err::ksubdevice_overtime; |
|
|
|
FeiTeServoMotor::detailed_status_t feitestatus; |
|
|
|
if (!m_bus->read_detailed_status(m_id, &feitestatus)) return err::kce_subdevice_overtime; |
|
|
|
if (!m_bus->read_detailed_status(m_id, &feitestatus)) return err::ksubdevice_overtime; |
|
|
|
|
|
|
|
if (feitestatus.state != 0) { |
|
|
|
debug_info.status = 3; |
|
|
@ -244,10 +244,10 @@ int32_t MiniRobotCtrlModule::read_detailed_status(detailed_status_t& debug_info) |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
int32_t MiniRobotCtrlModule::set_basic_param(basic_param_t& param) { return err::kce_operation_not_support; } |
|
|
|
int32_t MiniRobotCtrlModule::set_basic_param(basic_param_t& param) { return err::koperation_not_support; } |
|
|
|
int32_t MiniRobotCtrlModule::get_basic_param(basic_param_t& param) { |
|
|
|
ZLOGI(TAG, "get_basic_param"); |
|
|
|
if (!m_bus->ping(m_id)) return err::kce_subdevice_overtime; |
|
|
|
if (!m_bus->ping(m_id)) return err::ksubdevice_overtime; |
|
|
|
m_bus->read_u16(m_id, feite::kRegServoCalibration, param.posCalibrate); |
|
|
|
m_bus->read_u16(m_id, feite::kRegServoMinAngle, param.minlimit); |
|
|
|
m_bus->read_u16(m_id, feite::kRegServoMaxAngle, param.maxlimit); |
|
|
|