untrack android/ (moved to github.com/Repinoid/elmer-android)

This commit is contained in:
“Naeel”
2026-05-25 23:11:50 +04:00
parent 0b1f2f1d59
commit 6a1af162e2
201 changed files with 0 additions and 61966 deletions
-48
View File
@@ -1,48 +0,0 @@
plugins {
id("com.android.application")
id("org.jetbrains.kotlin.android")
}
android {
namespace = "ru.elmer.client"
compileSdk = 34
defaultConfig {
applicationId = "ru.elmer.client"
minSdk = 24
targetSdk = 34
versionCode = 1
versionName = "0.1.0"
}
buildTypes {
release {
isMinifyEnabled = true
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"))
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = "17"
}
}
dependencies {
// AndrOBD library (forked ELM327 protocol)
implementation(project(":library"))
// Minimal Android
implementation("androidx.core:core-ktx:1.12.0")
implementation("androidx.appcompat:appcompat:1.6.1")
// HTTP
implementation("com.squareup.okhttp3:okhttp:4.12.0")
// JSON
implementation("org.json:json:20231013")
}
-27
View File
@@ -1,27 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Только два разрешения -->
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
<uses-permission android:name="android.permission.INTERNET" />
<application
android:allowBackup="true"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/Theme.Elmer">
<activity
android:name=".MainActivity"
android:exported="true"
android:windowSoftInputMode="adjustResize">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
@@ -1,218 +0,0 @@
package ru.elmer.client
import android.app.Service
import android.bluetooth.BluetoothAdapter
import android.bluetooth.BluetoothDevice
import android.bluetooth.BluetoothSocket
import android.content.Intent
import android.os.Handler
import android.os.IBinder
import android.os.Looper
import android.util.Log
import com.fr3ts0n.ecu.prot.obd.ElmProt
import okhttp3.*
import okhttp3.MediaType.Companion.toMediaType
import okhttp3.RequestBody.Companion.toRequestBody
import org.json.JSONObject
import java.io.IOException
import java.io.InputStream
import java.io.OutputStream
import java.util.*
/**
* Фоновый сервис: Bluetooth SPP → ELM327 → HTTP-forward.
* Забираем сырые OBD-ответы из ElmProt и шлём на сервер.
*/
class ElmForwardService : Service() {
private var btSocket: BluetoothSocket? = null
private var inputStream: InputStream? = null
private var outputStream: OutputStream? = null
private val elm = ElmProt()
private val okHttp = OkHttpClient.Builder()
.connectTimeout(10, java.util.concurrent.TimeUnit.SECONDS)
.readTimeout(30, java.util.concurrent.TimeUnit.SECONDS)
.build()
private var serverUrl = "https://obdai.ru/api/v1/raw-obd"
private val handler = Handler(Looper.getMainLooper())
private var running = false
private var readThread: Thread? = null
companion object {
const val TAG = "ElmForward"
const val ACTION_CONNECT = "ru.elmer.client.CONNECT"
const val ACTION_DISCONNECT = "ru.elmer.client.DISCONNECT"
const val EXTRA_DEVICE_MAC = "device_mac"
const val EXTRA_SERVER_URL = "server_url"
const val BROADCAST_STATUS = "ru.elmer.client.STATUS"
}
override fun onBind(intent: Intent?): IBinder? = null
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
intent?.let {
it.getStringExtra(EXTRA_SERVER_URL)?.let { url -> serverUrl = url }
}
when (intent?.action) {
ACTION_CONNECT -> {
val mac = intent.getStringExtra(EXTRA_DEVICE_MAC) ?: return START_NOT_STICKY
connect(mac)
}
ACTION_DISCONNECT -> disconnect()
}
return START_STICKY
}
// ── Bluetooth connection ──────────────────────────
private fun connect(mac: String) {
broadcast("Подключение к $mac...")
try {
val adapter = BluetoothAdapter.getDefaultAdapter()
val device: BluetoothDevice = adapter.getRemoteDevice(mac)
// UUID для SPP (Serial Port Profile)
val uuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB")
btSocket = device.createRfcommSocketToServiceRecord(uuid)
adapter.cancelDiscovery()
btSocket?.connect()
inputStream = btSocket?.inputStream
outputStream = btSocket?.outputStream
// Настраиваем ELM протокол
elm.addTelegramWriter { buffer ->
outputStream?.write(String(buffer).toByteArray())
}
broadcast("Подключено к ELM327")
startReading()
initElm()
} catch (e: Exception) {
Log.e(TAG, "Bluetooth error", e)
broadcast("Ошибка: ${e.message}")
}
}
private fun initElm() {
// Отправляем AT-команды инициализации
sendRaw("ATZ\r") // сброс
Thread.sleep(1000)
sendRaw("ATE0\r") // эхо off
sendRaw("ATL0\r") // linefeed off
sendRaw("ATSP0\r") // авто-протокол
sendRaw("ATH1\r") // заголовки on
}
// ── Reading loop ──────────────────────────────────
private fun startReading() {
running = true
readThread = Thread {
val buffer = ByteArray(256)
val sb = StringBuilder()
while (running) {
try {
val bytesRead = inputStream?.read(buffer) ?: -1
if (bytesRead == -1) break
for (i in 0 until bytesRead) {
val c = buffer[i].toInt().toChar()
if (c == '>' || c == '\r') {
if (sb.isNotEmpty()) {
val raw = sb.toString().trim()
if (raw.isNotEmpty()) {
elm.handleTelegram(raw.toCharArray())
forwardToServer(raw)
}
sb.clear()
}
} else if (c != '\n') {
sb.append(c)
}
}
} catch (e: IOException) {
if (running) {
Log.e(TAG, "Read error", e)
broadcast("Соединение потеряно")
}
break
}
}
disconnect()
}.apply {
name = "ELM-Reader"
isDaemon = true
start()
}
broadcast("Чтение данных...")
}
// ── HTTP forward ──────────────────────────────────
private fun forwardToServer(rawLine: String) {
try {
val json = JSONObject().apply {
put("raw", rawLine)
put("timestamp", System.currentTimeMillis())
}
val body = json.toString()
.toRequestBody("application/json; charset=utf-8".toMediaType())
val request = Request.Builder()
.url(serverUrl)
.post(body)
.build()
okHttp.newCall(request).enqueue(object : Callback {
override fun onFailure(call: Call, e: IOException) {
// Молча, сервер недоступен — не критично
}
override fun onResponse(call: Call, response: Response) {
response.close()
}
})
} catch (e: Exception) {
Log.w(TAG, "Forward error", e)
}
}
// ── Utils ─────────────────────────────────────────
fun sendRaw(cmd: String) {
try {
outputStream?.write(cmd.toByteArray())
outputStream?.flush()
} catch (e: Exception) {
Log.e(TAG, "Send error", e)
}
}
private fun broadcast(msg: String) {
val intent = Intent(BROADCAST_STATUS).apply {
putExtra("message", msg)
}
sendBroadcast(intent)
}
private fun disconnect() {
running = false
try {
btSocket?.close()
} catch (_: Exception) {}
broadcast("Отключено")
stopSelf()
}
override fun onDestroy() {
disconnect()
super.onDestroy()
}
}
@@ -1,108 +0,0 @@
package ru.elmer.client
import android.Manifest
import android.bluetooth.BluetoothAdapter
import android.bluetooth.BluetoothDevice
import android.content.*
import android.content.pm.PackageManager
import android.os.Build
import android.os.Bundle
import android.os.IBinder
import android.widget.Button
import android.widget.EditText
import android.widget.TextView
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
/**
* Тонкий клиент Elmer — одна кнопка.
* Подключается к ELM327 по Bluetooth, шлёт сырые OBD-ответы на сервер.
*/
class MainActivity : AppCompatActivity() {
private lateinit var btnConnect: Button
private lateinit var tvStatus: TextView
private lateinit var etUrl: EditText
private val btAdapter: BluetoothAdapter? = BluetoothAdapter.getDefaultAdapter()
private var elmDevice: BluetoothDevice? = null
companion object {
const val REQUEST_BT_PERMISSIONS = 1
const val REQUEST_ENABLE_BT = 2
}
private val statusReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
val msg = intent?.getStringExtra("message") ?: return
runOnUiThread { tvStatus.text = msg }
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
btnConnect = findViewById(R.id.btn_connect)
tvStatus = findViewById(R.id.tv_status)
etUrl = findViewById(R.id.et_server_url)
registerReceiver(statusReceiver, IntentFilter(ElmForwardService.BROADCAST_STATUS),
ContextCompat.RECEIVER_NOT_EXPORTED)
btnConnect.setOnClickListener { startDiagnostics() }
}
private fun startDiagnostics() {
if (btAdapter == null) {
tvStatus.text = "❌ Bluetooth не поддерживается"
return
}
// Проверка разрешений (Android 12+)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_CONNECT)
!= PackageManager.PERMISSION_GRANTED
) {
ActivityCompat.requestPermissions(
this,
arrayOf(Manifest.permission.BLUETOOTH_CONNECT, Manifest.permission.BLUETOOTH_SCAN),
REQUEST_BT_PERMISSIONS
)
return
}
}
if (!btAdapter.isEnabled) {
startActivityForResult(Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE), REQUEST_ENABLE_BT)
return
}
// Ищем спаренный ELM327 (обычно название содержит "OBD" или "ELM")
val paired = btAdapter.bondedDevices
elmDevice = paired.find { d ->
d.name.uppercase().let { it.contains("OBD") || it.contains("ELM") }
}
if (elmDevice == null) {
tvStatus.text = "❌ ELM327 не найден. Сопряги устройство в настройках Bluetooth."
return
}
val intent = Intent(this, ElmForwardService::class.java).apply {
action = ElmForwardService.ACTION_CONNECT
putExtra(ElmForwardService.EXTRA_DEVICE_MAC, elmDevice!!.address)
putExtra(ElmForwardService.EXTRA_SERVER_URL,
etUrl.text.toString().ifBlank { "https://obdai.ru/api/v1/raw-obd" })
}
ContextCompat.startForegroundService(this, intent)
tvStatus.text = "⏳ Подключение..."
}
override fun onDestroy() {
unregisterReceiver(statusReceiver)
super.onDestroy()
}
}
@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#16213e"/>
<corners android:radius="8dp"/>
<stroke android:color="#0f3460" android:width="1dp"/>
</shape>
@@ -1,63 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="24dp"
android:gravity="center_horizontal"
android:background="#1a1a2e">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="🔧 Elmer"
android:textSize="32sp"
android:textColor="#ff6b35"
android:layout_marginTop="40dp"
android:layout_marginBottom="8dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Диагностика авто через ИИ"
android:textSize="14sp"
android:textColor="#888888"
android:layout_marginBottom="40dp" />
<EditText
android:id="@+id/et_server_url"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="URL сервера"
android:text="https://obdai.ru/api/v1/raw-obd"
android:textColor="#e0e0e0"
android:textColorHint="#666666"
android:textSize="14sp"
android:padding="12dp"
android:background="@drawable/edit_bg"
android:layout_marginBottom="16dp"
android:inputType="textUri" />
<Button
android:id="@+id/btn_connect"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="🚗 Диагностировать"
android:textSize="18sp"
android:textColor="#ffffff"
android:backgroundTint="#ff6b35"
android:padding="16dp"
android:layout_marginBottom="24dp" />
<TextView
android:id="@+id/tv_status"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Готов к подключению"
android:textSize="16sp"
android:textColor="#e0e0e0"
android:gravity="center"
android:padding="16dp" />
</LinearLayout>
@@ -1,13 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Elmer</string>
<string name="btn_diagnose">🚗 Диагностировать</string>
<string name="connecting">Подключение к ELM327…</string>
<string name="reading">Чтение данных ЭБУ…</string>
<string name="sending">Отправка на сервер…</string>
<string name="done">✅ Готово</string>
<string name="error_bt">❌ Ошибка Bluetooth</string>
<string name="error_server">❌ Ошибка сервера</string>
<string name="server_url_hint">URL сервера</string>
<string name="server_url_default">https://obdai.ru/api/diagnose</string>
</resources>
@@ -1,10 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="Theme.Elmer" parent="Theme.AppCompat.DayNight.NoActionBar">
<item name="colorPrimary">#ff6b35</item>
<item name="colorPrimaryDark">#1a1a2e</item>
<item name="colorAccent">#4ecca3</item>
<item name="android:windowBackground">#1a1a2e</item>
<item name="android:textColor">#e0e0e0</item>
</style>
</resources>
-5
View File
@@ -1,5 +0,0 @@
// Top-level build file
plugins {
id("com.android.application") version "8.2.0" apply false
id("org.jetbrains.kotlin.android") version "1.9.21" apply false
}
-4
View File
@@ -1,4 +0,0 @@
org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
android.useAndroidX=true
kotlin.code.style=official
android.nonTransitiveRClass=true
-32
View File
@@ -1,32 +0,0 @@
// 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")
}
@@ -1,31 +0,0 @@
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);
}
}
}
@@ -1,68 +0,0 @@
/*
* (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;
}
}
@@ -1,24 +0,0 @@
/*
* (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.

Before

Width:  |  Height:  |  Size: 538 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 491 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 710 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 551 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 745 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 605 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 554 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 732 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 821 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 267 B

@@ -1,130 +0,0 @@
/*
* (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());
}
}
@@ -1,70 +0,0 @@
/*
* (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();
}
@@ -1,200 +0,0 @@
/*
* (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);
}
}
@@ -1,94 +0,0 @@
/*
* (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());
}
}
@@ -1,139 +0,0 @@
/*
* (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());
}
}
@@ -1,234 +0,0 @@
/*
* (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();
}
}
}
@@ -1,348 +0,0 @@
/*
* (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);
}
}
@@ -1,324 +0,0 @@
/*
* (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;
}
}
@@ -1,118 +0,0 @@
/*
* (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)));
}
}
@@ -1,120 +0,0 @@
/*
* (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);
}
}
@@ -1,49 +0,0 @@
/*
* (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);
}
}
@@ -1,163 +0,0 @@
/*
* (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));
}
}
@@ -1,85 +0,0 @@
/*
* (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);
}
@@ -1,114 +0,0 @@
/*
* (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));
}
}
@@ -1,57 +0,0 @@
/*
* (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());
}
}
@@ -1,78 +0,0 @@
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);
}
};
}
@@ -1,91 +0,0 @@
/*
* (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);
}
}
@@ -1,328 +0,0 @@
/*
* (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);
}
}
@@ -1,67 +0,0 @@
<?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>
@@ -1,122 +0,0 @@
/*
* (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
}
@@ -1,211 +0,0 @@
<?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>
@@ -1,416 +0,0 @@
/*
* (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());
}
}
@@ -1,224 +0,0 @@
/*
* (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);
}
}
}
}
@@ -1,228 +0,0 @@
<?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>
@@ -1,416 +0,0 @@
/*
* (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);
}
}
@@ -1,88 +0,0 @@
/*
* (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);
}
}
@@ -1,79 +0,0 @@
/*
* (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());
}
}
@@ -1,159 +0,0 @@
/*
* (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;
}
}
@@ -1,411 +0,0 @@
<?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>
@@ -1,630 +0,0 @@
/*
* (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
}
@@ -1,208 +0,0 @@
<?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>
@@ -1,203 +0,0 @@
/*
* (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
}
@@ -1,599 +0,0 @@
<?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>
@@ -1,862 +0,0 @@
/*
* (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
}
@@ -1,6 +0,0 @@
<!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.

Before

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

@@ -1,6 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<body>
Resources for ECU/OBD diagnostic applications
</body>
</html>
@@ -1,6 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<body>
ECU/OBD diagnostic related classes
</body>
</html>
@@ -1,235 +0,0 @@
/*
* (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;
}
}
@@ -1,91 +0,0 @@
/*
* (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
@@ -1,43 +0,0 @@
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 + '!');
}
}
@@ -1,924 +0,0 @@
/**
* (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);
}
}
}
@@ -1,25 +0,0 @@
/*
* (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
@@ -1,15 +0,0 @@
P0002=دائرة التحكم في منظم حجم الوقود المدى/الأداء
P0001=دائرة التحكم في منظم حجم الوقود/مفتوحة
P0003=دائرة التحكم في منظم حجم الوقود منخفضة
P0004=دائرة التحكم في منظم حجم الوقود عالية
P0005=دائرة التحكم في صمام إغلاق الوقود A / مفتوحة
P0006=دائرة التحكم في صمام إغلاق الوقود A منخفضة
P0007=دائرة التحكم في صمام إغلاق الوقود A عالية
U0169=فقد الاتصال بوحدة التحكم في فتحة السقف
U0165=فقد الاتصال بوحدة التحكم في التدفئة والتهوية وتكييف الهواء
U0418=تم استلام بيانات غير صالحة من وحدة التحكم في نظام الفرامل
U0420=تم استلام بيانات غير صالحة من وحدة التحكم في التوجيه المعزز
U0424=تم استلام بيانات غير صالحة من وحدة التحكم في التدفئة والتهوية وتكييف الهواء
U0428=تم استلام بيانات غير صالحة من وحدة مستشعر زاوية التوجيه
U0427=تم استلام بيانات غير صالحة من وحدة التحكم في أمن السيارة
U0426=تم استلام بيانات غير صالحة من وحدة التحكم في نظام منع تشغيل السيارة
@@ -1 +0,0 @@
P0001=Regulador del circuit de control del volum de carburant/obert
@@ -1 +0,0 @@
P0001=Řídicí obvod regulátoru objemu paliva - přerušen
File diff suppressed because it is too large Load Diff
@@ -1,177 +0,0 @@
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
@@ -1,25 +0,0 @@
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
@@ -1,8 +0,0 @@
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
@@ -1,17 +0,0 @@
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
@@ -1,727 +0,0 @@
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
@@ -1,144 +0,0 @@
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
@@ -1,10 +0,0 @@
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
@@ -1,2 +0,0 @@
P0001=Amniniḍ n unezḍay n umlugen n tuzirt isissuɣa / yeldi
P0002=Amniniḍ n unezḍay n umlugen n tuzirt n yidis / tarebbawt
@@ -1,87 +0,0 @@
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 예약됨
@@ -1,17 +0,0 @@
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
@@ -1 +0,0 @@
P0001=ਫਿਊਲ ਵੋਲੀਅਮ ਰੈਗੂਲੇਟਰ ਕੰਟਰੋਲ ਸਰਕਟ/ਓਪਨ
@@ -1,474 +0,0 @@
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

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