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