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