From: Keith Packard Date: Tue, 12 Nov 2013 05:37:57 +0000 (+0900) Subject: altosui, altoslib: Move eeprom download code to altoslib X-Git-Tag: 1.2.9.4~14 X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=commitdiff_plain;h=0093d5b368669e0c324f8d9dfcd2f004de85ee5c altosui, altoslib: Move eeprom download code to altoslib This should make adding eeprom downloading to altosdroid easier Signed-off-by: Keith Packard --- diff --git a/altoslib/AltosEepromDownload.java b/altoslib/AltosEepromDownload.java new file mode 100644 index 00000000..542defee --- /dev/null +++ b/altoslib/AltosEepromDownload.java @@ -0,0 +1,261 @@ +/* + * Copyright © 2010 Keith Packard + * + * 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.altoslib_2; + +import java.io.*; +import java.util.*; +import java.text.*; +import java.util.concurrent.*; + +public class AltosEepromDownload implements Runnable { + + AltosLink link; + boolean remote; + Thread eeprom_thread; + AltosEepromMonitor monitor; + + boolean want_file; + FileWriter eeprom_file; + LinkedList eeprom_pending; + + AltosEepromList flights; + boolean success; + ParseException parse_exception; + AltosState state; + + private void FlushPending() throws IOException { + for (String s : flights.config_data) { + eeprom_file.write(s); + eeprom_file.write('\n'); + } + + for (String s : eeprom_pending) + eeprom_file.write(s); + } + + private void CheckFile(boolean force) throws IOException { + if (eeprom_file != null) + return; + if (force || (state.flight != 0 && want_file)) { + AltosFile eeprom_name; + AltosGPS gps = state.gps; + + if (gps != null && + gps.year != AltosLib.MISSING && + gps.month != AltosLib.MISSING && + gps.day != AltosLib.MISSING) + { + eeprom_name = new AltosFile(gps.year, gps.month, gps.day, + state.serial, state.flight, "eeprom"); + } else + eeprom_name = new AltosFile(state.serial, state.flight, "eeprom"); + + eeprom_file = new FileWriter(eeprom_name); + if (eeprom_file != null) { + monitor.set_filename(eeprom_name.getName()); + FlushPending(); + eeprom_pending = null; + } + } + } + + boolean done; + boolean start; + + void LogEeprom(AltosEeprom r) throws IOException { + if (r.cmd != AltosLib.AO_LOG_INVALID) { + String line = r.string(); + if (eeprom_file != null) + eeprom_file.write(line); + else + eeprom_pending.add(line); + } + } + + void CaptureEeprom(AltosEepromChunk eechunk, int log_format) throws IOException, ParseException { + boolean any_valid = false; + boolean got_flight = false; + + int record_length = 8; + + state.set_serial(flights.config_data.serial); + monitor.set_serial(flights.config_data.serial); + + for (int i = 0; i < AltosEepromChunk.chunk_size && !done; i += record_length) { + AltosEeprom r = eechunk.eeprom(i, log_format, state); + + if (r == null) + continue; + + record_length = r.record_length(); + + r.update_state(state); + + if (!got_flight && state.flight != AltosLib.MISSING) + monitor.set_flight(state.flight); + + /* Monitor state transitions to update display */ + if (state.state != AltosLib.ao_flight_invalid && + state.state <= AltosLib.ao_flight_landed) + { + if (state.state > AltosLib.ao_flight_pad) + want_file = true; + if (state.state == AltosLib.ao_flight_landed) + done = true; + } + + if (state.gps != null) + want_file = true; + + if (r.valid) { + any_valid = true; + LogEeprom(r); + } + } + if (!any_valid) + done = true; + + CheckFile(false); + } + + void CaptureLog(AltosEepromLog log) throws IOException, InterruptedException, TimeoutException, ParseException { + int block, state_block = 0; + int log_format = flights.config_data.log_format; + + state = new AltosState(); + + done = false; + start = true; + + if (flights.config_data.serial < 0) + throw new IOException("no serial number found"); + + /* Reset per-capture variables */ + want_file = false; + eeprom_file = null; + eeprom_pending = new LinkedList(); + + /* Set serial number in the monitor dialog window */ + /* Now scan the eeprom, reading blocks of data and converting to .eeprom file form */ + + state_block = log.start_block; + for (block = log.start_block; !done && block < log.end_block; block++) { + monitor.set_value(state.state_name(), + state.state, + block - state_block, + block - log.start_block); + + AltosEepromChunk eechunk = new AltosEepromChunk(link, block, block == log.start_block); + + /* + * Guess what kind of data is there if the device + * didn't tell us + */ + + if (log_format == AltosLib.AO_LOG_FORMAT_UNKNOWN) { + if (block == log.start_block) { + if (eechunk.data(0) == AltosLib.AO_LOG_FLIGHT) + log_format = AltosLib.AO_LOG_FORMAT_FULL; + else + log_format = AltosLib.AO_LOG_FORMAT_TINY; + } + } + + CaptureEeprom (eechunk, log_format); + } + CheckFile(true); + if (eeprom_file != null) { + eeprom_file.flush(); + eeprom_file.close(); + } + } + + public void run () { + try { + boolean failed = false; + if (remote) + link.start_remote(); + + for (AltosEepromLog log : flights) { + parse_exception = null; + if (log.selected) { + monitor.reset(); + try { + CaptureLog(log); + } catch (ParseException e) { + parse_exception = e; + } + } + if (parse_exception != null) { + failed = true; + monitor.show_message(String.format("Flight %d download error\n%s\nValid log data saved", + log.flight, + parse_exception.getMessage()), + link.name, + AltosEepromMonitor.WARNING_MESSAGE); + } + } + success = !failed; + } catch (IOException ee) { + monitor.show_message(ee.getLocalizedMessage(), + link.name, + AltosEepromMonitor.ERROR_MESSAGE); + } catch (InterruptedException ie) { + monitor.show_message(String.format("Connection to \"%s\" interrupted", + link.name), + "Connection Interrupted", + AltosEepromMonitor.ERROR_MESSAGE); + } catch (TimeoutException te) { + monitor.show_message(String.format("Connection to \"%s\" failed", + link.name), + "Connection Failed", + AltosEepromMonitor.ERROR_MESSAGE); + } finally { + if (remote) { + try { + link.stop_remote(); + } catch (InterruptedException ie) { + } + } + link.flush_output(); + } + monitor.done(success); + } + + public void start() { + eeprom_thread = new Thread(this); + eeprom_thread.start(); + } + + public AltosEepromDownload(AltosEepromMonitor given_monitor, + AltosLink given_link, + boolean given_remote, + AltosEepromList given_flights) { + + monitor = given_monitor; + link = given_link; + remote = given_remote; + flights = given_flights; + success = false; + + monitor.set_states(AltosLib.ao_flight_boost, AltosLib.ao_flight_landed); + + monitor.set_thread(eeprom_thread); + monitor.start(); + } +} diff --git a/altoslib/AltosEepromList.java b/altoslib/AltosEepromList.java new file mode 100644 index 00000000..763bd1e2 --- /dev/null +++ b/altoslib/AltosEepromList.java @@ -0,0 +1,117 @@ +/* + * Copyright © 2011 Keith Packard + * + * 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.altoslib_2; + +import java.io.*; +import java.util.*; +import java.text.*; +import java.util.concurrent.*; + +/* + * Temporary structure to hold the list of stored flights; + * each of these will be queried in turn to generate more + * complete information + */ + +class AltosEepromFlight { + int flight; + int start; + int end; + + public AltosEepromFlight(int in_flight, int in_start, int in_end) { + flight = in_flight; + start = in_start; + end = in_end; + } +} + +/* + * Construct a list of flights available in a connected device + */ + +public class AltosEepromList extends ArrayList { + public AltosConfigData config_data; + + public AltosEepromList (AltosLink link, boolean remote) + throws IOException, InterruptedException, TimeoutException + { + try { + if (remote) + link.start_remote(); + config_data = new AltosConfigData (link); +// if (config_data.serial == 0) +// throw new IOException("no serial number found"); + + ArrayList flights = new ArrayList(); + + if (config_data.flight_log_max != 0 || config_data.log_format != 0) { + + /* Devices with newer firmware will support the 'l' + * command which will list the region of storage + * occupied by each available flight + */ + link.printf("l\n"); + for (;;) { + String line = link.get_reply(5000); + if (line == null) + throw new TimeoutException(); + if (line.contains("done")) + break; + if (line.contains("Syntax")) + continue; + String[] tokens = line.split("\\s+"); + if (tokens.length < 6) + break; + + int flight = -1, start = -1, end = -1; + try { + if (tokens[0].equals("flight")) + flight = AltosParse.parse_int(tokens[1]); + if (tokens[2].equals("start")) + start = AltosParse.parse_hex(tokens[3]); + if (tokens[4].equals("end")) + end = AltosParse.parse_hex(tokens[5]); + if (flight > 0 && start >= 0 && end > 0) + flights.add(new AltosEepromFlight(flight, start, end)); + } catch (ParseException pe) { System.out.printf("Parse error %s\n", pe.toString()); } + } + } else { + + /* Older devices will hold only a single + * flight. This also assumes that any older + * device will have a 1MB flash device + */ + flights.add(new AltosEepromFlight(0, 0, 0xfff)); + } + + /* With the list of flights collected, collect more complete + * information on them by reading the first block or two of + * data. This will add GPS coordinates and a date. For older + * firmware, this will also extract the flight number. + */ + for (AltosEepromFlight flight : flights) { + add(new AltosEepromLog(config_data, link, + flight.flight, flight.start, flight.end)); + } + } finally { + if (remote) + link.stop_remote(); + link.flush_output(); + } + } +} \ No newline at end of file diff --git a/altoslib/Makefile.am b/altoslib/Makefile.am index 2cf7b63d..6d3f3fc4 100644 --- a/altoslib/Makefile.am +++ b/altoslib/Makefile.am @@ -1,4 +1,4 @@ -AM_JAVACFLAGS=-encoding UTF-8 -Xlint:deprecation +AM_JAVACFLAGS=-encoding UTF-8 -Xlint:deprecation -source 6 JAVAROOT=bin @@ -34,11 +34,13 @@ altoslib_JAVA = \ AltosDebug.java \ AltosEeprom.java \ AltosEepromChunk.java \ + AltosEepromDownload.java \ AltosEepromFile.java \ AltosEepromTM.java \ AltosEepromTm.java \ AltosEepromHeader.java \ AltosEepromIterable.java \ + AltosEepromList.java \ AltosEepromLog.java \ AltosEepromMega.java \ AltosEepromMetrum2.java \ diff --git a/altosui/AltosEepromDownload.java b/altosui/AltosEepromDownload.java deleted file mode 100644 index 6ce420d3..00000000 --- a/altosui/AltosEepromDownload.java +++ /dev/null @@ -1,262 +0,0 @@ -/* - * Copyright © 2010 Keith Packard - * - * 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 altosui; - -import java.io.*; -import java.util.*; -import java.text.*; -import java.util.concurrent.*; -import org.altusmetrum.altoslib_2.*; - -public class AltosEepromDownload implements Runnable { - - AltosSerial serial_line; - boolean remote; - Thread eeprom_thread; - AltosEepromMonitor monitor; - - boolean want_file; - FileWriter eeprom_file; - LinkedList eeprom_pending; - - AltosEepromList flights; - boolean success; - ParseException parse_exception; - AltosState state; - - private void FlushPending() throws IOException { - for (String s : flights.config_data) { - eeprom_file.write(s); - eeprom_file.write('\n'); - } - - for (String s : eeprom_pending) - eeprom_file.write(s); - } - - private void CheckFile(boolean force) throws IOException { - if (eeprom_file != null) - return; - if (force || (state.flight != 0 && want_file)) { - AltosFile eeprom_name; - AltosGPS gps = state.gps; - - if (gps != null && - gps.year != AltosLib.MISSING && - gps.month != AltosLib.MISSING && - gps.day != AltosLib.MISSING) - { - eeprom_name = new AltosFile(gps.year, gps.month, gps.day, - state.serial, state.flight, "eeprom"); - } else - eeprom_name = new AltosFile(state.serial, state.flight, "eeprom"); - - eeprom_file = new FileWriter(eeprom_name); - if (eeprom_file != null) { - monitor.set_filename(eeprom_name.getName()); - FlushPending(); - eeprom_pending = null; - } - } - } - - boolean done; - boolean start; - - void LogEeprom(AltosEeprom r) throws IOException { - if (r.cmd != Altos.AO_LOG_INVALID) { - String line = r.string(); - if (eeprom_file != null) - eeprom_file.write(line); - else - eeprom_pending.add(line); - } - } - - void CaptureEeprom(AltosEepromChunk eechunk, int log_format) throws IOException, ParseException { - boolean any_valid = false; - boolean got_flight = false; - - int record_length = 8; - - state.set_serial(flights.config_data.serial); - monitor.set_serial(flights.config_data.serial); - - for (int i = 0; i < AltosEepromChunk.chunk_size && !done; i += record_length) { - AltosEeprom r = eechunk.eeprom(i, log_format, state); - - if (r == null) - continue; - - record_length = r.record_length(); - - r.update_state(state); - - if (!got_flight && state.flight != AltosLib.MISSING) - monitor.set_flight(state.flight); - - /* Monitor state transitions to update display */ - if (state.state != AltosLib.ao_flight_invalid && - state.state <= AltosLib.ao_flight_landed) - { - if (state.state > Altos.ao_flight_pad) - want_file = true; - if (state.state == AltosLib.ao_flight_landed) - done = true; - } - - if (state.gps != null) - want_file = true; - - if (r.valid) { - any_valid = true; - LogEeprom(r); - } - } - if (!any_valid) - done = true; - - CheckFile(false); - } - - void CaptureLog(AltosEepromLog log) throws IOException, InterruptedException, TimeoutException, ParseException { - int block, state_block = 0; - int log_format = flights.config_data.log_format; - - state = new AltosState(); - - done = false; - start = true; - - if (flights.config_data.serial < 0) - throw new IOException("no serial number found"); - - /* Reset per-capture variables */ - want_file = false; - eeprom_file = null; - eeprom_pending = new LinkedList(); - - /* Set serial number in the monitor dialog window */ - /* Now scan the eeprom, reading blocks of data and converting to .eeprom file form */ - - state_block = log.start_block; - for (block = log.start_block; !done && block < log.end_block; block++) { - monitor.set_value(state.state_name(), - state.state, - block - state_block, - block - log.start_block); - - AltosEepromChunk eechunk = new AltosEepromChunk(serial_line, block, block == log.start_block); - - /* - * Guess what kind of data is there if the device - * didn't tell us - */ - - if (log_format == Altos.AO_LOG_FORMAT_UNKNOWN) { - if (block == log.start_block) { - if (eechunk.data(0) == Altos.AO_LOG_FLIGHT) - log_format = Altos.AO_LOG_FORMAT_FULL; - else - log_format = Altos.AO_LOG_FORMAT_TINY; - } - } - - CaptureEeprom (eechunk, log_format); - } - CheckFile(true); - if (eeprom_file != null) { - eeprom_file.flush(); - eeprom_file.close(); - } - } - - public void run () { - try { - boolean failed = false; - if (remote) - serial_line.start_remote(); - - for (AltosEepromLog log : flights) { - parse_exception = null; - if (log.selected) { - monitor.reset(); - try { - CaptureLog(log); - } catch (ParseException e) { - parse_exception = e; - } - } - if (parse_exception != null) { - failed = true; - monitor.show_message(String.format("Flight %d download error\n%s\nValid log data saved", - log.flight, - parse_exception.getMessage()), - serial_line.device.toShortString(), - AltosEepromMonitor.WARNING_MESSAGE); - } - } - success = !failed; - } catch (IOException ee) { - monitor.show_message(ee.getLocalizedMessage(), - serial_line.device.toShortString(), - AltosEepromMonitor.ERROR_MESSAGE); - } catch (InterruptedException ie) { - monitor.show_message(String.format("Connection to \"%s\" interrupted", - serial_line.device.toShortString()), - "Connection Interrupted", - AltosEepromMonitor.ERROR_MESSAGE); - } catch (TimeoutException te) { - monitor.show_message(String.format("Connection to \"%s\" failed", - serial_line.device.toShortString()), - "Connection Failed", - AltosEepromMonitor.ERROR_MESSAGE); - } finally { - if (remote) { - try { - serial_line.stop_remote(); - } catch (InterruptedException ie) { - } - } - serial_line.flush_output(); - } - monitor.done(success); - } - - public void start() { - eeprom_thread = new Thread(this); - eeprom_thread.start(); - } - - public AltosEepromDownload(AltosEepromMonitor given_monitor, - AltosSerial given_serial_line, - boolean given_remote, - AltosEepromList given_flights) { - - monitor = given_monitor; - serial_line = given_serial_line; - remote = given_remote; - flights = given_flights; - success = false; - - monitor.set_states(Altos.ao_flight_boost, Altos.ao_flight_landed); - - monitor.set_thread(eeprom_thread); - monitor.start(); - } -} diff --git a/altosui/AltosEepromList.java b/altosui/AltosEepromList.java deleted file mode 100644 index 258c421a..00000000 --- a/altosui/AltosEepromList.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright © 2011 Keith Packard - * - * 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 altosui; - -import java.io.*; -import java.util.*; -import java.text.*; -import java.util.concurrent.*; -import org.altusmetrum.altoslib_2.*; - -/* - * Temporary structure to hold the list of stored flights; - * each of these will be queried in turn to generate more - * complete information - */ - -class AltosEepromFlight { - int flight; - int start; - int end; - - public AltosEepromFlight(int in_flight, int in_start, int in_end) { - flight = in_flight; - start = in_start; - end = in_end; - } -} - -/* - * Construct a list of flights available in a connected device - */ - -public class AltosEepromList extends ArrayList { - AltosConfigData config_data; - - public AltosEepromList (AltosSerial serial_line, boolean remote) - throws IOException, InterruptedException, TimeoutException - { - try { - if (remote) - serial_line.start_remote(); - config_data = new AltosConfigData (serial_line); -// if (config_data.serial == 0) -// throw new IOException("no serial number found"); - - ArrayList flights = new ArrayList(); - - if (config_data.flight_log_max != 0 || config_data.log_format != 0) { - - /* Devices with newer firmware will support the 'l' - * command which will list the region of storage - * occupied by each available flight - */ - serial_line.printf("l\n"); - for (;;) { - String line = serial_line.get_reply(5000); - if (line == null) - throw new TimeoutException(); - if (line.contains("done")) - break; - if (line.contains("Syntax")) - continue; - String[] tokens = line.split("\\s+"); - if (tokens.length < 6) - break; - - int flight = -1, start = -1, end = -1; - try { - if (tokens[0].equals("flight")) - flight = AltosParse.parse_int(tokens[1]); - if (tokens[2].equals("start")) - start = AltosParse.parse_hex(tokens[3]); - if (tokens[4].equals("end")) - end = AltosParse.parse_hex(tokens[5]); - if (flight > 0 && start >= 0 && end > 0) - flights.add(new AltosEepromFlight(flight, start, end)); - } catch (ParseException pe) { System.out.printf("Parse error %s\n", pe.toString()); } - } - } else { - - /* Older devices will hold only a single - * flight. This also assumes that any older - * device will have a 1MB flash device - */ - flights.add(new AltosEepromFlight(0, 0, 0xfff)); - } - - /* With the list of flights collected, collect more complete - * information on them by reading the first block or two of - * data. This will add GPS coordinates and a date. For older - * firmware, this will also extract the flight number. - */ - for (AltosEepromFlight flight : flights) { - add(new AltosEepromLog(config_data, serial_line, - flight.flight, flight.start, flight.end)); - } - } finally { - if (remote) - serial_line.stop_remote(); - serial_line.flush_output(); - } - } -} \ No newline at end of file diff --git a/altosui/Makefile.am b/altosui/Makefile.am index b51f8112..e103d289 100644 --- a/altosui/Makefile.am +++ b/altosui/Makefile.am @@ -34,8 +34,6 @@ altosui_JAVA = \ AltosDeviceUIDialog.java \ AltosDisplayThread.java \ AltosEepromDelete.java \ - AltosEepromDownload.java \ - AltosEepromList.java \ AltosEepromManage.java \ AltosEepromMonitorUI.java \ AltosEepromSelect.java \ diff --git a/altosuilib/Makefile.am b/altosuilib/Makefile.am index 0cd2aaea..5e19e00f 100644 --- a/altosuilib/Makefile.am +++ b/altosuilib/Makefile.am @@ -1,4 +1,4 @@ -AM_JAVACFLAGS=-encoding UTF-8 -Xlint:deprecation +AM_JAVACFLAGS=-encoding UTF-8 -Xlint:deprecation -source 6 JAVAROOT=bin