Go to the documentation of this file.00001 package com.github.rosjava.android_apps.make_a_map;
00002
00003 import android.content.Context;
00004 import android.os.AsyncTask;
00005
00006 import com.github.rosjava.android_remocons.common_tools.apps.AppRemappings;
00007
00008 import org.ros.exception.RemoteException;
00009 import org.ros.exception.ServiceNotFoundException;
00010 import org.ros.namespace.GraphName;
00011 import org.ros.namespace.NameResolver;
00012 import org.ros.node.AbstractNodeMain;
00013 import org.ros.node.ConnectedNode;
00014 import org.ros.node.service.ServiceClient;
00015 import org.ros.node.service.ServiceResponseListener;
00016
00017 import java.util.concurrent.ExecutionException;
00018 import java.util.concurrent.TimeUnit;
00019 import java.util.concurrent.TimeoutException;
00020
00021 import world_canvas_msgs.SaveMap;
00022 import world_canvas_msgs.SaveMapRequest;
00023 import world_canvas_msgs.SaveMapResponse;
00024
00025 public class MapManager extends AbstractNodeMain {
00026
00027 private ConnectedNode connectedNode;
00028 private ServiceResponseListener<SaveMapResponse> saveServiceResponseListener;
00029
00030 private String mapName;
00031 private String saveSrvName;
00032 private NameResolver nameResolver;
00033 private boolean nameResolverSet = false;
00034 private boolean waitingFlag = false;
00035
00036 private StatusCallback statusCallback;
00037
00038 public interface StatusCallback {
00039 public void timeoutCallback();
00040 public void onSuccessCallback(SaveMapResponse arg0);
00041 public void onFailureCallback(Exception e);
00042 }
00043 public void registerCallback(StatusCallback statusCallback) {
00044 this.statusCallback = statusCallback;
00045 }
00046
00047 public MapManager(final Context context, final AppRemappings remaps) {
00048
00049 saveSrvName = remaps.get(context.getString(R.string.save_map_srv));
00050 mapName = "";
00051 }
00052
00053 public void setMapName(String name) {
00054 mapName = name;
00055 }
00056
00057 public void setNameResolver(NameResolver newNameResolver) {
00058 nameResolver = newNameResolver;
00059 nameResolverSet = true;
00060 }
00061
00062 private void clearWaitFor(){
00063 waitingFlag = false;
00064 }
00065
00066 private boolean waitFor(final int timeout) {
00067 waitingFlag = true;
00068 AsyncTask<Void, Void, Boolean> asyncTask = new AsyncTask<Void, Void, Boolean>() {
00069 @Override
00070 protected Boolean doInBackground(Void... params) {
00071 int count = 0;
00072 int timeout_count = timeout * 1000 / 200;
00073 while(waitingFlag){
00074 try { Thread.sleep(200); }
00075 catch (InterruptedException e) { return false; }
00076 if(count < timeout_count){
00077 count += 1;
00078 }
00079 else{
00080 return false;
00081 }
00082 }
00083 return true;
00084 }
00085 }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
00086 try {
00087 return asyncTask.get(timeout, TimeUnit.SECONDS);
00088 } catch (InterruptedException e) {
00089 return false;
00090 } catch (ExecutionException e) {
00091 return false;
00092 } catch (TimeoutException e) {
00093 return false;
00094 }
00095 }
00096
00097 public void saveMap(){
00098 ServiceClient<SaveMapRequest, SaveMapResponse> saveMapClient = null;
00099 if (connectedNode != null) {
00100 try{
00101 if (nameResolverSet){
00102 saveSrvName = nameResolver.resolve(saveSrvName).toString();
00103 }
00104 saveMapClient = connectedNode.newServiceClient(saveSrvName, SaveMap._TYPE);
00105 } catch (ServiceNotFoundException e) {
00106 try {
00107 Thread.sleep(1000L);
00108 } catch (Exception ex) {
00109 }
00110 statusCallback.onFailureCallback(e);
00111 }
00112 if (saveMapClient != null){
00113 final SaveMapRequest request = saveMapClient.newMessage();
00114 request.setMapName(mapName);
00115 saveMapClient.call(request, new ServiceResponseListener<SaveMapResponse>(){
00116 @Override
00117 public void onSuccess(SaveMapResponse saveMapResponse) {
00118 if (waitingFlag){
00119 clearWaitFor();
00120 statusCallback.onSuccessCallback(saveMapResponse);
00121 }
00122 }
00123 @Override
00124 public void onFailure(RemoteException e) {
00125 if (waitingFlag) {
00126 clearWaitFor();
00127 statusCallback.onFailureCallback(e);
00128 }
00129 }
00130 });
00131 if(!waitFor(10)){
00132 statusCallback.timeoutCallback();
00133 }
00134 }
00135
00136 }
00137 }
00138 @Override
00139 public GraphName getDefaultNodeName() {
00140 return null;
00141 }
00142
00143 @Override
00144 public void onStart(final ConnectedNode connectedNode){
00145 super.onStart(connectedNode);
00146 this.connectedNode = connectedNode;
00147 saveMap();
00148 }
00149 }