RomRaider/src/main/java/com/romraider/logger/ecu/profile/UserProfileImpl.java

174 lines
7.4 KiB
Java

/*
* RomRaider Open-Source Tuning, Logging and Reflashing
* Copyright (C) 2006-2019 RomRaider.com
*
* 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 com.romraider.logger.ecu.profile;
import com.romraider.Settings;
import com.romraider.logger.ecu.definition.EcuDataConvertor;
import com.romraider.logger.ecu.definition.EcuParameter;
import com.romraider.logger.ecu.definition.EcuSwitch;
import com.romraider.logger.ecu.definition.ExternalData;
import com.romraider.logger.ecu.definition.LoggerData;
import com.romraider.logger.ecu.exception.ConfigurationException;
import com.romraider.util.ResourceUtil;
import com.romraider.util.SettingsManager;
import static com.romraider.util.ParamChecker.checkNotNull;
import static com.romraider.util.ParamChecker.isNullOrEmpty;
import java.io.UnsupportedEncodingException;
import java.text.MessageFormat;
import java.util.Map;
import java.util.ResourceBundle;
public final class UserProfileImpl implements UserProfile {
private static final String NEW_LINE = System.getProperty("line.separator");
private static final ResourceBundle rb = new ResourceUtil().getBundle(
UserProfileImpl.class.getName());
private final Map<String, UserProfileItem> params;
private final Map<String, UserProfileItem> switches;
private final Map<String, UserProfileItem> external;
private final String protocol;
public UserProfileImpl(
Map<String, UserProfileItem> params,
Map<String, UserProfileItem> switches,
Map<String, UserProfileItem> external,
String protocol) {
checkNotNull(params, "params");
checkNotNull(switches, "switches");
checkNotNull(external, "external");
this.params = params;
this.switches = switches;
this.external = external;
this.protocol = protocol;
}
public boolean contains(LoggerData loggerData) {
checkNotNull(loggerData, "loggerData");
return getMap(loggerData).keySet().contains(loggerData.getId());
}
public boolean isSelectedOnLiveDataTab(LoggerData loggerData) {
checkNotNull(loggerData, "loggerData");
return contains(loggerData) && getUserProfileItem(loggerData).isLiveDataSelected();
}
public boolean isSelectedOnGraphTab(LoggerData loggerData) {
checkNotNull(loggerData, "loggerData");
return contains(loggerData) && getUserProfileItem(loggerData).isGraphSelected();
}
public boolean isSelectedOnDashTab(LoggerData loggerData) {
checkNotNull(loggerData, "loggerData");
return contains(loggerData) && getUserProfileItem(loggerData).isDashSelected();
}
public EcuDataConvertor getSelectedConvertor(LoggerData loggerData) {
checkNotNull(loggerData, "loggerData");
if (contains(loggerData)) {
String defaultUnits = getUserProfileItem(loggerData).getUnits();
if (defaultUnits != null && loggerData.getConvertors().length > 1) {
for (EcuDataConvertor convertor : loggerData.getConvertors()) {
if (defaultUnits.equals(convertor.getUnits())) return convertor;
}
throw new ConfigurationException(MessageFormat.format(
rb.getString("UNKNDEFAULT"),
defaultUnits,
loggerData.getId(),
loggerData.getName()));
}
}
return loggerData.getSelectedConvertor();
}
public byte[] getBytes() {
byte[] profile = null;
try {
profile = buildXml().getBytes("ISO-8859-1");
}
catch (UnsupportedEncodingException e) {
throw new UnsupportedOperationException(MessageFormat.format(
rb.getString("UNSUPPORTEDENCODE"),
e.getMessage()));
}
return profile;
}
@Override
public String getProtocol() {
return protocol;
}
private String buildXml() {
final Settings settings = SettingsManager.getSettings();
StringBuilder builder = new StringBuilder();
builder.append("<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>").append(NEW_LINE);
//builder.append("<!DOCTYPE profile SYSTEM \"profile.dtd\">").append(NEW_LINE).append(NEW_LINE);
builder.append("<profile protocol=\"").append(settings.getLoggerProtocol().toUpperCase()).append("\">").append(NEW_LINE);
if (!params.isEmpty()) {
builder.append(" <parameters>").append(NEW_LINE);
appendLoggerDataElements(builder, "parameter", params, true);
builder.append(" </parameters>").append(NEW_LINE);
}
if (!switches.isEmpty()) {
builder.append(" <switches>").append(NEW_LINE);
appendLoggerDataElements(builder, "switch", switches, false);
builder.append(" </switches>").append(NEW_LINE);
}
if (!external.isEmpty()) {
builder.append(" <externals>").append(NEW_LINE);
// Comment out the next line to disable Externals from being saved
// as there seems to be a bug when a profile is reloaded, the
// Logger tries to connect twice causing one or both to fail.
appendLoggerDataElements(builder, "external", external, true);
builder.append(" </externals>").append(NEW_LINE);
}
builder.append("</profile>").append(NEW_LINE);
return builder.toString();
}
private void appendLoggerDataElements(StringBuilder builder, String dataType, Map<String, UserProfileItem> dataMap, boolean showUnits) {
for (String id : dataMap.keySet()) {
UserProfileItem item = dataMap.get(id);
builder.append(" <").append(dataType).append(" id=\"").append(id).append("\"");
if (item.isLiveDataSelected()) builder.append(" livedata=\"selected\"");
if (item.isGraphSelected()) builder.append(" graph=\"selected\"");
if (item.isDashSelected()) builder.append(" dash=\"selected\"");
if (showUnits && !isNullOrEmpty(item.getUnits()))
builder.append(" units=\"").append(item.getUnits()).append("\"");
builder.append("/>").append(NEW_LINE);
}
}
private UserProfileItem getUserProfileItem(LoggerData loggerData) {
return getMap(loggerData).get(loggerData.getId());
}
private Map<String, UserProfileItem> getMap(LoggerData loggerData) {
if (loggerData instanceof EcuParameter) return params;
else if (loggerData instanceof EcuSwitch) return switches;
else if (loggerData instanceof ExternalData) return external;
else throw new UnsupportedOperationException(MessageFormat.format(
rb.getString("UNKNLOGGERDATA"),
loggerData.getClass()));
}
}