From e7310a030db0a06056dcf22a2c5560698315e7d4 Mon Sep 17 00:00:00 2001
From: Raphael Grimm <raphael.grimm@kit.edu>
Date: Tue, 10 Nov 2020 15:48:40 +0100
Subject: [PATCH] Use PWM mode for joint if no torque mode exists

---
 .../RobotUnitModules/RobotUnitModuleUnits.cpp         |  7 ++++++-
 .../RobotUnit/RobotUnitModules/RobotUnitModuleUnits.h | 11 +++++------
 2 files changed, 11 insertions(+), 7 deletions(-)

diff --git a/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleUnits.cpp b/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleUnits.cpp
index 6865ebae8..d562fa2dc 100644
--- a/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleUnits.cpp
+++ b/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleUnits.cpp
@@ -190,7 +190,8 @@ namespace armarx::RobotUnitModule
         const Ice::PropertiesPtr& properties,
         const std::string& positionControlMode,
         const std::string& velocityControlMode,
-        const std::string& torqueControlMode
+        const std::string& torqueControlMode,
+        const std::string& pwmControlMode
     )
     {
         ARMARX_TRACE;
@@ -278,6 +279,10 @@ namespace armarx::RobotUnitModule
                 init_controller(positionControlMode, ad.ctrlPos, (ControlTarget1DoFActuatorPosition*)0);
                 init_controller(velocityControlMode, ad.ctrlVel, (ControlTarget1DoFActuatorVelocity*)0);
                 init_controller(torqueControlMode,   ad.ctrlTor, (ControlTarget1DoFActuatorTorque*)0);
+                if (!ad.ctrlTor)
+                {
+                    init_controller(pwmControlMode,  ad.ctrlTor, (ControlTarget1DoFActuatorPWM*)0);
+                }
 
                 if (ad.ctrlPos || ad.ctrlTor || ad.ctrlVel)
                 {
diff --git a/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleUnits.h b/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleUnits.h
index c099939eb..d2f4ee59c 100644
--- a/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleUnits.h
+++ b/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleUnits.h
@@ -252,12 +252,11 @@ namespace armarx::RobotUnitModule
         /// @brief Initializes the TcpControllerUnit
         virtual void initializeTcpControllerUnit();
         /// @brief Create the \ref KinematicUnit (this function should be called in \ref initializeKinematicUnit)
-        ManagedIceObjectPtr createKinematicSubUnit(
-            const Ice::PropertiesPtr& properties,
-            const std::string& positionControlMode = ControlModes::Position1DoF,
-            const std::string& velocityControlMode = ControlModes::Velocity1DoF,
-            const std::string& torqueControlMode = ControlModes::Torque1DoF
-        );
+        ManagedIceObjectPtr createKinematicSubUnit(const Ice::PropertiesPtr& properties,
+                const std::string& positionControlMode = ControlModes::Position1DoF,
+                const std::string& velocityControlMode = ControlModes::Velocity1DoF,
+                const std::string& torqueControlMode   = ControlModes::Torque1DoF,
+                const std::string& pwmControlMode      = ControlModes::PWM1DoF);
         /**
          * @brief Registers a unit for management (the Unit is added and removed to the \ref ArmarXManager
          * and updated with new values.
-- 
GitLab