]> rtime.felk.cvut.cz Git - orte.git/blob - orte/Robot_Demo/src/org/ocera/orte/demo/MainActivity.java
ROBOT_DEMO: add robot demo for Android
[orte.git] / orte / Robot_Demo / src / org / ocera / orte / demo / MainActivity.java
1 package org.ocera.orte.demo;
2
3 import java.io.BufferedInputStream;
4 import java.io.BufferedOutputStream;
5 import java.io.File;
6 import java.io.FileOutputStream;
7 import java.io.IOException;
8
9 import org.ocera.orte.DomainApp;
10 import org.ocera.orte.JOrte;
11 import org.ocera.orte.Publication;
12 import org.ocera.orte.R;
13 import org.ocera.orte.types.DomainProp;
14 import org.ocera.orte.types.NtpTime;
15 import org.ocera.orte.types.ORTEConstant;
16 import org.ocera.orte.types.PublProp;
17
18 import android.app.Activity;
19 import android.content.Context;
20 import android.hardware.Sensor;
21 import android.hardware.SensorEvent;
22 import android.hardware.SensorEventListener;
23 import android.hardware.SensorManager;
24 import android.os.AsyncTask;
25 import android.os.Bundle;
26 import android.os.PowerManager;
27 import android.os.PowerManager.WakeLock;
28 import android.view.View;
29 import android.widget.Button;
30 import android.widget.TextView;
31  
32 public class MainActivity extends Activity {
33
34         Button start = null;
35         Button stop = null;
36         Button start_pub = null;
37         Button stop_pub = null;
38         TextView textview = null;
39         Process manager = null;
40         Thread publisher = null;
41         boolean tContinue = true;
42         
43     private SensorManager mSensorManager;
44     private PowerManager mPowerManager;
45     private WakeLock mWakeLock;
46     private Sensor mGravity;
47     
48     private AsyncTask<Void, Short, Void> accel;
49     
50     private short mLeft;
51     private short mRight;
52     
53     private Object lock = new Object();
54     
55      static 
56     {
57       System.loadLibrary("jorte");     
58     }
59     
60     private class HandleAccelerometer extends AsyncTask<Void, Short, Void> implements SensorEventListener {
61         
62         public static final int VMAX = 16000;
63         //private int count = 0;
64         
65                 @Override
66                 protected Void doInBackground(Void... params) {
67                         return null;
68                 }
69
70                 @Override
71                 public void onAccuracyChanged(Sensor sensor, int accuracy) {
72                 }
73
74                 @Override
75                 public void onSensorChanged(SensorEvent event) {
76                          if (event.sensor.getType() != Sensor.TYPE_ACCELEROMETER)
77                      return;
78                          
79                          //if (count > 1) {
80                                  calculateSpeed(event.values[0],event.values[1]);
81                                  //count = 0;
82                          //}
83                          //else
84                                  //count++;
85                 }
86                 
87                 private void calculateSpeed(float mAccelX, float mAccelY) {
88                 short right = 0;
89                 short left = 0;
90                 
91                         double r=0.15;
92                         double angle = 0, lenght, v, omega; 
93
94                         v = (double)mAccelY/mGravity.getMaximumRange();
95                         omega = (double)mAccelX/mGravity.getMaximumRange();
96                         lenght = Math.sqrt(Math.pow(v,2) + Math.pow(omega,2));
97                         /* if lenght si more than 1 is used unit circle */
98                         if (lenght >= 1) {
99                                 /* computing new speed and omega */
100                                 angle = Math.atan2(mAccelY, mAccelX);   
101                                 v = Math.sin(angle);
102                                 omega = Math.cos(angle);
103                         }
104                         omega *= 2;
105
106                         right = (short)(-((v + r*omega))*VMAX);
107                         left = (short)(-(v - r*omega)*VMAX);
108                         
109                         publishProgress(right, left);
110                 }
111                 
112                 @Override
113                 protected void onProgressUpdate(Short... input) {
114                         synchronized(lock) {
115                                 mRight = input[0];
116                                 mLeft = input[1];
117                                 textview.setText("Values: left = " + input[1] + ", right = " + input[0]);
118                         }
119                 }
120         }
121         
122         public void copyManager() {
123                 BufferedInputStream bis = null;
124                 BufferedOutputStream bos = null;
125                 
126                 String path = getFilesDir().getAbsolutePath() + "/ortemanager";
127                 
128                 if (!new File(path).exists()) {
129                         try {
130                                 bis = new BufferedInputStream(getAssets().open("ortemanager"));
131                                 bos = new BufferedOutputStream(new FileOutputStream(path));
132                                 
133                                 int delka;
134                                 byte[] buffer = new byte[4096];
135                                 
136                                 while((delka = bis.read(buffer, 0, 4096)) > 0) {
137                                         bos.write(buffer, 0, delka);
138                                 }
139                                 
140                                 bos.flush();
141                                 bos.close();
142                                 bis.close();
143                                 
144                                 Runtime.getRuntime().exec("chmod 744 " + path);
145                         } catch (IOException e) {
146                                 e.printStackTrace();
147                         }
148                 }
149         }
150         
151     @Override
152     protected void onResume() {
153         super.onResume();
154
155         accel = new HandleAccelerometer().execute();
156         mSensorManager.registerListener((SensorEventListener)accel, mGravity, SensorManager.SENSOR_DELAY_UI);
157         
158         mWakeLock.acquire();
159     }
160
161     @Override
162     protected void onPause() {
163         super.onPause();
164         
165         mSensorManager.unregisterListener((SensorEventListener)accel);
166         accel.cancel(true);
167         accel = null;
168         
169         mWakeLock.release();
170     }
171         
172     @Override
173     public void onCreate(Bundle savedInstanceState) {
174         super.onCreate(savedInstanceState);
175         setContentView(R.layout.activity_main);
176         
177                 textview = (TextView)findViewById(R.id.textView1);
178                 
179                 start = (Button)findViewById(R.id.button1);
180                 stop = (Button)findViewById(R.id.button2);
181                 stop.setEnabled(false);
182                 start_pub = (Button)findViewById(R.id.button3);
183                 start_pub.setEnabled(false);
184                 stop_pub = (Button)findViewById(R.id.button4);
185                 stop_pub.setEnabled(false);
186         
187         // Get an instance of the SensorManager
188         mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
189
190         // Get an instance of the PowerManager
191         mPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
192         
193         // Create a bright wake lock
194         mWakeLock = mPowerManager.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, getClass().getName());
195         
196         mGravity = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
197         
198         copyManager();
199
200                 start.setOnClickListener(new View.OnClickListener() {
201                     String[] orte = {getFilesDir().getAbsolutePath() + "/ortemanager","-p 192.168.1.5:192.168.1.8"};
202                         
203                     @Override
204                         public void onClick(View v) {
205                                 start.setEnabled(false);
206                                 stop.setEnabled(true);
207                                 try {
208                                         manager = Runtime.getRuntime().exec(orte);
209                                 } catch (IOException e) {
210                                         e.printStackTrace();
211                                 }
212                                 start_pub.setEnabled(true);
213                         }
214                 });
215
216                 stop.setOnClickListener(new View.OnClickListener() {
217                         
218                         @Override
219                         public void onClick(View v) {
220                                 start.setEnabled(true);
221                                 stop.setEnabled(false);
222                                 start_pub.setEnabled(false);
223                                 stop_pub.setEnabled(false);
224                                 manager.destroy();
225                         }
226                 });
227                 
228                 start_pub.setOnClickListener(new View.OnClickListener() {
229                         
230                         @Override
231                         public void onClick(View v) {
232                                 start_pub.setEnabled(false);
233                                 stop_pub.setEnabled(true);
234                                 tContinue = true;
235                                 
236                                 publisher = new Thread(new Runnable() {
237                                         
238                                         @Override
239                                         public void run() {
240                                             NtpTime persistence = new NtpTime(3);
241                                             int strength = 1;
242                                             MyEvents events = new MyEvents();
243                                             
244                                             DomainApp appDomain = new DomainApp(ORTEConstant.ORTE_DEFAULT_DOMAIN,
245                                 DomainProp.defaultPropsCreate(),
246                                 events,
247                                 false); 
248                                             
249                                             HelloMsg hellomsg = new HelloMsg(appDomain,"motion_speed");
250                                             
251                                             PublProp publProp = new PublProp(hellomsg.getTopic(),
252                                          "motion_speed",                                
253                                 persistence,
254                                                                  strength);
255                                             
256                                             Publication pub = appDomain.createPublication(publProp,
257                                 hellomsg);
258                                             
259                                             while(tContinue)
260                                                 {
261                                               synchronized(lock) {
262                                                   hellomsg.left = mLeft;
263                                                   hellomsg.right = mRight;
264                                               }
265                                           pub.send(hellomsg); 
266                                           System.out.println("<<  data to send: " + hellomsg);
267                                           JOrte.sleepMs(100);
268                                           System.out.println(" ");
269                                                 }
270                                             
271                                             pub = null;
272                                             System.gc();
273                                             appDomain = null;
274                                             System.gc();
275                                         }
276                                 });
277                                 publisher.start();
278                         }
279                 });
280                 
281                 stop_pub.setOnClickListener(new View.OnClickListener() {
282                         
283                         @Override
284                         public void onClick(View v) {
285                                 start_pub.setEnabled(true);
286                                 stop_pub.setEnabled(false);
287                                 tContinue = false;
288                         }
289                 });
290                 
291
292     }
293 }