X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=altosui%2FAltosEepromDownload.java;h=6e2fd061b1cbef6afe1f6ef223a118b95a57782c;hp=5d19acec472987b4a742aaebbb3453734ef80970;hb=0ad95614685a73856bb26a94866909e5fc025434;hpb=8801b8c1947bd39f7c985b91a2ba8dbc81bcc91a diff --git a/altosui/AltosEepromDownload.java b/altosui/AltosEepromDownload.java index 5d19acec..6e2fd061 100644 --- a/altosui/AltosEepromDownload.java +++ b/altosui/AltosEepromDownload.java @@ -17,18 +17,13 @@ package altosui; -import java.awt.*; import java.awt.event.*; import javax.swing.*; -import javax.swing.filechooser.FileNameExtensionFilter; -import javax.swing.table.*; import java.io.*; import java.util.*; import java.text.*; -import java.util.prefs.*; import java.util.concurrent.*; - -import libaltosJNI.*; +import org.altusmetrum.altoslib_2.*; public class AltosEepromDownload implements Runnable { @@ -37,14 +32,16 @@ public class AltosEepromDownload implements Runnable { boolean remote; Thread eeprom_thread; AltosEepromMonitor monitor; - int flight = 0; - int year = 0, month = 0, day = 0; - boolean want_file = false; - FileWriter eeprom_file = null; - LinkedList eeprom_pending = new LinkedList(); + + boolean want_file; + FileWriter eeprom_file; + LinkedList eeprom_pending; + AltosEepromList flights; ActionListener listener; boolean success; + ParseException parse_exception; + AltosState state; private void FlushPending() throws IOException { for (String s : flights.config_data) { @@ -59,12 +56,19 @@ public class AltosEepromDownload implements Runnable { private void CheckFile(boolean force) throws IOException { if (eeprom_file != null) return; - if (force || (flight != 0 && want_file)) { + if (force || (state.flight != 0 && want_file)) { AltosFile eeprom_name; - if (year != 0 && month != 0 && day != 0) - eeprom_name = new AltosFile(year, month, day, flights.config_data.serial, flight, "eeprom"); - else - eeprom_name = new AltosFile(flights.config_data.serial, flight, "eeprom"); + 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) { @@ -75,59 +79,109 @@ public class AltosEepromDownload implements Runnable { } } - void CaptureLog(AltosEepromLog log) throws IOException, InterruptedException, TimeoutException { - int block, state_block = 0; - int state = 0; - boolean done = false; - int record; + boolean done; + boolean start; - if (flights.config_data.serial == 0) - throw new IOException("no serial number found"); + 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 { + 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); - /* Now scan the eeprom, reading blocks of data and converting to .eeprom file form */ - state = 0; state_block = log.start_block; - for (block = log.start_block; !done && block < log.end_block; block++) { - monitor.set_value(Altos.state_to_string[state], state, block - state_block); + for (int i = 0; i < AltosEepromChunk.chunk_size && !done; i += record_length) { + AltosEeprom r = eechunk.eeprom(i, log_format, state); - AltosEepromBlock eeblock = new AltosEepromBlock(serial_line, block); + if (r == null) + continue; - if (eeblock.has_flight) { - flight = eeblock.flight; - monitor.set_flight(flight); - } - if (eeblock.has_date) { - year = eeblock.year; - month = eeblock.month; - day = eeblock.day; - want_file = true; - } + record_length = r.record_length(); - if (eeblock.size() == 0 || - eeblock.has_state && eeblock.state == Altos.ao_flight_landed) - done = true; + r.update_state(state); + + if (!got_flight && state.flight != AltosLib.MISSING) + monitor.set_flight(state.flight); /* Monitor state transitions to update display */ - if (eeblock.has_state) { - if (eeblock.state > Altos.ao_flight_pad) + if (state.state != AltosLib.ao_flight_invalid && + state.state <= AltosLib.ao_flight_landed) + { + if (state.state > Altos.ao_flight_pad) want_file = true; - if (eeblock.state > state) - state = eeblock.state; + 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 { + int block, state_block = 0; + int log_format = flights.config_data.log_format; + + state = new AltosState(); + + done = false; + start = true; - CheckFile(false); + 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(); - for (record = 0; record < eeblock.size(); record++) { - AltosEepromRecord r = eeblock.get(record); + /* Set serial number in the monitor dialog window */ + /* Now scan the eeprom, reading blocks of data and converting to .eeprom file form */ - String log_line = String.format("%c %4x %4x %4x\n", - r.cmd, r.tick, r.a, r.b); - if (eeprom_file != null) - eeprom_file.write(log_line); - else - eeprom_pending.add(log_line); + 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) { @@ -136,20 +190,21 @@ public class AltosEepromDownload implements Runnable { } } - private void show_error_internal(String message, String title) { + private void show_message_internal(String message, String title, int message_type) { JOptionPane.showMessageDialog(frame, message, title, - JOptionPane.ERROR_MESSAGE); + message_type); } - private void show_error(String in_message, String in_title) { + private void show_message(String in_message, String in_title, int in_message_type) { final String message = in_message; final String title = in_title; + final int message_type = in_message_type; Runnable r = new Runnable() { public void run() { try { - show_error_internal(message, title); + show_message_internal(message, title, message_type); } catch (Exception ex) { } } @@ -158,31 +213,51 @@ public class AltosEepromDownload implements Runnable { } public void run () { - if (remote) - serial_line.start_remote(); - try { + boolean failed = false; + if (remote) + serial_line.start_remote(); + for (AltosEepromLog log : flights) { - if (log.download) { + parse_exception = null; + if (log.selected) { monitor.reset(); CaptureLog(log); } + if (parse_exception != null) { + failed = true; + show_message(String.format("Flight %d download error\n%s\nValid log data saved", + log.flight, + parse_exception.getMessage()), + serial_line.device.toShortString(), + JOptionPane.WARNING_MESSAGE); + } } - System.out.printf("All flights successfully downloaded\n"); - success = true; + success = !failed; } catch (IOException ee) { - show_error (serial_line.device.toShortString(), - ee.getLocalizedMessage()); + show_message(ee.getLocalizedMessage(), + serial_line.device.toShortString(), + JOptionPane.ERROR_MESSAGE); } catch (InterruptedException ie) { + show_message(String.format("Connection to \"%s\" interrupted", + serial_line.device.toShortString()), + "Connection Interrupted", + JOptionPane.ERROR_MESSAGE); } catch (TimeoutException te) { - show_error (String.format("Connection to \"%s\" failed", - serial_line.device.toShortString()), - "Connection Failed"); + show_message(String.format("Connection to \"%s\" failed", + serial_line.device.toShortString()), + "Connection Failed", + JOptionPane.ERROR_MESSAGE); + } finally { + if (remote) { + try { + serial_line.stop_remote(); + } catch (InterruptedException ie) { + } + } + serial_line.flush_output(); } - if (remote) - serial_line.stop_remote(); monitor.done(); - serial_line.flush_output(); if (listener != null) { Runnable r = new Runnable() { public void run() { @@ -214,6 +289,7 @@ public class AltosEepromDownload implements Runnable { frame = given_frame; serial_line = given_serial_line; + serial_line.set_frame(frame); remote = given_remote; flights = given_flights; success = false;