X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=micropeak%2FMicroDownload.java;h=4dcb7a360e928e2457b084bc0bc5d3d6d545c3cd;hp=a9095f9c6bc9ed5da1c5d21b9d9d5a4486f982d0;hb=d2ec815a17e9327414bab7ea09ed483c4f47f460;hpb=488a527267decece48e6682e0e0c7fc29cbed329 diff --git a/micropeak/MicroDownload.java b/micropeak/MicroDownload.java index a9095f9c..4dcb7a36 100644 --- a/micropeak/MicroDownload.java +++ b/micropeak/MicroDownload.java @@ -3,7 +3,8 @@ * * 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. + * 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 @@ -23,35 +24,118 @@ import javax.swing.*; import java.io.*; import java.util.concurrent.*; import java.util.*; -import org.altusmetrum.altoslib_2.*; -import org.altusmetrum.altosuilib_1.*; +import org.altusmetrum.altoslib_14.*; +import org.altusmetrum.altosuilib_14.*; -public class MicroDownload extends AltosUIDialog implements Runnable, ActionListener { +public class MicroDownload extends AltosUIDialog implements Runnable, ActionListener, MicroSerialLog, WindowListener { MicroPeak owner; Container pane; AltosDevice device; JButton cancel; MicroData data; MicroSerial serial; + LinkedList log_queue = new LinkedList(); + Runnable log_run; + JTextArea serial_log; + JLabel status_value; + int log_column; - private void done_internal() { + public void windowActivated(WindowEvent e) { + } + + public void windowClosed(WindowEvent e) { setVisible(false); - if (data != null) { - if (data.crc_valid) { + dispose(); + } + + public void windowClosing(WindowEvent e) { + } + + public void windowDeactivated(WindowEvent e) { + } + + public void windowDeiconified(WindowEvent e) { + } + + public void windowIconified(WindowEvent e) { + } + + public void windowOpened(WindowEvent e) { + } + + private void done_internal() { + if (data != null && data.crc_valid) { + if (data.nsamples == 0) { + JOptionPane.showMessageDialog(owner, + "No Flight Data Present", + "Empty Log", + JOptionPane.WARNING_MESSAGE); + } else { + status_value.setText("Received MicroPeak Data"); owner = owner.SetData(data); MicroSave save = new MicroSave(owner, data); if (save.runDialog()) owner.SetName(data.name); - } else { - JOptionPane.showMessageDialog(owner, - "Flight data corrupted", - "Download Failed", - JOptionPane.ERROR_MESSAGE); } + } else { + JOptionPane.showMessageDialog(owner, + "Download Failed", + "Flight data corrupted", + JOptionPane.ERROR_MESSAGE); } + setVisible(false); dispose(); } + public void drain_queue() { + for (;;) { + int c; + synchronized(this) { + if (log_queue.isEmpty()) { + log_run = null; + break; + } + c = log_queue.remove(); + } + if (c == '\r') + continue; + if (c == '\0') + continue; + String s; + if (c == '\n') { + s = "\n"; + log_column = 0; + } else if (' ' <= c && c <= '~') { + byte[] bytes = new byte[1]; + bytes[0] = (byte) c; + s = new String(bytes, AltosLib.unicode_set); + log_column += 1; + } else { + s = String.format("\\0x%02x", c & 0xff); + log_column += 5; + } + serial_log.append(s); + if (log_column > 40) { + serial_log.append("\n"); + log_column = 0; + } + } + } + + public void log_char(int c) { + synchronized(this) { + log_queue.add(c); + if (log_run == null) { + log_run = new Runnable() { + public void run() { + drain_queue(); + } + }; + SwingUtilities.invokeLater(log_run); + } + } + } + public void done() { Runnable r = new Runnable() { public void run() { @@ -66,25 +150,53 @@ public class MicroDownload extends AltosUIDialog implements Runnable, ActionList public void run() { try { - data = new MicroData(serial, device.toShortString()); - serial.close(); + for (;;) { + try { + data = new MicroData(serial, device.toShortString()); + if (data != null && data.crc_valid) + break; + } catch (MicroData.NonHexcharException nhe) { + } + } + write_thread.join(); } catch (FileNotFoundException fe) { } catch (IOException ioe) { } catch (InterruptedException ie) { + } catch (MicroData.FileEndedException fee) { } + serial.close(); done(); } Thread serial_thread; + Thread write_thread; - public void start() { - try { - serial = new MicroSerial(device); - } catch (FileNotFoundException fe) { - return; + public class SerialWriter implements Runnable { + MicroSerial serial; + + public void run () { + try { + Thread.sleep(100); + serial.write('l'); + serial.write('\n'); + serial.flush(); + } catch (InterruptedException ie) { + } + } + + public SerialWriter(MicroSerial serial) { + this.serial = serial; } + } + + public void start() { + serial.set_log(this); serial_thread = new Thread(this); serial_thread.start(); + + SerialWriter writer = new SerialWriter(serial); + write_thread = new Thread(writer); + write_thread.start(); } public void actionPerformed(ActionEvent ae) { @@ -95,7 +207,7 @@ public class MicroDownload extends AltosUIDialog implements Runnable, ActionList setVisible(false); } - public MicroDownload(MicroPeak owner, AltosDevice device) { + public MicroDownload(MicroPeak owner, AltosDevice device, MicroSerial serial) { super (owner, "Download MicroPeak Data", false); int y = 0; @@ -106,8 +218,9 @@ public class MicroDownload extends AltosUIDialog implements Runnable, ActionList this.owner = owner; this.device = device; + this.serial = serial; - pane = getContentPane(); + pane = getScrollablePane(); pane.setLayout(new GridBagLayout()); c = new GridBagConstraints(); @@ -120,7 +233,7 @@ public class MicroDownload extends AltosUIDialog implements Runnable, ActionList c = new GridBagConstraints(); c.gridx = 1; c.gridy = y; - c.fill = GridBagConstraints.HORIZONTAL; + c.fill = GridBagConstraints.NONE; c.weightx = 1; c.anchor = GridBagConstraints.LINE_START; c.insets = ir; @@ -132,42 +245,53 @@ public class MicroDownload extends AltosUIDialog implements Runnable, ActionList c.gridx = 0; c.gridy = y; c.gridwidth = GridBagConstraints.REMAINDER; c.fill = GridBagConstraints.HORIZONTAL; - c.weightx = 1; + c.weightx = 0; c.anchor = GridBagConstraints.LINE_START; c.insets = ir; - JTextArea help_text = new JTextArea( - - "Locate the photo transistor on the MicroPeak USB adapter\n" + - "and place the LED on the MicroPeak directly in contact\n" + - "with it.\n" + - "\n" + - "The MicroPeak LED and the MicroPeak USB adapter\n" + - "photo need to be touching—even a millimeters of space\n" + - "between them will reduce the light intensity from the LED\n" + - "enough that the phototransistor will not sense it.\n" + - "\n" + - "Turn on the MicroPeak board and adjust the position until\n" + - "the blue LED on the MicroPeak USB adapter blinks in time\n" + - "with the orange LED on the MicroPeak board."); + JLabel help_text = new JLabel( + "Turn on the MicroPeak and place the LED inside the
" + + "opening in the top of the MicroPeak USB adapter.
" + + "Verify that the blue LED in the side of the USB adapter
" + + "is blinking along with the orange LED on the MicroPeak.
"); +// help_text.setEditable(false); pane.add(help_text, c); y++; c = new GridBagConstraints(); c.gridx = 0; c.gridy = y; - c.gridwidth = 1; + c.gridwidth = 2; c.fill = GridBagConstraints.HORIZONTAL; c.weightx = 1; c.anchor = GridBagConstraints.LINE_START; c.insets = ir; - JLabel waiting_value = new JLabel("Waiting for MicroPeak data..."); - pane.add(waiting_value, c); + status_value = new JLabel("Waiting for MicroPeak data..."); + pane.add(status_value, c); + y++; + + serial_log = new JTextArea(10, 20); + serial_log.setEditable(false); + + JScrollPane serial_scroll = new JScrollPane(serial_log); + serial_scroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); + + c = new GridBagConstraints(); + c.gridx = 0; c.gridy = y; + c.gridwidth = GridBagConstraints.REMAINDER; + c.fill = GridBagConstraints.BOTH; + c.weightx = 1; + c.weighty = 1; + c.anchor = GridBagConstraints.LINE_START; + c.insets = ir; + + pane.add(serial_scroll, c); + y++; cancel = new JButton("Cancel"); c = new GridBagConstraints(); c.fill = GridBagConstraints.NONE; - c.anchor = GridBagConstraints.CENTER; - c.gridx = 1; c.gridy = y; + c.anchor = GridBagConstraints.EAST; + c.gridx = 0; c.gridy = y; c.gridwidth = GridBagConstraints.REMAINDER; Insets ic = new Insets(4,4,4,4); c.insets = ic;