27#include <lttng/tracepoint.h>
35using namespace std::chrono_literals;
43: schedulerThread(nullptr),
44 signalDetectorLoop(nullptr),
45 signalDetector(nullptr),
81 lastState_ = std::numeric_limits<int64_t>::quiet_NaN();
85 auto context =
getNode()->get_node_base_interface()->get_context();
106 auto & orthogonal = pair.second;
107 auto & clients = orthogonal->getClients();
109 for (
auto & client : clients)
114 if (updatableClient !=
nullptr)
122 std::vector<std::shared_ptr<ISmaccComponent>> components;
123 client->getComponents(components);
124 for (
auto & componententry : components)
126 auto updatableComponent =
dynamic_cast<ISmaccUpdatable *
>(componententry.get());
127 if (updatableComponent !=
nullptr)
131 "Adding updatable component: " <<
demangleType(
typeid(*updatableComponent)));
152 auto & orthogonal = pair.second;
153 auto & behaviors = orthogonal->getClientBehaviors().back();
155 for (
auto & currentBehavior : behaviors)
160 if (updatableClientBehavior !=
nullptr)
164 "Adding updatable behavior: " <<
demangleType(
typeid(updatableClientBehavior)));
165 updatableElements.push_back(updatableClientBehavior);
171 if (updatableState !=
nullptr)
173 updatableElements.push_back(updatableState);
177 for (
auto & sr : statereactors)
180 if (updatableStateReactor !=
nullptr)
184 "Adding updatable stateReactorr: " <<
demangleType(
typeid(updatableStateReactor)));
185 updatableElements.push_back(updatableStateReactor);
190 for (
auto & eg : eventgenerators)
193 if (updatableEventGenerator !=
nullptr)
197 "Adding updatable eventGenerator: " <<
demangleType(
typeid(updatableEventGenerator)));
198 updatableElements.push_back(updatableEventGenerator);
215 RCLCPP_INFO(
getLogger(),
"[SignalDetector] ROS initialization complete, enabling polling loop");
262 RCLCPP_INFO(
getLogger(),
"[SignalDetector] Terminating scheduler...");
276 TRACETOOLS_TRACEPOINT(spinOnce);
289 auto updatableElementNameStr =
demangleType(
typeid(*updatableClient));
290 auto updatableElementName = updatableElementNameStr.c_str();
295 "[PollOnce] update client call: " <<
demangleType(
typeid(*updatableClient)));
301 catch (
const std::exception & e)
305 "Error in updatable elemnent " << updatableElementName <<
": " << e.what() <<
'\n');
314 this->smaccStateMachine_->stateMachineCurrentAction !=
316 this->smaccStateMachine_->stateMachineCurrentAction !=
318 this->smaccStateMachine_->stateMachineCurrentAction !=
326 for (
auto * udpatableStateElement : stateElement)
328 std::string updatableElementName =
demangleType(
typeid(*udpatableStateElement));
329 auto updatableElementNameCstr = updatableElementName.c_str();
332 getLogger(),
"pollOnce update client behavior call: "
342 catch (std::exception & ex)
344 RCLCPP_ERROR(
getLogger(),
"Exception during Signal Detector update loop. %s.", ex.what());
356 rclcpp::Node::SharedPtr _;
368 if (!rclcpp::ok() ||
end_)
370 RCLCPP_INFO(
getLogger(),
"[SignalDetector] Shutdown requested before initialization completed");
376 if (!nh->get_parameter(
"signal_detector_loop_freq", this->loop_rate_hz))
380 "Signal Detector frequency (ros param signal_detector_loop_freq) was not set, using default "
388 getLogger(),
"Signal Detector frequency (ros param signal_detector_loop_freq): %lf",
392 nh->set_parameter(rclcpp::Parameter(
"signal_detector_loop_freq", this->
loop_rate_hz));
398 RCLCPP_INFO_STREAM(
getLogger(),
"[SignalDetector] Running in single-threaded mode.");
401 while (rclcpp::ok() && !
end_)
403 RCLCPP_INFO_STREAM_THROTTLE(
406 rclcpp::spin_some(nh);
412 RCLCPP_INFO_STREAM(
getLogger(),
"[SignalDetector] Running in multi-threaded mode.");
414 rclcpp::executors::MultiThreadedExecutor executor;
415 executor.add_node(nh);
441 RCLCPP_INFO(rclcpp::get_logger(
"SMACC"),
"SignalDetector: SIGQUIT received.");
StateMachineInternalAction stateMachineCurrentAction
rclcpp::Node::SharedPtr getNode()
const std::map< std::string, std::shared_ptr< smacc2::ISmaccOrthogonal > > & getOrthogonals() const
std::recursive_mutex m_mutex_
std::vector< std::shared_ptr< StateReactor > > & getStateReactors()
std::vector< std::shared_ptr< SmaccEventGenerator > > & getEventGenerators()
SmaccFifoScheduler * scheduler_
void terminateScheduler()
boost::thread signalDetectorThread_
void notifyStateExited(ISmaccState *currentState)
ExecutionModel executionModel_
void initialize(ISmaccStateMachine *stateMachine)
std::vector< std::vector< ISmaccUpdatable * > > updatableStateElements_
std::atomic< bool > rosInitialized_
rclcpp::Logger getLogger()
rclcpp::Node::SharedPtr getNode()
SmaccFifoScheduler::processor_handle processorHandle_
SignalDetector(SmaccFifoScheduler *scheduler, ExecutionModel executionModel=ExecutionModel::SINGLE_THREAD_SPINNER)
std::atomic< int64_t > lastState_
std::vector< ISmaccUpdatable * > updatableClients_
void notifyRosInitialized()
void setProcessorHandle(SmaccFifoScheduler::processor_handle processorHandle)
void findUpdatableStateElements(ISmaccState *currentState)
void findUpdatableClientsAndComponents()
ISmaccStateMachine * smaccStateMachine_
void notifyStateConfigured(ISmaccState *currentState)
std::atomic< bool > initialized_
static SmExecution & getInstance()
SignalDetector * signalDetector
std::string demangleType(const std::type_info *tinfo)
void onSignalShutdown(int sig)
boost::statechart::fifo_scheduler< SmaccFifoWorker, SmaccAllocator > SmaccFifoScheduler
smacc2_state_update_start