Skip to content

Commit a671902

Browse files
authored
implemented led write manager (#15)
1 parent 87d69f3 commit a671902

File tree

3 files changed

+31
-6
lines changed

3 files changed

+31
-6
lines changed

dynamixel_ros_control/include/dynamixel_ros_control/dynamixel_hardware_interface.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ class DynamixelHardwareInterface : public hardware_interface::SystemInterface
6161
bool setUpCmdReadManager();
6262
bool setUpTorqueWriteManager();
6363
bool setUpControlWriteManager();
64+
bool setUpLEDWriteManager();
6465

6566
bool isHardwareOk() const;
6667
bool reboot() const;
@@ -89,6 +90,7 @@ class DynamixelHardwareInterface : public hardware_interface::SystemInterface
8990
// Write
9091
SyncWriteManager control_write_manager_;
9192
SyncWriteManager torque_write_manager_;
93+
SyncWriteManager led_write_manager_;
9294

9395
// Parameters
9496
bool debug_{false};

dynamixel_ros_control/include/dynamixel_ros_control/joint.hpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,13 @@ struct State
1313
std::unordered_map<std::string, double> goal;
1414
};
1515

16+
struct LED_State
17+
{
18+
double red{0};
19+
double green{0};
20+
double blue{0};
21+
};
22+
1623
struct MimicState
1724
{
1825
std::unordered_map<std::string, double> current;
@@ -83,6 +90,8 @@ class Joint
8390
std::shared_ptr<transmission_interface::Transmission> command_transmission;
8491
std::unordered_map<std::string, MimicState> mimic_joints_states_; // joint_name -> (interface_name -> value)
8592

93+
LED_State led_state;
94+
8695
private:
8796
ControlMode getControlModeFromInterfaces(const std::vector<std::string>& interfaces) const;
8897
bool initDefaultGoalValues();

dynamixel_ros_control/src/dynamixel_hardware_interface.cpp

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ DynamixelHardwareInterface::on_configure(const rclcpp_lifecycle::State& previous
215215

216216
// Set up sync read / write managers
217217
if (!setUpStateAndStatusReadManager() || !setUpTorqueWriteManager() || !setUpControlWriteManager() ||
218-
!setUpCmdReadManager()) {
218+
!setUpCmdReadManager() || !setUpLEDWriteManager()) {
219219
return hardware_interface::CallbackReturn::FAILURE;
220220
}
221221

@@ -690,6 +690,18 @@ bool DynamixelHardwareInterface::setUpControlWriteManager()
690690
return control_write_manager_.init(driver_);
691691
}
692692

693+
bool DynamixelHardwareInterface::setUpLEDWriteManager()
694+
{
695+
led_write_manager_ = SyncWriteManager();
696+
for (auto& [name, joint] : joints_) {
697+
led_write_manager_.addRegister(*joint.dynamixel, DXL_REGISTER_LED_RED, joint.led_state.red);
698+
led_write_manager_.addRegister(*joint.dynamixel, DXL_REGISTER_LED_GREEN, joint.led_state.green);
699+
led_write_manager_.addRegister(*joint.dynamixel, DXL_REGISTER_LED_BLUE, joint.led_state.blue);
700+
}
701+
702+
return led_write_manager_.init(driver_);
703+
}
704+
693705
bool DynamixelHardwareInterface::isHardwareOk() const
694706
{
695707
bool ok = true;
@@ -836,11 +848,13 @@ bool DynamixelHardwareInterface::unloadControllers() const
836848
void DynamixelHardwareInterface::setColorLED(const int& red, const int& green, const int& blue)
837849
{
838850
for (auto& [name, joint] : joints_) {
839-
if (!joint.dynamixel->writeRegister(DXL_REGISTER_LED_RED, red) ||
840-
!joint.dynamixel->writeRegister(DXL_REGISTER_LED_GREEN, green) ||
841-
!joint.dynamixel->writeRegister(DXL_REGISTER_LED_BLUE, blue)) {
842-
DXL_LOG_ERROR("Failed to set color LED for joint '" << name << "'");
843-
}
851+
joint.led_state.red = red;
852+
joint.led_state.green = green;
853+
joint.led_state.blue = blue;
854+
}
855+
// assumes communication mutex is already locked
856+
if (!led_write_manager_.write()) {
857+
DXL_LOG_ERROR("Failed to write LED colors.");
844858
}
845859
}
846860

0 commit comments

Comments
 (0)