simplified data handling

git-svn-id: http://svn.3splooges.com/romraider-arch/trunk@622 d2e2e1cd-ba16-0410-be16-b7c4453c7c2d
This commit is contained in:
kascade 2007-04-18 05:28:17 +00:00
parent 11b3d8995c
commit de4d74ef35
7 changed files with 83 additions and 143 deletions

View File

@ -47,10 +47,8 @@ import enginuity.logger.ecu.ui.EcuDataComparator;
import enginuity.logger.ecu.ui.MessageListener; import enginuity.logger.ecu.ui.MessageListener;
import enginuity.logger.ecu.ui.SerialPortComboBox; import enginuity.logger.ecu.ui.SerialPortComboBox;
import enginuity.logger.ecu.ui.StatusIndicator; import enginuity.logger.ecu.ui.StatusIndicator;
import enginuity.logger.ecu.ui.handler.DataUpdateHandler;
import enginuity.logger.ecu.ui.handler.DataUpdateHandlerManager; import enginuity.logger.ecu.ui.handler.DataUpdateHandlerManager;
import enginuity.logger.ecu.ui.handler.DataUpdateHandlerManagerImpl; import enginuity.logger.ecu.ui.handler.DataUpdateHandlerManagerImpl;
import enginuity.logger.ecu.ui.handler.DataUpdateHandlerThreadWrapper;
import enginuity.logger.ecu.ui.handler.dash.DashboardUpdateHandler; import enginuity.logger.ecu.ui.handler.dash.DashboardUpdateHandler;
import enginuity.logger.ecu.ui.handler.file.FileUpdateHandlerImpl; import enginuity.logger.ecu.ui.handler.file.FileUpdateHandlerImpl;
import enginuity.logger.ecu.ui.handler.graph.GraphUpdateHandler; import enginuity.logger.ecu.ui.handler.graph.GraphUpdateHandler;
@ -141,7 +139,6 @@ public final class EcuLogger extends JFrame implements WindowListener, PropertyC
private JLabel statsLabel; private JLabel statsLabel;
private JTabbedPane tabbedPane; private JTabbedPane tabbedPane;
private SerialPortComboBox portsComboBox; private SerialPortComboBox portsComboBox;
private DataUpdateHandlerManager dataUpdateHandlerManager;
private DataUpdateHandlerManager dataHandlerManager; private DataUpdateHandlerManager dataHandlerManager;
private DataRegistrationBroker dataTabBroker; private DataRegistrationBroker dataTabBroker;
private ParameterListTableModel dataTabParamListTableModel; private ParameterListTableModel dataTabParamListTableModel;
@ -199,8 +196,15 @@ public final class EcuLogger extends JFrame implements WindowListener, PropertyC
} }
} }
}; };
dataUpdateHandlerManager = new DataUpdateHandlerManagerImpl(); fileUpdateHandler = new FileUpdateHandlerImpl(settings, this);
controller = new LoggerControllerImpl(settings, ecuInitCallback, this, dataUpdateHandlerManager); dataTableModel = new LiveDataTableModel();
liveDataUpdateHandler = new LiveDataUpdateHandler(dataTableModel);
graphPanel = new JPanel(new BorderLayout(2, 2));
graphUpdateHandler = new GraphUpdateHandler(graphPanel);
dashboardPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 3, 3));
dashboardUpdateHandler = new DashboardUpdateHandler(dashboardPanel);
controller = new LoggerControllerImpl(settings, ecuInitCallback, this, liveDataUpdateHandler,
graphUpdateHandler, dashboardUpdateHandler, fileUpdateHandler, TableUpdateHandler.getInstance());
messageLabel = new JLabel(ENGINUITY_ECU_LOGGER_TITLE); messageLabel = new JLabel(ENGINUITY_ECU_LOGGER_TITLE);
ecuIdLabel = new JLabel(buildEcuIdLabelText()); ecuIdLabel = new JLabel(buildEcuIdLabelText());
statsLabel = buildStatsLabel(); statsLabel = buildStatsLabel();
@ -221,13 +225,6 @@ public final class EcuLogger extends JFrame implements WindowListener, PropertyC
dashboardTabParamListTableModel = new ParameterListTableModel(dashboardTabBroker, HEADING_PARAMETERS); dashboardTabParamListTableModel = new ParameterListTableModel(dashboardTabBroker, HEADING_PARAMETERS);
dashboardTabSwitchListTableModel = new ParameterListTableModel(dashboardTabBroker, HEADING_SWITCHES); dashboardTabSwitchListTableModel = new ParameterListTableModel(dashboardTabBroker, HEADING_SWITCHES);
dashboardTabExternalListTableModel = new ParameterListTableModel(dashboardTabBroker, HEADING_EXTERNAL); dashboardTabExternalListTableModel = new ParameterListTableModel(dashboardTabBroker, HEADING_EXTERNAL);
fileUpdateHandler = new FileUpdateHandlerImpl(settings, this);
dataTableModel = new LiveDataTableModel();
liveDataUpdateHandler = new LiveDataUpdateHandler(dataTableModel);
graphPanel = new JPanel(new BorderLayout(2, 2));
graphUpdateHandler = new GraphUpdateHandler(graphPanel);
dashboardPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 3, 3));
dashboardUpdateHandler = new DashboardUpdateHandler(dashboardPanel);
} }
private void initControllerListeners() { private void initControllerListeners() {
@ -264,7 +261,8 @@ public final class EcuLogger extends JFrame implements WindowListener, PropertyC
private void loadLoggerConfig() { private void loadLoggerConfig() {
try { try {
EcuDataLoader dataLoader = new EcuDataLoaderImpl(); EcuDataLoader dataLoader = new EcuDataLoaderImpl();
dataLoader.loadFromXml(settings.getLoggerConfigFilePath(), settings.getLoggerProtocol(), settings.getFileLoggingControllerSwitchId(), ecuInit); dataLoader.loadFromXml(settings.getLoggerConfigFilePath(), settings.getLoggerProtocol(),
settings.getFileLoggingControllerSwitchId(), ecuInit);
List<EcuParameter> ecuParams = dataLoader.getEcuParameters(); List<EcuParameter> ecuParams = dataLoader.getEcuParameters();
addConvertorUpdateListeners(ecuParams); addConvertorUpdateListeners(ecuParams);
loadEcuParams(ecuParams); loadEcuParams(ecuParams);
@ -482,26 +480,15 @@ public final class EcuLogger extends JFrame implements WindowListener, PropertyC
} }
private void initDataUpdateHandlers() { private void initDataUpdateHandlers() {
DataUpdateHandler threadedFileUpdateHandler = startHandlerInThread(fileUpdateHandler); dataHandlerManager.addHandler(liveDataUpdateHandler);
dataHandlerManager.addHandler(startHandlerInThread(liveDataUpdateHandler)); dataHandlerManager.addHandler(fileUpdateHandler);
dataHandlerManager.addHandler(threadedFileUpdateHandler); dataHandlerManager.addHandler(TableUpdateHandler.getInstance());
dataHandlerManager.addHandler(startHandlerInThread(TableUpdateHandler.getInstance())); graphHandlerManager.addHandler(graphUpdateHandler);
graphHandlerManager.addHandler(startHandlerInThread(graphUpdateHandler)); graphHandlerManager.addHandler(fileUpdateHandler);
graphHandlerManager.addHandler(threadedFileUpdateHandler); graphHandlerManager.addHandler(TableUpdateHandler.getInstance());
dashboardHandlerManager.addHandler(startHandlerInThread(dashboardUpdateHandler)); dashboardHandlerManager.addHandler(dashboardUpdateHandler);
dashboardHandlerManager.addHandler(threadedFileUpdateHandler); dashboardHandlerManager.addHandler(fileUpdateHandler);
dashboardHandlerManager.addHandler(TableUpdateHandler.getInstance());
dataUpdateHandlerManager.addHandler(dataHandlerManager);
dataUpdateHandlerManager.addHandler(graphHandlerManager);
dataUpdateHandlerManager.addHandler(dashboardHandlerManager);
}
private DataUpdateHandler startHandlerInThread(DataUpdateHandler handler) {
DataUpdateHandlerThreadWrapper runnableHandler = new DataUpdateHandlerThreadWrapper(handler);
Thread thread = new Thread(runnableHandler);
thread.setDaemon(true);
thread.start();
return runnableHandler;
} }
private JComponent buildTabbedPane() { private JComponent buildTabbedPane() {
@ -786,7 +773,9 @@ public final class EcuLogger extends JFrame implements WindowListener, PropertyC
} }
private void cleanUpUpdateHandlers() { private void cleanUpUpdateHandlers() {
dataUpdateHandlerManager.cleanUp(); dataHandlerManager.cleanUp();
graphHandlerManager.cleanUp();
dashboardHandlerManager.cleanUp();
} }
public Settings getSettings() { public Settings getSettings() {

View File

@ -29,16 +29,16 @@ import enginuity.logger.ecu.definition.EcuSwitch;
import enginuity.logger.ecu.definition.LoggerData; import enginuity.logger.ecu.definition.LoggerData;
import enginuity.logger.ecu.ui.MessageListener; import enginuity.logger.ecu.ui.MessageListener;
import enginuity.logger.ecu.ui.StatusChangeListener; import enginuity.logger.ecu.ui.StatusChangeListener;
import enginuity.logger.ecu.ui.handler.DataUpdateHandlerManager; import enginuity.logger.ecu.ui.handler.DataUpdateHandler;
import static enginuity.util.ParamChecker.checkNotNull; import static enginuity.util.ParamChecker.checkNotNull;
public final class LoggerControllerImpl implements LoggerController { public final class LoggerControllerImpl implements LoggerController {
private final QueryManager queryManager; private final QueryManager queryManager;
public LoggerControllerImpl(Settings settings, EcuInitCallback ecuInitCallback, MessageListener messageListener, public LoggerControllerImpl(Settings settings, EcuInitCallback ecuInitCallback, MessageListener messageListener,
DataUpdateHandlerManager dataUpdateHandlerManager) { DataUpdateHandler... dataUpdateHandlers) {
checkNotNull(settings, ecuInitCallback, messageListener, dataUpdateHandlerManager); checkNotNull(settings, ecuInitCallback, messageListener, dataUpdateHandlers);
queryManager = new QueryManagerImpl(settings, ecuInitCallback, messageListener, dataUpdateHandlerManager); queryManager = new QueryManagerImpl(settings, ecuInitCallback, messageListener, dataUpdateHandlers);
} }
public synchronized void addListener(StatusChangeListener listener) { public synchronized void addListener(StatusChangeListener listener) {

View File

@ -41,9 +41,10 @@ import enginuity.logger.ecu.definition.ExternalData;
import enginuity.logger.ecu.definition.LoggerData; import enginuity.logger.ecu.definition.LoggerData;
import enginuity.logger.ecu.ui.MessageListener; import enginuity.logger.ecu.ui.MessageListener;
import enginuity.logger.ecu.ui.StatusChangeListener; import enginuity.logger.ecu.ui.StatusChangeListener;
import enginuity.logger.ecu.ui.handler.DataUpdateHandlerManager; import enginuity.logger.ecu.ui.handler.DataUpdateHandler;
import static enginuity.util.HexUtil.asHex; import static enginuity.util.HexUtil.asHex;
import static enginuity.util.ParamChecker.checkNotNull; import static enginuity.util.ParamChecker.checkNotNull;
import static enginuity.util.ThreadUtil.runAsDaemon;
import static enginuity.util.ThreadUtil.sleep; import static enginuity.util.ThreadUtil.sleep;
import javax.swing.SwingUtilities; import javax.swing.SwingUtilities;
@ -65,19 +66,19 @@ public final class QueryManagerImpl implements QueryManager {
private final Settings settings; private final Settings settings;
private final EcuInitCallback ecuInitCallback; private final EcuInitCallback ecuInitCallback;
private final MessageListener messageListener; private final MessageListener messageListener;
private final DataUpdateHandlerManager dataUpdateHandlerManager; private final DataUpdateHandler[] dataUpdateHandlers;
private EcuQuery fileLoggerQuery; private EcuQuery fileLoggerQuery;
private Thread queryManagerThread; private Thread queryManagerThread;
private boolean started; private boolean started;
private boolean stop; private boolean stop;
public QueryManagerImpl(Settings settings, EcuInitCallback ecuInitCallback, MessageListener messageListener, public QueryManagerImpl(Settings settings, EcuInitCallback ecuInitCallback, MessageListener messageListener,
DataUpdateHandlerManager dataUpdateHandlerManager) { DataUpdateHandler... dataUpdateHandlers) {
checkNotNull(settings, ecuInitCallback, messageListener, dataUpdateHandlerManager); checkNotNull(settings, ecuInitCallback, messageListener, dataUpdateHandlers);
this.settings = settings; this.settings = settings;
this.ecuInitCallback = ecuInitCallback; this.ecuInitCallback = ecuInitCallback;
this.messageListener = messageListener; this.messageListener = messageListener;
this.dataUpdateHandlerManager = dataUpdateHandlerManager; this.dataUpdateHandlers = dataUpdateHandlers;
} }
public synchronized void addListener(StatusChangeListener listener) { public synchronized void addListener(StatusChangeListener listener) {
@ -173,17 +174,9 @@ public final class QueryManagerImpl implements QueryManager {
messageListener.reportMessage("Select parameters to be logged..."); messageListener.reportMessage("Select parameters to be logged...");
sleep(1000L); sleep(1000L);
} else { } else {
List<EcuQuery> ecuQueries = filterEcuQueries(queryMap.values()); sendEcuQueries(txManager);
if (fileLoggerQuery != null) { sendExternalQueries();
ecuQueries.add(fileLoggerQuery); handleQueryResponse();
}
txManager.sendQueries(ecuQueries);
List<ExternalQuery> externalQueries = filterExternalQueries(queryMap.values());
for (ExternalQuery externalQuery : externalQueries) {
//FIXME: This is a hack!!
externalQuery.setResponse(externalQuery.getLoggerData().getSelectedConvertor().convert(null));
}
dataUpdateHandlerManager.handleDataUpdate(buildResponse(queryMap.values()));
count++; count++;
messageListener.reportMessage("Querying ECU..."); messageListener.reportMessage("Querying ECU...");
messageListener.reportStats(buildStatsMessage(start, count)); messageListener.reportStats(buildStatsMessage(start, count));
@ -196,6 +189,32 @@ public final class QueryManagerImpl implements QueryManager {
} }
} }
private void sendEcuQueries(TransmissionManager txManager) {
List<EcuQuery> ecuQueries = filterEcuQueries(queryMap.values());
if (fileLoggerQuery != null) {
ecuQueries.add(fileLoggerQuery);
}
txManager.sendQueries(ecuQueries);
}
private void sendExternalQueries() {
List<ExternalQuery> externalQueries = filterExternalQueries(queryMap.values());
for (ExternalQuery externalQuery : externalQueries) {
//FIXME: This is a hack!!
externalQuery.setResponse(externalQuery.getLoggerData().getSelectedConvertor().convert(null));
}
}
private void handleQueryResponse() {
for (final DataUpdateHandler dataUpdateHandler : dataUpdateHandlers) {
runAsDaemon(new Runnable() {
public void run() {
dataUpdateHandler.handleDataUpdate(buildResponse(queryMap.values()));
}
});
}
}
private Response buildResponse(Collection<Query> queries) { private Response buildResponse(Collection<Query> queries) {
Response response = new ResponseImpl(); Response response = new ResponseImpl();
for (Query query : queries) { for (Query query : queries) {

View File

@ -21,8 +21,18 @@
package enginuity.logger.ecu.ui.handler; package enginuity.logger.ecu.ui.handler;
public interface DataUpdateHandlerManager extends DataUpdateHandler { import enginuity.logger.ecu.definition.LoggerData;
public interface DataUpdateHandlerManager {
void addHandler(DataUpdateHandler handler); void addHandler(DataUpdateHandler handler);
void registerData(LoggerData loggerData);
void deregisterData(LoggerData loggerData);
void cleanUp();
void reset();
} }

View File

@ -21,7 +21,6 @@
package enginuity.logger.ecu.ui.handler; package enginuity.logger.ecu.ui.handler;
import enginuity.logger.ecu.comms.query.Response;
import enginuity.logger.ecu.definition.LoggerData; import enginuity.logger.ecu.definition.LoggerData;
import java.util.ArrayList; import java.util.ArrayList;
@ -40,12 +39,6 @@ public final class DataUpdateHandlerManagerImpl implements DataUpdateHandlerMana
} }
} }
public synchronized void handleDataUpdate(Response response) {
for (DataUpdateHandler handler : handlers) {
handler.handleDataUpdate(response);
}
}
public synchronized void deregisterData(LoggerData loggerData) { public synchronized void deregisterData(LoggerData loggerData) {
for (DataUpdateHandler handler : handlers) { for (DataUpdateHandler handler : handlers) {
handler.deregisterData(loggerData); handler.deregisterData(loggerData);

View File

@ -1,81 +0,0 @@
/*
*
* Enginuity Open-Source Tuning, Logging and Reflashing
* Copyright (C) 2006 Enginuity.org
*
* 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; 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
* 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.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
*/
package enginuity.logger.ecu.ui.handler;
import enginuity.logger.ecu.comms.query.Response;
import enginuity.logger.ecu.definition.LoggerData;
import static enginuity.util.ThreadUtil.sleep;
import java.util.ArrayList;
import static java.util.Collections.synchronizedList;
import java.util.List;
public final class DataUpdateHandlerThreadWrapper implements DataUpdateHandler, Runnable {
private final List<Response> updateList = synchronizedList(new ArrayList<Response>());
private final List<Response> workingList = synchronizedList(new ArrayList<Response>());
private final DataUpdateHandler wrappee;
private boolean stop = false;
public DataUpdateHandlerThreadWrapper(DataUpdateHandler wrappee) {
this.wrappee = wrappee;
}
public void registerData(LoggerData loggerData) {
wrappee.registerData(loggerData);
}
public synchronized void handleDataUpdate(Response response) {
updateList.add(response);
}
public void deregisterData(LoggerData loggerData) {
wrappee.deregisterData(loggerData);
}
public void cleanUp() {
stop = true;
wrappee.cleanUp();
}
public void reset() {
wrappee.reset();
}
public void run() {
while (!stop) {
updateWorkingList();
for (final Response response : workingList) {
wrappee.handleDataUpdate(response);
}
sleep(3);
}
}
private synchronized void updateWorkingList() {
workingList.clear();
for (Response response : updateList) {
workingList.add(response);
}
updateList.clear();
}
}

View File

@ -36,4 +36,14 @@ public final class ThreadUtil {
} }
} }
public static void run(Runnable runnable) {
new Thread(runnable).start();
}
public static void runAsDaemon(Runnable runnable) {
Thread thread = new Thread(runnable);
thread.setDaemon(true);
thread.start();
}
} }