| /******************************************************************************* |
| * Copyright (c) 2018 Agence spatiale canadienne / Canadian Space Agency |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * Pierre Allard, |
| * Regent L'Archeveque, |
| * Sebastien Gemme - initial API and implementation |
| * SPDX-License-Identifier: EPL-1.0 |
| * |
| *******************************************************************************/ |
| package org.eclipse.apogy.addons.ros.impl; |
| |
| import java.util.HashMap; |
| |
| import org.eclipse.apogy.addons.ros.ApogyAddonsROSFactory; |
| import org.eclipse.apogy.addons.ros.ROSPublisher; |
| import org.ros.internal.message.Message; |
| import org.slf4j.Logger; |
| import org.slf4j.LoggerFactory; |
| |
| public class ROSPublisherManagerCustomImpl extends ROSPublisherManagerImpl { |
| |
| private static final Logger Logger = LoggerFactory.getLogger(ROSPublisherManagerImpl.class); |
| |
| public static int PUBLISHER_LAUNCH_MAX_TRIES = 5; |
| |
| @Override |
| public HashMap<String, ROSPublisher<?>> getPublishers() { |
| if (this.publishers == null) |
| this.publishers = new HashMap<String, ROSPublisher<?>>(); |
| return this.publishers; |
| } |
| |
| @Override |
| public void createPublisher(String topicName, String messageType) { |
| ROSPublisher<Message> publisher = ApogyAddonsROSFactory.eINSTANCE.createROSPublisher(); |
| publisher.setTopicName(topicName); |
| publisher.setMessageType(messageType); |
| getPublishers().put(topicName, publisher); |
| } |
| |
| @Override |
| public void launch() { |
| for (ROSPublisher<?> publisher : getPublishers().values()) { |
| try { |
| publisher.launch(getNode()); |
| } catch (Exception e) { |
| |
| } |
| } |
| setRunning(true); |
| } |
| |
| @Override |
| public void stop() { |
| for (ROSPublisher<?> publisher : getPublishers().values()) |
| publisher.stop(); |
| } |
| |
| @Override |
| public <T extends Message> T createMessage(String topicName) { |
| ROSPublisher<T> publisher = getPublisher(topicName); |
| if (publisher != null) |
| return publisher.newMessage(); |
| else |
| return null; |
| } |
| |
| @Override |
| public <T extends Message> void publish(String topicName, T message) { |
| getPublisher(topicName).publish(message); |
| } |
| |
| @Override |
| @SuppressWarnings("unchecked") |
| public <T extends Message> ROSPublisher<T> getPublisher(String topicName) { |
| if (getPublishers().containsKey(topicName)) { |
| ROSPublisher<T> publisher = (ROSPublisher<T>) (getPublishers().get(topicName)); |
| if (!publisher.isLaunched()) { |
| int tries = 0; |
| while (!publisher.isLaunched() && tries <= PUBLISHER_LAUNCH_MAX_TRIES) { |
| try { |
| publisher.launch(getNode()); |
| tries++; |
| } catch (Exception ex) { |
| Logger.error("Could not launch Publisher <" + topicName + ">."); |
| } |
| |
| // Wait before we try again. |
| if (!publisher.isLaunched()) { |
| try { |
| Thread.sleep(1000); |
| } catch (InterruptedException e) { |
| Logger.error(e.getMessage(), e); |
| } |
| } |
| } |
| } |
| |
| return publisher; |
| } |
| |
| return null; |
| } |
| |
| } // ROSPublisherManagerImpl |