X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=altosuilib%2FAltosFlashUI.java;h=c717e47c1840a30cc07c3d8e50830e9896a2f6fa;hb=debian;hp=b91776aa198ebb120c4b0a633c3a4d21ff1830cf;hpb=34658a1236e34891b41a0a51a480717db98779e7;p=fw%2Faltos diff --git a/altosuilib/AltosFlashUI.java b/altosuilib/AltosFlashUI.java index b91776aa..3665aaf1 100644 --- a/altosuilib/AltosFlashUI.java +++ b/altosuilib/AltosFlashUI.java @@ -16,7 +16,7 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ -package org.altusmetrum.altosuilib_13; +package org.altusmetrum.altosuilib_14; import java.awt.*; import java.awt.event.*; @@ -24,7 +24,7 @@ import javax.swing.*; import javax.swing.filechooser.FileNameExtensionFilter; import java.io.*; import java.util.concurrent.*; -import org.altusmetrum.altoslib_13.*; +import org.altusmetrum.altoslib_14.*; public class AltosFlashUI extends AltosUIDialog @@ -45,7 +45,7 @@ public class AltosFlashUI File file; // Debug connection - AltosDevice device; + AltosUSBDevice device; AltosLink link; @@ -64,8 +64,7 @@ public class AltosFlashUI "telemetrum-v1", "telemini-v1", "telenano", - "teleshield", - "teleterra" + "teleshield" }; private static final String[] pair_programmed_devices = { @@ -78,8 +77,11 @@ public class AltosFlashUI "TeleMetrum-v1", "TeleMini-v1", "TeleNano", - "TeleShield", - "TeleTerra" + "TeleShield" + }; + + private static final String[] log_erased_devices = { + "TeleGPS" }; private boolean is_pair_programmed() { @@ -101,6 +103,17 @@ public class AltosFlashUI return false; } + private boolean is_log_erased() { + if (device != null) { + String name = device.toString(); + for (int i = 0; i < log_erased_devices.length; i++) { + if (name.startsWith(log_erased_devices[i])) + return true; + } + } + return false; + } + public void actionPerformed(ActionEvent e) { if (e.getSource() == cancel) { if (programmer != null) @@ -133,7 +146,7 @@ public class AltosFlashUI Insets il = new Insets(4,4,4,4); Insets ir = new Insets(4,4,4,4); - pane = getContentPane(); + pane = getScrollablePane(); pane.setLayout(new GridBagLayout()); c = new GridBagConstraints(); @@ -205,14 +218,29 @@ public class AltosFlashUI } static class AltosHexfileFilter extends javax.swing.filechooser.FileFilter { - int product; String head; String description; - public AltosHexfileFilter(int product, String head, String description) { - this.product = product; - this.head = head; - this.description = description; + public AltosHexfileFilter(String usb_product) { + int l; + int dash; + + /* Trim off any trailing variants (1.0a vs 1.0) */ + for (dash = usb_product.length(); dash > 0; dash--) { + char c = usb_product.charAt(dash-1); + if (c == '-') + break; + } + if (dash == 0) + dash = usb_product.length(); + + for (l = usb_product.length(); l > dash; l--) { + char c = usb_product.charAt(l-1); + if (c < 'a' || 'z' < c) + break; + } + head = usb_product.substring(0, l).toLowerCase(); + description = String.format("%s Image File", usb_product); } public boolean accept(File file) { @@ -224,14 +252,6 @@ public class AltosFlashUI } } - static AltosHexfileFilter[] filters = { - new AltosHexfileFilter(AltosLib.product_telemetrum, "telemetrum", "TeleMetrum Image"), - new AltosHexfileFilter(AltosLib.product_teledongle, "teledongle", "TeleDongle Image"), - new AltosHexfileFilter(AltosLib.product_telemega, "telemega", "TeleMega Image"), - new AltosHexfileFilter(AltosLib.product_easymini, "easymini", "EasyMini Image"), - new AltosHexfileFilter(AltosLib.product_easymega, "easymega", "EasyMega Image"), - }; - boolean select_source_file() { JFileChooser hexfile_chooser = new JFileChooser(); @@ -241,18 +261,14 @@ public class AltosFlashUI hexfile_chooser.setDialogTitle("Select Flash Image"); - for (int i = 0; i < filters.length; i++) { - hexfile_chooser.addChoosableFileFilter(filters[i]); - } javax.swing.filechooser.FileFilter ihx_filter = new FileNameExtensionFilter("Flash Image", "ihx"); hexfile_chooser.addChoosableFileFilter(ihx_filter); hexfile_chooser.setFileFilter(ihx_filter); if (!is_pair_programmed() && !device.matchProduct(AltosLib.product_altusmetrum)) { - for (int i = 0; i < filters.length; i++) { - if (device != null && device.matchProduct(filters[i].product)) - hexfile_chooser.setFileFilter(filters[i]); - } + AltosHexfileFilter filter = new AltosHexfileFilter(device.usb_product()); + hexfile_chooser.addChoosableFileFilter(filter); + hexfile_chooser.setFileFilter(filter); } int returnVal = hexfile_chooser.showOpenDialog(frame); @@ -270,7 +286,7 @@ public class AltosFlashUI boolean select_device() { int product = AltosLib.product_any; - device = AltosDeviceUIDialog.show(frame, AltosLib.product_any); + device = AltosDeviceUIDialog.show_usb(frame, AltosLib.product_any); if (device == null) return false; @@ -325,7 +341,7 @@ public class AltosFlashUI return false; } - if (existing_config.radio_calibration_broken) { + if (existing_config != null && existing_config.radio_calibration_broken) { int ret = JOptionPane.showConfirmDialog(this, String.format("Radio calibration value %d may be incorrect\nFlash anyways?", existing_config.radio_calibration), @@ -393,10 +409,12 @@ public class AltosFlashUI else programmer = new AltosSelfFlash(ui.file, link, this); - final AltosRomconfig current_config = programmer.target_romconfig(); + final AltosRomconfig current_config = programmer.target_romconfig(device.usb_id(), device.usb_product()); final AltosRomconfig image_config = programmer.image_romconfig(); + System.out.printf("product %s current %s image %s\n", device.usb_product(), current_config, image_config); + final Semaphore await_rom_config = new Semaphore(0); SwingUtilities.invokeLater(new Runnable() { public void run() { @@ -440,13 +458,20 @@ public class AltosFlashUI flash_task flasher; + boolean erase_answer; class open_task implements Runnable { AltosDevice device; Thread t; open_dialog dialog; + AltosLink link; public void do_exception(final Exception e) { + if (link != null) { + try { + link.close(); + } catch (Exception ex) {} + } SwingUtilities.invokeLater( new Runnable() { public void run() { @@ -464,37 +489,57 @@ public class AltosFlashUI }); } - public void do_failure() { + public boolean do_notify_erase(final AltosConfigData config_data) { + erase_answer = false; + final Semaphore erase_answer_done = new Semaphore(0); SwingUtilities.invokeLater( new Runnable() { public void run() { - try { dialog.open_failure(); } catch (Exception ex) { } - } - }); - } - - public void do_cancel() { - SwingUtilities.invokeLater( - new Runnable() { - public void run() { - try { dialog.open_cancel(); } catch (Exception ex) { } + int ret = JOptionPane.showConfirmDialog(dialog.owner, + String.format("Updating %s from firmware %s will erase stored data, continue?", + config_data.product, + config_data.version), + "Erase Stored Data?", + JOptionPane.YES_NO_OPTION); + erase_answer = ret == JOptionPane.YES_OPTION; + erase_answer_done.release(); } }); + try { + erase_answer_done.acquire(); + } catch (Exception ex) { + return false; + } + return erase_answer; } public void run () { + link = null; try { - AltosLink link = null; + boolean new_device = false; for (;;) { System.out.printf("Attempting to open %s\n", device.toShortString()); - link = new AltosSerial(device); + for (int i = 0; i < 20; i++) { + link = new AltosSerial(device); + + if (link != null) + break; + + if (!new_device) + break; + System.out.printf("Waiting for device to become ready\n"); + + Thread.sleep(1000); + } if (link == null) throw new IOException(String.format("%s: open failed", device.toShortString())); + System.out.printf("Checking device ready\n"); + /* See if the link is usable already */ if (is_pair_programmed() || link.is_loader()) { System.out.printf("Device ready for use\n"); @@ -502,6 +547,24 @@ public class AltosFlashUI return; } + System.out.printf("Checking log erased\n"); + + if (is_log_erased()) { + System.out.printf("Fetching config data\n"); + AltosConfigData config_data = link.config_data(); + System.out.printf("version %s\n", config_data.version); + /* Completely erase TeleGPS flash when firmware is old */ + if (config_data.compare_version("1.9.7") < 0) + { + if (!do_notify_erase(config_data)) + throw new IOException(String.format("%s: not erasing log", + device.toShortString())); + System.out.printf("Erasing log\n"); + link.printf("Z DoIt\n"); + link.synchronize(120 * 1000); + } + } + java.util.List prev_devices = AltosUSBDevice.list(AltosLib.product_altusmetrum); @@ -539,7 +602,8 @@ public class AltosFlashUI } if (!matched) { System.out.printf("Identified new device %s\n", d.toShortString()); - device = d; + device = (AltosUSBDevice) d; + new_device = true; break; } } @@ -553,7 +617,10 @@ public class AltosFlashUI do_exception(fe); } catch (IOException ie) { do_exception (ie); + } catch (TimeoutException te) { + do_exception (te); } catch (InterruptedException ie) { + do_exception (ie); } } @@ -598,18 +665,6 @@ public class AltosFlashUI done = true; } - public void open_failure() { - System.out.printf("open_failure\n"); - setVisible(false); - done = true; - } - - public void open_cancel() { - System.out.printf("open_cancel\n"); - setVisible(false); - done = true; - } - public AltosLink do_open(open_task open) throws InterruptedException { this.open = open; setVisible(true); @@ -630,7 +685,7 @@ public class AltosFlashUI super(in_owner, "Open Flash Target Device", true); owner = in_owner; - Container pane = getContentPane(); + Container pane = getScrollablePane(); GridBagConstraints c = new GridBagConstraints(); Insets i = new Insets(4,4,4,4);