|
|
@ -1,4 +1,6 @@ |
|
|
|
#include "mini_servo_motor_ctrl_module.hpp"
|
|
|
|
|
|
|
|
#include <string.h>
|
|
|
|
using namespace iflytop; |
|
|
|
using namespace std; |
|
|
|
#define TAG "MiniServo"
|
|
|
@ -36,6 +38,12 @@ int32_t MiniServoCtrlModule::module_xxx_reg(int32_t param_id, bool read, int32_t |
|
|
|
PROCESS_REG(kreg_mini_servo_protective_torque, REG_GET(m_cfg.protective_torque), REG_SET(m_cfg.protective_torque)); |
|
|
|
PROCESS_REG(kreg_mini_servo_is_move, mini_servo_is_move(&val), ACTION_NONE); |
|
|
|
|
|
|
|
PROCESS_REG(kreg_mini_servo_status, mini_servo_read_reg(kreg_mini_servo_status, &val), ACTION_NONE); |
|
|
|
PROCESS_REG(kreg_mini_servo_voltage, mini_servo_read_reg(kreg_mini_servo_voltage, &val), ACTION_NONE); |
|
|
|
PROCESS_REG(kreg_mini_servo_current, mini_servo_read_reg(kreg_mini_servo_current, &val), ACTION_NONE); |
|
|
|
PROCESS_REG(kreg_mini_servo_temperature, mini_servo_read_reg(kreg_mini_servo_temperature, &val), ACTION_NONE); |
|
|
|
PROCESS_REG(kreg_mini_servo_loadvalue, mini_servo_read_reg(kreg_mini_servo_loadvalue, &val), ACTION_NONE); |
|
|
|
|
|
|
|
default: |
|
|
|
return err::kmodule_not_find_reg; |
|
|
|
break; |
|
|
@ -61,6 +69,40 @@ int32_t MiniServoCtrlModule::mini_servo_read_pos(int32_t *pos) { |
|
|
|
if (!m_bus->getPos(m_idinbus, pos)) return err::ksubdevice_overtime; |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
int32_t MiniServoCtrlModule::mini_servo_read_reg(int32_t regoff, int32_t *regval) { |
|
|
|
if (regoff == kreg_mini_servo_status) { |
|
|
|
bool suc = m_bus->read_reg(m_idinbus, kRegServoStatus, regval); |
|
|
|
if (!suc) return err::ksubdevice_overtime; |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
if (regoff == kreg_mini_servo_voltage) { |
|
|
|
bool suc = m_bus->read_reg(m_idinbus, kRegServoCurrentVoltage, regval); |
|
|
|
if (!suc) return err::ksubdevice_overtime; |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
if (regoff == kreg_mini_servo_current) { |
|
|
|
bool suc = m_bus->read_reg(m_idinbus, kRegServoCurrentCurrent, regval); |
|
|
|
if (!suc) return err::ksubdevice_overtime; |
|
|
|
*regval = 6.5 * (*regval); |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
if (regoff == kreg_mini_servo_temperature) { |
|
|
|
bool suc = m_bus->read_reg(m_idinbus, kRegServoCurrentTemp, regval); |
|
|
|
if (!suc) return err::ksubdevice_overtime; |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
if (regoff == kreg_mini_servo_loadvalue) { |
|
|
|
bool suc = m_bus->read_reg(m_idinbus, kRegServoCurrentLoad, regval); |
|
|
|
if (!suc) return err::ksubdevice_overtime; |
|
|
|
return 0; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
int32_t MiniServoCtrlModule::mini_servo_active_cfg() { return 0; } |
|
|
|
int32_t MiniServoCtrlModule::mini_servo_stop(int32_t breakstop) { |
|
|
|
m_thread.stop(); |
|
|
@ -74,16 +116,19 @@ int32_t MiniServoCtrlModule::mini_servo_rotate(int32_t speed) { |
|
|
|
if (!m_state.enable) return err::kmini_servo_not_enable; |
|
|
|
if (!m_bus->isSupportMode1(m_idinbus)) return err::kmini_servo_mode_not_support; |
|
|
|
creg.module_status = 1; |
|
|
|
|
|
|
|
m_thread.start( |
|
|
|
[this, speed]() { |
|
|
|
befor_motor_move(); |
|
|
|
servo_status_t status = {0}; |
|
|
|
|
|
|
|
{ |
|
|
|
m_bus->runInMode1(m_idinbus, m_cfg.limit_torque, speed); |
|
|
|
|
|
|
|
while (true) { |
|
|
|
if (m_thread.getExitFlag()) break; |
|
|
|
if (!check_when_run()) break; |
|
|
|
if (!check_when_run(&status)) break; |
|
|
|
|
|
|
|
vTaskDelay(5); |
|
|
|
} |
|
|
|
} |
|
|
@ -114,7 +159,8 @@ int32_t MiniServoCtrlModule::mini_servo_move_to(int32_t pos3600) { |
|
|
|
befor_motor_move(); |
|
|
|
|
|
|
|
{ |
|
|
|
int32_t velocity = m_cfg.limit_velocity; |
|
|
|
int32_t velocity = m_cfg.limit_velocity; |
|
|
|
servo_status_t status = {0}; |
|
|
|
|
|
|
|
bool callsuc = false; |
|
|
|
for (size_t i = 0; i < 3; i++) { |
|
|
@ -128,18 +174,12 @@ int32_t MiniServoCtrlModule::mini_servo_move_to(int32_t pos3600) { |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
int32_t moveflag = 0; |
|
|
|
int32_t nowpos = 0; |
|
|
|
|
|
|
|
while (true) { |
|
|
|
if (m_thread.getExitFlag()) break; |
|
|
|
if (!check_when_run()) break; |
|
|
|
if (!check_when_run(&status)) break; |
|
|
|
|
|
|
|
moveflag = 0; |
|
|
|
m_bus->isMove(m_idinbus, &moveflag); |
|
|
|
m_bus->getPos(m_idinbus, &nowpos); |
|
|
|
|
|
|
|
if (poseq(nowpos, pos3600, 10) && moveflag == 0) break; |
|
|
|
if (poseq(status.pos, pos3600, 10) && status.isMove == 0) break; |
|
|
|
|
|
|
|
vTaskDelay(5); |
|
|
|
} |
|
|
@ -165,13 +205,13 @@ int32_t MiniServoCtrlModule::mini_servo_rotate_with_torque(int32_t torque) { |
|
|
|
m_thread.start( |
|
|
|
[this, torque]() { |
|
|
|
befor_motor_move(); |
|
|
|
|
|
|
|
servo_status_t status = {0}; |
|
|
|
{ |
|
|
|
m_bus->runInMode2(m_idinbus, torque); |
|
|
|
|
|
|
|
while (true) { |
|
|
|
if (m_thread.getExitFlag()) break; |
|
|
|
if (!check_when_run()) break; |
|
|
|
if (!check_when_run(&status)) break; |
|
|
|
vTaskDelay(5); |
|
|
|
} |
|
|
|
} |
|
|
@ -224,7 +264,32 @@ void MiniServoCtrlModule::after_motor_move() { |
|
|
|
creg.module_status = 0; |
|
|
|
} |
|
|
|
} |
|
|
|
bool MiniServoCtrlModule::check_when_run() { return true; } |
|
|
|
bool MiniServoCtrlModule::check_when_run(servo_status_t *status) { |
|
|
|
memset(status, 0, sizeof(servo_status_t)); |
|
|
|
|
|
|
|
int32_t moveflag = 0; |
|
|
|
int32_t nowpos = 0; |
|
|
|
bool suc = m_bus->isMove(m_idinbus, &moveflag); |
|
|
|
if (!suc) { |
|
|
|
return false; |
|
|
|
} |
|
|
|
suc = m_bus->getPos(m_idinbus, &nowpos); |
|
|
|
if (!suc) { |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
if (m_bus->getStatus(m_idinbus) != 0) { |
|
|
|
status->status = m_bus->getStatus(m_idinbus); |
|
|
|
ZLOGE(TAG, "check fail, status = %x", status->status); |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
status->isMove = moveflag; |
|
|
|
status->pos = nowpos; |
|
|
|
status->status = m_bus->getStatus(m_idinbus); |
|
|
|
ZLOGI(TAG, "moduleid:%d idinbus:%d status %x isMove %d pos %d", m_module_id, m_idinbus, status->status, status->isMove, status->pos); |
|
|
|
return true; |
|
|
|
} |
|
|
|
|
|
|
|
/***********************************************************************************************************************
|
|
|
|
* INTERNAL * |
|
|
|