X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=altosdroid%2Fapp%2Fsrc%2Fmain%2Fjava%2Forg%2Faltusmetrum%2FAltosDroid%2FTelemetryReader.java;fp=altosdroid%2Fapp%2Fsrc%2Fmain%2Fjava%2Forg%2Faltusmetrum%2FAltosDroid%2FTelemetryReader.java;h=5cfa647bd5b4bf7fec78695f541ad7c678e674db;hp=0000000000000000000000000000000000000000;hb=8b53f860eb3171cd43e4bd0e440f2889bd810662;hpb=4a257455b2dc57069c41e1845daf66239c5cbe1d diff --git a/altosdroid/app/src/main/java/org/altusmetrum/AltosDroid/TelemetryReader.java b/altosdroid/app/src/main/java/org/altusmetrum/AltosDroid/TelemetryReader.java new file mode 100644 index 00000000..5cfa647b --- /dev/null +++ b/altosdroid/app/src/main/java/org/altusmetrum/AltosDroid/TelemetryReader.java @@ -0,0 +1,92 @@ +/* + * 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; 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 + * 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.*; +import java.util.concurrent.*; +import android.os.Handler; + +import org.altusmetrum.altoslib_13.*; + + +public class TelemetryReader extends Thread { + + int crc_errors; + + Handler handler; + + AltosLink link; + + LinkedBlockingQueue telemQueue; + + public AltosTelemetry 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); + return telem; + } + + public void close() { + link.remove_monitor(telemQueue); + link = null; + telemQueue.clear(); + telemQueue = null; + } + + public void run() { + try { + AltosDebug.debug("starting loop"); + while (telemQueue != null) { + try { + AltosTelemetry telem = read(); + telem.set_frequency(link.frequency); + handler.obtainMessage(TelemetryService.MSG_TELEMETRY, telem).sendToTarget(); + } catch (ParseException pp) { + AltosDebug.error("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) { + AltosDebug.error("IO exception in telemetry reader"); + handler.obtainMessage(TelemetryService.MSG_DISCONNECTED, link).sendToTarget(); + } finally { + close(); + } + } + + public TelemetryReader (AltosLink in_link, Handler in_handler) { + AltosDebug.debug("connected TelemetryReader create started"); + link = in_link; + handler = in_handler; + + telemQueue = new LinkedBlockingQueue(); + link.add_monitor(telemQueue); + link.set_telemetry(AltosLib.ao_telemetry_standard); + + AltosDebug.debug("connected TelemetryReader created"); + } +}