X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=altosdroid%2Fsrc%2Forg%2Faltusmetrum%2FAltosDroid%2FTelemetryReader.java;h=bdb2bae441e078c8bd03ebe57a307a3b7f4d850b;hp=716ec5894c9df42c5e0a975591ba8464c42e91bd;hb=7bfa8841b65707d629b425b306ec4cc3acfc156c;hpb=ff332e640b27c6be37dabef58ebac350ac2347b2 diff --git a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryReader.java b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryReader.java index 716ec589..bdb2bae4 100644 --- a/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryReader.java +++ b/altosdroid/src/org/altusmetrum/AltosDroid/TelemetryReader.java @@ -1,94 +1,103 @@ -/* - * Copyright © 2011 Keith Packard - * Copyright © 2012 Mike Beattie - * - * 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. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. - */ - - -package org.altusmetrum.AltosDroid; - -import java.text.*; -import java.io.*; -import java.util.concurrent.*; -import android.util.Log; -import android.os.Handler; - -import org.altusmetrum.altoslib_1.*; - - -public class TelemetryReader extends Thread { - - private static final String TAG = "TelemetryReader"; - - int crc_errors; - - Handler handler; - - AltosLink link; - AltosRecord previous; - - LinkedBlockingQueue telem; - - public AltosRecord read() throws ParseException, AltosCRCException, InterruptedException, IOException { - AltosLine l = telem.take(); - if (l.line == null) - throw new IOException("IO error"); - AltosRecord next = AltosTelemetry.parse(l.line, previous); - previous = next; - return next; - } - - public void close() { - previous = null; - link.remove_monitor(telem); - link = null; - telem.clear(); - telem = null; - } - - public void run() { - AltosState state = null; - - try { - for (;;) { - try { - AltosRecord record = read(); - if (record == null) - break; - state = new AltosState(record, state); - handler.obtainMessage(TelemetryService.MSG_TELEMETRY, state).sendToTarget(); - } catch (ParseException pp) { - Log.e(TAG, String.format("Parse error: %d \"%s\"", pp.getErrorOffset(), pp.getMessage())); - } catch (AltosCRCException ce) { - ++crc_errors; - handler.obtainMessage(TelemetryService.MSG_CRC_ERROR, new Integer(crc_errors)).sendToTarget(); - } - } - } catch (InterruptedException ee) { - } catch (IOException ie) { - } finally { - close(); - } - } - - public TelemetryReader (AltosLink in_link, Handler in_handler) { - link = in_link; - handler = in_handler; - - previous = null; - telem = new LinkedBlockingQueue(); - link.add_monitor(telem); - } -} +/* + * Copyright © 2011 Keith Packard + * Copyright © 2012 Mike Beattie + * + * 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. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ + + +package org.altusmetrum.AltosDroid; + +import java.text.*; +import java.io.*; +import java.util.concurrent.*; +import android.util.Log; +import android.os.Handler; + +import org.altusmetrum.altoslib_6.*; + + +public class TelemetryReader extends Thread { + + private static final String TAG = "TelemetryReader"; + private static final boolean D = true; + + int crc_errors; + + Handler handler; + + AltosLink link; + AltosState state = null; + + LinkedBlockingQueue telemQueue; + + public AltosState read() throws ParseException, AltosCRCException, InterruptedException, IOException { + AltosLine l = telemQueue.take(); + if (l.line == null) + throw new IOException("IO error"); + AltosTelemetry telem = AltosTelemetryLegacy.parse(l.line); + if (state == null) + state = new AltosState(); + else + state = state.clone(); + telem.update_state(state); + return state; + } + + public void close() { + state = null; + link.remove_monitor(telemQueue); + link = null; + telemQueue.clear(); + telemQueue = null; + } + + public void run() { + AltosState state = null; + + try { + if (D) Log.d(TAG, "starting loop"); + while (telemQueue != null) { + try { + state = read(); + handler.obtainMessage(TelemetryService.MSG_TELEMETRY, state).sendToTarget(); + } catch (ParseException pp) { + Log.e(TAG, String.format("Parse error: %d \"%s\"", pp.getErrorOffset(), pp.getMessage())); + } catch (AltosCRCException ce) { + ++crc_errors; + handler.obtainMessage(TelemetryService.MSG_CRC_ERROR, new Integer(crc_errors)).sendToTarget(); + } + } + } catch (InterruptedException ee) { + } catch (IOException ie) { + Log.e(TAG, "IO exception in telemetry reader"); + handler.obtainMessage(TelemetryService.MSG_DISCONNECTED, link).sendToTarget(); + } finally { + close(); + } + } + + public TelemetryReader (AltosLink in_link, Handler in_handler, AltosState in_state) { + if (D) Log.d(TAG, "connected TelemetryReader create started"); + link = in_link; + handler = in_handler; + + state = in_state; + telemQueue = new LinkedBlockingQueue(); + link.add_monitor(telemQueue); + link.set_telemetry(AltosLib.ao_telemetry_standard); + + if (D) Log.d(TAG, "connected TelemetryReader created"); + } +}