From 269834228216c6d86ad35ca610d9b87faf2f6de6 Mon Sep 17 00:00:00 2001
From: Raphael Grimm <raphael.grimm@kit.edu>
Date: Mon, 23 Apr 2018 11:20:30 +0200
Subject: [PATCH] Move loading the robot from
 RobotUnitModule::RobotData::_preOnInitRobotUnit to
 RobotUnitModule::RobotData::_initVirtualRobot and call this function in
 RobotUnitModule::ModuleBase::onInitRobotUnit

Change other components to load the robot earlier
---
 .../RobotUnit/RobotUnitModules/RobotUnitModuleBase.cpp      | 1 +
 .../RobotUnitModules/RobotUnitModuleControlThread.cpp       | 2 +-
 .../RobotUnitModules/RobotUnitModuleControlThread.h         | 4 ++--
 .../RobotUnitModuleControllerManagement.cpp                 | 2 +-
 .../RobotUnitModules/RobotUnitModuleControllerManagement.h  | 4 ++--
 .../RobotUnit/RobotUnitModules/RobotUnitModuleRobotData.cpp | 4 +++-
 .../RobotUnit/RobotUnitModules/RobotUnitModuleRobotData.h   | 2 +-
 .../RobotUnitModuleSelfCollisionChecker.cpp                 | 4 ----
 .../RobotUnitModules/RobotUnitModuleSelfCollisionChecker.h  | 2 --
 .../RobotUnit/RobotUnitModules/RobotUnitModuleUnits.cpp     | 6 +-----
 .../units/RobotUnit/RobotUnitModules/RobotUnitModuleUnits.h | 2 --
 11 files changed, 12 insertions(+), 21 deletions(-)

diff --git a/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleBase.cpp b/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleBase.cpp
index 354d1638d..94036a4dc 100644
--- a/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleBase.cpp
+++ b/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleBase.cpp
@@ -116,6 +116,7 @@ namespace armarx
             auto guard = getGuard();
             throwIfStateIsNot(RobotUnitState::InitializingComponent, __FUNCTION__);
 
+            cast_to_and_call(::armarx::RobotUnitModule::RobotData, _initVirtualRobot(), true);
 
 #define call_module_hook(Type) cast_to_and_call(::armarx::RobotUnitModule::Type, _preOnInitRobotUnit(), true)
             for_each_module(call_module_hook)
diff --git a/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleControlThread.cpp b/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleControlThread.cpp
index 7434e8d61..08816b35a 100644
--- a/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleControlThread.cpp
+++ b/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleControlThread.cpp
@@ -506,7 +506,7 @@ namespace armarx
             controlThreadId = std::this_thread::get_id();
         }
 
-        void ControlThread::_postOnInitRobotUnit()
+        void ControlThread::_preOnInitRobotUnit()
         {
             try
             {
diff --git a/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleControlThread.h b/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleControlThread.h
index c732eb482..665f17f1c 100644
--- a/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleControlThread.h
+++ b/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleControlThread.h
@@ -61,8 +61,8 @@ namespace armarx
         private:
             ///@see \ref ModuleBase::_preFinishControlThreadInitialization
             void _preFinishControlThreadInitialization();
-            ///@see \ref ModuleBase::_postOnInitRobotUnit
-            void _postOnInitRobotUnit();
+            ///@see \ref ModuleBase::_preOnInitRobotUnit
+            void _preOnInitRobotUnit();
             // //////////////////////////////////////////////////////////////////////////////////////// //
             // ///////////////////////////////////// ice interface //////////////////////////////////// //
             // //////////////////////////////////////////////////////////////////////////////////////// //
diff --git a/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleControllerManagement.cpp b/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleControllerManagement.cpp
index 6d5e841a5..3b5e3bb28 100644
--- a/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleControllerManagement.cpp
+++ b/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleControllerManagement.cpp
@@ -677,7 +677,7 @@ namespace armarx
             nJointControllers.clear();
         }
 
-        void ControllerManagement::_postOnInitRobotUnit()
+        void ControllerManagement::_preOnInitRobotUnit()
         {
             controllerCreateRobot = _module<RobotData>().cloneRobot();
         }
diff --git a/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleControllerManagement.h b/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleControllerManagement.h
index 91300315a..08d197d02 100644
--- a/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleControllerManagement.h
+++ b/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleControllerManagement.h
@@ -53,8 +53,8 @@ namespace armarx
             // ///////////////////////////////// RobotUnitModule hooks //////////////////////////////// //
             // //////////////////////////////////////////////////////////////////////////////////////// //
         private:
-            /// @see ModuleBase::_postOnInitRobotUnit
-            void _postOnInitRobotUnit();
+            /// @see ModuleBase::_preOnInitRobotUnit
+            void _preOnInitRobotUnit();
             /// @see ModuleBase::_preFinishRunning
             void _preFinishRunning();
             /// @see ModuleBase::_postFinishRunning
diff --git a/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleRobotData.cpp b/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleRobotData.cpp
index dc91877a6..ab976c3e4 100644
--- a/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleRobotData.cpp
+++ b/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleRobotData.cpp
@@ -74,8 +74,10 @@ namespace armarx
             return clone;
         }
 
-        void armarx::RobotUnitModule::RobotData::_preOnInitRobotUnit()
+        void armarx::RobotUnitModule::RobotData::_initVirtualRobot()
         {
+            std::lock_guard<std::mutex> guard {robotMutex};
+            ARMARX_CHECK_IS_NULL(robot);
             robotNodeSetName    = getProperty<std::string>("RobotNodeSetName").getValue();
             robotProjectName    = getProperty<std::string>("RobotFileNameProject").getValue();
             robotFileName       = getProperty<std::string>("RobotFileName").getValue();
diff --git a/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleRobotData.h b/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleRobotData.h
index 35a474f1e..ad3f31798 100644
--- a/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleRobotData.h
+++ b/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleRobotData.h
@@ -76,7 +76,7 @@ namespace armarx
             // //////////////////////////////////////////////////////////////////////////////////////// //
         private:
             /// @see ModuleBase::_preOnInitRobotUnit
-            void _preOnInitRobotUnit();
+            void _initVirtualRobot();
             // //////////////////////////////////////////////////////////////////////////////////////// //
             // /////////////////////////////////// Module interface /////////////////////////////////// //
             // //////////////////////////////////////////////////////////////////////////////////////// //
diff --git a/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleSelfCollisionChecker.cpp b/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleSelfCollisionChecker.cpp
index 017015656..4c345629a 100644
--- a/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleSelfCollisionChecker.cpp
+++ b/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleSelfCollisionChecker.cpp
@@ -111,10 +111,6 @@ namespace armarx
                 }
             }
             setSelfCollisionAvoidanceFrequency(getProperty<float>("SelfCollisionCheckFrequency").getValue());
-        }
-
-        void SelfCollisionChecker::_postOnInitRobotUnit()
-        {
             setSelfCollisionAvoidanceDistance(getProperty<float>("MinSelfDistance").getValue());
         }
 
diff --git a/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleSelfCollisionChecker.h b/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleSelfCollisionChecker.h
index 7645cf87e..2ac3d7d1d 100644
--- a/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleSelfCollisionChecker.h
+++ b/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleSelfCollisionChecker.h
@@ -82,8 +82,6 @@ namespace armarx
         private:
             /// @see ModuleBase::_preOnInitRobotUnit
             void _preOnInitRobotUnit();
-            /// @see ModuleBase::_postOnInitRobotUnit
-            void _postOnInitRobotUnit();
             /// @see ModuleBase::_postFinishControlThreadInitialization
             void _postFinishControlThreadInitialization();
             /// @see ModuleBase::_preFinishRunning
diff --git a/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleUnits.cpp b/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleUnits.cpp
index 9a963cd85..8dd4ea34b 100644
--- a/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleUnits.cpp
+++ b/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleUnits.cpp
@@ -485,6 +485,7 @@ namespace armarx
 
         void Units::_preOnInitRobotUnit()
         {
+            unitCreateRobot = _module<RobotData>().cloneRobot();
             ARMARX_DEBUG << "add emergency stop master";
             {
                 emergencyStopMaster = new RobotUnitEmergencyStopMaster {&_module<ControlThread>(),  getProperty<std::string>("EmergencyStopTopic").getValue()};
@@ -508,11 +509,6 @@ namespace armarx
             ARMARX_DEBUG << "add emergency stop master...done!";
         }
 
-        void Units::_postOnInitRobotUnit()
-        {
-            unitCreateRobot = _module<RobotData>().cloneRobot();
-        }
-
         void Units::_postOnExitRobotUnit()
         {
             ARMARX_DEBUG << "remove EmergencyStopMaster";
diff --git a/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleUnits.h b/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleUnits.h
index 692f2aa43..f6667acfd 100644
--- a/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleUnits.h
+++ b/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleUnits.h
@@ -109,8 +109,6 @@ namespace armarx
         private:
             /// @see ModuleBase::_preOnInitRobotUnit
             void _preOnInitRobotUnit();
-            /// @see ModuleBase::_postOnInitRobotUnit
-            void _postOnInitRobotUnit();
             /// @see ModuleBase::_icePropertiesInitialized
             void _icePropertiesInitialized();
             /// @see ModuleBase::_preFinishRunning
-- 
GitLab