* 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.*;
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
"telemetrum-v1",
"telemini-v1",
"telenano",
- "teleshield",
- "teleterra"
+ "teleshield"
};
private static final String[] pair_programmed_devices = {
"TeleMetrum-v1",
"TeleMini-v1",
"TeleNano",
- "TeleShield",
- "TeleTerra"
+ "TeleShield"
+ };
+
+ private static final String[] log_erased_devices = {
+ "TeleGPS"
};
private boolean is_pair_programmed() {
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)
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();
public AltosHexfileFilter(String usb_product) {
int l;
+ int dash;
/* Trim off any trailing variants (1.0a vs 1.0) */
- for (l = usb_product.length(); l > 0; l--) {
+ 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;
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),
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() {
});
}
- 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");
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<AltosDevice> prev_devices =
AltosUSBDevice.list(AltosLib.product_altusmetrum);
if (!matched) {
System.out.printf("Identified new device %s\n", d.toShortString());
device = (AltosUSBDevice) d;
+ new_device = true;
break;
}
}
do_exception(fe);
} catch (IOException ie) {
do_exception (ie);
+ } catch (TimeoutException te) {
+ do_exception (te);
} catch (InterruptedException ie) {
+ do_exception (ie);
}
}
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);
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);