blob: 7a7ac2b16619c2867068b1090320e250026f7948 [file] [log] [blame]
/*******************************************************************************
* 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