29#include <boost/current_function.hpp>
30#include <boost/preprocessor/seq/for_each.hpp>
31#include <boost/preprocessor/variadic/to_seq.hpp>
33#include <VirtualRobot/VirtualRobot.h>
38#include <RobotAPI/interface/units/RobotUnit/RobotUnitInterface.h>
54 template <
class Targ,
class Src>
58 Targ* ptr =
dynamic_cast<Targ*
>(src);
63 throw std::invalid_argument{
"Ptr passed to CheckedCastAndDeref is NULL"};
65 throw std::invalid_argument{
67 "' passed to CheckedCastAndDeref is is not related to target type '" +
118#define forward_declare(r, data, Mod) TYPEDEF_PTRS_HANDLE(Mod);
119 BOOST_PP_SEQ_FOR_EACH(
forward_declare, , BOOST_PP_VARIADIC_TO_SEQ(RobotUnitModules))
120#undef forward_declare
186 static std::atomic<ModuleBase*> Instance_;
208 static_assert(std::is_base_of<ModuleBase, T>::value,
209 "The type has to derive ModuleBase");
211 return dynamic_cast<T&
>(*Instance_);
230#define using_module_types(...) using_module_types_impl(__VA_ARGS__)
231#define using_module_types_impl(r, data, Mod) using Module##Mod = Mod;
232 BOOST_PP_SEQ_FOR_EACH(
using_module_types, , BOOST_PP_VARIADIC_TO_SEQ(RobotUnitModules))
233#undef using_module_types
234#undef using_module_types_impl
251 return dynamic_cast<T&
>(*this);
262 return dynamic_cast<const T&
>(*this);
589 const std::string& fnc,
590 bool onlyWarn =
false)
const;
606 const std::string& fnc,
607 bool onlyWarn =
false)
const;
649 return isShuttingDown_.load();
659 isShuttingDown_.store(
true);
719 static constexpr std::size_t
722 return std::numeric_limits<std::size_t>::max();
738 static const std::set<RobotUnitState> DevicesReadyStates;
742 std::atomic_bool isShuttingDown_{
false};
#define TYPEDEF_PTRS_HANDLE(T)
#define forward_declare(r, data, Mod)
#define using_module_types(...)
ComponentPropertyDefinitions(std::string prefix, bool hasObjectNameParameter=true)
Component()
Protected default constructor. Used for virtual inheritance. Use createManagedIceObject() instead.
A high level controller writing its results into ControlTargets.
void setDescription(const std::string &description)
Sets the detailed description of the property user.
std::string prefix
Prefix of the properties such as namespace, domain, component name, etc.
void setPrefix(std::string prefix)
ModuleBasePropertyDefinitions(std::string prefix)
virtual void finishDeviceInitialization()
Transition InitializingDevices -> InitializingUnits.
RobotUnitState getRobotUnitState() const
Returns the RobotUnit's State.
void shutDown()
Requests the RobotUnit to shut down.
void onConnectComponent() final override
void onExitComponent() final override
void _componentPropertiesUpdated(const std::set< std::string > &)
Hook for deriving RobotUnitModules called in componentPropertiesUpdated.
void _postFinishUnitInitialization()
Hook for deriving RobotUnitModules called in finishUnitInitialization (called after the state has cha...
void componentPropertiesUpdated(const std::set< std::string > &changedProperties) override
void _preFinishComponentInitialization()
Hook for deriving RobotUnitModules called in finishComponentInitialization (called before the state h...
virtual void finishRunning()
Transition Running -> Exiting.
void _icePropertiesInitialized()
Hook for deriving RobotUnitModules called in icePropertiesInitialized.
T & _module()
Returns this as ref to the given type.
bool areDevicesReady() const
Returns whether Devices are ready.
void _postOnExitRobotUnit()
Hook for deriving RobotUnitModules called in onExitComponent (called after onExitRobotUnit was called...
void onDisconnectComponent() final override
virtual void finishUnitInitialization()
Transition InitializingUnits -> RobotUnitState::WaitingForRTThreadInitialization.
void checkDerivedClasses() const
Checks whether the implementing class derives all modules.
GuardType getGuard() const
Returns a guard to the RobotUnits mutex.
void throwIfInControlThread(const std::string &fnc) const
Throws if the current thread is the ControlThread.
virtual IceUtil::Time getControlThreadTargetPeriod() const =0
The ControlThread's period.
virtual void finishControlThreadInitialization()
Transition InitializingControlThread -> Running.
void onInitComponent() final override
void _postOnInitRobotUnit()
Hook for deriving RobotUnitModules called in onInitComponent (called after onInitRobotUnit was called...
void throwIfStateIsNot(const std::set< RobotUnitState > &stateSet, const std::string &fnc, bool onlyWarn=false) const
Throws an exception if the current state is not in.
void _preOnInitRobotUnit()
Hook for deriving RobotUnitModules called in onInitComponent (called before onInitRobotUnit was calle...
void _postOnDisconnectRobotUnit()
Hook for deriving RobotUnitModules called in onDisconnectComponent (called after onDisconnectRobotUni...
void throwIfStateIs(const std::set< RobotUnitState > &stateSet, const std::string &fnc, bool onlyWarn=false) const
Throws an exception if the current state is in.
T * _modulePtr()
Returns this as ptr to the given type.
virtual void onConnectRobotUnit()
called in onConnectComponent
virtual void onDisconnectRobotUnit()
called in onDisconnecComponent
bool inControlThread() const
Returns whether the current thread is the ControlThread.
std::chrono::high_resolution_clock ClockType
void _postOnConnectRobotUnit()
Hook for deriving RobotUnitModules called in onConnectComponent (called after onConnectRobotUnit was ...
void _postFinishControlThreadInitialization()
Hook for deriving RobotUnitModules called in finishControlThreadInitialization (called after the stat...
void _postFinishDeviceInitialization()
Hook for deriving RobotUnitModules called in finishDeviceInitialization (called after the state has c...
virtual void onInitRobotUnit()
called in onInitComponent
static T & Instance()
Returns the singleton instance of the given class.
virtual void onExitRobotUnit()
called in onExitComponent before calling finishRunning
virtual void joinControlThread()=0
Implementations have to join their ControlThread in this hook. (used by RobotUnit::finishRunning())
void _preFinishDeviceInitialization()
Hook for deriving RobotUnitModules called in finishDeviceInitialization (called before the state has ...
static constexpr std::size_t IndexSentinel()
Returns a sentinel value for an index (std::numeric_limits<std::size_t>::max())
bool isShuttingDown() const
Returns whether the RobotUnit is shutting down.
void _preFinishUnitInitialization()
Hook for deriving RobotUnitModules called in finishUnitInitialization (called before the state has ch...
static ModuleBase & Instance()
Returns the singleton instance of this class.
void _preOnConnectRobotUnit()
Hook for deriving RobotUnitModules called in onConnectComponent (called before onConnectRobotUnit was...
void _preOnExitRobotUnit()
Hook for deriving RobotUnitModules called in onExitComponent (called before onExitRobotUnit was calle...
const T * _modulePtr() const
Returns this as ptr to the given type.
std::recursive_timed_mutex MutexType
The type of recursive_mutex used in this class.
void throwIfDevicesNotReady(const std::string &fnc) const
Throws if the Devices are not ready.
void _postFinishRunning()
Hook for deriving RobotUnitModules called in finishRunning (called after the state has changed)
void icePropertiesInitialized() override
std::unique_lock< MutexType > GuardType
void _preFinishRunning()
Hook for deriving RobotUnitModules called in finishRunning (called before the state has changed)
void _preFinishControlThreadInitialization()
Hook for deriving RobotUnitModules called in finishControlThreadInitialization (called before the sta...
const T & _module() const
Returns this as ref to the given type.
std::string getDefaultName() const override
void _postFinishComponentInitialization()
Hook for deriving RobotUnitModules called in finishComponentInitialization (called after the state ha...
void _preOnDisconnectRobotUnit()
Hook for deriving RobotUnitModules called in onDisconnectComponent (called before onDisconnectRobotUn...
std::chrono::high_resolution_clock::time_point TimePointType
virtual void finishComponentInitialization()
Transition InitializingComponent -> InitializingDevices.
The RobotUnit class manages a robot and its controllers.
#define ARMARX_CHECK_NOT_NULL(ptr)
This macro evaluates whether ptr is not null and if it turns out to be false it will throw an Express...
This file offers overloads of toIce() and fromIce() functions for STL container types.
std::ostream & operator<<(std::ostream &os, const PythonApplicationManager::Paths &paths)
RobotUnitState
The current state of the multi step initialization of a RobotUnit.
@ InitializingControlThread
std::string GetTypeString(const std::type_info &tinf, bool withoutNamespaceSpecifier=false)
Targ & CheckedCastAndDeref(Src *src)
const std::string & to_string(const std::string &s)