Go to the documentation of this file.00001 package com.github.rosjava.android_remocons.common_tools;
00002
00003 import org.ros.android.MessageCallable;
00004 import org.ros.exception.RosException;
00005 import org.ros.exception.RosRuntimeException;
00006 import org.ros.message.MessageListener;
00007 import org.ros.namespace.GraphName;
00008 import org.ros.node.AbstractNodeMain;
00009 import org.ros.node.ConnectedNode;
00010 import org.ros.node.topic.Subscriber;
00011
00012
00016 public class ListenerNode<T> extends AbstractNodeMain
00017 {
00018 private String topicName;
00019 private String messageType;
00020 private T lastMessage;
00021 private MessageCallable<String, T> callable;
00022
00023 public ListenerNode(String topic, String type)
00024 {
00025 topicName = topic;
00026 messageType = type;
00027 }
00028
00029 public T getLastMessage()
00030 {
00031 return lastMessage;
00032 }
00033
00034 public void setTopicName(String topicName)
00035 {
00036 this.topicName = topicName;
00037 }
00038
00039 public void setMessageType(String messageType)
00040 {
00041 this.messageType = messageType;
00042 }
00043
00044 public void setMessageToStringCallable(MessageCallable<String, T> callable)
00045 {
00046 this.callable = callable;
00047 }
00048
00049 @Override
00050 public GraphName getDefaultNodeName() {
00051 return GraphName.of("get_" + topicName + "_node");
00052 }
00053
00054 @Override
00055 public void onStart(ConnectedNode connectedNode) {
00056 Subscriber<T> subscriber = connectedNode.newSubscriber(topicName, messageType);
00057 subscriber.addMessageListener(new MessageListener<T>() {
00058 @Override
00059 public void onNewMessage(final T message) {
00060 lastMessage = message;
00061 if (callable != null) {
00062 callable.call(message);
00063 }
00064 }
00065 });
00066 }
00067
00073 public void waitForResponse() throws RosException {
00074 int count = 0;
00075 while ( lastMessage == null ) {
00076 try {
00077 Thread.sleep(200);
00078 } catch (Exception e) {
00079 throw new RosRuntimeException(e);
00080 }
00081 if ( count == 20 ) {
00082 throw new RosException("timed out waiting for topic messages");
00083 }
00084 count = count + 1;
00085 }
00086 }
00087 }