1 package org.ocera.orte.demo;
3 import org.ocera.orte.DomainApp;
4 import org.ocera.orte.Manager;
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;
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() {
49 public void handleMessage(Message msg) {
50 double[] values = msg.getData().getDoubleArray("voltages");
52 if (voltage33 != null) {
53 voltage33.setText(Double.toString(values[0]));
55 if (voltage50 != null) {
56 voltage50.setText(Double.toString(values[1]));
58 if (voltage80 != null) {
59 voltage80.setText(Double.toString(values[2]));
61 if (voltageBAT != null) {
62 voltageBAT.setText(Double.toString(values[3]));
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;
90 System.loadLibrary("jorte");
94 protected void onPause() {
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);
105 if (motion_speed_subs != null && !motion_speed_subs.isCancelled()) {
106 hokuyo_view.runMotion(false);
107 motion_speed_subs.cancel();
108 hokuyo_view.invalidate();
113 if (hokuyo_scan != null && !hokuyo_scan.isCancelled()) {
114 hokuyo_view.run(false);
115 hokuyo_scan.cancel();
116 hokuyo_view.invalidate();
123 protected void onDestroy() {
126 if (pwr_voltage != null && !pwr_voltage.isCancelled()) {
127 if (voltageDialog.isShowing())
128 voltageDialog.dismiss();
131 if (crane_cmd != null && !crane_cmd.isCancelled()) {
135 if (magnet_cmd != null && !crane_cmd.isCancelled()) {
139 if (appDomain != null) {
144 if (manager != null) {
151 public void onCreate(Bundle savedInstanceState) {
152 super.onCreate(savedInstanceState);
153 setContentView(R.layout.hokuyo_view);
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");
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());
169 prefs = getSharedPreferences("prefs", 0);
170 mgrs = prefs.getString("managers", "10.1.1.1");
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(){
181 public void onDismiss(DialogInterface arg0) {
182 voltageDialog.dismiss();
183 pwr_voltage.cancel();
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);
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();
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);
204 managersBuilder.setView(managersView);
205 managersBuilder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
207 public void onClick(DialogInterface dialog, int which) {
208 SharedPreferences.Editor editor = prefs.edit();
209 mgrs = managersField.getText().toString();
210 editor.putString("managers", mgrs);
215 manager = new Manager(mgrs);
217 managersDialog.dismiss();
220 managersBuilder.setNeutralButton("Cancel", null);
221 managersBuilder.setTitle("Set fellow managers");
222 managersDialog = managersBuilder.create();
223 managersDialog.setOnDismissListener(new OnDismissListener() {
225 public void onDismiss(DialogInterface arg0) {
226 managersField.setText(mgrs);
227 wifiInfoTask.cancel(false);
231 mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
232 mGravity = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
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() {
238 public boolean onTouch(View v, MotionEvent event) {
239 return gDetector.onTouchEvent(event);
244 manager = new Manager(mgrs);
246 appDomain = new DomainApp();
247 magnet_cmd = new MagnetCmdPublish(appDomain);
249 crane_cmd = new CraneCmdPublish(appDomain);
254 public boolean onCreateOptionsMenu(Menu menu) {
255 getMenuInflater().inflate(R.menu.activity_main, menu);
261 public boolean onOptionsItemSelected (MenuItem item) {
262 if (item.getTitle().equals("Crane: up")) {
263 crane_cmd.send(0x190);
264 item.setTitle("Crane: down");
266 else if (item.getTitle().equals("Crane: down")) {
267 crane_cmd.send(0x100);
268 item.setTitle("Crane: up");
270 else if (item.getTitle().equals("Magnet")) {
271 if (!item.isChecked()) {
273 item.setChecked(true);
277 item.setChecked(false);
280 else if (item.getTitle().equals("Voltage monitor")) {
282 if (pwr_voltage == null)
283 pwr_voltage = new PwrVoltageSubscribe(appDomain, dialogHandler);
285 voltageDialog.show();
287 else if (item.getTitle().equals("Fellow managers")) {
288 wifiInfoTask = new NetworkInfo();
290 managersDialog.show();
291 wifiInfoTask.execute();
293 else if (item.getTitle().equals("About")) {
296 else if (item.getTitle().equals("Exit")) {
303 private class HandleAccelerometer implements SensorEventListener {
306 public void onAccuracyChanged(Sensor sensor, int accuracy) {}
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]);
317 // hokuyo_view.setOnTouchListener(new View.OnTouchListener() {
318 private class HokuyoGestures extends GestureDetector.SimpleOnGestureListener {
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;
331 norm = hokuyo_view.getHeight() - norm;
333 // urceni poctu pixelu, ktere zabira ctverec monitoru rychlosti
334 double normSpeed = ((double)(isVertical ? hokuyo_view.getWidth() : hokuyo_view.getHeight())) * 0.375;
336 if (event.getYPrecision()*event.getY() < normSpeed &&
337 event.getXPrecision()*event.getX() < normSpeed) {
338 if(!hokuyo_view.isRunningMotion()) {
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();
348 hokuyo_view.runMotion(false);
349 motion_speed_subs.cancel();
350 hokuyo_view.invalidate();
356 if ((isVertical && event.getYPrecision()*event.getY() > norm) ||
357 (!isVertical && event.getXPrecision()*event.getX() > norm &&
358 event.getXPrecision()*event.getX() < hokuyo_view.getWidth() - norm)) {
359 if (!hokuyo_view.isRunning()) {
362 hokuyo_view.setData(new int[681]);
363 if (hokuyo_scan == null)
364 hokuyo_scan = new HokuyoScanSubscribe(appDomain, hokuyo_view);
366 hokuyo_view.run(true);
367 hokuyo_view.invalidate();
370 hokuyo_view.run(false);
371 hokuyo_scan.cancel();
372 hokuyo_view.invalidate();
381 public boolean onDown(MotionEvent e) {
386 public void onLongPress(MotionEvent event) {
387 // urceni poctu pixelu, ktere zabira ctverec monitoru rychlosti
388 double normSpeed = ((double)(hokuyo_view.getHeight() < hokuyo_view.getWidth() ? hokuyo_view.getHeight() : hokuyo_view.getWidth())) * 0.375;
390 if (event.getYPrecision()*event.getY() < normSpeed &&
391 event.getXPrecision()*event.getX() < normSpeed) {
392 if (motion_speed_publ == null || motion_speed_publ.isCancelled()) {
395 accel = new HandleAccelerometer();
396 mSensorManager.registerListener(accel, mGravity, SensorManager.SENSOR_DELAY_GAME);
397 if (motion_speed_publ == null)
398 motion_speed_publ = new MotionSpeedPublish(appDomain);
399 motion_speed_publ.start();
400 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
403 mSensorManager.unregisterListener(accel);
404 motion_speed_publ.cancel();
405 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
413 private class NetworkInfo extends AsyncTask<Void, String, Void> {
415 protected Void doInBackground(Void... arg0) {
416 while (!isCancelled()) {
417 WifiInfo wifiInfo = mWifiManager.getConnectionInfo();
418 int ip = wifiInfo.getIpAddress();
419 String ipAddress = Formatter.formatIpAddress(ip);
420 String ssid = wifiInfo.getSSID();
422 publishProgress("\nOwn IP Address: " + ipAddress + "\nNetwork SSID: " + ssid);
426 } catch (InterruptedException e) {
435 protected void onProgressUpdate(String... values) {
436 super.onProgressUpdate(values);
438 ownIP.setText(values[0]);