]> rtime.felk.cvut.cz Git - orte.git/blobdiff - orte/Robot_Demo/src/org/ocera/orte/demo/MainActivity.java
ROBOT_DEMO: add publishers for "crane_cmd" and "magnet_cmd"
[orte.git] / orte / Robot_Demo / src / org / ocera / orte / demo / MainActivity.java
index 3b51c3673aed34ac044b88468505022badcf6069..b4f7f4723944d1f59a463900a92099624d95dcb0 100644 (file)
 package org.ocera.orte.demo;
 
-import java.io.BufferedInputStream;
-import java.io.BufferedOutputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-
 import org.ocera.orte.DomainApp;
-import org.ocera.orte.JOrte;
-import org.ocera.orte.Publication;
-import org.ocera.orte.R;
-import org.ocera.orte.types.DomainProp;
-import org.ocera.orte.types.NtpTime;
-import org.ocera.orte.types.ORTEConstant;
-import org.ocera.orte.types.PublProp;
+import org.ocera.orte.Manager;
 
 import android.app.Activity;
+import android.app.Dialog;
 import android.content.Context;
+import android.content.pm.ActivityInfo;
 import android.hardware.Sensor;
 import android.hardware.SensorEvent;
 import android.hardware.SensorEventListener;
 import android.hardware.SensorManager;
-import android.os.AsyncTask;
 import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
 import android.os.PowerManager;
 import android.os.PowerManager.WakeLock;
+import android.view.Menu;
+import android.view.MenuItem;
 import android.view.View;
+import android.view.View.OnClickListener;
 import android.widget.Button;
-import android.widget.TextView;
+import android.widget.EditText;
  
 public class MainActivity extends Activity {
-
-       Button start = null;
-       Button stop = null;
-       Button start_pub = null;
-       Button stop_pub = null;
-       TextView textview = null;
-       Process manager = null;
-       Thread publisher = null;
-       boolean tContinue = true;
-       
-    private SensorManager mSensorManager;
-    private PowerManager mPowerManager;
-    private WakeLock mWakeLock;
-    private Sensor mGravity;
-    
-    private AsyncTask<Void, Short, Void> accel;
-    
-    private short mLeft;
-    private short mRight;
-    
-    private Object lock = new Object();
-    
-     static 
-    {
-      System.loadLibrary("jorte");     
-    }
-    
-    private class HandleAccelerometer extends AsyncTask<Void, Short, Void> implements SensorEventListener {
-        
-       public static final int VMAX = 16000;
-       //private int count = 0;
-        
-               @Override
-               protected Void doInBackground(Void... params) {
-                       return null;
-               }
-
-               @Override
-               public void onAccuracyChanged(Sensor sensor, int accuracy) {
-               }
-
+       private Dialog voltageDialog = null;
+       static EditText voltage33 = null;
+       static EditText voltage50 = null;
+       static EditText voltage80 = null;
+       static EditText voltageBAT = null;
+       static Handler dialogHandler = new Handler() {
                @Override
-               public void onSensorChanged(SensorEvent event) {
-                        if (event.sensor.getType() != Sensor.TYPE_ACCELEROMETER)
-                    return;
-                        
-                        //if (count > 1) {
-                                calculateSpeed(event.values[0],event.values[1]);
-                                //count = 0;
-                        //}
-                        //else
-                                //count++;
-               }
-               
-               private void calculateSpeed(float mAccelX, float mAccelY) {
-               short right = 0;
-               short left = 0;
-               
-                       double r=0.15;
-                       double angle = 0, lenght, v, omega; 
-
-                       v = (double)mAccelY/mGravity.getMaximumRange();
-                       omega = (double)mAccelX/mGravity.getMaximumRange();
-                       lenght = Math.sqrt(Math.pow(v,2) + Math.pow(omega,2));
-                       /* if lenght si more than 1 is used unit circle */
-                       if (lenght >= 1) {
-                               /* computing new speed and omega */
-                               angle = Math.atan2(mAccelY, mAccelX);   
-                               v = Math.sin(angle);
-                               omega = Math.cos(angle);
-                       }
-                       omega *= 2;
-
-                       right = (short)(-((v + r*omega))*VMAX);
-                       left = (short)(-(v - r*omega)*VMAX);
-                       
-                       publishProgress(right, left);
-               }
-               
-               @Override
-               protected void onProgressUpdate(Short... input) {
-                       synchronized(lock) {
-                               mRight = input[0];
-                               mLeft = input[1];
-                               textview.setText("Values: left = " + input[1] + ", right = " + input[0]);
-                       }
-               }
-       }
-       
-       public void copyManager() {
-               BufferedInputStream bis = null;
-               BufferedOutputStream bos = null;
-               
-               String path = getFilesDir().getAbsolutePath() + "/ortemanager";
-               
-               if (!new File(path).exists()) {
-                       try {
-                               bis = new BufferedInputStream(getAssets().open("ortemanager"));
-                               bos = new BufferedOutputStream(new FileOutputStream(path));
-                               
-                               int delka;
-                               byte[] buffer = new byte[4096];
-                               
-                               while((delka = bis.read(buffer, 0, 4096)) > 0) {
-                                       bos.write(buffer, 0, delka);
+               public void handleMessage(Message msg) {
+                       double[] values = msg.getData().getDoubleArray("voltages");
+                       if (values != null) {
+                               if (voltage33 != null) {
+                                       voltage33.setText(Double.toString(values[0]));
+                               }
+                               if (voltage50 != null) {
+                                       voltage50.setText(Double.toString(values[1]));
+                               }
+                               if (voltage80 != null) {
+                                       voltage80.setText(Double.toString(values[2]));
+                               }
+                               if (voltageBAT != null) {
+                                       voltageBAT.setText(Double.toString(values[3]));
                                }
-                               
-                               bos.flush();
-                               bos.close();
-                               bis.close();
-                               
-                               Runtime.getRuntime().exec("chmod 744 " + path);
-                       } catch (IOException e) {
-                               e.printStackTrace();
                        }
                }
-       }
+    };
        
+       private Manager manager = null;
+    private String[] mgrs = {"192.168.1.5","192.168.1.8","192.168.1.29","10.1.1.1"};
+       private MotionSpeedPublish motion_speed_publ = null;
+       private MotionSpeedSubscribe motion_speed_subs = null;
+       private HokuyoScanSubscribe hokuyo_scan = null;
+       private PwrVoltageSubscribe pwr_voltage = null;
+       private MagnetCmdPublish magnet_cmd = null;
+       private CraneCmdPublish crane_cmd = null;
+    private SensorManager mSensorManager = null;
+    private Sensor mGravity = null;
+    private SensorEventListener accel = null;
+    private PowerManager mPowerManager = null;
+    private WakeLock mWakeLock = null;
+    private DomainApp appDomain = null;
+    private HokuyoView hokuyo_view = null;
+    private MenuItem speed_publ_item = null;
+    private MenuItem speed_subs_item = null;
+    private MenuItem hokuyo_item = null;
+
+    static {
+       System.loadLibrary("jorte");     
+    }
+
     @Override
     protected void onResume() {
         super.onResume();
 
-        accel = new HandleAccelerometer().execute();
-        mSensorManager.registerListener((SensorEventListener)accel, mGravity, SensorManager.SENSOR_DELAY_UI);
-        
         mWakeLock.acquire();
     }
 
@@ -162,132 +84,194 @@ public class MainActivity extends Activity {
     protected void onPause() {
         super.onPause();
         
-        mSensorManager.unregisterListener((SensorEventListener)accel);
-        accel.cancel(true);
-        accel = null;
+        if (motion_speed_publ != null && !motion_speed_publ.isCancelled()) {
+               motion_speed_publ.cancel();
+            mSensorManager.unregisterListener(accel);
+            this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
+               speed_publ_item.setTitle("Start motion control");
+        }
+        
+        if (motion_speed_subs != null && !motion_speed_subs.isCancelled()) {
+               hokuyo_view.runMotion(false);
+               motion_speed_subs.cancel();
+               hokuyo_view.invalidate();
+               speed_subs_item.setTitle("Start motion monitor");
+        }
+
+        if (hokuyo_scan != null && !hokuyo_scan.isCancelled()) {
+                       hokuyo_view.run(false);
+                       hokuyo_scan.cancel();
+                       hokuyo_view.invalidate();
+                       hokuyo_item.setTitle("Start LRF");
+        }
+
+        if (pwr_voltage != null && !pwr_voltage.isCancelled()) {
+               if (voltageDialog.isShowing())
+                       voltageDialog.dismiss();
+                       pwr_voltage.cancel();
+        }
         
         mWakeLock.release();
     }
-       
+    
     @Override
+    protected void onDestroy() {
+       super.onDestroy();
+       
+       if (crane_cmd != null && !crane_cmd.isCancelled()) {
+               crane_cmd.cancel();
+       }
+       
+       if (magnet_cmd != null && !crane_cmd.isCancelled()) {
+               magnet_cmd.cancel();
+       }
+       
+        if (appDomain != null) {
+               appDomain.destroy();
+               appDomain = null;
+        }
+        
+        if (manager != null) {
+               manager.destroy();
+               manager = null;
+        }
+    }
+       
+       @Override
     public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
-        setContentView(R.layout.activity_main);
+        setContentView(R.layout.hokuyo_view);
         
-               textview = (TextView)findViewById(R.id.textView1);
-               
-               start = (Button)findViewById(R.id.button1);
-               stop = (Button)findViewById(R.id.button2);
-               stop.setEnabled(false);
-               start_pub = (Button)findViewById(R.id.button3);
-               start_pub.setEnabled(false);
-               stop_pub = (Button)findViewById(R.id.button4);
-               stop_pub.setEnabled(false);
-       
-        // Get an instance of the SensorManager
+        voltageDialog = new Dialog(this,R.style.voltage_dialog);
+        voltageDialog.setCancelable(false);
+               voltageDialog.setContentView(R.layout.status_dialog);
+               Button okButton = (Button)voltageDialog.findViewById(R.id.button1);
+               okButton.setOnClickListener(new OnClickListener() {
+                       @Override
+                       public void onClick(View arg0) {
+                               voltageDialog.dismiss();
+                               pwr_voltage.cancel();
+                       }
+               });
+               voltage33 = (EditText)voltageDialog.findViewById(R.id.editText1);
+               voltage50 = (EditText)voltageDialog.findViewById(R.id.editText2);
+               voltage80 = (EditText)voltageDialog.findViewById(R.id.editText3);
+               voltageBAT = (EditText)voltageDialog.findViewById(R.id.editText4);
+               
         mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
-
-        // Get an instance of the PowerManager
-        mPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
+        mGravity = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
         
-        // Create a bright wake lock
+        mPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
         mWakeLock = mPowerManager.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, getClass().getName());
-       
-        mGravity = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
         
-        copyManager();
+        hokuyo_view = (HokuyoView) findViewById(R.id.hokuyo_view);
+        
+        manager = new Manager(mgrs);
 
-               start.setOnClickListener(new View.OnClickListener() {
-                   String[] orte = {getFilesDir().getAbsolutePath() + "/ortemanager","-p 192.168.1.5:192.168.1.8"};
-                       
-                   @Override
-                       public void onClick(View v) {
-                               start.setEnabled(false);
-                               stop.setEnabled(true);
-                               try {
-                                       manager = Runtime.getRuntime().exec(orte);
-                               } catch (IOException e) {
-                                       e.printStackTrace();
-                               }
-                               start_pub.setEnabled(true);
-                       }
-               });
+        appDomain = new DomainApp();
+        magnet_cmd = new MagnetCmdPublish(appDomain);
+        magnet_cmd.start();
+        crane_cmd = new CraneCmdPublish(appDomain);
+        crane_cmd.start();
+    }
+    
+       @Override
+       public boolean onCreateOptionsMenu(Menu menu) {
+               getMenuInflater().inflate(R.menu.activity_main, menu);
 
-               stop.setOnClickListener(new View.OnClickListener() {
-                       
-                       @Override
-                       public void onClick(View v) {
-                               start.setEnabled(true);
-                               stop.setEnabled(false);
-                               start_pub.setEnabled(false);
-                               stop_pub.setEnabled(false);
-                               manager.destroy();
-                       }
-               });
-               
-               start_pub.setOnClickListener(new View.OnClickListener() {
-                       
-                       @Override
-                       public void onClick(View v) {
-                               start_pub.setEnabled(false);
-                               stop_pub.setEnabled(true);
-                               tContinue = true;
-                               
-                               publisher = new Thread(new Runnable() {
-                                       
-                                       @Override
-                                       public void run() {
-                                           NtpTime persistence = new NtpTime(3);
-                                           int strength = 1;
-                                           MyEvents events = new MyEvents();
-                                           
-                                           DomainApp appDomain = new DomainApp(ORTEConstant.ORTE_DEFAULT_DOMAIN,
-                                DomainProp.defaultPropsCreate(),
-                                events,
-                                false);        
-                                           
-                                           HelloMsg hellomsg = new HelloMsg(appDomain,"motion_speed");
-                                           
-                                           PublProp publProp = new PublProp(hellomsg.getTopic(),
-                                        "motion_speed",                                
-                                persistence,
-                                                                strength);
-                                           
-                                           Publication pub = appDomain.createPublication(publProp,
-                                hellomsg);
-                                           
-                                           while(tContinue)
-                                               {
-                                             synchronized(lock) {
-                                                 hellomsg.left = mLeft;
-                                                 hellomsg.right = mRight;
-                                             }
-                                         pub.send(hellomsg); 
-                                         System.out.println("<<  data to send: " + hellomsg);
-                                         JOrte.sleepMs(100);
-                                         System.out.println(" ");
-                                               }
-                                           
-                                           pub = null;
-                                           System.gc();
-                                           appDomain = null;
-                                           System.gc();
-                                       }
-                               });
-                               publisher.start();
-                       }
-               });
+               return true;
+       }
+       
+       @Override
+       public boolean onOptionsItemSelected (MenuItem item) {
+               System.out.println(item.getTitle());
                
-               stop_pub.setOnClickListener(new View.OnClickListener() {
-                       
-                       @Override
-                       public void onClick(View v) {
-                               start_pub.setEnabled(true);
-                               stop_pub.setEnabled(false);
-                               tContinue = false;
-                       }
-               });
+               if(item.getTitle().equals("Start motion control")) {
+                       accel = new HandleAccelerometer();
+                       mSensorManager.registerListener(accel, mGravity, SensorManager.SENSOR_DELAY_GAME);
+                       if (motion_speed_publ == null)
+                               motion_speed_publ = new MotionSpeedPublish(mGravity.getMaximumRange(),appDomain);
+                       motion_speed_publ.start();
+                       speed_publ_item = item;
+                       this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
+                       item.setTitle("Stop motion control");
+               }
+               else if (item.getTitle().equals("Stop motion control")) {
+                       mSensorManager.unregisterListener(accel);
+                       motion_speed_publ.cancel();
+                       this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
+                       item.setTitle("Start motion control");
+               }
+               else if (item.getTitle().equals("Start motion monitor")) {
+                       if (motion_speed_subs == null)
+                               motion_speed_subs = new MotionSpeedSubscribe(appDomain, hokuyo_view);
+                       motion_speed_subs.start();
+                       hokuyo_view.runMotion(true);
+                       hokuyo_view.invalidate();
+                       speed_subs_item = item;
+                       item.setTitle("Stop motion monitor");
+               }
+               else if (item.getTitle().equals("Stop motion monitor")) {
+                       hokuyo_view.runMotion(false);
+                       motion_speed_subs.cancel();
+                       hokuyo_view.invalidate();
+                       item.setTitle("Start motion monitor");
+               }
+               else if (item.getTitle().equals("Start LRF")) {
+                       if (hokuyo_scan == null)
+                               hokuyo_scan = new HokuyoScanSubscribe(appDomain, hokuyo_view);
+                       hokuyo_scan.start();
+                       hokuyo_view.run(true);
+                       hokuyo_view.invalidate();
+                       hokuyo_item = item;
+                       item.setTitle("Stop LRF");
+               }
+               else if (item.getTitle().equals("Stop LRF")) {
+                       hokuyo_view.run(false);
+                       hokuyo_scan.cancel();
+                       hokuyo_view.invalidate();
+                       item.setTitle("Start LRF");
+               }
+               else if (item.getTitle().equals("Lift up")) {
+                       crane_cmd.send((short)0x100);
+                       item.setTitle("Lift down");
+               }
+               else if (item.getTitle().equals("Lift down")) {
+                       crane_cmd.send((short)0x190);
+                       item.setTitle("Lift up");
+               }
+               else if (item.getTitle().equals("Magnet on")) {
+                       magnet_cmd.send((short)1);
+                       item.setTitle("Magnet off");                    
+               }
+               else if (item.getTitle().equals("Magnet off")) {
+                       magnet_cmd.send((short)0);
+                       item.setTitle("Magnet on");                     
+               }
+               else if (item.getTitle().equals("Voltage monitor")) {
+                       if (pwr_voltage == null)
+                               pwr_voltage = new PwrVoltageSubscribe(appDomain, dialogHandler);
+                       pwr_voltage.start();
+                       voltageDialog.show();
+               }
+               else if (item.getTitle().equals("Exit")) {
+                       finish();
+               }
                
+               return true;
+       }
+       
+    private class HandleAccelerometer implements SensorEventListener {
+
+       @Override
+       public void onAccuracyChanged(Sensor sensor, int accuracy) {}
 
+       @Override
+       public void onSensorChanged(SensorEvent event) {
+                if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
+                        if (motion_speed_publ != null)
+                                motion_speed_publ.setSpeed(event.values[0], event.values[1]);
+                }
+       }
     }
-}
\ No newline at end of file
+}