X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=altosdroid%2Fsrc%2Forg%2Faltusmetrum%2FAltosDroid%2FIgniterActivity.java;h=eccf5c598a24fefc11495e26aaea7383b6c19f1b;hb=a61217f0a6d0ef48b6471f632c4600255867e831;hp=a608bba0e91a46a8cc4da110743e374e320c9140;hpb=204ae5142702044eb8ad2697a55028e904067958;p=fw%2Faltos diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/IgniterActivity.java b/altosdroid/src/org/altusmetrum/AltosDroid/IgniterActivity.java index a608bba0..eccf5c59 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/IgniterActivity.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/IgniterActivity.java @@ -3,7 +3,8 @@ * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License. + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of @@ -32,47 +33,50 @@ import android.view.View.*; import android.widget.*; import android.widget.AdapterView.*; -import org.altusmetrum.altoslib_10.*; +import org.altusmetrum.altoslib_12.*; class IgniterItem { public String name; + public String pretty; public String status; public LinearLayout igniter_view = null; - public TextView name_view = null; + public TextView pretty_view = null; public TextView status_view = null; private void update() { - AltosDebug.debug("update item %s %s", name, status); - if (name_view != null) - name_view.setText(name); + if (pretty_view != null) + pretty_view.setText(pretty); if (status_view != null) status_view.setText(status); } - public void set(String name, String status) { - if (!name.equals(this.name) || !status.equals(this.status)) { + public void set(String name, String pretty, String status) { + if (!name.equals(this.name) || + !pretty.equals(this.pretty) || + !status.equals(this.status)) + { this.name = name; + this.pretty = pretty; this.status = status; update(); } } public void realize(LinearLayout igniter_view, - TextView name_view, + TextView pretty_view, TextView status_view) { if (igniter_view != this.igniter_view || - name_view != this.name_view || + pretty_view != this.pretty_view || status_view != this.status_view) { this.igniter_view = igniter_view; - this.name_view = name_view; + this.pretty_view = pretty_view; this.status_view = status_view; update(); } } public IgniterItem() { - AltosDebug.debug("New igniter item"); } } @@ -97,9 +101,7 @@ class IgniterAdapter extends ArrayAdapter { item.realize(igniter_view, (TextView) igniter_view.findViewById(R.id.igniter_name), (TextView) igniter_view.findViewById(R.id.igniter_status)); - AltosDebug.debug("Realize new igniter view"); - } else - AltosDebug.debug("Reuse existing igniter view"); + } if (position == selected_item) item.igniter_view.setBackgroundColor(Color.RED); else @@ -118,11 +120,14 @@ public class IgniterActivity extends Activity { private IgniterAdapter igniters_adapter; private boolean is_bound; - private boolean timer_running; private Messenger service = null; private final Messenger messenger = new Messenger(new IncomingHandler(this)); - private Timer timer; + private Timer query_timer; + private boolean query_timer_running; + + private Timer arm_timer; + private int arm_remaining; public static final int IGNITER_QUERY = 1; public static final int IGNITER_FIRE = 2; @@ -148,6 +153,7 @@ public class IgniterActivity extends Activity { private ServiceConnection connection = new ServiceConnection() { public void onServiceConnected(ComponentName className, IBinder binder) { service = new Messenger(binder); + query_timer_tick(); } public void onServiceDisconnected(ComponentName className) { @@ -175,22 +181,76 @@ public class IgniterActivity extends Activity { finish(); } + class FireThread extends Thread { + private final String igniter; + + @Override + public void run() { + Message msg = Message.obtain(null, TelemetryService.MSG_IGNITER_FIRE, igniter); + try { + service.send(msg); + } catch (RemoteException re) { + } + } + + public FireThread(String igniter) { + this.igniter = igniter; + } + } + private void fire_igniter() { + if (igniters_adapter.selected_item >= 0) { + IgniterItem item = igniters_adapter.getItem(igniters_adapter.selected_item); + FireThread ft = new FireThread(item.name); + ft.run(); + arm.setChecked(false); + } } private void arm_igniter(boolean is_checked) { + if (is_checked) { + arm_timer_stop(); + arm_timer = new Timer(); + arm_remaining = 10; + arm_set_text(); + fire.setEnabled(true); + arm_timer.scheduleAtFixedRate(new TimerTask() { + public void run() { + arm_timer_tick(); + }}, + 1000L, 1000L); + } else { + arm_timer_stop(); + fire.setEnabled(false); + } } - private synchronized void timer_tick() { - if (timer_running) + private synchronized void query_timer_tick() { + if (query_timer_running) return; - timer_running = true; - try { - Message msg = Message.obtain(null, TelemetryService.MSG_IGNITER_QUERY); - msg.replyTo = messenger; - service.send(msg); - } catch (RemoteException re) { - } + if (service == null) + return; + query_timer_running = true; + Thread thread = new Thread(new Runnable() { + public void run() { + try { + Message msg = Message.obtain(null, TelemetryService.MSG_IGNITER_QUERY); + msg.replyTo = messenger; + if (service == null) { + synchronized(IgniterActivity.this) { + query_timer_running = false; + } + } else + service.send(msg); + } catch (RemoteException re) { + AltosDebug.debug("igniter query thread failed"); + synchronized(IgniterActivity.this) { + query_timer_running = false; + } + } + } + }); + thread.start(); } private boolean set_igniter(HashMap status, String name, String pretty) { @@ -205,12 +265,12 @@ public class IgniterActivity extends Activity { } else item = igniters.get(name); - item.set(pretty, AltosIgnite.status_string(status.get(name))); + item.set(name, pretty, AltosIgnite.status_string(status.get(name))); return true; } private synchronized void igniter_status(HashMap status) { - timer_running = false; + query_timer_running = false; if (status == null) { AltosDebug.debug("no igniter status"); return; @@ -223,20 +283,64 @@ public class IgniterActivity extends Activity { if (!set_igniter(status, name, pretty)) break; } -// if (igniters_adapter.selected_item >= 0) -// igniters_view.setSelection(selected_item); } - private class IgniterItemClickListener implements ListView.OnItemClickListener { - @Override - public void onItemClick(AdapterView av, View v, int position, long id) { + private synchronized void arm_timer_stop() { + if (arm_timer != null) { + arm_timer.cancel(); + arm_timer = null; + } + arm_remaining = 0; + } + + private void arm_set_text() { + String text = String.format("Armed %d", arm_remaining); + + if (arm.isChecked()) + arm.setText(text); + arm.setTextOn(text); + } + + private void arm_timer_tick() { + --arm_remaining; + if (arm_remaining <= 0) { + arm_timer_stop(); + runOnUiThread(new Runnable() { + public void run() { + arm.setChecked(false); + fire.setEnabled(false); + } + }); + } else { + runOnUiThread(new Runnable() { + public void run() { + arm_set_text(); + } + }); + } + } + + private void select_item(int position) { + if (position != igniters_adapter.selected_item) { if (igniters_adapter.selected_item >= 0) igniters_view.setItemChecked(igniters_adapter.selected_item, false); - igniters_view.setItemChecked(position, true); + if (position >= 0) { + igniters_view.setItemChecked(position, true); + arm.setEnabled(true); + } else + arm.setEnabled(false); igniters_adapter.selected_item = position; } } + private class IgniterItemClickListener implements ListView.OnItemClickListener { + @Override + public void onItemClick(AdapterView av, View v, int position, long id) { + AltosDebug.debug("select %d\n", position); + select_item(position); + } + } + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -254,6 +358,7 @@ public class IgniterActivity extends Activity { igniters_view.setOnItemClickListener(new IgniterItemClickListener()); fire = (Button) findViewById(R.id.igniter_fire); + fire.setEnabled(false); fire.setOnClickListener(new OnClickListener() { public void onClick(View v) { fire_igniter(); @@ -261,6 +366,7 @@ public class IgniterActivity extends Activity { }); arm = (ToggleButton) findViewById(R.id.igniter_arm); + arm.setEnabled(false); arm.setOnCheckedChangeListener(new ToggleButton.OnCheckedChangeListener() { public void onCheckedChanged(CompoundButton v, boolean is_checked) { arm_igniter(is_checked); @@ -280,19 +386,24 @@ public class IgniterActivity extends Activity { @Override protected void onResume() { super.onResume(); - timer = new Timer(true); - timer.scheduleAtFixedRate(new TimerTask() { + query_timer = new Timer(true); + query_timer.scheduleAtFixedRate(new TimerTask() { public void run() { - timer_tick(); + query_timer_tick(); }}, - 1000L, 1000L); + 0L, 5000L); } @Override protected void onPause() { super.onPause(); - timer.cancel(); - timer = null; + if (query_timer != null) { + query_timer.cancel(); + query_timer = null; + } + arm_timer_stop(); + arm.setChecked(false); + fire.setEnabled(false); } @Override