mirror of https://github.com/rusefi/RomRaider.git
174 lines
7.4 KiB
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()));
|
|
}
|
|
}
|