blob: d70f2ad78b69e8c1c7c16aa4285f5458e8815dec [file] [log] [blame]
/**
* Copyright (c) 2020-2021 Robert Bosch GmbH.
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Robert Bosch GmbH - initial API and implementation
*/
package org.eclipse.app4mc.slg.ros2.generators
import java.util.Collection
import org.eclipse.app4mc.amalthea.model.EventStimulus
import org.eclipse.app4mc.amalthea.model.InterProcessStimulus
import org.eclipse.app4mc.amalthea.model.PeriodicStimulus
import org.eclipse.app4mc.amalthea.model.Stimulus
import org.eclipse.app4mc.slg.ros2.transformers.utils.Utils
class RosTaskGenerator {
// Suppress default constructor
private new() {
throw new IllegalStateException("Utility class");
}
static def String getDeclaration(Collection<Stimulus> stimuli, Collection<String> publishers, Collection<String> clientDeclarations) '''
«FOR stimulus : stimuli»
«IF stimulus instanceof PeriodicStimulus»
rclcpp::TimerBase::SharedPtr «(stimulus as PeriodicStimulus).name»_timer_;
«ENDIF»
«IF stimulus instanceof EventStimulus»
rclcpp::Subscription<std_msgs::msg::String>::SharedPtr «(stimulus as EventStimulus).name»_subscription_;
«ENDIF»
«IF stimulus instanceof InterProcessStimulus»
rclcpp::Service<«(stimulus as InterProcessStimulus).name»_service::srv::«Utils.toIdlCompliantName((stimulus as InterProcessStimulus).name + '_service')»>::SharedPtr «(stimulus as InterProcessStimulus).name»_service;
«ENDIF»
«ENDFOR»
«FOR publisher : publishers»
rclcpp::Publisher<std_msgs::msg::String>::SharedPtr «publisher»;
«ENDFOR»
«FOR decl: clientDeclarations»
«decl»;
«ENDFOR»
'''
static def String getInitialisation(String nodeName, Collection<Stimulus> stimuli, Collection<String> publishers, Collection<String> clientInits) '''
«FOR stimulus : stimuli»
«IF stimulus instanceof PeriodicStimulus»
«(stimulus as PeriodicStimulus).name»_timer_ = this->create_wall_timer(
«(stimulus as PeriodicStimulus).recurrence.value»«(stimulus as PeriodicStimulus).recurrence.unit», std::bind(&«nodeName»::«(stimulus as PeriodicStimulus).name»_timer_callback, this));
«ENDIF»
«IF stimulus instanceof EventStimulus»
«(stimulus as EventStimulus).name»_subscription_ = this->create_subscription<std_msgs::msg::String>(
"«(stimulus as EventStimulus).name»", 10, std::bind(&«nodeName»::«(stimulus as EventStimulus).name»_subscription_callback, this, _1));
«ENDIF»
«IF stimulus instanceof InterProcessStimulus»
«(stimulus as InterProcessStimulus).name»_service = this->create_service<«(stimulus as InterProcessStimulus).name»_service::srv::«Utils.toIdlCompliantName((stimulus as InterProcessStimulus).name + '_service')»>("«(stimulus as InterProcessStimulus).name»_service", &«(stimulus as InterProcessStimulus).name»_service_callback);
«ENDIF»
«ENDFOR»
«FOR publisher : publishers»
«publisher» = this->create_publisher<std_msgs::msg::String>("«publisher.replace("_publisher", "")»", 10);
«ENDFOR»
«FOR init : clientInits»
«init»;
«ENDFOR»
'''
static def String getServiceCallback(Collection<Stimulus> stimuli, Collection<String> stepCalls) '''
«FOR stimulus : stimuli»
«IF stimulus instanceof InterProcessStimulus»
void «(stimulus as InterProcessStimulus).name»_service_callback(const std::shared_ptr<«(stimulus as InterProcessStimulus).name»_service::srv::«Utils.toIdlCompliantName((stimulus as InterProcessStimulus).name + '_service')»::Request> request,
std::shared_ptr<«(stimulus as InterProcessStimulus).name»_service::srv::«Utils.toIdlCompliantName((stimulus as InterProcessStimulus).name + '_service')»::Response> response) {
«FOR call : stepCalls»
«""» «call»;
«ENDFOR»
}
«ENDIF»
«ENDFOR»
'''
static def String getCallback(Collection<Stimulus> stimuli, Collection<String> stepCalls) '''
«FOR stimulus : stimuli»
«IF stimulus instanceof PeriodicStimulus»
void «(stimulus as PeriodicStimulus).name»_timer_callback() {
«FOR call : stepCalls»
«""» «call»;
«ENDFOR»
}
«ENDIF»
«IF stimulus instanceof EventStimulus»
void «(stimulus as EventStimulus).name»_subscription_callback(const std_msgs::msg::String::SharedPtr msg) {
«FOR call : stepCalls»
«""» «call»;
«ENDFOR»
}
«ENDIF»
«ENDFOR»
'''
static def String getHeaders(Collection<String> includes) '''
«FOR include : includes»
#include "«include»"
«ENDFOR»
'''
}