refactored out parameter update handlers

git-svn-id: http://svn.3splooges.com/romraider-arch/trunk@249 d2e2e1cd-ba16-0410-be16-b7c4453c7c2d
This commit is contained in:
kascade 2006-08-19 11:09:07 +00:00
parent a4aeed3fb6
commit 727a289420
10 changed files with 252 additions and 100 deletions

View File

@ -7,6 +7,12 @@ import enginuity.logger.ui.LoggerDataTableModel;
import enginuity.logger.ui.ParameterListTableModel;
import enginuity.logger.ui.ParameterRegistrationBroker;
import enginuity.logger.ui.ParameterRegistrationBrokerImpl;
import enginuity.logger.ui.handler.DashboardUpdateHandler;
import enginuity.logger.ui.handler.FileUpdateHandler;
import enginuity.logger.ui.handler.GraphUpdateHandler;
import enginuity.logger.ui.handler.LiveDataUpdateHandler;
import enginuity.logger.ui.handler.ParameterUpdateHandlerManager;
import enginuity.logger.ui.handler.ParameterUpdateHandlerManagerImpl;
import javax.swing.*;
import static javax.swing.JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED;
@ -28,28 +34,57 @@ public final class EcuLogger extends JFrame implements WindowListener, PropertyC
private final JComboBox portsComboBox = new JComboBox();
private final LoggerDataTableModel dataTableModel = new LoggerDataTableModel();
private final JPanel graphPanel = new JPanel();
private final ParameterRegistrationBroker broker = new ParameterRegistrationBrokerImpl(settings, dataTableModel, graphPanel);
private final ParameterUpdateHandlerManager handlerManager = new ParameterUpdateHandlerManagerImpl();
private final ParameterRegistrationBroker broker = new ParameterRegistrationBrokerImpl(handlerManager, settings);
private final ParameterListTableModel paramListTableModel = new ParameterListTableModel(broker);
public EcuLogger(String title) {
super(title);
//build left and right components of split pane
JComponent leftComponent = buildLeftComponent();
JComponent rightComponent = buildRightComponent();
// setup the user interface
initUserInterface();
//build split pane
JSplitPane splitPane = buildSplitPane(leftComponent, rightComponent);
splitPane.addPropertyChangeListener(this);
//add to container
getContentPane().add(splitPane);
// setup parameter update handlers
initParameterUpdateHandlers();
// load ecu params from logger config
loadEcuParamsFromConfig();
}
private void initUserInterface() {
// build left and right components of split pane
JComponent leftComponent = buildLeftComponent();
JComponent rightComponent = buildRightComponent();
// build split pane
JSplitPane splitPane = buildSplitPane(leftComponent, rightComponent);
splitPane.addPropertyChangeListener(this);
// add to container
getContentPane().add(splitPane);
}
private void loadEcuParamsFromConfig() {
//TODO: handle errors here better!
try {
EcuParameterLoaderImpl parameterLoader = new EcuParameterLoaderImpl();
List<EcuParameter> ecuParams = parameterLoader.loadFromXml(settings.getLoggerConfigFilePath(), settings.getLoggerProtocol());
for (EcuParameter ecuParam : ecuParams) {
paramListTableModel.addParam(ecuParam);
}
} catch (Exception e) {
e.printStackTrace();
}
}
private void initParameterUpdateHandlers() {
handlerManager.addHandler(new LiveDataUpdateHandler(dataTableModel));
handlerManager.addHandler(new GraphUpdateHandler(graphPanel));
handlerManager.addHandler(new DashboardUpdateHandler());
handlerManager.addHandler(new FileUpdateHandler(settings));
}
private JComponent buildLeftComponent() {
return new JScrollPane(new JTable(paramListTableModel), VERTICAL_SCROLLBAR_AS_NEEDED, HORIZONTAL_SCROLLBAR_AS_NEEDED);
}
@ -138,19 +173,6 @@ public final class EcuLogger extends JFrame implements WindowListener, PropertyC
return new JScrollPane(dashboardPanel, VERTICAL_SCROLLBAR_AS_NEEDED, HORIZONTAL_SCROLLBAR_NEVER);
}
private void loadEcuParamsFromConfig() {
//TODO: handle errors here better!
try {
EcuParameterLoaderImpl parameterLoader = new EcuParameterLoaderImpl();
List<EcuParameter> ecuParams = parameterLoader.loadFromXml(settings.getLoggerConfigFilePath(), settings.getLoggerProtocol());
for (EcuParameter ecuParam : ecuParams) {
paramListTableModel.addParam(ecuParam);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void windowOpened(WindowEvent windowEvent) {
}
@ -176,6 +198,9 @@ public final class EcuLogger extends JFrame implements WindowListener, PropertyC
public void propertyChange(PropertyChangeEvent propertyChangeEvent) {
}
//**********************************************************************
public static void main(String... args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {

View File

@ -5,70 +5,33 @@ import enginuity.logger.LoggerController;
import enginuity.logger.LoggerControllerImpl;
import enginuity.logger.definition.EcuParameter;
import enginuity.logger.query.LoggerCallback;
import static enginuity.logger.ui.SpringUtilities.makeCompactGrid;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import static org.jfree.chart.plot.PlotOrientation.VERTICAL;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
import enginuity.logger.ui.handler.ParameterUpdateHandlerManager;
import javax.swing.*;
import java.util.ArrayList;
import java.util.Collections;
import static java.util.Collections.synchronizedMap;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public final class ParameterRegistrationBrokerImpl implements ParameterRegistrationBroker {
private final LoggerController controller;
private final LoggerDataTableModel dataTableModel;
private final JPanel graphPanel;
private final Map<EcuParameter, ChartPanel> chartMap = synchronizedMap(new HashMap<EcuParameter, ChartPanel>());
private final ParameterUpdateHandlerManager handlerManager;
private final List<EcuParameter> registeredEcuParameters = Collections.synchronizedList(new ArrayList<EcuParameter>());
private int loggerCount = 0;
private long loggerStartTime = 0;
public ParameterRegistrationBrokerImpl(Settings settings, LoggerDataTableModel dataTableModel, JPanel graphPanel) {
public ParameterRegistrationBrokerImpl(ParameterUpdateHandlerManager handlerManager, Settings settings) {
this.handlerManager = handlerManager;
this.controller = new LoggerControllerImpl(settings);
this.dataTableModel = dataTableModel;
this.graphPanel = graphPanel;
}
public synchronized void registerEcuParameterForLogging(final EcuParameter ecuParam) {
if (!registeredEcuParameters.contains(ecuParam)) {
// add to datatable
dataTableModel.addParam(ecuParam);
// add to charts
final XYSeries series = new XYSeries(ecuParam.getName());
//TODO: Make chart max item count configurable via settings
series.setMaximumItemCount(1000);
final XYDataset xyDataset = new XYSeriesCollection(series);
final JFreeChart chart = ChartFactory.createXYLineChart(ecuParam.getName(), "Time (sec)", ecuParam.getName() + " (" + ecuParam.getConvertor().getUnits() + ")",
xyDataset, VERTICAL, false, true, false);
ChartPanel chartPanel = new ChartPanel(chart, false, true, true, true, true);
graphPanel.add(chartPanel);
//graphPanel.add(new ChartScrollBar(Adjustable.HORIZONTAL, chart));
chartMap.put(ecuParam, chartPanel);
makeCompactGrid(graphPanel, ++loggerCount, 1, 10, 10, 20, 20);
repaintGraphPanel(2);
// add to dashboard
// register param with handlers
handlerManager.registerParam(ecuParam);
// add logger and setup callback
controller.addLogger(ecuParam, new LoggerCallback() {
public void callback(byte[] value) {
// update data table
dataTableModel.updateParam(ecuParam, value);
// update graph
series.add((System.currentTimeMillis() - loggerStartTime) / 1000.0, ecuParam.getConvertor().convert(value));
// update dashboard
// update handlers
handlerManager.handleParamUpdate(ecuParam, value, System.currentTimeMillis() - loggerStartTime);
}
});
@ -82,16 +45,8 @@ public final class ParameterRegistrationBrokerImpl implements ParameterRegistrat
// remove logger
controller.removeLogger(ecuParam);
// remove from datatable
dataTableModel.removeParam(ecuParam);
// remove from charts
graphPanel.remove(chartMap.get(ecuParam));
chartMap.remove(ecuParam);
makeCompactGrid(graphPanel, --loggerCount, 1, 10, 10, 20, 20);
repaintGraphPanel(1);
// remove from dashboard
// deregister param from handlers
handlerManager.deregisterParam(ecuParam);
// remove from registered list
registeredEcuParameters.remove(ecuParam);
@ -113,17 +68,4 @@ public final class ParameterRegistrationBrokerImpl implements ParameterRegistrat
controller.stop();
}
private void repaintGraphPanel(int parentRepaintLevel) {
if (loggerCount < parentRepaintLevel) {
graphPanel.doLayout();
graphPanel.repaint();
} else {
if (loggerCount == 1) {
graphPanel.doLayout();
}
graphPanel.getParent().doLayout();
graphPanel.getParent().repaint();
}
}
}

View File

@ -0,0 +1,16 @@
package enginuity.logger.ui.handler;
import enginuity.logger.definition.EcuParameter;
public final class DashboardUpdateHandler implements ParameterUpdateHandler {
public void registerParam(EcuParameter ecuParam) {
}
public void handleParamUpdate(EcuParameter ecuParam, byte[] value, long timestamp) {
}
public void deregisterParam(EcuParameter ecuParam) {
}
}

View File

@ -0,0 +1,22 @@
package enginuity.logger.ui.handler;
import enginuity.logger.definition.EcuParameter;
import enginuity.Settings;
public final class FileUpdateHandler implements ParameterUpdateHandler {
private final Settings settings;
public FileUpdateHandler(Settings settings) {
this.settings = settings;
}
public void registerParam(EcuParameter ecuParam) {
}
public void handleParamUpdate(EcuParameter ecuParam, byte[] value, long timestamp) {
}
public void deregisterParam(EcuParameter ecuParam) {
}
}

View File

@ -0,0 +1,70 @@
package enginuity.logger.ui.handler;
import enginuity.logger.definition.EcuParameter;
import static enginuity.logger.ui.SpringUtilities.makeCompactGrid;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import static org.jfree.chart.plot.PlotOrientation.VERTICAL;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
import javax.swing.*;
import static java.util.Collections.synchronizedMap;
import java.util.HashMap;
import java.util.Map;
public final class GraphUpdateHandler implements ParameterUpdateHandler {
private final JPanel graphPanel;
private final Map<EcuParameter, ChartPanel> chartMap = synchronizedMap(new HashMap<EcuParameter, ChartPanel>());
private final Map<EcuParameter, XYSeries> seriesMap = synchronizedMap(new HashMap<EcuParameter, XYSeries>());
private int loggerCount = 0;
public GraphUpdateHandler(JPanel graphPanel) {
this.graphPanel = graphPanel;
}
public void registerParam(EcuParameter ecuParam) {
// add to charts
final XYSeries series = new XYSeries(ecuParam.getName());
//TODO: Make chart max item count configurable via settings
series.setMaximumItemCount(1000);
final XYDataset xyDataset = new XYSeriesCollection(series);
final JFreeChart chart = ChartFactory.createXYLineChart(ecuParam.getName(), "Time (sec)", ecuParam.getName()
+ " (" + ecuParam.getConvertor().getUnits() + ")", xyDataset, VERTICAL, false, true, false);
ChartPanel chartPanel = new ChartPanel(chart, false, true, true, true, true);
graphPanel.add(chartPanel);
seriesMap.put(ecuParam, series);
chartMap.put(ecuParam, chartPanel);
makeCompactGrid(graphPanel, ++loggerCount, 1, 10, 10, 20, 20);
repaintGraphPanel(2);
}
public void handleParamUpdate(EcuParameter ecuParam, byte[] value, long timestamp) {
// update chart
XYSeries series = seriesMap.get(ecuParam);
series.add(timestamp / 1000.0, ecuParam.getConvertor().convert(value));
}
public void deregisterParam(EcuParameter ecuParam) {
// remove from charts
graphPanel.remove(chartMap.get(ecuParam));
chartMap.remove(ecuParam);
makeCompactGrid(graphPanel, --loggerCount, 1, 10, 10, 20, 20);
repaintGraphPanel(1);
}
private void repaintGraphPanel(int parentRepaintLevel) {
if (loggerCount < parentRepaintLevel) {
graphPanel.doLayout();
graphPanel.repaint();
} else {
if (loggerCount == 1) {
graphPanel.doLayout();
}
graphPanel.getParent().doLayout();
graphPanel.getParent().repaint();
}
}
}

View File

@ -0,0 +1,28 @@
package enginuity.logger.ui.handler;
import enginuity.logger.definition.EcuParameter;
import enginuity.logger.ui.LoggerDataTableModel;
public final class LiveDataUpdateHandler implements ParameterUpdateHandler {
private final LoggerDataTableModel dataTableModel;
public LiveDataUpdateHandler(LoggerDataTableModel dataTableModel) {
this.dataTableModel = dataTableModel;
}
public void registerParam(EcuParameter ecuParam) {
// add to datatable
dataTableModel.addParam(ecuParam);
}
public void handleParamUpdate(EcuParameter ecuParam, byte[] value, long timestamp) {
// update data table
dataTableModel.updateParam(ecuParam, value);
}
public void deregisterParam(EcuParameter ecuParam) {
// remove from datatable
dataTableModel.removeParam(ecuParam);
}
}

View File

@ -0,0 +1,13 @@
package enginuity.logger.ui.handler;
import enginuity.logger.definition.EcuParameter;
public interface ParameterUpdateHandler {
void registerParam(EcuParameter ecuParam);
void handleParamUpdate(EcuParameter ecuParam, byte[] value, long timestamp);
void deregisterParam(EcuParameter ecuParam);
}

View File

@ -0,0 +1,7 @@
package enginuity.logger.ui.handler;
public interface ParameterUpdateHandlerManager extends ParameterUpdateHandler {
void addHandler(ParameterUpdateHandler handler);
}

View File

@ -0,0 +1,32 @@
package enginuity.logger.ui.handler;
import enginuity.logger.definition.EcuParameter;
import java.util.ArrayList;
import java.util.List;
public final class ParameterUpdateHandlerManagerImpl implements ParameterUpdateHandlerManager {
private final List<ParameterUpdateHandler> handlers = new ArrayList<ParameterUpdateHandler>();
public synchronized void addHandler(ParameterUpdateHandler handler) {
handlers.add(handler);
}
public synchronized void registerParam(EcuParameter ecuParam) {
for (ParameterUpdateHandler handler : handlers) {
handler.registerParam(ecuParam);
}
}
public synchronized void handleParamUpdate(EcuParameter ecuParam, byte[] value, long timestamp) {
for (ParameterUpdateHandler handler : handlers) {
handler.handleParamUpdate(ecuParam, value, timestamp);
}
}
public synchronized void deregisterParam(EcuParameter ecuParam) {
for (ParameterUpdateHandler handler : handlers) {
handler.deregisterParam(ecuParam);
}
}
}

View File

@ -17,15 +17,8 @@ public final class ColorScaler {
float[] minColorHSB = new float[3];
float[] maxColorHSB = new float[3];
Color.RGBtoHSB(minColor.getRed(),
minColor.getGreen(),
minColor.getBlue(),
minColorHSB);
Color.RGBtoHSB(maxColor.getRed(),
maxColor.getGreen(),
maxColor.getBlue(),
maxColorHSB);
rgbToHsb(minColor, minColorHSB);
rgbToHsb(maxColor, maxColorHSB);
float h = minColorHSB[0] + (maxColorHSB[0] - minColorHSB[0]) * (float)scale;
float s = minColorHSB[1] + (maxColorHSB[1] - minColorHSB[1]) * (float)scale;
@ -34,4 +27,8 @@ public final class ColorScaler {
return Color.getHSBColor(h, s, b);
}
private static void rgbToHsb(Color color, float[] colorHSB) {
Color.RGBtoHSB(color.getRed(), color.getGreen(), color.getBlue(), colorHSB);
}
}