android: AndrOBD library vendored (no submodule, no git link)

This commit is contained in:
“Naeel”
2026-05-25 09:36:38 +04:00
parent 361fe8803d
commit b3b044572c
193 changed files with 61446 additions and 8 deletions
-4
View File
@@ -1,4 +0,0 @@
[submodule "android/AndrOBD"]
path = android/AndrOBD
url = https://github.com/fr3ts0n/AndrOBD.git
ignore = all
Submodule android/AndrOBD deleted from e056bbcdc6
+32
View File
@@ -0,0 +1,32 @@
// AndrOBD library module — только протокол ELM327/OBD2
// Источник: https://github.com/fr3ts0n/AndrOBD (GPLv2)
// Директория содержится как vendored код, не submodule
plugins {
id("com.android.library")
}
android {
namespace = "com.fr3ts0n.ecu.prot"
compileSdk = 34
defaultConfig {
minSdk = 24
targetSdk = 34
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
sourceSets {
getByName("main") {
java.srcDirs("com")
}
}
}
dependencies {
implementation("androidx.annotation:annotation:1.7.0")
}
@@ -0,0 +1,31 @@
package com.fr3ts0n.common;
import java.util.ResourceBundle;
/**
* Wrapper class to ensure UTF8 encoding for resource bundle reading
*
* @author fr3ts0n
*/
public class UTF8Bundle
{
private static ResourceBundle.Control ctrl = null;
public UTF8Bundle(ResourceBundle.Control control)
{
ctrl = control;
}
public static ResourceBundle getBundle(String bundleName)
{
if (ctrl != null)
{
return ResourceBundle.getBundle(bundleName, ctrl);
}
else
{
return ResourceBundle.getBundle(bundleName);
}
}
}
@@ -0,0 +1,68 @@
/*
* (C) Copyright 2015 by fr3ts0n <erwin.scheuch-heilig@gmx.at>
*
* 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., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
package com.fr3ts0n.common;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.Locale;
import java.util.PropertyResourceBundle;
import java.util.ResourceBundle;
import java.util.ResourceBundle.Control;
/**
* Utility class to load UTF8 resources into a @see ResourceBundle
*
* @author fr3ts0n - (found as snippet from stackoverflow)
*/
public class UTF8Control extends Control {
public ResourceBundle newBundle
(String baseName, Locale locale, String format, ClassLoader loader, boolean reload)
throws IOException
{
// The below is a copy of the default implementation.
String bundleName = toBundleName(baseName, locale);
String resourceName = toResourceName(bundleName, "properties");
ResourceBundle bundle = null;
InputStream stream = null;
if (reload) {
URL url = loader.getResource(resourceName);
if (url != null) {
URLConnection connection = url.openConnection();
if (connection != null) {
connection.setUseCaches(false);
stream = connection.getInputStream();
}
}
} else {
stream = loader.getResourceAsStream(resourceName);
}
if (stream != null) {
try {
// Only this line is changed to make it to read properties files as UTF-8.
bundle = new PropertyResourceBundle(new InputStreamReader(stream, "UTF-8"));
} finally {
stream.close();
}
}
return bundle;
}
}
@@ -0,0 +1,24 @@
/*
* (C) Copyright 2015 by fr3ts0n <erwin.scheuch-heilig@gmx.at>
*
* 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., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
/**
* common stuff which is valid for all packages
*
* @author fr3ts0n
*/
package com.fr3ts0n.common;
Binary file not shown.

After

Width:  |  Height:  |  Size: 538 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 491 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 710 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 551 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 745 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 605 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 554 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 732 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 821 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 267 B

@@ -0,0 +1,130 @@
/*
* (C) Copyright 2015 by fr3ts0n <erwin.scheuch-heilig@gmx.at>
*
* 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., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
package com.fr3ts0n.ecu;
import com.fr3ts0n.ecu.prot.obd.Messages;
import java.util.Map;
import java.util.TreeMap;
/**
* conversion of numeric values based on a Bitmap
*
* @author erwin
*/
public class BitmapConversion extends NumericConversion
{
/** SerialVersion UID */
private static final long serialVersionUID = -8498739122873083420L;
/* the HashMap Data */
private final TreeMap<Long,String> hashData = new TreeMap<Long,String>();
/**
* create a new hash converter which is initialized with values from map data
* The map data needs to contain Bit position and the meaning of it
*
* @param data map data for conversions
*/
@SuppressWarnings({"unchecked", "rawtypes"})
public BitmapConversion(Map data)
{
hashData.putAll(data);
}
/**
* create a new hash converter which is initialized with avlues from an array
* of strings in the format "BitPos=value"
*
* @param initData initializer strings for conversions in the format "BitPos=value[;BitPos=value[...]]"
*/
public BitmapConversion(String[] initData)
{
initFromStrings(initData);
}
/**
* initialize hash map with values from an array of strings in the format "BitPos=value"
*
* @param initData initializer strings for conversions in the format "BitPos=value[;BitPos=value[...]]"
*/
private void initFromStrings(String[] initData)
{
Long key;
String value;
String[] data;
// clear old hash data
hashData.clear();
// loop through all string entries ...
for (String anInitData : initData)
{
data = anInitData.split(";");
for (String aData : data)
{
// ... split key and value ...
String[] words = aData.split("=");
key = (long) (1 << Long.valueOf(words[0]));
value = words[1];
// attempt to translate ...
String xlatKey = value;
xlatKey = xlatKey.replaceAll("[ -]", "_").toLowerCase();
value = Messages.getString(xlatKey, value);
// debug log translated message
log.finer(String.format("%s=%s", xlatKey, value));
// ... and enter into hash map
hashData.put(key, value);
}
}
}
public Number memToPhys(long value)
{
return value;
}
public Number physToMem(Number value)
{
return value;
}
@Override
public String physToPhysFmtString(Number physVal, String format)
{
StringBuilder result = null;
long val = physVal.longValue();
for(Map.Entry<Long,String> item : hashData.entrySet())
{
// if this is NOT the first entry, then add a new line
if (result == null)
result = new StringBuilder();
else
result.append(System.lineSeparator());
// now add the result
result.append(String.format("%s %s",
((val & item.getKey()) != 0) ? "(*)" : "( )",
item.getValue()));
}
// if we haven't found a string representation, return numeric value
if (result == null) result = new StringBuilder(super.physToPhysFmtString(physVal, format));
return (result.toString());
}
}
+70
View File
@@ -0,0 +1,70 @@
/*
* (C) Copyright 2015 by fr3ts0n <erwin.scheuch-heilig@gmx.at>
*
* 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., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
package com.fr3ts0n.ecu;
import java.io.Serializable;
/**
* interface for various Data conversion types
*
* @author erwin
*/
public interface Conversion extends Serializable
{
/**
* convert measurement item from storage format to physical value
*
* @param value memory value
* @return physical value
*/
Number memToPhys(long value);
/**
* convert measurement item from storage format to physical value
*
* @param value physical value
* @return memory value
*/
Number physToMem(Number value);
/**
* convert a numerical physical value into a formatted string
*
* @param physVal physical value
* @param format formatting pattern for text display
* @return formatted String
*/
String physToPhysFmtString(Number physVal, String format);
/**
* convert measurement item from storage format to physical value
*
* @param value memory value
* @param numDecimals number of decimal for string formatting of numbers
* @return string representation of numeric value
*/
String memToString(Number value, int numDecimals);
/**
* return physical units of this conversion
*
* @return physical units of this conversion
*/
String getUnits();
}
+200
View File
@@ -0,0 +1,200 @@
/*
* (C) Copyright 2015 by fr3ts0n <erwin.scheuch-heilig@gmx.at>
*
* 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., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
package com.fr3ts0n.ecu;
import com.fr3ts0n.pvs.PvLimits;
import java.text.DecimalFormat;
/**
* Collection of all known OBD data conversions.
* This collection implements conversions to metric and imperial system
*
* @author erwin
*/
public class Conversions
{
private static final int SYSTEM_METRIC = 0;
public static final int SYSTEM_IMPERIAL = 1;
public static final int SYSTEM_TYPES = 2;
// current conversion system
private static final int cnvSystem = SYSTEM_METRIC;
/**
* ID's of Conversions
* These ID's are used as index into table below
* Please take care of the order
*/
public static final int CNV_ID_ONETOONE = 0;
public static final int CNV_ID_PERCENT = 1;
public static final int CNV_ID_PERCENT_REL = 2;
public static final int CNV_ID_PERCENT7 = 3;
public static final int CNV_ID_PERCENT7_REL = 4;
public static final int CNV_ID_RPM = 5;
public static final int CNV_ID_VEHSPEED = 6;
public static final int CNV_ID_TEMPERATURE = 7;
public static final int CNV_ID_TEMP_WIDERANGE = 8;
public static final int CNV_ID_AIRFLOW = 9;
public static final int CNV_ID_PRESS = 10;
public static final int CNV_ID_PRESS_AIR = 11;
public static final int CNV_ID_PRESS_REL = 12;
public static final int CNV_ID_PRESS_WIDERANGE = 13;
public static final int CNV_ID_PRESS_VAPOR = 14;
public static final int CNV_ID_ANGLE = 15;
public static final int CNV_ID_VOLTAGE = 16;
public static final int CNV_ID_VOLTAGE_HIGHRES = 17;
public static final int CNV_ID_RATIO = 18;
public static final int CNV_ID_RATIO_WIDERANGE = 19;
public static final int CNV_ID_DISTANCE = 20;
public static final int CNV_ID_HOURS = 21;
public static final int CNV_ID_SPEED_HIGHRES = 22;
public static final int CNV_ID_TORQUE = 23;
public static final int CNV_ID_RATIO_RELATIVE = 24;
public static final int CNV_ID_OBD_TYPE = 25;
public static final int CNV_ID_OBD_CODELIST = 26;
public static final int CNV_ID_MAX = 27;// This needs to be last entry
private static final ObdCodeList obdCodeList = new ObdCodeList();
private static final HashConversion cnvObdType = new HashConversion(new String[]{
"1=OBD II",
"2=OBD Federal EPA",
"3=OBD and OBD II",
"4=OBD I",
"5=Not OBD compliant",
"6=EOBD",
"7=EOBD and OBD II",
"8=EOBD and OBD",
"9=EOBD, OBD and OBD II",
"10=JOBD",
"11=JOBD and OBD II",
"12=JOBD and EOBD",
"13=JOBD, EOBD and OBD II"
});
/** limits for RPM display */
private static final PvLimits rpmLimits = new PvLimits(0.0f, 6000.0f);
private static final Conversion[][] cnvFactors =
{
// METRIC , IMPERIAL
// FACT, DIV, OFFS, PhOf, UNIT , FACT, DIV, OFFS, PhOf, UNIT
{new LinearConversion(1, 1, 0, 0, "-"), new LinearConversion(1, 1, 0, 0, "-")}, // OneToOne
{new LinearConversion(100, 255, 0, 0, "%"), new LinearConversion(100, 255, 0, 0, "%")}, // Percent
{new LinearConversion(100, 255, -128, 0, "%"), new LinearConversion(100, 255, -128, 0, "%")}, // Percent relative
{new LinearConversion(100, 128, 0, 0, "%"), new LinearConversion(100, 128, 0, 0, "%")}, // Percent 7Bit (Fuel Trim)
{new LinearConversion(100, 128, -128, 0, "%"), new LinearConversion(100, 128, -128, 0, "%")}, // Percent 7Bit relative)
{new LinearConversion(1, 4, 0, 0, "/min", rpmLimits), new LinearConversion(1, 4, 0, 0, "/min", rpmLimits)}, // RPM
{new LinearConversion(1, 1, 0, 0, "km/h"), new LinearConversion(1000, 1609, 0, 0, "mph")}, // vehicle speed
{new LinearConversion(1, 1, -40, 0, "°C"), new LinearConversion(9, 5, -40, 32, "°F")}, // Temperature
{new LinearConversion(1, 10, -40, 0, "°C"), new LinearConversion(9, 50, -40, 32, "°F")}, // Temperature (wide range)
{new LinearConversion(1, 100, 0, 0, "g/s"), new LinearConversion(1, 756, 0, 0, "lb/min")}, // Air Flow
{new LinearConversion(3, 1, 0, 0, "kPa"), new LinearConversion(4351, 10000, 0, 0, "PSI")}, // Pressure
{new LinearConversion(1, 1, 0, 0, "kPa"), new LinearConversion(2953, 10000, 0, 0, "inHg")}, // Pressure (intake)
{new LinearConversion(79, 1000, 0, 0, "kPa"), new LinearConversion(100, 8727, 0, 0, "PSI")}, // Pressure (relative)
{new LinearConversion(10, 1, 0, 0, "kPa"), new LinearConversion(14504, 10000, 0, 0, "PSI")}, // Pressure (wide range)
{new LinearConversion(1, 4, 0, 0, "Pa"), new LinearConversion(100, 99635, 0, 0, "in H2O")}, // Pressure (Vapor)
{new LinearConversion(1, 2, -128, 0, "°"), new LinearConversion(1, 2, -128, 0, "°")}, // Angle (Timing adv)
{new LinearConversion(1, 1000, 0, 0, "V"), new LinearConversion(1, 1000, 0, 0, "V")}, // Voltage
{new LinearConversion(10, 81967, 0, 0, "V"), new LinearConversion(10, 81967, 0, 0, "V")}, // Voltage (high resolution)
{new LinearConversion(100, 32768, 0, 0, "%"), new LinearConversion(100, 32768, 0, 0, "%")}, // Ratio
{new LinearConversion(100, 256, -32768, 0, "%"), new LinearConversion(100, 256, -32768, 0, "%")}, // Ratio (wide range)
{new LinearConversion(1, 1, 0, 0, "km"), new LinearConversion(1000, 1609, 0, 0, "miles")}, // Distance
{new LinearConversion(1, 3600, 0, 0, "h"), new LinearConversion(1, 3600, 0, 0, "h")}, // Time (hours)
{new LinearConversion(1, 128, 0, 0, "km/h"), new LinearConversion(100, 20595, 0, 0, "mph")}, // vehicle speed
{new LinearConversion(1, 1, 0, 0, "Nm"), new LinearConversion(1, 1, 0, 0, "Nm")}, // Torque
{new LinearConversion(100, 65535, 0, 0, "%"), new LinearConversion(100, 65535, 0, 0, "%")}, // Ratio relative
{cnvObdType, cnvObdType},
{obdCodeList, obdCodeList},
};
/**
* Creates a new instance of Conversions
*/
public Conversions()
{
}
/**
* convert measurement item from storage format to physical value
*/
public static float memToPhys(long value, int cnvID)
{
return (cnvFactors[cnvID][cnvSystem].memToPhys(value).floatValue());
}
/**
* convert measurement item from storage format to physical value
*/
public static long physToMem(float value, int cnvID)
{
return (cnvFactors[cnvID][cnvSystem].physToMem(value).longValue());
}
/**
* convert measurement item from storage format to physical value
*/
public static String getUnits(int cnvID)
{
return (cnvFactors[cnvID][cnvSystem].getUnits());
}
/**
* convert measurement item from storage format to physical value
*/
private static String memToString(long value, int cnvID, int decimals)
{
return (cnvFactors[cnvID][cnvSystem].memToString(value, decimals));
}
/** object to be used for parsing and formatting decimal numbers */
private static DecimalFormat decimalFormat;
private static final DecimalFormat[] formats =
{
new DecimalFormat("0;-#"),
new DecimalFormat("0.0;-#"),
new DecimalFormat("0.00;-#"),
new DecimalFormat("0.000;-#"),
new DecimalFormat("0.0000;-#")
};
/**
* Format physical value to physical value string
*
* @param physVal physical value
* @param cnvId ID of conversion to be used
* @param decimals number of decimals for formatting
* @return physical value as formatted string
*/
public static String physToPhysFmtString(Float physVal, int cnvId, int decimals)
{
String result;
if (decimals >= 0)
{
decimalFormat = formats[decimals];
result = decimalFormat.format(physVal);
} else
{
result = Conversions.memToString(physVal.longValue(), cnvId, decimals);
}
return (result);
}
}
@@ -0,0 +1,94 @@
/*
* (C) Copyright 2015 by fr3ts0n <erwin.scheuch-heilig@gmx.at>
*
* 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., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
package com.fr3ts0n.ecu;
import com.fr3ts0n.pvs.IndexedProcessVar;
/**
* ECU fault code
*
* @author erwin
*/
public class EcuCodeItem extends IndexedProcessVar
implements Comparable<EcuCodeItem>
{
/** unique class id*/
public static final long serialVersionUID = -1;
// Field IDs
public static final int FID_CODE = 0;
public static final int FID_DESCRIPT = 1;
public static final int FID_STATUS = 2;
public static final String[] FIELDS =
{
"CODE",
"DESCRIPTION",
"STATUS",
};
EcuCodeItem()
{
}
/** Creates a new instance of EcuCodeItem
* @param code String representation of DFC
* @param description descriptive text of DFC
*/
public EcuCodeItem(String code, String description)
{
put(FID_CODE, code);
put(FID_DESCRIPT, description);
}
/** Creates a new instance of ObdCodeItem
* @param numericCode numeric code ID
* @param description descriptive text of DFC
*/
public EcuCodeItem(int numericCode, String description)
{
put(FID_CODE, String.valueOf(numericCode));
put(FID_DESCRIPT, description);
}
public String[] getFields()
{
return ObdCodeItem.FIELDS;
}
/**
* Return String representation of Code item
* @return String representation of code
*/
@Override
public String toString()
{
return String.format("%02X.%s", get(FID_STATUS), get(FID_CODE));
}
/**
* Implementation of Comparable to allow sorting
* @param o the other object
* @return result of comparison
*/
public int compareTo(EcuCodeItem o)
{
return toString().compareTo(o.toString());
}
}
@@ -0,0 +1,139 @@
/*
* (C) Copyright 2015 by fr3ts0n <erwin.scheuch-heilig@gmx.at>
*
* 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., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
package com.fr3ts0n.ecu;
import com.fr3ts0n.common.UTF8Bundle;
import com.fr3ts0n.ecu.prot.obd.Messages;
import java.util.HashSet;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
import java.util.Set;
/**
* Vehicle fault code list
*
* @author erwin
*/
public class EcuCodeList
implements Conversion
{
private static final long serialVersionUID = 219865459629423028L;
private final transient ResourceBundle codes;
private transient int radix = 10;
/**
* construct a new code list
*/
EcuCodeList()
{
this("com.fr3ts0n.ecu.prot.obd.res.codes");
}
/**
* Construct a new code list and initialize it with ressources files
*
* @param resourceBundleName name of used resource bundle
*/
public EcuCodeList(String resourceBundleName)
{
codes = UTF8Bundle.getBundle(resourceBundleName);
}
/**
* Construct a new code list and initialize it with ressources files
*
* @param resourceBundleName name of used resource bundle
* @param idRadix radix of numeric code id
*/
public EcuCodeList(String resourceBundleName, int idRadix)
{
this(resourceBundleName);
radix = idRadix;
}
String getCode(Number value)
{
return(Long.toString(value.longValue(),radix));
}
public EcuCodeItem get(Number value)
{
EcuCodeItem result = null;
if (codes != null)
{
String key = getCode(value);
try
{
result = new EcuCodeItem(key, codes.getString(key));
} catch (MissingResourceException e)
{
result = new EcuCodeItem(key,
Messages.getString(
"customer.specific.trouble.code.see.manual"));
}
}
return result;
}
/**
* return all known values
* @return all known ressource values
*/
public Set<String> values()
{
Set<String> values = new HashSet<String>();
for( String key : codes.keySet())
{
values.add(codes.getString(key));
}
return values;
}
@Override
public String getUnits()
{
return "";
}
@Override
public Number memToPhys(long value)
{
return (float) value;
}
@Override
public String memToString(Number value, int numDecimals)
{
String fmt = "%." + numDecimals + "f";
return physToPhysFmtString(memToPhys(value.longValue()), fmt);
}
@Override
public Number physToMem(Number value)
{
return value;
}
@Override
public String physToPhysFmtString(Number value, String format)
{
return (get(value).toString());
}
}
@@ -0,0 +1,234 @@
/*
* (C) Copyright 2015 by fr3ts0n <erwin.scheuch-heilig@gmx.at>
*
* 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., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
package com.fr3ts0n.ecu;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.logging.Logger;
/**
* Diagnostic data conversions
*
* @author erwin
*/
public class EcuConversions extends HashMap<String, Conversion[]>
{
/** SerialVersion UID */
private static final long serialVersionUID = 273813879102783740L;
/** conversion type IDs from CSV file */
private static final String CNV_TYPE_LINEAR = "LINEAR";
private static final String CNV_TYPE_HASH = "HASH";
private static final String CNV_TYPE_BITMAP = "BITMAP";
private static final String CNV_TYPE_CODELIST = "CODELIST";
private static final String CNV_TYPE_PCODELIST = "PCODELIST";
private static final String CNV_TYPE_VAG = "VAG";
private static final String CNV_TYPE_INT = "INTEGER";
private static final String CNV_TYPE_ASCII = "ASCII";
/** CSV field positions */
private static final int FLD_NAME = 0;
private static final int FLD_TYPE = 1;
private static final int FLD_VARIANT = 2;
private static final int FLD_SYSTEM = 3;
private static final int FLD_FACTOR = 4;
private static final int FLD_DIVIDER = 5;
private static final int FLD_OFFSET = 6;
private static final int FLD_PHOFFSET = 7;
private static final int FLD_UNITS = 8;
static final int FLD_DESCRIPTION = 9;
private static final int FLD_PARAMETERS = 10;
// the data logger
private static final Logger log = Logger.getLogger("data.cnv");
/** DEFAULT type conversion */
public static final NumericConversion dfltCnv = new IntConversion();
/** code list conversion */
public static EcuCodeList codeList = null;
/**
* Create conversion list from default resource file (tab delimited csv)
* (prot/res/conversion.csv)
*/
public EcuConversions()
{
// add dynamic entris from csv file(s)
this("prot/res/obd/conversions.csv");
}
/**
* Create conversion list from resource file (tab delimited csv)
*
* @param resource name of resource to be loaded
*/
public EcuConversions(String resource)
{
// add static conversions
put("DEFAULT", new Conversion[]{dfltCnv, dfltCnv});
// add dynamic entris from csv file(s)
loadFromResource(resource);
}
public void loadFromStream(InputStream inStr)
{
BufferedReader rdr;
String currLine;
String[] params;
Conversion[] currCnvSet;
Conversion newCnv;
int line = 0;
try
{
rdr = new BufferedReader(new InputStreamReader(inStr));
// loop through all lines of the file ...
while ((currLine = rdr.readLine()) != null)
{
// ignore line 1
if (++line == 1)
{
continue;
}
// replace all optional quotes from CSV code list
currLine = currLine.replaceAll("\"", "");
// split CSV line into parameters
params = currLine.split("\t");
if (params[FLD_TYPE].equals(CNV_TYPE_LINEAR))
{
if(params.length > FLD_PARAMETERS)
{
// create linear conversion (w/ dynamic parameters)
newCnv = new LinearConversion(Integer.parseInt(params[FLD_FACTOR]),
Integer.parseInt(params[FLD_DIVIDER]),
Integer.parseInt(params[FLD_OFFSET]),
Integer.parseInt(params[FLD_PHOFFSET]),
params[FLD_UNITS],
params[FLD_PARAMETERS]);
}
else
{
// create linear conversion (w/o dynamic parameter)
newCnv = new LinearConversion(Integer.parseInt(params[FLD_FACTOR]),
Integer.parseInt(params[FLD_DIVIDER]),
Integer.parseInt(params[FLD_OFFSET]),
Integer.parseInt(params[FLD_PHOFFSET]),
params[FLD_UNITS]);
}
}
else if (params[FLD_TYPE].equals(CNV_TYPE_HASH))
{
// create HashConversion based on CSV data
newCnv = new HashConversion( String.valueOf(params[FLD_PARAMETERS]).split(";") );
}
else if (params[FLD_TYPE].equals(CNV_TYPE_BITMAP))
{
// create BitmapConversion based on CSV parameters
newCnv = new BitmapConversion( String.valueOf(params[FLD_PARAMETERS]).split(";") );
}
else if (params[FLD_TYPE].equals(CNV_TYPE_CODELIST))
{
// create ECU code list based on ResourceBundle
codeList = new EcuCodeList( String.valueOf(params[FLD_PARAMETERS]));
newCnv = codeList;
}
else if (params[FLD_TYPE].equals(CNV_TYPE_PCODELIST))
{
// create OBD code list based on ResourceBundle
codeList = new ObdCodeList( String.valueOf(params[FLD_PARAMETERS]));
newCnv = codeList;
}
else if (params[FLD_TYPE].equals(CNV_TYPE_VAG))
{
// create VAG conversion
newCnv = new VagConversion(Integer.parseInt(params[FLD_VARIANT]),
Double.parseDouble(params[FLD_FACTOR]) / Integer.parseInt(params[FLD_DIVIDER]),
Double.parseDouble(params[FLD_OFFSET]),
params[FLD_UNITS]);
}
else if (params[FLD_TYPE].equals(CNV_TYPE_ASCII))
{
newCnv = null;
}
else if (params[FLD_TYPE].equals(CNV_TYPE_INT))
{
newCnv = dfltCnv;
}
else
{
newCnv = dfltCnv;
}
// insert fault code element
currCnvSet = get(params[FLD_NAME]);
// if this conversion does not exist yet ...
if (currCnvSet == null)
{
// create new set for metric and imperial
currCnvSet = new Conversion[EcuDataItem.SYSTEM_TYPES];
// and initialize both systems with this data
for (int i = 0; i < EcuDataItem.SYSTEM_TYPES; i++)
{
currCnvSet[i] = newCnv;
log.finer("+" + params[FLD_NAME] + "/" + params[FLD_SYSTEM] + " - " + String.valueOf(newCnv));
}
} else
{
// if it is known already, then only update the matching system
for (int i = 0; i < EcuDataItem.SYSTEM_TYPES; i++)
{
if (EcuDataItem.cnvSystems[i].equals(params[FLD_SYSTEM]))
{
currCnvSet[i] = newCnv;
log.finer("+" + params[FLD_NAME] + "/" + params[FLD_SYSTEM] + " - " + newCnv.toString());
}
}
}
// (re-)enter the updated conversion set into map
put(params[FLD_NAME], currCnvSet);
}
rdr.close();
} catch (IOException e)
{
e.printStackTrace();
}
}
/**
* load conversion list from resource file (tab delimited)
*
* @param resource name of resource to be loaded
*/
private void loadFromResource(String resource)
{
try
{
loadFromStream(getClass().getResource(resource).openStream());
}
catch(IOException ex)
{
ex.printStackTrace();
}
}
}
@@ -0,0 +1,348 @@
/*
* (C) Copyright 2015 by fr3ts0n <erwin.scheuch-heilig@gmx.at>
*
* 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., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
package com.fr3ts0n.ecu;
import com.fr3ts0n.prot.ProtUtils;
import com.fr3ts0n.prot.ProtoHeader;
import java.util.logging.Logger;
/**
* Definition of a single ECU Data item (EcuDataItem)
*
* @author erwin
*/
public class EcuDataItem
implements Cloneable
{
/** conversion systems METRIC and IMPERIAL */
public static final int SYSTEM_METRIC = 0;
public static final int SYSTEM_IMPERIAL = 1;
public static final int SYSTEM_TYPES = 2;
/** names of conversion system types */
public static final String[] cnvSystems =
{
"METRIC",
"IMPERIAL",
};
// current conversion system
public static int cnvSystem = SYSTEM_METRIC;
// maximum number of conversion errors before disabling data item
public static int MAX_ERROR_COUNT = 3;
public int pid; ///< pid
public int ofs; ///< Offset within message
public Conversion[] cnv; ///< type of conversion
private int bytes; ///< number of data bytes expected from vehicle
private int bitOffset = 0; ///< bit offset within extracted long
private int numBits = 32; ///< number of relevant bits within extracted long
private long bitMask = 0xFFFFFFFF; ///< mask for relevant bits within extracted long
private String fmt; ///< Format for text output
public String label; ///< text label
private String mnemonic; ///< unique textual mnemonic
public EcuDataPv pv; ///< the process variable for displaying
private int currErrorCount = 0; ///< current number of consecutive conversion errors
public long updatePeriod_ms = 0; ///< Minimum update period in ms
// Logger object
private static final Logger log = Logger.getLogger("data.ecu");
public static int[] byteValues =
{
0xFFFF, // fake default max value for length 0
0xFF,
0xFFFF,
0xFFFFFF,
0xFFFFFFFF
};
/**
* Creates a new instance of EcuDataItem
*/
public EcuDataItem()
{
}
/**
* Creates a new instance of EcuDataItem
*
* @param newPid PID of data item
* @param offset offset within PID data (in bytes)
* @param numBytes length of parameter in bytes
* @param bitOfs Bit offset of measurement within numeric value
* @param numberOfBits Number of relevant bits within numeric value
* @param conversions data conversion to be used with this item
* @param format formatting string for text representation
* @param minValue minimum physical value to display/scale
* @param maxValue maximum physical value to display/scale
* @param minUpdatePeriod Minimum expected data update period in ms
* @param labelText descriptive text label
*/
public EcuDataItem( int newPid,
int offset,
int numBytes,
int bitOfs,
int numberOfBits,
long maskingBits,
Conversion[] conversions,
String format,
Number minValue,
Number maxValue,
long minUpdatePeriod,
String labelText,
String _mnemonic)
{
pid = newPid;
ofs = offset;
bytes = numBytes;
bitOffset = bitOfs;
numBits = numberOfBits;
bitMask = maskingBits;
cnv = conversions;
fmt = format;
updatePeriod_ms = minUpdatePeriod;
label = labelText;
mnemonic = _mnemonic;
pv = new EcuDataPv();
// initialize new PID with current data
pv.put(EcuDataPv.FID_PID, Integer.valueOf(pid));
pv.put(EcuDataPv.FID_OFS, Integer.valueOf(ofs));
pv.put(EcuDataPv.FID_BIT_OFS, Integer.valueOf(bitOffset));
pv.put(EcuDataPv.FID_DESCRIPT, label);
pv.put(EcuDataPv.FID_MNEMONIC, mnemonic);
pv.put(EcuDataPv.FID_UNITS,
(cnv != null && cnv[cnvSystem] != null)
? cnv[cnvSystem].getUnits()
: "");
pv.put(EcuDataPv.FID_VALUE, Float.valueOf(0));
pv.put(EcuDataPv.FID_FORMAT, fmt);
pv.put(EcuDataPv.FID_CNVID, cnv);
updateLimits(minValue, maxValue);
}
/**
* Update MIN/MAX limit values
*
* - if values are specified, this sets the MIN/MAX limits to specified values
* - if NOT specified the MIN/MAX range is calculated from the data range using the given conversion
*
* This update is required on:
* - Initialisation
* - Update of dynamic conversion factors
*
* @param minValue Specific MIN value or NULL if not specified
* @param maxValue Specific MAX value or NULL if not specified
*/
protected void updateLimits(Number minValue, Number maxValue)
{
// set specified values
Number minVal = minValue;
Number maxVal = maxValue;
// Check conversion
if(cnv != null && cnv[cnvSystem] != null)
{
// If MIN/MAX value un-specified. calculate from data range conversion
if(minVal == null) minVal = physMin();
if(maxVal == null) maxVal = physMax();
}
// Update limits ...
pv.put(EcuDataPv.FID_MIN, minVal);
pv.put(EcuDataPv.FID_MAX, maxVal);
}
/**
* Return minimum raw (integer) value before conversion
* - calculated based on bit width & mask
*
* @apiNote Just for completeness, This wil always return a 0
*
* @return MIM raw integer value
*/
public long rawMin()
{
return 0L;
}
/**
* Return maximum raw (integer) value before conversion
* - calculated based on bit width & mask
*
* @return MAX raw integer value
*/
public long rawMax()
{
return((((1L<<numBits)-1) & bitMask));
}
/**
* Return physical value from raw (integer) value
* @param rawVal RAW integer value
* @return Physical value
*/
public Number physVal(long rawVal)
{
return( cnv[cnvSystem].memToPhys( rawVal ));
}
/**
* Return raw (integer) value from physical value
* - calculation based on conversion
*
* @param physVal physical value
* @return raw integer value
*/
public long rawVal(Number physVal)
{
return cnv[cnvSystem].physToMem(physVal).longValue();
}
/**
* Return physically minimum value
* - Value is calculated from bit width and data conversion
*
* @return MIN value
*/
public Number physMin()
{
return physVal(rawMin());
}
/**
* Return physically maximum value
* - Value is calculated from bit width and data conversion
*
* @return MAX value
*/
public Number physMax()
{
return physVal(rawMax());
}
@Override
public String toString()
{
return (String.format("%02X.%d.%d", pid, ofs, bitOffset));
}
/**
* get physical value from buffer
*
* @param buffer communication buffer content
* @return physical value
*/
private Object physFromBuffer(char[] buffer)
{
Object result;
try
{
if (cnv != null && cnv[cnvSystem] != null)
{
// extract value from buffer
long value = ProtoHeader.getParamInt(ofs, bytes, buffer).longValue();
// calculate effective value ...
// shift on bit offset
value = (value >> bitOffset);
// mask with bit lenth mask
value = (value & ((1L << numBits)-1));
// mask with specific bit mask
value = (value & bitMask);
// now run conversion to physical value on it ...
result = physVal(value);
}
else
{
// get number of padding \0 characters
int padChars = 0; while(buffer[ofs + padChars] == 0) padChars++;
// copy string content after padding characters ...
result = String.copyValueOf(buffer, ofs + padChars, bytes);
}
// decrement error counter
currErrorCount = Math.max(0, currErrorCount -1);
} catch(Exception ex)
{
result = "n/a";
log.warning(String.format("%s: %s - [%s]", toString(), ex.getMessage(), ProtUtils.hexDumpBuffer(buffer)));
// increment error counter
currErrorCount = Math.min(MAX_ERROR_COUNT, currErrorCount +1);
}
return (result);
}
/**
* Update process var from Buffer value
*
* @param buffer communication buffer content
* @return Next expected update period
*/
@SuppressWarnings("DefaultLocale")
public long updatePvFomBuffer(char[] buffer)
{
// process data item
try
{
// get physical value
Object result = physFromBuffer(buffer);
// if consecutive conversion error counter not exceeded
if(currErrorCount < MAX_ERROR_COUNT)
{
pv.put(EcuDataPv.FID_VALUE, result);
pv.put(EcuDataPv.FID_UNITS, pv.getUnits());
log.fine(String.format("%02X %-30s %16s %s",
pid,
label,
pv.get(EcuDataPv.FID_VALUE),
pv.get(EcuDataPv.FID_UNITS)));
}
else
{
log.warning(String.format("Item disabled: %s (%d/%d)",
toString(),
currErrorCount,
MAX_ERROR_COUNT));
}
}
catch(Exception ex)
{
log.warning(ex.toString());
}
/* return next expected update period */
return updatePeriod_ms;
}
@Override
public Object clone()
{
EcuDataItem result = null;
try
{
result = (EcuDataItem) super.clone();
result.pv = (EcuDataPv) pv.clone();
} catch (CloneNotSupportedException ex)
{
ex.printStackTrace();
}
return (result);
}
}
@@ -0,0 +1,324 @@
/*
* (C) Copyright 2015 by fr3ts0n <erwin.scheuch-heilig@gmx.at>
*
* 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., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
package com.fr3ts0n.ecu;
import com.fr3ts0n.ecu.prot.obd.Messages;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Vector;
import java.util.logging.Logger;
/**
* Collection of all known data items:
* <pre>
* The data structure looks as follows:
* Service -- PID -- EcuDataItem
* | |- EcuDataItem
* | |- ...
* ... |- PID -- EcuDataItem
* | |- ...
* |- ... -- ...
* Service ...
* </pre>
*
* @author erwin
*/
public class EcuDataItems extends HashMap<Integer, HashMap<Integer, Vector<EcuDataItem>>>
{
/**
* SerialVersion UID
*/
private static final long serialVersionUID = 5525561909111851836L;
/**
* CSV field positions
*/
enum FLD
{
SVC,
PID,
OFS,
LEN,
BIT_OFS,
BIT_LEN,
BIT_MASK,
FORMULA,
FORMAT,
MIN,
MAX,
UPDATE_MIN,
MNEMONIC,
LABEL,
DESCRIPTION,
NUMBEROFFIELDS
}
// set of all conversions
public static EcuConversions cnv;
// the data logger
private static final Logger log = Logger.getLogger("data.items");
// map of MNEMONIC data item
public static final HashMap<String, EcuDataItem> byMnemonic = new HashMap<>();
/**
* Create data items from default CSV pidResource files
* (prot/obd/res/pids.csv, prot/obd/res/conversions.csv)
*/
public EcuDataItems()
{
this("prot/obd/res/pids.csv",
"prot/obd/res/conversions.csv",
"com.fr3ts0n.ecu.prot.obd.res.messages");
}
/**
* Create data items from CSV pidResource file
*
* @param pidResource resource file for PIDs (csv)
* @param conversionResource resource file for conversions (csv)
*/
public EcuDataItems(String pidResource, String conversionResource, String resourceBundleName)
{
Messages.init(resourceBundleName);
cnv = new EcuConversions(conversionResource);
loadFromResource(pidResource);
}
/**
* read data from resource file into data structure
*
* @param resource the resource file (csv)
*/
private void loadFromResource(String resource)
{
try
{
loadFromStream(getClass().getResource(resource).openStream());
}
catch (IOException e)
{
e.printStackTrace();
}
}
/**
* read data from input stream (csv) into data structure
*
* @param inStr the csv input stream
*/
public void loadFromStream(InputStream inStr)
{
BufferedReader rdr;
String currLine;
String[] params;
Conversion[] currCnvSet;
EcuDataItem newItm;
int line = 0;
try
{
rdr = new BufferedReader(new InputStreamReader(inStr));
// loop through all lines of the file ...
while ((currLine = rdr.readLine()) != null)
{
// ignore first line
if (++line == 1 || currLine.startsWith("#")) //$NON-NLS-1$
{
continue;
}
// repalce all optional quotes from CSV code list
currLine = currLine.replaceAll("\"", ""); //$NON-NLS-1$ //$NON-NLS-2$
// split CSV line into parameters
params = currLine.split("\t"); //$NON-NLS-1$
currCnvSet = cnv.get(params[FLD.FORMULA.ordinal()]);
if (currCnvSet == null)
{
log.warning("Conversion not found: " + params[FLD.FORMULA.ordinal()] + " " + currLine); //$NON-NLS-1$ //$NON-NLS-2$
}
// try to use MIN/MAX values from CSV
Float minVal = null;
Float maxVal = null;
try { minVal = Float.parseFloat(params[FLD.MIN.ordinal()]); }
catch(NumberFormatException ex) { /* ignore */ }
try { maxVal = Float.parseFloat(params[FLD.MAX.ordinal()]); }
catch(NumberFormatException e) { /* ignore */ }
long updateVal = 0;
try { updateVal = Long.parseLong(params[FLD.UPDATE_MIN.ordinal()]); }
catch(NumberFormatException ex) { updateVal = 0; }
String label = Messages.getString(params[FLD.MNEMONIC.ordinal()],
params[FLD.LABEL.ordinal()]);
// create linear conversion
newItm = new EcuDataItem(Integer.decode(params[FLD.PID.ordinal()]),
Integer.parseInt(params[FLD.OFS.ordinal()]),
Integer.parseInt(params[FLD.LEN.ordinal()]),
Integer.parseInt(params[FLD.BIT_OFS.ordinal()]),
Integer.parseInt(params[FLD.BIT_LEN.ordinal()]),
Long.decode(params[FLD.BIT_MASK.ordinal()]),
currCnvSet,
params[FLD.FORMAT.ordinal()],
minVal,
maxVal,
updateVal,
label,
params[FLD.MNEMONIC.ordinal()]);
// Add item to mnemonic map
byMnemonic.put(params[FLD.MNEMONIC.ordinal()], newItm);
// enter data item for all specified services
String[] services = params[FLD.SVC.ordinal()].split(","); //$NON-NLS-1$
for (String service : services)
{
int svcId = Integer.decode(service);
appendItemToService(svcId, newItm);
}
}
rdr.close();
} catch (IOException e)
{
e.printStackTrace();
}
}
/**
* get all data items for selected service and PID
*
* @param service service to search data items for
* @param pid pid to search data items for
* @return Vector to data items - or null if no data items exist
*/
public Vector<EcuDataItem> getPidDataItems(int service, int pid)
{
Vector<EcuDataItem> currVec = null;
HashMap<Integer, Vector<EcuDataItem>> currSvc = get(service);
if (currSvc != null)
{
currVec = currSvc.get(pid);
}
return (currVec);
}
/**
* get all data items for selected service
*
* @param service service to search data items for
* @return Vector to data items - or null if no data items exist
*/
public Vector<EcuDataItem> getSvcDataItems(int service)
{
Vector<EcuDataItem> result = new Vector<>();
HashMap<Integer, Vector<EcuDataItem>> currSvc = get(service);
if (currSvc != null)
{
for (Vector<EcuDataItem> currVec : currSvc.values())
{
result.addAll(currVec);
}
}
return (result);
}
/**
* Notify about a change of conversion factors
*
* - Updates MIN/MAX range of all items using specified conversion
*
* @param conversion Conversion which notifies changes
*/
protected static void notifyConversionChange(NumericConversion conversion)
{
// Loop through all items ...
for (EcuDataItem item : byMnemonic.values())
{
// If item uses specified conversion ...
if(item.cnv[EcuDataItem.cnvSystem] == conversion)
{
// update MIN/MAX limits of item
item.updateLimits(null, null);
}
}
}
/**
* append new data item to specified service
*
* @param service service to add item to
* @param newItem EcuDataItem to be added
*/
public void appendItemToService(int service, EcuDataItem newItem)
{
// check if service existes already
HashMap<Integer, Vector<EcuDataItem>> currSvc = get(service);
// if not - create it
if (currSvc == null)
{
currSvc = new HashMap<>();
log.finer("+SVC: " + service + " - " + currSvc); //$NON-NLS-1$ //$NON-NLS-2$
}
// check if item list exists for current PID
Vector<EcuDataItem> currVec = currSvc.get(newItem.pid);
// if not -- create it
if (currVec == null)
{
currVec = new Vector<>();
log.finer("+PID: " + newItem.pid + " - " + currVec); //$NON-NLS-1$ //$NON-NLS-2$
}
// enter data item into list of items / PID
currVec.add(newItem);
// and update list in into the pid map for corresponding service
currSvc.put(newItem.pid, currVec);
// update map of services
put(service, currSvc);
// debug message of new enty
log.finer("+" + service + "/" + String.format("0x%02X", newItem.pid) + " - " + currVec); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
}
/**
* Update all EcuDataItems with new data from buffer
*
* @param service service of current data
* @param pid pid of current data
* @param buffer data buffer to do conversions on
* @return Next expected update interval
*/
public long updateDataItems(int service, int pid, char[] buffer)
{
long nextUpdate = 0;
Vector<EcuDataItem> currItms = getPidDataItems(service, pid);
if(currItms != null)
{
for (EcuDataItem currItm : currItms)
{
long currItmUpdate = currItm.updatePvFomBuffer(buffer);
nextUpdate = Math.max(nextUpdate, currItmUpdate);
}
}
return nextUpdate;
}
}
+118
View File
@@ -0,0 +1,118 @@
/*
* (C) Copyright 2015 by fr3ts0n <erwin.scheuch-heilig@gmx.at>
*
* 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., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
package com.fr3ts0n.ecu;
import com.fr3ts0n.pvs.IndexedProcessVar;
/**
* Process variable which contains a single OBD data item
*
* @author erwin
*/
public class EcuDataPv extends IndexedProcessVar
{
/** UID for serialisation */
private static final long serialVersionUID = -7787217159439147214L;
// Field IDs
public static final int FID_PID = 0;
public static final int FID_OFS = 1;
public static final int FID_DESCRIPT = 2;
public static final int FID_VALUE = 3;
public static final int FID_UNITS = 4;
// optional Field IDs which will be invisible for table display
public static final String FID_FORMAT = "FMT";
public static final String FID_CNVID = "CNV_ID";
public static final String FID_MIN = "MIN";
public static final String FID_MAX = "MAX";
public static final String FID_BIT_OFS = "BIT_OFS";
public static final String FID_MNEMONIC = "MNEMONIC";
public static final String FID_COLOR = "COLOR";
public static final String FID_UPDT_PERIOD = "PERIOD";
public static final String[] FIELDS =
{
"PID",
"OFS",
"DESCRIPTION",
"VALUE",
"UNITS",
};
private transient Object renderingComponent;
/**
* Creates a new instance of EcuDataPv
*/
public EcuDataPv()
{
super();
this.setKeyAttribute(FIELDS[0]);
}
public String[] getFields()
{
return (FIELDS);
}
/**
* get physical measurement units of a data PV.
* Units may change because of the conversion system changed (metric/imperial)
*
* @return string of physical measurement units
*/
public String getUnits()
{
String result = "";
try
{
// Try to get from assigned conversion
Conversion[] cnv = (Conversion[]) get(FID_CNVID);
if(cnv != null && cnv[EcuDataItem.cnvSystem] != null)
{
result = cnv[EcuDataItem.cnvSystem].getUnits();
}
else
{
// Attempt to get units from field
result = get(FID_UNITS).toString();
}
}
catch(Exception ex)
{
result="";
}
return result;
}
public Object getRenderingComponent()
{
return renderingComponent;
}
public void setRenderingComponent(Object renderingComponent)
{
this.renderingComponent = renderingComponent;
}
public String toString()
{
return (String.format("%02X.%d.%d", get(FID_PID), get(FID_OFS), get(FID_BIT_OFS)));
}
}
+120
View File
@@ -0,0 +1,120 @@
/*
* (C) Copyright 2015 by fr3ts0n <erwin.scheuch-heilig@gmx.at>
*
* 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., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
package com.fr3ts0n.ecu;
import com.fr3ts0n.ecu.prot.obd.Messages;
import java.util.HashMap;
import java.util.Map;
/**
* conversion of numeric values based on a hash map
*
* @author erwin
*/
public class HashConversion extends NumericConversion
{
/**
*
*/
private static final long serialVersionUID = -1077047688974749271L;
/* the HashMap Data */
private final HashMap<Long, String> hashData = new HashMap<Long, String>();
/**
* create a new hash converter which is initialized with values from map data
*
* @param data map data for conversions
*/
@SuppressWarnings({"rawtypes", "unchecked"})
public HashConversion(Map data)
{
hashData.putAll(data);
}
/**
* create a new hash converter which is initialized with avlues from an array
* of strings in the format "key=value"
*
* @param initData initializer strings for conversions in the format "key=value[;key=value[...]]"
*/
public HashConversion(String[] initData)
{
initFromStrings(initData);
}
/**
* initialize hash map with values from an array of strings in the format "key=value"
*
* @param initData initializer strings for conversions in the format "key=value[;key=value[...]]"
*/
private void initFromStrings(String[] initData)
{
Long key;
String value;
String[] data;
// clear old hash data
hashData.clear();
// loop through all entries ...
for (String anInitData : initData)
{
data = anInitData.split(";");
for (String aData : data)
{
// ... split key and value ...
String[] words = aData.split("=");
key = Long.valueOf(words[0]);
value = words[1];
// attempt to translate ...
String xlatKey = value;
xlatKey = xlatKey.replaceAll("[ -]", "_").toLowerCase();
value = Messages.getString(xlatKey, value);
// debug log translated message
log.finer(String.format("%s=%s", xlatKey, value));
// ... and enter into hash map
hashData.put(key, value);
}
}
}
public Number memToPhys(long value)
{
return value;
}
public Number physToMem(Number value)
{
return value;
}
@Override
public String physToPhysFmtString(Number physVal, String format)
{
String result = hashData.get(physVal.longValue());
// if we haven't found a string representation, return numeric value
if (result == null)
result = "Unknown state: "+super.physToPhysFmtString(physVal, format);
return (result);
}
}
@@ -0,0 +1,49 @@
/*
* (C) Copyright 2015 by fr3ts0n <erwin.scheuch-heilig@gmx.at>
*
* 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., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*
*/
package com.fr3ts0n.ecu;
/**
* Internal int-based conversion for hex display
*/
public class IntConversion
extends NumericConversion
{
/** uid */
private static final long serialVersionUID = -2551205550381391025L;
@Override
public Number memToPhys(long value)
{
return value;
}
@Override
public Number physToMem(Number value)
{
return value;
}
@Override
public String physToPhysFmtString(Number physVal, String format)
{
long val = physVal.longValue();
return String.format(format, val);
}
}
+163
View File
@@ -0,0 +1,163 @@
/*
* (C) Copyright 2015 by fr3ts0n <erwin.scheuch-heilig@gmx.at>
*
* 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., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
package com.fr3ts0n.ecu;
import com.fr3ts0n.pvs.PvLimits;
/**
* Definition of a single OBD data conversion
*
* @author erwin
*/
public class LinearConversion extends NumericConversion
{
/**
*
*/
private static final long serialVersionUID = 7409621816599441879L;
private int factor = 1;
private int divider = 1;
private int offset = 0;
private int offsetPhys = 0;
private PvLimits limits = null;
// mnemonic of dynamic factor
private String factMnemonic = null;
/**
* Creates a new instance of Conversion
*/
public LinearConversion()
{
}
/**
* Creates a new instance of Conversion
*
* @param factor conversion factor (integer part)
* @param divider conversion divider (integer part)
* @param offset linear offset to be added to raw memory value before conversion
* @param offsetPhys physical offset to be added after converting raw value
* @param units physical units for this conversion
*/
public LinearConversion(int factor, int divider, int offset, int offsetPhys,
String units)
{
this.offset = offset;
this.factor = factor;
this.divider = divider;
this.offsetPhys = offsetPhys;
this.units = units;
}
/**
* Creates a new instance of Conversion with usage of a optional dynamic conversion factor
*
* @param factor conversion factor (integer part)
* @param divider conversion divider (integer part)
* @param offset linear offset to be added to raw memory value before conversion
* @param offsetPhys physical offset to be added after converting raw value
* @param units physical units for this conversion
* @param factMnemonic mnemonic of dynamic conversion factor value
*/
public LinearConversion(int factor, int divider, int offset, int offsetPhys,
String units, String factMnemonic)
{
this(factor, divider, offset, offsetPhys, units);
if (factMnemonic != null && !factMnemonic.isEmpty())
{
this.factMnemonic = factMnemonic;
}
}
/**
* Creates a new instance of Conversion
*
* @param factor conversion factor (integer part)
* @param divider conversion divider (integer part)
* @param offset linear offset to be added to raw memory value before conversion
* @param offsetPhys physical offset to be added after converting raw value
* @param units physical units for this conversion
*/
public LinearConversion(int factor, int divider, int offset, int offsetPhys,
String units, PvLimits limits)
{
this(factor, divider, offset, offsetPhys, units);
this.limits = limits;
}
/**
* Dynamic update of conversion factor from other measurement value
*
* The dynamic conversion factor overrides the initial, static factor if:
* - Factor is reported by protocol
* - Value > 0
*/
private void updateCnvFromDynamicFactor()
{
if (factMnemonic != null)
{
// Get data item of dynamic conversion factor
EcuDataItem newFactItm = EcuDataItems.byMnemonic.get(factMnemonic);
if (newFactItm != null)
{
// Get value of dynamic conversion factor
Number factVal = (Number)newFactItm.pv.get(EcuDataPv.FID_VALUE);
// If there is a valid value, update factor with dynamic factor
if ( factVal != null // Factor defined
&& factVal.intValue() > 0 // and specified ...
&& factVal.intValue() != factor // and changed
)
{
// update conversion factor from dynamic value
factor = factVal.intValue();
// Notify all users of this conversion to update the data ranges
EcuDataItems.notifyConversionChange(this);
}
}
}
}
/**
* convert measurement item from storage format to physical value
*
* @param value raw memory value to be converted
*/
public Number memToPhys(long value)
{
updateCnvFromDynamicFactor();
float result = ((float) (value + offset) * factor / divider + offsetPhys);
if (limits != null)
{
result = (Float) limits.limitedValue(result);
}
return result;
}
/**
* convert measurement item from physical value to raw storage format
*
* @param value physical value to be converted
*/
public Number physToMem(Number value)
{
return ((long) java.lang.Math.round((value.floatValue() - offsetPhys)
* divider / factor - offset));
}
}
@@ -0,0 +1,85 @@
/*
* (C) Copyright 2015 by fr3ts0n <erwin.scheuch-heilig@gmx.at>
*
* 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., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
package com.fr3ts0n.ecu;
import java.util.logging.Logger;
/**
* Base class for numeric diagnostic data conversions
*
* @author erwin
*/
public abstract class NumericConversion implements Conversion
{
/** fixed serial version id */
private static final long serialVersionUID = 5506104864792893549L;
/** Logger object */
static final Logger log = Logger.getLogger("data.ecu");
/** physical units of data item */
String units = "";
@Override
public String physToPhysFmtString(Number physVal, String format)
{
return String.format(format, physVal);
}
NumericConversion()
{
}
/**
* return physical units of measurement
*
* @return physical units
*/
public String getUnits()
{
return units;
}
/**
* convert measurement item from storage format to physical value
*
* @param value memory value
* @param numDecimals number of decimal for string formatting of numbers
* @return string representation of numeric value
*/
public String memToString(Number value, int numDecimals)
{
String fmt = "%." + numDecimals + "d";
return physToPhysFmtString(memToPhys(value.longValue()), fmt);
}
/**
* convert measurement item from storage format to physical value
*
* @param value raw memory value to be converted
*/
public abstract Number memToPhys(long value);
/**
* convert measurement item from physical value to raw storage format
*
* @param value physical value to be converted
*/
public abstract Number physToMem(Number value);
}
+114
View File
@@ -0,0 +1,114 @@
/*
* (C) Copyright 2015 by fr3ts0n <erwin.scheuch-heilig@gmx.at>
*
* 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., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
package com.fr3ts0n.ecu;
import com.fr3ts0n.prot.ProtoHeader;
/**
* Definition of a single OBD failure code
*
* @author erwin
*/
public class ObdCodeItem extends EcuCodeItem
{
/**
*
*/
private static final long serialVersionUID = -3976920283943009811L;
/** code types */
private static final String codeTypes = "PCBU";
private static final int ID_CODE_TYPE = 0;
private static final int ID_CODE_VALUE = 1;
/**
* List of telegram parameters in order of appearance
*/
private static final int[][] TC_PARAMETERS =
/* START, LEN, PARAM-TYPE // REMARKS */
/* ------------------------------------------- */
{{0, 1, ProtoHeader.PT_ALPHA}, // ID_CODE_TYPE
{1, 4, ProtoHeader.PT_HEX}, // ID_CODE_VALUE
};
/** Creates a new instance of ObdCodeItem */
public ObdCodeItem()
{
setKeyAttribute(FIELDS[0]);
}
/**
* Creates a new instance of ObdCodeItem
*
* @param code String representation of DFC
* @param description descriptive text of DFC
*/
public ObdCodeItem(String code, String description)
{
setKeyAttribute(FIELDS[0]);
put(FID_CODE, code);
put(FID_DESCRIPT, description);
}
/**
* Creates a new instance of ObdCodeItem
*
* @param numericCode numeric code ID
* @param description descriptive text of DFC
*/
public ObdCodeItem(int numericCode, String description)
{
setKeyAttribute(FIELDS[0]);
put(FID_CODE, getPCode(numericCode));
put(FID_DESCRIPT, description);
}
/**
* Return numeric code representation from P/C/B/U-Code String
*
* @param pCode P/C/B/U-Code String
* @return numeric code value for corresponding code
*/
protected static int getNumericCode(String pCode)
{
// get code number
int numCode = Integer.valueOf(pCode.substring(1), 16).intValue();
int typIdx = codeTypes.indexOf(pCode.charAt(0));
numCode |= (typIdx << 14);
return (numCode);
}
/**
* Return P/C/B/U-Code String representation from numeric code
*
* @param numericCode numeric code value for corresponding code
* @return P/C/B/U-Code String
*/
static String getPCode(int numericCode)
{
char[] buffer = new char[5];
int codeType = numericCode >> 14;
int codeVal = numericCode & 0x3FFF;
ProtoHeader.setParamValue(ID_CODE_TYPE, TC_PARAMETERS, buffer, codeTypes.substring(codeType, codeType + 1));
ProtoHeader.setParamValue(ID_CODE_VALUE, TC_PARAMETERS, buffer, Integer.valueOf(codeVal));
return (new String(buffer));
}
}
+57
View File
@@ -0,0 +1,57 @@
/*
* (C) Copyright 2015 by fr3ts0n <erwin.scheuch-heilig@gmx.at>
*
* 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., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
package com.fr3ts0n.ecu;
/**
* List of all known OBD failure codes
* This list is initialized by reading data files 'res/pcodes' and 'res/ucodes'
*
* @author erwin
*/
public class ObdCodeList
extends EcuCodeList
{
/**
*
*/
private static final long serialVersionUID = 2198654596294230437L;
/** Creates a new instance of ObdCodeList */
public ObdCodeList()
{
super("com.fr3ts0n.ecu.prot.obd.res.codes");
}
/**
* Construct a new code list and initialize it with ressources files
*
* @param resourceBundleName name of used resource bundle
*/
public ObdCodeList(String resourceBundleName)
{
super(resourceBundleName);
}
@Override
protected String getCode(Number value)
{
return ObdCodeItem.getPCode(value.intValue());
}
}
@@ -0,0 +1,78 @@
package com.fr3ts0n.ecu;
import java.util.Comparator;
/**
* OBD PID definition
* - Allow prioritization of PID requests by providing:
* - timestamp (ms) of next expected request
* - sort algorithm by request timestamp for PID Collections
*/
public class ObdPid
extends Number
{
/** The PID value itself */
private final int pid;
/** Timestamp (system ms) for next expected data request */
private long nextRequest_ms = 0;
public ObdPid(int pidCode)
{
pid = pidCode;
}
@Override
public double doubleValue() {
return (double)pid;
}
@Override
public float floatValue() {
return (float)pid;
}
@Override
public int intValue() {
return pid;
}
@Override
public long longValue() {
return (long)pid;
}
@Override
public String toString() {
return Integer.toString(pid, 16);
}
/**
* Set timestamp of next expected PID request
* @param _nextRequest Timestamp [ms] of next expected request
*/
public void setNextRequest(long _nextRequest)
{
nextRequest_ms = _nextRequest;
}
/**
* Get timestamp of next expected PID request
* @return Timestamp of next expected PID request
*/
public long getNextRequest()
{
return nextRequest_ms;
}
/**
* Comparator to allow list / vector sorting by next request
*/
public static Comparator<ObdPid> requestSorter = new Comparator<ObdPid>()
{
@Override
public int compare(ObdPid arg0, ObdPid arg1)
{
return Long.compare(arg0.nextRequest_ms, arg1.nextRequest_ms);
}
};
}
@@ -0,0 +1,91 @@
/*
* (C) Copyright 2015 by fr3ts0n <erwin.scheuch-heilig@gmx.at>
*
* 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., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
package com.fr3ts0n.ecu;
import com.fr3ts0n.pvs.IndexedProcessVar;
/**
* OBD Vehicle identification Item
* The VID item does not contain any units, since it is all alphanumeric IDs
*
* @author root
*/
public class ObdVidItem
extends IndexedProcessVar
{
/**
*
*/
private static final long serialVersionUID = 955050909875054165L;
public static final int FID_DESCRIPT = 0;
public static final int FID_VALUE = 1;
/**
* description of all relevant fields for VID item
*/
private static final String[] fields =
{
"Description",
"Value"
};
@Override
public String[] getFields()
{
return (fields);
}
/**
* Descriptions of mode 9 PIDs
*/
private static final String[] descriptions =
{
/* PID 0 */ "Supported PIDs",
/* PID 1 */ "VIN Count",
/* PID 2 */ "Vehicle ID Number",
/* PID 3 */ "Cal ID Count",
/* PID 4 */ "Calibration ID",
/* PID 5 */ "Cal Version Count",
/* PID 6 */ "Cal Version",
/* PID 7 */ "IPT Count",
/* PID 8 */ "IPT",
/* PID 9 */ "Control System count",
/* PID A */ "Control System ID",
};
/**
* Return description for Mode $09 PID
*
* @param pid
* @return description for selected PID
*/
public static String getPidDescription(int pid)
{
String result;
try
{
result = descriptions[pid];
} catch (Exception e)
{
// PID is not defined -> create dummy
result = String.format("PID %02X", pid);
}
return (result);
}
}
@@ -0,0 +1,328 @@
/*
* (C) Copyright 2015 by fr3ts0n <erwin.scheuch-heilig@gmx.at>
*
* 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., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
package com.fr3ts0n.ecu;
/**
* VAG data conversions (used by Kw1281 ...)
*
* @author Erwin Scheuch-Heilig
*/
public class VagConversion extends NumericConversion
{
/**
*
*/
private static final long serialVersionUID = 9130358043909319282L;
/*
* Formulas:
*
* 0 : Tabelle
* 10 : (MW+Offset)*NW*Faktor
* 11 : (MW.NW+Offset)*Faktor
* 12 : (NW.MW+Offset)*Faktor
* 13 : (NW*255+MW+Offset)*Faktor
* 14 : (MW+Offset)/NW*Faktor
* 15 : MW*Faktor+NW*Offset
* 16 : (MW+Offset)*Faktor
* 17 : 1+(MW+Offset)*NW*Faktor
* 18 : (MW*NW*Faktor)+Offset
* 20 : Bitdarstellung
* 21 : 2 Ascii-Zeichen
* 22 : Ascii-Text
* 23 : Uhrzeit
* 24 : Hexdarstellung
*/
public static final int CNV_ID_TBL = 0;
private int cnvId = 10;
private double factor = 1.0;
private double offset = 0.0;
/** table values as they come from the meta package */
/** Value 2 for calcualtion as it comes from meta package */
private char metaNw = 0;
/** table values as they come from the meta package */
private char[] metaTblValues = {0, 255};
public VagConversion()
{
}
public VagConversion(int cnvId, double factor, double offset, String units)
{
this.cnvId = cnvId;
this.factor = factor;
this.offset = offset;
this.units = units;
}
/**
* @param metaNw the metaNw to set
*/
public void setMetaNw(char metaNw)
{
this.metaNw = metaNw;
}
/**
* @param metaTblValues the metaTblValues to set
*/
public void setMetaTblValues(char[] metaTblValues)
{
this.metaTblValues = metaTblValues;
}
/**
* calculation of interpolated table value
* table values are transferred with the meta package
*
* @param mw value 1 for calculation
* @param nw value 2 for calcualtion
* @return result of calculation
*/
private double tableValue(int mw, int nw)
{
// mask value to 1 byte
int internalVal = mw & 0xFF;
// get position into table
double stepwidth = (double) 0xFF / (metaTblValues.length - 1);
int pos = (int) (internalVal / stepwidth);
int ofs = (int) (internalVal % stepwidth);
// get both table values
int valBefore = metaTblValues[pos];
int valAfter = pos < metaTblValues.length - 1 ? metaTblValues[pos + 1] : valBefore;
// interpolate value between table entries
return ((valBefore + (valAfter - valBefore) * ofs / stepwidth) + offset - nw) * factor;
}
/**
* calculation of formula ID 10
* <pre>(MW+Offset)*NW*Faktor</pre>
*
* @param mw value 1 for calculation
* @param nw value 2 for calcualtion
* @return result of calculation
*/
private double formula10Value(int mw, int nw)
{
return ((mw + offset) * nw * factor);
}
/**
* calculation of formula ID 11
* <pre>(MW.NW+Offset)*Faktor</pre>
*
* @param mw value 1 for calculation
* @param nw value 2 for calcualtion
* @return result of calculation
*/
private double formula11Value(int mw, int nw)
{
return ((Double.parseDouble(String.format("%d.%d", mw, nw)) + offset) * factor);
}
/**
* calculation of formula ID 12
* <pre>(NW.MW+Offset)*Faktor</pre>
*
* @param mw value 1 for calculation
* @param nw value 2 for calcualtion
* @return result of calculation
*/
private double formula12Value(int mw, int nw)
{
return ((Double.parseDouble(String.format("%d.%d", nw, mw)) + offset) * factor);
}
/**
* calculation of formula ID 13
* <pre>(NW*255+MW+Offset)*Faktor</pre>
*
* @param mw value 1 for calculation
* @param nw value 2 for calcualtion
* @return result of calculation
*/
private double formula13Value(int mw, int nw)
{
return ((nw * 255 + mw + offset) * factor);
}
/**
* calculation of formula ID 14
* <pre>(MW+Offset)/NW*Faktor</pre>
*
* @param mw value 1 for calculation
* @param nw value 2 for calcualtion
* @return result of calculation
*/
private double formula14Value(int mw, int nw)
{
return ((mw + offset) / nw * factor);
}
/**
* calculation of formula ID 15
* <pre>MW*Faktor+NW*Offset</pre>
*
* @param mw value 1 for calculation
* @param nw value 2 for calcualtion
* @return result of calculation
*/
private double formula15Value(int mw, int nw)
{
return (mw * factor + nw * offset);
}
/**
* calculation of formula ID 16
* <pre>(MW+Offset)*Faktor</pre>
*
* @param mw value 1 for calculation
* @return result of calculation
*/
private double formula16Value(int mw)
{
return ((mw + offset) * factor);
}
/**
* calculation of formula ID 17
* <pre>1+(MW+Offset)*NW*Faktor</pre>
*
* @param mw value 1 for calculation
* @param nw value 2 for calcualtion
* @return result of calculation
*/
private double formula17Value(int mw, int nw)
{
return (1 + (mw + offset) * nw * factor);
}
/**
* calculation of formula ID 18
* <pre>(MW*NW*Faktor)+Offset</pre>
*
* @param mw value 1 for calculation
* @param nw value 2 for calcualtion
* @return result of calculation
*/
private double formula18Value(int mw, int nw)
{
return (mw * nw * factor + offset);
}
/**
* convert memory value to physical value
*
* @param value memory value
* @return physical value
*/
public Number memToPhys(long value)
{
double result = 0;
int mw = (int) (value % 0x100);
// if meta value is set, then it will be used
int nw = metaNw != 0 ? metaNw : (int) (value / 0x100);
switch (cnvId)
{
case 0:
result = tableValue(mw, nw);
break;
case 10:
result = formula10Value(mw, nw);
break;
case 11:
result = formula11Value(mw, nw);
break;
case 12:
result = formula12Value(mw, nw);
break;
case 13:
result = formula13Value(mw, nw);
break;
case 14:
result = formula14Value(mw, nw);
break;
case 15:
result = formula15Value(mw, nw);
break;
case 16:
result = formula16Value(mw);
break;
case 17:
result = formula17Value(mw, nw);
break;
case 18:
result = formula18Value(mw, nw);
break;
case 20:
result = mw & nw;
break;
case 21:
case 22:
case 23:
result = nw << 8 | mw;
break;
default:
log.info(String.format("Unsupported Formula: ID=%d [%s]", cnvId, units));
}
return (float) result;
}
public Number physToMem(Number value)
{
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public String physToPhysFmtString(Number physValue, String format)
{
String result;
switch (cnvId)
{
case 20: // * 20 : Bitdarstellung
result = Integer.toBinaryString(physValue.intValue());
break;
case 21: // * 21 : 2 Ascii-Zeichen
case 22: // * 22 : Ascii-Text
result = String.format("%c%c",
physValue.intValue() / 0x100,
physValue.intValue() % 0x100);
break;
case 23: // * 23 : Uhrzeit
result = String.format("%02d:%02d",
physValue.intValue() / 0x100,
physValue.intValue() % 0x100);
break;
case 24: // * 24 : Hexdarstellung
result = String.format("%04X", physValue.intValue());
break;
default:
result = super.physToPhysFmtString(physValue, format);
}
return (result);
}
}
@@ -0,0 +1,67 @@
<?xml version="1.0" encoding="UTF-8" ?>
<Form version="1.3" maxVersion="1.7" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
<AuxValues>
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/>
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
<AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
<AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
<AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,0,-30,0,0,1,47"/>
</AuxValues>
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
<SubComponents>
<Component class="javax.swing.JLabel" name="lblImage">
<Properties>
<Property name="horizontalAlignment" type="int" value="0"/>
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
<Image iconType="3" name="/com.fr3ts0n.ecu/res/JaVAG_Logo.png"/>
</Property>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
<BorderConstraints direction="Center"/>
</Constraint>
</Constraints>
</Component>
<Container class="javax.swing.JPanel" name="jPanel1">
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
<BorderConstraints direction="First"/>
</Constraint>
</Constraints>
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridLayout">
<Property name="columns" type="int" value="1"/>
<Property name="rows" type="int" value="0"/>
</Layout>
<SubComponents>
<Component class="javax.swing.JLabel" name="lblName">
<Properties>
<Property name="horizontalAlignment" type="int" value="0"/>
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="lblVersion">
<Properties>
<Property name="horizontalAlignment" type="int" value="0"/>
</Properties>
</Component>
</SubComponents>
</Container>
<Component class="javax.swing.JLabel" name="lblCopyright">
<Properties>
<Property name="horizontalAlignment" type="int" value="0"/>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
<BorderConstraints direction="Last"/>
</Constraint>
</Constraints>
</Component>
</SubComponents>
</Form>
@@ -0,0 +1,122 @@
/*
* (C) Copyright 2015 by fr3ts0n <erwin.scheuch-heilig@gmx.at>
*
* 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., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
package com.fr3ts0n.ecu.gui.application;
import javax.swing.Icon;
/**
* @author erwin
*/
public class AboutPanel extends javax.swing.JPanel
{
/** Serial version UID */
private static final long serialVersionUID = -7733037825291372813L;
/** Creates new form AboutPanel */
public AboutPanel()
{
initComponents();
}
/**
* This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents()
{
lblImage = new javax.swing.JLabel();
// Variables declaration - do not modify//GEN-BEGIN:variables
javax.swing.JPanel jPanel1 = new javax.swing.JPanel();
lblName = new javax.swing.JLabel();
lblVersion = new javax.swing.JLabel();
lblCopyright = new javax.swing.JLabel();
setLayout(new java.awt.BorderLayout());
lblImage.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
lblImage.setIcon(new javax.swing.ImageIcon(getClass().getResource("/com/fr3ts0n/ecu/gui/res/JaVAG_Logo.png"))); // NOI18N
add(lblImage, java.awt.BorderLayout.CENTER);
jPanel1.setLayout(new java.awt.GridLayout(0, 1));
lblName.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
jPanel1.add(lblName);
lblVersion.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
jPanel1.add(lblVersion);
add(jPanel1, java.awt.BorderLayout.PAGE_START);
lblCopyright.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
add(lblCopyright, java.awt.BorderLayout.PAGE_END);
}// </editor-fold>//GEN-END:initComponents
/**
* set icon for application about dialog
*
* @param icon icon to show
*/
public void setIcon(Icon icon)
{
lblImage.setIcon(icon);
}
/**
* set application name
*
* @param appName application name
*/
public void setApplicationName(String appName)
{
lblName.setText(appName);
}
/**
* set application version
*
* @param appVersion application version string
*/
public void setApplicationVersion(String appVersion)
{
lblVersion.setText(appVersion);
}
/**
* set copyright string
*
* @param cRightString copyright string
*/
public void setCopyrightString(String cRightString)
{
lblCopyright.setText(cRightString);
}
private javax.swing.JLabel lblCopyright;
private javax.swing.JLabel lblImage;
private javax.swing.JLabel lblName;
private javax.swing.JLabel lblVersion;
// End of variables declaration//GEN-END:variables
}
@@ -0,0 +1,211 @@
<?xml version="1.0" encoding="UTF-8" ?>
<Form version="1.2" maxVersion="1.2" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
<Properties>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Dialog" size="10" style="0"/>
</Property>
<Property name="name" type="java.lang.String" value="DataPanel" noResource="true"/>
</Properties>
<AuxValues>
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/>
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
<AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
<AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,44,0,0,1,-112"/>
</AuxValues>
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
<SubComponents>
<Container class="javax.swing.JSplitPane" name="jSplitPane1">
<Properties>
<Property name="dividerLocation" type="int" value="0"/>
<Property name="dividerSize" type="int" value="8"/>
<Property name="orientation" type="int" value="0"/>
<Property name="resizeWeight" type="double" value="0.5"/>
<Property name="toolTipText" type="java.lang.String" value="Move to show graph display"/>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Dialog" size="10" style="0"/>
</Property>
<Property name="name" type="java.lang.String" value="splitter" noResource="true"/>
<Property name="oneTouchExpandable" type="boolean" value="true"/>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
<BorderConstraints direction="Center"/>
</Constraint>
</Constraints>
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout"/>
<SubComponents>
<Container class="javax.swing.JPanel" name="panGraph">
<Properties>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Dialog" size="10" style="0"/>
</Property>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout$JSplitPaneConstraintsDescription">
<JSplitPaneConstraints position="left"/>
</Constraint>
</Constraints>
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
<SubComponents>
<Component class="com.fr3ts0n.ecu.ObdDataPlotter" name="plotter">
<Properties>
<Property name="toolTipText" type="java.lang.String" value="Select data items in Table to activate graphing"/>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Dialog" size="10" style="0"/>
</Property>
<Property name="name" type="java.lang.String" value="plotter" noResource="true"/>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
<BorderConstraints direction="Center"/>
</Constraint>
</Constraints>
</Component>
<Container class="javax.swing.JPanel" name="jPanel1">
<Properties>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Dialog" size="10" style="0"/>
</Property>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
<BorderConstraints direction="South"/>
</Constraint>
</Constraints>
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
<SubComponents>
<Container class="javax.swing.JPanel" name="jPanel2">
<Properties>
<Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
<Border info="org.netbeans.modules.form.compat2.border.BevelBorderInfo">
<BevelBorder bevelType="1"/>
</Border>
</Property>
<Property name="toolTipText" type="java.lang.String" value="maximum history time in minutes"/>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
<BorderConstraints direction="Center"/>
</Constraint>
</Constraints>
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
<SubComponents>
<Component class="javax.swing.JSlider" name="slGraphTime">
<Properties>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Dialog" size="10" style="0"/>
</Property>
<Property name="maximum" type="int" value="180"/>
<Property name="value" type="int" value="180"/>
</Properties>
<Events>
<EventHandler event="stateChanged" listener="javax.swing.event.ChangeListener" parameters="javax.swing.event.ChangeEvent" handler="slGraphTimeStateChanged"/>
</Events>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="-1" gridY="-1" gridWidth="1" gridHeight="1" fill="1" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="10" weightX="1.0" weightY="0.0"/>
</Constraint>
</Constraints>
</Component>
<Component class="javax.swing.JLabel" name="lblHistTime">
<Properties>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Dialog" size="10" style="0"/>
</Property>
<Property name="horizontalAlignment" type="int" value="4"/>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
<Connection code="String.valueOf(slGraphTime.getValue())+&quot; min&quot;" type="code"/>
</Property>
<Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
<Border info="org.netbeans.modules.form.compat2.border.EmptyBorderInfo">
<EmptyBorder bottom="1" left="3" right="3" top="1"/>
</Border>
</Property>
<Property name="horizontalTextPosition" type="int" value="0"/>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="-1" gridY="-1" gridWidth="1" gridHeight="1" fill="1" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="10" weightX="0.0" weightY="0.0"/>
</Constraint>
</Constraints>
</Component>
</SubComponents>
</Container>
<Component class="javax.swing.JButton" name="btnClearHist">
<Properties>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Dialog" size="10" style="0"/>
</Property>
<Property name="mnemonic" type="int" value="67"/>
<Property name="text" type="java.lang.String" value="Clear History"/>
<Property name="toolTipText" type="java.lang.String" value="Clear history buffer for graphing"/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="btnClearHistActionPerformed"/>
</Events>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
<BorderConstraints direction="East"/>
</Constraint>
</Constraints>
</Component>
</SubComponents>
</Container>
</SubComponents>
</Container>
<Container class="javax.swing.JPanel" name="panTable">
<Properties>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Dialog" size="10" style="0"/>
</Property>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JSplitPaneSupportLayout$JSplitPaneConstraintsDescription">
<JSplitPaneConstraints position="bottom"/>
</Constraint>
</Constraints>
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
<SubComponents>
<Container class="javax.swing.JScrollPane" name="jScrollPane1">
<AuxValues>
<AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
</AuxValues>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
<BorderConstraints direction="Center"/>
</Constraint>
</Constraints>
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
<SubComponents>
<Component class="com.fr3ts0n.pvs.gui.PvTable" name="tblPids">
<Properties>
<Property name="autoResizeMode" type="int" value="5"/>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Dialog" size="10" style="0"/>
</Property>
<Property name="name" type="java.lang.String" value="DataTable" noResource="true"/>
<Property name="showGrid" type="boolean" value="true"/>
<Property name="toolTipText" type="java.lang.String" value="Select items to start graphing"/>
</Properties>
</Component>
</SubComponents>
</Container>
</SubComponents>
</Container>
</SubComponents>
</Container>
</SubComponents>
</Form>
@@ -0,0 +1,416 @@
/*
* (C) Copyright 2015 by fr3ts0n <erwin.scheuch-heilig@gmx.at>
*
* 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., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
package com.fr3ts0n.ecu.gui.application;
import com.fr3ts0n.ecu.EcuDataPv;
import com.fr3ts0n.pvs.ProcessVar;
import com.fr3ts0n.pvs.PvChangeEvent;
import com.fr3ts0n.pvs.PvChangeListener;
import com.fr3ts0n.pvs.PvList;
import org.jfree.data.time.Second;
import org.jfree.data.time.TimeSeries;
import java.util.HashMap;
import java.util.Iterator;
import java.util.logging.Level;
import javax.swing.JPanel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
/**
* Panel to combine tabular- and graphical display for OBD data
*
* @author erwin
*/
public class ObdDataPanel extends JPanel
implements PvChangeListener, ListSelectionListener
{
/**
*
*/
private static final long serialVersionUID = 4441869977997912421L;
// selectable PID's'
HashMap<Object, TimeSeries> selPids = new HashMap<>();
/** Creates new form ObdGraphPanel */
public ObdDataPanel()
{
initComponents();
tblPids.setPvModel(new ObdItemTableModel());
tblPids.getSelectionModel().addListSelectionListener(this);
tblPids.setDefaultRenderer(EcuDataPv.class, new ObdItemTableRenderer());
}
/**
* Creates new form ObdGraphPanel
*
* @param pvList List of Process vars (PIDS) to display
*/
public ObdDataPanel(PvList pvList)
{
initComponents();
tblPids.setPvModel(new ObdItemTableModel());
tblPids.getSelectionModel().addListSelectionListener(this);
tblPids.setDefaultRenderer(EcuDataPv.class, new ObdItemTableRenderer());
setPidPvs(pvList);
}
/**
* This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents()
{
java.awt.GridBagConstraints gridBagConstraints;
javax.swing.JSplitPane jSplitPane1 = new javax.swing.JSplitPane();
JPanel panGraph = new JPanel();
plotter = new com.fr3ts0n.ecu.gui.application.ObdDataPlotter();
JPanel jPanel1 = new JPanel();
JPanel jPanel2 = new JPanel();
slGraphTime = new javax.swing.JSlider();
lblHistTime = new javax.swing.JLabel();
// Variables declaration - do not modify//GEN-BEGIN:variables
javax.swing.JButton btnClearHist = new javax.swing.JButton();
JPanel panTable = new JPanel();
javax.swing.JScrollPane jScrollPane1 = new javax.swing.JScrollPane();
tblPids = new com.fr3ts0n.pvs.gui.PvTable();
setFont(new java.awt.Font("Dialog", 0, 10));
setName("DataPanel"); // NOI18N
setLayout(new java.awt.BorderLayout());
jSplitPane1.setDividerLocation(0);
jSplitPane1.setDividerSize(8);
jSplitPane1.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT);
jSplitPane1.setResizeWeight(0.5);
jSplitPane1.setToolTipText("Move to show graph display");
jSplitPane1.setFont(new java.awt.Font("Dialog", 0, 10));
jSplitPane1.setName("splitter"); // NOI18N
jSplitPane1.setOneTouchExpandable(true);
panGraph.setFont(new java.awt.Font("Dialog", 0, 10));
panGraph.setLayout(new java.awt.BorderLayout());
plotter.setToolTipText("Select data items in Table to activate graphing");
plotter.setFont(new java.awt.Font("Dialog", 0, 10));
plotter.setName("plotter"); // NOI18N
panGraph.add(plotter, java.awt.BorderLayout.CENTER);
jPanel1.setFont(new java.awt.Font("Dialog", 0, 10)); // NOI18N
jPanel1.setLayout(new java.awt.BorderLayout());
jPanel2.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.LOWERED));
jPanel2.setToolTipText("maximum history time in minutes");
jPanel2.setLayout(new java.awt.GridBagLayout());
slGraphTime.setFont(new java.awt.Font("Dialog", 0, 10));
slGraphTime.setMaximum(180);
slGraphTime.setValue(180);
slGraphTime.addChangeListener(new javax.swing.event.ChangeListener()
{
public void stateChanged(javax.swing.event.ChangeEvent evt)
{
slGraphTimeStateChanged();
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.weightx = 1.0;
jPanel2.add(slGraphTime, gridBagConstraints);
lblHistTime.setFont(new java.awt.Font("Dialog", 0, 10));
lblHistTime.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
lblHistTime.setText(String.valueOf(slGraphTime.getValue()) + " min");
lblHistTime.setBorder(javax.swing.BorderFactory.createEmptyBorder(1, 3, 1, 3));
lblHistTime.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
jPanel2.add(lblHistTime, gridBagConstraints);
jPanel1.add(jPanel2, java.awt.BorderLayout.CENTER);
btnClearHist.setFont(new java.awt.Font("Dialog", 0, 10));
btnClearHist.setMnemonic('C');
btnClearHist.setText("Clear History");
btnClearHist.setToolTipText("Clear history buffer for graphing");
btnClearHist.addActionListener(new java.awt.event.ActionListener()
{
public void actionPerformed(java.awt.event.ActionEvent evt)
{
btnClearHistActionPerformed();
}
});
jPanel1.add(btnClearHist, java.awt.BorderLayout.EAST);
panGraph.add(jPanel1, java.awt.BorderLayout.SOUTH);
jSplitPane1.setLeftComponent(panGraph);
panTable.setFont(new java.awt.Font("Dialog", 0, 10));
panTable.setLayout(new java.awt.BorderLayout());
tblPids.setAutoResizeMode(5);
tblPids.setFont(new java.awt.Font("Dialog", 0, 10));
tblPids.setName("DataTable"); // NOI18N
tblPids.setShowGrid(true);
tblPids.setToolTipText("Select items to start graphing");
jScrollPane1.setViewportView(tblPids);
panTable.add(jScrollPane1, java.awt.BorderLayout.CENTER);
jSplitPane1.setBottomComponent(panTable);
add(jSplitPane1, java.awt.BorderLayout.CENTER);
}// </editor-fold>//GEN-END:initComponents
private void btnClearHistActionPerformed()//GEN-FIRST:event_btnClearHistActionPerformed
{//GEN-HEADEREND:event_btnClearHistActionPerformed
TimeSeries ts;
Iterator<TimeSeries> it = selPids.values().iterator();
while (it.hasNext())
{
ts = it.next();
ts.clear();
}
}//GEN-LAST:event_btnClearHistActionPerformed
private void slGraphTimeStateChanged()//GEN-FIRST:event_slGraphTimeStateChanged
{//GEN-HEADEREND:event_slGraphTimeStateChanged
TimeSeries ts;
lblHistTime.setText(String.valueOf(slGraphTime.getValue()) + " min");
if (!slGraphTime.getValueIsAdjusting())
{
Iterator<TimeSeries> it = selPids.values().iterator();
while (it.hasNext())
{
ts = it.next();
ts.setMaximumItemAge(slGraphTime.getValue() * 60);
}
}
}//GEN-LAST:event_slGraphTimeStateChanged
/**
* get readable unique String from PV
*/
private Object getPvId(ProcessVar pv)
{
return (pv.getKeyValue());
}
private javax.swing.JLabel lblHistTime;
private com.fr3ts0n.ecu.gui.application.ObdDataPlotter plotter;
private javax.swing.JSlider slGraphTime;
private com.fr3ts0n.pvs.gui.PvTable tblPids;
// End of variables declaration//GEN-END:variables
/**
* Holds value of property pidPvs.
*/
private PvList pidPvs;
/**
* Getter for property pidPvs.
*
* @return Value of property pidPvs.
*/
public PvList getPidPvs()
{
return this.pidPvs;
}
/**
* Setter for property pidPvs.
*
* @param pidPvs New value of property pidPvs.
*/
@SuppressWarnings("unchecked")
public void setPidPvs(PvList pidPvs)
{
TimeSeries ts;
// if there is an o previous instance registered, unregister ...
if (this.pidPvs != null)
this.pidPvs.removePvChangeListener(this);
this.pidPvs = pidPvs;
tblPids.setProcessVar(pidPvs);
tblPids.setDefaultRenderer(Object.class, new ObdItemTableRenderer());
pidPvs.addPvChangeListener(this);
// update all TimeSeries with PIDs from PV-List
plotter.dataset.removeAllSeries();
selPids.clear();
Iterator<EcuDataPv> it = pidPvs.values().iterator();
while (it.hasNext())
{
EcuDataPv pv = it.next();
// create new data series
ts = new TimeSeries(String.valueOf(pv.get(EcuDataPv.FID_DESCRIPT)));
ts.setDescription(String.valueOf(pv.get(EcuDataPv.FID_DESCRIPT)));
ts.setRangeDescription(String.valueOf(pv.get(EcuDataPv.FID_UNITS)));
// set graph time of new element
ts.setMaximumItemAge(slGraphTime.getValue() * 60);
// and add to selectable PID list
selPids.put(getPvId(pv), ts);
}
updateColumnWidths();
}
/**
* set a new graph title
*
* @param newTitle new graph title
*/
public void setTitle(String newTitle)
{
plotter.setTitle(newTitle);
}
/**
* handle changes in the process var(s)
*
* @param event Process var event to be handled
*/
public void pvChanged(PvChangeEvent event)
{
TimeSeries ts;
EcuDataPv pv;
switch (event.getType())
{
case PvChangeEvent.PV_MODIFIED:
pv = (EcuDataPv) event.getValue();
if ((ts = selPids.get(getPvId(pv))) != null)
try
{
ts.addOrUpdate(new Second(), ((Number)pv.get(EcuDataPv.FID_VALUE)).floatValue());
} catch (Exception e)
{
ProcessVar.log.log(Level.SEVERE, "", e);
}
break;
case PvChangeEvent.PV_DELETED:
// remove from selectable PIDs
pv = (EcuDataPv) event.getValue();
selPids.remove(pv);
break;
case PvChangeEvent.PV_CLEARED:
// remove all from selectable PIDs
selPids.clear();
break;
case PvChangeEvent.PV_ADDED:
if ((event.getValue() instanceof EcuDataPv))
{
pv = (EcuDataPv) event.getValue();
addDataSeries(pv);
} else if ((event.getValue() instanceof Object[]))
{
for (Object currPv : (Object[]) event.getValue())
{
addDataSeries((ProcessVar) currPv);
}
}
break;
}
// update table column widths
updateColumnWidths();
}
private void addDataSeries(ProcessVar pv)
{
TimeSeries ts;
// create new data series
ts = new TimeSeries(String.valueOf(pv.get(EcuDataPv.FID_DESCRIPT)),
null,
String.valueOf(pv.get(EcuDataPv.FID_UNITS)));
// set graph time of new element
ts.setMaximumItemAge(slGraphTime.getValue() * 60);
// and add to selectable PID list
selPids.put(getPvId(pv), ts);
}
/**
* update the column widths of data table
*/
private void updateColumnWidths()
{
if (tblPids.getRowCount() >= 1)
{
/** set column sizes here, since this only works with inserted data */
tblPids.getColumn(EcuDataPv.FIELDS[EcuDataPv.FID_PID]).setPreferredWidth(40);
tblPids.getColumn(EcuDataPv.FIELDS[EcuDataPv.FID_OFS]).setPreferredWidth(40);
tblPids.getColumn(EcuDataPv.FIELDS[EcuDataPv.FID_DESCRIPT]).setPreferredWidth(350);
tblPids.getColumn(EcuDataPv.FIELDS[EcuDataPv.FID_VALUE]).setPreferredWidth(150);
}
}
/**
* update specified column of all available table rows
*
* @param columnId - column id to be updated
*/
public void updateAllTableRows(int columnId)
{
((ObdItemTableModel) tblPids.getPvModel()).updateAllRows();
}
/**
* handle change in table selection
* activate / deactivate graphing of selected data items
*/
public void valueChanged(ListSelectionEvent e)
{
TimeSeries ts;
int[] selIDs;
// clean up dataset
plotter.removeAllSeries();
// get selected items as list of data
// rather than array of ID's'
selIDs = tblPids.getSelectedRows();
for (int i = 0; i < selIDs.length; i++)
{
/* since table model changed, it returns the complete object for any field */
EcuDataPv currPid = (EcuDataPv) tblPids.getModel().getValueAt(selIDs[i], EcuDataPv.FID_PID);
ts = selPids.get(currPid.get(EcuDataPv.FID_PID));
// if Series found
if (ts != null)
{
// add new series to plotter ..
plotter.addSeries(ts);
}
}
}
@Override
public String toString()
{
return (this.getName());
}
}
@@ -0,0 +1,224 @@
/*
* (C) Copyright 2015 by fr3ts0n <erwin.scheuch-heilig@gmx.at>
*
* 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., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
package com.fr3ts0n.ecu.gui.application;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.AxisLocation;
import org.jfree.chart.axis.DateAxis;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.labels.StandardXYToolTipGenerator;
import org.jfree.chart.labels.XYToolTipGenerator;
import org.jfree.chart.plot.DefaultDrawingSupplier;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYItemRenderer;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;
import org.jfree.data.xy.XYDataset;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.Paint;
import java.text.SimpleDateFormat;
import java.util.Iterator;
import javax.swing.JPanel;
/**
* OBD data graphing panel
*/
public class ObdDataPlotter extends JPanel
{
private static final long serialVersionUID = 9085602185360330792L;
/* Font for all legent items */
private static final Font legendFont = new Font("Dialog", 0, 7);
/** generator for all tool tips */
private static final XYToolTipGenerator toolTipGen =
StandardXYToolTipGenerator.getTimeSeriesInstance();
/** switch to use range series per series */
private static final boolean oneRangePerSeries = true;
private int raIndex = 0;
final TimeSeriesCollection dataset = new TimeSeriesCollection();
private JFreeChart chart;
/**
* create the graphing panel
*/
public ObdDataPlotter()
{
setLayout(new BorderLayout());
chart = createChart(dataset);
ChartPanel chartPanel = new ChartPanel(chart);
chartPanel.setMouseZoomable(true, false);
add(chartPanel, BorderLayout.CENTER);
}
/**
* set a new graph title
*
* @param newTitle the frame title.
*/
public void setTitle(String newTitle)
{
chart.setTitle(newTitle);
}
/**
* Creates a chart.
*
* @param dataset a dataset.
* @return A chart.
*/
private JFreeChart createChart(XYDataset dataset)
{
chart = ChartFactory.createTimeSeriesChart(
"OBD Data Graph", // title
"Time", // x-axis label
"Value", // y-axis label
dataset, // data
true, // create legend?
true, // generate tooltips?
false // generate URLs?
);
chart.setBackgroundPaint(Color.white);
XYPlot plot = (XYPlot) chart.getPlot();
plot.setBackgroundPaint(Color.lightGray);
plot.setDomainGridlinePaint(Color.white);
plot.setRangeGridlinePaint(Color.white);
plot.setDomainCrosshairVisible(true);
plot.setRangeCrosshairVisible(true);
plot.getDomainAxis().setTickLabelFont(legendFont);
DateAxis axis = (DateAxis) plot.getDomainAxis();
axis.setDateFormatOverride(new SimpleDateFormat("HH:mm:ss"));
chart.getLegend().setItemFont(legendFont);
return chart;
}
/**
* remove all data series from graph object
*/
public synchronized void removeAllSeries()
{
dataset.removeAllSeries();
if (oneRangePerSeries)
{
XYPlot plot = (XYPlot) chart.getPlot();
for (; raIndex > 0; raIndex--)
{
plot.setDataset(raIndex, null);
plot.setRenderer(raIndex, null);
plot.setRangeAxis(raIndex, null);
}
plot.setDataset(dataset);
}
}
/**
* add a new series to the graph
*
* @param series The new series to be added
*/
public synchronized void addSeries(TimeSeries series)
{
if (oneRangePerSeries)
{
// get paint for current axis/range/...
Paint currPaint =
DefaultDrawingSupplier.DEFAULT_PAINT_SEQUENCE[
raIndex % DefaultDrawingSupplier.DEFAULT_PAINT_SEQUENCE.length];
XYPlot plot = (XYPlot) chart.getPlot();
// set dataset
plot.setDataset(raIndex, new TimeSeriesCollection(series));
// ** set axis
NumberAxis axis = new NumberAxis();
axis.setTickLabelFont(legendFont);
axis.setAxisLinePaint(currPaint);
axis.setTickLabelPaint(currPaint);
axis.setTickMarkPaint(currPaint);
// ** set axis in plot
plot.setRangeAxis(raIndex, axis);
plot.setRangeAxisLocation(raIndex, raIndex % 2 == 0 ? AxisLocation.TOP_OR_LEFT : AxisLocation.BOTTOM_OR_RIGHT);
plot.mapDatasetToRangeAxis(raIndex, raIndex);
// ** create renderer
XYItemRenderer renderer = new XYLineAndShapeRenderer(true, false);
renderer.setBaseToolTipGenerator(toolTipGen);
renderer.setSeriesPaint(0, currPaint);
// ** set renderer in plot
plot.setRenderer(raIndex, renderer);
raIndex++;
}
dataset.addSeries(series);
}
/**
* Holds value of property graphTime.
*/
private int graphTime;
/**
* Getter for property graphTime.
*
* @return Value of property graphTime.
*/
public int getGraphTime()
{
return this.graphTime;
}
/**
* Setter for property graphTime.
*
* @param graphTime New value of property graphTime.
*/
@SuppressWarnings("rawtypes")
public synchronized void setGraphTime(int graphTime)
{
TimeSeries currSer;
TimeSeriesCollection currDs;
XYPlot currPlot = (XYPlot) chart.getPlot();
this.graphTime = graphTime;
// lop through all datasets
for (int i = currPlot.getDatasetCount(); i >= 0; --i)
{
currDs = (TimeSeriesCollection) currPlot.getDataset(i);
// Update all series within dataset
Iterator it = currDs.getSeries().iterator();
while (it.hasNext())
{
currSer = (TimeSeries) it.next();
currSer.setMaximumItemAge(graphTime);
}
}
}
}
@@ -0,0 +1,228 @@
<?xml version="1.0" encoding="UTF-8" ?>
<Form version="1.2" maxVersion="1.2" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
<AuxValues>
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/>
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
<AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
<AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,44,0,0,1,-81"/>
</AuxValues>
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
<SubComponents>
<Container class="javax.swing.JPanel" name="panHeader">
<Properties>
<Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
<Color blue="ff" green="ff" red="ff" type="rgb"/>
</Property>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
<BorderConstraints direction="North"/>
</Constraint>
</Constraints>
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout">
<Property name="horizontalGap" type="int" value="10"/>
<Property name="verticalGap" type="int" value="10"/>
</Layout>
<SubComponents>
<Component class="javax.swing.JLabel" name="lblCodeType">
<Properties>
<Property name="horizontalAlignment" type="int" value="0"/>
<Property name="text" type="java.lang.String" value="Trouble codes"/>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
<BorderConstraints direction="Center"/>
</Constraint>
</Constraints>
</Component>
<Component class="javax.swing.JLabel" name="lblMil">
<Properties>
<Property name="horizontalAlignment" type="int" value="0"/>
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
<Connection code="icoMilOff" type="code"/>
</Property>
<Property name="horizontalTextPosition" type="int" value="4"/>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
<BorderConstraints direction="West"/>
</Constraint>
</Constraints>
</Component>
<Component class="javax.swing.JLabel" name="lblMil1">
<Properties>
<Property name="horizontalAlignment" type="int" value="0"/>
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
<Connection code="icoMilOff" type="code"/>
</Property>
<Property name="horizontalTextPosition" type="int" value="2"/>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
<BorderConstraints direction="East"/>
</Constraint>
</Constraints>
</Component>
<Component class="javax.swing.JLabel" name="lblNumCodes">
<Properties>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Dialog" size="10" style="0"/>
</Property>
<Property name="horizontalAlignment" type="int" value="0"/>
<Property name="text" type="java.lang.String" value="0 Trouble codes set"/>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
<BorderConstraints direction="South"/>
</Constraint>
</Constraints>
</Component>
</SubComponents>
</Container>
<Container class="javax.swing.JPanel" name="panFooter">
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
<BorderConstraints direction="South"/>
</Constraint>
</Constraints>
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
<SubComponents>
<Component class="javax.swing.JButton" name="btnReadCodes">
<Properties>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Dialog" size="10" style="0"/>
</Property>
<Property name="mnemonic" type="int" value="82"/>
<Property name="text" type="java.lang.String" value="Read Codes"/>
<Property name="toolTipText" type="java.lang.String" value="Read all truble codes (Mode $3)"/>
<Property name="actionCommand" type="java.lang.String" value="ReadCodes"/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="btnReadCodesActionPerformed"/>
</Events>
<AuxValues>
<AuxValue name="JavaCodeGenerator_VariableModifier" type="java.lang.Integer" value="4"/>
</AuxValues>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="-1" gridY="-1" gridWidth="1" gridHeight="1" fill="1" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="10" weightX="1.0" weightY="0.0"/>
</Constraint>
</Constraints>
</Component>
<Component class="javax.swing.JButton" name="btnReadPending">
<Properties>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Dialog" size="10" style="0"/>
</Property>
<Property name="mnemonic" type="int" value="80"/>
<Property name="text" type="java.lang.String" value="Read Pending"/>
<Property name="toolTipText" type="java.lang.String" value="Read pending fault codes (Mode $7)"/>
<Property name="actionCommand" type="java.lang.String" value="ReadPending"/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="btnReadPendingActionPerformed"/>
</Events>
<AuxValues>
<AuxValue name="JavaCodeGenerator_VariableModifier" type="java.lang.Integer" value="4"/>
</AuxValues>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="-1" gridY="-1" gridWidth="1" gridHeight="1" fill="1" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="10" weightX="1.0" weightY="0.0"/>
</Constraint>
</Constraints>
</Component>
<Component class="javax.swing.JButton" name="btnReadPermanent">
<Properties>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Dialog" size="10" style="0"/>
</Property>
<Property name="mnemonic" type="int" value="101"/>
<Property name="text" type="java.lang.String" value="Read Permanent"/>
<Property name="toolTipText" type="java.lang.String" value="Read permanent Trouble codes (Mode $A)"/>
<Property name="actionCommand" type="java.lang.String" value="ReadPermanent"/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="btnReadPermanentActionPerformed"/>
</Events>
<AuxValues>
<AuxValue name="JavaCodeGenerator_VariableModifier" type="java.lang.Integer" value="4"/>
</AuxValues>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="-1" gridY="-1" gridWidth="1" gridHeight="1" fill="1" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="10" weightX="1.0" weightY="0.0"/>
</Constraint>
</Constraints>
</Component>
<Component class="javax.swing.JButton" name="btnClearCodes">
<Properties>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Dialog" size="10" style="0"/>
</Property>
<Property name="mnemonic" type="int" value="67"/>
<Property name="text" type="java.lang.String" value="Clear Codes"/>
<Property name="toolTipText" type="java.lang.String" value="Clear troble codes (Mode $4)"/>
<Property name="actionCommand" type="java.lang.String" value="ClearCodes"/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="btnClearCodesActionPerformed"/>
</Events>
<AuxValues>
<AuxValue name="JavaCodeGenerator_VariableModifier" type="java.lang.Integer" value="4"/>
</AuxValues>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="-1" gridY="-1" gridWidth="1" gridHeight="1" fill="1" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="10" weightX="1.0" weightY="0.0"/>
</Constraint>
</Constraints>
</Component>
</SubComponents>
</Container>
<Container class="javax.swing.JPanel" name="panCenter">
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
<BorderConstraints direction="Center"/>
</Constraint>
</Constraints>
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
<SubComponents>
<Container class="javax.swing.JScrollPane" name="jScrollPane1">
<AuxValues>
<AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
</AuxValues>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
<BorderConstraints direction="Center"/>
</Constraint>
</Constraints>
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
<SubComponents>
<Component class="com.fr3ts0n.pvs.gui.PvTable" name="tblFCodes">
<Properties>
<Property name="autoResizeMode" type="int" value="5"/>
<Property name="name" type="java.lang.String" value="CodeTable" noResource="true"/>
</Properties>
</Component>
</SubComponents>
</Container>
<Component class="com.fr3ts0n.ecu.VagCodeStatPanel" name="panStatus">
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
<BorderConstraints direction="South"/>
</Constraint>
</Constraints>
</Component>
</SubComponents>
</Container>
</SubComponents>
</Form>
@@ -0,0 +1,416 @@
/*
* (C) Copyright 2015 by fr3ts0n <erwin.scheuch-heilig@gmx.at>
*
* 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., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
package com.fr3ts0n.ecu.gui.application;
import com.fr3ts0n.ecu.EcuCodeItem;
import com.fr3ts0n.ecu.ObdCodeItem;
import com.fr3ts0n.pvs.PvChangeEvent;
import com.fr3ts0n.pvs.PvChangeListener;
import com.fr3ts0n.pvs.PvList;
import java.awt.Color;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeListener;
import javax.swing.ImageIcon;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
/**
* GUI Panel to control reading/clearing OBD failure codes
*
* @author erwin
*/
public class ObdDtcPanel extends JPanel
implements PropertyChangeListener, PvChangeListener
{
/** serial version UID * */
private static final long serialVersionUID = -1285434908785275242L;
/** icons */
private final ImageIcon icoMilOff = new javax.swing.ImageIcon(getClass().getResource("/com/fr3ts0n/ecu/gui/res/mil_off.png"));
private final ImageIcon icoMilOn = new javax.swing.ImageIcon(getClass().getResource("/com/fr3ts0n/ecu/gui/res/mil_on.png"));
/** milStatus */
private boolean milStatus = false;
/** Creates new form ObdDfcPanel */
public ObdDtcPanel()
{
initComponents();
panStatus.setVisible(false);
tblFCodes.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
tblFCodes.getSelectionModel().addListSelectionListener(new ListSelectionListener()
{
public void valueChanged(ListSelectionEvent e)
{
Integer stat = null;
int selIdx = tblFCodes.getSelectedRow();
if (selIdx >= 0)
stat = (Integer) tblFCodes.getModel().getValueAt(selIdx, EcuCodeItem.FID_STATUS);
panStatus.setVisible(stat != null);
if (stat != null)
{
panStatus.setStatusFlags(stat.intValue());
}
}
});
}
/**
* This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents()
{
java.awt.GridBagConstraints gridBagConstraints;
JPanel panHeader = new JPanel();
lblCodeType = new javax.swing.JLabel();
lblMil = new javax.swing.JLabel();
lblMil1 = new javax.swing.JLabel();
lblNumCodes = new javax.swing.JLabel();
JPanel panFooter = new JPanel();
btnReadCodes = new javax.swing.JButton();
btnReadPending = new javax.swing.JButton();
btnReadPermanent = new javax.swing.JButton();
btnClearCodes = new javax.swing.JButton();
JPanel panCenter = new JPanel();
javax.swing.JScrollPane jScrollPane1 = new javax.swing.JScrollPane();
tblFCodes = new com.fr3ts0n.pvs.gui.PvTable();
panStatus = new com.fr3ts0n.ecu.gui.application.VagCodeStatPanel();
setLayout(new java.awt.BorderLayout());
panHeader.setBackground(new java.awt.Color(255, 255, 255));
panHeader.setLayout(new java.awt.BorderLayout(10, 10));
lblCodeType.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
lblCodeType.setText("Trouble codes");
panHeader.add(lblCodeType, java.awt.BorderLayout.CENTER);
lblMil.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
lblMil.setIcon(icoMilOff);
lblMil.setHorizontalTextPosition(javax.swing.SwingConstants.RIGHT);
panHeader.add(lblMil, java.awt.BorderLayout.WEST);
lblMil1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
lblMil1.setIcon(icoMilOff);
lblMil1.setHorizontalTextPosition(javax.swing.SwingConstants.LEFT);
panHeader.add(lblMil1, java.awt.BorderLayout.EAST);
lblNumCodes.setFont(new java.awt.Font("Dialog", 0, 10));
lblNumCodes.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
lblNumCodes.setText("0 Trouble codes set");
panHeader.add(lblNumCodes, java.awt.BorderLayout.SOUTH);
add(panHeader, java.awt.BorderLayout.NORTH);
panFooter.setLayout(new java.awt.GridBagLayout());
btnReadCodes.setFont(new java.awt.Font("Dialog", 0, 10));
btnReadCodes.setMnemonic('R');
btnReadCodes.setText("Read Codes");
btnReadCodes.setToolTipText("Read all truble codes (Mode $3)");
btnReadCodes.setActionCommand("ReadCodes");
btnReadCodes.addActionListener(new java.awt.event.ActionListener()
{
public void actionPerformed(java.awt.event.ActionEvent evt)
{
btnReadCodesActionPerformed();
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.weightx = 1.0;
panFooter.add(btnReadCodes, gridBagConstraints);
btnReadPending.setFont(new java.awt.Font("Dialog", 0, 10));
btnReadPending.setMnemonic('P');
btnReadPending.setText("Read Pending");
btnReadPending.setToolTipText("Read pending fault codes (Mode $7)");
btnReadPending.setActionCommand("ReadPending");
btnReadPending.addActionListener(new java.awt.event.ActionListener()
{
public void actionPerformed(java.awt.event.ActionEvent evt)
{
btnReadPendingActionPerformed();
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.weightx = 1.0;
panFooter.add(btnReadPending, gridBagConstraints);
btnReadPermanent.setFont(new java.awt.Font("Dialog", 0, 10));
btnReadPermanent.setMnemonic('e');
btnReadPermanent.setText("Read Permanent");
btnReadPermanent.setToolTipText("Read permanent Trouble codes (Mode $A)");
btnReadPermanent.setActionCommand("ReadPermanent");
btnReadPermanent.addActionListener(new java.awt.event.ActionListener()
{
public void actionPerformed(java.awt.event.ActionEvent evt)
{
btnReadPermanentActionPerformed();
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.weightx = 1.0;
panFooter.add(btnReadPermanent, gridBagConstraints);
btnClearCodes.setFont(new java.awt.Font("Dialog", 0, 10));
btnClearCodes.setMnemonic('C');
btnClearCodes.setText("Clear Codes");
btnClearCodes.setToolTipText("Clear troble codes (Mode $4)");
btnClearCodes.setActionCommand("ClearCodes");
btnClearCodes.addActionListener(new java.awt.event.ActionListener()
{
public void actionPerformed(java.awt.event.ActionEvent evt)
{
btnClearCodesActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.weightx = 1.0;
panFooter.add(btnClearCodes, gridBagConstraints);
add(panFooter, java.awt.BorderLayout.SOUTH);
panCenter.setLayout(new java.awt.BorderLayout());
tblFCodes.setAutoResizeMode(5);
tblFCodes.setName("CodeTable"); // NOI18N
jScrollPane1.setViewportView(tblFCodes);
panCenter.add(jScrollPane1, java.awt.BorderLayout.CENTER);
panCenter.add(panStatus, java.awt.BorderLayout.SOUTH);
add(panCenter, java.awt.BorderLayout.CENTER);
}// </editor-fold>//GEN-END:initComponents
private void btnReadPendingActionPerformed()//GEN-FIRST:event_btnReadPendingActionPerformed
{//GEN-HEADEREND:event_btnReadPendingActionPerformed
lblCodeType.setText("Pending trouble codes");
}//GEN-LAST:event_btnReadPendingActionPerformed
private void btnClearCodesActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_btnClearCodesActionPerformed
{//GEN-HEADEREND:event_btnClearCodesActionPerformed
if (JOptionPane.showConfirmDialog(this,
"This will reset the MIL and clear all emission-related diagnostic\n"
+ " information, including:\n\n"
+ " - Diagnostic trouble codes\n"
+ " - Freeze frame data\n"
+ " - Oxygen sensor com.fr3ts0n.test data\n"
+ " - Status of system monitoring tests\n"
+ " - On-board monitoring tests results\n"
+ " - Distance travelled while MIL activated\n"
+ " - Number of warm-ups since DTCs cleared\n"
+ " - Distance travelled since DTCs cleared\n"
+ " - Engine run time while MIL activated\n"
+ " - Time since DTCs cleared\n\n"
+ "Other manufacturer-specific 'clearing/resetting' actions may occur.\n"
+ "The loss of data may cause the vehicle to run poorly for a short \n"
+ "period of time while the ECU recalibrates itself.",
"Clear codes?",
JOptionPane.YES_NO_OPTION,
JOptionPane.WARNING_MESSAGE) != JOptionPane.YES_OPTION)
evt.setSource(null);
}//GEN-LAST:event_btnClearCodesActionPerformed
private void btnReadCodesActionPerformed()//GEN-FIRST:event_btnReadCodesActionPerformed
{//GEN-HEADEREND:event_btnReadCodesActionPerformed
lblCodeType.setText("Stored trouble codes");
}//GEN-LAST:event_btnReadCodesActionPerformed
private void btnReadPermanentActionPerformed()
{//GEN-FIRST:event_btnReadPermanentActionPerformed
lblCodeType.setText("Permanent trouble codes");
}//GEN-LAST:event_btnReadPermanentActionPerformed
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton btnClearCodes;
private javax.swing.JButton btnReadCodes;
javax.swing.JButton btnReadPending;
javax.swing.JButton btnReadPermanent;
private javax.swing.JLabel lblCodeType;
private javax.swing.JLabel lblMil;
private javax.swing.JLabel lblMil1;
private javax.swing.JLabel lblNumCodes;
private com.fr3ts0n.ecu.gui.application.VagCodeStatPanel panStatus;
private com.fr3ts0n.pvs.gui.PvTable tblFCodes;
// End of variables declaration//GEN-END:variables
public boolean getMilStatus()
{
return (milStatus);
}
private void setMilStatus(boolean newStatus)
{
milStatus = newStatus;
// set the MIL-status display
String msg = milStatus ? "MIL is ON" : "MIL is OFF";
ImageIcon icn = milStatus ? icoMilOn : icoMilOff;
Color clr = milStatus ? Color.RED : Color.GREEN;
lblMil.setIcon(icn);
lblMil.setText(msg);
lblMil.setToolTipText(msg);
lblMil.setForeground(clr);
lblMil1.setIcon(icn);
lblMil1.setText(msg);
lblMil1.setToolTipText(msg);
lblMil1.setForeground(clr);
}
/**
* Holds value of property tcList.
*/
private PvList tcList;
/**
* Holds value of property numCodes.
*/
private int numCodes;
/**
* Getter for property pvList.
*
* @return Value of property pvList.
*/
public PvList getTcList()
{
return this.tcList;
}
/**
* Setter for trouble code list
*
* @param tcList New value of trouble code list.
*/
public void setTcList(PvList tcList)
{
this.tcList = tcList;
// set the process var list of the table
tblFCodes.setProcessVar(tcList);
tcList.addPvChangeListener(this);
updateColumnWidths();
}
/**
* Getter for property numCodes.
*
* @return Value of property numCodes.
*/
public int getNumCodes()
{
return this.numCodes;
}
/**
* Setter for property numCodes.
*
* @param numCodes New value of property numCodes.
*/
private void setNumCodes(int numCodes)
{
this.numCodes = numCodes & 0x7F;
setMilStatus((numCodes & 0x80) != 0);
lblNumCodes.setText(this.numCodes + " Trouble codes set");
}
/**
* update the column widths of data table
*/
private void updateColumnWidths()
{
if (tcList.size() > 0)
{
/** set column sizes here, since this only works with inserted data */
tblFCodes.getColumn(ObdCodeItem.FIELDS[ObdCodeItem.FID_CODE]).setPreferredWidth(40);
tblFCodes.getColumn(ObdCodeItem.FIELDS[ObdCodeItem.FID_DESCRIPT]).setPreferredWidth(330);
}
}
/**
* This method gets called when a bound property is changed.
*
* @param evt A PropertyChangeEvent object describing the event source
* and the property that has changed.
*/
public void propertyChange(java.beans.PropertyChangeEvent evt)
{
if (evt.getPropertyName().equals("numCodes"))
{
setNumCodes(((Integer) evt.getNewValue()).intValue());
}
}
/**
* special handling of changes in displayed code list
*
* @param event Event to be handled
*/
public void pvChanged(PvChangeEvent event)
{
switch (event.getType())
{
/* update column width on added lines, since this only works with
* tables containing at least one row of data
*/
case PvChangeEvent.PV_ADDED:
updateColumnWidths();
break;
}
}
/**
* Add actionListener to all action sources on panel
*
* @param al ActionListener to be registered
*/
public void addActionListener(ActionListener al)
{
btnClearCodes.addActionListener(al);
btnReadCodes.addActionListener(al);
btnReadPending.addActionListener(al);
btnReadPermanent.addActionListener(al);
}
/**
* Remove actionListener from all action sources on panel
*
* @param al ActionListener to be registered
*/
public void removeActionListener(ActionListener al)
{
btnClearCodes.removeActionListener(al);
btnReadCodes.removeActionListener(al);
btnReadPending.removeActionListener(al);
btnReadPermanent.removeActionListener(al);
}
}
@@ -0,0 +1,88 @@
/*
* (C) Copyright 2015 by fr3ts0n <erwin.scheuch-heilig@gmx.at>
*
* 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., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
package com.fr3ts0n.ecu.gui.application;
import java.io.File;
import javax.swing.filechooser.FileFilter;
/**
* File filter for saving/loading OBD files
*
* @author erwin
*/
class ObdFileFilter extends FileFilter
{
private static final String[] FLT_EXTENSIONS =
{
"obd",
};
private static final String FLT_DESCRIPTION = "OBD Files";
/** Creates a new instance of ObdFileFilter */
public ObdFileFilter()
{
}
/**
* Return the extension portion of the file's name .
*
* @param f file to get extension for
* @return file extension
* @see #getExtension
* @see FileFilter#accept
*/
private String getExtension(File f)
{
if (f != null)
{
String filename = f.getName();
int i = filename.lastIndexOf('.');
if (i > 0 && i < filename.length() - 1)
{
return filename.substring(i + 1);
}
}
return null;
}
/**
* Whether the given file is accepted by this filter.
*/
public boolean accept(java.io.File f)
{
boolean result = f.isDirectory();
String ext = getExtension(f);
for (int i = 0; !result && i < FLT_EXTENSIONS.length; i++)
result |= FLT_EXTENSIONS[i].equalsIgnoreCase(ext);
return (result);
}
/**
* The description of this filter. For example: "JPG and GIF Images"
*
* @return description of filter (to be used within file chooser ...)
*/
public String getDescription()
{
return (FLT_DESCRIPTION);
}
}
@@ -0,0 +1,79 @@
/*
* (C) Copyright 2015 by fr3ts0n <erwin.scheuch-heilig@gmx.at>
*
* 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., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
package com.fr3ts0n.ecu.gui.application;
import com.fr3ts0n.pvs.IndexedProcessVar;
import com.fr3ts0n.pvs.gui.PvTableModel;
/**
* TableModel for OBD data items
*
* @author erwin
*/
public class ObdItemTableModel
extends PvTableModel
{
/** used for caching current row */
private int currRowIndex = -1;
/**
*
*/
private static final long serialVersionUID = -1162610644870557702L;
/** Creates a new instance of ObdItemTableModel */
public ObdItemTableModel()
{
}
/**
* get the value for table location (x,y)
* This implementation returns the complete OBD-Item which represents the complete row
* the field handling shall be done by the renderer, since the OBD-item
* also includes formatting information which is required for rendering.
*
* @param rowIndex row number
* @param columnIndex column number
* @return value for table location
*/
@Override
public Object getValueAt(int rowIndex, int columnIndex)
{
// if the pv is set ...
if (pv != null)
{
// get the column value
if (rowIndex != currRowIndex && rowIndex < getRowCount())
{
currRowIndex = rowIndex;
currRow = (IndexedProcessVar) pv.get(keys[rowIndex]);
}
}
return (currRow);
}
/**
* fire update events for specified column on all rows
*
*/
public synchronized void updateAllRows()
{
fireTableRowsUpdated(0, getRowCount());
}
}
@@ -0,0 +1,159 @@
/*
* (C) Copyright 2015 by fr3ts0n <erwin.scheuch-heilig@gmx.at>
*
* 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., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
package com.fr3ts0n.ecu.gui.application;
import com.fr3ts0n.ecu.Conversion;
import com.fr3ts0n.ecu.EcuDataItem;
import com.fr3ts0n.ecu.EcuDataPv;
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.border.EmptyBorder;
import javax.swing.table.TableCellRenderer;
/**
* Renderer for EcuDataPv Elements
*
* @author erwin
*/
public class ObdItemTableRenderer
extends JLabel
implements TableCellRenderer
{
private static final long serialVersionUID = -1067775643797324582L;
private static final EmptyBorder brdr = new EmptyBorder(0, 5, 0, 5);
private Font parentFont = null;
private Color bgColor = null;
private Color selColor = null;
private JTable parentTable = null;
/** Creates a new instance of ObdItemTableRenderer */
public ObdItemTableRenderer()
{
setOpaque(true);
setBorder(brdr);
}
/**
* set visualisation parameters referring to given table
*
* @param table
* - the table object to refer to ...
*/
private void setParentTable(JTable table)
{
parentTable = table;
// set the font only once, and then just use it
parentFont = table.getFont();
setFont(parentFont);
// get background color from Table
bgColor = table.getBackground();
// get selection color from Table
selColor = table.getSelectionBackground();
}
public Component getTableCellRendererComponent(JTable table,
Object value,
boolean isSelected,
boolean hasFocus,
int row,
int column)
{
String fmtText = null;
// if we don't know the parent table yet, set visual parameters
if (parentTable == null)
setParentTable(table);
// background is dependent on selection status
setBackground(isSelected ? selColor : bgColor);
// if row is valid ...
if (value != null)
{
// get column value
Object colVal = ((EcuDataPv) value).get(column);
if (colVal != null)
{
try
{
// formatting is based on column ...
switch (column)
{
case EcuDataPv.FID_PID:
setHorizontalAlignment(RIGHT);
fmtText = String.format("%02X", colVal);
break;
case EcuDataPv.FID_OFS:
setHorizontalAlignment(RIGHT);
fmtText = String.valueOf(colVal);
break;
case EcuDataPv.FID_VALUE:
case EcuDataPv.FID_UNITS:
EcuDataPv currPv = (EcuDataPv) value;
Object cnvObj = currPv.get(EcuDataPv.FID_CNVID);
if (cnvObj instanceof Conversion[]
&& ((Conversion[]) cnvObj)[EcuDataItem.cnvSystem] != null)
{
Conversion cnv;
cnv = ((Conversion[]) cnvObj)[EcuDataItem.cnvSystem];
if (column == EcuDataPv.FID_VALUE)
{
setHorizontalAlignment(RIGHT);
// formated data
fmtText = cnv.physToPhysFmtString((Number) colVal,
(String) currPv.get(EcuDataPv.FID_FORMAT));
}
else
{
setHorizontalAlignment(LEFT);
// formated units
fmtText = cnv.getUnits();
}
}
else
{
fmtText = String.valueOf(colVal);
}
break;
default:
setHorizontalAlignment(LEFT);
fmtText = String.valueOf(colVal);
break;
}
} catch (Exception ex)
{
fmtText = String.valueOf(colVal);
}
}
}
setText(fmtText);
return this;
}
}
@@ -0,0 +1,411 @@
<?xml version="1.0" encoding="UTF-8" ?>
<Form version="1.2" maxVersion="1.2" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
<NonVisualComponents>
<Component class="javax.swing.JFileChooser" name="fChoose">
<Properties>
<Property name="fileFilter" type="javax.swing.filechooser.FileFilter" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
<Connection code="new ObdFileFilter()" type="code"/>
</Property>
<Property name="fileSelectionMode" type="int" value="2"/>
</Properties>
</Component>
<Menu class="javax.swing.JMenuBar" name="mbMain">
<Properties>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Dialog" size="10" style="0"/>
</Property>
</Properties>
<SubComponents>
<Menu class="javax.swing.JMenu" name="mnuFile">
<Properties>
<Property name="mnemonic" type="int" value="70"/>
<Property name="text" type="java.lang.String" value="File"/>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Dialog" size="10" style="0"/>
</Property>
</Properties>
<SubComponents>
<MenuItem class="javax.swing.JMenuItem" name="miLoad">
<Properties>
<Property name="accelerator" type="javax.swing.KeyStroke" editor="org.netbeans.modules.form.editors.KeyStrokeEditor">
<KeyStroke key="F3"/>
</Property>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Dialog" size="10" style="0"/>
</Property>
<Property name="mnemonic" type="int" value="76"/>
<Property name="text" type="java.lang.String" value="Load measurement"/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="miLoadActionPerformed"/>
</Events>
</MenuItem>
<MenuItem class="javax.swing.JMenuItem" name="miSave">
<Properties>
<Property name="accelerator" type="javax.swing.KeyStroke" editor="org.netbeans.modules.form.editors.KeyStrokeEditor">
<KeyStroke key="F4"/>
</Property>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Dialog" size="10" style="0"/>
</Property>
<Property name="mnemonic" type="int" value="83"/>
<Property name="text" type="java.lang.String" value="Save measurement"/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="miSaveActionPerformed"/>
</Events>
</MenuItem>
</SubComponents>
</Menu>
<Menu class="javax.swing.JMenu" name="mnuComm">
<Properties>
<Property name="mnemonic" type="int" value="67"/>
<Property name="text" type="java.lang.String" value="Communication"/>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Dialog" size="10" style="0"/>
</Property>
</Properties>
<SubComponents>
<MenuItem class="javax.swing.JMenuItem" name="miCommConfigure">
<Properties>
<Property name="accelerator" type="javax.swing.KeyStroke" editor="org.netbeans.modules.form.editors.KeyStrokeEditor">
<KeyStroke key="F8"/>
</Property>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Dialog" size="10" style="0"/>
</Property>
<Property name="mnemonic" type="int" value="67"/>
<Property name="text" type="java.lang.String" value="Port Configuration..."/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="miCommConfigureActionPerformed"/>
</Events>
</MenuItem>
<MenuItem class="javax.swing.JMenuItem" name="miCommInit">
<Properties>
<Property name="accelerator" type="javax.swing.KeyStroke" editor="org.netbeans.modules.form.editors.KeyStrokeEditor">
<KeyStroke key="F5"/>
</Property>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Dialog" size="10" style="0"/>
</Property>
<Property name="mnemonic" type="int" value="73"/>
<Property name="text" type="java.lang.String" value="Initialize"/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="miCommInitActionPerformed"/>
</Events>
</MenuItem>
<MenuItem class="javax.swing.JMenuItem" name="miCommStart">
<Properties>
<Property name="accelerator" type="javax.swing.KeyStroke" editor="org.netbeans.modules.form.editors.KeyStrokeEditor">
<KeyStroke key="F11"/>
</Property>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Dialog" size="10" style="0"/>
</Property>
<Property name="mnemonic" type="int" value="83"/>
<Property name="text" type="java.lang.String" value="Start"/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="miCommStartActionPerformed"/>
</Events>
</MenuItem>
<MenuItem class="javax.swing.JMenuItem" name="miCommStop">
<Properties>
<Property name="accelerator" type="javax.swing.KeyStroke" editor="org.netbeans.modules.form.editors.KeyStrokeEditor">
<KeyStroke key="F9"/>
</Property>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Dialog" size="10" style="0"/>
</Property>
<Property name="mnemonic" type="int" value="112"/>
<Property name="text" type="java.lang.String" value="Stop"/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="miCommStopActionPerformed"/>
</Events>
</MenuItem>
</SubComponents>
</Menu>
</SubComponents>
</Menu>
</NonVisualComponents>
<Properties>
<Property name="defaultCloseOperation" type="int" value="3"/>
<Property name="title" type="java.lang.String" value="JObdScanTool"/>
</Properties>
<SyntheticProperties>
<SyntheticProperty name="menuBar" type="java.lang.String" value="mbMain"/>
<SyntheticProperty name="formSizePolicy" type="int" value="1"/>
</SyntheticProperties>
<AuxValues>
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/>
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="1"/>
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
<AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,-100,0,0,1,-54"/>
</AuxValues>
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
<SubComponents>
<Container class="javax.swing.JTabbedPane" name="tabMain">
<Properties>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Dialog" size="10" style="0"/>
</Property>
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[520, 350]"/>
</Property>
</Properties>
<Events>
<EventHandler event="stateChanged" listener="javax.swing.event.ChangeListener" parameters="javax.swing.event.ChangeEvent" handler="tabMainStateChanged"/>
</Events>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
<BorderConstraints direction="Center"/>
</Constraint>
</Constraints>
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout"/>
<SubComponents>
<Container class="javax.swing.JPanel" name="panStart">
<Properties>
<Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
<Color blue="ff" green="ff" red="ff" type="rgb"/>
</Property>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription">
<JTabbedPaneConstraints tabName="About">
<Property name="tabTitle" type="java.lang.String" value="About"/>
</JTabbedPaneConstraints>
</Constraint>
</Constraints>
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
<SubComponents>
<Component class="javax.swing.JLabel" name="lblTitle">
<Properties>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Dialog" size="18" style="1"/>
</Property>
<Property name="horizontalAlignment" type="int" value="0"/>
<Property name="text" type="java.lang.String" value="Java OBD ScanTool"/>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
<BorderConstraints direction="North"/>
</Constraint>
</Constraints>
</Component>
<Component class="javax.swing.JLabel" name="lblFooter">
<Properties>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Dialog" size="10" style="0"/>
</Property>
<Property name="horizontalAlignment" type="int" value="0"/>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
<Connection code="copyright" type="code"/>
</Property>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
<BorderConstraints direction="South"/>
</Constraint>
</Constraints>
</Component>
<Container class="javax.swing.JPanel" name="jPanel1">
<Properties>
<Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
<Color blue="ff" green="ff" red="ff" type="rgb"/>
</Property>
<Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
<Border info="org.netbeans.modules.form.compat2.border.EmptyBorderInfo">
<EmptyBorder bottom="20" left="10" right="10" top="20"/>
</Border>
</Property>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
<BorderConstraints direction="Center"/>
</Constraint>
</Constraints>
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridLayout">
<Property name="columns" type="int" value="0"/>
<Property name="rows" type="int" value="2"/>
</Layout>
<SubComponents>
<Component class="com.fr3ts0n.pvs.gui.PvTable" name="TblVehIDs">
<Properties>
<Property name="autoResizeMode" type="int" value="5"/>
<Property name="name" type="java.lang.String" value="TblVids" noResource="true"/>
<Property name="opaque" type="boolean" value="false"/>
<Property name="rowHeight" type="int" value="20"/>
<Property name="showGrid" type="boolean" value="false"/>
</Properties>
<AuxValues>
<AuxValue name="JavaCodeGenerator_CreateCodeCustom" type="java.lang.String" value="new com.fr3ts0n.pvs.gui.PvTable(prt.VidPvs)"/>
</AuxValues>
</Component>
<Component class="javax.swing.JLabel" name="jLabel1">
<Properties>
<Property name="horizontalAlignment" type="int" value="0"/>
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
<Image iconType="3" name="/com.fr3ts0n.ecu/res/SUNFIRE.png"/>
</Property>
</Properties>
</Component>
</SubComponents>
</Container>
</SubComponents>
</Container>
<Component class="com.fr3ts0n.ecu.ObdDtcPanel" name="panObdDtc">
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription">
<JTabbedPaneConstraints tabName="Fault Codes">
<Property name="tabTitle" type="java.lang.String" value="Fault Codes"/>
</JTabbedPaneConstraints>
</Constraint>
</Constraints>
</Component>
<Component class="com.fr3ts0n.ecu.ObdDataPanel" name="panObdFreezeFrame">
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription">
<JTabbedPaneConstraints tabName="Freeze Frames">
<Property name="tabTitle" type="java.lang.String" value="Freeze Frames"/>
</JTabbedPaneConstraints>
</Constraint>
</Constraints>
</Component>
<Component class="com.fr3ts0n.ecu.ObdDataPanel" name="panObdData">
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription">
<JTabbedPaneConstraints tabName="OBD-Data">
<Property name="tabTitle" type="java.lang.String" value="OBD-Data"/>
</JTabbedPaneConstraints>
</Constraint>
</Constraints>
</Component>
<Component class="com.fr3ts0n.ecu.ObdDataPanel" name="panCanData">
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription">
<JTabbedPaneConstraints tabName="CAN-Monitor">
<Property name="tabTitle" type="java.lang.String" value="CAN-Monitor"/>
</JTabbedPaneConstraints>
</Constraint>
</Constraints>
</Component>
</SubComponents>
</Container>
<Container class="javax.swing.JPanel" name="panFooter">
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
<BorderConstraints direction="South"/>
</Constraint>
</Constraints>
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
<SubComponents>
<Component class="javax.swing.JLabel" name="lblStatus">
<Properties>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Dialog" size="10" style="0"/>
</Property>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
<Connection code="version" type="code"/>
</Property>
<Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
<Border info="org.netbeans.modules.form.compat2.border.CompoundBorderInfo">
<CompoundBorder>
<Border PropertyName="outside" info="org.netbeans.modules.form.compat2.border.BevelBorderInfo">
<BevelBorder bevelType="1"/>
</Border>
<Border PropertyName="inside" info="org.netbeans.modules.form.compat2.border.EmptyBorderInfo">
<EmptyBorder bottom="1" left="3" right="3" top="1"/>
</Border>
</CompoundBorder>
</Border>
</Property>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="-1" gridY="-1" gridWidth="1" gridHeight="1" fill="1" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="10" weightX="1.0" weightY="0.0"/>
</Constraint>
</Constraints>
</Component>
<Component class="javax.swing.JComboBox" name="cbCnvSystem">
<Properties>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Dialog" size="10" style="0"/>
</Property>
<Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
<StringArray count="2">
<StringItem index="0" value="Metric"/>
<StringItem index="1" value="Imperial"/>
</StringArray>
</Property>
<Property name="toolTipText" type="java.lang.String" value="Select conversion system"/>
<Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
<Border info="org.netbeans.modules.form.compat2.border.BevelBorderInfo">
<BevelBorder bevelType="1"/>
</Border>
</Property>
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[71, 23]"/>
</Property>
</Properties>
<Events>
<EventHandler event="itemStateChanged" listener="java.awt.event.ItemListener" parameters="java.awt.event.ItemEvent" handler="cbCnvSystemItemStateChanged"/>
</Events>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="-1" gridY="-1" gridWidth="1" gridHeight="1" fill="1" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="10" weightX="0.0" weightY="0.0"/>
</Constraint>
</Constraints>
</Component>
<Component class="javax.swing.JComboBox" name="cbProtocol">
<Properties>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Dialog" size="10" style="0"/>
</Property>
<Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
<Connection code="new javax.swing.DefaultComboBoxModel(prt.protocols)" type="code"/>
</Property>
<Property name="toolTipText" type="java.lang.String" value="Select communication protocol"/>
<Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
<Border info="org.netbeans.modules.form.compat2.border.BevelBorderInfo">
<BevelBorder bevelType="1"/>
</Border>
</Property>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="cbProtocolActionPerformed"/>
</Events>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="-1" gridY="-1" gridWidth="1" gridHeight="1" fill="1" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="10" weightX="0.0" weightY="0.0"/>
</Constraint>
</Constraints>
</Component>
</SubComponents>
</Container>
<Container class="javax.swing.JPanel" name="panHeader">
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
<BorderConstraints direction="North"/>
</Constraint>
</Constraints>
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridLayout">
<Property name="columns" type="int" value="0"/>
<Property name="rows" type="int" value="1"/>
</Layout>
</Container>
</SubComponents>
</Form>
@@ -0,0 +1,630 @@
/*
* (C) Copyright 2015 by fr3ts0n <erwin.scheuch-heilig@gmx.at>
*
* 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., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
package com.fr3ts0n.ecu.gui.application;
import com.fr3ts0n.common.UTF8Bundle;
import com.fr3ts0n.common.UTF8Control;
import com.fr3ts0n.ecu.EcuDataItem;
import com.fr3ts0n.ecu.EcuDataPv;
import com.fr3ts0n.ecu.prot.obd.ElmProt;
import com.fr3ts0n.ecu.prot.obd.ObdProt;
import com.fr3ts0n.prot.gui.SerialHandler;
import com.fr3ts0n.pvs.PvChangeEvent;
import com.fr3ts0n.pvs.PvChangeListener;
import com.fr3ts0n.pvs.PvList;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.HashMap;
import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
/**
* Main application frame for OBD com.fr3ts0n.test application
*
* @author erwin
*/
public class ObdTestFrame extends javax.swing.JFrame
implements PropertyChangeListener, PvChangeListener
{
/**
*
*/
private static final long serialVersionUID = 3393967156524083209L;
/** Program version string */
private static final String version = "Version 0.9.7";
private static final String copyright = "Copyright (C) 2007-2009 Erwin Scheuch-Heilig";
/** Initialize UTF8 resource bundle */
static UTF8Bundle res = new UTF8Bundle(new UTF8Control());
/** icons */
public ImageIcon icoCar = new javax.swing.ImageIcon(getClass().getResource("/com/fr3ts0n/ecu/gui/res/SUNFIRE.png"));
/** protocol handler */
private static final ElmProt prt = new ElmProt();
/** Serial communication handler */
private static final SerialHandler ser = new SerialHandler();
/** is this a simulation, or the real world? */
static boolean isSimulation = false;
/**
* Action listener to handle read/clear code actions
*/
private final ActionListener hdlrCodeButtons = new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
// if source is not defined, ignore event
if (e.getSource() == null) return;
if (e.getActionCommand().equals("ReadCodes"))
{
prt.setService(ElmProt.OBD_SVC_READ_CODES);
} else if (e.getActionCommand().equals("ReadPending"))
{
prt.setService(ElmProt.OBD_SVC_PENDINGCODES);
} else if (e.getActionCommand().equals("ReadPermanent"))
{
prt.setService(ElmProt.OBD_SVC_PERMACODES);
} else if (e.getActionCommand().equals("ClearCodes"))
{
prt.setService(ElmProt.OBD_SVC_CLEAR_CODES);
}
}
};
/** Creates new form ObdTestFrame */
private ObdTestFrame()
{
ObdProt.VidPvs.addPvChangeListener(this);
// set up serial handler and protocol drivers
ser.setMessageHandler(prt);
prt.addTelegramWriter(ser);
initComponents();
// panAbout.setText(about);
panObdData.setPidPvs(ObdProt.PidPvs);
panObdFreezeFrame.setPidPvs(ObdProt.PidPvs);
panCanData.setPidPvs(ElmProt.canProt.CanPvs);
panCanData.setTitle("CAN Data Graph");
panObdDtc.setTcList(ObdProt.tCodes);
panObdDtc.addActionListener(hdlrCodeButtons);
/* handle number of DTC changes */
prt.addPropertyChangeListener(panObdDtc);
/* handle protocol status changes */
prt.addPropertyChangeListener(this);
}
/**
* This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
@SuppressWarnings({"rawtypes", "unchecked"})
private void initComponents()
{
java.awt.GridBagConstraints gridBagConstraints;
fChoose = new javax.swing.JFileChooser();
tabMain = new javax.swing.JTabbedPane();
javax.swing.JPanel panStart = new javax.swing.JPanel();
javax.swing.JLabel lblTitle = new javax.swing.JLabel();
javax.swing.JLabel lblFooter = new javax.swing.JLabel();
javax.swing.JPanel jPanel1 = new javax.swing.JPanel();
TblVehIDs = new com.fr3ts0n.pvs.gui.PvTable(ObdProt.VidPvs);
javax.swing.JLabel jLabel1 = new javax.swing.JLabel();
panObdDtc = new com.fr3ts0n.ecu.gui.application.ObdDtcPanel();
panObdFreezeFrame = new com.fr3ts0n.ecu.gui.application.ObdDataPanel();
panObdData = new com.fr3ts0n.ecu.gui.application.ObdDataPanel();
panCanData = new com.fr3ts0n.ecu.gui.application.ObdDataPanel();
javax.swing.JPanel panFooter = new javax.swing.JPanel();
lblStatus = new javax.swing.JLabel();
cbCnvSystem = new javax.swing.JComboBox();
cbProtocol = new javax.swing.JComboBox();
javax.swing.JPanel panHeader = new javax.swing.JPanel();
javax.swing.JMenuBar mbMain = new javax.swing.JMenuBar();
javax.swing.JMenu mnuFile = new javax.swing.JMenu();
miLoad = new javax.swing.JMenuItem();
miSave = new javax.swing.JMenuItem();
javax.swing.JMenu mnuComm = new javax.swing.JMenu();
miCommConfigure = new javax.swing.JMenuItem();
miCommInit = new javax.swing.JMenuItem();
miCommStart = new javax.swing.JMenuItem();
miCommStop = new javax.swing.JMenuItem();
FormListener formListener = new FormListener();
fChoose.setFileFilter(new ObdFileFilter());
fChoose.setFileSelectionMode(javax.swing.JFileChooser.FILES_AND_DIRECTORIES);
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setTitle("JObdScanTool");
tabMain.setFont(new java.awt.Font("Dialog", 0, 10));
tabMain.setPreferredSize(new java.awt.Dimension(520, 350));
tabMain.addChangeListener(formListener);
panStart.setBackground(new java.awt.Color(255, 255, 255));
panStart.setLayout(new java.awt.BorderLayout());
lblTitle.setFont(new java.awt.Font("Dialog", 1, 18));
lblTitle.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
lblTitle.setText("Java OBD ScanTool");
panStart.add(lblTitle, java.awt.BorderLayout.NORTH);
lblFooter.setFont(new java.awt.Font("Dialog", 0, 10));
lblFooter.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
lblFooter.setText(copyright);
panStart.add(lblFooter, java.awt.BorderLayout.SOUTH);
jPanel1.setBackground(new java.awt.Color(255, 255, 255));
jPanel1.setBorder(javax.swing.BorderFactory.createEmptyBorder(20, 10, 20, 10));
jPanel1.setLayout(new java.awt.GridLayout(2, 0));
TblVehIDs.setName("TblVids"); // NOI18N
TblVehIDs.setOpaque(false);
TblVehIDs.setRowHeight(20);
TblVehIDs.setShowGrid(false);
jPanel1.add(TblVehIDs);
jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
jLabel1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/com/fr3ts0n/ecu/gui/res/SUNFIRE.png"))); // NOI18N
jPanel1.add(jLabel1);
panStart.add(jPanel1, java.awt.BorderLayout.CENTER);
tabMain.addTab("About", panStart);
tabMain.addTab("Fault Codes", panObdDtc);
tabMain.addTab("Freeze Frames", panObdFreezeFrame);
tabMain.addTab("OBD-Data", panObdData);
tabMain.addTab("CAN-Monitor", panCanData);
getContentPane().add(tabMain, java.awt.BorderLayout.CENTER);
panFooter.setLayout(new java.awt.GridBagLayout());
lblStatus.setFont(new java.awt.Font("Dialog", 0, 10));
lblStatus.setText(version);
lblStatus.setBorder(javax.swing.BorderFactory.createCompoundBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.LOWERED), javax.swing.BorderFactory.createEmptyBorder(1, 3, 1, 3)));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.weightx = 1.0;
panFooter.add(lblStatus, gridBagConstraints);
cbCnvSystem.setFont(new java.awt.Font("Dialog", 0, 10));
cbCnvSystem.setModel(new javax.swing.DefaultComboBoxModel(new String[]{"Metric", "Imperial"}));
cbCnvSystem.setToolTipText("Select conversion system");
cbCnvSystem.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.LOWERED));
cbCnvSystem.setPreferredSize(new java.awt.Dimension(71, 23));
cbCnvSystem.addItemListener(formListener);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
panFooter.add(cbCnvSystem, gridBagConstraints);
cbProtocol.setFont(new java.awt.Font("Dialog", 0, 10));
cbProtocol.setModel(new javax.swing.DefaultComboBoxModel(ElmProt.PROT.values()));
cbProtocol.setToolTipText("Select communication protocol");
cbProtocol.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.LOWERED));
cbProtocol.addActionListener(formListener);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
panFooter.add(cbProtocol, gridBagConstraints);
getContentPane().add(panFooter, java.awt.BorderLayout.SOUTH);
panHeader.setLayout(new java.awt.GridLayout(1, 0));
getContentPane().add(panHeader, java.awt.BorderLayout.NORTH);
mbMain.setFont(new java.awt.Font("Dialog", 0, 10));
mnuFile.setMnemonic('F');
mnuFile.setText("File");
mnuFile.setFont(new java.awt.Font("Dialog", 0, 10));
miLoad.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F3, 0));
miLoad.setFont(new java.awt.Font("Dialog", 0, 10));
miLoad.setMnemonic('L');
miLoad.setText("Load measurement");
miLoad.addActionListener(formListener);
mnuFile.add(miLoad);
miSave.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F4, 0));
miSave.setFont(new java.awt.Font("Dialog", 0, 10));
miSave.setMnemonic('S');
miSave.setText("Save measurement");
miSave.addActionListener(formListener);
mnuFile.add(miSave);
mbMain.add(mnuFile);
mnuComm.setMnemonic('C');
mnuComm.setText("Communication");
mnuComm.setFont(new java.awt.Font("Dialog", 0, 10));
miCommConfigure.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F8, 0));
miCommConfigure.setFont(new java.awt.Font("Dialog", 0, 10));
miCommConfigure.setMnemonic('C');
miCommConfigure.setText("Port Configuration...");
miCommConfigure.addActionListener(formListener);
mnuComm.add(miCommConfigure);
miCommInit.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F5, 0));
miCommInit.setFont(new java.awt.Font("Dialog", 0, 10));
miCommInit.setMnemonic('I');
miCommInit.setText("Initialize");
miCommInit.addActionListener(formListener);
mnuComm.add(miCommInit);
miCommStart.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F11, 0));
miCommStart.setFont(new java.awt.Font("Dialog", 0, 10));
miCommStart.setMnemonic('S');
miCommStart.setText("Start");
miCommStart.addActionListener(formListener);
mnuComm.add(miCommStart);
miCommStop.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F9, 0));
miCommStop.setFont(new java.awt.Font("Dialog", 0, 10));
miCommStop.setMnemonic('p');
miCommStop.setText("Stop");
miCommStop.addActionListener(formListener);
mnuComm.add(miCommStop);
mbMain.add(mnuComm);
setJMenuBar(mbMain);
pack();
}
// Code for dispatching events from components to event handlers.
private class FormListener implements java.awt.event.ActionListener, java.awt.event.ItemListener, javax.swing.event.ChangeListener
{
FormListener()
{
}
public void actionPerformed(java.awt.event.ActionEvent evt)
{
if (evt.getSource() == cbProtocol)
{
ObdTestFrame.this.cbProtocolActionPerformed();
} else if (evt.getSource() == miLoad)
{
ObdTestFrame.this.miLoadActionPerformed();
} else if (evt.getSource() == miSave)
{
ObdTestFrame.this.miSaveActionPerformed();
} else if (evt.getSource() == miCommConfigure)
{
ObdTestFrame.this.miCommConfigureActionPerformed();
} else if (evt.getSource() == miCommInit)
{
ObdTestFrame.this.miCommInitActionPerformed();
} else if (evt.getSource() == miCommStart)
{
ObdTestFrame.this.miCommStartActionPerformed();
} else if (evt.getSource() == miCommStop)
{
ObdTestFrame.this.miCommStopActionPerformed();
}
}
public void itemStateChanged(java.awt.event.ItemEvent evt)
{
if (evt.getSource() == cbCnvSystem)
{
ObdTestFrame.this.cbCnvSystemItemStateChanged();
}
}
public void stateChanged(javax.swing.event.ChangeEvent evt)
{
if (evt.getSource() == tabMain)
{
ObdTestFrame.this.tabMainStateChanged();
}
}
}// </editor-fold>//GEN-END:initComponents
private void miCommConfigureActionPerformed()//GEN-FIRST:event_miCommConfigureActionPerformed
{//GEN-HEADEREND:event_miCommConfigureActionPerformed
ser.configure();
}//GEN-LAST:event_miCommConfigureActionPerformed
private void miCommStopActionPerformed()//GEN-FIRST:event_miCommStopActionPerformed
{//GEN-HEADEREND:event_miCommStopActionPerformed
// switch off PID's supported'
prt.setService(ElmProt.OBD_SVC_NONE);
}//GEN-LAST:event_miCommStopActionPerformed
private void miCommStartActionPerformed()//GEN-FIRST:event_miCommStartActionPerformed
{//GEN-HEADEREND:event_miCommStartActionPerformed
// request OBD service for selected Tab
requestServiceForSelectedTab();
}//GEN-LAST:event_miCommStartActionPerformed
private void miCommInitActionPerformed()//GEN-FIRST:event_miCommInitActionPerformed
{//GEN-HEADEREND:event_miCommInitActionPerformed
prt.sendCommand(ElmProt.CMD.RESET, 0);
}//GEN-LAST:event_miCommInitActionPerformed
private void miSaveActionPerformed()//GEN-FIRST:event_miSaveActionPerformed
{//GEN-HEADEREND:event_miSaveActionPerformed
if (fChoose.showSaveDialog(this) == JFileChooser.APPROVE_OPTION)
{
File file = fChoose.getSelectedFile();
// ask for overwrite existing file
if (!file.exists()
|| JOptionPane.showConfirmDialog(this,
"Really want to overwrite " + file.getPath(),
"File overwrite",
JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION)
try
{
FileOutputStream out = new FileOutputStream(file);
ObjectOutputStream oOut = new ObjectOutputStream(out);
/* remember current measurement page for loading again */
Integer currPage = Integer.valueOf(tabMain.getSelectedIndex());
oOut.writeObject(currPage);
/* save the data */
oOut.writeObject(ObdProt.PidPvs);
oOut.writeObject(ElmProt.canProt.CanPvs);
oOut.writeObject(panObdData.selPids);
oOut.writeObject(panCanData.selPids);
oOut.close();
} catch (IOException ex)
{
ex.printStackTrace();
JOptionPane.showMessageDialog(this,
ex.getLocalizedMessage(),
"Save ERROR",
JOptionPane.ERROR_MESSAGE);
}
}
}//GEN-LAST:event_miSaveActionPerformed
@SuppressWarnings({"unchecked", "rawtypes"})
private void miLoadActionPerformed()//GEN-FIRST:event_miLoadActionPerformed
{//GEN-HEADEREND:event_miLoadActionPerformed
if (fChoose.showOpenDialog(this) == JFileChooser.APPROVE_OPTION)
{
File file = fChoose.getSelectedFile();
try
{
FileInputStream in = new FileInputStream(file);
ObjectInputStream oIn = new ObjectInputStream(in);
/* ensure that measurement page is activated
to avoid deletion of loaded data afterwards */
Integer currPage = (Integer) oIn.readObject();
tabMain.setSelectedIndex(currPage);
/* read in the data */
ObdProt.PidPvs = (PvList) oIn.readObject();
ElmProt.canProt.CanPvs = (PvList) oIn.readObject();
// re-setup data connection
panObdData.setPidPvs(ObdProt.PidPvs);
panCanData.setPidPvs(ElmProt.canProt.CanPvs);
// read measurement history
panObdData.selPids = (HashMap) oIn.readObject();
panCanData.selPids = (HashMap) oIn.readObject();
oIn.close();
} catch (Exception ex)
{
ex.printStackTrace();
JOptionPane.showMessageDialog(this,
ex.getLocalizedMessage(),
"Load ERROR",
JOptionPane.ERROR_MESSAGE);
}
}
}//GEN-LAST:event_miLoadActionPerformed
private void cbProtocolActionPerformed()//GEN-FIRST:event_cbProtocolActionPerformed
{//GEN-HEADEREND:event_cbProtocolActionPerformed
prt.sendCommand(ElmProt.CMD.SETPROTAUTO, cbProtocol.getSelectedIndex());
}//GEN-LAST:event_cbProtocolActionPerformed
/**
* handle change of conversion system
*/
private void cbCnvSystemItemStateChanged()//GEN-FIRST:event_cbCnvSystemItemStateChanged
{//GEN-HEADEREND:event_cbCnvSystemItemStateChanged
// set new conversion system
EcuDataItem.cnvSystem = cbCnvSystem.getSelectedIndex();
// update currently selected display
switch (tabMain.getSelectedIndex())
{
case 2:
panObdFreezeFrame.updateAllTableRows(EcuDataPv.FID_UNITS);
break;
case 3:
panObdData.updateAllTableRows(EcuDataPv.FID_UNITS);
break;
case 4:
panCanData.updateAllTableRows(EcuDataPv.FID_UNITS);
break;
default:
// intentionally do nothing ...
}
}//GEN-LAST:event_cbCnvSystemItemStateChanged
/**
* update form/tab selection
*/
private void tabMainStateChanged()//GEN-FIRST:event_tabMainStateChanged
{//GEN-HEADEREND:event_tabMainStateChanged
// request OBD service for selected Tab
requestServiceForSelectedTab();
updateColumnWidths();
}//GEN-LAST:event_tabMainStateChanged
/**
* request corresponding OBD service for selected Tab
*/
private void requestServiceForSelectedTab()
{
// handle page change ...
switch (tabMain.getSelectedIndex())
{
case 0: // About panel
// switch off PID's supported'
prt.setService(ElmProt.OBD_SVC_VEH_INFO);
break;
case 1: // Trouble code panel
// we don't set any service here
// since service is selected by buttons
prt.setService(ElmProt.OBD_SVC_NONE);
break;
case 2: // freeze frame panel
// write data initialisation telegram
prt.setService(ElmProt.OBD_SVC_FREEZEFRAME);
break;
case 3: // data item panel
// write data initialisation telegram
prt.setService(ElmProt.OBD_SVC_DATA);
break;
case 4: // CAN monitor panel
// write data initialisation telegram
prt.setService(ElmProt.OBD_SVC_CAN_MONITOR);
break;
default:
// switch off PID's supported'
prt.setService(ElmProt.OBD_SVC_NONE);
// do nothing
}
}
/**
* The main routine
*
* @param args the command line arguments
*/
public static void main(String args[])
{
ObdTestFrame frm = new ObdTestFrame();
frm.setVisible(true);
// command line argument is the com port
if (args.length > 0)
{
try
{
ser.setDeviceName(args[0]);
} catch (Exception ex)
{
JOptionPane.showMessageDialog(frm,
ex,
"Communication error",
JOptionPane.ERROR_MESSAGE);
}
ser.start();
} else
{
// without parameter we do internal telegram simulation ...
Thread sim = new Thread(prt);
sim.start();
}
}
/**
* Property change listener to ELM-Protocol
*
* @param evt the property change event to be handled
*/
public void propertyChange(PropertyChangeEvent evt)
{
/* handle protocol status changes */
if (evt.getPropertyName().equals("status"))
{
lblStatus.setText(evt.getNewValue().toString());
}
}
/**
* update the column widths of data table
*/
private void updateColumnWidths()
{
if (TblVehIDs.getRowCount() >= 1)
{
/** set column sizes here, since this only works with inserted data */
TblVehIDs.getColumn(EcuDataPv.FIELDS[EcuDataPv.FID_PID]).setPreferredWidth(20);
TblVehIDs.getColumn(EcuDataPv.FIELDS[EcuDataPv.FID_OFS]).setPreferredWidth(20);
TblVehIDs.getColumn(EcuDataPv.FIELDS[EcuDataPv.FID_DESCRIPT]).setPreferredWidth(350);
TblVehIDs.getColumn(EcuDataPv.FIELDS[EcuDataPv.FID_VALUE]).setPreferredWidth(350);
}
}
/**
* handle changes in the process var(s)
*
* @param event Process var event to be handled
*/
public void pvChanged(PvChangeEvent event)
{
// update table column widths
updateColumnWidths();
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private com.fr3ts0n.pvs.gui.PvTable TblVehIDs;
@SuppressWarnings("rawtypes")
private javax.swing.JComboBox cbCnvSystem;
@SuppressWarnings("rawtypes")
private javax.swing.JComboBox cbProtocol;
private javax.swing.JFileChooser fChoose;
private javax.swing.JLabel lblStatus;
private javax.swing.JMenuItem miCommConfigure;
private javax.swing.JMenuItem miCommInit;
private javax.swing.JMenuItem miCommStart;
private javax.swing.JMenuItem miCommStop;
private javax.swing.JMenuItem miLoad;
private javax.swing.JMenuItem miSave;
private com.fr3ts0n.ecu.gui.application.ObdDataPanel panCanData;
private com.fr3ts0n.ecu.gui.application.ObdDataPanel panObdData;
private com.fr3ts0n.ecu.gui.application.ObdDtcPanel panObdDtc;
private com.fr3ts0n.ecu.gui.application.ObdDataPanel panObdFreezeFrame;
private javax.swing.JTabbedPane tabMain;
// End of variables declaration//GEN-END:variables
}
@@ -0,0 +1,208 @@
<?xml version="1.0" encoding="UTF-8" ?>
<Form version="1.3" maxVersion="1.7" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
<Properties>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Dialog" size="10" style="0"/>
</Property>
</Properties>
<AuxValues>
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/>
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
<AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
<AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
<AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,0,111,0,0,1,-62"/>
</AuxValues>
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
<SubComponents>
<Container class="javax.swing.JPanel" name="jPanel1">
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
<BorderConstraints direction="Center"/>
</Constraint>
</Constraints>
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
<SubComponents>
<Container class="javax.swing.JPanel" name="panStatus">
<Properties>
<Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
<Border info="org.netbeans.modules.form.compat2.border.TitledBorderInfo">
<TitledBorder title="Status">
<Font PropertyName="font" name="Dialog" size="10" style="0"/>
</TitledBorder>
</Border>
</Property>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="0" gridY="0" gridWidth="1" gridHeight="1" fill="1" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="11" weightX="1.0" weightY="0.0"/>
</Constraint>
</Constraints>
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
<SubComponents>
<Container class="javax.swing.JPanel" name="panMilStatus">
<Properties>
<Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
<Border info="org.netbeans.modules.form.compat2.border.TitledBorderInfo">
<TitledBorder title="MIL status">
<Font PropertyName="font" name="Dialog" size="10" style="0"/>
</TitledBorder>
</Border>
</Property>
<Property name="enabled" type="boolean" value="false"/>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="0" gridY="0" gridWidth="1" gridHeight="1" fill="1" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="10" weightX="1.0" weightY="0.0"/>
</Constraint>
</Constraints>
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
<SubComponents>
<Component class="javax.swing.JCheckBox" name="cbMilStatus">
<Properties>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Dialog" size="10" style="0"/>
</Property>
<Property name="text" type="java.lang.String" value="MIL on"/>
<Property name="enabled" type="boolean" value="false"/>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
<BorderConstraints direction="Center"/>
</Constraint>
</Constraints>
</Component>
</SubComponents>
</Container>
<Container class="javax.swing.JPanel" name="panTestStatus">
<Properties>
<Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
<Border info="org.netbeans.modules.form.compat2.border.TitledBorderInfo">
<TitledBorder title="DTC com.fr3ts0n.test status">
<Font PropertyName="font" name="Dialog" size="10" style="0"/>
</TitledBorder>
</Border>
</Property>
<Property name="enabled" type="boolean" value="false"/>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="-1" gridY="-1" gridWidth="1" gridHeight="1" fill="1" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="10" weightX="1.0" weightY="0.0"/>
</Constraint>
</Constraints>
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
<SubComponents>
<Component class="javax.swing.JCheckBox" name="cbTestComplete">
<Properties>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Dialog" size="10" style="0"/>
</Property>
<Property name="text" type="java.lang.String" value="DTC com.fr3ts0n.test complete"/>
<Property name="enabled" type="boolean" value="false"/>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
<BorderConstraints direction="Center"/>
</Constraint>
</Constraints>
</Component>
</SubComponents>
</Container>
<Container class="javax.swing.JPanel" name="panFaultStatus">
<Properties>
<Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
<Border info="org.netbeans.modules.form.compat2.border.TitledBorderInfo">
<TitledBorder title="Fault status">
<Font PropertyName="font" name="Dialog" size="10" style="0"/>
</TitledBorder>
</Border>
</Property>
<Property name="enabled" type="boolean" value="false"/>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="-1" gridY="-1" gridWidth="1" gridHeight="1" fill="1" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="10" weightX="1.0" weightY="0.0"/>
</Constraint>
</Constraints>
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridLayout">
<Property name="columns" type="int" value="3"/>
<Property name="rows" type="int" value="0"/>
</Layout>
<SubComponents>
<Component class="javax.swing.JCheckBox" name="cbSporadic">
<Properties>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Dialog" size="10" style="0"/>
</Property>
<Property name="text" type="java.lang.String" value="sporadic"/>
<Property name="enabled" type="boolean" value="false"/>
</Properties>
</Component>
<Component class="javax.swing.JCheckBox" name="cbShortTerm">
<Properties>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Dialog" size="10" style="0"/>
</Property>
<Property name="text" type="java.lang.String" value="short term"/>
<Property name="enabled" type="boolean" value="false"/>
</Properties>
</Component>
<Component class="javax.swing.JCheckBox" name="cbStatic">
<Properties>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Dialog" size="10" style="0"/>
</Property>
<Property name="text" type="java.lang.String" value="static"/>
<Property name="enabled" type="boolean" value="false"/>
</Properties>
</Component>
</SubComponents>
</Container>
</SubComponents>
</Container>
<Container class="javax.swing.JPanel" name="panSymptom">
<Properties>
<Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
<Border info="org.netbeans.modules.form.compat2.border.TitledBorderInfo">
<TitledBorder title="Symptom">
<Font PropertyName="font" name="Dialog" size="10" style="0"/>
</TitledBorder>
</Border>
</Property>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="0" gridY="1" gridWidth="1" gridHeight="1" fill="1" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="15" weightX="1.0" weightY="1.0"/>
</Constraint>
</Constraints>
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
<SubComponents>
<Component class="javax.swing.JLabel" name="lblSymptom">
<Properties>
<Property name="text" type="java.lang.String" value="Symptom"/>
<Property name="enabled" type="boolean" value="false"/>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
<BorderConstraints direction="Center"/>
</Constraint>
</Constraints>
</Component>
</SubComponents>
</Container>
</SubComponents>
</Container>
</SubComponents>
</Form>
@@ -0,0 +1,203 @@
/*
* (C) Copyright 2015 by fr3ts0n <erwin.scheuch-heilig@gmx.at>
*
* 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., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
package com.fr3ts0n.ecu.gui.application;
/**
* Fault code propertiy panel
*
* @author erwin
*/
public class VagCodeStatPanel extends javax.swing.JPanel
{
public static final long serialVersionUID = 1L;
/** DFC symptoms to display */
private static final String[] Symptoms =
{
"No display",
"Value above MAX",
"Value below MIN",
"Mechanical fault",
"No signal / no communication",
"Base adjustment / adaption",
"Shortcut to battery",
"Shortcut to ground",
"Signal plausibility",
"Open load / Shortcut to ground",
"Open load / Shortcut to battery",
"Open load",
"Electric fault ",
"Please read fault codes",
"Defect",
"Currently not checkable",
};
/** Creates new form VagCodeStatPanel */
public VagCodeStatPanel()
{
initComponents();
}
/**
* This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents()
{
java.awt.GridBagConstraints gridBagConstraints;
javax.swing.JPanel jPanel1 = new javax.swing.JPanel();
javax.swing.JPanel panStatus = new javax.swing.JPanel();
javax.swing.JPanel panMilStatus = new javax.swing.JPanel();
cbMilStatus = new javax.swing.JCheckBox();
javax.swing.JPanel panTestStatus = new javax.swing.JPanel();
cbTestComplete = new javax.swing.JCheckBox();
javax.swing.JPanel panFaultStatus = new javax.swing.JPanel();
cbSporadic = new javax.swing.JCheckBox();
cbShortTerm = new javax.swing.JCheckBox();
cbStatic = new javax.swing.JCheckBox();
javax.swing.JPanel panSymptom = new javax.swing.JPanel();
lblSymptom = new javax.swing.JLabel();
setFont(new java.awt.Font("Dialog", 0, 10)); // NOI18N
setLayout(new java.awt.BorderLayout());
jPanel1.setLayout(new java.awt.GridBagLayout());
panStatus.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Status", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Dialog", 0, 10))); // NOI18N
panStatus.setLayout(new java.awt.GridBagLayout());
panMilStatus
.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "MIL status", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Dialog", 0, 10))); // NOI18N
panMilStatus.setEnabled(false);
panMilStatus.setLayout(new java.awt.BorderLayout());
cbMilStatus.setFont(new java.awt.Font("Dialog", 0, 10)); // NOI18N
cbMilStatus.setText("MIL on");
cbMilStatus.setEnabled(false);
panMilStatus.add(cbMilStatus, java.awt.BorderLayout.CENTER);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.weightx = 1.0;
panStatus.add(panMilStatus, gridBagConstraints);
panTestStatus.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "DTC com.fr3ts0n.test status", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Dialog", 0, 10))); // NOI18N
panTestStatus.setEnabled(false);
panTestStatus.setLayout(new java.awt.BorderLayout());
cbTestComplete.setFont(new java.awt.Font("Dialog", 0, 10)); // NOI18N
cbTestComplete.setText("DTC com.fr3ts0n.test complete");
cbTestComplete.setEnabled(false);
panTestStatus.add(cbTestComplete, java.awt.BorderLayout.CENTER);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.weightx = 1.0;
panStatus.add(panTestStatus, gridBagConstraints);
panFaultStatus
.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Fault status", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Dialog", 0, 10))); // NOI18N
panFaultStatus.setEnabled(false);
panFaultStatus.setLayout(new java.awt.GridLayout(0, 3));
cbSporadic.setFont(new java.awt.Font("Dialog", 0, 10));
cbSporadic.setText("sporadic");
cbSporadic.setEnabled(false);
panFaultStatus.add(cbSporadic);
cbShortTerm.setFont(new java.awt.Font("Dialog", 0, 10));
cbShortTerm.setText("short term");
cbShortTerm.setEnabled(false);
panFaultStatus.add(cbShortTerm);
cbStatic.setFont(new java.awt.Font("Dialog", 0, 10));
cbStatic.setText("static");
cbStatic.setEnabled(false);
panFaultStatus.add(cbStatic);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.weightx = 1.0;
panStatus.add(panFaultStatus, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTH;
gridBagConstraints.weightx = 1.0;
jPanel1.add(panStatus, gridBagConstraints);
panSymptom.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Symptom", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Dialog", 0, 10))); // NOI18N
panSymptom.setLayout(new java.awt.BorderLayout());
lblSymptom.setText("Symptom");
lblSymptom.setEnabled(false);
panSymptom.add(lblSymptom, java.awt.BorderLayout.CENTER);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.anchor = java.awt.GridBagConstraints.SOUTH;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
jPanel1.add(panSymptom, gridBagConstraints);
add(jPanel1, java.awt.BorderLayout.CENTER);
}// </editor-fold>//GEN-END:initComponents
/**
* set all status flags from status integer
*
* @param newStatus DFC status
*/
public void setStatusFlags(int newStatus)
{
int symptom = newStatus & 0x0F;
boolean testComplete = (newStatus & 0x10) == 0x10;
boolean sporadic = (newStatus & 0x60) == 0x20;
boolean shortTerm = (newStatus & 0x60) == 0x40;
boolean staticFault = (newStatus & 0x60) == 0x60;
boolean milStatus = (newStatus & 0x80) == 0x80;
lblSymptom.setText(Symptoms[symptom]);
cbTestComplete.setSelected(testComplete);
cbSporadic.setSelected(sporadic);
cbShortTerm.setSelected(shortTerm);
cbStatic.setSelected(staticFault);
cbMilStatus.setSelected(milStatus);
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JCheckBox cbMilStatus;
private javax.swing.JCheckBox cbShortTerm;
private javax.swing.JCheckBox cbSporadic;
private javax.swing.JCheckBox cbStatic;
private javax.swing.JCheckBox cbTestComplete;
private javax.swing.JLabel lblSymptom;
// End of variables declaration//GEN-END:variables
}
@@ -0,0 +1,599 @@
<?xml version="1.0" encoding="UTF-8" ?>
<Form version="1.2" maxVersion="1.2" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
<NonVisualComponents>
<Component class="javax.swing.JFileChooser" name="fChoose">
<Properties>
<Property name="fileFilter" type="javax.swing.filechooser.FileFilter" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
<Connection code="new ObdFileFilter()" type="code"/>
</Property>
<Property name="fileSelectionMode" type="int" value="2"/>
</Properties>
</Component>
<Component class="com.fr3ts0n.ecu.AboutPanel" name="panAbout">
<Properties>
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
<Image iconType="0" name="null"/>
</Property>
</Properties>
</Component>
<Menu class="javax.swing.JMenuBar" name="mbMain">
<Properties>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Dialog" size="10" style="0"/>
</Property>
</Properties>
<SubComponents>
<Menu class="javax.swing.JMenu" name="mnuFile">
<Properties>
<Property name="mnemonic" type="int" value="70"/>
<Property name="text" type="java.lang.String" value="File"/>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Dialog" size="10" style="0"/>
</Property>
</Properties>
<SubComponents>
<MenuItem class="javax.swing.JMenuItem" name="miLoad">
<Properties>
<Property name="accelerator" type="javax.swing.KeyStroke" editor="org.netbeans.modules.form.editors.KeyStrokeEditor">
<KeyStroke key="F3"/>
</Property>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Dialog" size="10" style="0"/>
</Property>
<Property name="mnemonic" type="int" value="76"/>
<Property name="text" type="java.lang.String" value="Load measurement"/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="miLoadActionPerformed"/>
</Events>
</MenuItem>
<MenuItem class="javax.swing.JMenuItem" name="miSave">
<Properties>
<Property name="accelerator" type="javax.swing.KeyStroke" editor="org.netbeans.modules.form.editors.KeyStrokeEditor">
<KeyStroke key="F4"/>
</Property>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Dialog" size="10" style="0"/>
</Property>
<Property name="mnemonic" type="int" value="83"/>
<Property name="text" type="java.lang.String" value="Save measurement"/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="miSaveActionPerformed"/>
</Events>
</MenuItem>
</SubComponents>
</Menu>
<Menu class="javax.swing.JMenu" name="mnuComm">
<Properties>
<Property name="mnemonic" type="int" value="67"/>
<Property name="text" type="java.lang.String" value="Communication"/>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Dialog" size="10" style="0"/>
</Property>
</Properties>
<SubComponents>
<MenuItem class="javax.swing.JMenuItem" name="miCommConfigure">
<Properties>
<Property name="accelerator" type="javax.swing.KeyStroke" editor="org.netbeans.modules.form.editors.KeyStrokeEditor">
<KeyStroke key="F8"/>
</Property>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Dialog" size="10" style="0"/>
</Property>
<Property name="mnemonic" type="int" value="67"/>
<Property name="text" type="java.lang.String" value="Port Configuration..."/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="miCommConfigureActionPerformed"/>
</Events>
</MenuItem>
<MenuItem class="javax.swing.JMenuItem" name="miCommInit">
<Properties>
<Property name="accelerator" type="javax.swing.KeyStroke" editor="org.netbeans.modules.form.editors.KeyStrokeEditor">
<KeyStroke key="F5"/>
</Property>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Dialog" size="10" style="0"/>
</Property>
<Property name="mnemonic" type="int" value="73"/>
<Property name="text" type="java.lang.String" value="Initialize"/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="connectEcu"/>
</Events>
</MenuItem>
<MenuItem class="javax.swing.JMenuItem" name="miCommStop">
<Properties>
<Property name="accelerator" type="javax.swing.KeyStroke" editor="org.netbeans.modules.form.editors.KeyStrokeEditor">
<KeyStroke key="F6"/>
</Property>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Dialog" size="10" style="0"/>
</Property>
<Property name="mnemonic" type="int" value="112"/>
<Property name="text" type="java.lang.String" value="Stop"/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="miCommStopActionPerformed"/>
</Events>
</MenuItem>
</SubComponents>
</Menu>
<Menu class="javax.swing.JMenu" name="mnuHelp">
<Properties>
<Property name="mnemonic" type="int" value="72"/>
<Property name="text" type="java.lang.String" value="Help"/>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Dialog" size="10" style="0"/>
</Property>
</Properties>
<SubComponents>
<MenuItem class="javax.swing.JMenuItem" name="miAbout">
<Properties>
<Property name="accelerator" type="javax.swing.KeyStroke" editor="org.netbeans.modules.form.editors.KeyStrokeEditor">
<KeyStroke key="F1"/>
</Property>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Dialog" size="10" style="0"/>
</Property>
<Property name="mnemonic" type="int" value="65"/>
<Property name="text" type="java.lang.String" value="About"/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="miAboutActionPerformed"/>
</Events>
</MenuItem>
</SubComponents>
</Menu>
</SubComponents>
</Menu>
</NonVisualComponents>
<Properties>
<Property name="defaultCloseOperation" type="int" value="3"/>
<Property name="title" type="java.lang.String" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
<Connection code="product+&quot; &quot;+version" type="code"/>
</Property>
</Properties>
<SyntheticProperties>
<SyntheticProperty name="menuBar" type="java.lang.String" value="mbMain"/>
<SyntheticProperty name="formSizePolicy" type="int" value="1"/>
</SyntheticProperties>
<AuxValues>
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/>
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
<AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
<AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="2"/>
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="1"/>
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
<AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,-100,0,0,1,-54"/>
</AuxValues>
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
<SubComponents>
<Container class="javax.swing.JTabbedPane" name="tabMain">
<Properties>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Dialog" size="10" style="0"/>
</Property>
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[520, 350]"/>
</Property>
</Properties>
<Events>
<EventHandler event="stateChanged" listener="javax.swing.event.ChangeListener" parameters="javax.swing.event.ChangeEvent" handler="tabMainStateChanged"/>
</Events>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
<BorderConstraints direction="Center"/>
</Constraint>
</Constraints>
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout"/>
<SubComponents>
<Container class="javax.swing.JPanel" name="panStart">
<Properties>
<Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
<Color blue="ff" green="ff" red="ff" type="rgb"/>
</Property>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription">
<JTabbedPaneConstraints tabName="About">
<Property name="tabTitle" type="java.lang.String" value="About"/>
</JTabbedPaneConstraints>
</Constraint>
</Constraints>
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
<SubComponents>
<Component class="javax.swing.JLabel" name="lblFooter">
<Properties>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Dialog" size="10" style="0"/>
</Property>
<Property name="horizontalAlignment" type="int" value="0"/>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
<Connection code="copyright" type="code"/>
</Property>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
<BorderConstraints direction="South"/>
</Constraint>
</Constraints>
</Component>
<Container class="javax.swing.JPanel" name="jPanel1">
<Properties>
<Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
<Color blue="ff" green="ff" red="ff" type="rgb"/>
</Property>
<Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
<Border info="org.netbeans.modules.form.compat2.border.EmptyBorderInfo">
<EmptyBorder bottom="10" left="10" right="10" top="10"/>
</Border>
</Property>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
<BorderConstraints direction="Center"/>
</Constraint>
</Constraints>
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout">
<Property name="verticalGap" type="int" value="25"/>
</Layout>
<SubComponents>
<Component class="javax.swing.JLabel" name="lblTitle">
<Properties>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Dialog" size="18" style="1"/>
</Property>
<Property name="horizontalAlignment" type="int" value="0"/>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
<Connection code="product" type="code"/>
</Property>
<Property name="verticalAlignment" type="int" value="1"/>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
<BorderConstraints direction="North"/>
</Constraint>
</Constraints>
</Component>
<Component class="com.fr3ts0n.pvs.gui.PvTable" name="TblVehIDs">
<Properties>
<Property name="autoResizeMode" type="int" value="5"/>
<Property name="focusable" type="boolean" value="false"/>
<Property name="name" type="java.lang.String" value="TblVids" noResource="true"/>
<Property name="opaque" type="boolean" value="false"/>
<Property name="rowSelectionAllowed" type="boolean" value="false"/>
<Property name="showGrid" type="boolean" value="false"/>
</Properties>
<AuxValues>
<AuxValue name="JavaCodeGenerator_CreateCodeCustom" type="java.lang.String" value="new com.fr3ts0n.pvs.gui.PvTable(prt.VidPvs)"/>
</AuxValues>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
<BorderConstraints direction="Center"/>
</Constraint>
</Constraints>
</Component>
<Component class="javax.swing.JLabel" name="jLabel1">
<Properties>
<Property name="horizontalAlignment" type="int" value="0"/>
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
<Image iconType="3" name="/com.fr3ts0n.ecu/res/javag.png"/>
</Property>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
<BorderConstraints direction="South"/>
</Constraint>
</Constraints>
</Component>
</SubComponents>
</Container>
</SubComponents>
</Container>
<Component class="com.fr3ts0n.ecu.ObdDtcPanel" name="panObdDtc">
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription">
<JTabbedPaneConstraints tabName="Fault Codes">
<Property name="tabTitle" type="java.lang.String" value="Fault Codes"/>
</JTabbedPaneConstraints>
</Constraint>
</Constraints>
</Component>
<Component class="com.fr3ts0n.ecu.ObdDataPanel" name="panObdData">
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription">
<JTabbedPaneConstraints tabName="Data">
<Property name="tabTitle" type="java.lang.String" value="Data"/>
</JTabbedPaneConstraints>
</Constraint>
</Constraints>
</Component>
</SubComponents>
</Container>
<Container class="javax.swing.JPanel" name="panFooter">
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
<BorderConstraints direction="South"/>
</Constraint>
</Constraints>
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
<SubComponents>
<Component class="javax.swing.JLabel" name="lblMessage">
<Properties>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Dialog" size="10" style="0"/>
</Property>
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
<Connection code="String.format(&quot;%s %s&quot;, product,version)" type="code"/>
</Property>
<Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
<Border info="org.netbeans.modules.form.compat2.border.BevelBorderInfo">
<BevelBorder bevelType="1"/>
</Border>
</Property>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="-1" gridY="-1" gridWidth="1" gridHeight="1" fill="1" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="10" weightX="1.0" weightY="0.0"/>
</Constraint>
</Constraints>
</Component>
<Component class="javax.swing.JLabel" name="lblStatus">
<Properties>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Dialog" size="10" style="0"/>
</Property>
<Property name="horizontalAlignment" type="int" value="0"/>
<Property name="text" type="java.lang.String" value="Status"/>
<Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
<Border info="org.netbeans.modules.form.compat2.border.CompoundBorderInfo">
<CompoundBorder>
<Border PropertyName="outside" info="org.netbeans.modules.form.compat2.border.BevelBorderInfo">
<BevelBorder bevelType="1"/>
</Border>
<Border PropertyName="inside" info="org.netbeans.modules.form.compat2.border.EmptyBorderInfo">
<EmptyBorder bottom="1" left="3" right="3" top="1"/>
</Border>
</CompoundBorder>
</Border>
</Property>
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[90, 18]"/>
</Property>
<Property name="opaque" type="boolean" value="true"/>
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[90, 18]"/>
</Property>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="-1" gridY="-1" gridWidth="1" gridHeight="1" fill="1" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="10" weightX="0.0" weightY="0.0"/>
</Constraint>
</Constraints>
</Component>
<Component class="javax.swing.JLabel" name="lblBaud">
<Properties>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Dialog" size="10" style="0"/>
</Property>
<Property name="horizontalAlignment" type="int" value="11"/>
<Property name="text" type="java.lang.String" value="BaudRate"/>
<Property name="toolTipText" type="java.lang.String" value="Baud rate"/>
<Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
<Border info="org.netbeans.modules.form.compat2.border.BevelBorderInfo">
<BevelBorder bevelType="1"/>
</Border>
</Property>
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[54, 16]"/>
</Property>
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[54, 16]"/>
</Property>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="-1" gridY="-1" gridWidth="1" gridHeight="1" fill="1" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="10" weightX="0.0" weightY="0.0"/>
</Constraint>
</Constraints>
</Component>
<Component class="javax.swing.JComboBox" name="cbCnvSystem">
<Properties>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Dialog" size="10" style="0"/>
</Property>
<Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
<StringArray count="2">
<StringItem index="0" value="Metric"/>
<StringItem index="1" value="Imperial"/>
</StringArray>
</Property>
<Property name="toolTipText" type="java.lang.String" value="Select conversion system"/>
<Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
<Border info="org.netbeans.modules.form.compat2.border.BevelBorderInfo">
<BevelBorder bevelType="1"/>
</Border>
</Property>
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
<Dimension value="[71, 23]"/>
</Property>
</Properties>
<Events>
<EventHandler event="itemStateChanged" listener="java.awt.event.ItemListener" parameters="java.awt.event.ItemEvent" handler="cbCnvSystemItemStateChanged"/>
</Events>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
<GridBagConstraints gridX="-1" gridY="-1" gridWidth="1" gridHeight="1" fill="1" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="10" weightX="0.0" weightY="0.0"/>
</Constraint>
</Constraints>
</Component>
</SubComponents>
</Container>
<Container class="javax.swing.JPanel" name="panHeader">
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
<BorderConstraints direction="North"/>
</Constraint>
</Constraints>
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
<SubComponents>
<Container class="javax.swing.JToolBar" name="tbMain">
<Properties>
<Property name="floatable" type="boolean" value="false"/>
<Property name="rollover" type="boolean" value="true"/>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Dialog" size="10" style="0"/>
</Property>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
<BorderConstraints direction="North"/>
</Constraint>
</Constraints>
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignBoxLayout"/>
<SubComponents>
<Component class="javax.swing.JButton" name="btnLoad">
<Properties>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Dialog" size="10" style="0"/>
</Property>
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
<Image iconType="3" name="/com.fr3ts0n.ois/fileopen.png"/>
</Property>
<Property name="toolTipText" type="java.lang.String" value="Load measurements"/>
<Property name="borderPainted" type="boolean" value="false"/>
<Property name="focusable" type="boolean" value="false"/>
<Property name="horizontalTextPosition" type="int" value="0"/>
<Property name="verticalTextPosition" type="int" value="3"/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="miLoadActionPerformed"/>
</Events>
</Component>
<Component class="javax.swing.JButton" name="btnSave">
<Properties>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Dialog" size="10" style="0"/>
</Property>
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
<Image iconType="3" name="/com.fr3ts0n.ois/filesaveas.png"/>
</Property>
<Property name="toolTipText" type="java.lang.String" value="Save measurements"/>
<Property name="borderPainted" type="boolean" value="false"/>
<Property name="focusable" type="boolean" value="false"/>
<Property name="horizontalTextPosition" type="int" value="0"/>
<Property name="verticalTextPosition" type="int" value="3"/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="miSaveActionPerformed"/>
</Events>
</Component>
<Component class="javax.swing.JToolBar$Separator" name="jSeparator1">
</Component>
<Component class="javax.swing.JButton" name="btnConnect">
<Properties>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Dialog" size="10" style="0"/>
</Property>
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
<Image iconType="3" name="/com.fr3ts0n.ois/connect_established.png"/>
</Property>
<Property name="toolTipText" type="java.lang.String" value="Start communication"/>
<Property name="borderPainted" type="boolean" value="false"/>
<Property name="focusable" type="boolean" value="false"/>
<Property name="horizontalTextPosition" type="int" value="0"/>
<Property name="verticalTextPosition" type="int" value="3"/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="connectEcu"/>
</Events>
</Component>
<Component class="javax.swing.JButton" name="btnStop">
<Properties>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Dialog" size="10" style="0"/>
</Property>
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
<Image iconType="3" name="/com.fr3ts0n.ois/no.png"/>
</Property>
<Property name="toolTipText" type="java.lang.String" value="Stop communication"/>
<Property name="borderPainted" type="boolean" value="false"/>
<Property name="focusable" type="boolean" value="false"/>
<Property name="horizontalTextPosition" type="int" value="0"/>
<Property name="verticalTextPosition" type="int" value="3"/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="miCommStopActionPerformed"/>
</Events>
</Component>
<Component class="javax.swing.JButton" name="btnConfig">
<Properties>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Dialog" size="10" style="0"/>
</Property>
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.editors2.IconEditor">
<Image iconType="3" name="/com.fr3ts0n.ois/fileexport.png"/>
</Property>
<Property name="toolTipText" type="java.lang.String" value="Serial port configuratopn"/>
<Property name="borderPainted" type="boolean" value="false"/>
<Property name="focusable" type="boolean" value="false"/>
<Property name="horizontalTextPosition" type="int" value="0"/>
<Property name="verticalTextPosition" type="int" value="3"/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="miCommConfigureActionPerformed"/>
</Events>
</Component>
<Component class="javax.swing.JToolBar$Separator" name="jSeparator2">
</Component>
<Component class="javax.swing.JComboBox" name="cbAddress">
<Properties>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Dialog" size="10" style="0"/>
</Property>
<Property name="toolTipText" type="java.lang.String" value="Select device/address"/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="cbAddressActionPerformed"/>
</Events>
</Component>
<Component class="javax.swing.JToolBar$Separator" name="jSeparator3">
</Component>
<Component class="javax.swing.JComboBox" name="cbFrameNum">
<Properties>
<Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
<Font name="Dialog" size="10" style="0"/>
</Property>
<Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
<StringArray count="4">
<StringItem index="0" value="Item 1"/>
<StringItem index="1" value="Item 2"/>
<StringItem index="2" value="Item 3"/>
<StringItem index="3" value="Item 4"/>
</StringArray>
</Property>
<Property name="toolTipText" type="java.lang.String" value="select Frame number to display"/>
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="cbFrameNumActionPerformed"/>
</Events>
</Component>
</SubComponents>
</Container>
</SubComponents>
</Container>
</SubComponents>
</Form>
@@ -0,0 +1,862 @@
/*
* (C) Copyright 2015 by fr3ts0n <erwin.scheuch-heilig@gmx.at>
*
* 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., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
package com.fr3ts0n.ecu.gui.application;
import com.fr3ts0n.common.UTF8Bundle;
import com.fr3ts0n.common.UTF8Control;
import com.fr3ts0n.ecu.EcuCodeItem;
import com.fr3ts0n.ecu.EcuCodeList;
import com.fr3ts0n.ecu.EcuDataItem;
import com.fr3ts0n.ecu.EcuDataPv;
import com.fr3ts0n.ecu.prot.vag.Kw1281Prot;
import com.fr3ts0n.prot.gui.KLHandlerGeneric;
import com.fr3ts0n.pvs.PvList;
import org.jfree.data.time.TimeSeries;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Arrays;
import java.util.HashMap;
import java.util.logging.Handler;
import java.util.logging.LogRecord;
import java.util.logging.Logger;
import javax.swing.DefaultComboBoxModel;
import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
/**
* Main application frame for OBD com.fr3ts0n.test application
*
* @author erwin
*/
public class VagTestFrame extends javax.swing.JFrame
implements PropertyChangeListener
{
/**
*
*/
private static final long serialVersionUID = 3393967156524083211L;
/**
* Program version information
*/
/** prduct name string */
private static final String product = "JaVAG Diagnose";
/** product version string */
private static final String version = "V0.8.0";
/** copyright string */
private static final String copyright = "Copyright (C) 2009-2010 Erwin Scheuch-Heilig";
/** Initialize UTF8 resource bundle */
static UTF8Bundle res = new UTF8Bundle(new UTF8Control());
/** application icon */
private static final ImageIcon appIcon = new ImageIcon(VagTestFrame.class.getResource("/com/fr3ts0n/ecu/gui/res/JaVAG_Logo.png"));
/** Application Logger */
private static final Logger log = Logger.getLogger("app");
/** protocol handler */
private static final Kw1281Prot prt = new Kw1281Prot();
/** Serial communication handler */
// static KLHandler ser = new KLHandler();
private static final KLHandlerGeneric ser = new KLHandlerGeneric();
/** is this a simulation, or the real world? */
static boolean isSimulation = false;
/** ECU addresses */
private static final EcuCodeList AddressList = new EcuCodeList("com.fr3ts0n.ecu.prot.vag.res.ecuadr", 16);
/**
* Action listener to handle read/clear code actions
*/
private final ActionListener hdlrCodeButtons = new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
// if source is not defined, ignore event
if (e.getSource() == null) return;
if (e.getActionCommand().equals("ReadCodes"))
{
prt.setService(Kw1281Prot.SVC_READ_DFCS);
} else if (e.getActionCommand().equals("ClearCodes"))
{
prt.setService(Kw1281Prot.SVC_CLEAR_DFCS);
}
}
};
/**
* Property change listener to ELM-Protocol
*
* @param evt the property change event to be handled
*/
@Override
public void propertyChange(PropertyChangeEvent evt)
{
Object val = evt.getNewValue();
/* handle protocol status changes */
if ("status".equals(evt.getPropertyName()))
{
log.fine("Com status:" + val.toString());
lblStatus.setText(val.toString());
lblStatus.setBackground(KLHandlerGeneric.statColor[((KLHandlerGeneric.ProtStatus) val).ordinal()]);
// re-connect ECU if no shutdown service has been selected
if (prt.getService() != Kw1281Prot.SVC_FINISHED)
{
// on connection error, set service to finished
if (KLHandlerGeneric.ProtStatus.ERROR.equals(val))
prt.setService(Kw1281Prot.SVC_FINISHED);
// on timeout w/o shutdown try to re-connect
if (KLHandlerGeneric.ProtStatus.TIMEOUT.equals(val))
connectEcu();
}
} else if ("baud".equals(evt.getPropertyName()))
{
if (val != null) lblBaud.setText(val.toString());
} else if ("preset".equals(evt.getPropertyName()))
{
/* update group selector only if preset value has changed
* This is because update group selector changes selected data
* group to ALL (since list items get cleared once)
*/
if (evt.getOldValue() == null
|| !evt.getNewValue().equals(evt.getOldValue()))
{
updateGroupSelector();
}
}
}
/** Creates new form VagTestFrame */
@SuppressWarnings({"unchecked", "rawtypes"})
private VagTestFrame()
{
// set up serial handler and protocol drivers
ser.setMessageHandler(prt);
prt.addTelegramWriter(ser);
initComponents();
setIconImage(appIcon.getImage());
// initialize About-Dialog
panAbout.setApplicationName(product);
panAbout.setApplicationVersion(version);
panAbout.setCopyrightString(copyright);
panAbout.setIcon(appIcon);
// initialize other dialogs
panObdData.setPidPvs(Kw1281Prot.PidPvs);
panObdData.setTitle("Data Graph");
// initialize DTC list
panObdDtc.setTcList(Kw1281Prot.tCodes);
panObdDtc.btnReadPending.setVisible(false);
panObdDtc.btnReadPermanent.setVisible(false);
panObdDtc.addActionListener(hdlrCodeButtons);
/* handle number of DTC changes */
prt.addPropertyChangeListener(panObdDtc);
/* handle protocol status changes */
ser.addPropertyChangeListener(this);
prt.addPropertyChangeListener(this);
Object[] adresses = AddressList.values().toArray();
Arrays.sort(adresses);
cbAddress.setModel(new DefaultComboBoxModel(adresses));
// put logging messages of root logger to the status bar
Logger.getLogger("").addHandler(new Handler(){
@Override
public void close() throws SecurityException {
// TODO Auto-generated method stub
}
@Override
public void flush() {
// TODO Auto-generated method stub
}
@Override
public void publish(LogRecord arg0) {
lblMessage.setText(arg0.getMessage());
}
});
// initially update group selector
updateGroupSelector();
}
/**
* Update ComboBox for group selection
*/
@SuppressWarnings("unchecked")
private void updateGroupSelector()
{
cbFrameNum.removeAllItems();
cbFrameNum.addItem("All Groups");
Object[] frames = prt.knownGrpItems.keySet().toArray();
Arrays.sort(frames);
for (int i = 0; i < frames.length; i++)
{
cbFrameNum.addItem(String.format("Group %s", frames[i]));
}
}
/**
* This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
@SuppressWarnings({"rawtypes", "unchecked"})
private void initComponents()
{
java.awt.GridBagConstraints gridBagConstraints;
fChoose = new javax.swing.JFileChooser();
panAbout = new com.fr3ts0n.ecu.gui.application.AboutPanel();
tabMain = new javax.swing.JTabbedPane();
javax.swing.JPanel panStart = new javax.swing.JPanel();
javax.swing.JLabel lblFooter = new javax.swing.JLabel();
javax.swing.JPanel jPanel1 = new javax.swing.JPanel();
javax.swing.JLabel lblTitle = new javax.swing.JLabel();
TblVehIDs = new com.fr3ts0n.pvs.gui.PvTable(Kw1281Prot.VidPvs);
javax.swing.JLabel jLabel1 = new javax.swing.JLabel();
panObdDtc = new com.fr3ts0n.ecu.gui.application.ObdDtcPanel();
panObdData = new com.fr3ts0n.ecu.gui.application.ObdDataPanel();
javax.swing.JPanel panFooter = new javax.swing.JPanel();
lblMessage = new javax.swing.JLabel();
lblStatus = new javax.swing.JLabel();
lblBaud = new javax.swing.JLabel();
cbCnvSystem = new javax.swing.JComboBox();
javax.swing.JPanel panHeader = new javax.swing.JPanel();
javax.swing.JToolBar tbMain = new javax.swing.JToolBar();
btnLoad = new javax.swing.JButton();
btnSave = new javax.swing.JButton();
javax.swing.JToolBar.Separator jSeparator1 = new javax.swing.JToolBar.Separator();
btnConnect = new javax.swing.JButton();
btnStop = new javax.swing.JButton();
btnConfig = new javax.swing.JButton();
javax.swing.JToolBar.Separator jSeparator2 = new javax.swing.JToolBar.Separator();
cbAddress = new javax.swing.JComboBox();
javax.swing.JToolBar.Separator jSeparator3 = new javax.swing.JToolBar.Separator();
cbFrameNum = new javax.swing.JComboBox();
javax.swing.JMenuBar mbMain = new javax.swing.JMenuBar();
javax.swing.JMenu mnuFile = new javax.swing.JMenu();
miLoad = new javax.swing.JMenuItem();
miSave = new javax.swing.JMenuItem();
javax.swing.JMenu mnuComm = new javax.swing.JMenu();
miCommConfigure = new javax.swing.JMenuItem();
miCommInit = new javax.swing.JMenuItem();
miCommStop = new javax.swing.JMenuItem();
javax.swing.JMenu mnuHelp = new javax.swing.JMenu();
miAbout = new javax.swing.JMenuItem();
FormListener formListener = new FormListener();
fChoose.setFileFilter(new ObdFileFilter());
fChoose.setFileSelectionMode(javax.swing.JFileChooser.FILES_AND_DIRECTORIES);
panAbout.setIcon(null);
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setTitle(product + " " + version);
tabMain.setFont(new java.awt.Font("Dialog", 0, 10));
tabMain.setPreferredSize(new java.awt.Dimension(520, 350));
tabMain.addChangeListener(formListener);
panStart.setBackground(new java.awt.Color(255, 255, 255));
panStart.setLayout(new java.awt.BorderLayout());
lblFooter.setFont(new java.awt.Font("Dialog", 0, 10));
lblFooter.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
lblFooter.setText(copyright);
panStart.add(lblFooter, java.awt.BorderLayout.SOUTH);
jPanel1.setBackground(new java.awt.Color(255, 255, 255));
jPanel1.setBorder(javax.swing.BorderFactory.createEmptyBorder(10, 10, 10, 10));
jPanel1.setLayout(new java.awt.BorderLayout(0, 25));
lblTitle.setFont(new java.awt.Font("Dialog", 1, 18));
lblTitle.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
lblTitle.setText(product);
lblTitle.setVerticalAlignment(javax.swing.SwingConstants.TOP);
jPanel1.add(lblTitle, java.awt.BorderLayout.NORTH);
TblVehIDs.setAutoResizeMode(5);
TblVehIDs.setFocusable(false);
TblVehIDs.setName("TblVids"); // NOI18N
TblVehIDs.setOpaque(false);
TblVehIDs.setRowSelectionAllowed(false);
TblVehIDs.setShowGrid(false);
jPanel1.add(TblVehIDs, java.awt.BorderLayout.CENTER);
jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
jLabel1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/com/fr3ts0n/ecu/gui/res/javag.png"))); // NOI18N
jPanel1.add(jLabel1, java.awt.BorderLayout.SOUTH);
panStart.add(jPanel1, java.awt.BorderLayout.CENTER);
tabMain.addTab("About", panStart);
tabMain.addTab("Fault Codes", panObdDtc);
tabMain.addTab("Data", panObdData);
getContentPane().add(tabMain, java.awt.BorderLayout.CENTER);
panFooter.setLayout(new java.awt.GridBagLayout());
lblMessage.setFont(new java.awt.Font("Dialog", 0, 10));
lblMessage.setText(String.format("%s %s", product, version));
lblMessage.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.LOWERED));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.weightx = 1.0;
panFooter.add(lblMessage, gridBagConstraints);
lblStatus.setFont(new java.awt.Font("Dialog", 0, 10));
lblStatus.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
lblStatus.setText("Status");
lblStatus.setBorder(javax.swing.BorderFactory.createCompoundBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.LOWERED), javax.swing.BorderFactory.createEmptyBorder(1, 3, 1, 3)));
lblStatus.setMinimumSize(new java.awt.Dimension(90, 18));
lblStatus.setOpaque(true);
lblStatus.setPreferredSize(new java.awt.Dimension(90, 18));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
panFooter.add(lblStatus, gridBagConstraints);
lblBaud.setFont(new java.awt.Font("Dialog", 0, 10));
lblBaud.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING);
lblBaud.setText("BaudRate");
lblBaud.setToolTipText("Baud rate");
lblBaud.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.LOWERED));
lblBaud.setMinimumSize(new java.awt.Dimension(54, 16));
lblBaud.setPreferredSize(new java.awt.Dimension(54, 16));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
panFooter.add(lblBaud, gridBagConstraints);
cbCnvSystem.setFont(new java.awt.Font("Dialog", 0, 10));
cbCnvSystem.setModel(new javax.swing.DefaultComboBoxModel(new String[]{"Metric", "Imperial"}));
cbCnvSystem.setToolTipText("Select conversion system");
cbCnvSystem.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.LOWERED));
cbCnvSystem.setPreferredSize(new java.awt.Dimension(71, 23));
cbCnvSystem.addItemListener(formListener);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
panFooter.add(cbCnvSystem, gridBagConstraints);
getContentPane().add(panFooter, java.awt.BorderLayout.SOUTH);
panHeader.setLayout(new java.awt.BorderLayout());
tbMain.setFloatable(false);
tbMain.setRollover(true);
tbMain.setFont(new java.awt.Font("Dialog", 0, 10));
btnLoad.setFont(new java.awt.Font("Dialog", 0, 10));
btnLoad.setIcon(new javax.swing.ImageIcon(getClass().getResource("/com/fr3ts0n/common/res/fileopen.png"))); // NOI18N
btnLoad.setToolTipText("Load measurements");
btnLoad.setBorderPainted(false);
btnLoad.setFocusable(false);
btnLoad.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
btnLoad.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
btnLoad.addActionListener(formListener);
tbMain.add(btnLoad);
btnSave.setFont(new java.awt.Font("Dialog", 0, 10));
btnSave.setIcon(new javax.swing.ImageIcon(getClass().getResource("/com/fr3ts0n/common/res/filesaveas.png"))); // NOI18N
btnSave.setToolTipText("Save measurements");
btnSave.setBorderPainted(false);
btnSave.setFocusable(false);
btnSave.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
btnSave.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
btnSave.addActionListener(formListener);
tbMain.add(btnSave);
tbMain.add(jSeparator1);
btnConnect.setFont(new java.awt.Font("Dialog", 0, 10));
btnConnect.setIcon(new javax.swing.ImageIcon(getClass().getResource("/com/fr3ts0n/common/res/connect_established.png"))); // NOI18N
btnConnect.setToolTipText("Start communication");
btnConnect.setBorderPainted(false);
btnConnect.setFocusable(false);
btnConnect.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
btnConnect.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
btnConnect.addActionListener(formListener);
tbMain.add(btnConnect);
btnStop.setFont(new java.awt.Font("Dialog", 0, 10));
btnStop.setIcon(new javax.swing.ImageIcon(getClass().getResource("/com/fr3ts0n/common/res/no.png"))); // NOI18N
btnStop.setToolTipText("Stop communication");
btnStop.setBorderPainted(false);
btnStop.setFocusable(false);
btnStop.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
btnStop.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
btnStop.addActionListener(formListener);
tbMain.add(btnStop);
btnConfig.setFont(new java.awt.Font("Dialog", 0, 10));
btnConfig.setIcon(new javax.swing.ImageIcon(getClass().getResource("/com/fr3ts0n/common/res/fileexport.png"))); // NOI18N
btnConfig.setToolTipText("Serial port configuratopn");
btnConfig.setBorderPainted(false);
btnConfig.setFocusable(false);
btnConfig.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
btnConfig.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
btnConfig.addActionListener(formListener);
tbMain.add(btnConfig);
tbMain.add(jSeparator2);
cbAddress.setFont(new java.awt.Font("Dialog", 0, 10));
cbAddress.setToolTipText("Select device/address");
cbAddress.addActionListener(formListener);
tbMain.add(cbAddress);
tbMain.add(jSeparator3);
cbFrameNum.setFont(new java.awt.Font("Dialog", 0, 10));
cbFrameNum.setModel(new javax.swing.DefaultComboBoxModel(new String[]{"Item 1", "Item 2", "Item 3", "Item 4"}));
cbFrameNum.setToolTipText("select Frame number to display");
cbFrameNum.addActionListener(formListener);
tbMain.add(cbFrameNum);
panHeader.add(tbMain, java.awt.BorderLayout.NORTH);
getContentPane().add(panHeader, java.awt.BorderLayout.NORTH);
mbMain.setFont(new java.awt.Font("Dialog", 0, 10)); // NOI18N
mnuFile.setMnemonic('F');
mnuFile.setText("File");
mnuFile.setFont(new java.awt.Font("Dialog", 0, 10)); // NOI18N
miLoad.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F3, 0));
miLoad.setFont(new java.awt.Font("Dialog", 0, 10));
miLoad.setMnemonic('L');
miLoad.setText("Load measurement");
miLoad.addActionListener(formListener);
mnuFile.add(miLoad);
miSave.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F4, 0));
miSave.setFont(new java.awt.Font("Dialog", 0, 10));
miSave.setMnemonic('S');
miSave.setText("Save measurement");
miSave.addActionListener(formListener);
mnuFile.add(miSave);
mbMain.add(mnuFile);
mnuComm.setMnemonic('C');
mnuComm.setText("Communication");
mnuComm.setFont(new java.awt.Font("Dialog", 0, 10)); // NOI18N
miCommConfigure.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F8, 0));
miCommConfigure.setFont(new java.awt.Font("Dialog", 0, 10));
miCommConfigure.setMnemonic('C');
miCommConfigure.setText("Port Configuration...");
miCommConfigure.addActionListener(formListener);
mnuComm.add(miCommConfigure);
miCommInit.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F5, 0));
miCommInit.setFont(new java.awt.Font("Dialog", 0, 10));
miCommInit.setMnemonic('I');
miCommInit.setText("Initialize");
miCommInit.addActionListener(formListener);
mnuComm.add(miCommInit);
miCommStop.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F6, 0));
miCommStop.setFont(new java.awt.Font("Dialog", 0, 10));
miCommStop.setMnemonic('p');
miCommStop.setText("Stop");
miCommStop.addActionListener(formListener);
mnuComm.add(miCommStop);
mbMain.add(mnuComm);
mnuHelp.setMnemonic('H');
mnuHelp.setText("Help");
mnuHelp.setFont(new java.awt.Font("Dialog", 0, 10)); // NOI18N
miAbout.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_F1, 0));
miAbout.setFont(new java.awt.Font("Dialog", 0, 10));
miAbout.setMnemonic('A');
miAbout.setText("About");
miAbout.addActionListener(formListener);
mnuHelp.add(miAbout);
mbMain.add(mnuHelp);
setJMenuBar(mbMain);
pack();
}
// Code for dispatching events from components to event handlers.
private class FormListener implements java.awt.event.ActionListener, java.awt.event.ItemListener, javax.swing.event.ChangeListener
{
FormListener()
{
}
public void actionPerformed(java.awt.event.ActionEvent evt)
{
if (evt.getSource() == btnLoad)
{
VagTestFrame.this.miLoadActionPerformed();
} else if (evt.getSource() == btnSave)
{
VagTestFrame.this.miSaveActionPerformed();
} else if (evt.getSource() == btnConnect)
{
VagTestFrame.this.connectEcu();
} else if (evt.getSource() == btnStop)
{
VagTestFrame.this.miCommStopActionPerformed();
} else if (evt.getSource() == btnConfig)
{
VagTestFrame.this.miCommConfigureActionPerformed();
} else if (evt.getSource() == cbAddress)
{
VagTestFrame.this.cbAddressActionPerformed();
} else if (evt.getSource() == cbFrameNum)
{
VagTestFrame.this.cbFrameNumActionPerformed();
} else if (evt.getSource() == miLoad)
{
VagTestFrame.this.miLoadActionPerformed();
} else if (evt.getSource() == miSave)
{
VagTestFrame.this.miSaveActionPerformed();
} else if (evt.getSource() == miCommConfigure)
{
VagTestFrame.this.miCommConfigureActionPerformed();
} else if (evt.getSource() == miCommInit)
{
VagTestFrame.this.connectEcu();
} else if (evt.getSource() == miCommStop)
{
VagTestFrame.this.miCommStopActionPerformed();
} else if (evt.getSource() == miAbout)
{
VagTestFrame.this.miAboutActionPerformed();
}
}
public void itemStateChanged(java.awt.event.ItemEvent evt)
{
if (evt.getSource() == cbCnvSystem)
{
VagTestFrame.this.cbCnvSystemItemStateChanged();
}
}
public void stateChanged(javax.swing.event.ChangeEvent evt)
{
if (evt.getSource() == tabMain)
{
VagTestFrame.this.tabMainStateChanged();
}
}
}// </editor-fold>//GEN-END:initComponents
private void miCommConfigureActionPerformed()//GEN-FIRST:event_miCommConfigureActionPerformed
{//GEN-HEADEREND:event_miCommConfigureActionPerformed
ser.configure();
}//GEN-LAST:event_miCommConfigureActionPerformed
private void miCommStopActionPerformed()//GEN-FIRST:event_miCommStopActionPerformed
{//GEN-HEADEREND:event_miCommStopActionPerformed
// switch off PID's supported'
prt.setService(Kw1281Prot.SVC_SHUTDOWN);
}//GEN-LAST:event_miCommStopActionPerformed
private void miSaveActionPerformed()//GEN-FIRST:event_miSaveActionPerformed
{//GEN-HEADEREND:event_miSaveActionPerformed
if (fChoose.showSaveDialog(this) == JFileChooser.APPROVE_OPTION)
{
File file = fChoose.getSelectedFile();
// ask for overwrite existing file
if (!file.exists()
|| JOptionPane.showConfirmDialog(this,
"Really want to overwrite " + file.getPath(),
"File overwrite",
JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION)
try
{
FileOutputStream out = new FileOutputStream(file);
ObjectOutputStream oOut = new ObjectOutputStream(out);
/* remember current measurement page for loading again */
Integer currPage = Integer.valueOf(tabMain.getSelectedIndex());
oOut.writeObject(currPage);
/* save the data */
oOut.writeObject(Kw1281Prot.VidPvs);
oOut.writeObject(Kw1281Prot.PidPvs);
oOut.writeObject(Kw1281Prot.tCodes);
oOut.writeObject(panObdData.selPids);
oOut.close();
} catch (IOException ex)
{
ex.printStackTrace();
JOptionPane.showMessageDialog(this,
ex.getLocalizedMessage(),
"Save ERROR",
JOptionPane.ERROR_MESSAGE);
}
}
}//GEN-LAST:event_miSaveActionPerformed
@SuppressWarnings({"unchecked"})
private void miLoadActionPerformed()//GEN-FIRST:event_miLoadActionPerformed
{//GEN-HEADEREND:event_miLoadActionPerformed
if (fChoose.showOpenDialog(this) == JFileChooser.APPROVE_OPTION)
{
File file = fChoose.getSelectedFile();
try
{
FileInputStream in = new FileInputStream(file);
ObjectInputStream oIn = new ObjectInputStream(in);
/* ensure that measurement page is activated
to avoid deletion of loaded data afterwards */
Integer currPage = (Integer) oIn.readObject();
tabMain.setSelectedIndex(currPage);
/* read in the data */
Kw1281Prot.VidPvs = (PvList) oIn.readObject();
Kw1281Prot.PidPvs = (PvList) oIn.readObject();
Kw1281Prot.tCodes = (PvList) oIn.readObject();
// re-setup data connection
panObdData.setPidPvs(Kw1281Prot.PidPvs);
panObdDtc.setTcList(Kw1281Prot.tCodes);
TblVehIDs.setProcessVar(Kw1281Prot.VidPvs);
// read measurement history
panObdData.selPids = (HashMap<Object, TimeSeries>) oIn.readObject();
oIn.close();
} catch (Exception ex)
{
ex.printStackTrace();
JOptionPane.showMessageDialog(this,
ex.getMessage(),
"Load ERROR",
JOptionPane.ERROR_MESSAGE);
}
}
}//GEN-LAST:event_miLoadActionPerformed
/**
* handle change of conversion system
*/
private void cbCnvSystemItemStateChanged()//GEN-FIRST:event_cbCnvSystemItemStateChanged
{//GEN-HEADEREND:event_cbCnvSystemItemStateChanged
// set new conversion system
EcuDataItem.cnvSystem = cbCnvSystem.getSelectedIndex();
// update currently selected display
switch (tabMain.getSelectedIndex())
{
case 2:
panObdData.updateAllTableRows(EcuDataPv.FID_UNITS);
break;
default:
// intentionally do nothing ...
}
}//GEN-LAST:event_cbCnvSystemItemStateChanged
/**
* update form/tab selection
*/
private void tabMainStateChanged()//GEN-FIRST:event_tabMainStateChanged
{//GEN-HEADEREND:event_tabMainStateChanged
// request OBD service for selected Tab
requestServiceForSelectedTab();
}//GEN-LAST:event_tabMainStateChanged
private void cbAddressActionPerformed()//GEN-FIRST:event_cbAddressActionPerformed
{//GEN-HEADEREND:event_cbAddressActionPerformed
EcuCodeItem itm = (EcuCodeItem) cbAddress.getSelectedItem();
int newAddress = Integer.parseInt(itm.get(EcuCodeItem.FID_CODE).toString(), 16);
if (newAddress > 0)
{
setControllerAddress(newAddress);
}
}//GEN-LAST:event_cbAddressActionPerformed
private void cbFrameNumActionPerformed()//GEN-FIRST:event_cbFrameNumActionPerformed
{//GEN-HEADEREND:event_cbFrameNumActionPerformed
int sel = cbFrameNum.getSelectedIndex();
// single selection
if (sel > 0 && sel < prt.knownGrpItems.size())
{
String selStr = cbFrameNum.getSelectedItem().toString();
int frmNum = Integer.parseInt(selStr.replaceAll("Group ", "").trim());
prt.setSelectedDataGroup((char) frmNum);
}
// request corresponding service
requestServiceForSelectedTab();
}//GEN-LAST:event_cbFrameNumActionPerformed
private void connectEcu()//GEN-FIRST:event_connectEcu
{//GEN-HEADEREND:event_connectEcu
Kw1281Prot.VidPvs.clear();
ser.start();
}//GEN-LAST:event_connectEcu
private void miAboutActionPerformed()//GEN-FIRST:event_miAboutActionPerformed
{//GEN-HEADEREND:event_miAboutActionPerformed
JOptionPane.showMessageDialog(this, panAbout, "About ...", JOptionPane.PLAIN_MESSAGE);
}//GEN-LAST:event_miAboutActionPerformed
/**
* request corresponding OBD service for selected Tab
*/
private void requestServiceForSelectedTab()
{
// handle page change ...
switch (tabMain.getSelectedIndex())
{
case 0: // About panel
// switch off PID's supported'
prt.setService(Kw1281Prot.SVC_NONE);
break;
case 1: // Trouble code panel
// we don't set any service here
// since service is selected by buttons
prt.setService(Kw1281Prot.SVC_NONE);
break;
case 2: // data item panel
// set service depending on ALL / SINGLE Selection
prt.setService(cbFrameNum.getSelectedIndex() == 0
? Kw1281Prot.SVC_READ_DATA_ALL
: Kw1281Prot.SVC_READ_DATA_GRP);
break;
default:
// switch off PID's supported'
prt.setService(Kw1281Prot.SVC_NONE);
// do nothing
}
}
/**
* set controller address and re-start communication with new address
*
* @param newAddress new controller to be accessed
*/
private void setControllerAddress(int newAddress)
{
cbAddress.setSelectedItem(AddressList.get(newAddress));
if (newAddress != ser.getCurrAddress())
{
prt.initialize();
ser.setCurrAddress(newAddress);
ser.start();
}
}
/**
* The main routine
*
* @param args the command line arguments
*/
public static void main(String args[])
{
VagTestFrame frm = new VagTestFrame();
frm.setVisible(true);
// command line argument is the com port
if (args.length > 0)
{
try
{
/** set up serial port to be used */
ser.setDeviceName(args[0]);
/**
* only auto-connect to vehicle system if address is
* specified (in HEX)
*/
if (args.length > 1)
{
frm.setControllerAddress(Integer.parseInt(args[1], 16));
}
} catch (Exception ex)
{
JOptionPane.showMessageDialog(frm,
args[0],
ex.toString(),
JOptionPane.ERROR_MESSAGE);
}
} else
{
// without parameter we do internal telegram simulation ...
prt.simulation.start();
}
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private com.fr3ts0n.pvs.gui.PvTable TblVehIDs;
private javax.swing.JButton btnConfig;
private javax.swing.JButton btnConnect;
private javax.swing.JButton btnLoad;
private javax.swing.JButton btnSave;
private javax.swing.JButton btnStop;
@SuppressWarnings("rawtypes")
private javax.swing.JComboBox cbAddress;
@SuppressWarnings("rawtypes")
private javax.swing.JComboBox cbCnvSystem;
@SuppressWarnings("rawtypes")
private javax.swing.JComboBox cbFrameNum;
private javax.swing.JFileChooser fChoose;
private javax.swing.JLabel lblBaud;
private javax.swing.JLabel lblMessage;
private javax.swing.JLabel lblStatus;
private javax.swing.JMenuItem miAbout;
private javax.swing.JMenuItem miCommConfigure;
private javax.swing.JMenuItem miCommInit;
private javax.swing.JMenuItem miCommStop;
private javax.swing.JMenuItem miLoad;
private javax.swing.JMenuItem miSave;
private com.fr3ts0n.ecu.gui.application.AboutPanel panAbout;
private com.fr3ts0n.ecu.gui.application.ObdDataPanel panObdData;
private com.fr3ts0n.ecu.gui.application.ObdDtcPanel panObdDtc;
private javax.swing.JTabbedPane tabMain;
// End of variables declaration//GEN-END:variables
}
@@ -0,0 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<body>
Java/Swing applications for ECU/OBD diagnostic
</body>
</html>
Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

+6
View File
@@ -0,0 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<body>
Resources for ECU/OBD diagnostic applications
</body>
</html>
+6
View File
@@ -0,0 +1,6 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<body>
ECU/OBD diagnostic related classes
</body>
</html>
+235
View File
@@ -0,0 +1,235 @@
/*
* (C) Copyright 2015 by fr3ts0n <erwin.scheuch-heilig@gmx.at>
*
* 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., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
package com.fr3ts0n.ecu.prot.obd;
import com.fr3ts0n.ecu.Conversions;
import com.fr3ts0n.ecu.EcuDataPv;
import com.fr3ts0n.prot.ProtoHeader;
import com.fr3ts0n.pvs.PvList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Vector;
import java.util.logging.Level;
/**
* Base class for all CAN protocol implementations
*
* @author erwin
*/
public abstract class CanProt extends ProtoHeader
{
private static final int ID_CAN_SVC = 0;
/**
* additional field indices (extending message parameters)
* to table below
*/
private static final int FLD_ID_CONV = 3;
private static final int FLD_ID_DECIMALS = 4;
private static final int FLD_ID_CANID = 5;
/**
* List of telegram parameters in order of appearance
*/
private static final int[][] CAN_PARAMETERS =
/* START, LEN, PARAM-TYPE // REMARKS */
/* ------------------------------------------- */
{{0, 2, PT_HEX}, // ID_CAN_SVC
};
private static final String[] CAN_DESCRIPTORS =
{
"CAN Service",
};
/** process variable list which holds all parameters */
public PvList CanPvs = new PvList();
/** internal Map for CAN messages to parameters */
private final HashMap<Integer, Vector<Integer>> canMsgMap = new HashMap<Integer, Vector<Integer>>();
/** Creates a new instance of CanProt */
CanProt()
{
for (int i = 0; i < getMsgParameters().length; i++)
{
int convId = getMsgParameters()[i][FLD_ID_CONV];
Integer paramId = Integer.valueOf(i);
Integer canId = getMsgParameters()[i][FLD_ID_CANID];
// enter all parameters per CAN message
Vector<Integer> paramList = canMsgMap.get(canId);
if (paramList == null)
paramList = new Vector<Integer>();
paramList.add(paramId);
canMsgMap.put(canId, paramList);
/** enter process variables for each parameter */
EcuDataPv pidData = new EcuDataPv();
pidData.put(EcuDataPv.FID_PID, paramId);
pidData.put(EcuDataPv.FID_DESCRIPT, getMsgDescriptors()[i]);
pidData.put(EcuDataPv.FID_UNITS, Conversions.getUnits(convId));
pidData.put(EcuDataPv.FID_VALUE, Float.valueOf(0));
pidData.put(EcuDataPv.FID_FORMAT, "%."+getMsgParameters()[i][FLD_ID_DECIMALS]+"d");
pidData.put(EcuDataPv.FID_CNVID, Integer.valueOf(getMsgParameters()[i][FLD_ID_CONV]));
CanPvs.put(paramId, pidData);
}
}
/**
* prepare process variables for each PID
*
*/
public void preparePidPvs()
{
for (int i = 0; i < getMsgParameters().length; i++)
{
Integer paramId = i;
/** enter process variables for each parameter */
EcuDataPv pidData = (EcuDataPv) CanPvs.get(paramId);
if (pidData != null)
{
int convId = getMsgParameters()[i][FLD_ID_CONV];
pidData.put(EcuDataPv.FID_UNITS, Conversions.getUnits(convId));
}
}
}
/**
* get List of message dependent telegram parameters in order of appearance
* Each parameter set contains following elements<br>
* <pre>START, LEN, TYPE, CONVERSION_ID, , ID // REMARKS </pre>
* <pre>---------------------------------------------------------------------------------</pre>
*/
protected abstract int[][] getMsgParameters();
/**
* get list of message parameter descriptions
*
* @return list of messag parameter descriptors
*/
protected abstract String[] getMsgDescriptors();
/**
* get physical parameter value from message buffer
*/
private float getMsgValue(int ID, char[] buffer)
{
int memVal = ((Integer) getParamValue(ID, getMsgParameters(), buffer)).intValue();
return (Conversions.memToPhys(memVal, getMsgParameters()[ID][FLD_ID_CONV]));
}
/**
* create a new telegram header for selected payload data buffer
* inclunding setting all ID's, sizes and validity issues
*
* @param buffer buffer of payload data
* @return buffer of new telegram header
*/
protected char[] getNewHeader(char[] buffer)
{
return (emptyBuffer);
}
/**
* return message footer for protocol payload
*
* @return buffer of message footer
*/
public char[] getFooter()
{
return (emptyBuffer);
}
/**
* create a new telegram header inclunding setting all ID's, sizes and
* validity issues
*
* @return buffer of new telegram header
*/
protected char[] getNewHeader(char[] buffer, int type, Object id)
{
return (emptyBuffer);
}
/**
* list of parameters for specific protocol
*
* @return complete set of protocol parameters
*/
public int[][] getTelegramParams()
{
return (CAN_PARAMETERS);
}
/**
* list of parameter descriptions for specific protocol
*
* @return complete set of protocol parameter description strings
*/
protected String[] getParamDescriptors()
{
return (CAN_DESCRIPTORS);
}
/**
* handle incoming protocol telegram
* default implementaion only checks telegram and notifies listeners with
* protocol payload
*
* @param buffer - telegram buffer
* @return number of listeners notified
*/
@SuppressWarnings("rawtypes")
@Override
public int handleTelegram(char[] buffer)
{
int retValue = 0;
try
{
Integer msgId = (Integer) getParamValue(ID_CAN_SVC, buffer);
Vector params = canMsgMap.get(msgId);
if (params != null)
{
Iterator it = params.iterator();
while (it.hasNext())
{
Integer parId = (Integer) it.next();
float value = getMsgValue(parId.intValue(), buffer);
EcuDataPv pv = (EcuDataPv) CanPvs.get(parId);
if (pv != null)
{
// now store all changes to PV
pv.put(EcuDataPv.FIELDS[EcuDataPv.FID_VALUE], Float.valueOf(value));
}
}
retValue = params.size();
}
} catch (Exception e)
{
log.log(Level.SEVERE, e.toString(), e);
}
return retValue;
}
}
+91
View File
@@ -0,0 +1,91 @@
/*
* (C) Copyright 2015 by fr3ts0n <erwin.scheuch-heilig@gmx.at>
*
* 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., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
package com.fr3ts0n.ecu.prot.obd;
import com.fr3ts0n.ecu.Conversions;
/**
* CAN protocol definition for Ford Focus 1.8 TDI (Experimental)
*
* @author erwin
*/
public class CanProtFord extends CanProt
{
/**
* List of message dependent telegram parameters in order of appearance
*/
private static final int[][] MSG_PARAMETERS =
/* START, LEN, PARAM-TYPE CONVERSION , DEC, MSG_ID // REMARKS */
/* ----------------------------------------------------------------------------------------------------------- */
{
/* MSG 25 (Engine) */
{2, 4, PT_HEX, Conversions.CNV_ID_RPM, 0, 0x25}, // Engine RPM [/min]
{6, 4, PT_HEX_S16, Conversions.CNV_ID_RATIO, 1, 0x25}, // Engine speed regulator [%]
{10, 2, PT_HEX, Conversions.CNV_ID_PERCENT, 1, 0x25}, // AccPed Position [%]
/* MSG 2 (Speed) */
{2, 4, PT_HEX, Conversions.CNV_ID_SPEED_HIGHRES, 1, 0x02}, // Vehicle speed [km/h]
/* MSG 10 (ECT) */
{2, 2, PT_HEX, Conversions.CNV_ID_TEMPERATURE, 1, 0x10}, // Engine coolant temp [°C]
/* MSG 14 (ASR/ESP?) */
{2, 2, PT_HEX, Conversions.CNV_ID_ONETOONE, 0, 0x14}, // ESP-Status [-]
{4, 2, PT_HEX, Conversions.CNV_ID_TORQUE, 1, 0x14}, // ESP ratio2? [%]
/* MSG 12 (Engine Warmup?) */
{2, 2, PT_HEX, Conversions.CNV_ID_TORQUE, 1, 0x12}, // Warmup counter [-]
/* MSG 30 (T15?) */
{2, 2, PT_HEX, Conversions.CNV_ID_ONETOONE, 0, 0x30}, // T15 Status? [-]
};
/**
* list of message parameter descriptions
*/
private static final String[] MSG_DESCRIPTORS =
{
"Engine RPM",
"Engine regulator",
"Accelerator pedal",
"Vehicle speed",
"Engine coolant temparature",
"ASR/ESP Status",
"ASR/ESP Torque Limit",
"Max. Engine torque",
"T15 status",
};
/**
* get List of message dependent telegram parameters in order of appearance
* Each parameter set contains following elements<br>
* <pre>START, LEN, TYPE, CONVERSION_ID, , ID // REMARKS </pre>
* <pre>---------------------------------------------------------------------------------</pre>
*/
public int[][] getMsgParameters()
{
return (MSG_PARAMETERS);
}
/**
* get list of message parameter descriptions
*
* @return list of messag parameter descriptors
*/
public String[] getMsgDescriptors()
{
return (MSG_DESCRIPTORS);
}
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,43 @@
package com.fr3ts0n.ecu.prot.obd;
import com.fr3ts0n.common.UTF8Bundle;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
public class Messages
{
private static final String BUNDLE_NAME = "com.fr3ts0n.ecu.prot.obd.res.messages"; //$NON-NLS-1$
private static ResourceBundle RESOURCE_BUNDLE;
public Messages()
{
init(BUNDLE_NAME);
}
/**
* Initialize messages with a new message bundle
*
* @param bundleName Name of message bundle
*/
public static void init(String bundleName)
{
RESOURCE_BUNDLE = UTF8Bundle.getBundle(bundleName);
}
public static String getString(String key, String defaultString)
{
try
{
return RESOURCE_BUNDLE.getString(key);
} catch (MissingResourceException e)
{
return defaultString;
}
}
public static String getString(String key)
{
return getString(key, '!' + key + '!');
}
}
+924
View File
@@ -0,0 +1,924 @@
/**
* (C) Copyright 2015 by fr3ts0n <erwin.scheuch-heilig@gmx.at>
* <p>
* 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.
* <p>
* 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.
* <p>
* 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., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
package com.fr3ts0n.ecu.prot.obd;
import com.fr3ts0n.ecu.Conversion;
import com.fr3ts0n.ecu.EcuCodeItem;
import com.fr3ts0n.ecu.EcuCodeList;
import com.fr3ts0n.ecu.EcuConversions;
import com.fr3ts0n.ecu.EcuDataItem;
import com.fr3ts0n.ecu.EcuDataItems;
import com.fr3ts0n.ecu.EcuDataPv;
import com.fr3ts0n.ecu.ObdCodeItem;
import com.fr3ts0n.ecu.ObdPid;
import com.fr3ts0n.prot.ProtoHeader;
import com.fr3ts0n.prot.TelegramListener;
import com.fr3ts0n.prot.TelegramWriter;
import com.fr3ts0n.pvs.PvChangeEvent;
import com.fr3ts0n.pvs.PvList;
import java.beans.PropertyChangeEvent;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Vector;
/**
* OBD communication protocol layer
*
* The OBD protocol supports services which serve multiple PID's
* A request of PID which is a multiple of 0x20 (0x00,0x20...0xE0) for each
* service returns a bitmask of the next 32 PIDs which are suppoted by the vehicle
* @author erwin
*/
public class ObdProt extends ProtoHeader
implements TelegramListener, TelegramWriter
{
public static final int OBD_SVC_NONE = 0x00;
public static final int OBD_SVC_DATA = 0x01;
public static final int OBD_SVC_FREEZEFRAME = 0x02;
public static final int OBD_SVC_READ_CODES = 0x03;
public static final int OBD_SVC_CLEAR_CODES = 0x04;
public static final int OBD_SVC_O2_RESULT = 0x05;
public static final int OBD_SVC_MON_RESULT = 0x06;
public static final int OBD_SVC_PENDINGCODES = 0x07;
public static final int OBD_SVC_CTRL_MODE = 0x08;
public static final int OBD_SVC_VEH_INFO = 0x09;
public static final int OBD_SVC_PERMACODES = 0x0A;
/** negative response ID */
private static final int OBD_ID_NRC = 0x7F;
/** perform immediate reset on NRC reception? */
private boolean isResetOnNrc()
{
return resetOnNrc;
}
/** Set protocol parameter
* @param resetOnNrc perform immediate reset on NRC reception?
*/
public void setResetOnNrc(boolean resetOnNrc)
{
log.info(String.format("Reset on NRC = %b", resetOnNrc));
this.resetOnNrc = resetOnNrc;
}
/** negative response codes */
public enum NRC
{
GR(0x10, "General reject",DISP.ERROR, REACT.RESET),
SNS(0x11, "Service 0x%02X not supported", DISP.ERROR, REACT.CANCEL),
SFNS(0x12, "Sub-Function not supported (SVC:0x%02X)", DISP.NOTIFY, REACT.SKIP),
IMLOIF(0x13, "Incorrect message length or invalid format", DISP.NOTIFY, REACT.SKIP),
RTL(0x14, "Response too long", DISP.NOTIFY, REACT.SKIP),
BRR(0x21, "Busy repeat request", DISP.NOTIFY, REACT.REPEAT),
CNC(0x22, "Conditions not correct (SVC:0x%02X)", DISP.ERROR, REACT.CANCEL),
RSE(0x24, "Request sequence error", DISP.ERROR, REACT.CANCEL),
NRFSC(0x25, "No response from sub-net component", DISP.ERROR, REACT.RESET),
FPEORA(0x26, "Failure prevents execution of requested action", DISP.ERROR, REACT.CANCEL),
ROOR(0x31, "Request out of range (SVC:0x%02X)", DISP.NOTIFY, REACT.SKIP),
SAD(0x33, "Security access denied", DISP.ERROR, REACT.CANCEL),
IK(0x35, "Invalid key", DISP.ERROR, REACT.RESET),
ENOA(0x36, "Exceeded number of attempts", DISP.ERROR, REACT.RESET),
RTDNE(0x37, "Required time delay not expired", DISP.NOTIFY, REACT.REPEAT),
UDNA(0x70, "Upload/Download not accepted", DISP.ERROR, REACT.CANCEL),
TDS(0x71, "Transfer data suspended", DISP.NOTIFY, REACT.REPEAT),
GPF(0x72, "General programming failure", DISP.ERROR, REACT.CANCEL),
WBSC(0x73, "Wrong Block Sequence Counter", DISP.ERROR, REACT.CANCEL),
RCRRP(0x78, "Request correctly received but response is pending", DISP.NOTIFY, REACT.IGNORE),
SFNSIAS(0x7E, "Sub-Function not supported in active session (SVC:0x%02X)", DISP.NOTIFY, REACT.SKIP),
SNSIAS(0x7F, "Service 0x%02X not supported in active session", DISP.ERROR, REACT.CANCEL);
/** NRC display classifiers */
public enum DISP
{
HIDE, /**< Do NOT display error */
NOTIFY, /**< Display notification (w/o confirmation) */
WARN, /**< Display warning (w/ confirmation) */
ERROR /**< Display error (w/ confirmation) */
}
/** NRC immediate protocol reaction classifiers */
public enum REACT
{
IGNORE, /**< Ignore NRC */
SKIP, /**< Skip last command */
REPEAT, /**< Repeat last command */
CANCEL, /**< Cancel command sequence / loop */
RESET /**< Reset adapter */
}
public final int code;
public final String description;
public final DISP disp;
public final REACT react;
NRC(int _code, String _description, DISP _DISPClass, REACT _REACTClass)
{
code = _code;
description = _description;
disp = _DISPClass;
react = _REACTClass;
}
/**
* Get NRC with specified ID (NRC-code)
* @param id ID (NRC-code) to search
* @return specified NRC, or null if not found
*/
static NRC get(int id)
{
NRC result = null;
for (NRC nrc : values())
{
if (nrc.code == id)
{
result = nrc;
break;
}
}
return result;
}
/** return String representative */
public String toString(int service)
{
return String.format("(NRC:0x%02X) %s", code, String.format(description, service));
}
}
/** property name "number of codes" */
public static final String PROP_NUM_CODES = "numCodes";
public static final String PROP_NRC = "NRC";
// current supported PID
private static int currSupportedPid = 0;
static boolean pidsWrapped = false;
/** content of last sent message */
static String lastTxMsg = "";
/** content of last received message */
static String lastRxMsg = "";
/** Holds value of property service. */
int service = OBD_SVC_NONE;
/** service of last incoming message */
private int msgService = OBD_SVC_NONE;
/** List of PIDs supported by the vehicle */
private static final Vector<ObdPid> pidSupported = new Vector<ObdPid>();
/** positive response fields */
private static final int ID_OBD_SVC = 0;
private static final int ID_OBD_PID = 1;
private static final int ID_OBD_FRAMEID = 2;
/** negative response fields */
public static final int ID_NR_ID = 0;
private static final int ID_NR_SVC = 1;
private static final int ID_NR_CODE = 2;
/**
* Negative response parameters
* List of telegram parameters in order of appearance
*/
private static final int[][] NR_PARAMETERS =
/* START, LEN, PARAM-TYPE // REMARKS */
/* ------------------------------------------- */
{{0, 2, PT_HEX}, // ID_NR_ID
{2, 2, PT_HEX}, // ID_NR_SVC
{4, 2, PT_HEX}, // ID_NR_CODE
};
/**
* List of telegram parameters in order of appearance
*/
private static final int[][] SVC_PARAMETERS =
/* START, LEN, PARAM-TYPE // REMARKS */
/* ------------------------------------------- */
{{0, 2, PT_HEX}, // ID_OBD_SVC
};
/**
* List of telegram parameters in order of appearance
*/
private static final int[][] OBD_PARAMETERS =
/* START, LEN, PARAM-TYPE // REMARKS */
/* ------------------------------------------- */
{{0, 2, PT_HEX}, // ID_OBD_SVC
{2, 2, PT_HEX}, // ID_OBD_PID
};
/**
* List of telegram parameters in order of appearance
*/
private static final int[][] FRZFRM_PARAMETERS =
/* START, LEN, PARAM-TYPE // REMARKS */
/* ------------------------------------------- */
{{0, 2, PT_HEX}, // ID_OBD_SVC
{2, 2, PT_HEX}, // ID_OBD_PID
{2, 2, PT_HEX}, // ID_OBD_FRAMEID
};
private static final int ID_NUM_CODES = 0;
public static final int ID_MSK_CODES = 1;
/**
* List of telegram parameters in order of appearance
*/
private static final int[][] NUMCODE_PARAMETERS =
/* START, LEN, PARAM-TYPE // REMARKS */
/* ------------------------------------------- */
{{4, 2, PT_HEX}, // ID_NUM_CODES
{6, 6, PT_HEX}, // ID_MSK_CODES
};
private static final String[] OBD_DESCRIPTORS =
{
"OBD Service",
"OBD PID",
};
/** new style data items */
public static final EcuDataItems dataItems = new EcuDataItems();
/** OBD data items */
public static PvList PidPvs = new PvList();
/** OBD vehicle identification items */
public static PvList VidPvs = new PvList();
/** current fault codes */
public static PvList tCodes = new PvList();
/** list of known fault codes */
private static final EcuCodeList knownCodes = EcuConversions.codeList;
/** queue of ELM commands to be sent */
static final Vector<String> cmdQueue = new Vector<String>();
/** freeze frame ID to request */
private int freezeFrame_Id = 0;
/** perform reset on NRC reception */
private boolean resetOnNrc = false;
/** Creates a new instance of ObdProt */
ObdProt()
{
paddingChr = '0';
// prepare PID PV list
PidPvs.put(0, new EcuDataPv());
VidPvs.put(0, new EcuDataPv());
tCodes.put(0, new ObdCodeItem(0, "No trouble codes set"));
}
/**
* set Freeze frame id to be requested
* @param freezeFrame_Id ID of freeze frame to be requested
*/
public void setFreezeFrame_Id(int freezeFrame_Id)
{
log.info(String.format("FreezeFrame ID: %d", freezeFrame_Id));
this.freezeFrame_Id = freezeFrame_Id;
setService(OBD_SVC_FREEZEFRAME, true);
}
/**
* list of parameters for specific protocol
* @return complete set of protocol parameters
*/
public int[][] getTelegramParams()
{
return (getTelegramParams(msgService));
}
/**
* list of parameters for specific protocol
* @param service Service which this header is requested for
* @return complete set of protocol parameters
*/
private int[][] getTelegramParams(int service)
{
int fldMap[][];
switch (service)
{
// negative response
case OBD_ID_NRC:
fldMap = NR_PARAMETERS;
break;
case OBD_SVC_FREEZEFRAME:
fldMap = FRZFRM_PARAMETERS;
break;
case OBD_SVC_READ_CODES:
case OBD_SVC_PENDINGCODES:
case OBD_SVC_PERMACODES:
case OBD_SVC_CLEAR_CODES:
fldMap = SVC_PARAMETERS;
break;
default:
fldMap = OBD_PARAMETERS;
}
return (fldMap);
}
/**
* return message footer for protocol payload
* @return buffer of message footer
*/
public char[] getFooter()
{
return (emptyBuffer);
}
/**
* create a new telegram header for selected payload data buffer
* inclunding setting all ID's, sizes and validity issues
* @param buffer buffer of payload data
* @return buffer of new telegram header
*/
protected char[] getNewHeader(char[] buffer)
{
return (getNewHeader(buffer, OBD_SVC_DATA, Integer.valueOf(0)));
}
/**
* create a new telegram header inclunding setting all ID's, sizes and
* validity issues
* @param buffer buffer of payload data
* @param type type of telegram content
* @param id identifier for telegram (may be null)
* @return buffer of new telegram header
*/
@SuppressWarnings("fallthrough")
protected char[] getNewHeader(char[] buffer, int type, Object id)
{
int[][] fldMap = getTelegramParams(type);
char[] header = createEmptyBuffer(fldMap, '0');
setParamValue(ID_OBD_SVC, fldMap, header, Integer.valueOf(type));
switch (type)
{
// these commands do not require parametrs
case OBD_SVC_READ_CODES:
case OBD_SVC_PENDINGCODES:
case OBD_SVC_PERMACODES:
case OBD_SVC_CLEAR_CODES:
break;
// freezeframes require additional frame id
case OBD_SVC_FREEZEFRAME:
setParamValue(ID_OBD_FRAMEID, fldMap, header, freezeFrame_Id);
// NO break here
// all other commands require PID to be set
default:
setParamValue(ID_OBD_PID, fldMap, header, id);
}
return (header);
}
/**
* list of parameter descriptions for specific protocol
* @return complete set of protocol parameter description strings
*/
protected String[] getParamDescriptors()
{
return (OBD_DESCRIPTORS);
}
/**
* prepare process variables for each PID
* @param pvList list of process vars
*/
private void preparePidPvs(int obdService, PvList pvList)
{
// reset fixed PIDs
resetFixedPid();
HashMap<String, EcuDataPv> newList = new HashMap<String, EcuDataPv>();
for (ObdPid currPid : pidSupported)
{
Vector<EcuDataItem> items = dataItems.getPidDataItems(obdService, currPid.intValue());
// if no items defined, create dummy item
if (items == null)
{
log.warning(String.format("unknown PID %02X", currPid.intValue()));
// create new dummy item / OneToOne conversion
Conversion[] dummyCnvs = {EcuConversions.dfltCnv, EcuConversions.dfltCnv};
EcuDataItem newItem = new EcuDataItem(currPid.intValue(), 0, 0, 0, 32, 0xFFFFFFFF, dummyCnvs,
"%#08x", null, null, 0,
String.format("PID %02X", currPid.intValue()),
String.format("PID_%02X", currPid.intValue())
);
dataItems.appendItemToService(obdService, newItem);
// re-load data items for this PID
items = dataItems.getPidDataItems(obdService, currPid.intValue());
}
// loop through all items found ...
for (EcuDataItem pidPv : items)
{
if (pidPv != null)
{
newList.put(pidPv.toString(), pidPv.pv);
}
}
}
pvList.putAll(newList, PvChangeEvent.PV_ADDED, false);
}
/**
* mark all PIDs supported by the vehicle
* @param start Start PID (multiple of 0x20) to process bitmask for
* @param bitmask 32-Bit bitmask which indicates support for the next 32 PIDs
*/
private synchronized void markSupportedPids(int obdService, int start, long bitmask,
PvList pvList)
{
currSupportedPid = 0;
// Clear PID list on initial bitmask (offset 0)
if( start == 0)
{
pidSupported.clear();
}
// loop through bits and mark corresponding PIDs as supported
for (int i = 0; i < 0x1F; i++)
{
if ((bitmask & (0x80000000L >> i)) != 0)
{
pidSupported.add(new ObdPid(i + start + 1));
}
}
log.fine(Long.toHexString(bitmask).toUpperCase()
+ "(" + Long.toHexString(start) + "):"
+ pidSupported);
// if next block may be requested
if ((bitmask & 1) != 0)
{
// request next block
cmdQueue.add(String.format("%02X%02X", obdService, start + 0x20));
}
else
{
// setup PID PVs
preparePidPvs(obdService, pvList);
}
}
/** Holds value of property numCodes. */
private int numCodes;
/** fixed PIDs to limit PID loop to single access */
private static final Vector<ObdPid> fixedPids = new Vector<ObdPid>();
/**
* Set fixed PID for faster data update
* @param pidCodes the fixedPid to set
*/
public static synchronized void setFixedPid(int[] pidCodes)
{
for (ObdPid currPid : pidSupported)
{
if (Arrays.binarySearch(pidCodes, currPid.intValue()) >= 0)
{
fixedPids.add(currPid);
}
}
}
public static synchronized void resetFixedPid()
{
fixedPids.clear();
}
/**
* get the next available supported PID
* @return next available supported PID
*/
synchronized Integer getNextSupportedPid()
{
Integer result = 0;
/* get corresponding PID list */
Vector<ObdPid> pidsToCheck = (fixedPids.size() > 0) ? fixedPids : pidSupported;
try
{
/* sort by next expected request */
Collections.sort(pidsToCheck, ObdPid.requestSorter);
ObdPid pid = pidsToCheck.firstElement();
/* detect wrap around in PID list */
pidsWrapped = pid.getNextRequest() != 0;
/* mark PID as handled */
pid.setNextRequest(System.currentTimeMillis());
/* and return first list element */
result = pid.intValue();
}
catch(Exception e)
{
/* ignore */
}
return result;
}
/**
* handle OBD response telegram
* @param buffer - telegram buffer
* @return number of listeners notified
*/
@Override
@SuppressWarnings("fallthrough")
public synchronized int handleTelegram(char[] buffer)
{
int result = 0;
int msgPid;
if (checkTelegram(buffer))
{
try
{
msgService = (Integer) getParamValue(ID_OBD_SVC, buffer);
// check for negative result
if (msgService == OBD_ID_NRC)
{
// get NR service
int svc = (Integer) getParamValue(ID_NR_SVC, buffer);
// get NRC code
int nrcCode = (Integer) getParamValue(ID_NR_CODE, buffer);
// get NRC object
NRC nrc = NRC.get(nrcCode);
// create NRC error message
String error = nrc.toString(svc);
// log error
log.severe(error);
// notify change listeners
firePropertyChange(new PropertyChangeEvent(this, PROP_NRC, nrc, error));
// handle NRC reaction
switch(nrc.react)
{
case RESET:
if (isResetOnNrc())
{
// perform immediate reset because NRC reception
reset();
} else
{
// otherwise just switch off any active service
setService(OBD_SVC_NONE, true);
}
break;
case CANCEL:
// switch off any active service
setService(OBD_SVC_NONE, true);
break;
case REPEAT:
// Repeat last TX message
sendTelegram(lastTxMsg.toCharArray());
break;
case SKIP:
case IGNORE:
default:
// Intentionally do noting
}
// handling finished
return result;
}
// positive response -> mask service ID
msgService &= ~0x40;
// check service of message
switch (msgService)
{
// OBD Data frame
case OBD_SVC_FREEZEFRAME:
case OBD_SVC_DATA:
msgPid = (Integer) getParamValue(ID_OBD_PID, buffer);
switch (msgPid)
{
case 0x00:
case 0x20:
case 0x40:
case 0x60:
case 0x80:
case 0xA0:
case 0xC0:
case 0xE0:
// Check for optional message count byte, find offset to payload
int offset = (buffer.length % 4 == 0) ? 4 : 6;
// get payload data and mark the indicated supported PIDs
long msgPayload = Long.valueOf(new String(buffer, offset, 8), 16);
markSupportedPids(msgService, msgPid, msgPayload, PidPvs);
break;
// OBD number of fault codes
case 1:
msgPayload = ((Integer) getParamValue(ID_NUM_CODES,
NUMCODE_PARAMETERS,
buffer)).longValue();
setNumCodes(Long.valueOf(msgPayload).intValue());
// no break here ...
default:
long updatePeriod =
dataItems.updateDataItems(msgService,
msgPid,
hexToBytes(String.valueOf(
getPayLoad(buffer))));
/* Update expected request timestamp for PID */
for( ObdPid pid : pidSupported)
{
if(pid.intValue()==msgPid)
{
pid.setNextRequest(System.currentTimeMillis()+updatePeriod);
}
}
break;
}
break;
case OBD_SVC_CTRL_MODE: // Test control mode
case OBD_SVC_VEH_INFO: // get vehicle information (mode 9)
msgPid = (Integer) getParamValue(ID_OBD_PID, buffer);
switch (msgPid)
{
case 0x00:
case 0x20:
case 0x40:
case 0x60:
case 0x80:
case 0xA0:
case 0xC0:
case 0xE0:
// Check for optional message count byte, find offset to payload
int offset = (buffer.length % 4 == 0) ? 4 : 6;
// get payload data and mark the indicated supported PIDs
long msgPayload = Long.valueOf(new String(buffer, offset, 8), 16);
markSupportedPids(msgService, msgPid, msgPayload, VidPvs);
break;
default:
long updatePeriod =
dataItems.updateDataItems(msgService,
msgPid,
hexToBytes(String.valueOf(
getPayLoad(buffer))));
/* Update expected request timestamp for PID */
for( ObdPid pid : pidSupported)
{
if(pid.intValue()==msgPid)
{
pid.setNextRequest(System.currentTimeMillis()+updatePeriod);
}
}
break;
}
break;
// fault code response
case OBD_SVC_READ_CODES:
case OBD_SVC_PENDINGCODES:
case OBD_SVC_PERMACODES:
int currCode;
Integer key;
EcuCodeItem code;
int nCodes = 0;
// default DTC data to start at offset 2 (Byte 1)
int DTCOffs = 2;
// If message contains optional number of codes (1 Byte) then set it ...
boolean hasNumCodes = ((buffer.length % 4) == 0);
if (hasNumCodes)
{
nCodes = Integer.valueOf(new String(buffer, 2, 2), 16);
setNumCodes(nCodes);
// DTC data starts at offset 4 (byte 2)
DTCOffs = 4;
}
// read in all trouble codes
for (int i = DTCOffs; i < buffer.length; i += 4)
{
key = Integer.valueOf(new String(buffer, i, 4), 16);
currCode = key.intValue();
if (currCode != 0)
{
if ((code = knownCodes.get(key)) == null)
{
code = new ObdCodeItem(key.intValue(),
Messages.getString(
"customer.specific.trouble.code.see.manual"));
}
log.fine(String.format("+DFC: %04x: %s", key, code.toString()));
// Remember received message service to know code status
code.put(EcuCodeItem.FID_STATUS, Integer.valueOf(msgService));
tCodes.put(key, code);
// if number of codes hasn't been delivered yet ...
if(!hasNumCodes)
{
// increment number of detected codes
nCodes++;
}
}
}
if (nCodes == 0)
{
tCodes.put(0, new ObdCodeItem(0, Messages.getString(
"no.trouble.codes.set")));
}
break;
// clear code response
case OBD_SVC_CLEAR_CODES:
break;
default:
log.warning("Service not (yet) supported: " + msgService);
}
} catch (Exception e)
{
log.warning("'" + Arrays.toString(buffer) + "':" + e.getMessage());
}
}
return (result);
}
/**
* Notify all telegram Writers about new telegram
* @param buffer - telegram buffer
*/
@Override
public void sendTelegram(char[] buffer)
{
// remember last sent message
lastTxMsg = new String(buffer);
super.sendTelegram(buffer);
}
/**
* Getter for property numCodes.
* @return Value of property numCodes.
*/
public int getNumCodes()
{
return this.numCodes;
}
/**
* Setter for property numCodes.
* @param numCodes New value of property numCodes.
*/
private void setNumCodes(int numCodes)
{
int old = this.numCodes;
this.numCodes = numCodes;
firePropertyChange(new PropertyChangeEvent(this,
PROP_NUM_CODES,
Integer.valueOf(old),
Integer.valueOf(numCodes)));
}
/**
* Getter for property service.
* @return Value of property service.
*/
public int getService()
{
return this.service;
}
/**
* reset all protocol settings
*/
public void reset()
{
// switch off any active service
setService(OBD_SVC_NONE, true);
// clear command queue
cmdQueue.clear();
// clear supported PIDs
pidSupported.clear();
// reset fixed PIDs
resetFixedPid();
// Clear data items
PidPvs.clear();
tCodes.clear();
VidPvs.clear();
}
/**
* clear data lists for selected service
* @param obdService OBD service to clear lists for
*/
private void clearDataLists(int obdService)
{
// clean up data lists
switch (obdService)
{
case OBD_SVC_DATA:
case OBD_SVC_FREEZEFRAME:
// Clear data items
pidSupported.clear();
PidPvs.clear();
break;
case OBD_SVC_READ_CODES:
case OBD_SVC_PENDINGCODES:
case OBD_SVC_PERMACODES:
tCodes.clear();
break;
case OBD_SVC_VEH_INFO:
case OBD_SVC_CTRL_MODE:
// Clear data items
pidSupported.clear();
VidPvs.clear();
break;
}
}
/**
* Setter for property service.
* This includes initialisation of the requested service to the vehicle
* @param obdService New OBD service to be requested.
* @param clearLists clear data list for this service
*/
public void setService(int obdService, boolean clearLists)
{
this.service = obdService;
pidsWrapped = false;
// if lists shall be cleared
if (clearLists)
{
// then do it
clearDataLists(obdService);
}
// set specified OBD service
switch (obdService)
{
case OBD_SVC_NONE:
// sendCommand(CMD_RESET,0);
break;
case OBD_SVC_DATA:
case OBD_SVC_FREEZEFRAME:
case OBD_SVC_CTRL_MODE:
case OBD_SVC_VEH_INFO:
// read vehicle information
// request for PID/TID's supported
writeTelegram(emptyBuffer, obdService, 0);
break;
case OBD_SVC_READ_CODES:
case OBD_SVC_PENDINGCODES:
case OBD_SVC_PERMACODES:
numCodes = 0;
// Queue requests for reading all trouble codes
cmdQueue.add(String.format("%02X", OBD_SVC_READ_CODES, 0));
cmdQueue.add(String.format("%02X", OBD_SVC_PENDINGCODES, 0));
cmdQueue.add(String.format("%02X", OBD_SVC_PERMACODES, 0));
// read PID number of codes ...
writeTelegram(emptyBuffer, OBD_SVC_DATA, 1);
break;
case OBD_SVC_CLEAR_CODES:
// clear trouble codes
writeTelegram(emptyBuffer, obdService, 0);
// wait for codes to be cleared
try
{
Thread.sleep(500);
} catch (InterruptedException e)
{
// Intentionally do nothing
}
break;
case OBD_SVC_O2_RESULT:
case OBD_SVC_MON_RESULT:
default:
log.warning("Service not supported: " + obdService);
}
}
}
@@ -0,0 +1,25 @@
/*
* (C) Copyright 2016 by fr3ts0n <erwin.scheuch-heilig@gmx.at>
*
* 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., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*
*/
/**
* OBD specific protocol stuff
*
* @author Erwin Scheuch-Heilig
*/
package com.fr3ts0n.ecu.prot.obd;
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,15 @@
P0002=دائرة التحكم في منظم حجم الوقود المدى/الأداء
P0001=دائرة التحكم في منظم حجم الوقود/مفتوحة
P0003=دائرة التحكم في منظم حجم الوقود منخفضة
P0004=دائرة التحكم في منظم حجم الوقود عالية
P0005=دائرة التحكم في صمام إغلاق الوقود A / مفتوحة
P0006=دائرة التحكم في صمام إغلاق الوقود A منخفضة
P0007=دائرة التحكم في صمام إغلاق الوقود A عالية
U0169=فقد الاتصال بوحدة التحكم في فتحة السقف
U0165=فقد الاتصال بوحدة التحكم في التدفئة والتهوية وتكييف الهواء
U0418=تم استلام بيانات غير صالحة من وحدة التحكم في نظام الفرامل
U0420=تم استلام بيانات غير صالحة من وحدة التحكم في التوجيه المعزز
U0424=تم استلام بيانات غير صالحة من وحدة التحكم في التدفئة والتهوية وتكييف الهواء
U0428=تم استلام بيانات غير صالحة من وحدة مستشعر زاوية التوجيه
U0427=تم استلام بيانات غير صالحة من وحدة التحكم في أمن السيارة
U0426=تم استلام بيانات غير صالحة من وحدة التحكم في نظام منع تشغيل السيارة
@@ -0,0 +1 @@
P0001=Regulador del circuit de control del volum de carburant/obert
@@ -0,0 +1 @@
P0001=Řídicí obvod regulátoru objemu paliva - přerušen
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,177 @@
P0001=Κύκλωμα Ελέγχου Ρυθμιστή Καυσίμων/Ανοιχτό
P0002=Σειρά Κυκλώματος Ελέγχου Ρυθμιστή Όγκου Καυσίμων/Απόδοση
P0003=Χαμηλό Κύκλωμα Ελέγχου Ρυθμιστή Καυσίμων
P0004=Υψηλό Κύκλωμα Ελέγχου Ρυθμιστή Καυσίμων
P0005=Κύκλωμα Ελέγχου Καυσίμων με Κλειστή Βαλβίδα/Ανοικτό
P0006=Χαμηλό Κύκλωμα Κυκλώματος Ελέγχου Καυσίμων με Κλειστή Βαλβίδα
P0007=Υψηλό Κύκλωμα Ελέγχου Καυσίμων με Κλειστή Βαλβίδα
P0008=Τράπεζα 1 Απόδοσης Συστήματος Θέσης Μηχανής
P0009=Τράπεζα 2 Απόδοσης Συστήματος Θέσης Μηχανής
P000A=Τράπεζα 1 Χαμηλής Απόδοσης Θέσης Camshaft
P000B=Τράπεζα 1 Χαμηλής Απόδοσης Θέσης Camshaft B
P000C=Τράπεζα 2 Χαμηλής Απόδοσης Θέσης Camshaft A
P000D=Τράπεζα 2 Χαμηλής Απόδοσης Θέσης Camshaft B
P000E=ISO/SAE αποθηκεύτηκε
P000F=ISO/SAE κρατήθηκε
P0010=Ενεργό Κύκλωμα Θέσης Camshaft A/Ανοικτή Τράπεζα 1
P0011=Θέση Camshaft A-Τράπεζα 1 Προχωρημένου Συστήματος ή Απόδοσης
P0012=Θέση Camshaft A-Ο Χρόνος Τελείωσε-Καθυστερημένη Τράπεζα 1
P0013=Θέση Camshaft B-Ενεργό Κύκλωμα/Ανοικτή Τράπεζα 1
P0014=Θέση Camshaft B-O Χρόνος Τελείωσε-Τράπεζα 1 Προχωρημένου Συστήματος ή Απόδοσης
P0015=Θέση Camshaft B-Ο Χρόνος Τελείωσε-Καθυστερημένη Τράπεζα 1
P0016=Θέση Crankshaft -Ανιχνευτής Α Τράπεζα 1 Θέση Camshaft
P0017=Θέση Crankshaft -Ανιχνευτής Β Σχέση Τράπεζας 1 με την Θέση Camshaft
P0018=Θέση Crankshaft -Θέση Camshaft Σχέση Τράπεζας 2 Ανιχνευτής Α
P0019=Θέση Crankshaft -Θέση Camshaft Ανιχνευτή Β Σχέση Τράπεζας 2
P0020=Ενεργό Κύκλωμα Θέσης Camshaft A/Ανοικτή Τράπεζα 2
P0021=Θέση Α Camshaft -Τέλος Χρόνου-Προχωρημένο Σύστημα ή Απόδοσης Τράπεζας 2
P0022=Θέση Camshaft Α-Τέλος Χρόνου-Καθυστέρηση Τράπεζας 2
P0023=Θέση Β Camshaft -Ενεργό Κύκλωμα/Ανοικτή Τράπεζα 2
P0024=Θέση Camshaft B-Τέλος Χρόνου-Προχωρημένο Σύστημα ή Απόδοσης Τράπεζας 2
P0025=Θέση Camshaft Β-Τέλος Χρόνου-Καθυστερημένη Τράπεζα 2
P0026=Σειρά Κυκλώματος Ελέγχου Ηλιακής Ενέργειας με Βαλβίδα Απορρόφησης/Απόδοση Τράπεζας 1
P0027=Σειρά Κυκλώματος Ελέγχου Ηλιακής Ενέργειας με Βαλβίδα Εξάτμισης/Απόδοση Τράπεζας 1
P0028=Σειρά Κυκλώματος Ελέγχου Ηλιακής Ενέργειας με Βαλβίδα Απορρόφησης/Απόδοση Τράπεζας 2
P0029=Σειρά Κυκλώματος Ελέγχου Ηλιακής Ενέργειας με Βαλβίδα Εξάτμισης/Απόδοση Τράπεζας 2
P0030=Ανιχνευτής 1 Ελέγχου Κυκλώματος Τράπεζας 1 με Θερμαστή HO2S
P0031=Θερμαστής HO2S Ελέγχου Κυκλώματος Χαμηλής Τάσης Τράπεζας 1 Ανιχνευτής 1
P0032=Θερμαστής HO2S Ελέγχου Κυκλώματος Υψηλής Τάσης Τράπεζας 1 Ανιχνευτής 1
P0033=Φορτιστής Turbo/Κύκλωμα Ελέγχου Σούπερ Φορτιστή με Βαλβίδα Bypass
P0034=Φορτιστής Turbo/Σούπερ φορτιστής Ελέγχου Κυκλώματος Χαμηλής Τάσης με Βαλβίδα Bypass
P0036=Ανιχνευτής 2 Ελέγχου Κυκλώματος Τράπεζας 1 με Θερμαστή HO2S
P0038=Θερμαστής HO2S Ελέγχου Κυκλώματος Υψηλής Τάσης Τράπεζα 1 Ανιχνευτής 2
P0039=Φορτιστής Turbo/Σούπερ φορτιστής Σειράς Κυκλώματος Ελέγχου Βαλβίδας Bypass/Απόδοση
P0042=Ανιχνευτής 3 με Θερμαστή HO2S Κυκλώματος Ελέγχου Τράπεζα 1
P0043=Θερμαστής HO2S Ανιχνευτής 3 Κυκλώματος Ελέγχου Χαμηλής Τάσης Τράπεζας 1
P0044=Θερμαστής HO2S Ανιχνευτής 3 Κυκλώματος Ελέγχου Υψηλής Τάσης Τράπεζα 1
P0045=Φορτιστής Turbo/Σούπερ φορτιστής Βελτίωσης Ελέγχου Κυκλώματος Ηλιακής Ενέργειας Α/Ανοικτό
P0046=Φορτιστής Turbo/Σούπερ φορτιστής Βελτίωσης Σειράς Κυκλώματος Ηλιακής Ενέργειας Α/Απόδοση
P0047=Φορτιστής Turbo/Σούπερ φορτιστής Βελτίωσης Ελέγχου Κυκλώματος Ηλιακής Ενέργειας Α Χαμηλής Τάσης
P0048=Φορτιστής Turbo/Σούπερ φορτιστής Βελτίωσης Ελέγχου Κυκλώματος Ηλιακής Ενέργειας Α Υψηλής Τάσης
P0049=Φορτιστής Turbo/Σούπερ φορτιστής Τουρμπίνας Μεγίστης Ταχύτητας
P004A=Φορτιστής Turbo/Σούπερ φορτιστής Βελτίωσης Ελέγχου Κυκλώματος Ηλιακής Ενέργειας Β/Ανοικτός
P004B=Φορτιστής Turbo/Σούπερ φορτιστής Βελτίωσης Ελέγχου Σειράς Κυκλώματος Ηλιακής Ενέργειας Β/Απόδοση
P004C=Φορτιστής Turbo/Σούπερ φορτιστής Βελτίωσης Ελέγχου Σειράς Κυκλώματος Χαμηλής Τάσης Ηλιακής Ενέργειας Β
P004D=Φορτιστής Turbo/Σούπερ φορτιστής Βελτίωσης Ελέγχου Κυκλώματος Ηλιακής Ενέργειας Β Υψηλής Τάσης
P0035=Δυνατός φορτιστής/Έλεγχος Κυκλώματος Φορτιστή Υψηλής Τάσης με Βαλβίδα Bypass
P0037=Έλεγχος Κυκλώματος ΘερμαστήHO2S υψηλής Τάσης Τράπεζα 1 Ανιχνευτής
P0040=Σήματα Ανιχνευτή Q2 Ανιχνευτής 1 Τράπεζα 1/Ανιχνευτής 1 Τράπεζας 2
P0041=Ανιχνευτής Σημάτων Q2 Τράπεζα 1 Ανιχνευτής 2/Τράπεζα 2 Ανιχνευτής 2
P004E=Δυνατός Φορτιστής/Ενίσχυση Ελέγχου ΚυκλώματοςSolenoid Α Ενδιάμεσου Φορτιστή υψηλής Τάσης/Ελεύθερος
P004F=Ισχυρός φορτιστής/Φορτιστής πολύ ισχυρός Βελτίωσης Ελέγχου Ενδιάμεσου Κυκλώματος Β Solenoid/Ελεύθερος
P0050=HO2S Έλεγχος Κυκλώματος με Θερμαστή Τράπεζα 1 Ανιχνευτής 1
P0051=HO2S Έλεγχος Θερμαστή Χαμηλού Κυκλώματος Τράπεζα 2 Ανιχνευτής 1
P0052=HO2S Θερμαστής Ελέγχου Κυκλώματος Υψηλής Τάσης Τράπεζα 2 Ανιχνευτής 1
P0053=HO2S Αντίσταση Θερμαστή Τράπεζα 1 Ανιχνευτής 1
P0054=HO2S Αντίσταση Θερμαστή Τράπεζα 1 Ανιχνευτής 2
P0055=HO2S Αντίσταση Θερμαστή Τράπεζα 1 Ανιχνευτής 3
P0056=HO2S Έλεγχος Κυκλώματος Θερμαστή Τράπεζα 2 Ανιχνευτής 2
P0057=HO2S Έλεγχος Θερμαστή Κυκλώματος Χαμηλής Τάσης Τράπεζα 2 Ανιχνευτής 2
P0058=HO2S Θερμαστής Ελέγχου Κυκλώματος Υψηλής Τάσης Τράπεζα 2 Ανιχνευτής 2
P0059=HO2S Αντίσταση Θερμαστή Τράπεζα 2 Ανιχνευτής 1
P0060=HO2S Αντίσταση Θερμαστή Τράπεζα 2 Ανιχνευτής 2
P0061=HO2S Αντίσταση Θερμαστή Τράπεζα 2 Ανιχνευτής 3
P0062=HO2S Έλεγχος Θερμαστή Κύκλωμα Τράπεζα 2 Ανιχνευτής 3
P0063=HO2S Θερμαστής Ελέγχου Κυκλώματος Χαμηλής Τάσης Τράπεζα 2 Ανιχνευτής 3
P0064=HO2S Έλεγχος Κυκλώματος Υψηλής Τάσης με Θερμαστή Τράπεζα 2 Ανιχνευτής 3
P0065=Σειρά Ελέγχου Σωλήνα που Τροφοδοτείται με Αέρα/Απόδοση
P0066=Έλεγχος Κυκλώματος με Σωλήνα που Τροφοδοτείται με Αέρα ή Κύκλωμα Χαμηλής Τάσης
P0067=Έλεγχος Κυκλώματος Υψηλής Τάσης με Σωλήνα που Τροφοδοτείται με Αέρα
P0068=MAP/MAF – Θέση Σύνδεσης Σωλήνα
P0069=Κύρια Πίεση Μετρητή-Μέτρηση Βαρομετρικής Πίεσης
P006A=ΜΑΡ- Μέτρηση Εισόδου Αέρα
P006B=ΜΑΡ-Μέτρηση Πίεσης Εξάτμισης
P006C=MAP-Δυνατός φορτιστής/Μέτρηση Πίεσης Σούπερ φορτιστή
P006D=Βαρομετρική Πίεση- Ισχυρότατος φορτιστής/Μέτρηση Πίεσης Εισόδου Σούπερ φορτιστή
P006E=To ISO/SAE κρατήθηκαν
P006F=Τα ISO/SAE κρατήθηκαν
P0070=Κύκλωμα με Ανιχνευτή Μέτρησης Ατμοσφαιρικής Πίεσης
P0071=Εύρος Ανιχνευτή Εξωτερικού Αέρα/Απόδοση
P0072=Κύκλωμα Χαμηλής Τάσης με Ανιχνευτή Μέτρησης Θερμοκρασίας Εξωτερικού Αέρα
P0073=Κύκλωμα Υψηλής Τάσης με Ανιχνευτή Μέτρησης Θερμοκρασίας Εξωτερικού Αέρα
P0074=Ενδιάμεσο Κύκλωμα με Ανιχνευτή Μέτρησης Θερμοκρασίας Εξωτερικού Αέρα
P0075=Έλεγχος Κυκλώματος Απορρόφησης Solenoid με Βαλβίδα Τράπεζα 1
P0076=Έλεγχος Κυκλώματος Απορρόφησης Χαμηλής Τάσης Solenoid με Βαλβίδα Τράπεζα 1
P0077=Έλεγχος Κυκλώματος Απορρόφησης Υψηλής Τάσης Solenoid με Βαλβίδα Τράπεζα 1
P0078=Έλεγχος Κυκλώματος Solenoid με Βαλβίδα Εξάτμισης Τράπεζα 1
P0079=Έλεγχος Κυκλώματος Solenoid Χαμηλής Τάσης με Βαλβίδα Εξάτμισης Τράπεζα 1
P0080=Έλεγχος Κυκλώματος Solenoid Υψηλής Τάσης με Βαλβίδα Εξάτμισης Τράπεζα 1
P0081=Έλεγχος Κυκλώματος Solenoid με Βαλβίδα Απορρόφησης Τράπεζα 2
P0082=Έλεγχος Κυκλώματος Solenoid Χαμηλής Τάσης με Βαλβίδα Απορρόφησης Τράπεζα 2
P0083=Έλεγχος Κυκλώματος Solenoid Υψηλής Τάσης με Βαλβίδα Απορρόφησης Τράπεζα 2
P0084=Έλεγχος Κυκλώματος Solenoid με Βαλβίδα Εξάτμισης Τράπεζα 2
P0085=Έλεγχος Κυκλώματος Χαμηλής Τάσης με Βαλβίδα Εξάτμισης Τράπεζα 2
P0086=Έλεγχος Κυκλώματος Solenoid Υψηλής Τάσης με Βαλβίδα Εξάτμισης Τράπεζα 2
P0087=Ροή Καυσίμων/Η Πίεση Συστήματος-Πολύ Χαμηλή
P0088=Ροή Καυσίμων/Η Πίεση Συστήματος είναι Πολύ Υψηλή
P0089=Ρυθμιστής Πίεσης Καυσίμων 1 Απόδοση
P0090=Ρυθμιστής Πίεσης Καυσίμων 1 για Έλεγχο Κυκλώματος
P0091=Ρυθμιστής 1 Πίεσης Καυσίμων για Έλεγχο Κυκλώματος Χαμηλής Τάσης
P0092=Ρυθμιστής 1 Πίεσης Καυσίμων για Έλεγχο Κυκλώματος Υψηλής Τάσης
P0093=Εντοπίστηκε Διαρροή στα Καύσιμα-Μεγάλη Διαρροή
P0094=Εντοπίστηκε Διαρροή στα Καύσιμα-Μικρή Διαρροή
P0095=Κύκλωμα με Ανιχνευτή 2 Απορρόφησης Θερμοκρασίας Αέρα
P0096=Εύρος Κυκλώματος με Ανιχνευτή 2 Απορρόφησης Αέρα/Απόδοση
P0097=Κύκλωμα Χαμηλής Τάσης με Ανιχνευτή 2 Απορρόφησης Θερμοκρασίας Αέρα
P0098=Κύκλωμα Υψηλής Τάσης με Ανιχνευτή 2 για Απορρόφηση Θερμοκρασίας Αέρα
P0099=Ενδιάμεσο Κύκλωμα με Ανιχνευτή 2 Απορρόφησης Θερμοκρασίας Αέρα/Ελεύθερο
P009A=Απορρόφηση Θερμοκρασίας Αέρα/Μέτρηση Εξωτερικής Θερμοκρασίας
P0100=Κύκλωμα Εισόδου Α Αέρα
P0101=Εύρος Κυκλώματος Εισόδου Α Αέρα/Απόδοση
P0102=Κύκλωμα Χαμηλής Τάσης για Είσοδο Α Αέρα
P0103=Κύκλωμα Υψηλής Τάσης Εισόδου Α Αέρα
P0104=Ενδιάμεσο Κύκλωμα Εισόδου Α Αέρα
P0105=Μέτρηση Κεντρικής Πίεσης/Κύκλωμα Βαρομετρικής Πίεσης
P0106=Μέτρηση Κεντρικής Πίεσης/Εύρος Κυκλώματος Βαρομετρικής Πίεσης/Απόδοση
P0107=Μέτρηση Συνολικής Πίεσης/Κύκλωμα Χαμηλής Τάσης Βαρομετρικής Πίεσης
P0108=Μέτρηση Συνολικής Πίεσης/Κύκλωμα Υψηλής Τάσης Βαρομετρικής Πίεσης
P0109=Μέτρηση Συνολικής Πίεσης/Ενδιάμεσο Κύκλωμα Βαρομετρικής Πίεσης
P010A=Κύκλωμα Εισόδου Α Αέρα
P010B=Εύρος Κυκλώματος Εισόδου Β Αέρα/Απόδοση
P010C=Χαμηλό Κύκλωμα Εισόδου Β Αέρα
P010D=Κύκλωμα Υψηλής Τάσης Εισόδου Β Αέρα
P010E=Ενδιάμεσο Κύκλωμα Εισόδου Β Αέρα/Ελεύθερο
P010F=Μέτρηση Ανιχνευτή Α/Β Εισόδου Αέρα
P0110=Κύκλωμα Ανιχνευτή Α που Ρυθμίζει την Θερμοκρασία Εισόδου Αέρα
P0111=Εύρος Κυκλώματος με Ανιχνευτή 1 Θερμοκρασίας Απορρόφησης Αέρα/Απόδοση
P0112=Κύκλωμα Χαμηλής Τάσης με Ανιχνευτή Θερμοκρασίας Αέρα Εισόδου
P0113=Κύκλωμα Υψηλής Τάσης με Ανιχνευτή Θερμοκρασίας Αέρα Εισόδου
P0114=Ενδιάμεσο Κύκλωμα με Ανιχνευτή 1 που Ρυθμίζει την Θερμοκρασία Απορρόφησης Αέρα
P0115=Κύκλωμα με Ανιχνευτή Θερμοκρασίας Μηχανής Ψύξης
P0116=Εύρος Κυκλώματος με Ανιχνευτή 1 Θερμοκρασίας Ψύξης Μηχανής/Απόδοση
P0117=Κύκλωμα Χαμηλής Τάσης με Ανιχνευτή 1 Θερμοκρασίας Ψύξης Μηχανής
P0118=Κύκλωμα Υψηλής Τάσης με Ανιχνευτή 1 που Ρυθμίζει την Θερμοκρασία Ψύξης Μηχανής
P0119=Ενδιάμεσο Κύκλωμα με Ανιχνευτή 1 Θερμοκρασίας Ψύξης της Μηχανής
P011A=Σύνδεση Ανιχνευτή 1/2 Θερμοκρασίας Ψύξης της Μηχανής
P0120=Βραχυκύκλωμα/Ανιχνευτής Θέσης Πηδαλίου/Κύκλωμα Διακόπτη Α
P0121=Βραχυκύκλωμα/Ανιχνευτής Θέσης Πηδαλίου/Εύρος Κυκλώματος Διακόπτη Α/Απόδοση
P0122=Βραχυκύκλωμα/Ανιχνευτής Θέσης Πηδαλίου/Κύκλωμα Χαμηλής Τάσης Διακόπτη Α
P0123=Βραχυκύκλωμα/Ανιχνευτής Θέσης Πηδαλίου/Κύκλωμα Υψηλής Τάσης Διακόπτη Α
P0124=Βραχυκύκλωμα/Ανιχνευτής Θέσης Πηδαλίου/Ενδιάμεσο Κύκλωμα Διακόπτη Α
P0125=Ανεπαρκής Θερμοκρασία Ψύξης για Έλεγχο Κλειστού Κυκλώματος Καυσίμων
P0126=Ανεπαρκής Θερμοκρασία Ψύξης για Σταθερή Λειτουργία
P0127=Θερμοκρασία Αέρα που Απορροφάται Πολύ Υψηλή
P0128=Ψύξη Θερμοστάτη (Θερμοκρασία Ψύξης πιο Χαμηλή από την Θερμοκρασία που Ρυθμίζει ο Θερμοστάτης)
P0129=Η Βαρομετρική Πίεση είναι Πολύ Χαμηλή
P012A=Πολύ δυνατός Φορτιστής/ Φορτιστής πολύ Ισχυρής Τάσης Κυκλώματος Ανιχνευτή Πίεσης Αέρα Εισόδου
P012B=Πολύ Ισχυρός Φορτιστής/Φορτιστής πολύ Ισχυρής Τάσης Εύρους Κυκλώματος Ανιχνευτή Πίεσης Αέρα Εισόδου/Απόδοση
P012C=Πολύ Ισχυρός Φορτιστής/ Φορτιστής Πολύ Ισχυρής Τάσης Κυκλώματος Χαμηλής Τάσης με Ανιχνευτή Πίεσης Αέρα Εισόδου
P012D=Πολύ Ισχυρός Φορτιστής/Φορτιστής Πολύ Ισχυρής Τάσης Κυκλώματος Υψηλής Τάσης με Ανιχνευτή Πίεσης Αέρα Εισόδου
P012E=Πολύ Ισχυρός Φορτιστής/Φορτιστής με Πολύ Ισχυρή Τάση Ενδιάμεσου Κυκλώματος με Ανιχνευτή Πίεσης Αέρα Εισόδου/Ελεύθερος
P012F=Με επιφύλαξη των ISO/SAE
P0131=Κύκλωμα Χαμηλής Τάσης Ανιχνευτή O2 Τράπεζα 1 Ανιχνευτής 1
P0149=Σφάλμα Συγχρονισμού Καυσίμων
P0150=Κύκλωμα Ανιχνευτή Q2 Τράπεζα 2 Ανιχνευτής 1
P0151=Κύκλωμα Χαμηλής Τάσης με Ανιχνευτή Q2 Τράπεζα 2 Ανιχνευτής 1
P0152=Κύκλωμα Υψηλής Τάσης με Ανιχνευτή O2 Τράπεζα 2 Ανιχνευτής 1
P0153=Κύκλωμα Χαμηλής Απόκρισης με Ανιχνευτή O2 Τράπεζα 2 Ανιχνευτής 1
P0154=Κύκλωμα Ανιχνευτή O2 Ανενεργό Τράπεζα 2 Ανιχνευτής 1
P0155=Κύκλωμα Θερμαστή με Ανιχνευτή O2 Τράπεζα 2 Ανιχνευτής 1
P0156=Κύκλωμα Ανιχνευτή O2 Τράπεζα 2 Ανιχνευτής 2
P0157=Κύκλωμα Χαμηλής Τάσης με Ανιχνευτή O2 Τράπεζα 2 Ανιχνευτής 2
P0158=Κύκλωμα Υψηλής Τάσης με Ανιχνευτή O2 Τράπεζα 2 Ανιχνευτής 2
P0159=Κύκλωμα Αργής Απόκρισης με Ανιχνευτή O2 Τράπεζα 2 Ανιχνευτής 2
P0160=Κύκλωμα Ανιχνευτή O2 Ανενεργό Τράπεζα 2 Ανιχνευτής 2
P0161=Κύκλωμα Θέρμανσης Ανιχνευτή O2 Τράπεζα 2 Ανιχνευτής 2
P0162=Κύκλωμα Ανιχνευτή O2 Τράπεζα 2 Ανιχνευτής 3
P0163=Κύκλωμα Χαμηλής Τάσης Ανιχνευτή O2 Τράπεζα 2 Ανιχνευτής 3
@@ -0,0 +1,25 @@
P0004=Regulador de volumen de combustible Circuito alto
P0005=Válvula A de control de cierre de combustible Circuito/Abierto
P0006=Válvula A de control de cierre de combustible Circuito bajo
P0007=Válvula A de control de cierre de combustible Circuito alto
P000B=Posición lenta B del árbol de levas repuesta banco 1
P0008=Sistema de posición del motor banco de rendimiento 1
P0009=Sistema de posición del motor banco de rendimiento 2
P000A=Posición lenta A del árbol de levas repuesta banco 1
P000C=Posición lenta A del árbol de levas repuesta banco 2
P000D=Posición lenta B del árbol de levas repuesta banco 2
P000E=Reservado a ISO/SAE
P000F=Reservado a ISO/SAE
P0010=Posición actuador A del árbol de levas Circuito / Abierto banco 1
P0011=Posición actuador A del árbol de levas - Sincronización por encima de lo normal o Banco de rendiminto Banco 1
P0012=Posición actuador A del árbol de levas - Sincronización por debajode lo normal Banco 1 retrasado
P0013=Posición actuador B del árbol de levas - Actuador de circuito / Banco abierto 1
P0014=Posición actuador B del árbol de levas - Sincronización por encima de lo normal o Banco de rendiminto Banco 1
P0015=Posición actuador B del árbol de levas - Sincronización por debajo de lo normal o Banco de rendiminto Banco 1
P0001=Regulador de volumen de combustible Circuito de control/abierto
P0002=Regulador de volumen de combustible Alcance/Rendimiento
P0003=Regulador de volumen de combustible Circuito bajo
U0416=Datos inválidos recibidos desde el modúlo de control de dinámica del vehiculo
U0402=Datos inválidos recibidos desde el modúlo de control de transmisión
@@ -0,0 +1,8 @@
P0001=Circuito de control del regulador de volumen de combustible/abierto
P0002=Rango / rendimiento del circuito de control del regulador de volumen de combustible
P0003=Circuito de control del regulador de volumen de combustible bajo
P0004=Circuito de control del regulador de volumen de combustible alto
P0005=Circuito de control de cierre de combustible de la válvula a/abierto
P0006=Circuito de control bajo de la válvula A de cierre de combustible
P0007=Circuito de control alto de cierre de combustible de la válvula A
P0008=Comportamiento del detector 1 de la posición del cigüeñal
@@ -0,0 +1,17 @@
P0005=Polttoaineen sulkuventtiilin A ohjauspiiri / avoin
P0001=Polttoainemäärän säätimen ohjauspiiri / avoin
P0003=Polttoainemäärän säätimen ohjauspiiri alhainen
P0004=Polttoainemäärän säätimen ohjauspiiri korkea
P0006=Polttoaineen sulkuventtiilin A ohjauspiiri alhainen
P0007=Polttoaineen sulkuventtiilin A ohjauspiiri korkea
P0070=Ympäristön lämpötilan anturin piiri
P0127=Imuilman lämpötila liian korkea
P0129=Ilmakehän paine liian alhainen
P0148=Polttoaineensyöttövirhe
P0149=Polttoaineen ajoitusvirhe
P0185=Polttoaineen lämpöanturin B piiri
P0195=Moottoriöljyn lämpöanturi
P0200=Ruiskutussuuttimen piiri / avoin
P0002=Polttoainemäärän sääntelyn hallintapiirin alue/suorituskyky
P000E=Varattu ISO-/SAE-tiedoille
P000F=Varattu ISO-/SAE-tiedoille
@@ -0,0 +1,727 @@
P0001=Commande de régulateur de volume de carburant - circuit ouvert
P0002=Commande de régulateur de volume de carburant - plage de mesure/performance du circuit
P0003=Commande de régulateur de volume de carburant - tension trop basse
P0004=Commande de régulateur de volume de carburant - tension trop haute
P000E=réservé ISO/SAE
P000F=réservé ISO/SAE
P006E=réservé ISO/SAE
P006F=réservé ISO/SAE
P0127=Température trop élevée de l'air dans l'admission
P012F=réservé ISO/SAE
P0148=Erreur d'alimentation en carburant
P0168=Température du carburant trop élevée
P0005=Vanne d'arrêt de carburant Circuit de commande A/Ouvert
P0006=Vanne A d'arrêt de carburant Un circuit de commande bas
P0007=Vanne A d'arrêt de carburant circuit de commande Élevé
P0008=Phasage arbre à cames - vilebrequin performance Banc 1
P0009=Phasage arbre à cames - vilebrequin performance Banc 2
P000A=Position A de l'arbre à cames réponse lente Banc 1
P000B=Position B de l'arbre à cames réponse lente Banc 1
P000C=Position A de l'arbre à cames réponse lente Banc 2
P000D=Position B de l'arbre à cames réponse lente Banc 2
P0010=Circuit d'actionneur de position de l'arbre à cames A / Ouvert Banc 1
P0011=Position de l'arbre à cames A - Distribution trop avancée ou performance système Banc 1
P0012=Position de l'arbre à cames A - Distribution trop retardée Banc 1
P0013=Position de l'arbre à cames B - Circuit de déclenchement / Ouvert Banc 1
P0014=Position de l'arbre à cames B - Distribution trop avancée ou performance système Banc 1
P0015=Position de l'arbre à cames B - Distribution retardée Banc 1
P0016=Position Vilebrequin - Position Arbre à cames (rapport direct) Capteur A Banc 1
P0017=Position Vilebrequin - Position Arbre à cames (rapport direct) Capteur B Banc 1
P0018=Position Vilebrequin - Position Arbre à cames (rapport direct) Capteur A Banc 2
P0019=Position Vilebrequin - Position Arbre à cames (rapport direct) Capteur B Banc 2
P0020=Position Arbre à cames A Circuit Déclencheur / Ouvert Banc 2
P0021=Position Arbre à cames A - Distribution avancée ou performance système Banc 2
P0022=Position Arbre à cames A - Distribution retardée Banc 2
P0023=Position Arbre à cames B - Circuit Déclencheur/ Ouvert Banc 2
P0024=Position Arbre à cames B - Distribution Avancée ou performance système Banc 2
P0025=Position Camshaft B-Temps Passé-Banque 2 Retardée Banc 2
P0026=Rang de Circuit Solenoid B de Controle à Valve Absorbant/Performance de Banque 1
P0027=Rang de Circuit Solenoid de Controle à Valve d'Exhaustion/Performance de Banque 1
P0028=Rang de Circuit Solenoid de Controle a Valve Absorbant/Performance de Banque 2
P0029=Rang de Controle de Circuit Solenoid a Valve d'Exhaustion/Performance de Banque 2
P0030=Chauffeur HQ2S Senseur 1 de la Banque 1 pour Controle de Circuit
P0031=Chauffeur HQ2S Senseur1 de la Banque 1 pour Controle de Circuit
P0032=Chauffeur HQ2S Capteur 1 de la Banque 1 pour Controle de Haut Circuit
P0033=Chargeur Turbo/Superchargeur de Controle du Circuit à Valve Bypass
P0034=Turbochargeur/Superchargeur de Controle de Circuit Bas a Valve Bypass
P0035=Turbochargeur/Superchargeur de Controle de Haut Circuit à Valve Bypass
P0036=Chauffeur HQ2S Capteur 2 de la Banque 1 pour Controle du Circuit
P0037=HQ2S Chauffeur Capteur 2 de la Banque 1 Pour Controle de Circuit Bas
P0038=HQ2S Chauffeur Capteur 2 de la Banque 1 pour Controle de Haut Circuit
P0039=Turbochargeur/Superchargeur pour Controle du Rang des Circuits à Valve Bypass/Performance
P0040=O2 Capteur 1 des Signaux Swapped de la Banque Capteur 1/Capteur 1 de la Banque 2
P0041=O2 Capteur des Signaux de la Banque Swapped 1 Capteur 2/Capteur 2 de la Banque 2
P0042=HO2S Chauffeur Capteur 3 de Controle du Circuit de la Banque 1
P0043=HO2S Chauffeur Capteur 1 pour Controle de Circuit Bas de la Banque 1
P0044=HO2S Chauffeur Capteur 3 pour Controle de Haut Circuit de la Banque 1
P0045=Turbochargeur/Superchargeur pour Renforcer le Controle du Circuit Solenoide A/Ouvert
P0046=Turbochargeur/Superchargeur pour Renforcer le Controle du Rang du Circuit Solenoide A/Performance
P0047=Turbochargeur/Superchargeur pour Renforcer le Controle du Circuit Bas Solenoide A
P0048=Turbochargeur/Superchargeur pour Renforcer le Controle du Haut Circuit Solenoide A
P0049=Turbochargeur/Superchargeur de Turbine a Vitesse Maximum
P004A=Turbochargeur/Superchargeur pour Renforcer le Controle du Circuit Solenoide B/Ouvert
P004B=Turbochargeur/Superchargeur pour Renforcer le Controle du Rang du Circuit Solenoide B/Performance
P004C=Turbochargeur/Superchargeur pour Renforcer le Controle du Circuit Solenoide B Bas
P004D=Turbichargeur/Superchargeur pour Renforcer le Controle du Haut Circuit Solenoide B
P004E=Turbochargeur/Superchargeur pour Renforcer le Controle du Circuit Solenoide A Intermittent/Erratique
P004F=Turbochargeur/Superchargeur pour Renforcer le Controle du Circuit Solenoide B Intermittent/Erratique
P0050=HO2S Chauffeur Capteur 1 pour Controle du Circuit de la Banque 2
P0051=HO2S Chauffeur Capteur 1 pour Controle du Circuit Bas de la Banque 2
P0052=HO2S Chauffeur Capteur 2 pour Controle du Circuit Haut de la Banque 2
P0053=HO2S Chauffeur Capteur 1 de Resistance de la Banque 1
P0054=HO2S Chauffeur Capteur 2 de Resistance de la Banque 1
P0055=HO2S Chauffeur Capteur 3 de Resistance de la Banque 1
P0056=HO2S Circuit de Contrôle Radiateur Rangée 2 Capteur 2
P0057=Chauffeur HO2S Capteur 2 pour Controle du Circuit Bas de la Banque 2
P0058=HO2S Chauffeur Capteur 2 pour Controle du Circuit Haut de la Banque 2
P0059=HO2S Chauffeur Capteur 2 Resistant de la Banque 2
P0060=HO2S Chauffeur Capteur 2 Resistant de la Banque 2
P0061=HO2S Chauffeur Capteur 2 Resistant de la Banque 2
P0062=HO2S Chauffeur Capteur 2 pour Controle du Circuit de la Banque 2
P0063=HO2S Chauffeur Capteur 2 pour Controle de Circuit Bas de la Banque 2
P0064=HO2S Chauffeur Capteur 2 pour Controle du Circuit Haut de la Banque 2
P0065=Rang de Controle d'Injecteur à Aire/Performance
P0066=Injecteur à Aire pour Controle du Circuit ou Circuit Bas
P0067=Injecteur à Aire pour Controle du Circuit Haut
P0068=MAP.MAF-Correlation de Position Loop
P0069=Pression Absolue du Manifold-Correlation de Pression Barométrique
P006A=MAP-Correlation de Flux d'Aire de Masse ou de Volume
P006B=MAPPE-Correlation de Pression d'Exhaustion
P006C=MAPPE-Chargeur Turbo/Superchargeur de Correlation de Pression d'Entrée
P006D=Pression Barométrique-Chargeur Turbo/Superchargeur de Correlation de Pression d'Entrée
P0070=Capteur du Circuit de Temperature d'Aire d'Ambience
P0071=Rang du Capteur de Temperature d'Aire/Performance
P0072=Capteur du Circuit Bas de Temperature d'Aire d'Ambience
P0073=Capteur du Haut Circuit de Temperature d'Aire d'Ambience
P0074=Capteur du Circuit de Temperature d'Aire Intermittent d'Ambience
P0075=Banque 1 de Circuit Solenoide à Valve Absorbant
P0076=Banque 1 pour Controle du Circuit Bas Solenoide à Valve Absorbant
P0077=Banque 1 pour Controle du Haut Circuit Solenoide à Valve Absorbant
P0078=Banque 1- pour Controle du Circuit Solenoide à Valve Absorbant
P0079=Banque 1 pour Controle de Circuit Bas Solenoide à Valve Absorbant
P0080=Banque 1 pour Controle du Haut Circuit à Valve Absorbant
P0081=Banque 2 pour Controle de Circuit Solenoide à Valve Absorbant
P0082=Banque 2 pour Controle du Bas Circuit Solenoide à Valve d'Absorption
P0083=Banque 2 de pour Controle du Haut Circuit Solenoide à Valve Absorbant
P0084=Banque 2 pour Controle de Circuit Solenoide à Valve Absorbant
P0085=Banque 2 pour Controle du Circuit Bas Solenoide à Valve Absorbant
P0086=Banque 2 pour Controle du Haut Circuit Solenoide à Valve Absorbant
P0087=Pression de Système de Raille Carburant-Très Basse
P0088=Pression de Système/Raille Carburant-Trés Haute
P0089=Performance du Régleur 1 de Pression Carburant
P0090=Circuit de Controle du Régleur 1 de Pression Carburant
P0091=Circuit Bas de Controle du Régleur 1 de Pression Carburant
P0092=Haut Circuit pour Controle du Régleur de Pression Carburant
P0093=Fuite du Système Carburant Detectee-Fuite Large
P010B=Rang du Circuit B de Flux d'Aire de Masse ou de Volume/Performance
P010C=Circuit Bas B de Flux d'Aire de Masse ou de Volume
P010D=Haut Circuit B de Flux d'Aire de Masse ou Volume
P010E=Air Flux du Circuit B Intermittent de Masse ou de Volume/Erratique
P010F=Correlation du Capteur A/B de Flux d'Aire de Masse ou Volume
P0110=Circuit du Capteur 1 de Température d'Aire Absorbée
P0111=Rang du Circuit 1 de Capteur de Température d'Aire Absorbée
P0112=Circuit Bas du Capteur 1 de Température d'Aire Absorbée
P0113=Haut Circuit du Capteur 1 de Température d'Aire Absorbée
P0114=Capteur 1 du Circuit Intermittent de Température d'Aire Absorbée
P0124=Loop/Capteur de Position du Pédale/Ouvrez un Circuit Intermittent
P0125=La Température du Coolant est Insuffisante pour Controler le Carburant du Loop Fermé
P0129=Pression Barométrique Très Basse
P012A=Chargeur Turbo/Circuit de Capteur de Pression d'Entrée Superchargeur
P012B=Chargeur Turbo/Rang de Pression du Circuit du Capteur d'Entrèe Superchargeur/Performance
P012C=Turbochargeur/Superchargeur Circuit Bas du Capteur de la Pression d'Entrée Superchargeur
P012D=Turbochargeur/Haut Circuit du Capteur de Pression d'Entrée Superchargeur
P012E=Turbochargeur/Circuit Intermittent du Capteur de Pression d'Entrée Superchargeur/Erratique
P0130=Capteur Q2 Circuit Banque 1 Capteur 1
P0131=Capteur Q2 Banque 1 de Circuit de Voltage Bas Capteur 1
P0132=Q2 Capteur Circuit de Haut Voltage Banque 1 Capteur 1
P0133=Q2 Capteur Circuit de Réponse Lente Banque 1 Capteur 1
P0134=Q2 Capteur Circuit Banque 1 Detectée Non Active Capteur 1
P0135=Q2 Capteur Circuit de Chauffeur Banque 1 Capteur 1
P0150=Capteur Q2 Circuit Banque 2 Capteur 1
P0153=Capteur Q2 Circuit de Réponse Lente Banque 2 Capteur 1
P0154=Capteur Q2 Circuit de Banque 2 Non actif Capteur 1
P0155=Capteur Q2 Circuit de Chauffage de Banque 2 Capteur 1
P0156=Capteur Q2 Circuit Banque 2 Capteur 2
P0157=Capteur Q2 Circuit de Voltage Bas Banque 2 Capteur 2
P0158=Capteur Q2 Circuit de Haut Voltage Banque 2 Capteur 2
P0159=Capteur Q2 Circuit de Reponse Lente Banque 2 Capteur 2
P0160=Capteur Q2 Circuit Sans Activité de Banque Detectée 2 Capteur 2
P0161=Capteur Q2 Circuit de Chauffeur de la Banque 2 Capteur 2
P0162=Capteur Q2 Circuit Banque 2 Capteur 2
P0163=Capteur Q2 Circuit de Voltage Bas Banque 2 Capteur 3
P0164=Capteur Q2 Circuit de Haut Voltage Banque 2 Capteur 3
P0165=Capteur Q2 Circuit de Reponse Lente Banque 2 Capteur 3
P0166=Capteur Q2 Circuit Non Actif de Banque Detectée 2 Capteur 3
P0167=Cqpteur A2 Circuit de Chauffeur Banque 2 Capteur 3
P0169=Composition du Carburante Incorrecte
P0170=Trim Combustibles Banque 1
P0171=Système Trop Leger Banque 1
P0172=Syste,e Trop Riche Banque 1
P0173=Trim Combustible Banque 2
P0174=Système Trop Leger Banque 2
P0175=Système Trop riche Banque 2
P0176=Circuit de Capteur de Composition de Combustibles
P0177=Rang de Circuit de Capteur de Composition de Carburant/Performance
P0178=Circuit Bas de Capteur de Composition de Carburant
P0179=Haut Circuit de Capteur de Composition de Carburant
P0180=Circuit de Capteur A de Température des Combustibles
P0181=Rang de Capteur A de Temperature de Combustibles/Performance
P0182=Circuit Bas de Capteur A de Température des Combustibles
P0183=Haut Circuit de Capteur A de Température des Combustibles
P0184=Circuit de Capteur A Intermittent de Température de Combustibles
P0185=Circuit de Capteur A de Température des Combustibles
P0186=Rang de Circuit de Capteur B de Température des Combustibles/Performance
P0187=Circuit Bas de Capteur B de Température des Combustibles
P0188=Circuit Haut de Capteur B de Température des Combustibles
P0189=Circuit B de Capteur Intermittent de Température de Combustibles
P018A=Circuit de Capteur B de Pression des Combustibles
P018B=Rang de Circuit de Capteur B de Pression des Combustibles/Performance
P018C=Circuit Bas de Capteur B de Pression des Combustibles
P018D=Circuit Haut de Capteur B de Pression des Combustibles
P018E=Circuit de Capteur B Intermittent de Pression des Combustibles/Erratique
P018F=ISO/SAE reservé
P0190=Circuit de Capteur A de Pression de Railles des Combustibles
P0191=Rang de Circuit de Capteur A de Railles des Combustibles/Performance
P0192=Circuit Bas de Capteur A de Railles de Combustibles
P0193=Circuit Haut de Capteur A de Railles des Combustibles
P0194=Circuit de Capteur A Intermittent de Railles des Combustibles/Erratique
P0195=Capteur de Température de Huile de Voiture
P0196=Rang de Capteur de Température de Huile de Voiture/Performance
P0197=Capteur Bas de Température de Huile de Voiture
P0198=Capteur Haut de Température de Huile de Voiture
P0199=Capteur Intermittent de Température de Huile de Voiture
P0200=Circuit d'Injecteur/Ouvert
P0201=Circuit d'Injecteur/Ouvert-Cylindre 1
P0202=Circuit d'Injecteur/Ouvert-Cylindre 2
P0203=Circuit d'Injecteur/Ouvert-Cylindre 3
P0204=Circuit d'injecteur/Ouvert-Cylindre 4
P0205=Circuit d'Injecteur/Ouvert-Cylindre 5
P0206=Circuit d'Injecteur/Ouvert-Cylindre 6
P0207=Circuit d'Injecteur/Ouvert-Cylindre 7
P0208=Circuit d'Injecteur/Ouvert-Cylindre 8
P0209=Circuit d'Injecteur/Ouvert-Cylindre 9
P020A=Temps d'Injection du Cylindre 1
P020B=Temps d'Injection du Cylindre 2
P020C=Temps d'Injection du Cylindre 3
P020D=Temps d'Injection du Cylindre 4
P020E=Temps d'Injection du Cylindre 5
P020F=Temps d'Injection du Cylindre 6
P0210=Circuit d'Injecteur/Ouvert-Cylindre 10
P0211=Circuit d'Injecteur/Ouvert-Cylindre 11
P0212=Circuit d'Injecteur/Ouvert-Cylindre 12
P0213=Debut Injecteur 1 Froid
P0214=Début Injecteur 2 Froid
P0215=Cloture de Machine Solenoide
P0216=Injecteur/Temps de Controle du Temps d'Injection
P0217=Condition de Temperature du Refraicheur de la Machine
P0218=Condition de Temperature de Transmission de Fuite
P0219=Condition de Machine a Vitesse Maximum
P021A=Temps d'Injection du Cylindre 7
P021B=Temps d'Injection du Cylindre 8
P021C=Temps d'Injection du Cylindre 9
P021D=Temps d'Injection du Cylindre 10
P021E=Temps d'Injection du Cylindre 11
P021F=Temps d'Injection du Cylindre 12
P0220=Loop/Capteur de Position du Pedale/Fiche B Circuit
P0221=Loop/Capteur de Position du Pedale/Rang de Circuit Fiche B/Performance
P0222=Loop/Capteur de Position du Pédale/Circuit Bas de Fiche B
P0223=Loop/Capteur de Position du Pédale/Circuit Haut Fiche B
P0224=Loop/Capteur de Position du Pédale/ Circuit Intermittent du Fiche B
P0225=Loop/Capteur de Position du Pédale/Circuit du Fiche C
P0273=Circuit Bas d'Injecteur du Cylindre 5
P0274=Haut Circuit d'Injecteur du Cylindre 5
P0275=Contribution au Cylindre 5/Equilibre
P0276=Circuit Bas d'Injecteur du Cylindre 6
P0277=Haut Circuit d'Injecteur du Cylindre 6
P0278=Contribution au Cylindre 6/Equilibre
P0279=Circuit Bas d'Injecteur du Cylindre 7
P0280=Haut Circuit d'Injecteur du Cylindre 7
P0281=Contribution au Cylindre 7/Equilibre
P0282=Circuit Bas d'Injecteur du Cylindre 8
P0283=Haut Circuit d'Injecteur du Cylindre 8
P0284=Contribution au Cylindre 8/Equilibre
P0285=Circuit Bas d'Injecteur du Cylindre 9
P0286=Haut Circuit d'Injecteur du Cylindre 9
P0287=Contribution au Cylindre 9/Equilibre
P0288=Circuit Bas d'Injecteur du Cylindre 10
P0289=Haut Circuit d'Injecteur du Cylindre 10
P0290=Contribution au Cylindre 10/Equilibre
P0291=Circuit Bas d'Injecteur du Cylindre 11
P0292=Haut Circuit d'Injecteur du Cylindre 11
P0293=Contribution au Cylindre 11/Equilibre
P0294=Circuit Bas d'Injecteur du Cylindre 12
P0295=Haut Circuit d'Injecteur du Cylindre 12
P0296=Contribution au Cylindre 12/Equilibre
P0297=Condition de Voiture à Vitesse Maximale
P0298=Température Super de l'Huile de Voiture
P0299=Chargeur Turbo/Superchargeur Lent
P0300=Hazard/Nombre de Cylindres pour Eteindre le Feu Detectes
P0301=Cylindre 1 pour Eteindre le Feu Détecté
P0302=Cylindre 2 pour Eteindre le Feu Détecté
P0303=Cylindre 3 Eteint Detecté
P0304=Cylindre 4 a Feu Eteint Detecte
P0305=Cylindre 5 a Feu Eteint Detecté
P0306=Cylindre 6 à Feu Eteint Detecté
P0307=Cylindre 7 à Feu Eteint Detecté
P0308=Cylindre 8 à Feu Eteint Detecté
P0309=Cylindre 9 à Feu Eteint Detecté
P0310=Cylindre 10 à Feu Eteint Detecté
P0311=Cylindre 10 à Feu Eteint Detecté
P0312=Cylindre 12 à Feu Eteint Detecté
P0313=Feu Eteint à Carburant Bas Detecté
P0314=Cylindre Eteint (Cylindre non Determiné)
P0315=Variation du Système des Positions Crankshaft Non Pratiqué
P0316=Machine Eteinte Detectee au Bout (Les 1000 Premieres Revolutions)
P0317=Aucun Hardware de Construction de Rues
P0318=Circuit de Signaux du Capteur A de Rues Dures
P0319=Circuit de Signaux du Capteur B des Rues Dures
P0320=Combustion/Circuit Distributeur d'Introduction de Vitesse dans la Machine
P0369=Position Camshaft du Circuit du Capteur B Intermittent Banque 1
P0371=Signal A de Temps de Reference de Haute Resolution Beaucoup de Pulses
P0372=Signe A de Temps de Référence de Haute Performance Très Peu de Pulses
P0373=Signe A Intermittent de Reference au Temps de Haute Resolution/ Pulses Erratiques
P0374=Signe A de Temps de Référence de Haute Résolution Sans Pulse
P0375=Signe B de Temps de Référence de Haute Résolution
P0376=Signe B de Temps de Référence de Haute Résolution Trop de Pulses
P0377=Signe B de Temps de Référence de Haute Résolution Tres Peu de Pulses
P0378=Signe B Intermittent de Temps de Référence de Haute Résolution/Pulses Erratiques
P0379=Signe B de Temps de Référence de Haute Résolution Sans Pulses
P0380=Fiche de Charbon/Circuit de Chauffeur A
P0390=Capteur B de Position Camshaft Circuit Banque 2
P0391=Rang de Circuit de Capteur B de Position Camshaft/Performance Banque 2
P0392=Circuit Bas de Capteur B de Position Camshaft Banque 2
P0393=Haut Circuit de Capteur B de Position Camshaft Banque 2
P0394=Circuit de Capteur B de Position Camshaft Banque 2
P0400=Flux de Rirculation du Gas de Combustion
P0401=Flux de Recirculation Insuffisante du Gas d'Exhaustion Detecte
P0402=Flux Excessif de Recirculation du Gas d'Exhaustion Detecte
P0403=Circuit de Controle de Recirculation du Gas de Controle
P0404=Rang du Circuit de Controle de Recirculation du Gas d'Exhaustion/Performance
P0405=Circuit Bas du Capteur A de Recirculation du Gas d'Exhaustion
P0406=Haut Circuit du Capteur A de Recirculation du Gas d'Exhaustion
P0408=Haut Circuit du Capteur B de Recirculation du Gas d'Exhaustion
P0409=Circuit du Capteur A de Recirculation du Gas d'Exhaustion
P040A=Temperature du Circuit du Capteur A de Recirculation du Gas d'Exhaustion
P040B=Rang du Circuit de Temperature du Capteur A du Gas d'Exhaustion/Performance
P040C=Circuit Bas du Capteur A de Température de Recirculation du Gas d'Exhaustion
P040D=Haut Circuit du Capteur A de Température de Recirculation du Gas d'Exhaustion
P040E=Circuit du Capteur A Intermittent de Température de Recirculation du Gas d'Exhaustion/Erratique
P040F=Capteur A/B Connecte de Température de Recirculation du Gas d'Exhaustion
P0410=Système Secondaire d'Injection d'Aire
P0411=Flux du Système d'Aire Secondaire Incorrecte Detecté
P0412=Circuit de Fiche de Valve A du Systeme Secondaire d'Injection d'Aire
P0413=Circuit Ouvert de Fiche de la Valve A du Systeme d'Injection d'Aire Secondaire
P0414=Circuit Court du Systeme Secondaire de Valve A d'Injection d'Aire
P041D=Haut Circuit du Capteur B de Temperature de Recirculation du Gas d'Exhaustion
P041E=Circuit Intermittent du Capteur B de Temperature de Recirculation du Gas d'Exhaustion/Erratique
P041F=ISO/SAE reserve
P0420=Efficacité du Système des Catalystes Sous Seuil Banque 1
P0421=Efficacit de Chaffage des Catalystes Sous Seuil Banque 1
P0422=Efficacite Principale des Catalystes Sous Seuil Banque 1
P0423=Efficacité des Catalystes Chauffes Sous Seuil Banque 1
P0424=Catalystes Chauffés de Température Sous Seuil Banque 1
P0425=Circuit du Capteur de Température des Catalystes Banque 1 Capteur 1
P0426=Rang du Circuit du Capteur de Température des Catalystes/Performance Banque 1 Capteur 1
P0427=Circuit Bas du Capteur de Température des Catalystes Banque 1 Capteur 1
P0428=Haut Circuit du Capteur de Température des Catalystes Banque 1 Capteur 1
P0429=Circuit de Controle du Chauffeur des Catalystes Banque 1
P042A=Circuit du Capteur de Température des Catalystes Banque 1 Capteur 2
P042B=Rang du Circuit du Capteur de Température des Catalystes/Performance Banque 1 Capteur 2
P042C=Circuit Bas du Capteur de Température Banque 1 Capteur 2
P042D=Haut Circuit du Capteur de Température Banque 1 Capteur 2
P042E=ISO/SAE reserve
P042F=ISO/SAE reserve
P0430=Efficacité du Système des Catalystes Sous Seuil Banque 2
P0431=Efficacite du Chauffage des Catalystes Sous Seuil Banque 2
P0432=Efficacité Principale des Catalystes Sous Seuil Banque 2
P0433=Efficacité des Catalystes Chauffes Sous Seuil Banque 2
P0434=Température des Catalystes Chauffes Sous Seuil Banque 2
P0435=Circuit du Capteur de Température des Catalystes Banque 2 Capteur 1
P0436=Rang du Circuit du Capteur de Temperature des Catalystes/Performance Banque 2 Capteur 1
P0437=Circuit Bas du Capteur de Temperature des Catalystes Banque 2 Capteur 1
P0438=Haut Circuit du Capteur de Temperature Banque 2 Capteur 1
P0439=Circuit de Controle du Chauffeur des Catalystes Banque 2
P043A=Circuit du Capteur de Température Banque 2 Capteur 2
P043B=Rang du Circuit de Température des Catalystes/Performance Banque 2 Capteur 2
P043C=Circuit Bas du Capteur de Température des Catalystes Banque 2 Capteur 2
P043D=Haut Circuit du Capteur de Température des Catalystes Banque 2 Capteur 2
P043E=Flux Bas de Référence d'Orifice Detectée du Système d'Emissions de Fuite Evapore
P043F=Haut Flux d'Orifice de Référence du Système de Fuit Detecté d'Emissions Evapore
P0440=Système d'Emissions Evapore
P0441=Flux Purge du Système d'Emissions Evapore
P0454=Capteur de Pression du Systeme d'Emission Evaporatif/Intermittent de Fiche
P0455=Fuite du Système d'Emissions Evaporatif Détecte (grande fuite)
P0456=Systeme de Fuite d'Emissions Evaporatif (fuite petite)
P0457=Système d'Emissions Evaporatif de Fuite Detecte (cap des combustibles lache/ferme)
P0458=Circuit Bas de Controle d'Emissions Pure du Système Evaporatif
P0459=Haut Circuit à Valve de Controle du Système Evaporatif
P0460=Circuit du Capteur A de Niveau de Fuite
P0461=Rang du Circuit du Capteur A de Niveau du Carburant/Performance
P0462=Circuit Bas du Capteur de Niveau des Combustibles
P0463=Haut Circuit du Capteur A de Niveau des Combustibles
P0464=Circuit du Capteur A Intermittent au Niveau des Combustibles
P0465=Circuit du Capteur de Flux Pur EVAP
P0466=Rang du Circuit du Capteur de Flux Pur EVAP/Performance
P0467=Circuit Bas du Capteur de Flux Pur EVAP
P0468=Haut Circuit du Capteur de Flux Pur EVAP
P0469=Circuit du Capteur Intermittent de Flux Pur EVAP
P0470=Circuit du Capteur A de Pression d'Exhaustion
P0471=Rang du Circuit du Capteur A de Pression Evapore/Performance
P0472=Circuit Bas du Capteur A de Pression Evapore
P0473=Haut Circuit du Capteur A de Pression Evapore
P0474=Circuit du Capteur A de Pression Evapore Intermittent/Erratique
P0475=Valve de Controle de Pression Evaporée
P0476=Rang de Valve de Controle de Pression Evaporée/Performance
P0477=Valve de Controle de Pression Evaporee Basse
P0478=Valve Haute de Controle de Pression Evaporée
P0479=Valve de Controle Intermittente de Pression Evaporée
P047A=Circuit du Capteur B de Pression Evapore
P047B=Rang du Circuit du Capteur B de Pression Evaporée/Performance
P047C=Circuit Bas du Capteur B de Pression Evaporée
P047D=Haut Circuit du Capteur B de Pression Exhaustée
P047E=Circuit B du Capteur B Intermittent de Pression Exhaustee/Erratique
P047F=ISO/SAE reservés
P0480=Circuit de Controle du Fan 1
P0481=Circuit de Controle du Fan 2
P0483=Circuit de Controle Rationnel du Fan
P0484=Circuit d'Electricite Super du Fan
P0485=Fan Puissant/Circuit du Sol
P0486=Circuit du Capteur B de Recirculation de Gas Exhauste
P0487=Circuit A de Controle du Loop de Gas Exhausté/Ouvert
P0488=Rang de Circuit de Controle A du Loop de Recircultion de Gas Exhauste!Performance
P0489=Circuit A Bas de Controle de Recirculation du Gas Exhausté
P0551=Capteur de Pression du Volant Puissant/Rang de Fiches du Circuit/Performance
P0552=Capteur de Pression du Volant Puissant/Circuit Bas de Fiches
P0553=Capteur de Pression du Volant Puissant/Circuit Haut des Fiches
P0554=Capteur de Pression du Volant Puissant/Circuit des Fiches Intermittent
P0555=Circuit du Capteur de Pression pour Renforcer les Freins
P0556=Rang de Circuit du Capteur de Pression pour Renforcer les Freins/Performance
P0557=Circuit Bas du Capteur de Pression pour Renforcer les Freins
P0558=Haut Circuit du Capteur de Pression pour Renforcer les Freins
P0559=Circuit du Capteur Intermittent de Pression pour Renforcer les Freins
P0560=Voltage du Système
P0561=Voltage du Système inconstant
P0562=Voltage Bas du Système
P0563=Voltage Haut du Système
P0564=Circuit d'Entree A de Plusieurs Fonctions pour Controler la Tour
P0565=Controle du Signal de la Tour
P0566=Controle du Signal Ferme de la Tour
P0567=Controle du Signal Resume de la Tour
P0568=Set de Controle du Signal de la Tour
P0569=Controle du Signal du Bout de la Tour
P056A=Controle Augmente du Signal de Distance de la Tour
P056B=Controle Reduit du Signal de Distance de la Tour
P0570=Controle Rapide du Signal de la Tour
P0571=Circuit du Fiche A des Freins
P0572=Circuit Bas du Fiche A des Freins
P0573=Circuit Haut du Fiche A des Freins
P0574=Controle du Systeme de la Tour-Vitesse Tres Haute du Vehicule
P0575=Controle d'Entree du Circuit de la Tour
P0576=Controle du Circuit Bas d'Entree de la Tour
P0577=Contrle du Circuit Haut d'Entree de la Tour
P0578=Controle Stable du Circuit d'Entree A de Plusieurs Fonctions de la Tour
P0579=Controle de la Tour du Range du Circuit d'Entree A de Plusieurs Fonctions/Performance
P0580=Controle de la Tour du Circuit Bas A d'Entree de Plusieurs Fonctions
P0581=Controle du Circuit Haut A de l'Entree de la Tour de Plusieurs Fonctions
P0582=Controle du Circuit Vacuum de la Tour/Ouvert
P0583=Controle du Circuit Bas Vacuum de la Tour
P0584=Controle du Circuit Haut Vacuum de la Tour
P0585=Connexion d'Entree A/B de Controle de la Tour
P0482=Controle du Circuit Fan 3
P0490=Controle du Circuit Hait A de Recirculation du Gas d'Exhaustion
P0491=Flux du Systeme d'Injection d'Aire Insuffisant Secondaire Banque 1
P0492=Flux du Systeme d'Injection d'Aire Secoondaire Banque 2
P0493=Vitesse Maximum du Fan
P0494=Vitesse Lente du Fan
P0495=Vitesse Haute du Fan
P0496=Flux Haut du Systeme Purge d'Emissions Evapore
P0497=Flux Bas Purge du Systeme d'Emissions Evapore
P0498=Circuit Bas du Systeme de Controle du Vent d'Emissions Evapore
P0499=Circuit Haut de Controle du Systeme de Vent a Valve d'Emissions Evapore
P0500=Capteur Rapide A du Vehicule
P0501=Rang du Capteur A Rapide du Vehicule/Performance
P0502=Circuit Bas du Capteur A Rapide de la Voiture
P0503=Capteur A Rapide intermittent du Vehicule/Erratique/Haut
P0504=Correlation du Fiche A/B des Freins
P0505=Système Idéal du Controle d'Aire
P0506=Systeme de Controle d Aire Idéal Plus Bas de Celui Attendu
P0507=Système RPM de Controle d Aire Idéal Plus Haut de Ce qu on Attend
P0508=Circuit Bas Ideal du Système de Controle d'Aire
P0523=Capteur de Pression de la Machine a Huile/Fiche haut
P0524=Pression de la Machine a Huile Tres Basse
P0525=Rang du Circuit de Controle de la Tour/Performance
P0526=Circuit du Capteur de Vitesse Fan
P0527=Rang du Circuit du Capteur Rapide Fan/Performance
P0528=Aucun Signe du Circuit du Capteur Rapide Fan
P0529=Circuit du Capteur Rapide Fan Intermittent
P0530=Circuit du Capteur A de Pression Refrigerant A/C
P0531=Rang du Circuit du Capteur de Pression du Refrigerant A/C/Performance
P0532=Circuit du Capteur A de Pression Refrigerant A/C Bas
P0533=Circuit Haut du Capteur A de Pression du Refrigerant A/C
P0534=Perte du Charge du Refrigerant A/C
P0535=Circuit du Capteur de Temperature Evaporateur A/C
P0536=Rang du Circuit du Capteur Chaud Evaporatereur A/C/Performance
P0537=Circuit Bas du Capteur Chaud Evaporateur A/C
P0538=Circuit Haut du Capteur Chaud Evaporateur A/C
P0539=Circuit du Capteur Chaud Evaporateur A/C Intermittent
P0589=Controle d'Entree du Circuit B de la Tour de Plusieurs Fonctions
P0590=Controle du Circuit d'Entree B de la Tour de Plusieurs Fonctions
P0591=Rang du Circuit d'Entree B du Controle de la Tour/Performance
P0592=Circuit Bas d'Entree B pour Controle de la Tour de Plusieurs Fonctions
P0593=Haut Circuit d'Entree B pour Controle de la Tour de Plusieurs Fonctions
P0594=Circuit de Controle Servo de la Tour/Ouvert
P0595=Circuit Bas de Controle Servo pour Controle de la Tour
P0596=Circuit Haut de Controle Servo pour Controle de la Tour
P0597=Circuit de Controle du Thermostate du Chauffeur/Ouvert
P0598=Circuit Bas de Controle du Thermostate du Chauffeur
P0599=Controle du Circuit du Chauffeur de la Tour
P0600=Lien Serial de Communication
P0601=Controle Interne d'Erreurs du Module de Memoire
P0602=Erreur du Programme pour Controle du Module
P0603=Controle Interne d'Erreurs du Module pour Maintenir la Memoire (KAM)
P0604=Controle Interne pour Erreurs pour Accès au Hazard de la Mémoire (RAM)
P0605=Controle Interne pour Erreur du Module pour Lire la Mémoire
P0606=ECM/PCM Processeur
P0607=Performance du Controle du Module
P0608=Controle de Sortie A du Module VSS
P0609=Sortie A du Module de Controle VSS
P060A=Performance du Processeur pour Controle Interne du Module
P060B=Performance du Proces du Controle Interne du Module A/D
P060C=Performance du Processeur Principale pour Controle Interne du Module
P060D=Performance de Position du Pedal d'Accelerateur pour Controle Interne du Module
P060E=Performance de Postion Loop pour Controle Interne du Module
P060F=Performance de Temperature du Rafraicheur pour Controle Interne du Module
P0610=Erreur d'Options pour Controle du Module du Vehicule
P0611=Performance d'Injecteur des Combustibles pour Controle du Module
P0612=Controle du Relai d'Injecteur des Combustibles pour Tester le Module
P0613=Processeur TCM
P0614=ECM/TCM Incompatible
P0615=Circuit du Relai d'Initiateur
P0616=Circuit Bas du Relai d'Initiateur
P0617=Circuit Haut du Relai d'initiateur
P0618=Erreur KAM pour Controle des Combustibles Alternatif
P0619=Controle des Combustibles du Module RAM Alternatif/Erreur ROM
P061A=Controle Interne de Performance du Torque du Module
P061B=Calcule de Performance du Torque du Module pour Controle Interne
P061C=Performance de la Machine RPM du Module pour Controle Interne
P061D=Controle Interne de Performance de la Masse d'Aire de la Machine du Module
P061E=Controle Interne de Performance des Freins du Module
P061F=Controle Interne de Performance du Controleur Loop Actuaire du Module
P0620=Controle des Batteries du Circuit
P0621=Circuit d'Ordinateur L/Lampe Génératrice
P0622=Circuit d'Ordinateur F/Champ Génératrice
P0623=Controle du Circuit a Lampe Génératrice
P0624=Controle du Circuit du Cap de Lampe Génératrice
P0628=Controle de Circuit Bas a Pompe A de Combustibles
P0629=Controle de Circuit Haut a Pompe A de Combustibles
P062A=Controle de Rang du Circuit a Pompe A de Combustibles/Performance
P062B=Controle Interne de Performance du Module d'Injecteur de Combustibles
P062C=Controle Interne de Performance du Module de Vehicule Rapide
P062D=Performance du Circuit du Conducteur d'Injecteur de Combustibles Banque 1
P062E=Performance du Circuit de Conducteur d'Injecteur de Combustibles Banque 2
P062F=Controle Interne d'Erreurs de Module EEPROM
P0630=VIN Non Programme ou Incompatible-ECM/PCM
P0631=VIN Non Programme ou Incompatible-TCM
P0632=Odomètre Non Programme-ECM/PCM
P0633=Cle d'Immobiliseur Non Programme-ECM/PCM
P0634=PCM/ECM/TCM Temperature Interne Très Haute
P0635=Controle de Circuit de Volant Puissant
P0636=Controle de Circuit Bas de Volant Puissant
P0637=Controle du Circuit Haut de Volant Puissant
P0638=Rang de Controle de Loop Actuaire/Performance Banque 1
P0639=Rang de Controle de Loop Actuaire/Performance Banque 2
P063A=Sens de Circuit de Voltage de Batteries
P063B=Rang de Circuit de Sens de Voltage de Batteries/Performance
P063C=Circuit Bas de Sens de Voltage de Batteries
P063D=Circuit Haut de Sens de Voltage de Batteries
P063E=Entree de Loop Auto- configure Non Existant
P063F=Auto-configuration de la Temperature d'Entree du Rafraicheur de la Machine Non Existant
P0640=Controle du Circuit du Chauffeur d'Absorption d'Aire
P0641=Référence du Capteur du Circuit de Voltage A/Ouvert
P0642=Référence du Capteur du Circuit Bas de Voltage A
P0643=Référence du Capteur du Circuit Haut de Voltage A
P0644=Ecran du Conducteur du Circuit de Communication Seriale
P0645=Controle du Circuit de Relais a Grapper A/C
P0646=Controle du Circuit Bas de Relais a Grapper A/C
P0647=Controle du Circuit Haut de Relais a Grapper A/C
P0648=Controle du Circuit de Lampe d'Immobiliseur
P0649=Controle du Circuit de Lampe de Controle Rapide
P0650=Controle de Circuit de Lampe d'Indicateur de Malfonction (MIL)
P0651=Reference de Capteur de Circuit de Voltage B/Ouvert
P0652=Capteur de Référence de Circuit Bas de Voltage B
P0653=Référence du Capteur du Circuit Haut de Voltage B
P0654=Performance du Circuit de la Machine RPM
P0655=Controle de Performance du Circuit de Lampe Chaude de la Machine
P0656=Performance du Niveau de Combustibles du Circuit
P0657=Provision d'Actuaire de Circuit de Voltage A/Ouvert
P0658=Provision d'Actuaire du Circuit Bas de Voltage A
P0659=Provision d'Actuaire du Circuit Haut de Voltage A
P065A=Performance du Système des Batteries
P065B=Rang de Controle Generateur du Circuit/Performance
P0660=Controle du Circuit a Valve de Son d'Absorption Manifold/Banque Ouverte 1a)
P0661=Controle du Circuit a Valve de Son d'Absorption Manifold Banque 1 a)
P0662=Controle du Circuit Haut a Valve de Son d'Absorption Manifold Banque 1 a)
P0663=Controle du Circuit a Valve de Son d'Absorption Manifold/Banque Ouverte 2 a)
P0664=Controle du Circuit Bas a Valve de Son d'Absorption Manifold Banque 2 a)
P0665=Controle du Haut Circuit a Valve de Son d'Absorption Manifold Banque 2 a)
P0666=Circuit du Capteur de haute temperature Interne PCM/ECM/TCM
P0667=Rang du Capteur Chaud Interne PCM/ECM/TCM/Performance
P0668=Circuit Bas du Capteur Chaud Interne PCM/ECM/TCM
P0669=Circuit Haut du Capteur Chaud Interne PCM/ECM/TCM
P066A=Controle du Circuit Bas de Fiche au Charbon 1
P066B=Controle du Haut Circuit de Fiche au Charbon 1
P066C=Controle du Circuit Bas de Fiche au Charbon 2
P066D=Controle du Circuit Haut de Fiche au Charbon 2
P069F=ISO/SAE reservé
P0700=Controle du Système de Transmission (Demande MIL)
P0701=Rang du Système de Transmission/Performance
P0702=Controle du Système de Transmission d'Electricite
P0703=Circuit de Fiche B des Freins
P0704=Circuit de Fiche d'Entree pour Grapper
P0705=Circuit du Capteur A de Rang de Transmission (PRNDL Entree)
P0706=Rang du Circuit de Capteur A de Transmission/Performance
P070A=Circuit de Capteur de Transmission de Niveau de Flux
P070B=Rang de Circuit du Capteur de Transmission du Niveau de Flux/Performance
P070C=Circuit Bas de Capteur de Transmission du Niveau de Flux
P070D=Circuit Haut de Capteur de Transmission du Niveau de Flux
P070E=Circuit de Capteur Intermittent de Transmission du Niveau de Flux/Erratique
P070F=Transmission du Niveau de Flux Très Bas
P0710=Circuit de Capteur A de Transmission de Température du Flux
P0711=Rang du Circuit de Capteur A de Transmission de Temperature du Flux/Performance
P0712=Circuit Bas de Capteur A de Transmission de Temperature du Flux
P0713=Haut Circuit du Capteur A de Transmission de Température du Flux
P0714=Circuit Intermittent de Capteur A de Transmission de Temperature du Flux
P0715=Entree/Circuit du Capteur A a Tourbine Rapide
P0716=Entrée/Rang du Circuit de Capteur A a Turbine Rapide/Performance
P0717=Entrée/Circuit de Capteur A a Turbine Rapide Sans Signal
P0718=Entree/Circuit de Capteur A Intermittent a Turbine Rapide
P0719=Circuit Bas B de Fiche de Freins
P071A=Circuit A de Fiche de Transmission
P071B=Circuit Bas A a Fiche connecte pour Transmission
P071C=Haut Circuit a Fiche A pour Transmission
P0509=Controle du Systeme de Haut Circuit d'Aire Potentielle
P050A=Controle de Performance du Système d'Aire Froide Potential
P050B=Performance en Temps du Systeme de Combustion
P050C=Performance de Temperature du Ventilateur d'Aire Froide de la Machine
P050D=Controle Rigide Potential de Production d'Aire Froide
P050E=ISO/SAE reserve
P050F=ISO/SAE reserve
P0510=Position de Fiche de Circuit Ferme
P0511=Controle de Circuit d'Aire Potentielle
P0512=Demande de Démarrage du Circuit
P0513=Cle Incorrecte d'Immobiliseur
P0514=Rang du Circuit a Capteur de Temperature de Batterie/Performance
P0515=Circuit de Capteur de Temperature a Batteries
P0516=Circuit Bas a Capteur de Temperature de Batteries
P0517=Circuit Haut a Capteur de Temperature de Batteries
P0518=Controle de l'Aire Produite du Circuit Intermittent
P0519=Controle de Performance du Systeme d'Aire Produite
P0520=Capteur de la Machine a Huile/Fiche Circuit
P0521=Capteur de Pression de la Machine a Huile/Performance
P0522=Capteur de Pression de la Machine a Huile/Fiche Bas
P0708=Circuit Haut A de Rang de Capteur de Transmission
P0709=Circuit Intermittent de Rang du Capteur A pour Transmission
P071D=Circuit de Fiche B de Transmission
P071E=Circuit B de Fiche B de Transmission
P071F=Circuit Haut du Capteur B pour Transmission
P0720=Circuit de Production a Capteur Rapide
P0721=Rang de Circuit de Production a Capteur Rapide/Performance
P0722=Circuit de Production de Capteur Rapide sans Signe
P0723=Circuit Intermittent de Production a Capteur Rapide
P0724=Circuit Haut de Fiche B de Freins
P0725=Circuit de Production a Machine Rapide
P0726=Rang de Circuit de Production a Machine Rapide/Performance
P0727=Circuit de Production a Machine Rapide sans Signe
P0728=Circuit Intermittent de Production a Machine Rapide
P0729=Ration Incorrecte de Grenage 6
P0730=Ration Incorrecte de Grenage
P0731=Ration Incorrecte de Grenage 1
P0732=Ration Incorrecte de Grenage 2
P0733=Ration Incorrecte de Grenage 3
P0734=Ration Incorrecte de Grenage 4
P0735=Ration Incorrecte de Grenage 5
P0736=Ration Incorrecte Reverse
P0737=Circuit de Production a Machine Rapide TCM
P0738=Circuit Bas Generateur a Machine Rapide TCM
P0739=Circuit Haut Generateur a Machine Rapide TCM
P0740=Circuit a Convertisseur de Torque pour Grapper/Ouvert
P0741=Performance de Circuit a Convertisseur de Torque pour Grapper/Decollage
P0742=Circuit Colle a Convertisseur de Torque pour Grapper
P0143=Circuit Basse Tension Capteur O2 Radiateur Rangée 1 Capteur 3
P0142=Circuit Capteur O2 Rangée 1 Capteur 3
P0141=Circuit Capteur O2 Radiateur Rangée 1 Capteur 2
P0140=Circuit Pas d'Activité Détectée Capteur O2 Rangée 1 Capteur 2
P0139=Circuit Réponse Lente Capteur O2 Rangée 1 Capteur 2
P0138=Circuit Tension Haute Capteur O2 Rangée 1 Capteur 2
P0137=Circuit Tension Basse Capteur O2 Rangée 1 Capteur 2
P0136=Circuit Capteur O2 Rangée 1 Capteur 2
P0128=Thermostat Liquide de Refroidissement (Température Liquide de Refroidissement En Dessous de Régulation Thermostat)
P0126=Température Liquide de Refroidissement Insuffisante pour Opération Stable
P0123=Accélérateur/Capteur Position Pédale/Circuit Haut Interrupteur A
P0122=Accélérateur/Capteur Position Pédale/Circuit Bas Interrupteur A
P0121=Accélérateur/Capteur Position Pédale/Circuit Interrupteur A Variation/Performance
P0120=Accélérateur/Capteur Position Pédale/Circuit Interrupteur A
P011A=Température Liquide de Refroidissement Capteur 1/2 Corrélation
P0119=Circuit Intermittent Température Liquide de Refroidissement Capteur 1
P0118=Circuit Haut Température Liquide de Refroidissement Capteur 1
P0117=Circuit Bas Température Liquide de Refroidissement Capteur 1
P0116=Circuit Température Liquide de Refroidissement Capteur 1 Variation/Performance
P0115=Circuit Température Liquide de Refroidissement Capteur 1
P010A=Masse ou Volume Flux Air Circuit B
P0109=Pression Collecteur Absolue/Circuit Intermittent Pression Barométrique
P0108=Pression Collecteur Absolue/Circuit Haut Pression Barométrique
P0107=Pression Collecteur Absolue/Circuit Bas Pression Barométrique
P0106=Pression Collecteur Absolue/Circuit Pression Barométrique Variation/Performance
P0105=Pression Collecteur Absolue/Circuit Pression Barométrique
P0104=Masse ou Volume Flux Air Circuit A Intermittent
P0103=Masse ou Volume Flux Air Circuit A Haut
P0102=Masse ou Volume Flux Air Circuit A Bas
P0101=Masse ou Volume Flux Air Circuit A Variation/Performance
P0100=Masse ou Volume Flux Air Circuit A
P009A=Température Entrée d'Air / Température Air Ambiant Corrélation
P0099=Température d'Entrée d'Air Capteur 2 Circuit Intermittent/Incohérent
P0098=Température d'Entrée d'Air Capteur 2 Circuit Haut
P0097=Température d'Entrée d'Air Capteur 2 Circuit Bas
P0096=Température Circuit d'Entrée d'Air Capteur 2 Variation/Performance
P0095=Température Circuit d'Entrée d'Air Capteur 2
P0094=Fuite Circuit Carburant Détectée - Petite Fuite
P0229=Accélérateur/Capteur de Position de la Pédale/ Commutateur de Position C Circuit Intermittent
P0228=Accélérateur/Capteur de Position de la Pédale/ Commutateur de Position C Circuit Haut
P0227=Accélérateur/Capteur de Position de la Pédale/ Commutateur de Position C Circuit Bas
P0226=Accélérateur/Capteur de Position de la Pédale/Commutateur de Position C Circuit/Performance
P0152=Bloque 2 Capteur 1 Capteur de O2 Circuit Haute Tension
P0151=Bloque 2 Capteur 1 Capteur de O2 Circuit basse tension
P0149=Erreur de Timing du Carburant
P0147=Bloque 1 Capteur 3 Capteur de O2 Circuit du radiateur
P0144=Bloque 1 Capteur 3 Circuit du Capteur de O2 à haute tension
P0145=Bloque 1 Capteur 3 Circuit du Capteur de O2 à réponse lente
P0146=Bloque 1 Capteur 3 Circuit du Capteur de O2 aucune activité détectée
P0242=Circuit B du capteur de suralimentation du chargeur turbo/super chargeur élevé
P0241=Circuit B du capteur de suralimentation du chargeur turbo/super chargeur faible
P0240=Étendue/Performance du circuit B du capteur de suralimentation du chargeur turbo/super chargeur
P023E=Pression absolue du collecteur - Corrélation du capteur B de suralimentation du chargeur turbo/super chargeur
P023D=Pression absolue du collecteur - Corrélation du capteur A de suralimentation du chargeur turbo/super chargeur
P023C=Circuit de commande de la pompe à liquide de refroidissement du refroidisseur d'air de charge élevé
P023B=Circuit de commande de la pompe à liquide de refroidissement du refroidisseur d'air de charge faible
P023A=Circuit de commande de la pompe à liquide de refroidissement du refroidisseur d'air de charge /Ouvrir
P0239=Circuit B du capteur de suralimentation du chargeur turbo/super chargeur
P0238=Circuit A du capteur de suralimentation du chargeur turbo/super chargeur élevé
P0237=Circuit A du capteur de suralimentation du chargeur turbo/super chargeur faible
P0236=Étendue/Performance du circuit A du capteur de suralimentation du chargeur turbo/super chargeur
P0234=Condition de suralimentation du chargeur turbo/super chargeur
P0235=Circuit A du capteur de suralimentation du chargeur turbo/super chargeur
P0233=Circuit secondaire de pompe à carburant intermittent
P0232=Circuit secondaire de pompe à carburant élevé
P0231=Circuit secondaire de pompe à carburant faible
P022A=Circuit A de commande de dérivation du refroidisseur dair de charge /Ouvrir
P0230=Circuit primaire de pompe à carburant
P022F=Circuit B de commande de dérivation du refroidisseur dair de charge élevé
P022E=Circuit B de commande de dérivation du refroidisseur dair de charge faible
P022D=Circuit B de commande de dérivation du refroidisseur dair de charge /Ouvrir
P022C=Circuit de commande A de dérivation du refroidisseur dair de charge élevé
P022B=Circuit A de commande Ade dérivation du refroidisseur dair de charge faible
U3FFF=Aucun code danomalie défini
U0301=Incompatibilité logicielle avec ECM/PCM
U0302=Incompatibilité logicielle avec module de contrôle de transmission
U0304=Incompatibilité logicielle avec module de commande de changement de vitesse
U0305=Incompatibilité logicielle avec module de régulateur de vitesse
@@ -0,0 +1,144 @@
U0207=אבדה התקשורת מול מודול בקרת הגג הנפתח
U0229=אבדה התקשורת מול מודול חימום ההגה
U0231=אבדה התקשורת מול מודול חישת הגשם
U0320=חוסר תאימות תכנתי עם מודול בקרת היגוי כוח
U0318=חוסר תאימות תכנתי עם מודול בקרת מערכת הבלימה
U0400=התקבלו נתונים שגויים
U0328=חוסר תאימות תכנתי עם מודול חיישן זווית ההיגוי
U0405=התקבלו נתונים שגויים ממודול בקרת השיוט
U0410=התקבלו נתונים שגויים ממודול בקרת משאבת הדלק
U0418=התקבלו נתונים שגויים ממודול בקרת מערכת הבלימה
U0420=התקבלו נתונים שגויים ממודול בקרת היגוי כוח
U0427=התקבלו נתונים שגויים ממודול בקרת אבטחת כלי רכב
U0428=התקבלו נתונים שגויים ממודול חיישן זווית היגוי
U0429=התקבלו נתונים שגויים ממודול בקרת עמוד היגוי
U0430=התקבלו נתונים שגויים ממודול מעקב לחץ האוויר בצמיג
U3FFF=לא הוגדר קוד בעיה
U0120=נשמר על ידי המסמך
U0119=נשמר על ידי המסמך
U0118=נשמר על ידי המסמך
U0117=נשמר על ידי המסמך
U0116=נשמר על ידי המסמך
P256F=שמור ל־ISO/SAE
P240F=שמור ל־ISO/SAE
P240E=שמור ל־ISO/SAE
P240D=שמור ל־ISO/SAE
P207F=שמור ל־ISO/SAE
P206D=שמור ל־ISO/SAE
P206C=שמור ל־ISO/SAE
P206B=שמור ל־ISO/SAE
P206A=שמור ל־ISO/SAE
P205F=שמור ל־ISO/SAE
P204F=שמור ל־ISO/SAE
P0B0F=שמור ל־ISO/SAE
P0B0E=שמור ל־ISO/SAE
P075F=שמור ל־ISO/SAE
P050F=שמור ל־ISO/SAE
P050E=שמור ל־ISO/SAE
P084F=שמור ל־ISO/SAE
P023F=שמור ל־ISO/SAE
P069F=שמור ל־ISO/SAE
P069E=שמור ל־ISO/SAE
P047F=שמור ל־ISO/SAE
P080E=שמור ל־ISO/SAE
P080F=שמור ל־ISO/SAE
P0364=שמור ל־ISO/SAE
P245E=שמור ל־ISO/SAE
P245F=שמור ל־ISO/SAE
P255F=שמור ל־ISO/SAE
P018F=שמור ל־ISO/SAE
P0323=קלט מהירות מנוע במעגל הצתה/מפלג לא רציף
P0322=אין אות קלט מהירות מנוע במעגל הצתה/מפלג
P0321=כשל בביצועי/טווח קלט מהירות מנוע במעגל הצתה/מפלג
P0320=כשל בקלט מהירות מנוע במעגל הצתה/מפלג
P0319=כשל באות מעגל חיישן ‚כביש משובש’ B
P0315=סטיית מערכת מצב גל ארכובה לא נלמדה (ע״י מחשב)
P0314=החטאת ניצוץ בצילינדר יחיד (לא צוין איזה צילינדר)
P0313=זוהתה החטאת ניצוץ עם תערובת ענייה
P0311=זוהתה החטאת ניצוץ צילינדר 11
P0310=זוהתה החטאת ניצוץ צילינדר 10
P0309=זוהתה החטאת ניצוץ צילינדר 9
P0308=זוהתה החטאת ניצוץ צילינדר 8
P0307=זוהתה החטאת ניצוץ צילינדר 7
P0306=זוהתה החטאת ניצוץ צילינדר 6
P0305=זוהתה החטאת ניצוץ צילינדר 5
P0304=זוהתה החטאת ניצוץ צילינדר 4
P0303=זוהתה החטאת ניצוץ צילינדר 3
P0302=זוהתה החטאת ניצוץ צילינדר 2
P0301=זוהתה החטאת ניצוץ צילינדר 1
P0312=זוהתה החטאת ניצוץ צילינדר 12
P0318=כשל באות מעגל חיישן ‚כביש משובש’ A
P0317=חומרת ‚כביש משובש’ לא קיימת
P0316=זוהתה החטאת ניצוץ בהנעה (1000 סיבובים ראשונים)
P0324=שגיאה במערכת בקרת נקישות
P0431=יעילות המערכת הקטליטית המתחממת מתחת לסף הפעולה למצבור 2 (צד ימין)
P0430=יעילות המערכת הקטליטית מתחת לסף הפעולה למצבור 2 (צד ימין)
P042F=שמור ל־ISO/SAE
P042E=שמור ל־ISO/SAE
P041F=שמור ל־ISO/SAE
P012F=שמור ל־ISO/SAE
P006F=שמור ל־ISO/SAE
P006E=שמור ל־ISO/SAE
P000F=שמור ל־ISO/SAE
P000E=שמור ל־ISO/SAE
P0009=ביצועי מערכת מצב מנוע מצבור 2 (צד ימין)
P0008=ביצועי מערכת מצב מנוע מצבור 1 (צד שמאל)
P0007=אות גבוה במעגל בקרת שסתום הפסקת דלק
P0006=אות נמוך במעגל בקרת שסתום הפסקת דלק
P0005=נתק/קצר במעגל בקרת שסתום הפסקת דלק
P0004=אות גבוה במעגל בקרת וסת דלק
P0003=אות נמוך במעגל בקרת וסת דלק
P0002=טווח/ביצועים במעגל בקרת וסת דלק
P0001=נתק/קצר במעגל בקרת וסת דלק
U0105=אבדה התקשורת מול מודול בקרת הזרקת הדלק
U0104=אבדה התקשורת מול מודול בקרת השיוט
U0103=אבדה התקשורת מול מודול העברת ההילוכים
U0099=נשמר על ידי המסמך
U0098=נשמר על ידי המסמך
U0097=נשמר על ידי המסמך
U0096=נשמר על ידי המסמך
U0095=נשמר על ידי המסמך
U0094=נשמר על ידי המסמך
U0093=נשמר על ידי המסמך
U0092=נשמר על ידי המסמך
U0091=נשמר על ידי המסמך
U0090=נשמר על ידי המסמך
U0089=נשמר על ידי המסמך
U0088=נשמר על ידי המסמך
U0087=נשמר על ידי המסמך
U0086=נשמר על ידי המסמך
U0085=נשמר על ידי המסמך
U0084=נשמר על ידי המסמך
U0083=נשמר על ידי המסמך
U0082=נשמר על ידי המסמך
U0081=נשמר על ידי המסמך
U0080=נשמר על ידי המסמך
U0079=נשמר על ידי המסמך
U0078=נשמר על ידי המסמך
U0077=נשמר על ידי המסמך
U0076=נשמר על ידי המסמך
U0075=נשמר על ידי המסמך
U0074=
U0139=נשמר על ידי המסמך
U0138=נשמר על ידי המסמך
U0137=נשמר על ידי המסמך
U0136=נשמר על ידי המסמך
U0135=נשמר על ידי המסמך
U0134=נשמר על ידי המסמך
U0133=נשמר על ידי המסמך
U0163=אבדה התקשורת מול מודול בקרת הניווט
U0162=אבדה התקשורת מול מודול תצוגת הניווט
U0161=אבדה התקשורת מול מודול המצפן
U0159=אבדה התקשורת מול מודול מסייע החנייה
U0183=אבדה התקשורת מול מודול בקרת התאורה - אחורי
U0182=אבדה התקשורת מול מודול בקרת התאורה - קדמי
U0186=אבדה התקשורת מול מגבר השמע
U0185=אבדה התקשורת מול מודול בקרת האנטנה
U0184=אבדה התקשורת מול הרדיו
U0197=אבדה התקשורת מול מודול בקרת הטלפון
U0192=אבדה התקשורת מול המחשב האישי
U0191=אבדה התקשורת מול הטלוויזיה
U0198=אבדה התקשורת מול מודול בקרת הטלמטיקה
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,10 @@
P0001=Regolatore del circuito di controllo del volume carburante/aperto
P0002=Regolatore del circuito di controllo volume di carburante distanza/prestazioni
P0003=Regolatore del circuito di controllo volume di carburante basso
P0004=Regolatore del circuito di controllo volume di carburante Alto
P0005=Controllo Circuito valvola a intercettazione carburante/Aperto
P0006=Controllo circuito valvola a intercettazione carburante Basso
P0007=Controllo circuito valvola a intercettazione carburante Alto
U3FFF=Nessun codice di errore impostato
P000F=Riservato a ISO/SAE
P000E=Riservato a ISO/SAE
@@ -0,0 +1,2 @@
P0001=Amniniḍ n unezḍay n umlugen n tuzirt isissuɣa / yeldi
P0002=Amniniḍ n unezḍay n umlugen n tuzirt n yidis / tarebbawt
@@ -0,0 +1,87 @@
P0001=연료량 조절기 제어 회로 열림
P0002=연료량 조절기 제어 회로 범위 / 성능
P0003=연료량 조절기 제어 회로가 낮음
P0004=연료량 조절기 제어 회로가 높음
P0005=연료 차단 밸브 A 제어 회로 / 열림
P0006=연료 차단 밸브 A 제어 회로가 낮음
P0007=연료 차단 밸브 A 제어 회로가 높음
P000A=A 캠축 위치 저속 응답 뱅크 1
P000B=B 캠축 위치 저속 응답 뱅크 1
P000C=A 캠축 위치 저속 응답 뱅크 2
P000D=B 캠축 위치 저속 응답 뱅크 2
P000E=ISO/SAE 예약됨
P000F=ISO/SAE 예약됨
P0010=A 캠축 위치 액추에이터 회로 / 오픈 뱅크 1
P0011=A 캠축 위치 - 타이밍 임계값 초과 또는 시스템 성능 뱅크 1
P0012=A 캠축 위치 - 타이밍 초과 지연 뱅크 1
P0009=엔진 위치 시스템 성능 뱅크 2
P0013=B 캠축 위치 - 액추에이터 회로 / 오픈 뱅크 1
P0008=엔진 위치 시스템 성능 뱅크 1
P006D=기압 - 터보차저/슈퍼차저 입구 압력 상관관계
P0044=HO2S 히터 제어 회로 높음 뱅크 1 센서 3
P0067=공기 보조 인젝터 제어 회로 높음
P0068=MAP/MAF – 스로틀 위치 상관 관계
P0063=HO2S 히터 제어 회로 낮음 뱅크 2 센서 3
P0064=HO2S 히터 제어 회로 높음 뱅크 2 센서 3
P0062=HO2S 히터 제어 회로 뱅크 2 센서 3
P0058=HO2S 히터 제어 회로 높음 뱅크 2 센서 2
P0059=HO2S 히터 저항 뱅크 2 센서 1
P0054=HO2S 히터 저항 뱅크 1 센서 2
P0053=HO2S 히터 저항 뱅크 1 센서 1
P0050=HO2S 히터 제어 회로 뱅크 2 센서 1
P0051=HO2S 히터 제어 회로 낮음 뱅크 2 센서 1
P0048=터보차저/슈퍼차저 부스트 컨트롤 솔레노이드 A 회로 높음
P0041=O2 센서 신호 교환됨 뱅크 1 센서 2/뱅크 2 센서 2
P0039=터보차저/슈퍼차저 우회 밸브 제어 회로 범위/성능
P0040=O2 센서 신호 교환됨 뱅크 1 센서 1/뱅크 2 센서 1
P0037=HO2S 히터 제어 회로 낮음 뱅크 1 센서 2
P0031=HO2S 히터 제어 회로 낮음 뱅크 1 센서 1
P0032=HO2S 히터 제어 회로 높음 뱅크 1 센서 1
P0033=터보차저/슈퍼차저 우회 밸브 제어 회로
P0030=HO2S 히터 제어 회로 뱅크 1 센서 1
P0028=흡기 밸브 제어 솔레노이드 회로 범위/성능 뱅크 2
P0023=B 캠축 위치 - 액추에이터 회로 / 오픈 뱅크 2
P0019=크랭크축 위치 – 캠축 위치 상관관계 뱅크 2 센서 B
P0014=B 캠축 위치 - 타이밍 임계값 초과 또는 시스템 성능 뱅크 1
P0029=배기 밸브 제어 솔레노이드 회로 범위/성능 뱅크 2
P0034=터보차저/슈퍼차저 우회 밸브 제어 회로 낮음
P0045=터보차저/슈퍼차저 부스트 제어 솔레노이드 A 회로/오픈
P0046=터보차저/슈퍼차저 부스트 제어 솔레노이드 A 회로 범위/성능
P0060=HO2S 히터 저항 뱅크 2 센서 2
P0035=터보차저/슈퍼차저 우회 밸브 제어 회로 높음
P0036=HO2S 히터 제어 회로 뱅크 1 센서 2
P0038=HO2S 히터 제어 회로 높음 뱅크 1 센서 2
P0043=HO2S 히터 제어 회로 낮음 뱅크 1 센서 3
P0047=터보차저/슈퍼차저 부스트 컨트롤 솔레노이드 A 회로 낮음
P004C=터보차저/슈퍼차저 부스트 컨트롤 솔레노이드 B 회로 낮음
P0055=HO2S 히터 저항 뱅크 1 센서 3
P0066=공기 보조 인젝터 제어 회로 또는 회로 낮음
P0016=크랭크축 위치 – 캠축 위치 상관관계 뱅크 1 센서 A
P0018=크랭크축 위치 – 캠축 위치 상관관계 뱅크 2 센서 A
P0021=A 캠축 위치 - 타이밍 임계값 초과 또는 시스템 성능 뱅크 2
P0024=B 캠축 위치 - 타이밍 임계값 초과 또는 시스템 성능 뱅크 2
P0042=HO2S 히터 제어 회로 뱅크 1 센서 3
P0049=터보차저/슈퍼차저 터빈 과속
P004A=터보차저/슈퍼차저 부스트 제어 솔레노이드 B 회로/오픈
P004E=터보차저/슈퍼차저 부스트 제어 솔레노이드 A 회로 간헐 작동/불규칙
P004F=터보차저/슈퍼차저 부스트 제어 솔레노이드 B 회로 간헐 작동/불규칙
P0015=B 캠축 위치 - 타이밍 초과 지연 뱅크 1
P0017=크랭크축 위치 – 캠축 위치 상관관계 뱅크 1 센서 B
P004B=터보차저/슈퍼차저 부스트 제어 솔레노이드 B 회로 범위/성능
P004D=터보차저/슈퍼차저 부스트 컨트롤 솔레노이드 B 회로 높음
P0056=HO2S 히터 제어 회로 뱅크 2 센서 2
P0065=공기 보조 인젝터 제어 범위/성능
P006B=MAP 배기 압력 상관 관계
P0022=A 캠축 위치 - 타이밍 초과 지연 뱅크 2
P0020=A 캠축 위치 액추에이터 회로 / 오픈 뱅크 2
P0025=B 캠축 위치 - 타이밍 초과 지연 뱅크 2
P0026=흡기 밸브 제어 솔레노이드 회로 범위/성능 뱅크 1
P0027=배기 밸브 제어 솔레노이드 회로 범위/성능 뱅크 1
P0052=HO2S 히터 제어 회로 높음 뱅크 2 센서 1
P0057=HO2S 히터 제어 회로 낮음 뱅크 2 센서 2
P0061=HO2S 히터 저항 뱅크 2 센서 3
P006A=MAP – 질량 또는 체적 공기 흐름 상관 관계
P006C=MAP - 터보차저/슈퍼차저 입구 압력 상관관계
P0069=매니폴드 절대 압력 – 기압 상관 관계
P006F=ISO/SAE 예약됨
P006E=ISO/SAE 예약됨
@@ -0,0 +1,17 @@
P0001=Regulator for kontroll av drivstoffvolum/Åpen
P0002=Regulatorkrets for kontroll av drivstoffvolum/Ytelse
P0003=Regulatorkrets for kontroll av drivstoffvolum lav
P0004=Regulatorkrets for kontroll av drivstoffvolum høy
P0005=Ventil for drivstoffavstengning A Kontrollkrets/åpen
P0006=Ventil for drivstoffavstengning A Kontrollkrets lav
P0007=Ventil for drivstoffavstengning A Kontrollkrets høy
P0009=Motorplassering systemytelse bank 2
P000A=A kamakselposisjon treg reaksjon bank 1
P0008=Motorplassering systemytelse bank 1
P000B=B kamakselposisjon treg reaksjon bank 1
P000C=A kamakselposisjon treg reaksjon bank 1
P000D=B kamakselposisjon treg reaksjon bank 2
P000E=ISO/SAE reservert
P000F=ISO/SAE reservert
P0010=A kamakselposisjon relée krets / åpen bank 1
P0011=
File diff suppressed because it is too large Load Diff
@@ -0,0 +1 @@
P0001=ਫਿਊਲ ਵੋਲੀਅਮ ਰੈਗੂਲੇਟਰ ਕੰਟਰੋਲ ਸਰਕਟ/ਓਪਨ
@@ -0,0 +1,474 @@
P0001=Regulator ilości paliwa - Otwarty obwód sterowania
P0002=Regulator ilości paliwa Awaria obiegu prądu/wydajności
P0003=Regulator ilości paliwa Sygnał zbyt niski
P0004=Regulator ilości paliwa Sygnał zbyt wysoki
P0005=Zawór odcinający paliwo A - Obwód sterowania/otwarty
P0006=Zawór odcinający paliwo A - Sygnał zbyt niski
P0007=Zawór odcinający paliwo A - Sygnał zbyt wysoki
P0008=Czasy sterowania silnika - 1 rząd cylindrów
P0009=Czasy sterowania silnika - 2 rząd cylindrów
P000A=Wolna reakcja na położenie wałka rozrządu zaworów dolotowych (A) - rząd 1
P000B=Wolna reakcja na położenie wałka rozrządu zaworów dolotowych (B) - rząd 1
P000C=Wolna reakcja na położenie wałka rozrządu zaworów dolotowych (A) - rząd 2
P000D=Wolna reakcja na położenie wałka rozrządu zaworów dolotowych (B) - rząd 2
P000E=Zarezerwowane ISO/SAE
P000F=Zarezerwowane ISO/SAE
P006E=Zarezerwowane ISO/SAE
P006F=Zarezerwowane ISO/SAE
P012F=Zarezerwowane ISO/SAE
P018F=Zarezerwowane ISO/SAE
P023F=Zarezerwowane ISO/SAE
P0364=Zarezerwowane ISO/SAE
P041F=Zarezerwowane ISO/SAE
P042E=Zarezerwowane ISO/SAE
P042F=Zarezerwowane ISO/SAE
P047F=Zarezerwowane ISO/SAE
P050E=Zarezerwowane ISO/SAE
P050F=Zarezerwowane ISO/SAE
P069E=Zarezerwowane ISO/SAE
P069F=Zarezerwowane ISO/SAE
P075F=Zarezerwowane ISO/SAE
P080E=Zarezerwowane ISO/SAE
P080F=Zarezerwowane ISO/SAE
P084F=Zarezerwowane ISO/SAE
P0B0E=Zarezerwowane ISO/SAE
P0B0F=Zarezerwowane ISO/SAE
P204F=Zarezerwowane ISO/SAE
P205F=Zarezerwowane ISO/SAE
P206A=Zarezerwowane ISO/SAE
P206B=Zarezerwowane ISO/SAE
P206C=Zarezerwowane ISO/SAE
P206D=Zarezerwowane ISO/SAE
P207F=Zarezerwowane ISO/SAE
P240D=Zarezerwowane ISO/SAE
P240E=Zarezerwowane ISO/SAE
P240F=Zarezerwowane ISO/SAE
P245E=Zarezerwowane ISO/SAE
P245F=Zarezerwowane ISO/SAE
P255F=Zarezerwowane ISO/SAE
P256F=Zarezerwowane ISO/SAE
P0010=Nastawnik wlotu rozrządu cylinder rzędu 1
P0011=Nastawnik wlotu rozrządu Nadmierne przestawienie w kierunku „wcześnie” lub wydajność systemu - cylinder rzędu 1
P0012=Elektrozawór ustawienia wału rozrządczego wlotowego 1. Rozrząd za bardzo cofnięty
P0013=Nastawnik wlotu rozrządu cylinder rzędu 1
P0014=Przestawnik rozrządu sterowania wylotu 1 rzędu cylindrów, nadmierne przestawienie w kierunku „wcześnie”
P0015=Przestawnik rozrządu sterowania wylotu 1 rzędu cylindrów, Nadmierne przestawienie w kierunku „późno”
P0016=Pozycja wału korbowego/rozrządu 1 rzędu cylindrów, Błąd odniesienia czujnika A Wiązka przewodów
P0017=Pozycja wału korbowego/rozrządu 1 rzędu cylindrów, Błąd odniesienia czujnika B Wiązka przewodów
P0018=Pozycja wału korbowego/rozrządu 2 rzędu cylindrów, Błąd odniesienia czujnika A Wiązka przewodów
P0019=Pozycja wału korbowego/rozrządu 2 rzędu cylindrów, Błąd odniesienia czujnika B Wiązka przewodów
P0020=Nastawnik wlotu rozrządu cylinder rzędu 2, awaria obiegu prądu
P0021=Nastawnik wlotu rozrządu cylinder rzędu 2, Nadmierne przestawienie w kierunku „wcześnie”
P0022=Nastawnik wlotu rozrządu cylinder rzędu 2, Nadmierne przestawienie w kierunku „późno”
P0023=Przestawnik rozrządu sterowania wylotu 2 rzędu cylindrów, awaria obiegu prądu
P0024=Przestawnik rozrządu sterowania wylotu 2 rzędu cylindrów, Nadmierne przestawienie w kierunku „wcześnie”
P0025=Przestawnik rozrządu sterowania wylotu 2 rzędu cylindrów , Nadmierne przestawienie w kierunku „późno”
P0026=Obieg prądu. Zawór magnetyczny przestawnik rozrządu wejścia 1 rzędu cylindrów, błąd funkcyjny lub zakresowy
P0027=Obieg prądu. Zawór magnetyczny regulator faz rozrządu wylotu 1 rzędu cylindrów, błąd funkcyjny lub zakresowy
P0028=Obieg prądu. Zawór magnetyczny przestawnik rozrządu wejścia 2 rzędu cylindrów, błąd funkcyjny lub zakresowy
P0029=Obieg prądu. Zawór magnetyczny regulator faz rozrządu wylotu 2 rzędu cylindrów błąd funkcyjny lub zakresowy
P0030=Podgrzana sonda lambda 1, 1 rząd cylindrów, Regulacja ogrzewania awaria obiegu prądu
P0031=Podgrzana sonda lambda 1, 1 rząd cylindrów, Regulacja ogrzewania Sygnał zbyt niski
P0032=Podgrzana sonda lambda 1, 1 rząd cylindrów, Regulacja ogrzewania Sygnał zbyt wysoki
P0033=Zawór regulujący ciśnienie doładowania, awaria obiegu prądu
P0034=Zawór regulujący ciśnienie doładowania. Sygnał zbyt niski
P0035=Zawór regulujący ciśnienie doładowania. Sygnał zbyt wysoki
P0036=Podgrzana sonda lambda 2, 1 rząd cylindrów, Regulacja ogrzewania awaria obiegu prądu
P0037=Podgrzana sonda lambda 2, 1 rząd cylindrów, Regulacja ogrzewania Sygnał zbyt niski
P0038=Podgrzana sonda lambda 2, 1 rząd cylindrów, Regulacja ogrzewania Sygnał zbyt wysoki
P0039=Zawór bypassowy turbosprężarka / Zawór obejściowy kompresora powietrza doładowującego
P0040=Sonda lambda Zamienione sygnały, 1 rząd cylindrów Czujnik 1, 2 rząd cylindrów Czujnik 1
P0041=Sonda lambda Zamienione sygnały, 1 rząd cylindrów Czujnik 2, 2 rząd cylindrów Czujnik 2
P0042=Podgrzana sonda lambda 3, 1 rząd cylindrów, Regulacja ogrzewania awaria obiegu prądu
P0043=Podgrzana sonda lambda 3, 1 rząd cylindrów, Regulacja ogrzewania Sygnał zbyt niski
P0044=Podgrzana sonda lambda 3, 1 rząd cylindrów, Regulacja ogrzewania Sygnał zbyt wysoki
P0045=Zawór elektromagnetyczny turbosprężarki/kompresora Otwarty obwód prądu
P0046=Zawór elektromagnetyczny turbosprężarki/kompresora błąd funkcyjny lub zakresowy Obieg prądu
P0047=Zawór elektromagnetyczny turbosprężarki/kompresora Sygnał zbyt niski
P0048=Zawór elektromagnetyczny turbosprężarki/kompresora Sygnał zbyt wysoki
P0049=Koło turbiny turbosprężarki Nadmierne obroty
P004A=Turbosprężarka/Doładowanie Zwiększ sterowania elektromagnesu B obwód/otwarty
P004B=Turbosprężarka/Doładowanie Zwiększ sterowania elektromagnesu B Zakres obwodu/Wydajność
P004C=Turbosprężarka/Doładowanie Zwiększ sterowania elektromagnesu B Sygnał zbyt niski
P004D=Turbosprężarka/Doładowanie Zwiększ sterowania elektromagnesu B Sygnał zbyt wysoki
P004E=Turbosprężarka / Doładowanie Zwiększ sterowania elektromagnesu A Obwód przerwany/Erratic
P004F=Turbosprężarka / Doładowanie Zwiększ sterowania elektromagnesu B Obwód przerwany/Erratic
P0050=Podgrzana sonda lambda 1, 2 rząd cylindrów, Regulacja ogrzewania awaria obiegu prądu
P0051=Podgrzana sonda lambda 1, 2 rząd cylindrów, Regulacja ogrzewania Sygnał zbyt niski
P0052=Podgrzana sonda lambda 1, 2 rząd cylindrów, Regulacja ogrzewania Sygnał zbyt wysoki
P0053=Podgrzana sonda lambda, 1 rząd cylindrów, Czujnik 1
P0054=Podgrzana sonda lambda, 1 rząd cylindrów, Czujnik 2
P0055=Podgrzana sonda lambda, 1 rząd cylindrów, Czujnik 3
P0056=Podgrzana sonda lambda 2, 2 rząd cylindrów, Regulacja ogrzewania awaria obiegu prądu
P0057=Podgrzana sonda lambda 2, 2 rząd cylindrów, Regulacja ogrzewania Obieg prądu. Sygnał zbyt niski
P0058=Podgrzana sonda lambda 2, 2 rząd cylindrów, Regulacja ogrzewania Obieg prądu. Sygnał zbyt wysoki
P0059=Podgrzana sonda lambda, 2 rząd cylindrów, Czujnik 1 Opornik
P0060=Podgrzana sonda lambda, 2 rząd cylindrów, Czujnik 2 Opornik
P0061=Podgrzana sonda lambda, 2 rząd cylindrów, Czujnik 3 Opornik
P0062=Podgrzana sonda lambda 3, 2 rząd cylindrów, Regulacja ogrzewania awaria obiegu prądu
P0063=Podgrzana sonda lambda 3, 2 rząd cylindrów, Regulacja ogrzewania Sygnał zbyt niski
P0064=Podgrzana sonda lambda 3, 2 rząd cylindrów, Regulacja ogrzewania Sygnał zbyt wysoki
P0065=Zawór wtryskowy wspomagany zasysanym powietrzem, błąd funkcyjny lub zakresowy
P0066=Zawór wtryskowy wspomagany zasysanym powietrzem, awaria obiegu prądu Sygnał zbyt niski
P0067=Zawór wtryskowy wspomagany zasysanym powietrzem, Sygnał zbyt wysoki
P0068=Błąd odniesienia Czujnik ciśnienia rury ssącej / Przepływomierz powietrza / Położenie przepustnic
P0069=Błąd odniesienia Czujnik ciśnienia rury ssącej / Czujnik ciśnienia atmosferycznego
P006A=Korelacja pomiędzy MAP a przepływomierzem masowym lub objętościowym powietrza
P006B=Korelacja pomiędzy MAP a ciśnieniem spalin
P006C=Korelacja pomiędzy MAP a ciśnieniem wlotowym doładowania
P006D=Korelacja pomiędzy ciśnieniem atmosferycznym a Turbosprężarką/Ciśnienie wlotowe doładowania
P0070=Czujnik temperatury zewnętrznej, awaria obiegu prądu
P0071=Czujnik temperatury zewnętrznej, błąd funkcyjny lub zakresowy
P0072=Czujnik temperatury zewnętrznej, Sygnał wejściowy zbyt niski
P0073=Czujnik temperatury zewnętrznej, Sygnał wejściowy zbyt wysoki
P0074=Czujnik temperatury zewnętrznej, Czasowe przerwanie obiegu prądu
P0075=Zawór magnetyczny przestawnik rozrządu wejścia 1 rzędu cylindrów, awaria obiegu prądu
P0076=Zawór magnetyczny przestawnik rozrządu wejścia 1 rzędu cylindrów, Sygnał zbyt niski
P0077=Zawór magnetyczny przestawnik rozrządu wejścia 1 rzędu cylindrów, Sygnał zbyt wysoki
P0078=Zawór magnetyczny regulator faz rozrządu wylotu 1 rzędu cylindrów, awaria obiegu prądu
P0079=Zawór magnetyczny regulator faz rozrządu wylotu 1 rzędu cylindrów, Sygnał zbyt niski
P0080=Zawór magnetyczny regulator faz rozrządu wylotu 1 rzędu cylindrów, Sygnał zbyt wysoki
P0081=Zawór magnetyczny przestawnik rozrządu wejścia 2 rzędu cylindrów, awaria obiegu prądu
P0082=Zawór magnetyczny przestawnik rozrządu wejścia 2 rzędu cylindrów, Sygnał zbyt niski
P0083=Wysoki poziom obwodu elektromagnetycznego zaworu dolotowego 2
P0084=Zespół obwodu elektromagnetycznego sterującego zaworem wydechowym 2
P0085=Obwód cewki sterującej zaworu wydechowego w stanie niskim Bank 2
P0086=Obwód cewki sterującej zaworu wydechowego wysoki Bank 2
P0087=Listwa rozdzielacza paliwa, Ciśnienie systemowe zbyt niskie
P0088=Listwa rozdzielacza paliwa, Ciśnienie systemowe zbyt wysokie
P0089=Kontroler ciśnienia paliwa 1, Wydajność
P0090=Kontroler ciśnienia paliwa 1, Otwarty obwód prądu
P0091=Kontroler ciśnienia paliwa 1, Sygnał zbyt niski
P0092=Kontroler ciśnienia paliwa 1, Sygnał zbyt wysoki
P0093=Układ paliwowy nieszczelny - Wykryta duża nieszczelność
P0094=Układ paliwowy nieszczelny - Wykryta mała nieszczelność
P0095=Czujnik temperatury pobieranej 2, awaria obiegu prądu
P0096=Czujnik temperatury pobieranej 2, błąd funkcyjny lub zakresowy
P0097=Czujnik temperatury pobieranej 2, Sygnał wejściowy zbyt niski
P0098=Czujnik temperatury pobieranej 2, Sygnał wejściowy zbyt wysoki
P0099=Czujnik temperatury pobieranej 2, Czasowe przerwanie obiegu prądu
P009A=Korelacja pomiędzy temperaturą powietrza dolotowego a temperaturą powietrza otoczenia
P0100=Przepływomierz powietrza/miernik ilości powietrza, awaria obiegu prądu
P0101=Przepływomierz powietrza/miernik ilości powietrza, błąd funkcyjny lub zakresowy
P0102=Przepływomierz powietrza/miernik ilości powietrza, Sygnał wejściowy zbyt niski
P0103=Przepływomierz powietrza/miernik ilości powietrza, Sygnał wejściowy zbyt wysoki
P0104=Przepływomierz powietrza/miernik ilości powietrza, Czasowe przerwanie obiegu prądu
P0105=Czujnik ciśnienia pompy pobierającej powietrze/Czujnik ciśnienia atmosferycznego, awaria obiegu prądu
P0106=Czujnik ciśnienia pompy pobierającej powietrze/Czujnik ciśnienia atmosferycznego, błąd funkcyjny lub zakresowy
P0107=Czujnik ciśnienia pompy pobierającej powietrze/Czujnik ciśnienia atmosferycznego, Sygnał wejściowy zbyt niski
P0108=Czujnik ciśnienia pompy pobierającej powietrze/Czujnik ciśnienia atmosferycznego, Sygnał wejściowy zbyt wysoki
P0109=Czujnik ciśnienia pompy pobierającej powietrze/Czujnik ciśnienia atmosferycznego, Czasowe przerwanie obiegu prądu
P010A=Masa lub objętość przepływu powietrza, B, Obieg
P010B=Masa lub objętość przepływu powietrza, B, Zakres obwodu/Wydajność
P010C=Masa lub objętość przepływu powietrza, B, Sygnał zbyt niski
P010D=Masa lub objętość przepływu powietrza, B, Sygnał zbyt wysoki
P010E=Masa lub objętość przepływu powietrza, B, Obwód przerwany/Erratic
P010F=Korelacja pomiędzy masą lub objętością przepływu powietrza sensorów A/B
P0110=Czujnik temperatury pobieranej 1, awaria obiegu prądu
P0111=Czujnik temperatury pobieranej 1, błąd funkcyjny lub zakresowy
P0112=Czujnik temperatury pobieranej 1, Sygnał wejściowy zbyt niski
P0113=Czujnik temperatury pobieranej 1, Sygnał wejściowy zbyt wysoki
P0114=Czujnik temperatury pobieranej 1, Czasowe przerwanie obiegu prądu
P0115=Czujnik temperatury cieczy chłodzącej 1, awaria obiegu prądu
P0116=Czujnik temperatury cieczy chłodzącej 1, błąd funkcyjny lub zakresowy
P0117=Czujnik temperatury cieczy chłodzącej 1, Sygnał wejściowy zbyt niski
P0118=Czujnik temperatury cieczy chłodzącej 1, Sygnał wejściowy zbyt wysoki
P0119=Czujnik temperatury cieczy chłodzącej 1, Czasowe przerwanie obiegu prądu
P011A=Temperatura płynu chłodzącego silnika - Sensor 1/2 korelacja
P0120=Przepustnica/Pozycja pedału gazu/ Nieprawidłowe napięcie obwodu A
P0121=Potenciometr przepustnicy klapowej A/Czujnik pedał jezdny A, błąd funkcyjny lub zakresowy
P0122=Przepustnica/Pozycja pedału gazu/ Zbyt niskie napięcie obwodu A
P0123=Przepustnica/Pozycja pedału gazu/ Zbyt wysokie napięcie obwodu A
P0124=Potenciometr przepustnicy klapowej A/Czujnik pedał jezdny A, Czasowe przerwanie obiegu prądu
P0125=Temperatura środka chłodzącego Zbyt niski, Niezamknięty obieg regulacyjny pomiaru paliwa
P0126=Niewystarczająca temperatury płynu chłodzącego dla stabilnej pracy
P0127=Temperatura zasysania powietrza zbyt wysoka
P0128=Termostat cieczy chłodzącej (Temperatura czynnika chłodniczego poniżej temperatury regulacji termostatu)
P0129=Ciśnienie atmosferyczne zbyt niskie
P012A=Obwód czujnika ciśnienia wlotowego turbosprężarki/sprężarki
P012B=Zakres/wydajność czujnika ciśnienia wlotowego turbosprężarki/sprężarki
P012C=Obwód czujnika ciśnienia dolotowego turbosprężarki/sprężarki
P0148=Błąd dostarczania paliwa
P0149=Błąd pomiaru czasu paliwa
P012D=Obwód czujnika ciśnienia wlotowego turbosprężarki/sprężarki doładowującej wysoki
P0477=Niski zawór sterujący ciśnieniem spalin
U3FFF=Nie ustawiono kodów problemów
P070F=Zbyt niski poziom płynu przekładniowego
P021A=Czas wtrysku cylindra 7
P0219=Stan nadmiernej prędkości obrotowej silnika
P0180=Czujnik temperatury paliwa Obwód A
P0138=O2 Obwód czujnika Bank wysokiego napięcia 1 Czujnik 2
P0136=O2 Bank obwodu czujnika 1 Czujnik 2
P0134=Obwód czujnika O2 Brak wykrytej aktywności Bank 1 Czujnik 1
P0132=O2 Obwód czujnika Bank wysokiego napięcia 1 Czujnik 1
P0130=O2 Bank obwodu czujnika 1 Czujnik 1
P012E=Turbosprężarka/ Doładowanie Obwód czujnika ciśnienia wlotowego przerywany / nieregularny
P018E=Czujnik ciśnienia paliwa B Obwód przerywany / nieregularny
P018D=Czujnik ciśnienia paliwa B Obwód wysoki
P018C=Czujnik Ciśnienia Paliwa B, Obwód niski
P0200=Obwód wtryskiwacza / otwarty
P0962=Elektrozawór regulacji ciśnienia A Obwód sterowania niski
P0959=Automatyczna zmiana biegów Tryb ręczny Obwód przerwany
P0784=Awaria zmiany biegów 4-5
P0782=Awaria zmiany biegów 2-3
P0780=Usterka systemu zmiany biegów
P0781=Awaria zmiany biegów 1-2
P0783=Awaria zmiany biegów 3-4
P0785=Awaria elektromagnesu zmiany biegów / rozrządu
P0786=Elektromagnes (cewka przesuwu) ustawiania rozrządu sygnał poza zakresem/wydajność
U0090=Zarezerwowane przez dokument
U0097=Zarezerwowane przez dokument
U0405=Otrzymano nieprawidłowe dane z modułu tempomatu
U0401=Otrzymano nieprawidłowe dane z ECM/PCM
U0400=Otrzymano nieprawidłowe dane
U0417=Otrzymano nieprawidłowe dane z modułu sterującego hamulcem postojowym
U0410=Otrzymano nieprawidłowe dane z modułu sterowania pompą paliwa
U0430=Otrzymano nieprawidłowe dane z modułu monitorowania ciśnienia w oponach
U0407=Otrzymano nieprawidłowe dane z modułu sterowania świecami żarowymi
U0428=Otrzymano nieprawidłowe dane z modułu czujnika kąta skrętu
U0412=Otrzymano nieprawidłowe dane z modułu kontroli energii akumulatora A
U0402=Otrzymano nieprawidłowe dane z modułu kontroli skrzyni biegów
U0403=Otrzymano nieprawidłowe dane z modułu sterowania skrzynią rozdzielczą
U0404=Otrzymano nieprawidłowe dane z modułu sterującego zmianą biegów
U0408=Otrzymano nieprawidłowe dane z modułu sterowania siłownikiem przepustnicy
U0409=Otrzymano nieprawidłowe dane z modułu sterującego paliwem alternatywnym
U0413=Otrzymano nieprawidłowe dane z modułu kontroli energii akumulatora B
U0415=Otrzymano nieprawidłowe dane z modułu sterującego układem ABS
U0423=Otrzymano nieprawidłowe dane z modułu sterującego deski rozdzielczej
U0431=Otrzymano nieprawidłowe dane z modułu kontroli nadwozia A
U0421=Otrzymano nieprawidłowe dane z modułu kontroli poziomu jazdy
U0137=Zarezerwowane przez dokument
U0418=Otrzymano nieprawidłowe dane z modułu sterowania układem hamulcowym
U0419=Otrzymano nieprawidłowe dane z modułu kontroli siły kierowania
U0420=Otrzymano nieprawidłowe dane z modułu sterowania układem wspomagania kierownicy
U0135=Zarezerwowane przez dokument
U0126=Utracono komunikację z modułem czujnika kąta skrętu
U0422=Otrzymano nieprawidłowe dane z modułu kontroli nadwozia
U0425=Otrzymano nieprawidłowe dane z modułu sterowania ogrzewaniem dodatkowym
U0426=Otrzymano nieprawidłowe dane z modułu sterującego immobilizera pojazdu
U0427=Otrzymano nieprawidłowe dane z modułu kontroli bezpieczeństwa pojazdu
U0083=Zarezerwowane przez dokument
U0094=Zarezerwowane przez dokument
U0130=Utracono komunikację z modułem kontroli siły kierowania
U0140=Utracono komunikację z modułem kontroli nadwozia
U0145=Utracono komunikację z modułem kontroli nadwozia E
U0424=Otrzymano nieprawidłowe dane z modułu sterowania ogrzewaniem, wentylacją i klimatyzacją
U0074=Zarezerwowane przez dokument
U0085=Zarezerwowane przez dokument
U0089=Zarezerwowane przez dokument
U0093=Zarezerwowane przez dokument
U0076=Zarezerwowane przez dokument
U0081=Zarezerwowane przez dokument
U0087=Zarezerwowane przez dokument
U0091=Zarezerwowane przez dokument
U0092=Zarezerwowane przez dokument
U0098=Zarezerwowane przez dokument
U0077=Zarezerwowane przez dokument
U0078=Zarezerwowane przez dokument
U0080=Zarezerwowane przez dokument
U0082=Zarezerwowane przez dokument
U0079=Zarezerwowane przez dokument
U0084=Zarezerwowane przez dokument
U0086=Zarezerwowane przez dokument
U0088=Zarezerwowane przez dokument
U0095=Zarezerwowane przez dokument
U0096=Zarezerwowane przez dokument
U0099=Zarezerwowane przez dokument
U0100=Utracono komunikację z ECM/PCM A
U0102=Utracono komunikację z modułem sterowania skrzynią rozdzielczą
U0104=Utracono komunikację z modułem tempomatu
U0105=Utracono komunikację z modułem sterowania wtryskiwaczami paliwa
U0106=Utracono komunikację z modułem sterującym świecami żarowymi
U0107=Utracono komunikację z modułem sterowania siłownikiem przepustnicy
U0114=Utracono komunikację z modułem sterowania sprzęgłem napędu na cztery koła
U0115=Utracono komunikację z ECM/PCM A
U0120=Zarezerwowane przez dokument
U0109=Utracono komunikację z modułem kontroli pompy paliwa
U0111=Utracono komunikację z modułem kontroli energii akumulatora A
U0113=Utracono komunikację z krytyczną informacją o kontroli emisji
U0112=Utracono komunikację z modułem kontroli energii akumulatora B
U0118=Zarezerwowane przez dokument
U0117=Zarezerwowane przez dokument
U0119=Zarezerwowane przez dokument
U0121=Utracono komunikację z modułem sterującym systemu ABS
U0122=Utracono komunikację z modułem kontroli dynamiki pojazdu
U0124=Utracono komunikację z modułem czujnika przyspieszenia bocznego
U0125=Utracono komunikację z modułem wieloosiowego czujnika przyspieszenia
U0136=Zarezerwowane przez dokument
U0138=Zarezerwowane przez dokument
U0133=Zarezerwowane przez dokument
U0134=Zarezerwowane przez dokument
U0128=Utracono komunikację z modułem kontroli hamulca postojowego
U0131=Utracono komunikację z modułem sterowania układem wspomagania kierownicy
U0305=Niezgodność oprogramowania z modułem tempomatu
U0129=Utracono komunikację z modułem sterowania układu hamulcowego
U0306=Niezgodność oprogramowania z modułem sterowania wtryskiwaczami paliwa
U0132=Utracono komunikację z modułem kontroli poziomu jazdy
U0141=Utracono komunikację z modułem kontroli nadwozia A
U0149=Utracono komunikację z bramką D
U0150=Utracono komunikację z bramką E
U0142=Utracono komunikację z modułem kontroli nadwozia B
U0143=Utracono komunikację z modułem kontroli nadwozia C
U0144=Utracono komunikację z modułem kontroli nadwozia D
U0147=Utracono komunikację z bramką B
U0148=Utracono komunikację z bramką C
U0146=Utracono komunikację z bramką A
U0155=Utracono komunikację z modułem sterującym tablicy rozdzielczej
U0156=Utracono komunikację z centrum informacyjnym A
U0157=Utracono komunikację z centrum informacyjnym B
U0158=Utracono komunikację z projektorem informacji na szybie przedniej
U0160=Utracono komunikację z modułem sterowania alarmem dźwiękowym
U0162=Utracono komunikację z modułem wyświetlacza nawigacji
U0161=Utracono komunikację z modułem kompasu
U0152=Utracono komunikację z modułem kontroli bocznych urządzeń przytrzymujących
U0153=Utracono komunikację z modułem kontroli bocznych urządzeń przytrzymujących
U0165=Utracono komunikację z modułem sterowania ogrzewaniem, wentylacją i klimatyzacją
U0154=Utrata łączności z modułem wykrywania zajętości fotela pasażera
U0175=Utracono komunikację z czujnikiem systemu przytrzymującego F
U0166=Utracono komunikację z modułem sterowania ogrzewaniem dodatkowym
U0167=Utracono komunikację z modułem sterującym immobilizera pojazdu
U0164=Utracono komunikację z modułem sterowania ogrzewaniem, wentylacją i klimatyzacją
U0168=Utracono komunikację z modułem kontroli bezpieczeństwa pojazdu
U0169=Utracono komunikację z modułem sterującym szyberdachu
U0170=Utracono komunikację z czujnikiem systemu przytrzymującego A
U0171=Utracono komunikację z czujnikiem systemu przytrzymującego B
U0172=Utracono komunikację z czujnikiem systemu przytrzymującego C
U0173=Utracono komunikację z czujnikiem systemu przytrzymującego D
U0174=Utracono komunikację z czujnikiem systemu przytrzymującego E
U0176=Utracono komunikację z czujnikiem systemu przytrzymującego G
U0177=Utracono komunikację z czujnikiem systemu przytrzymującego H
U0178=Utracono komunikację z czujnikiem systemu przytrzymującego I
U0210=Utracono komunikację z modułem sterującym siedzenia C
U0179=Utracono komunikację z czujnikiem systemu przytrzymującego J
U0181=Utracono komunikację z modułem kontroli poziomowania reflektorów
U0186=Utracono komunikację ze wzmacniaczem audio
U0189=Utracono komunikację z modułem odtwarzacza/zmiennika płyt C
U0192=Utracono komunikację z komputerem osobistym
U0180=Utracono komunikację z modułem automatycznego sterowania oświetleniem
U0182=Utracono komunikację z modułem sterowania oświetleniem
U0183=Utracono komunikację z modułem sterowania oświetleniem
U0185=Utracono komunikację z modułem sterowania anteną
U0184=Utracono komunikację z radiem
U0187=Utracono komunikację z modułem odtwarzacza/zmiennika płyt A
U0190=Utracono komunikację z modułem odtwarzacza/zmiennika płyt D
U0191=Utracono komunikację z telewizją
U0188=Utracono komunikację z modułem odtwarzacza/zmiennika płyt B
U0193=Utracono komunikację z cyfrowym modułem sterowania dźwiękiem A
U0194=Utracono komunikację z cyfrowym modułem sterowania dźwiękiem B
U0206=Utracono komunikację z modułem sterowania składanym dachem
U0196=Utracono komunikację z modułem sterowania rozrywką dla tylnych siedzeń
U0197=Utracono komunikację z modułem sterowania telefonem
U0198=Utracono komunikację z modułem sterowania telematycznego
U0207=Utracono komunikację z modułem sterowania dachem ruchomym
U0208=Utracono komunikację z modułem sterującym siedzenia A
U0200=Utracono komunikację z modułem sterowania drzwiami B
U0205=Utracono komunikację z modułem sterowania drzwiami G
U0201=Utracono komunikację z modułem sterowania drzwiami C
U0203=Utracono komunikację z modułem sterowania drzwiami E
U0223=Utracono komunikację z silnikiem szyby drzwiowej B
U0202=Utracono komunikację z modułem sterowania drzwiami D
U0204=Utracono komunikację z modułem sterowania drzwiami F
U0304=Niezgodność oprogramowania z modułem sterującym zmianą biegów
U0226=Utracono komunikację z silnikiem szyby drzwiowej E
U0227=Utracono komunikację z silnikiem szyby drzwiowej F
U0230=Utracono komunikację z modułem tylnej bramy
U0303=Niezgodność oprogramowania z modułem sterowania skrzynią rozdzielczą
U0209=Utracono komunikację z modułem sterującym siedzenia B
U0211=Utracono komunikację z modułem sterującym siedzenia D
U0221=Utracono komunikację z przełącznikiem drzwi G
U0224=Utracono komunikację z silnikiem szyby drzwiowej C
U0225=Utracono komunikację z silnikiem szyby drzwiowej D
U0217=Utracono komunikację z przełącznikiem drzwi C
U0219=Utracono komunikację z przełącznikiem drzwi E
U0220=Utracono komunikację z przełącznikiem drzwi F
U0212=Utracono komunikację z modułem sterowania kolumny kierowniczej
U0213=Utracono komunikację z modułem kontroli lusterek
U0215=Utracono komunikację z przełącznikiem drzwi A
U0216=Utracono komunikację z przełącznikiem drzwi B
U0218=Utracono komunikację z przełącznikiem drzwi D
U0222=Utracono komunikację z silnikiem szyby drzwiowej A
U0228=Utracono komunikację z silnikiem szyby drzwiowej G
U0229=Utracono komunikację z modułem podgrzewania kierownicy
U0231=Utracono komunikację z modułem wykrywania deszczu
U0232=Utracono komunikację z modułem sterującym wykrywania przeszkód bocznych
U0233=Utracono komunikację z modułem sterującym wykrywania przeszkód bocznych
U0235=Utracono komunikację z przednim czujnikiem odległości tempomatu
U0300=Niezgodność oprogramowania wewnętrznego modułu sterującego
U0302=Niezgodność oprogramowania z modułem sterowania skrzynią biegów
U0301=Niezgodność oprogramowania z ECM/PCM
U0310=Niezgodność oprogramowania z modułem sterownia pompą paliwa
U0307=Niezgodność oprogramowania z modułem sterującym świecami żarowymi
U0308=Niezgodność oprogramowania z modułem sterowania siłownikiem przepustnicy
U0309=Niezgodność oprogramowania z modułem sterującym paliwem alternatywnym
U0317=Niezgodność oprogramowania z modułem sterującym hamulca postojowego
U0311=Niezgodność oprogramowania z modułem sterowania silnikiem napędowym
U0312=Niezgodność oprogramowania z modułem kontroli energii akumulatora A
U0313=Niezgodność oprogramowania z modułem kontroli energii akumulatora B
U0314=Niezgodność oprogramowania z modułem sterowania sprzęgłem napędu na cztery koła
U0315=Niezgodność oprogramowania z modułem sterującym układu ABS
U0316=Niezgodność oprogramowania z modułem sterowania dynamiką pojazdu
U0318=Niezgodność oprogramowania z modułem sterowania układu hamulcowego
U0321=Niezgodność oprogramowania z modułem kontroli poziomu jazdy
U0319=Niezgodność oprogramowania z modułem kontroli siły kierowania
U0320=Niezgodność oprogramowania z modułem sterowania wspomaganiem kierownicy
U0322=Niezgodność oprogramowania z modułem kontroli nadwozia
U0323=Niezgodność oprogramowania z modułem sterującym deski rozdzielczej
U0324=Niezgodność oprogramowania z modułem sterowania ogrzewaniem, wentylacją i klimatyzacją
U0326=Niezgodność oprogramowania z modułem sterowania immobilizera pojazdu
U0327=Niezgodność oprogramowania z modułem kontroli bezpieczeństwa pojazdu
U0328=Niezgodność oprogramowania z modułem czujnika kąta skrętu
U0329=Niezgodność oprogramowania z modułem sterowania kolumną kierownicy
U0330=Niezgodność oprogramowania z modułem monitorowania ciśnienia w oponach
U0127=Utracono komunikację z modułem monitorowania ciśnienia w oponach
U0234=Utracono komunikację z modułem Convenience Recall
U0331=Niezgodność oprogramowania z modułem kontroli nadwozia A
U0429=Otrzymano nieprawidłowe dane z modułu sterowania kolumny kierowniczej
U0416=Otrzymano nieprawidłowe dane z modułu sterowania dynamiką pojazdu
U0414=Otrzymano nieprawidłowe dane z modułu sterowania sprzęgłem napędu na cztery koła
U0411=Otrzymano nieprawidłowe dane z modułu sterowania silnikiem napędowym
U0406=Otrzymano nieprawidłowe dane z modułu sterowania wtryskiwaczami paliwa
U0325=Niezgodność oprogramowania z modułem sterowania ogrzewaniem dodatkowym
U0214=Utracono komunikację ze zdalnym uruchamianiem funkcji
U0199=Utracono komunikację z modułem sterowania drzwiami A
U0195=Utracono komunikację z modułem odbiornika rozrywki na abonament
U0163=Utracono komunikację z modułem sterowania nawigacją
U0159=Utracono komunikację z modułem kontroli wspomagania parkowania
U0151=Utracono komunikację z modułem kontroli urządzeń przytrzymujących
U0139=Zarezerwowane przez dokument
U0116=Zarezerwowane przez dokument
U0110=Utracono komunikację z modułem sterowania silnikiem napędowym
U0108=Utracono komunikację z modułem sterowania paliwen alternatywnym
U0103=Utracono komunikację z modułem zmiany biegów
U0101=Utracono komunikację z TCM
U0075=Zarezerwowane przez dokument
P0195=Czujnik temperatury oleju silnikowego
P0169=Nieprawidłowy skład paliwa
P0287=Cylinder 9 Wkład/bilans
P0278=Cylinder 6 Wkład/bilans
P0281=Cylinder 7 Wkład/bilans
P0440=Układ emisji par paliwa
P0284=Cylinder 8 Wkład/bilans
P0297=Stan nadmiernej prędkości pojazdu
P0494=Niska prędkość wentylatora
P0495=Wysoka prędkość wentylatora
P0770=Cewka zmiany biegów E
P0613=Procesor TCM
P0563=Wysokie napięcie systemowe
P0560=Napięcie systemu
P0513=Nieprawidłowy klucz do immobilizera
P0600=Szeregowe łącze komunikacyjne
P0730=Nieprawidłowe przełożenie skrzyni biegów
P0750=Cewka zmiany biegów A
P0562=Niskie napięcie systemu
P075A=Cewka zmiany biegów G
P0561=Niestabilne napięcie systemowe
P0607=Wydajność modułu sterującego
P065A=Wydajność systemu generatora
P0760=Cewka zmiany biegów C
P0755=Cewka zmiany biegów B
P0765=Cewka zmiany biegów D
P076A=Cewka zmiany biegów H
P0493=Nadmierna prędkość wentylatora
P0606=Procesor ECM/PCM
P0829=Zmiana 5-6
P0215=Cewka wyłączająca silnik
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,24 @@
P0001=Обрыв цепи управления регулятора объема топлива
P0002=Несоответствие диапазона рабочих характеристик цепи управления регулятора объема топлива
P0003=Низкий уровень сигнала в цепи управления регулятора объема топлива
P0004=Высокий уровень сигнала в цепи управления регулятора объема топлива
P0005=Топливный Запорный Клапан A Схема Управления/Открыть
P0006=Низкий уровень сигнала в цепи управления клапана отсечки топлива «A»
P0007=Высокий уровень сигнала в цепи управления клапана отсечки топлива «A»
P0008=Производительность системы позиционирования двигателя 1
P000C=A Положение Распределительного Вала С Медленной Реакцией 2
P000D=B Положение Распределительного Вала С Медленной Реакцией, Ряд 2
P0011=Положение распределительного вала - Превышение времени или Производительность системы 1
P0012=Положение Распределительного Вала - Опрокинутый Газораспределительный Механизм 1
P000A=A Положение Распределительного Вала С Медленной Реакцией, Ряд 1
P0009=Производительность системы позиционирования двигателя Банк 2
P000B=B Положение Распределительного Вала С Медленной Реакцией, Ряд 1
P0010=Схема Привода Положения Распределительного Вала / Открытый Блок 1
P0013=B Положение Распределительного Вала - Схема Привода / Разомкнутый Блок 1
P000E=ISO/SAE зарезервировано
P000F=ISO/SAE зарезервировано
P0014=B Положение распределительного вала - Превышение времени или Производительность системы 1
P0015=B Положение распределительного вала - превышение времени срабатывания банка 1
P0016=Корреляция положения коленчатого вала - положения распределительного вала Датчик Банка 1 A
@@ -0,0 +1,993 @@
P0001=Krmilno vezje količine goriva odprt
P0002=Krmilno vezje količine goriva razpon/zmogljivost
P0003=Krmilno vezje količine goriva nizko
P0004=Krmilno vezje količine goriva visoko
P0005=Zaporni ventil za gorivo. Krmilno vezje odprto
P0006=Zaporni ventil za gorivo. A krmilno vezje nizko
P0007=Zaporni ventil za gorivo. Krmilno vezje visoko
P0008=Sistemska zmogljivost položaja motorja (Blok 1)
P0009=Sistemska zmogljivost položaja motorja (Blok 2)
P0010=Aktuator odmične gredi A -Blok 1 okvara vezja
P0011=Aktuator odmične gredi A -Blok 1 čas prehiteva
P0012=Aktuator odmične gredi A -Blok 1 čas zamuja
P0013=Aktuator odmične gredi B -Blok 1 okvara vezja
P0014=Aktuator odmične gredi B -Blok 1 čas prehiteva
P0015=Aktuator odmične gredi B -Blok 1 čas zamuja
P0016=Cam/kolenčasta gred pozicija Korelacijsko tipalo A - Blok 1
P0017=Cam/kolenčasta gred pozicija Korelacijsko tipalo B - Blok 1
P0018=Cam/kolenčasta gred pozicija Korelacijsko tipalo A - Blok 2
P0019=Cam/kolenčasta gred pozicija Korelacijsko tipalo B - Blok 2
P0020=Aktuator odmične gredi A -Blok 2 okvara vezja
P0021=Aktuator odmične gredi A -Blok 2 čas prehiteva
P0022=Aktuator odmične gredi A -Blok 2 čas zamuja
P0023=Aktuator odmične gredi B -Blok 2 okvara vezja
P0024=Aktuator položaja odmične gredi B Blok 2 čas prehiteva
P0025=Aktuator odmične gredi B -Blok 2 čas zamuja
P0026=Dovod ventilski blok 1 nadzorni solenoid vezje razpon/učinkovitost
P0027=Izpušni ventilski blok 1 nadzorni solenoid vezje razpon/učinkovitost
P0028=Dovod ventilski blok 2 nadzorni solenoid vezje razpon/učinkovitost
P0029=Izpušni ventilski blok 2 nadzorni solenoid vezje razpon/učinkovitost
P0030=HO2S Blok 1 Tipalo 1 Vezje grelnika
P0031=HO2S Blok 1 Tipalo 1 Vezje grelnika nizko
P0032=HO2S Blok 1 Tipalo 1 Vezje grelnika visoko
P0033=Krmilno vezje izpušne lopute Turbo/Sup
P0034=Krmilno vezje vrat za odpadke Turbo/Sup nizko
P0035=Krmilno vezje vrat za odpadke Turbo/Sup visoko
P0036=HO2S Blok 1 Tipalo 2 Vezje grelnika
P0037=HO2S Blok 1 Tipalo 2 Vezje grelnika nizko
P0038=HO2S Blok 1 Tipalo 2 Vezje grelnika visoko
P0039=Turbo/Super polnilnik bypass nadzor učinkovitost vezje
P0040=02 Blok 1 Tipalo 1 Signali odeti v w/ 02 blok 2 Tipalo 1
P0041=02 Blok 1 Tipalo 2 Signali odeti v w/ 02 blok 2 Tipalo 2
P0042=HO2S Blok 1 Tipalo 3 Vezje grelnika
P0043=HO2S Blok 1 Tipalo 3 Vezje grelnika nizko
P0044=HO2S Blok 1 Tipalo 3 Vezje grelnika visoko
P0045=Turbo/Super povečanje moči polnilnika kontrolnik Solenoid A vezje odprt
P0046=Turbo/Super povečanje moči polnilnika kontrolnik Solenoid A vezje razpon/zmogljivost
P0047=Turbo/Super povečanje moči polnilnika kontrolnik Solenoid A vezje nizko
P0048=Turbo/Super povečanje moči polnilnika kontrolnik Solenoid A vezje visoko
P0049=Turbo/Super povečanje moči polnilnika vhodna/turbinska hitrost prehitro
P0050=HO2S Blok 2 Tipalo 1 Vezje grelnika
P0051=HO2S Blok 2 Tipalo 1 Vezje grelnika nizko
P0052=HO2S Blok 2 Tipalo 1 Vezje grelnika visoko
P0053=HO2S Blok 1 tipalo 1 upornost grelnika
P0054=HO2S Blok 1 tipalo 2 upornost grelnika
P0055=HO2S Blok 1 tipalo 3 upornost grelnika
P0056=HO2S Blok 2 Tipalo 2 Vezje grelnika
P0057=H02S Blok 2 Tipalo 2 Vezje grelnika nizko
P0058=HO2S Blok 2 Tipalo 2 Vezje grelnika visoko
P0059=HO2S Blok 2 tipalo 1 upornost grelnika
P0060=HO2S Blok 2 tipalo 2 upornost grelnika
P0061=HO2S Blok 2 tipalo 3 upornost grelnika
P0062=HO2S Blok 2 Tipalo 3 Vezje grelnika
P0063=H02S Blok 2 Tipalo 3 Vezje grelnika nizko
P0064=H02S Blok 2 Tipalo 3 Vezje grelnika visoko
P0065=Vbrizgalnik z zračno asistenco. Območje nadzora/učinkovitost
P0066=Vbrizgalnik z zračno asistenco. Krmilno vezje nizko
P0067=Vbrizgalnik z zračno asistenco. Krmilno vezje visoko
P0068=MAF/MAP koprelacija tipala dušilne pozicije
P0069=MAP/BARO korelacija
P0070=Temperatura zraka v okolici Tipalo vezja
P0071=Temperatura zraka v okolici Območje tipala/učinkovitost
P0072=Temperatura zraka v okolici Tipalo vezja nizko
P0073=Temperatura zraka v okolici Tipalo vezje visoko
P0074=Temperatura zraka v okolici Tipalo vezje prekinjeno
P0075=Dovod ventilski blok 1 krmilno vezje
P0076=Dovod ventilski blok 1 krmilno vezje nizko
P0077=Dovod ventilski blok 1 krmilno vezje visoko
P0078=Izpust ventilski blok 1 krmilno vezje
P0079=Izpust ventilski blok 1 krmilno vezje nizko
P0080=Izpust ventilski blok 1 krmilno vezje visoko
P0081=Dovod ventilski blok 2 krmilno vezje
P0082=Dovod ventilski blok 2 krmilno vezje nizko
P0083=Dovod ventilski blok 2 krmilno vezje visoko
P0084=Izpust ventilski blok 2 krmilno vezje
P0085=Izpust ventilski blok 2 krmilno vezje nizko
P0086=Izpust ventilski blok 2 krmilno vezje visoko
P0087=Tlak vodila goriva prenizek
P0088=Tlak vodila goriva previsok
P0089=Regulator tlaka goriva 1 učinkovitost
P0090=Regulator tlaka goriva 1 kontrola vezja
P0091=Regulator tlaka goriva 1 kontrola vezja nizko
P0092=Regulator tlaka goriva 1 kontrola vezja visoko
P0093=Puščanje sistema za gorivo (veliko)
P0094=Puščanje sistema za gorivo (malo)
P0095=IAT tipalo 2 vezje
P0096=IAT tipalo 2 vezje razpon/učinkovitost
P0097=IAT tipalo 2 vezje nizko
P0098=IAT tipalo 2 vezje visoko
P0099=IAT tipalo 2 vezje prekinjeno
P0100=MAF ali VAF A vezje okvara
P0101=MAF ali VAF A vezje razpon/učinkovitost
P0102=MAF ali VAF A vezje nizek vnos
P0103=MAF ali VAF A vezje visok vnos
P0104=MAF ali VAF A vezje prekinjeno
P0105=MAP/BARO okvara vezja
P0106=MAP/BARO vezje razpon/učinkovitost
P0107=MAP/BARO vezje nizek vnos
P0108=MAP/BARO vezje visok vnos
P0109=MAP/BARO vezje prekinjeno
P0110=Tipalo IAT okvara vezja
P0111=IAT tipalo 1 vezje razpon/učinkovitost
P0112=IAT tipalo 1 vezje nizek vnos
P0113=IAT tipalo 1 vezje visok vnos
P0114=IAT tipalo 1 vezje prekinjeno
P0115=Vezje temperature hladilne tekočine motorja okvara
P0116=Temp hladilne tekočine v motorju vezje razpon/učinkovitost
P0117=Temp hladilne tekočine v motorju vezje nizek vnos
P0118=Temp hladilne tekočine v motorju vezje visok vnos
P0119=Temp hladilne tekočine v motorju vezje prekinjeno
P0120=Tipalo TPS/položaj stopalke A vezje okvara
P0121=Tipalo položaja stopalke/TPS A vezje razpon/učinkovitost
P0122=Tipalo TPS/položaj stopalke A vezje nizek vnos
P0123=Tipalo TPS/položaj stopalke A vezje visok vnos
P0124=Tipalo položaja stopalke/TPS A vezje prekinjeno
P0125=Nezadostna temperatura hladilne tekočine za uravnavanje goriva v zaprtem krogu
P0126=Nezadostna temperatura hladilne tekočine stabilno delovanje
P0127=IAT tipalo previsoko
P0128=Temperatura hladilne tekočine pod regulirano temperaturo termostata
P0129=Barometrski tlak prenizek
P0130=02 vezje tipala okvara (Blok 1 Tipalo 1)
P0131=02 vezje tipala nizka napetost (Blok 1 Tipalo 1)
P0132=02 vezje tipala visoka napetost (Blok 1 Tipalo 1)
P0133=02 tipalo vezje počasen odziv (Blok 1 Tipalo 1)
P0134=02 tipalo vezje Ni aktivnosti (Blok 1 Tipalo 1)
P0135=02 vezje tipala grelnika okvara (Blok 1 Tipalo 1)
P0136=02 vezje tipala okvara (Blok 1 Tipalo 2)
P0137=02 vezje tipala nizka napetost (Blok 1 Tipalo 2)
P0138=02 vezje tipala visoka napetost (Blok 1 Tipalo 2)
P0139=02 tipalo vezje počasen odziv (Blok 1 Tipalo 2)
P0140=02 tipalo vezje Ni aktivnosti (Blok 1 Tipalo 2)
P0141=02 vezje tipala grelnika okvara (Blok 1 Tipalo 2)
P0142=02 vezje tipala okvara (Blok 1 Tipalo 3)
P0143=02 vezje tipala nizka napetost (Blok 1 Tipalo 3)
P0144=02 vezje tipala visoka napetost (Blok 1 Tipalo 3)
P0145=02 tipalo vezje počasen odziv (Blok 1 Tipalo 3)
P0146=02 tipalo vezje Ni aktivnosti (Blok 1 Tipalo 3)
P0147=02 vezje tipala grelnika okvara (Blok 1 Tipalo 3)
P0148=Okvara dobave goriva
P0149=Okvara časa goriva
P0150=02 vezje tipala okvara (Blok 2 Tipalo 1)
P0151=02 vezje tipala nizka napetost (Blok 2 Tipalo 1)
P0152=02 vezje tipala visoka napetost (Blok 2 Tipalo 1)
P0153=02 tipalo vezje počasen odziv (Blok 2 Tipalo 1)
P0154=02 tipalo vezje Ni aktivnosti (Blok 2 Tipalo 1)
P0155=02 vezje tipala grelnika okvara (Blok 2 Tipalo 1)
P0156=02 vezje tipala okvara (Blok 2 Tipalo 2)
P0157=02 vezje tipala nizka napetost (Blok 2 Tipalo 2)
P0158=02 vezje tipala visoka napetost (Blok 2 Tipalo 2)
P0159=02 tipalo vezje počasen odziv (Blok 2 Tipalo 2)
P0160=02 tipalo vezje Ni aktivnosti (Blok 2 Tipalo 2)
P0161=02 vezje tipala grelnika okvara (Blok 2 Tipalo 2)
P0162=02 vezje tipala okvara (Blok 2 Tipalo 3)
P0163=02 vezje tipala nizka napetost (Blok 2 Tipalo 3)
P0164=02 vezje tipala visoka napetost (Blok 2 Tipalo 3)
P0165=02 tipalo vezje počasen odziv (Blok 2 Tipalo 3)
P0166=02 tipalo vezje Ni aktivnosti (Blok 2 Tipalo 3)
P0167=02 vezje tipala grelnika okvara (Blok 2 Tipalo 3)
P0168=Previsoka temperatura goriva v motorju
P0169=Kompozicija goriva nepravilna
P0170=Okvara regulacije goriva (Blok 1)
P0171=Sistem preveč vitek (Blok 1)
P0172=Sistem preveč bogat (Blok 1)
P0173=Okvara regulacije goriva (Blok 2)
P0174=Sistem preveč vitek (Blok 2)
P0175=Sistem preveč bogat (Blok 2)
P0176=Vezje tipala kompenzacije goriva okvara
P0177=Tipalo kompenzacije goriva vezje razpon/učinkovitost
P0178=Vezje tipala kompenzacije goriva nizek vnos
P0179=Vezje tipala kompenzacije goriva visok vnos
P0180=Tipalo temperature goriva A vezje okvara
P0181=Tipalo temperature goriva A vezje razpon/učinkovitost
P0182=Tipalo temperature goriva A vezje nizek vnos
P0183=Tipalo temperature goriva A vezje visok vnos
P0184=Tipalo temperature goriva A vezje prekinjeno
P0185=Tipalo temperature goriva B vezje okvara
P0186=Tipalo temperature goriva B vezje razpon/učinkovitost
P0187=Tipalo temperature goriva B vezje nizek vnos
P0188=Tipalo temperature goriva B vezje visok vnos
P0189=Tipalo temperature goriva B vezje prekinjeno
P0190=Vezje tipala tlaka izpuha okvara
P0191=Tipalo tlaka vodila za gorivo vezje razpon/učinkovitost
P0192=Vezje tipala tlaka gorivnega voda nizek vnos
P0193=Vezje tipala tlaka izpuha visok vnos
P0194=Tipalo tlaka vodila za gorivo vezje prekinjeno
P0195=Vezje tipala temperature olja v motorju okvara
P0196=Tipalo temperature olja v motorju vezje razpon/učinkovitost
P0197=Vezje tipala temperature olja v motorju nizek vnos
P0198=Vezje tipala temperature olja v motorju visok vnos
P0199=Tipalo temperature olja v motorju vezje prekinjeno
P0200=Vezje vbrizgalnika odprto
P0201=Vezje vbrizgalnika odprt valj 1
P0202=Vezje vbrizgalnika odprt valj 2
P0203=Vezje vbrizgalnika odprt valj 3
P0204=Vezje vbrizgalnika odprt valj 4
P0205=Vezje vbrizgalnika odprt valj 5
P0206=Vezje vbrizgalnika odprt valj 6
P0207=Vezje vbrizgalnika odprt valj 7
P0208=Vezje vbrizgalnika odprt valj 8
P0209=Vezje vbrizgalnika odprt valj 9
P0210=Vezje vbrizgalnika odprt valj 10
P0211=Vezje vbrizgalnika odprt valj 11
P0212=Vezje vbrizgalnika odprt valj 12
P0213=Vbrizgalnik za hladen zagon 1 okvara
P0214=Vbrizgalnik za hladen zagon 2 okvara
P0215=Izklop motorja solenoid okvara
P0216=Vezje časa vbrizga okvara
P0217=Stanje prekomerne temperature motorja
P0218=Stanje prekomerne temperature menjalnika
P0219=Stanje prekomerne hitrosti motorja
P0220=Tipalo/stikalo položaja TPS/stopalke B vezje okvara
P0221=Tipalo/stikalo položaja TPS/stopalke B vezje razpon/učinkovitost
P0222=Tipalo/stikalo položaja TPS/stopalke B vezje nizek vnos
P0223=Tipalo/stikalo položaja TPS/stopalke B vezje visok vnos
P0224=Tipalo/stikalo položaja TPS/stopalke B vezje prekinjeno
P0225=Tipalo/stikalo položaja TPS/stopalke C vezje okvara
P0226=Tipalo/stikalo položaja TPS/stopalke C vezje razpon/učinkovitost
P0227=Tipalo/stikalo položaja TPS/stopalke C vezje nizek vnos
P0228=Tipalo/stikalo položaja TPS/stopalke C vezje visok vnos
P0229=Tipalo/stikalo položaja TPS/stopalke C vezje prekinjeno
P0230=Vezje primarne črpalke za gorivo okvara
P0231=Črpalka za gorivo sekundarni vezje nizko
P0232=Črpalka za gorivo sekundarni vezje visoko
P0233=Črpalka za gorivo sekundarni vezje prekinjeno
P0234=Stanje prekomernega polnjenja motorja
P0235=Tipalo povečanja Turbo/Super A vezje okvara
P0236=Tipalo povečanja Turbo/Super A vezje razpon/učinkovitost
P0237=Tipalo povečanja Turbo/Super A vezje nizek vnos
P0238=Tipalo povečanja Turbo/Super A vezje visok vnos
P0239=Tipalo povečanja Turbo/Super B vezje okvara
P0240=Tipalo povečanja Turbo/Super B vezje razpon/učinkovitost
P0241=Tipalo povečanja Turbo/Super B vezje nizek vnos
P0242=Tipalo povečanja Turbo/Super B vezje visok vnos
P0243=Izpušna loputa Turbo/Sup solenoid A okvara
P0244=Nadzorni tokokrog izpušne lopute Turbo/Sup solenoid A razpon/učinkovitost
P0245=Nadzorni tokokrog izpušne lopute solenoid A nizko
P0246=Nadzorni tokokrog izpušne lopute Turbo/Sup solenoid A visoko
P0247=Izpušna loputa Turbo/Sup solenoid B okvara
P0248=Izpušna loputa Turbo/Sup solenoid B razpon/učinkovitost
P0249=Nadzorni tokokrog izpušne lopute solenoid B nizko
P0250=Nadzorni tokokrog izpušne lopute Turbo/Sup solenoid B visoko
P0251=Krmiljenje odmerjanja vbrizgalne črpalke A
P0252=Krmiljenje odmerjanja vbrizgalne črpalke A razpon/učinkovitost
P0253=Krmiljenje odmerjanja vbrizgalne črpalke A nizko
P0254=Krmiljenje odmerjanja vbrizgalne črpalke A visoko
P0255=Krmiljenje odmerjanja vbrizgalne črpalke A prekinjeno (Cam/rotor/vbrizgalnik)
P0256=Krmiljenje odmerjanja vbrizgalne črpalke B okvara (Cam/rotor/vbrizgalnik)
P0257=Krmiljenje odmerjanja vbrizgalne črpalke B razpon/učinkovitost (Cam/rotor/vbrizgalnik)
P0258=Krmiljenje odmerjanja vbrizgalne črpalke B nizko (Cam/rotor/vbrizgalnik)
P0259=Krmiljenje odmerjanja vbrizgalne črpalke B visoko (Cam/rotor/vbrizgalnik)
P0260=Krmiljenje odmerjanja vbrizgalne črpalke B prekinjeno (Cam/rotor/vbrizgalnik)
P0261=Valj 1 krmilno vezje vbrizgalnika nizko
P0262=Valj 1 krmilno vezje vbrizgalnika visoko
P0263=Prispevek valja 1 napaka ravnovesja
P0264=Valj 2 krmilno vezje vbrizgalnika nizko
P0265=Valj 2 krmilno vezje vbrizgalnika visoko
P0266=Prispevek valja 2 napaka ravnovesja
P0267=Valj 3 krmilno vezje vbrizgalnika nizko
P0268=Valj 3 krmilno vezje vbrizgalnika visoko
P0269=Prispevek valja 3 napaka ravnovesja
P0270=Valj 4 krmilno vezje vbrizgalnika nizko
P0271=Valj 4 krmilno vezje vbrizgalnika visoko
P0272=Prispevek valja 4 napaka ravnovesja
P0273=Valj 5 krmilno vezje vbrizgalnika nizko
P0274=Valj 5 krmilno vezje vbrizgalnika visoko
P0275=Prispevek valja 5 napaka ravnovesja
P0276=Valj 6 krmilno vezje vbrizgalnika nizko
P0277=Valj 6 krmilno vezje vbrizgalnika visoko
P0278=Prispevek valja 6 napaka ravnovesja
P0279=Valj 7 krmilno vezje vbrizgalnika nizko
P0280=Valj 7 krmilno vezje vbrizgalnika visoko
P0281=Prispevek valja 7 napaka ravnovesja
P0282=Valj 8 krmilno vezje vbrizgalnika nizko
P0283=Valj 8 krmilno vezje vbrizgalnika visoko
P0284=Prispevek valja 8 napaka ravnovesja
P0285=Valj 9 krmilno vezje vbrizgalnika nizko
P0286=Valj 9 krmilno vezje vbrizgalnika visoko
P0287=Prispevek valja 9 napaka ravnovesja
P0288=Valj 10 krmilno vezje vbrizgalnika nizko
P0289=Valj 10 krmilno vezje vbrizgalnika visoko
P0290=Prispevek valja 10 napaka ravnovesja
P0291=Valj 11 krmilno vezje vbrizgalnika nizko
P0292=Valj 11 krmilno vezje vbrizgalnika visoko
P0293=Prispevek valja 11 napaka ravnovesja
P0294=Valj 12 krmilno vezje vbrizgalnika nizko
P0295=Valj 12 krmilno vezje vbrizgalnika visoko
P0296=Prispevek valja 12 napaka ravnovesja
P0297=Napaka prehitro vozečega vozila
P0298=Previsoka temperatura olja v motorju
P0299=Turbo/Super polnilnik UnderBoost
P0300=Zaznan izpušni udar naključnega/več valjev
P0301=Valj 1 zaznan izpušni udar
P0302=Valj 2 zaznan izpušni udar
P0303=Valj 3 zaznan izpušni udar
P0304=Valj 4 zaznan izpušni udar
P0305=Valj 5 zaznan izpušni udar
P0306=Valj 6 zaznan izpušni udar
P0307=Valj 7 zaznan izpušni udar
P0308=Valj 8 zaznan izpušni udar
P0309=Valj 9 zaznan izpušni udar
P0310=Valj 10 zaznan izpušni udar
P0311=Valj 11 zaznan izpušni udar
P0312=Valj 12 zaznan izpušni udar
P0313=Zaznan izpušni udar nizka raven goriva
P0314=Zaznan izpušni udar valj ni specifičen
P0315=Variacija sistema zaznavanje položaja ročične gredi ni naučeno
P0316=Zaznan izpušni udar 1. 1000 vrt.
P0317=Oprema za razrito cesto ni prisotna
P0318=Tipalo A za razrito cesto vezje signala
P0319=Tipalo B za razrito cesto
P0320=Vhodna hitrost vžiga/porazdelilnika motorja vezje okvara
P0321=Vhodna hitrost vžiga/porazdelilnika motorja vezje razpon/učinkovitost
P0322=Vhodna hitrost vžiga/porazdelilnika motorja vezje ni signala
P0323=Vhodna hitrost vžiga/porazdelilnika motorja vezje prekinjeno
P0324=Sistem nadzora trka okvara
P0325=Tipalo trka 1 vezje okvara Blok 1 ali Tipalo 1
P0326=Tipalo trka 1 vezje razpon/učinkovitost Blok 1 ali 1 tipalo
P0327=Tipalo trka 1 vezje nizek vnos Blok 1 ali Tipalo 1
P0328=Tipalo trka 1 vezje visok vnos Blok 1 ali Tipalo 1
P0329=Tipalo trka 1 vezje prekinjeno Blok 1 ali Tipalo 1
P0330=Tipalo trka 2 vezje okvara (Blok 2)
P0331=Tipalo trka 2 vezje razpon/učinkovitost (Blok 2)
P0332=Tipalo trka 2 vezje nizek vnos (Blok 2)
P0333=Tipalo trka 2 vezje visok vnos (Blok 2)
P0334=Tipalo trka 2 vezje prekinjeno (Blok 2)
P0335=Tipalo položaj ročične gredi A vezje okvara
P0336=Tipalo položaja kolenčaste gredi A vezje razpon/učinkovitost
P0337=Tipalo položaj ročične gredi A vezje nizek vnos
P0338=Tipalo položaja ročične gredi A vezje visok vnos
P0339=Tipalo položaja ročične gredi A vezje prekinjeno
P0340=Položaj odmične gredi tipalo A - Blok 1 vezje okvara
P0341=Položaj odmične gredi tipalo A - Blok 1 vezje razpon/učinkovitost
P0342=Položaj odmične gredi tipalo A - Blok 1 vezje nizek vnos
P0343=Položaj odmične gredi tipalo A - Blok 1 vezje visok vnos
P0344=Položaj odmične gredi tipalo A Blok 1 vezje prekinjeno
P0345=Položaj odmične gredi tipalo A - Blok 2 vezje okvara
P0346=Položaj odmične gredi tipalo A - Blok 2 vezje razpon/učinkovitost
P0347=Položaj odmične gredi tipalo A - Blok 2 vezje nizek vnos
P0348=Položaj odmične gredi tipalo A - Blok 2 vezje visok vnos
P0349=Položaj odmične gredi tipalo A - Blok 2 vezje prekinjeno
P0350=Vžigalna tuljava primarno/sekundarno vezje okvara
P0351=Vžigalna tuljava A primarno/sekundarno vezje okvara
P0352=Vžigalna tuljava B primarno/sekundarno vezje okvara
P0353=Vžigalna tuljava C primarno/sekundarno vezje okvara
P0354=Vžigalna tuljava D primarno/sekundarno vezje okvara
P0355=Vžigalna tuljava E primarno/sekundarno vezje okvara
P0356=Vžigalna tuljava F primarno/sekundarno vezje okvara
P0357=Vžigalna tuljava G primarno/sekundarno vezje okvara
P0358=Vžigalna tuljava H primarno/sekundarno vezje okvara
P0359=Vžigalna tuljava I primarno/sekundarno vezje okvara
P0360=Vžigalna tuljava J primarno/sekundarno vezje okvara
P0361=Vžigalna tuljava K primarno/sekundarno vezje okvara
P0362=Vžigalna tuljava L primarno/sekundarno vezje okvara
P0363=Zaznan izpušni udar nemogočeno dovajanje goriva
P0365=Položaj odmične gredi tipalo B - Blok 1 vezje okvara
P0366=Položaj odmične gredi tipalo B - Blok 1 vezje razpon/učinkovitost
P0367=Položaj odmične gredi tipalo B - Blok 1 vezje nizek vnos
P0368=Položaj odmične gredi tipalo B - Blok 1 vezje visok vnos
P0369=Položaj odmične gredi tipalo B - Blok 1 vezje prekinjeno
P0370=Referenca za časovni zamik visoka ločljivost signal A okvara
P0371=Referenca za časovni zamik visoka ločljivost signal A preveč pulzov
P0372=Referenca za časovni zamik visoka ločljivost signal A premalo pulzov
P0373=Referenca za časovni zamik visoka ločljivost signal A nepredvidljivi pulzi
P0374=Referenca za časovni zamik visoka ločljivost signal A ni pulzov
P0375=Referenca za časovni zamik visoka ločljivost signal B okvara
P0376=Referenca za časovni zamik visoka ločljivost signal B preveč pulzov
P0377=Referenca za časovni zamik visoka ločljivost signal B premalo pulzov
P0378=Referenca za časovni zamik visoka ločljivost signal B nepredvidljivi pulzi
P0379=Referenca za časovni zamik visoka ločljivost signal B ni pulzov
P0380=Vžigalna svečka/grelnik vezje A okvara
P0381=Vžigalna svečka/grelnik indikator vezje okvara
P0382=Vžigalna svečka/grelnik vezje B okvara
P0383=Modul vžigalne svečke krmilno vezje nizko
P0384=Modul vžigalne svečke krmilno vezje visoko
P0385=Tipalo položaj ročične gredi B vezje okvara
P0386=Tipalo položaja kolenčaste gredi B vezje razpon/učinkovitost
P0387=Tipalo položaj ročične gredi B vezje nizek vnos
P0388=Tipalo položaja ročične gredi B vezje visok vnos
P0389=Tipalo položaja kolenčaste gredi B vezje prekinjeno
P0390=Položaj odmične gredi tipalo B - Blok 2 vezje okvara
P0391=Položaj odmične gredi tipalo B - Blok 2 vezje razpon/učinkovitost
P0392=Položaj odmične gredi tipalo B - Blok 2 vezje nizek vnos
P0393=Položaj odmične gredi tipalo B - Blok 2 vezje visok vnos
P0394=Položaj odmične gredi tipalo B - Blok 2 vezje prekinjeno
P0400=EGR okvara pretoka
P0401=EGR pretok nezadosten
P0402=EGR tok prekomeren
P0403=EGR pretok okvara vezja
P0404=EGR tok vezje razpon/učinkovitost
P0405=EGR tipalo pretoka A vezje nizek vnos
P0406=EGR tipalo pretoka A vezje visok vnos
P0407=EGR tipalo pretoka B vezje nizek vnos
P0408=EGR tipalo pretoka B vezje visok vnos
P0409=EGR tipalo pretoka A vezje
P0410=Sistem sekundarnega vnosa zraka okvara
P0411=Sistem sekundarnega vnosa zraka nepravilen tok
P0412=Sistem sekundarnega vnosa zraka A okvara
P0413=Sistem sekundarnega vnosa zraka A vezje odprto
P0414=Sistem sekundarnega vnosa zraka A vezje kratko
P0415=Sistem sekundarnega vnosa zraka B okvara
P0416=Ventil sistema za sekundarno vbrizgavanje zraka B vezje odprto
P0417=Sistem sekundarnega vnosa zraka B vezje kratko
P0418=Sistem sekundarnega vnosa zraka Rele A okvara
P0419=Sistem sekundarnega vnosa zraka Rele B okvara
P0420=Učinkovitost katalizatorja pod pragom (Blok 1)
P0421=Ogrevalni katalizator pod pragom (Blok 1)
P0422=Glavni katalizator pod pragom (Blok 1)
P0423=Ogreti katalizator pod pragom (Blok 1)
P0424=Temp ogretega katalizatorja pod pragom (Blok 1)
P0425=Temp. katalizatorja Tipalo (Blok 1 Tipalo 1)
P0426=Temp. katalizatorja Učinkovitost tipala (Blok 1 Tipalo 1)
P0427=Temp. katalizatorja Vezje tipala nizko (Blok 1 Tipalo 1)
P0428=Temp. katalizatorja Vezje tipala visoko (Blok 1 Tipalo 1)
P0429=Nadzor katalizatorja grelnika (Blok 1)
P0430=Učinkovitost katalizatorja pod pragom (Blok 2)
P0431=Ogrevalni katalizator pod pragom (Blok 2)
P0432=Glavni katalizator pod pragom (Blok 2)
P0433=Ogreti katalizator pod pragom (Blok 2)
P0434=Temp ogretega katalizatorja pod pragom (Blok 2)
P0435=Temp. katalizatorja Tipalo (Blok 2 Tipalo 1)
P0436=Temp. katalizatorja Učinkovitost tipala (Blok 2 Tipalo 1)
P0437=Temp. katalizatorja Vezje tipala nizko (Blok 2 Tipalo 1)
P0438=Temp. katalizatorja Vezje tipala visoko (Blok 2 Tipalo 1)
P0439=Nadzor katalizatorja grelnika (Blok 2)
P0440=Sistem nadzora EVAP emisij okvara
P0441=Sistem nadzora EVAP emisij prečiščevalni pretok napaka
P0442=Sistem nadzora EVAP emisij puščanje (malo)
P0443=Sistem nadzora EVAP emisij prečiščevalni ventil C napaka
P0444=Sistem nadzora EVAP emisij prečiščevalni ventil C odprt
P0445=Sistem nadzora EVAP emisij prečiščevalni ventil C kratko
P0446=Sistem nadzora EVAP emisij prezračevalni vezje okvara
P0447=Sistem nadzora EVAP emisij prezračevalni vezje odprto
P0448=Sistem nadzora EVAP emisij prezračevalni vezje kratek
P0449=Sistem nadzora EVAP emisij ventilska/solenoidna enota okvara
P0450=Sistem nadzora EVAP emisij tipalo tlaka napaka
P0451=Sistem nadzora EVAP emisij tipalo tlaka razpon
P0452=Sistem nadzora EVAP emisij tipalo tlaka nizko
P0453=Sistem nadzora EVAP emisij tipalo tlaka visoko
P0454=Sistem nadzora EVAP emisij tipalo tlaka nepredvidljivo
P0455=Sistem nadzora EVAP emisij puščanje (veliko)
P0456=Sistem nadzora EVAP emisij puščanje zelo malo
P0457=Sistem nadzora EVAP emisij puščanje odvit/snet pokrovček
P0458=Vezje EVAP sistema za prečiščevanje kanistra nizko
P0459=Vezje EVAP sistema za prečiščevanje kanistra visoko
P0460=Tipalo ravni goriva A vezje okvara
P0461=Tipalo ravni goriva A vezje razpon/učinkovitost
P0462=Tipalo ravni goriva A vezje nizek vnos
P0463=Tipalo ravni goriva A vezje visok vnos
P0464=Tipalo ravni goriva A vezje prekinjeno
P0465=EVAP tipalo pretoka izpušnih hlapov za odstranjevanje emisij vezje okvara
P0466=EVAP tipalo pretoka izpušnih hlapov za odstranjevanje emisij vezje razpon/učinkovitost
P0467=EVAP tipalo pretoka izpušnih hlapov za odstranjevanje emisij vezje nizek vnos
P0468=EVAP tipalo pretoka izpušnih hlapov za odstranjevanje emisij vezje visok vnos
P0469=EVAP tipalo pretoka izpušnih hlapov za odstranjevanje emisij vezje prekinjeno
P0470=Vezje tipala tlaka izpuha okvara
P0471=Tipalo tlaka izpuha vezje razpon/učinkovitost
P0472=Vezje tipala tlaka izpuha nizek vnos
P0473=Vezje tipala tlaka izpuha visok vnos
P0474=Tipalo tlaka izpuha vezje prekinjeno
P0475=Ventil za regulacijo tlaka izpuha vezje okvara
P0476=Ventil za regulacijo tlaka izpuha vezje razpon/učinkovitost
P0477=Ventil za regulacijo tlaka izpuha vezje nizek vnos
P0478=Ventil za regulacijo tlaka izpuha vezje visok vnos
P0479=Ventil za regulacijo tlaka izpuha vezje prekinjeno
P0480=Krmilno vezje hladilnega ventilatorja 1
P0481=Krmilno vezje hladilnega ventilatorja 2
P0482=Krmilno vezje hladilnega ventilatorja 3
P0483=Preverjanje racionalnosti krmiljenja ventilatorja okvara
P0484=Nadzor ventilatorja vezje preobremenitev
P0485=Krmilni vezni vod napajanja/ozemljitve ventilatorja okvara
P0486=EGR sistem tipalo B vezje
P0487=EGR TPS krmilno vezje
P0488=EGR TPS nadzor toka vezje razpon/učinkovitost
P0489=A krmilno vezje nizko
P0490=EGR krmilno vezje visoko
P0491=Sekundarni prezračevalni sistem (Blok 1)
P0492=Sekundarni prezračevalni sistem (Blok 2)
P0493=Hitrost ventilatorja prehitra
P0494=Hitrost ventilatorja nizka
P0495=Hitrost ventilatorja visoka
P0496=EVAP emisije napaka visokega čistilnega toka
P0497=EVAP emisije napaka nizkega čistilnega toka
P0498=EVAP ventilska/solenoidna enota za izpušne pline okvara vezja nizko
P0499=EVAP ventilska/solenoidna enota za izpušne pline okvara vezja visoko
P0500=Hitrost vozila tipalo A okvara
P0501=Hitrost vozila tipalo A razpon/učinkovitost
P0502=Tipalo hitrosti vozila A vezje nizek vnos
P0503=Hitrost vozila tipalo A nepredvidljivo/visoko
P0504=Korelacija stikalo zavore A stikalo zavore B
P0505=Sistem nadzora prostega teka okvara
P0506=Sistem nadzora prostega teka RPM nizko
P0507=Sistem nadzora prostega teka RPM visoko
P0508=Sistem nadzora prostega teka vezje nizko
P0509=Sistem nadzora prostega teka vezje visoko
P0510=Stikalo zaprtega položaja plina
P0511=Krmilno vezje zrak v prostem teku
P0512=Zaganjalnik signal vezje
P0513=Imobilizator nepravilen
P0514=Tipalo temperature baterije vezje razpon/učinkovitost
P0515=Tipalo temperature v bateriji vezje
P0516=Temperatura v bateriji vezje nizko
P0517=Temperatura v bateriji vezje visoko
P0518=Nadzorni tokokrog vezje zrak v prostem teku prekinjeno
P0519=Učinkovitost sistema nadzora zraka v prostem teku
P0520=Tipalo/stikalo tlaka olja v motorju vezje okvara
P0521=Tipalo/stikalo tlaka olja v motorju razpon/učinkovitost
P0522=Tipalo/stikalo tlaka olja v motorju nizka napetost
P0523=Tipalo/stikalo tlaka olja v motorju visoka napetost
P0524=Tlak olja v motorju prenizek
P0525=Servo križarjenje vezje razpon/učinkovitost
P0526=Vezje tipal hitrost ventilatorja
P0527=Tipalo hitrosti ventilatorja vezje razpon/učinkovitost
P0528=Vezje tipal hitrost ventilatorja ni signala
P0529=Tipalo hitrosti ventilatorja vezje prekinjeno
P0530=Tipalo tlaka hladila klimatske naprave A vezje okvara
P0531=Tipalo tlaka hladila klimatske naprave A vezje razpon/učinkovitost
P0532=Tipalo tlaka hladila klimatske naprave A vezje nizek vnos
P0533=Tipalo tlaka hladila klimatske naprave A vezje visok vnos
P0534=Izguba polnjenja hladila za klimatsko napravo
P0535=Tipalo temperature v izparilniku klimatske naprave vezje
P0536=Tipalo temperature naprave za evaporacijo klimatske naprave vezje razpon/učinkovitost
P0537=Tipalo temperature v izparilniku klimatske naprave vezje nizko
P0538=Tipalo temperature v izparilniku klimatske naprave vezje
P0539=Tipalo temperature naprave za evaporacijo klimatske naprave vezje prekinjeno
P0540=Grelnik vhodnega zraka A vezje
P0541=Grelnik vhodnega zraka A vezje nizko
P0542=Grelnik vhodnega zraka A vezje visoko
P0543=Grelnik vhodnega zraka A vezje odprto
P0544=Temp. izpušnega plina Vezje tipala (Blok 1 Tipalo 1)
P0545=Temp. izpušnega plina Vezje tipala nizko (Blok 1 Tipalo 1)
P0546=Temp. izpušnega plina Vezje tipala visoko (Blok 1 Tipalo 1)
P0547=Temp. izpušnega plina Vezje tipala (Blok 2 Tipalo 1)
P0548=Temp. izpušnega plina Vezje tipala nizko (Blok 2 Tipalo 1)
P0549=Temp. izpušnega plina Vezje tipala visoko (Blok 2 Tipalo 1)
P0550=Tipalo tlaka pnevmatskega krmiljenja vezje okvara
P0551=Tipalo tlaka pnevmatskega krmiljenja vezje razpon/učinkovitost
P0552=Tipalo tlaka pnevmatskega krmiljenja vezje nizek vnos
P0553=Tipalo tlaka pnevmatskega krmiljenja vezje visok vnos
P0554=Tipalo tlaka pnevmatskega krmiljenja vezje prekinjeno
P0555=Tipalo tlaka servo ojačevalca zavor vezje
P0556=Tipalo tlaka servo ojačevalca zavor vezje razpon/učinkovitost
P0557=Tipalo tlaka servo ojačevalca zavor vezje nizek vnos
P0558=Tipalo tlaka servo ojačevalca zavor vezje visok vnos
P0559=Tipalo tlaka servo ojačevalca zavor vezje prekinjeno
P0560=Sistemska napetost okvara
P0561=Sistemska napetost nestabilna
P0562=Sistemska napetost nizka
P0563=Sistemska napetost visoka
P0564=Tempomat večfunkcijsko Napaka vnosa signala A
P0565=Tokokrog tempomata signal vklop okvara
P0566=Tokokrog tempomata signal izklop okvara
P0567=Signal povzetka tempomata okvara
P0568=Tokokrog tempomata signal nastavitve okvara
P0569=Napaka signalnega sistema za izklop tempomata
P0570=Signal za pospeševanje tempomata napaka
P0571=Stikalo zavore A vezje okvara
P0572=Stikalo zavore A vezje nizek vnos
P0573=Stikalo zavore A vezje visok vnos
P0574=Tokokrog tempomata hitrost vozila previsoka
P0575=Vezje tempomata okvara
P0576=Vezje tempomata nizek vnos
P0577=Vezje tempomata visok vnos
P0578=Tempomat večfunkcijsko vhod A vezje zagozdeno
P0579=Tempomat večfunkcijsko vhod A vezje razpon/učinkovitost
P0580=Tempomat večfunkcijsko vnos A vezje nizko
P0581=Tempomat večfunkcijsko vnos A vezje visoko
P0582=Vezje nadzor tempomata vakuuma odprto
P0583=Vezje za nadzor tempomata vakuuma nizko
P0584=Vezje nadzor tempomata vakuuma visoko
P0585=Tempomat večfunkcijsko vhod korelacija
P0586=Vezje za nadzor prezračevanja tempomata odprto
P0587=Vezje za nadzor prezračevanja tempomata nizko
P0588=Vezje za nadzor prezračevanja tempomata visoko
P0589=Tempomat večfunkcijsko vhod B vezje
P0590=Tempomat večfunkcijsko vhod B vezje zagozdeno
P0591=Tempomat večfunkcijsko vhod B vezje razpon/učinkovitost
P0592=Tempomat večfunkcijsko vnos B vezje nizko
P0593=Tempomat večfunkcijsko vnos B vezje visoko
P0594=Vezje servo nadzor tempomata odprto
P0595=Vezje servo nadzor tempomata nizko
P0596=Vezje servo nadzor tempomata visoko
P0597=Vezje tempomata odprto
P0598=Vezje tempomata nizko
P0599=Vezje tempomata visoko
P0600=Povezava serijske komunikacije okvara
P0601=Pomnilnik notranjega krmilnega modula kontrola vsote napaka
P0602=Programska napaka modula nadzora
P0603=PCM spomin ohranjanja delovanja - Keep Alive Memory (KAM) napaka
P0604=PCM pomnilnik z naključnim dostopom (RAM) napaka
P0605=PCM spomin samo za branje (ROM) napaka
P0606=Napaka PCM procesorja
P0607=Učinkovitost modula nadzora
P0608=Nadzorni modul VSS izhod A okvara
P0609=Nadzorni modul VSS izhod B okvara
P0610=Modul nadzora možnosti vozila okvara
P0611=Modul kontrole vbrizgalnika učinkovitost
P0612=Modul kontrole vbrizgalnika nadzor releja
P0613=Napaka TCM procesorja
P0614=ECM/TCM nekompatibilno
P0615=Vezje rele zaganjalnik
P0616=Zaganjalnik rele vezje nizko
P0617=Zaganjalnik rele vezje visoko
P0618=Alternativni modul za gorivo (KAM) napaka
P0619=Spomin alternativnega modula za gorivo
P0620=Nadzor generatorja okvara
P0621=Generator L-Term. Nadzor svetilke
P0622=Generator F-Term. Polje F kontrolnik
P0623=Krmilno vezje lučke generatorja
P0624=Vezje lučke pokrova za gorivo
P0625=Generator F-Term. Vezje nizko
P0626=Generator F-Term. Vezje visoko
P0627=Črpalka za gorivo A krmilno vezje odprto
P0628=Črpalka za gorivo A krmilno vezje nizko
P0629=Črpalka za gorivo A krmilno vezje visoko
P0630=PCM VIN ni program. Ali neujemanje
P0631=TCM VIN ni program. Ali neujemanje
P0632=Koda kilometrskega števca ni programirana ECM/PCM
P0633=Koda imobilizatorja ni programirana ECM/PCM
P0634=PCM/ECM/TCM notranja temp. Previsoko
P0635=Krmilno vezje pnevmatskega krmiljenja
P0636=Krmilno vezje pnevmatskega krmiljenja nizko
P0637=Krmilno vezje pnevmatskega krmiljenja visoko
P0638=Krmilnik plina razpon/učinkovitost (Blok 1)
P0639=Krmilnik plina razpon/učinkovitost (Blok 2)
P0640=Grelnik vhodnega zraka krmilno vezje
P0641=Tipalo A vezje referenčne napetosti odprto
P0642=Tipalo A vezje referenčne napetosti nizko
P0643=Tipalo A vezje referenčne napetosti visoko
P0644=Prikaz za voznika povezava serijske komunikacije
P0645=Krmilno vezje releja sklopke klimatske naprave
P0646=Krmilno vezje releja sklopke klimatske naprave nizko
P0647=Krmilno vezje releja sklopke klimatske naprave visoko
P0648=Vezje lučke imobilizatorja
P0649=Lučka tempomata vezje
P0650=Vezje nadzora MIL okvara
P0651=Tipalo B vezje referenčne napetosti odprto
P0652=Tipalo B vezje referenčne napetosti nizko
P0653=Tipalo B vezje referenčne napetosti visoko
P0654=Vezje motorja RPM okvara
P0655=Izstopni tok vezja za opozorilno lučko pregretja motorja okvara
P0656=Raven goriva izhod okvara vezja
P0657=Napajalna napetost aktuatorja A vezje odprto
P0658=Napajalna napetost aktuatorja A vezje nizko
P0659=Napajalna napetost aktuatorja A vezje visoko
P0660=Krmiljenje pretoka vbrizga v sesalni kolektor vezje odprto (Blok 1)
P0661=Krmiljenje pretoka vbrizga v sesalni kolektor vezje nizko (Blok 1)
P0662=Krmiljenje pretoka vbrizga v sesalni kolektor vezje visoko (Blok 1)
P0663=Krmiljenje pretoka vbrizga v sesalni kolektor vezje odprto (Blok 2)
P0664=Krmiljenje pretoka vbrizga v sesalni kolektor vezje nizko (Blok 2)
P0665=Krmiljenje pretoka vbrizga v sesalni kolektor vezje visoko (Blok 2)
P0666=PCM/ECM/TCM notranja temp. Tipalo vezja
P0667=PCM/ECM/TCM notranja temp. Območje tipala/učinkovitost
P0668=PCM/ECM/TCM notranja temp. Tipalo vezja nizko
P0669=PCM/ECM/TCM notranja temp. Tipalo vezje visoko
P0670=Vžigalna svečka/grelnik nadzor modula
P0671=Vžigalna svečka/valj grelnika 1
P0672=Vžigalna svečka/valj grelnika 2
P0673=Vžigalna svečka/valj grelnika 3
P0674=Vžigalna svečka/valj grelnika 4
P0675=Vžigalna svečka/valj grelnika 5
P0676=Vžigalna svečka/valj grelnika 6
P0677=Vžigalna svečka/valj grelnika 7
P0678=Vžigalna svečka/valj grelnika 8
P0679=Vžigalna svečka/valj grelnika 9
P0680=Vžigalna svečka/valj grelnika 10
P0681=Vžigalna svečka/valj grelnika 11
P0682=Vžigalna svečka/valj grelnika 12
P0683=Vžigalna svečka/grelnik težava komunikacije modula
P0684=Težava komunikacije žarilne svečke vezje razpon/učinkovitost
P0685=Krmilno vezje releja za napajanje ECM/PCM odprto
P0686=Krmilno vezje releja za napajanje ECM/PCM nizko
P0687=Krmilno vezje releja za napajanje ECM/PCM visoko
P0688=Zaznavanje releja za napajanje ECM/PCM vezje odprto
P0689=Zaznavanje releja za napajanje ECM/PCM vezje nizko
P0690=Zaznavanje releja za napajanje ECM/PCM vezje visoko
P0691=Krmilno vezje ventilatorja 1 nizko
P0692=Krmilno vezje ventilatorja 1 visoko
P0693=Krmilno vezje ventilatorja 2 nizko
P0694=Krmilno vezje ventilatorja 2 visoko
P0695=Krmilno vezje ventilatorja 3 nizko
P0696=Krmilno vezje ventilatorja 3 visoko
P0697=Tipalo C vezje referenčne napetosti odprto
P0698=Tipalo C vezje referenčne napetosti nizko
P0699=Tipalo C vezje referenčne napetosti visoko
P0700=Sistem nadzora prenosa okvara
P0701=Trans nadzor sistem razpon/učinkovitost
P0702=Sistem nadzora prenosa električno
P0703=Stikalo zavore B vezje okvara
P0704=Vhodni vezje stikala za sklopko okvara
P0705=Tipalo razpona trans vezje okvara (PRNDL vnos)
P0706=Tipalo razpona trans vezje razpon/učinkovitost
P0707=Tipalo razpona trans vezje nizek vnos
P0708=Tipalo razpona trans vezje visok vnos
P0709=Tipalo razpona trans vezje prekinjeno
P0710=Tipalo temperature prestavnega olja vezje okvara
P0711=Tipalo temperature tekočine A vezje menjalnika razpon/učinkovitost
P0712=Tipalo temperature prestavnega olja A vezje nizek vnos
P0713=Tipalo temperature prestavnega olja A vezje visok vnos
P0714=Tipalo temperature prestavnega olja A vezje menjalnika prekinjeno
P0715=Vhodni/turbinski hitrostni senzor A vezje okvara
P0716=Tipalo hitrosti vnosa/turbine A vezje razpon/učinkovitost
P0717=Vhodni/turbinski hitrostni senzor A vezje ni signala
P0718=Tipalo hitrosti vnosa/turbine A vezje prekinjeno
P0719=Stikalo zavore B vezje nizek vnos
P0720=Tipalo izhodne hitrosti okvara vezja
P0721=Tipalo izhodne hitrosti vezje razpon/učinkovitost
P0722=Vezje tipal izhodna hitrost ni signala
P0723=Tipalo izhodne hitrosti vezje prekinjeno
P0724=Stikalo zavore B vezje visok vnos
P0725=Tipalo hitrosti motorja okvara vezja
P0726=Tipalo hitrosti v motorju vezje razpon/učinkovitost
P0727=Vezje tipal hitrost motorja ni signala
P0728=Tipalo hitrosti motorja vezje prekinjeno
P0729=Razmerje prestave 6 nepravilno
P0730=Razmerje prestav nepravilno
P0731=Razmerje prestave 1 nepravilno
P0732=Razmerje prestave 2 nepravilno
P0733=Razmerje prestave 3 nepravilno
P0734=Razmerje prestave 4 nepravilno
P0735=Razmerje prestave 5 nepravilno
P0736=Vzvratno razmerje nepravilno
P0737=TCM hitrost motorja izhodno vezje
P0738=TCM hitrost motorja izhodno vezje nizko
P0739=TCM hitrost motorja izhodno vezje visoko
P0740=TCC okvara vezja
P0741=Pretvornik navora vezje učinkovitost ali zagozdenje izklopljeno
P0742=Pretvornik navora vezje zataknjeno na
P0743=Pretvornik navora vezje električno
P0744=Pretvornik navora vezje prekinjeno
P0745=Pritisnite Control Sol. A okvara vezja
P0746=Pritisnite Control Sol. A vezje učinkovitost ali zagozdenje izklopljeno
P0747=Pritisnite Control Sol. A vezje zataknjeno na
P0748=Pritisnite Control Sol. A vezje električno
P0749=Pritisnite Control Sol. A vezje prekinjeno
P0750=Prestava solenoid A okvara
P0751=Prestavljanje solenoid A vezje učinkovitost ali zagozdenje izklopljeno
P0752=Prestava solenoid A vezje zataknjeno na
P0753=Prestava solenoid A vezje električno
P0754=Prestava solenoid A prekinjeno
P0755=Prestava solenoid B okvara
P0756=Prestavljanje solenoid B vezje učinkovitost ali zagozdenje izklopljeno
P0757=B vezje zataknjeno na
P0758=Prestava solenoid B vezje električno
P0759=Prestava solenoid B vezje prekinjeno
P0760=Prestava solenoid C okvara
P0761=Prestavljanje solenoid C vezje učinkovitost ali zagozdenje izklopljeno
P0762=Prestava solenoid C vezje zataknjeno na
P0763=Prestava solenoid C vezje električno
P0764=Prestava solenoid C vezje prekinjeno
P0765=Prestava solenoid D okvara
P0766=Prestavljanje solenoid D vezje učinkovitost ali zagozdenje izklopljeno
P0767=Prestava solenoid D vezje zataknjeno na
P0768=Prestava solenoid D vezje električno
P0769=Prestava solenoid D vezje prekinjeno
P0770=Prestava solenoid E okvara
P0771=Prestavljanje solenoid E vezje učinkovitost ali zagozdenje izklopljeno
P0772=Prestava solenoid E vezje zataknjeno na
P0773=Prestava solenoid E vezje električno
P0774=Prestava solenoid E vezje prekinjeno
P0775=Pritisnite Ctrl Sol. B okvara vezja
P0776=Pritisnite Ctrl Sol. B vezje učinkovitost ali zagozdenje izklopljeno
P0777=Pritisnite Ctrl Sol. B vezje zataknjeno na
P0778=Pritisnite Ctrl Sol. B vezje električno
P0779=Pritisnite Ctrl Sol. B vezje prekinjeno
P0780=Okvara prestavne ročice
P0781=Okvara 1-2 prestave
P0782=Okvara 2-3 prestave
P0783=Okvara 3-4 prestave
P0784=Okvara 4-5 prestave
P0785=Prestavljanje/čas solenoid okvara
P0786=Prestavljanje/čas solenoid razpon/učinkovitost
P0787=Prestavna ročica/čas solenoid nizko
P0788=Prestavljanje/čas solenoid visoko
P0789=Prestavljanje/čas solenoid tokokrog prekinjeno
P0790=Normalno/učinkovitost stikalni krog okvara
P0791=Tipalo hitrosti medosovine A vezje
P0792=Tipalo hitrosti medosovine A vezje razpon/učinkovitost
P0793=Tipalo hitrosti medosovine A vezje ni signala
P0794=Tipalo medosovine A vezje prekinjeno
P0795=Pritisnite Ctrl SoL C okvara
P0796=Pritisnite Ctrl Sol. C vezje učinkovitost ali zagozdenje izklopljeno
P0797=Pritisnite Ctrl SoL C vezje zataknjeno na
P0798=Pritisnite Ctrl SoL C vezje električno
P0799=Pritisnite Ctrl SoL C vezje prekinjeno
P0800=Sistem za nadzor prenosa moči zahteva MIL
P0801=Vezje krmiljenja zaviranja vzvratne vožnje okvara
P0802=Sistem nadzora prenosa zahteva MIL tokokrog odprto
P0803=Solenoid 1-4 višja prestava (preskok prestavljanja) vezje okvara
P0804=Luč 1-4 višja prestava (preskok prestavljanja) vezje okvara
P0805=Tipalo položaja sklopke vezje okvara
P0806=Tipalo položaja sklopke vezje razpon/učinkovitost
P0807=Tipalo položaja sklopke vezje nizko
P0808=Tipalo položaja sklopke vezje visoko
P0809=Tipalo položaja sklopke vezje prekinjeno
P0810=Nadzor položaja sklopke okvara
P0811=Prekomeren zdrs sklopke
P0812=Obratni vnos okvara vezja
P0813=Obratni izhod okvara vezja
P0814=Vezje prikaza trans razpona okvara
P0815=Vezje stikala za višjo prestavo okvara
P0816=Vezje stikala za nižjo prestavo okvara
P0817=Zaganjalnik onemogoči vezje
P0818=Vhod za izklop pogonskega sklopa
P0819=Stikalo za prestavljanje navzgor/navzdol korelacija z razponom prestavljanja menjalnika
P0820=Raven prestave X-Y tipalo vezje
P0821=Raven prestave X tipalo vezje
P0822=Raven prestave X tipalo vezje
P0823=Raven prestave X tipalo vezje prekinjeno vezje
P0824=Raven prestave X tipalo vezje prekinjeno vezje
P0825=Stikalo potiskanja/vlečenja prestavne ročice (Premikanje prestav)
P0826=Vezje stikala za višjo prestavo stikala za nižjo prestavo
P0827=Vezje stikala za višjo prestavo stikala za nižjo prestavo nizko
P0828=Vezje stikala za višjo prestavo stikala za nižjo prestavo visoko
P0829=5-6 prestav
P0830=Stikalo položaja sklopke A vezje okvara
P0831=Stikalo položaja sklopke A vezje nizko
P0832=Stikalo položaja sklopke A vezje visoko
P0833=Stikalo položaja sklopke B vezje okvara
P0834=Stikalo položaja sklopke B vezje nizko
P0835=Stikalo položaja sklopke B vezje visoko
P0836=4 stikalo za štirikolesni pogon vezje okvara
P0837=4 stikalo za štirikolesni pogon vezje razpon/učinkovitost
P0838=4 stikalo za štirikolesni pogon vezje nizko
P0839=4 stikalo za štirikolesni pogon vezje visoko
P0840=Tipalo/stikalo tlaka prestavnega olja A vezje okvara
P0841=Tipalo/stikalo tlaka prestavnega olja A vezje razpon/učinkovitost
P0842=Tipalo/stikalo tlaka prestavnega olja A vezje nizko
P0843=Tipalo/stikalo tlaka prestavnega olja A vezje visoko
P0844=Tipalo/stikalo tlaka prestavnega olja A vezje prekinjeno
P0845=Tipalo/stikalo tlaka prestavnega olja B vezje okvara
P0846=Tipalo/stikalo tlaka prestavnega olja B vezje razpon/učinkovitost
P0847=Tipalo/stikalo tlaka prestavnega olja B vezje nizko
P0848=Tipalo/stikalo tlaka prestavnega olja B vezje visoko
P0849=Tipalo/stikalo tlaka prestavnega olja B vezje prekinjeno
P0850=Vhodni vezje stikala za parkiranje/nevtralno
P0851=Vezje stikala za prakriranje/nevtralno nizek vnos
P0852=Vezje stikala za parkiranje/nevtralno visok vnos
P0853=Vhodni vezje stikala za vožnjo
P0854=Vezje stikala za vožnjo nizek vnos
P0855=Vezje stikala za vožnjo visok vnos
P0856=Nadzor vleka vhodni signal
P0857=Nadzor vleka vhodni signal razpon/učinkovitost
P0858=Nadzor vleka vhodni signal nizko
P0859=Nadzor vleka vhodni signal visoko
P0860=Komunikacijski modul prestave vezje
P0861=Komunikacijski modul prestave vezje nizko
P0862=Komunikacijski modul prestave vezje visoko
P0863=TCM komunikacije vezje
P0864=TCM komunikacija vezje razpon/učinkovitost
P0865=TCM komunikacije vezje nizko
P0866=TCM komunikacije vezje visoko
P0867=Tlak prestavnega olja
P0868=Tlak prestavnega olja nizek
P0869=Tlak prestavnega olja visok
P0870=Tipalo/stikalo tlaka prestavnega olja C vezje
P0871=Tipalo/stikalo tlaka prestavnega olja C vezje razpon/učinkovitost
P0872=Tipalo/stikalo tlaka prestavnega olja C vezje nizko
P0873=Tipalo/stikalo tlaka prestavnega olja C vezje visoko
P0874=Tipalo/stikalo tlaka prestavnega olja C vezje prekinjeno
P0875=Tipalo/stikalo tlaka prestavnega olja D vezje
P0876=Tipalo/stikalo tlaka prestavnega olja D vezje razpon/učinkovitost
P0877=Tipalo/stikalo tlaka prestavnega olja D vezje nizko
P0878=Tipalo/stikalo tlaka prestavnega olja D vezje visoko
P0879=Tipalo/stikalo tlaka prestavnega olja D vezje prekinjeno
P0880=TCM vklop vhodni signal
P0881=TCM vklop vhodni signal razpon/učinkovitost
P0882=TCM vklop vhodni signal nizko
P0883=TCM vklop vhodni signal visoko
P0884=TCM vklop vhodni signal vezje prekinjeno
P0885=Krmilno vezje releja za napajanje TCM odprto
P0886=Krmilno vezje releja za napajanje TCM nizko
P0887=Krmilno vezje releja za napajanje TCM visoko H
P0888=Zaznavanje releja za napajanje TCM vezje
P0889=Zaznavanje releja za napajanje TCM vezje razpon/učinkovitost
P0890=Zaznavanje releja za napajanje TCM vezje nizko
P0891=Zaznavanje releja za napajanje TCM vezje visoko
P0892=Zaznavanje releja za napajanje TCM vezje prekinjeno
P0893=Aktiviranih več prestav
P0894=Prenos komp. Lezoč
P0895=Čas prestavljanja prekratek
P0896=Čas prestavljanja predolg
P0897=Poslabšanje prestavnega olja
P0898=Prenos ctrl. MIL zahtevek vezje nizko
P0899=Nadzor prenosa MIL zahtevek vezje visoko
P0900=Vezje prožila sklopke odprto
P0901=Aktuator sklopke vezje razpon/učinkovitost
P0902=Vezje prožila sklopke nizko
P0903=Vezje prožila sklopke visoko
P0904=Položaj izbire vhoda vezje
P0905=Položaj izbire vrat vezje razpon/učinkovitost
P0906=Položaj izbire vhoda vezje nizko
P0907=Položaj izbire vhoda vezje visoko
P0908=Položaj izbire vrat vezje prekinjeno
P0909=Napaka kontrolnika izbire vrat
P0910=Vezje prožila izbire vrat odprto
P0911=Aktuator izbire vrat vezje razpon/učinkovitost
P0912=Vezje prožila izbire vrat nizko
P0913=Vezje prožila izbire vrat visoko
P0914=Položaj prestave vezje
P0915=Položaj prestavljanja prestave vezje razpon/učinkovitost
P0916=Položaj prestave vezje nizko
P0917=Položaj prestave vezje visoko
P0918=Položaj prestavljanja prestave vezje prekinjeno
P0919=Položaj prestave napaka nadzora
P0920=Aktuator prestave naprej vezje odprto
P0921=Aktuator prestave naprej vezje razpon/učinkovitost
P0922=Aktuator prestave naprej vezje nizko
P0923=Aktuator prestave naprej vezje visoko
P0924=Aktuator prestave nazaj vezje odprto
P0925=Aktuator prestave nazaj vezje razpon/učinkovitost
P0926=Aktuator prestave nazaj vezje nizko
P0927=Aktuator prestave nazaj vezje visoko
P0928=Zaklep prestave solenoid Ctrl vezje odprto
P0929=Zaklep prestave solenoid Ctrl vezje razpon/učinkovitost
P0930=Zaklep prestave solenoid Ctrl vezje nizko
P0931=Zaklep prestave solenoid Ctrl vezje visoko
P0932=Vezje tipala tlaka hidravlike
P0933=Tipalo tlaka hidravlike vezje razpon/učinkovitost
P0934=Vezje tipala tlaka hidravlike nizko
P0935=Vezje tipala tlaka hidravlike visoko
P0936=Tipalo tlaka hidravlike vezje prekinjeno
P0937=Vezje tipala temperature olja v hidravliki
P0938=Tipalo temperature olja v hidravliki vezje razpon/učinkovitost
P0939=Vezje tipala temperature olja v hidravliki nizko
P0940=Vezje tipala temperature olja v hidravliki visoko
P0941=Tipalo temperature olja v hidravlično vezje prekinjeno
P0942=Hid. Tlačna enota
P0943=Hid. Ciklus enote tlaka prekratek
P0944=Hid. Tlačna enota izguba tlaka
P0945=Hid. Vezje relejev črpalke odprto
P0946=Hid. Rele črpalke vezje razpon/učinkovitost
P0947=Hid. Vezje relejev črpalke nizko
P0948=Hid. Vezje relejev črpalke visoko
P0949=Prilagodljivo učenje samodejnega prestavlja ni zaključeno
P0950=Ročni nadzor samodejno prestavljanje vezje
P0951=Ročni nadzor samodejno prestavljanje vezje razpon/učinkovitost
P0952=Ročni nadzor samodejno prestavljanje vezje nizko
P0953=Ročni nadzor samodejno prestavljanje vezje visoko
P0954=Ročni nadzor samodejno prestavljanje vezje prekinjeno
P0955=Ročni način samodejno prestavljanje vezje
P0956=Ročni način samodejno prestavljanje vezje razpon/učinkovitost
P0957=Ročni način samodejno prestavljanje vezje nizko
P0958=Ročni način samodejno prestavljanje vezje visoko
P0959=Ročni način samodejno prestavljanje vezje prekinjeno
P0960=Solenoid nadzora tlaka A krmilno vezje odprto
P0961=Nadzor tlaka solenoid A kontrolnik vezje razpon/učinkovitost
P0962=Solenoid nadzora tlaka A krmilno vezje nizko
P0963=Solenoid nadzora tlaka A krmilno vezje visoko
P0964=Solenoid nadzora tlaka B krmilno vezje odprto
P0965=Nadzor tlaka solenoid B kontrolnik vezje razpon/učinkovitost
P0966=Solenoid nadzora tlaka B krmilno vezje nizko
P0967=Solenoid nadzora tlaka B krmilno vezje visoko
P0968=Solenoid nadzora tlaka C krmilno vezje odprto
P0969=Nadzor tlaka solenoid C kontrolnik vezje razpon/učinkovitost
P0970=Solenoid nadzora tlaka C krmilno vezje nizko
P0971=Solenoid nadzora tlaka C krmilno vezje visoko
P0972=Prestavljanje solenoid A kontrolnik vezje učinkovitost ali zagozdenje izklopljeno
P0973=Solenoid prestavne ročice A krmilno vezje nizko
P0974=Solenoid prestavne ročice A krmilno vezje visoko
P0975=Prestavljanje solenoid B kontrolnik vezje učinkovitost ali zagozdenje izklopljeno
P0976=Solenoid prestavne ročice B krmilno vezje nizko
P0977=Solenoid prestavne ročice B krmilno vezje visoko
P0978=Prestavljanje solenoid C kontrolnik vezje učinkovitost ali zagozdenje izklopljeno
P0979=Solenoid prestavne ročice C krmilno vezje nizko
P0980=Solenoid prestavne ročice C krmilno vezje visoko
P0981=Prestavljanje solenoid D kontrolnik vezje učinkovitost ali zagozdenje izklopljeno
P0982=Solenoid prestavne ročice D krmilno vezje nizko
P0983=Solenoid prestavne ročice D krmilno vezje visoko
P0984=Prestavljanje solenoid E kontrolnik vezje učinkovitost ali zagozdenje izklopljeno
P0985=Solenoid prestavne ročice E krmilno vezje nizko
P0986=Solenoid prestavne ročice E krmilno vezje visoko
P0987=Tipalo/stikalo tlaka prestavnega olja E vezje
P0988=Tipalo/stikalo tlaka prestavnega olja E vezje razpon/učinkovitost
P0989=Tipalo/stikalo tlaka prestavnega olja E vezje nizko
P0990=Tipalo/stikalo tlaka prestavnega olja E vezje visoko
P0991=Tipalo/stikalo tlaka prestavnega olja E vezje prekinjeno
P0992=Tipalo/stikalo tlaka prestavnega olja F vezje
P0993=Tipalo/stikalo tlaka prestavnega olja F vezje razpon/učinkovitost
P0994=Tipalo/stikalo tlaka prestavnega olja F vezje nizko
P0995=Tipalo/stikalo tlaka prestavnega olja F vezje visoko
P0996=Tipalo/stikalo tlaka prestavnega olja F vezje prekinjeno
P0997=Prestavljanje solenoid F kontrolnik vezje učinkovitost ali zagozdenje izklopljeno
P0998=Solenoid prestavne ročice F krmilno vezje nizko
P0999=Solenoid prestavne ročice F krmilno vezje visoko
@@ -0,0 +1,53 @@
P0001=Bränslevolymregulator styrkrets/öppna
P0002=Bränslevolymregulator styrkrets intervall/prestanda
P0003=Bränslevolymregulator styrkrets låg
P0004=Bränslevolymregulator styrkrets hög
P0005=Bränsleavstängningsventil en styrkrets/öppen
P041F=ISO/SAE reserverades
P042E=ISO/SAE reserverades
P012F=ISO/SAE reserverades
P000E=ISO/SAE reserverades
P000F=ISO/SAE reserverades
P006E=ISO/SAE reserverades
P018F=ISO/SAE reserverades
P0364=ISO/SAE reserverades
P023F=ISO/SAE reserverades
P006F=ISO/SAE reserverades
P0600=Seriell kommunikationslänk
P0615=Startmotorns reläkrets
P0297=Fordonets överhastighetstillstånd
P0148=Fel i bränsletillförseln
P245F=ISO/SAE reserverades
P256F=ISO/SAE reserverades
P0169=Felaktig bränsleförbrukning
P0606=ECM/PCM-processor
P206A=ISO/SAE reserverades
P047F=ISO/SAE reserverades
P240D=ISO/SAE reserverades
P206B=ISO/SAE reserverades
P069E=ISO/SAE reserverades
P0620=Generatorns kontrollkrets
P069F=ISO/SAE reserverades
P075F=ISO/SAE reserverades
P084F=ISO/SAE reserverades
P206C=ISO/SAE reserverades
P207F=ISO/SAE reserverades
P245E=ISO/SAE reserverades
P0494=Låg fläkthastighet
P0607=Kontrollera modulens prestanda
P0495=Hög fläkthastighet
P240E=ISO/SAE reserverades
P240F=ISO/SAE reserverades
P255F=ISO/SAE reserverades
P206D=ISO/SAE reserverades
P205F=ISO/SAE reserverades
P204F=ISO/SAE reserverades
P0B0E=ISO/SAE reserverades
P0B0F=ISO/SAE reserverades
P080F=ISO/SAE reserverades
P080E=ISO/SAE reserverades
P0613=TCM-processor
P050F=ISO/SAE reserverades
P050E=ISO/SAE reserverades
P042F=ISO/SAE reserverades
P0149=Fel på bränsletiming
File diff suppressed because it is too large Load Diff

Some files were not shown because too many files have changed in this diff Show More