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.SerialPortComboBox;
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.DataUpdateHandlerManagerImpl;
import enginuity.logger.ecu.ui.handler.DataUpdateHandlerThreadWrapper;
import enginuity.logger.ecu.ui.handler.dash.DashboardUpdateHandler;
import enginuity.logger.ecu.ui.handler.file.FileUpdateHandlerImpl;
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 JTabbedPane tabbedPane;
private SerialPortComboBox portsComboBox;
private DataUpdateHandlerManager dataUpdateHandlerManager;
private DataUpdateHandlerManager dataHandlerManager;
private DataRegistrationBroker dataTabBroker;
private ParameterListTableModel dataTabParamListTableModel;
@ -199,8 +196,15 @@ public final class EcuLogger extends JFrame implements WindowListener, PropertyC
}
}
};
dataUpdateHandlerManager = new DataUpdateHandlerManagerImpl();
controller = new LoggerControllerImpl(settings, ecuInitCallback, this, dataUpdateHandlerManager);
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);
controller = new LoggerControllerImpl(settings, ecuInitCallback, this, liveDataUpdateHandler,
graphUpdateHandler, dashboardUpdateHandler, fileUpdateHandler, TableUpdateHandler.getInstance());
messageLabel = new JLabel(ENGINUITY_ECU_LOGGER_TITLE);
ecuIdLabel = new JLabel(buildEcuIdLabelText());
statsLabel = buildStatsLabel();
@ -221,13 +225,6 @@ public final class EcuLogger extends JFrame implements WindowListener, PropertyC
dashboardTabParamListTableModel = new ParameterListTableModel(dashboardTabBroker, HEADING_PARAMETERS);
dashboardTabSwitchListTableModel = new ParameterListTableModel(dashboardTabBroker, HEADING_SWITCHES);
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() {
@ -264,7 +261,8 @@ public final class EcuLogger extends JFrame implements WindowListener, PropertyC
private void loadLoggerConfig() {
try {
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();
addConvertorUpdateListeners(ecuParams);
loadEcuParams(ecuParams);
@ -482,26 +480,15 @@ public final class EcuLogger extends JFrame implements WindowListener, PropertyC
}
private void initDataUpdateHandlers() {
DataUpdateHandler threadedFileUpdateHandler = startHandlerInThread(fileUpdateHandler);
dataHandlerManager.addHandler(startHandlerInThread(liveDataUpdateHandler));
dataHandlerManager.addHandler(threadedFileUpdateHandler);
dataHandlerManager.addHandler(startHandlerInThread(TableUpdateHandler.getInstance()));
graphHandlerManager.addHandler(startHandlerInThread(graphUpdateHandler));
graphHandlerManager.addHandler(threadedFileUpdateHandler);
dashboardHandlerManager.addHandler(startHandlerInThread(dashboardUpdateHandler));
dashboardHandlerManager.addHandler(threadedFileUpdateHandler);
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;
dataHandlerManager.addHandler(liveDataUpdateHandler);
dataHandlerManager.addHandler(fileUpdateHandler);
dataHandlerManager.addHandler(TableUpdateHandler.getInstance());
graphHandlerManager.addHandler(graphUpdateHandler);
graphHandlerManager.addHandler(fileUpdateHandler);
graphHandlerManager.addHandler(TableUpdateHandler.getInstance());
dashboardHandlerManager.addHandler(dashboardUpdateHandler);
dashboardHandlerManager.addHandler(fileUpdateHandler);
dashboardHandlerManager.addHandler(TableUpdateHandler.getInstance());
}
private JComponent buildTabbedPane() {
@ -786,7 +773,9 @@ public final class EcuLogger extends JFrame implements WindowListener, PropertyC
}
private void cleanUpUpdateHandlers() {
dataUpdateHandlerManager.cleanUp();
dataHandlerManager.cleanUp();
graphHandlerManager.cleanUp();
dashboardHandlerManager.cleanUp();
}
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.ui.MessageListener;
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;
public final class LoggerControllerImpl implements LoggerController {
private final QueryManager queryManager;
public LoggerControllerImpl(Settings settings, EcuInitCallback ecuInitCallback, MessageListener messageListener,
DataUpdateHandlerManager dataUpdateHandlerManager) {
checkNotNull(settings, ecuInitCallback, messageListener, dataUpdateHandlerManager);
queryManager = new QueryManagerImpl(settings, ecuInitCallback, messageListener, dataUpdateHandlerManager);
DataUpdateHandler... dataUpdateHandlers) {
checkNotNull(settings, ecuInitCallback, messageListener, dataUpdateHandlers);
queryManager = new QueryManagerImpl(settings, ecuInitCallback, messageListener, dataUpdateHandlers);
}
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.ui.MessageListener;
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.ParamChecker.checkNotNull;
import static enginuity.util.ThreadUtil.runAsDaemon;
import static enginuity.util.ThreadUtil.sleep;
import javax.swing.SwingUtilities;
@ -65,19 +66,19 @@ public final class QueryManagerImpl implements QueryManager {
private final Settings settings;
private final EcuInitCallback ecuInitCallback;
private final MessageListener messageListener;
private final DataUpdateHandlerManager dataUpdateHandlerManager;
private final DataUpdateHandler[] dataUpdateHandlers;
private EcuQuery fileLoggerQuery;
private Thread queryManagerThread;
private boolean started;
private boolean stop;
public QueryManagerImpl(Settings settings, EcuInitCallback ecuInitCallback, MessageListener messageListener,
DataUpdateHandlerManager dataUpdateHandlerManager) {
checkNotNull(settings, ecuInitCallback, messageListener, dataUpdateHandlerManager);
DataUpdateHandler... dataUpdateHandlers) {
checkNotNull(settings, ecuInitCallback, messageListener, dataUpdateHandlers);
this.settings = settings;
this.ecuInitCallback = ecuInitCallback;
this.messageListener = messageListener;
this.dataUpdateHandlerManager = dataUpdateHandlerManager;
this.dataUpdateHandlers = dataUpdateHandlers;
}
public synchronized void addListener(StatusChangeListener listener) {
@ -173,17 +174,9 @@ public final class QueryManagerImpl implements QueryManager {
messageListener.reportMessage("Select parameters to be logged...");
sleep(1000L);
} else {
List<EcuQuery> ecuQueries = filterEcuQueries(queryMap.values());
if (fileLoggerQuery != null) {
ecuQueries.add(fileLoggerQuery);
}
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()));
sendEcuQueries(txManager);
sendExternalQueries();
handleQueryResponse();
count++;
messageListener.reportMessage("Querying ECU...");
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) {
Response response = new ResponseImpl();
for (Query query : queries) {

View File

@ -21,8 +21,18 @@
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 registerData(LoggerData loggerData);
void deregisterData(LoggerData loggerData);
void cleanUp();
void reset();
}

View File

@ -21,7 +21,6 @@
package enginuity.logger.ecu.ui.handler;
import enginuity.logger.ecu.comms.query.Response;
import enginuity.logger.ecu.definition.LoggerData;
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) {
for (DataUpdateHandler handler : handlers) {
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();
}
}