From daf8776f8646ba187f1a17f7aae797503bed3f2a Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Fri, 28 Dec 2012 16:34:48 -0800 Subject: [PATCH] Lots more work on the MicroPeak application Signed-off-by: Keith Packard --- icon/micropeak-128.png | Bin 0 -> 4394 bytes icon/micropeak-16.png | Bin 0 -> 534 bytes icon/micropeak-256.png | Bin 0 -> 8055 bytes icon/micropeak-32.png | Bin 0 -> 1072 bytes icon/micropeak-48.png | Bin 0 -> 1662 bytes icon/micropeak-64.png | Bin 0 -> 2240 bytes micropeak/Makefile.am | 24 +++ micropeak/MicroFontListener.java | 22 +++ micropeak/MicroFrame.java | 74 +++++++++ micropeak/MicroPeak.java | 2 +- micropeak/MicroPreferences.java | 221 +++++++++++++++++++++++++ micropeak/MicroPreferencesBackend.java | 101 +++++++++++ micropeak/MicroSerial.java | 5 +- micropeak/MicroUIListener.java | 22 +++ 14 files changed, 469 insertions(+), 2 deletions(-) create mode 100644 icon/micropeak-128.png create mode 100644 icon/micropeak-16.png create mode 100644 icon/micropeak-256.png create mode 100644 icon/micropeak-32.png create mode 100644 icon/micropeak-48.png create mode 100644 icon/micropeak-64.png create mode 100644 micropeak/MicroFontListener.java create mode 100644 micropeak/MicroFrame.java create mode 100644 micropeak/MicroPreferences.java create mode 100644 micropeak/MicroPreferencesBackend.java create mode 100644 micropeak/MicroUIListener.java diff --git a/icon/micropeak-128.png b/icon/micropeak-128.png new file mode 100644 index 0000000000000000000000000000000000000000..f045dc6ab03af2181bd5262ac5ea7c833aa2dca8 GIT binary patch literal 4394 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 literal 0 HcmV?d00001 diff --git a/icon/micropeak-32.png b/icon/micropeak-32.png new file mode 100644 index 0000000000000000000000000000000000000000..d34c5c12eebd93c5cd37db2cd89825d4c2ce7a94 GIT binary patch literal 1072 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 IM6N<$g4jkJWB>pF literal 0 HcmV?d00001 diff --git a/icon/micropeak-64.png b/icon/micropeak-64.png new file mode 100644 index 0000000000000000000000000000000000000000..6ca7c2eb03c51c9fb502e945e913192938f872e2 GIT binary patch literal 2240 zcmV;x2tW6UP)^2^4vZ{+x^J7TdN^73@${_@d_&UbICEpmAL2oyw~UUS3D z)BIeD+wk7WgE@TVOWcvx+-TWyYyTz9tKnQ!bT*fpt)6Jbr(O3jVs zqtgnoHD~JAy~cjYvPh3kOH2EBFEBQ($EloAYwM3+N)Qp8qk6T5$d`aB7ou&1(J7b0 zf1EI5piz4pG^zYaRHmnvI(+TkB zann*mcHn7XP-KekG`4+h=8yw>6vhH?)#OWYO+Cj|*#X=Jyr;?|HF@&PJ9#nyK$Y`A zYCM0PPJpvs?;{rntxHg-dVT!viQn1wum4D6MFp4(6aWW+J5z*=>~cmc6d+6t3I}TQ zWSSVxBk=|BERv0BHr8Fh2%Au4na+DF(V&;g=01MxdkxY*gjHFlbLtYc0Z=u5_6^3v z-A+zmmyurg6oxl6%5>mOV1pfG)9}@wO?j+@t6}BgJbB&-RVw@mB?KIb=hN7jb)c1? zKQowvKH1tg(ZK!idqGwxEHZ@l&62H6RwvD&NQ#V#td64pZF%hJQ?_rvG5K;|0HgZ(UEpTtf5D%VSm0Ze1ijut^}33NF^Sj!7&@l*$G~VO zCn^i4Y=7k=CzrKS-)xD!A%%J&yG-*?CJEHX%V&TuM^ZAlr9lIn<6K`FHy93RW+FC< za*8~P7DiZ5p1J+S=e8$eCl<2H^{;_G%!!xYDF(s8AHQ=ujc0jbGzg*mwz5B>P#fZ< zbqWE1pG5o;u#;olq|E>!V!kSOxydK8>Ie&ZVA06f2 zRRLCK=OzpKLnkMy>pC(9R|W8Rf-``A4(d}Y=-JefF}Ny#pbMg?Ei?C2pX$gMToYh* zcJ45c2~JLJ>9D~s4A%rOjhh+=WdFQ9Pj=Yg=ZM2CmhJ%UPX$v$FK#`0@41};pH=irYhsv}l zYFnZ<+6u9{Ktck5BqTtQ6nO+DJ2_iAmjK@?lASF&EnX~7WC(h9A`W{Gxo{)U$3dOx z9XR)LA~xC*u>{CG#rxlDNnsmr1<*SYhpHOU{6%Z~+# z*)_(CQ`k^LFsaq2KCQv$_4RatCu|Hps?HXOo)@hCO61-Z_yE`o+}fNo8#B%D*=rRQ zUi;~xH774C@-{+C7eYNi`p4jdf|(`oo|CjOF&`a>NYv_2Ty6dkTY#3nn0VJa04+wfzkvw2XjP!kiRyQDPR_VOc0Dgki z$yhf5-vE6)*2PH3mZ`?VabKXd^AE3myDciw8pIOdT#0_a0;pIb>w5-Bxk}J06+K}v zAC%}FC!!0i(YsDU{G(?88}4y7Hx>7rKQwbaUaUVlL*q46i!LML+8I!Mtr))T_S;gls{jx7EdMGtzm6b< zn&dubs@v0VB50QwR^_FSVu5*1`ko2T2YSO8f^!%|VU5UC^(^PL!uK;E(xI%T0Jd{s|FN z)T@_kOwljJNqKn5e;@b-+TvAahrt-Mn8tbjtUzTMb1(aBPDGc|_z)T3ZB)usnXvT3 z<;y!`6^H2dQK O0000 + * + * 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.micropeak; + +public interface MicroFontListener { + void font_size_changed(int font_size); +} diff --git a/micropeak/MicroFrame.java b/micropeak/MicroFrame.java new file mode 100644 index 00000000..a9b9a37a --- /dev/null +++ b/micropeak/MicroFrame.java @@ -0,0 +1,74 @@ +/* + * 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.micropeak; + +import java.awt.*; +import java.awt.event.*; +import javax.swing.*; +import java.util.*; + +class MicroFrameListener extends WindowAdapter { + public void windowClosing (WindowEvent e) { + MicroPreferences.unregister_ui_listener((MicroFrame) e.getWindow()); + } +} + +public class MicroFrame extends JFrame implements MicroUIListener { + + public void ui_changed(String look_and_feel) { + SwingUtilities.updateComponentTreeUI(this); + this.pack(); + } + + static final String[] icon_names = { + "/micropeak-16.png", + "/micropeak-32.png", + "/micropeak-48.png", + "/micropeak-64.png", + "/micropeak-128.png", + "/micropeak-256.png" + }; + + public void set_icon() { + ArrayList icons = new ArrayList(); + + for (int i = 0; i < icon_names.length; i++) { + java.net.URL imgURL = MicroPeak.class.getResource(icon_names[i]); + if (imgURL != null) + icons.add(new ImageIcon(imgURL).getImage()); + } + + setIconImages(icons); + } + + public MicroFrame() { + super(); + MicroPreferences.set_component(this); + MicroPreferences.register_ui_listener(this); + addWindowListener(new MicroFrameListener()); + set_icon(); + } + + public MicroFrame(String name) { + super(name); + MicroPreferences.set_component(this); + MicroPreferences.register_ui_listener(this); + addWindowListener(new MicroFrameListener()); + set_icon(); + } +} diff --git a/micropeak/MicroPeak.java b/micropeak/MicroPeak.java index cd09c475..c9074348 100644 --- a/micropeak/MicroPeak.java +++ b/micropeak/MicroPeak.java @@ -25,7 +25,7 @@ import java.util.concurrent.*; import java.util.*; import org.altusmetrum.AltosLib.*; -public class MicroPeak extends JFrame implements ActionListener, ItemListener { +public class MicroPeak extends MicroFrame implements ActionListener, ItemListener { File filename; MicroGraph graph; diff --git a/micropeak/MicroPreferences.java b/micropeak/MicroPreferences.java new file mode 100644 index 00000000..70c2557c --- /dev/null +++ b/micropeak/MicroPreferences.java @@ -0,0 +1,221 @@ +/* + * 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.micropeak; + +import java.io.*; +import java.util.*; +import java.awt.Component; +import javax.swing.*; +import java.awt.*; +import org.altusmetrum.AltosLib.*; + +public class MicroPreferences extends AltosPreferences { + + static final int tab_elt_pad = 5; + + static Font label_font; + static Font value_font; + static Font status_font; + static Font table_label_font; + static Font table_value_font; + + final static int font_size_small = 1; + final static int font_size_medium = 2; + final static int font_size_large = 3; + + static void set_fonts(int size) { + int brief_size; + int table_size; + int status_size; + + switch (size) { + case font_size_small: + brief_size = 16; + status_size = 18; + table_size = 11; + break; + default: + case font_size_medium: + brief_size = 22; + status_size = 24; + table_size = 14; + break; + case font_size_large: + brief_size = 26; + status_size = 30; + table_size = 17; + break; + } + label_font = new Font("Dialog", Font.PLAIN, brief_size); + value_font = new Font("Monospaced", Font.PLAIN, brief_size); + status_font = new Font("SansSerif", Font.BOLD, status_size); + table_label_font = new Font("SansSerif", Font.PLAIN, table_size); + table_value_font = new Font("Monospaced", Font.PLAIN, table_size); + } + + /* font size preferences name */ + final static String fontSizePreference = "FONT-SIZE"; + + /* Look&Feel preference name */ + final static String lookAndFeelPreference = "LOOK-AND-FEEL"; + + /* UI Component to pop dialogs up */ + static Component component; + + static LinkedList font_listeners; + + static int font_size = font_size_medium; + + static LinkedList ui_listeners; + + static String look_and_feel = null; + + /* Serial debug */ + static boolean serial_debug; + + public static void init() { + AltosPreferences.init(new MicroPreferencesBackend()); + + font_listeners = new LinkedList(); + + font_size = backend.getInt(fontSizePreference, font_size_medium); + set_fonts(font_size); + look_and_feel = backend.getString(lookAndFeelPreference, UIManager.getSystemLookAndFeelClassName()); + + ui_listeners = new LinkedList(); + serial_debug = backend.getBoolean(serialDebugPreference, false); + } + + static { init(); } + + static void set_component(Component in_component) { + component = in_component; + } + + private static boolean check_dir(File dir) { + if (!dir.exists()) { + if (!dir.mkdirs()) { + JOptionPane.showMessageDialog(component, + dir.getName(), + "Cannot create directory", + JOptionPane.ERROR_MESSAGE); + return false; + } + } else if (!dir.isDirectory()) { + JOptionPane.showMessageDialog(component, + dir.getName(), + "Is not a directory", + JOptionPane.ERROR_MESSAGE); + return false; + } + return true; + } + + /* Configure the log directory. This is where all telemetry and eeprom files + * will be written to, and where replay will look for telemetry files + */ + public static void ConfigureLog() { + JFileChooser logdir_chooser = new JFileChooser(logdir.getParentFile()); + + logdir_chooser.setDialogTitle("Configure Data Logging Directory"); + logdir_chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); + + if (logdir_chooser.showDialog(component, "Select Directory") == JFileChooser.APPROVE_OPTION) { + File dir = logdir_chooser.getSelectedFile(); + if (check_dir(dir)) + set_logdir(dir); + } + } + public static int font_size() { + synchronized (backend) { + return font_size; + } + } + + static void set_fonts() { + } + + public static void set_font_size(int new_font_size) { + synchronized (backend) { + font_size = new_font_size; + backend.putInt(fontSizePreference, font_size); + flush_preferences(); + set_fonts(font_size); + for (MicroFontListener l : font_listeners) + l.font_size_changed(font_size); + } + } + + public static void register_font_listener(MicroFontListener l) { + synchronized (backend) { + font_listeners.add(l); + } + } + + public static void unregister_font_listener(MicroFontListener l) { + synchronized (backend) { + font_listeners.remove(l); + } + } + + public static void set_look_and_feel(String new_look_and_feel) { + try { + UIManager.setLookAndFeel(new_look_and_feel); + } catch (Exception e) { + } + synchronized(backend) { + look_and_feel = new_look_and_feel; + backend.putString(lookAndFeelPreference, look_and_feel); + flush_preferences(); + for (MicroUIListener l : ui_listeners) + l.ui_changed(look_and_feel); + } + } + + public static String look_and_feel() { + synchronized (backend) { + return look_and_feel; + } + } + + public static void register_ui_listener(MicroUIListener l) { + synchronized(backend) { + ui_listeners.add(l); + } + } + + public static void unregister_ui_listener(MicroUIListener l) { + synchronized (backend) { + ui_listeners.remove(l); + } + } + public static void set_serial_debug(boolean new_serial_debug) { + synchronized (backend) { + serial_debug = new_serial_debug; + backend.putBoolean(serialDebugPreference, serial_debug); + flush_preferences(); + } + } + + public static boolean serial_debug() { + synchronized (backend) { + return serial_debug; + } + } + +} diff --git a/micropeak/MicroPreferencesBackend.java b/micropeak/MicroPreferencesBackend.java new file mode 100644 index 00000000..7d92f6be --- /dev/null +++ b/micropeak/MicroPreferencesBackend.java @@ -0,0 +1,101 @@ +/* + * Copyright © 2012 Mike Beattie + * + * 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.micropeak; + +import java.io.File; +import java.util.prefs.*; +import org.altusmetrum.AltosLib.*; +import javax.swing.filechooser.FileSystemView; + +public class MicroPreferencesBackend implements AltosPreferencesBackend { + + private Preferences _preferences = null; + + public MicroPreferencesBackend() { + _preferences = Preferences.userRoot().node("/org/altusmetrum/altosui"); + } + + public MicroPreferencesBackend(Preferences in_preferences) { + _preferences = in_preferences; + } + + public String getString(String key, String def) { + return _preferences.get(key, def); + } + public void putString(String key, String value) { + _preferences.put(key, value); + } + + public int getInt(String key, int def) { + return _preferences.getInt(key, def); + } + public void putInt(String key, int value) { + _preferences.putInt(key, value); + } + + public double getDouble(String key, double def) { + return _preferences.getDouble(key, def); + } + public void putDouble(String key, double value) { + _preferences.putDouble(key, value); + } + + public boolean getBoolean(String key, boolean def) { + return _preferences.getBoolean(key, def); + } + public void putBoolean(String key, boolean value) { + _preferences.putBoolean(key, value); + } + + public boolean nodeExists(String key) { + try { + return _preferences.nodeExists(key); + } catch (BackingStoreException be) { + return false; + } + } + + public AltosPreferencesBackend node(String key) { + return new MicroPreferencesBackend(_preferences.node(key)); + } + + public String[] keys() { + try { + return _preferences.keys(); + } catch (BackingStoreException be) { + return null; + } + } + + public void remove(String key) { + _preferences.remove(key); + } + + public void flush() { + try { + _preferences.flush(); + } catch (BackingStoreException ee) { + System.err.printf("Cannot save preferences\n"); + } + } + + public File homeDirectory() { + /* Use the file system view default directory */ + return FileSystemView.getFileSystemView().getDefaultDirectory(); + } +} diff --git a/micropeak/MicroSerial.java b/micropeak/MicroSerial.java index afe55532..8546276e 100644 --- a/micropeak/MicroSerial.java +++ b/micropeak/MicroSerial.java @@ -24,7 +24,10 @@ public class MicroSerial extends InputStream { SWIGTYPE_p_altos_file file; public int read() { - return libaltos.altos_getchar(file, 0); + int c = libaltos.altos_getchar(file, 0); + if (MicroPreferences.serial_debug) + System.out.printf("%c", c); + return c; } public void close() { diff --git a/micropeak/MicroUIListener.java b/micropeak/MicroUIListener.java new file mode 100644 index 00000000..9aed8dae --- /dev/null +++ b/micropeak/MicroUIListener.java @@ -0,0 +1,22 @@ +/* + * 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.micropeak; + +public interface MicroUIListener { + public void ui_changed(String look_and_feel); +} -- 2.30.2