|
|
@@ -0,0 +1,284 @@ |
|
|
/* This is an experimental script which I used to successfully clear the "Service High Voltage Charging System" message which can occur due to a loss of isolation. |
|
|
* Previously I had to pay frequently to access the expensive SPS programming system to clear this code whilst attempting to resolve the underlying cause. |
|
|
* This script was generated by a tool I developed to analyse J2534 log files. |
|
|
* This could work for other cars but I can't comment on success. Please do not run this unless you understand the consequences! |
|
|
* I intend to convert to a version that will work with ELM327 once I learn how these work. |
|
|
* The program requires the J2534-Sharp library as a dependency. |
|
|
* https://github.com/BrianHumlicek/J2534-Sharp |
|
|
*/ |
|
|
using System; |
|
|
using System.Linq; |
|
|
using System.Text; |
|
|
using System.Threading; |
|
|
using SAE.J2534; |
|
|
|
|
|
namespace J5234Examples |
|
|
{ |
|
|
class Program |
|
|
{ |
|
|
static void Main(string[] args) |
|
|
{ |
|
|
Device device1; |
|
|
Channel channel1; |
|
|
int filter1; |
|
|
int filter2; |
|
|
int filter3; |
|
|
int filter4; |
|
|
int msg1; |
|
|
|
|
|
// Change this line is using something different to the VXDIAG VCX Nano! |
|
|
string DllFileName = APIFactory.GetAPIinfo().First(api => api.Name.Contains("VXDIAG")).Filename; |
|
|
API API = APIFactory.GetAPI(DllFileName); |
|
|
|
|
|
Console.WriteLine("PTOpen"); |
|
|
device1 = API.GetDevice(); |
|
|
Console.WriteLine("PTReadVersion"); |
|
|
Console.WriteLine(device1.FirmwareVersion); |
|
|
|
|
|
Console.WriteLine("PTConnect"); |
|
|
channel1 = device1.GetChannel((Protocol)5, (Baud)500000, 0); |
|
|
Console.WriteLine("PTIoctl"); |
|
|
channel1.SetConfig(new[] { new SConfig((Parameter)3, 1) }); |
|
|
Console.WriteLine("PTStartMsgFilter"); |
|
|
filter1 = channel1.StartMsgFilter(new MessageFilter() { FilterType = (Filter)1, Mask = new byte[] { 0x00, 0x00, 0xff, 0xe0 }, Pattern = new byte[] { 0x00, 0x00, 0x06, 0x40 }, FlowControl = null }); |
|
|
Console.WriteLine("PTStartMsgFilter"); |
|
|
filter2 = channel1.StartMsgFilter(new MessageFilter() { FilterType = (Filter)1, Mask = new byte[] { 0x00, 0x00, 0xff, 0xf8 }, Pattern = new byte[] { 0x00, 0x00, 0x07, 0xe8 }, FlowControl = null }); |
|
|
Console.WriteLine("PTWriteMsgs"); |
|
|
Console.WriteLine(">>> 00 00 01 01 fe 01 20 00 00 00 00 00"); |
|
|
channel1.SendMessages(new[] { new Message(new byte[] { 0x00, 0x00, 0x01, 0x01, 0xfe, 0x01, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00 }, (TxFlag)64) }); |
|
|
Console.WriteLine("ReadBlock"); |
|
|
ReadUntilEmpty(channel1, 1500); |
|
|
Console.WriteLine("Pause"); |
|
|
Console.WriteLine("Sleep(1012)\n"); |
|
|
Thread.Sleep(1012); |
|
|
Console.WriteLine("PTStartMsgFilter"); |
|
|
filter3 = channel1.StartMsgFilter(new MessageFilter() { FilterType = (Filter)1, Mask = new byte[] { 0x00, 0x00, 0xff, 0xe0 }, Pattern = new byte[] { 0x00, 0x00, 0x06, 0x40 }, FlowControl = null }); |
|
|
Console.WriteLine("PTStartMsgFilter"); |
|
|
filter4 = channel1.StartMsgFilter(new MessageFilter() { FilterType = (Filter)1, Mask = new byte[] { 0x00, 0x00, 0xff, 0xf8 }, Pattern = new byte[] { 0x00, 0x00, 0x07, 0xe8 }, FlowControl = null }); |
|
|
Console.WriteLine("PTWriteMsgs"); |
|
|
Console.WriteLine(">>> 00 00 01 01 fe 01 3e 00 00 00 00 00"); |
|
|
channel1.SendMessages(new[] { new Message(new byte[] { 0x00, 0x00, 0x01, 0x01, 0xfe, 0x01, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00 }, (TxFlag)64) }); |
|
|
Console.WriteLine("ReadBlock"); |
|
|
ReadMessageCount(channel1, 1, 500); |
|
|
Console.WriteLine("Pause"); |
|
|
Console.WriteLine("Sleep(45)\n"); |
|
|
Thread.Sleep(45); |
|
|
Console.WriteLine("PTWriteMsgs"); |
|
|
Console.WriteLine(">>> 00 00 01 01 fe 02 1a b0 00 00 00 00"); |
|
|
channel1.SendMessages(new[] { new Message(new byte[] { 0x00, 0x00, 0x01, 0x01, 0xfe, 0x02, 0x1a, 0xb0, 0x00, 0x00, 0x00, 0x00 }, (TxFlag)64) }); |
|
|
Console.WriteLine("ReadBlock"); |
|
|
ReadUntilMessageEnding(channel1, new byte[] { 0xaa, 0xaa, 0xaa, 0xaa }, 1500); |
|
|
Console.WriteLine("Pause"); |
|
|
Console.WriteLine("Sleep(31)\n"); |
|
|
Thread.Sleep(31); |
|
|
Console.WriteLine("PTWriteMsgs"); |
|
|
Console.WriteLine(">>> 00 00 01 01 fe 01 3e 00 00 00 00 00"); |
|
|
channel1.SendMessages(new[] { new Message(new byte[] { 0x00, 0x00, 0x01, 0x01, 0xfe, 0x01, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00 }, (TxFlag)0) }); |
|
|
Console.WriteLine("Pause"); |
|
|
Console.WriteLine("Sleep(32)\n"); |
|
|
Thread.Sleep(32); |
|
|
Console.WriteLine("ReadBlock"); |
|
|
ReadUntilEmpty(channel1, 1500); |
|
|
Console.WriteLine("Pause"); |
|
|
Console.WriteLine("Sleep(47)\n"); |
|
|
Thread.Sleep(47); |
|
|
Console.WriteLine("PTWriteMsgs"); |
|
|
Console.WriteLine(">>> 00 00 01 01 fe 01 3e 00 00 00 00 00"); |
|
|
channel1.SendMessages(new[] { new Message(new byte[] { 0x00, 0x00, 0x01, 0x01, 0xfe, 0x01, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00 }, (TxFlag)0) }); |
|
|
Console.WriteLine("Pause"); |
|
|
Console.WriteLine("Sleep(45)\n"); |
|
|
Thread.Sleep(45); |
|
|
Console.WriteLine("PTDisconnect"); |
|
|
channel1.Dispose(); |
|
|
|
|
|
Console.WriteLine("PTConnect"); |
|
|
channel1 = device1.GetChannel((Protocol)6, (Baud)500000, 0); |
|
|
Console.WriteLine("PTIoctl"); |
|
|
channel1.SetConfig(new[] { new SConfig((Parameter)32768, 1) }); |
|
|
Console.WriteLine("PTStartPeriodicMsg"); |
|
|
msg1 = channel1.StartPeriodicMessage(new PeriodicMessage(1600, new byte[] { 0x00, 0x00, 0x01, 0x01, 0xfe, 0x3e }, (TxFlag)192)); |
|
|
Console.WriteLine("PTStartMsgFilter"); |
|
|
filter1 = channel1.StartMsgFilter(new MessageFilter() { FilterType = (Filter)3, Mask = new byte[] { 0xff, 0xff, 0xff, 0xff }, Pattern = new byte[] { 0x00, 0x00, 0x07, 0xec }, FlowControl = new byte[] { 0x00, 0x00, 0x07, 0xe4 } }); |
|
|
Console.WriteLine("PTStartMsgFilter"); |
|
|
filter2 = channel1.StartMsgFilter(new MessageFilter() { FilterType = (Filter)1, Mask = new byte[] { 0xff, 0xff, 0xff, 0xff }, Pattern = new byte[] { 0x00, 0x00, 0x05, 0xec }, FlowControl = null }); |
|
|
Console.WriteLine("PTWriteMsgs"); |
|
|
Console.WriteLine(">>> 00 00 07 e4 27 01"); |
|
|
channel1.SendMessages(new[] { new Message(new byte[] { 0x00, 0x00, 0x07, 0xe4, 0x27, 0x01 }, (TxFlag)64) }); |
|
|
Console.WriteLine("ReadBlock"); |
|
|
ReadUntilMessage(channel1, new byte[] { 0x00, 0x00, 0x07, 0xec, 0x7f, 0x27, 0x37 }, 1500); |
|
|
Console.WriteLine("Pause"); |
|
|
Console.WriteLine("Sleep(2014)\n"); |
|
|
Thread.Sleep(2014); |
|
|
Console.WriteLine("PTWriteMsgs"); |
|
|
Console.WriteLine(">>> 00 00 07 e4 27 01"); |
|
|
channel1.SendMessages(new[] { new Message(new byte[] { 0x00, 0x00, 0x07, 0xe4, 0x27, 0x01 }, (TxFlag)64) }); |
|
|
Console.WriteLine("ReadBlock"); |
|
|
ReadUntilMessage(channel1, new byte[] { 0x00, 0x00, 0x07, 0xec, 0x7f, 0x27, 0x37 }, 1500); |
|
|
Console.WriteLine("Pause"); |
|
|
Console.WriteLine("Sleep(2008)\n"); |
|
|
Thread.Sleep(2008); |
|
|
Console.WriteLine("PTWriteMsgs"); |
|
|
Console.WriteLine(">>> 00 00 07 e4 27 01"); |
|
|
channel1.SendMessages(new[] { new Message(new byte[] { 0x00, 0x00, 0x07, 0xe4, 0x27, 0x01 }, (TxFlag)64) }); |
|
|
Console.WriteLine("ReadBlock"); |
|
|
ReadUntilMessage(channel1, new byte[] { 0x00, 0x00, 0x07, 0xec, 0x7f, 0x27, 0x37 }, 1500); |
|
|
Console.WriteLine("Pause"); |
|
|
Console.WriteLine("Sleep(2007)\n"); |
|
|
Thread.Sleep(2007); |
|
|
Console.WriteLine("PTWriteMsgs"); |
|
|
Console.WriteLine(">>> 00 00 07 e4 27 01"); |
|
|
channel1.SendMessages(new[] { new Message(new byte[] { 0x00, 0x00, 0x07, 0xe4, 0x27, 0x01 }, (TxFlag)64) }); |
|
|
Console.WriteLine("ReadBlock"); |
|
|
ReadUntilMessage(channel1, new byte[] { 0x00, 0x00, 0x07, 0xec, 0x67, 0x01, 0x58, 0xe3 }, 1500); |
|
|
Console.WriteLine("PTWriteMsgs"); |
|
|
Console.WriteLine(">>> 00 00 07 e4 27 02 75 6c"); |
|
|
channel1.SendMessages(new[] { new Message(new byte[] { 0x00, 0x00, 0x07, 0xe4, 0x27, 0x02, 0x75, 0x6c }, (TxFlag)64) }); |
|
|
Console.WriteLine("ReadBlock"); |
|
|
ReadUntilMessage(channel1, new byte[] { 0x00, 0x00, 0x07, 0xec, 0x67, 0x02 }, 1500); |
|
|
Console.WriteLine("PTWriteMsgs"); |
|
|
Console.WriteLine(">>> 00 00 07 e4 ae fc 02 00 00 46 00"); |
|
|
channel1.SendMessages(new[] { new Message(new byte[] { 0x00, 0x00, 0x07, 0xe4, 0xae, 0xfc, 0x02, 0x00, 0x00, 0x46, 0x00 }, (TxFlag)64) }); |
|
|
Console.WriteLine("ReadBlock"); |
|
|
ReadUntilMessage(channel1, new byte[] { 0x00, 0x00, 0x07, 0xec, 0xee, 0xfc }, 1500); |
|
|
Console.WriteLine("PTWriteMsgs"); |
|
|
Console.WriteLine(">>> 00 00 07 e4 ae fc 02 00 00 49 00"); |
|
|
channel1.SendMessages(new[] { new Message(new byte[] { 0x00, 0x00, 0x07, 0xe4, 0xae, 0xfc, 0x02, 0x00, 0x00, 0x49, 0x00 }, (TxFlag)64) }); |
|
|
Console.WriteLine("ReadBlock"); |
|
|
ReadUntilMessage(channel1, new byte[] { 0x00, 0x00, 0x07, 0xec, 0xee, 0xfc }, 7000); |
|
|
Console.WriteLine("PTWriteMsgs"); |
|
|
Console.WriteLine(">>> 00 00 07 e4 3b 90 31 47 30 52 38 36 45 34 32 43 55 31 31 34 36 33 38"); |
|
|
channel1.SendMessages(new[] { new Message(new byte[] { 0x00, 0x00, 0x07, 0xe4, 0x3b, 0x90, 0x31, 0x47, 0x30, 0x52, 0x38, 0x36, 0x45, 0x34, 0x32, 0x43, 0x55, 0x31, 0x31, 0x34, 0x36, 0x33, 0x38 }, (TxFlag)64) }); |
|
|
Console.WriteLine("ReadBlock"); |
|
|
ReadUntilMessage(channel1, new byte[] { 0x00, 0x00, 0x07, 0xe4 }, 10000); |
|
|
Console.WriteLine("ReadBlock"); |
|
|
ReadUntilMessage(channel1, new byte[] { 0x00, 0x00, 0x07, 0xec, 0x7b, 0x90 }, 1500); |
|
|
Console.WriteLine("PTWriteMsgs"); |
|
|
Console.WriteLine(">>> 00 00 07 e4 3b 98 4f 33 30 30 30 39 33 38 36 31"); |
|
|
channel1.SendMessages(new[] { new Message(new byte[] { 0x00, 0x00, 0x07, 0xe4, 0x3b, 0x98, 0x4f, 0x33, 0x30, 0x30, 0x30, 0x39, 0x33, 0x38, 0x36, 0x31 }, (TxFlag)64) }); |
|
|
Console.WriteLine("ReadBlock"); |
|
|
ReadUntilMessage(channel1, new byte[] { 0x00, 0x00, 0x07, 0xe4 }, 10000); |
|
|
Console.WriteLine("ReadBlock"); |
|
|
ReadUntilMessage(channel1, new byte[] { 0x00, 0x00, 0x07, 0xec, 0x7b, 0x98 }, 1500); |
|
|
Console.WriteLine("PTWriteMsgs"); |
|
|
Console.WriteLine(">>> 00 00 07 e4 3b 99 20 22 01 01"); |
|
|
channel1.SendMessages(new[] { new Message(new byte[] { 0x00, 0x00, 0x07, 0xe4, 0x3b, 0x99, 0x20, 0x22, 0x01, 0x01 }, (TxFlag)64) }); |
|
|
Console.WriteLine("ReadBlock"); |
|
|
ReadUntilMessage(channel1, new byte[] { 0x00, 0x00, 0x07, 0xec, 0x7b, 0x99 }, 1500); |
|
|
Console.WriteLine("Pause"); |
|
|
Console.WriteLine("Sleep(2063)\n"); |
|
|
Thread.Sleep(2063); |
|
|
Console.WriteLine("PTStopMsgFilter"); |
|
|
channel1.StopMsgFilter(filter1); |
|
|
Console.WriteLine("PTStopMsgFilter"); |
|
|
channel1.StopMsgFilter(filter2); |
|
|
Console.WriteLine("PTDisconnect"); |
|
|
channel1.Dispose(); |
|
|
|
|
|
Console.WriteLine("PTClose"); |
|
|
device1.Dispose(); |
|
|
} |
|
|
|
|
|
static void ReadUntilEmpty(Channel c, int timeout) |
|
|
{ |
|
|
while (true) |
|
|
{ |
|
|
Console.WriteLine("Purging read buffer until empty..."); |
|
|
var results = c.GetMessages(1, timeout); |
|
|
PrintBytes(results); |
|
|
if (results.Result == ResultCode.BUFFER_EMPTY) return; |
|
|
} |
|
|
} |
|
|
|
|
|
static void ReadMessageCount(Channel c, int num, int timeout) |
|
|
{ |
|
|
while (num > 0) |
|
|
{ |
|
|
Console.WriteLine("Purging read buffer. Remaining " + num); |
|
|
var results = c.GetMessages(1, timeout); |
|
|
PrintBytes(results); |
|
|
if (results.Result == ResultCode.BUFFER_EMPTY) |
|
|
{ |
|
|
Console.WriteLine("Waiting for message..."); |
|
|
continue; |
|
|
} |
|
|
num--; |
|
|
} |
|
|
} |
|
|
|
|
|
static void ReadUntilMessage(Channel c, byte[] message, int timeout) |
|
|
{ |
|
|
var attempts = 5; |
|
|
Console.WriteLine("ReadUntilMessage: " + BytesToHexString(message)); |
|
|
while (true) |
|
|
{ |
|
|
var results = c.GetMessages(1, timeout); |
|
|
PrintBytes(results); |
|
|
if (results.Result == ResultCode.BUFFER_EMPTY) |
|
|
{ |
|
|
Console.WriteLine("Waiting for message..."); |
|
|
attempts--; |
|
|
if (attempts == 0) return; |
|
|
continue; |
|
|
} |
|
|
if (results.Messages.Length == 1) |
|
|
{ |
|
|
if (results.Messages[0].Data.SequenceEqual(message)) |
|
|
{ |
|
|
Console.WriteLine("FOUND\n"); |
|
|
return; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
static void ReadUntilMessageEnding(Channel c, byte[] message, int timeout) |
|
|
{ |
|
|
Console.WriteLine("ReadUntilMessageEnding: " + BytesToHexString(message)); |
|
|
while (true) |
|
|
{ |
|
|
var results = c.GetMessages(1, timeout); |
|
|
PrintBytes(results); |
|
|
if (results.Result == ResultCode.BUFFER_EMPTY) |
|
|
{ |
|
|
Console.WriteLine("Waiting for message ending..."); |
|
|
continue; |
|
|
} |
|
|
if (results.Messages.Length == 1) |
|
|
{ |
|
|
if (results.Messages[0].Data.Length >= message.Length && |
|
|
results.Messages[0].Data.Skip(results.Messages[0].Data.Length - message.Length).SequenceEqual(message) |
|
|
) |
|
|
{ |
|
|
Console.WriteLine("FOUND\n"); |
|
|
return; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
static string BytesToHexString(byte[] bytes) |
|
|
{ |
|
|
StringBuilder builder = new StringBuilder(); |
|
|
for (int i = 0; i < bytes.Length; i++) |
|
|
{ |
|
|
builder.Append(bytes[i].ToString("x2")); |
|
|
} |
|
|
return builder.ToString(); |
|
|
} |
|
|
|
|
|
static void PrintBytes(GetMessageResults results) |
|
|
{ |
|
|
StringBuilder builder = new StringBuilder(); |
|
|
foreach (var msg in results.Messages) |
|
|
{ |
|
|
for (int i = 0; i < msg.Data.Length; i++) |
|
|
{ |
|
|
builder.Append(msg.Data[i].ToString("x2")); |
|
|
} |
|
|
builder.Append("\n"); |
|
|
} |
|
|
Console.WriteLine(builder.ToString()); |
|
|
} |
|
|
|
|
|
} |
|
|
} |