From: Keith Packard Date: Sat, 9 Feb 2013 09:58:23 +0000 (-0800) Subject: altosuilib: Add graphing routines from MicroPeak X-Git-Tag: altosdroid_v1.2-1~130 X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=commitdiff_plain;h=9839b0b62d797a8616fc66038e3f3c68e2a214d0;hp=fd5e6b80a8be5fac7d913b97570f7e11f70a60ba altosuilib: Add graphing routines from MicroPeak Make these available for AltosUI too Signed-off-by: Keith Packard --- diff --git a/altosuilib/AltosUIDataPoint.java b/altosuilib/AltosUIDataPoint.java new file mode 100644 index 00000000..38857fd1 --- /dev/null +++ b/altosuilib/AltosUIDataPoint.java @@ -0,0 +1,23 @@ +/* + * Copyright © 2013 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.altosuilib_1; + +public interface AltosUIDataPoint { + public abstract double x(); + public abstract double y(int index); +} \ No newline at end of file diff --git a/altosuilib/AltosUIDataSet.java b/altosuilib/AltosUIDataSet.java new file mode 100644 index 00000000..6f23ef9a --- /dev/null +++ b/altosuilib/AltosUIDataSet.java @@ -0,0 +1,23 @@ +/* + * Copyright © 2013 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.altosuilib_1; + +public interface AltosUIDataSet { + public abstract String name(); + public abstract Iterable dataPoints(); +} diff --git a/altosuilib/AltosUIEnable.java b/altosuilib/AltosUIEnable.java new file mode 100644 index 00000000..e5695fa0 --- /dev/null +++ b/altosuilib/AltosUIEnable.java @@ -0,0 +1,93 @@ +/* + * Copyright © 2013 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.altosuilib_1; + +import java.awt.*; +import java.awt.event.*; +import javax.swing.*; +import java.io.*; +import java.util.concurrent.*; +import java.util.*; +import org.altusmetrum.altoslib_1.*; + +import org.jfree.ui.*; +import org.jfree.chart.*; +import org.jfree.chart.plot.*; +import org.jfree.chart.axis.*; +import org.jfree.chart.renderer.*; +import org.jfree.chart.renderer.xy.*; +import org.jfree.chart.labels.*; +import org.jfree.data.xy.*; +import org.jfree.data.*; + +public class AltosUIEnable extends Container { + + Insets il, ir; + int y; + + class GraphElement implements ActionListener { + AltosUISeries series; + JLabel label; + JRadioButton enable; + String name; + + public void actionPerformed(ActionEvent ae) { + series.set_enable(enable.isSelected()); + } + + GraphElement (String name, AltosUISeries series, boolean enabled) { + this.name = name; + this.series = series; + label = new JLabel(name); + enable = new JRadioButton("Enable", enabled); + series.set_enable(enabled); + enable.addActionListener(this); + } + } + + public void add(String name, AltosUISeries series, boolean enabled) { + + GraphElement e = new GraphElement(name, series, enabled); + + /* Add label */ + GridBagConstraints c = new GridBagConstraints(); + c.gridx = 0; c.gridy = y; + c.fill = GridBagConstraints.NONE; + c.anchor = GridBagConstraints.LINE_START; + c.insets = il; + add(e.label, c); + + /* Add radio button */ + c = new GridBagConstraints(); + c.gridx = 1; c.gridy = y; + c.fill = GridBagConstraints.HORIZONTAL; + c.anchor = GridBagConstraints.CENTER; + c.insets = ir; + add(e.enable, c); + + /* Next row */ + y++; + } + + public AltosUIEnable() { + il = new Insets(4,4,4,4); + ir = new Insets(4,4,4,4); + y = 0; + setLayout(new GridBagLayout()); + } +} diff --git a/altosuilib/AltosUIGraph.java b/altosuilib/AltosUIGraph.java new file mode 100644 index 00000000..e79e36ba --- /dev/null +++ b/altosuilib/AltosUIGraph.java @@ -0,0 +1,129 @@ +/* + * Copyright © 2012 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.altosuilib_1; + +import java.io.*; +import java.util.ArrayList; + +import java.awt.*; +import javax.swing.*; +import org.altusmetrum.altoslib_1.*; + +import org.jfree.ui.*; +import org.jfree.chart.*; +import org.jfree.chart.plot.*; +import org.jfree.chart.axis.*; +import org.jfree.chart.renderer.*; +import org.jfree.chart.renderer.xy.*; +import org.jfree.chart.labels.*; +import org.jfree.data.xy.*; +import org.jfree.data.*; + +public class AltosUIGraph implements AltosUnitsListener { + + XYPlot plot; + JFreeChart chart; + public ChartPanel panel; + NumberAxis xAxis; + AltosUIEnable enable; + ArrayList series; + AltosUIDataSet dataSet; + + static final private Color gridline_color = new Color(0, 0, 0); + static final private Color border_color = new Color(255, 255, 255); + static final private Color background_color = new Color(255, 255, 255); + + public JPanel panel() { + return panel; + } + + public void addSeries(int index, String label, int fetch, AltosUnits units, Color color) { + AltosUISeries series = new AltosUISeries(label, fetch, units, color); + XYSeriesCollection dataset = new XYSeriesCollection(series); + + series.renderer.setPlot(plot); + plot.setRangeAxis(index, series.axis); + plot.setDataset(index, dataset); + plot.setRenderer(index, series.renderer); + plot.mapDatasetToRangeAxis(index, index); + if (enable != null) + enable.add(label, series, true); + this.series.add(series); + } + + public void resetData() { + for (AltosUISeries s : series) + s.clear(); + if (dataSet != null) { + for (AltosUIDataPoint dataPoint : dataSet.dataPoints()) + for (AltosUISeries s : series) + s.add(dataPoint); + } + } + + public void units_changed(boolean imperial_units) { + for (AltosUISeries s : series) + s.set_units(); + resetData(); + } + + public void setName (String name) { + chart.setTitle(name); + } + + public void setDataSet (AltosUIDataSet dataSet) { + this.dataSet = dataSet; + if (dataSet != null) + setName(dataSet.name()); + resetData(); + } + + public AltosUIGraph(AltosUIEnable enable) { + + this.enable = enable; + this.series = new ArrayList(); + + xAxis = new NumberAxis("Time (s)"); + + xAxis.setAutoRangeIncludesZero(true); + + plot = new XYPlot(); + plot.setDomainAxis(xAxis); + plot.setOrientation(PlotOrientation.VERTICAL); + plot.setDomainPannable(true); + plot.setRangePannable(true); + + chart = new JFreeChart("Flight", JFreeChart.DEFAULT_TITLE_FONT, + plot, true); + + ChartUtilities.applyCurrentTheme(chart); + + plot.setDomainGridlinePaint(gridline_color); + plot.setRangeGridlinePaint(gridline_color); + plot.setBackgroundPaint(background_color); + plot.setBackgroundAlpha((float) 1); + + chart.setBackgroundPaint(background_color); + chart.setBorderPaint(border_color); + panel = new ChartPanel(chart); + panel.setMouseWheelEnabled(true); + panel.setPreferredSize(new java.awt.Dimension(800, 500)); + + AltosPreferences.register_units_listener(this); + } +} \ No newline at end of file diff --git a/altosuilib/AltosUISeries.java b/altosuilib/AltosUISeries.java new file mode 100644 index 00000000..fe2c982b --- /dev/null +++ b/altosuilib/AltosUISeries.java @@ -0,0 +1,86 @@ +/* + * Copyright © 2013 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.altosuilib_1; + +import java.io.*; +import java.util.ArrayList; + +import java.awt.*; +import javax.swing.*; +import org.altusmetrum.altoslib_1.*; + +import org.jfree.ui.*; +import org.jfree.chart.*; +import org.jfree.chart.plot.*; +import org.jfree.chart.axis.*; +import org.jfree.chart.renderer.*; +import org.jfree.chart.renderer.xy.*; +import org.jfree.chart.labels.*; +import org.jfree.data.xy.*; +import org.jfree.data.*; + +public class AltosUISeries extends XYSeries { + NumberAxis axis; + String label; + AltosUnits units; + Color color; + XYItemRenderer renderer; + int fetch; + + void set_units() { + String units_string = units.show_units(); + axis.setLabel(String.format("%s (%s)", label, units_string)); + + StandardXYToolTipGenerator ttg; + + String example = units.graph_format(4); + + ttg = new StandardXYToolTipGenerator(String.format("{1}s: {2}%s ({0})", units_string), + new java.text.DecimalFormat(example), + new java.text.DecimalFormat(example)); + renderer.setBaseToolTipGenerator(ttg); + } + + void set_enable(boolean enable) { + renderer.setSeriesVisible(0, enable); + axis.setVisible(enable); + } + + public void add(AltosUIDataPoint dataPoint) { + super.add(dataPoint.x(), dataPoint.y(fetch)); + } + + public void set_axis(NumberAxis axis) { + this.axis = axis; + } + + public AltosUISeries (String label, int fetch, AltosUnits units, Color color) { + super(label); + this.label = label; + this.fetch = fetch; + this.units = units; + this.color = color; + + axis = new NumberAxis(); + axis.setLabelPaint(color); + axis.setTickLabelPaint(color); + + renderer = new XYLineAndShapeRenderer(true, false); + renderer.setSeriesPaint(0, color); + } +} diff --git a/altosuilib/Makefile.am b/altosuilib/Makefile.am index 25d5722e..e338b7cd 100644 --- a/altosuilib/Makefile.am +++ b/altosuilib/Makefile.am @@ -9,20 +9,24 @@ SRC=. altosuilibdir = $(datadir)/java altosuilib_JAVA = \ - AltosUIConfigure.java \ AltosDevice.java \ AltosDeviceDialog.java \ - AltosUSBDevice.java \ AltosFontListener.java \ AltosPositionListener.java \ + AltosUIConfigure.java \ + AltosUIDataPoint.java \ + AltosUIDataSet.java \ + AltosUIGraph.java \ AltosUIDialog.java \ + AltosUIEnable.java \ AltosUIFrame.java \ AltosUILib.java \ AltosUIListener.java \ AltosUIPreferencesBackend.java \ AltosUIPreferences.java \ + AltosUISeries.java \ AltosUIVersion.java \ - AltosUnitsListener.java + AltosUSBDevice.java JAR=altosuilib_$(ALTOSUILIB_VERSION).jar