MapManager.java
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         // Apply remappings
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 }


android_apps
Author(s): Daniel Stonier , Kazuto Murase
autogenerated on Thu Jun 6 2019 21:11:28