X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=altoslib%2FAltosIdleMonitor.java;h=74536204affee2471c2a83ca3c71faed585c8052;hp=6b20b3f17342b0b3f528969e973a946a57da537b;hb=cb23b992be8ba40c97d8988c134a814a13ccd58c;hpb=8d1d8d2a3c129cdbd55427bcda0f26715b02f1ee diff --git a/altoslib/AltosIdleMonitor.java b/altoslib/AltosIdleMonitor.java index 6b20b3f1..74536204 100644 --- a/altoslib/AltosIdleMonitor.java +++ b/altoslib/AltosIdleMonitor.java @@ -15,7 +15,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altoslib_1; +package org.altusmetrum.altoslib_7; import java.io.*; import java.util.concurrent.*; @@ -24,126 +24,92 @@ import java.util.concurrent.*; public class AltosIdleMonitor extends Thread { AltosLink link; AltosIdleMonitorListener listener; - AltosState state; + + AltosIdleFetch fetch; + boolean remote; double frequency; - AltosState previous_state; + String callsign; + + AltosListenerState listener_state; AltosConfigData config_data; AltosGPS gps; - int AltosRSSI() throws TimeoutException, InterruptedException { - link.printf("s\n"); - String line = link.get_reply_no_dialog(5000); - if (line == null) - throw new TimeoutException(); - String[] items = line.split("\\s+"); - if (items.length < 2) - return 0; - if (!items[0].equals("RSSI:")) - return 0; - int rssi = Integer.parseInt(items[1]); - return rssi; + void start_link() throws InterruptedException, TimeoutException { + if (remote) { + link.set_radio_frequency(frequency); + link.set_callsign(callsign); + link.start_remote(); + } else + link.flush_input(); } - boolean has_sensor_tm(AltosConfigData config_data) { - return config_data.product.startsWith("TeleMetrum") || config_data.product.startsWith("TeleMini"); - } - - boolean has_sensor_mm(AltosConfigData config_data) { - return config_data.product.startsWith("MegaMetrum"); - } - - boolean has_gps(AltosConfigData config_data) { - return config_data.product.startsWith("TeleMetrum") || config_data.product.startsWith("MegaMetrum"); - } - - AltosRecord sensor_mm(AltosConfigData config_data) throws InterruptedException, TimeoutException { - AltosRecordMM record_mm = new AltosRecordMM(); - AltosSensorMM sensor = new AltosSensorMM(link); - AltosMs5607 ms5607 = new AltosMs5607Query(link); - AltosIMU imu = new AltosIMUQuery(link); - - record_mm.accel_plus_g = config_data.accel_cal_plus; - record_mm.accel_minus_g = config_data.accel_cal_minus; - - record_mm.ground_accel = sensor.accel; - record_mm.accel = sensor.accel; - record_mm.ground_pres = ms5607.pa; - record_mm.pres = ms5607.pa; - record_mm.temp = ms5607.cc; - - record_mm.v_batt = sensor.v_batt; - record_mm.v_pyro = sensor.v_pyro; - record_mm.sense = sensor.sense; - - record_mm.imu = imu; - - return record_mm; + boolean stop_link() throws InterruptedException, TimeoutException { + if (remote) + link.stop_remote(); + return link.reply_abort; } - void update_state() throws InterruptedException, TimeoutException { - AltosRecord record = null; + boolean update_state(AltosState state) throws InterruptedException, TimeoutException { + boolean worked = false; + boolean aborted = false; try { - if (remote) { - link.set_radio_frequency(frequency); - link.start_remote(); - } else - link.flush_input(); - config_data = new AltosConfigData(link); - - if (has_sensor_tm(config_data)) - record = new AltosSensorTM(link, config_data); - else if (has_sensor_mm(config_data)) - record = sensor_mm(config_data); - else - record = new AltosRecordNone(); - - if (has_gps(config_data)) - gps = new AltosGPSQuery(link, config_data); - - record.version = 0; - record.callsign = config_data.callsign; - record.serial = config_data.serial; - record.flight = config_data.log_available() > 0 ? 255 : 0; - record.status = 0; - record.state = AltosLib.ao_flight_idle; - record.gps = gps; - record.new_gps = true; - state = new AltosState (record, state); + start_link(); + fetch.update_state(state); + if (!link.has_error && !link.reply_abort) + worked = true; } finally { - if (remote) { - link.stop_remote(); - if (record != null) - record.rssi = AltosRSSI(); - } else { - if (record != null) - record.rssi = 0; + aborted = stop_link(); + if (worked) { + if (remote) + state.set_rssi(link.rssi(), 0); + listener_state.battery = link.monitor_battery(); } } - + return aborted; } public void set_frequency(double in_frequency) { frequency = in_frequency; + link.abort_reply(); } - public void post_state() { - listener.update(state); + public void set_callsign(String in_callsign) { + callsign = in_callsign; + link.abort_reply(); + } + + public void abort() throws InterruptedException { + while (isAlive()) { + interrupt(); + link.abort_reply(); + Thread.sleep(100); + } + join(); } public void run() { + AltosState state = new AltosState(); try { for (;;) { try { - update_state(); - post_state(); + link.config_data(); + update_state(state); + listener.update(state, listener_state); } catch (TimeoutException te) { } + if (link.has_error || link.reply_abort) { + listener.failed(); + break; + } Thread.sleep(1000); } } catch (InterruptedException ie) { + } + try { link.close(); + } catch (InterruptedException ie) { } } @@ -152,6 +118,7 @@ public class AltosIdleMonitor extends Thread { listener = in_listener; link = in_link; remote = in_remote; - state = null; + listener_state = new AltosListenerState(); + fetch = new AltosIdleFetch(link); } }