]> rtime.felk.cvut.cz Git - orte.git/blob - orte/contrib/Robot_Demo/src/org/ocera/orte/demo/MainActivity.java
8c80301c45169bc7399f6fc91137356b253dbaef
[orte.git] / orte / contrib / Robot_Demo / src / org / ocera / orte / demo / MainActivity.java
1 package org.ocera.orte.demo;
2
3 import org.ocera.orte.DomainApp;
4 import org.ocera.orte.Manager;
5
6 import android.app.Activity;
7 import android.app.AlertDialog;
8 import android.content.Context;
9 import android.content.DialogInterface;
10 import android.content.DialogInterface.OnDismissListener;
11 import android.content.SharedPreferences;
12 import android.content.pm.ActivityInfo;
13 import android.hardware.Sensor;
14 import android.hardware.SensorEvent;
15 import android.hardware.SensorEventListener;
16 import android.hardware.SensorManager;
17 import android.net.wifi.WifiInfo;
18 import android.net.wifi.WifiManager;
19 import android.net.wifi.WifiManager.WifiLock;
20 import android.os.AsyncTask;
21 import android.os.Bundle;
22 import android.os.Handler;
23 import android.os.Message;
24 import android.os.PowerManager;
25 import android.os.PowerManager.WakeLock;
26 import android.text.format.Formatter;
27 import android.view.GestureDetector;
28 import android.view.LayoutInflater;
29 import android.view.Menu;
30 import android.view.MenuItem;
31 import android.view.MotionEvent;
32 import android.view.View;
33 import android.widget.EditText;
34 import android.widget.TextView;
35  
36 public class MainActivity extends Activity {
37         private AlertDialog voltageDialog = null;
38         private AlertDialog aboutDialog = null;
39         private AlertDialog managersDialog = null;
40         private EditText managersField = null;
41         private TextView ownIP = null;
42         private NetworkInfo wifiInfoTask = null; 
43         static EditText voltage33 = null;
44         static EditText voltage50 = null;
45         static EditText voltage80 = null;
46         static EditText voltageBAT = null;
47         static Handler dialogHandler = new Handler() {
48                 @Override
49                 public void handleMessage(Message msg) {
50                         double[] values = msg.getData().getDoubleArray("voltages");
51                         if (values != null) {
52                                 if (voltage33 != null) {
53                                         voltage33.setText(Double.toString(values[0]));
54                                 }
55                                 if (voltage50 != null) {
56                                         voltage50.setText(Double.toString(values[1]));
57                                 }
58                                 if (voltage80 != null) {
59                                         voltage80.setText(Double.toString(values[2]));
60                                 }
61                                 if (voltageBAT != null) {
62                                         voltageBAT.setText(Double.toString(values[3]));
63                                 }
64                         }
65                 }
66     };
67         
68         private Manager manager = null;
69     private String mgrs = null;
70         private MotionSpeedPublish motion_speed_publ = null;
71         private MotionSpeedSubscribe motion_speed_subs = null;
72         private HokuyoScanSubscribe hokuyo_scan = null;
73         private PwrVoltageSubscribe pwr_voltage = null;
74         private MagnetCmdPublish magnet_cmd = null;
75         private CraneCmdPublish crane_cmd = null;
76     private SensorManager mSensorManager = null;
77     private Sensor mGravity = null;
78     private SensorEventListener accel = null;
79     private PowerManager mPowerManager = null;
80     private WifiManager mWifiManager = null;
81     private WakeLock mWakeLock = null;
82     private WakeLock mDimLock = null;
83     private WifiLock mWifiLock = null;
84     private DomainApp appDomain = null;
85     private HokuyoView hokuyo_view = null;
86     private SharedPreferences prefs = null;
87     private GestureDetector gDetector = null;
88
89     static {
90         System.loadLibrary("jorte");     
91     }
92
93     @Override
94     protected void onPause() {
95         super.onPause();
96         
97         if (motion_speed_publ != null && !motion_speed_publ.isCancelled()) {
98                 motion_speed_publ.cancel();
99             mSensorManager.unregisterListener(accel);
100             this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
101             mDimLock.release();
102             mWifiLock.release();
103         }
104         
105         if (motion_speed_subs != null && !motion_speed_subs.isCancelled()) {
106                 hokuyo_view.runMotion(false);
107                 motion_speed_subs.cancel();
108                 hokuyo_view.invalidate();
109             mWakeLock.release();
110             mWifiLock.release();
111         }
112
113         if (hokuyo_scan != null && !hokuyo_scan.isCancelled()) {
114                         hokuyo_view.run(false);
115                         hokuyo_scan.cancel();
116                         hokuyo_view.invalidate();
117                 mWakeLock.release();
118                 mWifiLock.release();
119         }
120     }
121     
122     @Override
123     protected void onDestroy() {
124         super.onDestroy();
125
126         if (pwr_voltage != null && !pwr_voltage.isCancelled()) {
127                 if (voltageDialog.isShowing())
128                         voltageDialog.dismiss();
129         }
130         
131         if (crane_cmd != null && !crane_cmd.isCancelled()) {
132                 crane_cmd.cancel();
133         }
134         
135         if (magnet_cmd != null && !crane_cmd.isCancelled()) {
136                 magnet_cmd.cancel();
137         }
138         
139         if (appDomain != null) {
140                 appDomain.destroy();
141                 appDomain = null;
142         }
143         
144         if (manager != null) {
145                 manager.destroy();
146                 manager = null;
147         }
148     }
149         
150         @Override
151     public void onCreate(Bundle savedInstanceState) {
152         super.onCreate(savedInstanceState);
153         setContentView(R.layout.hokuyo_view);
154         
155         mPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
156         mWakeLock = mPowerManager.newWakeLock(
157                         PowerManager.SCREEN_BRIGHT_WAKE_LOCK,
158                         getClass().getName() + " Bright");
159         mDimLock = mPowerManager.newWakeLock(
160                         PowerManager.SCREEN_DIM_WAKE_LOCK,
161                         getClass().getName() + " Dim");
162
163         mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
164         mWifiLock = mWifiManager.createWifiLock(
165                         android.os.Build.VERSION.SDK_INT >= 12
166                         ? WifiManager.WIFI_MODE_FULL_HIGH_PERF
167                         : WifiManager.WIFI_MODE_FULL, getClass().getName());
168         
169         prefs = getSharedPreferences("prefs", 0);
170         mgrs = prefs.getString("managers", "10.1.1.1");
171         
172                 AlertDialog.Builder voltageBuilder = new AlertDialog.Builder(this);
173                 LayoutInflater inflater = getLayoutInflater();
174                 View voltageView = inflater.inflate(R.layout.status_dialog, null);
175                 voltageBuilder.setView(voltageView);
176                 voltageBuilder.setPositiveButton("OK",null);
177                 voltageBuilder.setTitle("Voltages");
178                 voltageDialog = voltageBuilder.create();
179                 voltageDialog.setOnDismissListener(new OnDismissListener(){
180                         @Override
181                         public void onDismiss(DialogInterface arg0) {
182                                 voltageDialog.dismiss();
183                                 pwr_voltage.cancel();
184                                 mDimLock.release();
185                         }
186                 });
187                 voltage33 = (EditText)voltageView.findViewById(R.id.editText1);
188                 voltage50 = (EditText)voltageView.findViewById(R.id.editText2);
189                 voltage80 = (EditText)voltageView.findViewById(R.id.editText3);
190                 voltageBAT = (EditText)voltageView.findViewById(R.id.editText4);
191                 
192                 AlertDialog.Builder builder = new AlertDialog.Builder(this);
193                 View aboutView = inflater.inflate(R.layout.about_dialog, null);
194                 builder.setView(aboutView);
195                 builder.setPositiveButton("OK", null);
196                 aboutDialog = builder.create();
197                 
198                 AlertDialog.Builder managersBuilder = new AlertDialog.Builder(this);
199                 View managersView = inflater.inflate(R.layout.managers_view, null);
200                 ownIP = (TextView)managersView.findViewById(R.id.ownIP);
201                 managersField = (EditText)managersView.findViewById(R.id.managers);
202                 managersField.setText(mgrs);
203                 
204                 managersBuilder.setView(managersView);
205                 managersBuilder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
206                         @Override
207                         public void onClick(DialogInterface dialog, int which) {
208                                 SharedPreferences.Editor editor = prefs.edit();
209                                 mgrs = managersField.getText().toString();
210                                 editor.putString("managers", mgrs);
211                                 editor.commit();
212                                 
213                                 if (manager != null)
214                                         manager.destroy();
215                                 manager = new Manager(mgrs);
216                                 
217                                 managersDialog.dismiss();
218                         }
219                 });
220                 managersBuilder.setNeutralButton("Cancel", null);
221                 managersBuilder.setTitle("Set fellow managers");
222                 managersDialog = managersBuilder.create();
223                 managersDialog.setOnDismissListener(new OnDismissListener() {
224                         @Override
225                         public void onDismiss(DialogInterface arg0) {
226                                 managersField.setText(mgrs);
227                                 wifiInfoTask.cancel(false);
228                         }
229                 });
230                 
231         mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
232         mGravity = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
233         
234         hokuyo_view = (HokuyoView) findViewById(R.id.hokuyo_view);
235         gDetector = new GestureDetector(hokuyo_view.getContext(), new HokuyoGestures());
236         hokuyo_view.setOnTouchListener(new View.OnTouchListener() {
237                         @Override
238                         public boolean onTouch(View v, MotionEvent event) {
239                                 return gDetector.onTouchEvent(event);
240                         }
241                 
242         });
243
244         manager = new Manager(mgrs);
245
246         appDomain = new DomainApp();
247         magnet_cmd = new MagnetCmdPublish(appDomain);
248         magnet_cmd.start();
249         crane_cmd = new CraneCmdPublish(appDomain);
250         crane_cmd.start();
251     }
252     
253         @Override
254         public boolean onCreateOptionsMenu(Menu menu) {
255                 getMenuInflater().inflate(R.menu.activity_main, menu);
256
257                 return true;
258         }
259         
260         @Override
261         public boolean onOptionsItemSelected (MenuItem item) {
262                 if (item.getTitle().equals("Crane: up")) {
263                         crane_cmd.send(0x190);
264                         item.setTitle("Crane: down");
265                 }
266                 else if (item.getTitle().equals("Crane: down")) {
267                         crane_cmd.send(0x100);
268                         item.setTitle("Crane: up");
269                 }
270                 else if (item.getTitle().equals("Magnet")) {
271                         if (!item.isChecked()) {
272                                 magnet_cmd.send(1);
273                                 item.setChecked(true);
274                         }
275                         else {
276                                 magnet_cmd.send(0);
277                                 item.setChecked(false); 
278                         }
279                 }
280                 else if (item.getTitle().equals("Voltage monitor")) {
281                         mDimLock.acquire();
282                         if (pwr_voltage == null)
283                                 pwr_voltage = new PwrVoltageSubscribe(appDomain, dialogHandler);
284                         pwr_voltage.start();
285                         voltageDialog.show();
286                 }
287                 else if (item.getTitle().equals("Fellow managers")) {
288                         wifiInfoTask = new NetworkInfo();
289
290                         managersDialog.show();
291                         wifiInfoTask.execute();
292                 }
293                 else if (item.getTitle().equals("About")) {
294                         aboutDialog.show();
295                 }
296                 else if (item.getTitle().equals("Exit")) {
297                         finish();
298                 }
299                 
300                 return true;
301         }
302         
303     private class HandleAccelerometer implements SensorEventListener {
304
305         @Override
306         public void onAccuracyChanged(Sensor sensor, int accuracy) {}
307
308         @Override
309         public void onSensorChanged(SensorEvent event) {
310                  if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
311                          if (motion_speed_publ != null)
312                                  motion_speed_publ.setSpeed(event.values[0], event.values[1]);
313                  }
314         }
315     }
316     
317 //    hokuyo_view.setOnTouchListener(new View.OnTouchListener() {
318     private class HokuyoGestures extends GestureDetector.SimpleOnGestureListener {
319
320                 @Override
321                 public boolean onSingleTapConfirmed(MotionEvent event) {
322                         // urceni orientace HokuyoView a poctu pixelu, ktere zabira hokuyo
323                         double norm = (double)hokuyo_view.getWidth()/(2*HokuyoView.COSINUS);
324                         boolean isVertical = true;
325                         if (norm > hokuyo_view.getHeight()) {
326                                 norm = HokuyoView.COSINUS*hokuyo_view.getHeight()*2;
327                                 norm = (hokuyo_view.getWidth() - norm)/2;
328                                 isVertical = false;
329                         }
330                         else
331                                 norm = hokuyo_view.getHeight() - norm;
332                         
333                         // urceni poctu pixelu, ktere zabira ctverec monitoru rychlosti
334                         double normSpeed = ((double)(isVertical ? hokuyo_view.getWidth() : hokuyo_view.getHeight())) * 0.375;
335                         
336                         if (event.getYPrecision()*event.getY() < normSpeed &&
337                                         event.getXPrecision()*event.getX() < normSpeed) {
338                                 if(!hokuyo_view.isRunningMotion()) {
339                                         mWakeLock.acquire();
340                                         mWifiLock.acquire();
341                                         if (motion_speed_subs == null)
342                                                 motion_speed_subs = new MotionSpeedSubscribe(appDomain, hokuyo_view);
343                                         motion_speed_subs.start();
344                                         hokuyo_view.runMotion(true);
345                                         hokuyo_view.invalidate();
346                                 }
347                                 else {
348                                         hokuyo_view.runMotion(false);
349                                         motion_speed_subs.cancel();
350                                         hokuyo_view.invalidate();
351                                         mWakeLock.release();
352                                         mWifiLock.release();
353                                 }
354                                 return true;
355                         }
356                         
357                         if ((isVertical && event.getYPrecision()*event.getY() > norm) ||
358                                         (!isVertical && event.getXPrecision()*event.getX() > norm &&
359                                                         event.getXPrecision()*event.getX() < hokuyo_view.getWidth() - norm)) {
360                                 if (!hokuyo_view.isRunning()) {
361                                         mWakeLock.acquire();
362                                         mWifiLock.acquire();
363                                         hokuyo_view.setData(new int[681]);
364                                         if (hokuyo_scan == null)
365                                                 hokuyo_scan = new HokuyoScanSubscribe(appDomain, hokuyo_view);
366                                         hokuyo_scan.start();
367                                         hokuyo_view.run(true);
368                                         hokuyo_view.invalidate();
369                                 }
370                                 else {
371                                         hokuyo_view.run(false);
372                                         hokuyo_scan.cancel();
373                                         hokuyo_view.invalidate();
374                                         mWakeLock.release();
375                                         mWifiLock.release();
376                                 }
377                                 return true;
378                         }
379                         
380                         return false;
381                 }
382
383                 @Override
384                 public boolean onDown(MotionEvent e) {
385                         return true;
386                 }
387
388                 @Override
389                 public void onLongPress(MotionEvent event) {
390                         // urceni poctu pixelu, ktere zabira ctverec monitoru rychlosti
391                         double normSpeed = ((double)(hokuyo_view.getHeight() < hokuyo_view.getWidth() ? hokuyo_view.getHeight() : hokuyo_view.getWidth())) * 0.375;
392                         
393                         if (event.getYPrecision()*event.getY() < normSpeed &&
394                                         event.getXPrecision()*event.getX() < normSpeed) {
395                                 if (motion_speed_publ == null || motion_speed_publ.isCancelled()) {
396                                         mDimLock.acquire();
397                                         mWifiLock.acquire();
398                                         accel = new HandleAccelerometer();
399                                         mSensorManager.registerListener(accel, mGravity, SensorManager.SENSOR_DELAY_GAME);
400                                         if (motion_speed_publ == null)
401                                                 motion_speed_publ = new MotionSpeedPublish(appDomain);
402                                         motion_speed_publ.start();
403                                         setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
404                                 }
405                                 else {
406                                         mSensorManager.unregisterListener(accel);
407                                         motion_speed_publ.cancel();
408                                         setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
409                                         mDimLock.release();
410                                         mWifiLock.release();
411                                 }
412                         }
413                 }
414     }
415     
416     private class NetworkInfo extends AsyncTask<Void, String, Void> {
417         @Override
418         protected Void doInBackground(Void... arg0) {
419                 while (!isCancelled()) {
420                         WifiInfo wifiInfo = mWifiManager.getConnectionInfo();
421                         int ip = wifiInfo.getIpAddress();
422                         String ipAddress = Formatter.formatIpAddress(ip);
423                         String ssid = wifiInfo.getSSID();
424         
425                         publishProgress("\nOwn IP Address: " + ipAddress + "\nNetwork SSID: " + ssid);
426                         
427                         try {
428                                         Thread.sleep(1000);
429                                 } catch (InterruptedException e) {
430                                         e.printStackTrace();
431                                 }
432                 }
433                 
434                 return null;
435         }
436
437         @Override
438         protected void onProgressUpdate(String... values) {
439                 super.onProgressUpdate(values);
440                 
441                 ownIP.setText(values[0]);
442         }
443     }
444 }