Skip to content

Instantly share code, notes, and snippets.

@brianbri6
Forked from cjdell/Program.cs
Created June 1, 2022 04:27
Show Gist options
  • Select an option

  • Save brianbri6/671a8ab96d0f52e6d60182e9eba4723b to your computer and use it in GitHub Desktop.

Select an option

Save brianbri6/671a8ab96d0f52e6d60182e9eba4723b to your computer and use it in GitHub Desktop.

Revisions

  1. @cjdell cjdell revised this gist Apr 26, 2022. 1 changed file with 4 additions and 28 deletions.
    32 changes: 4 additions & 28 deletions Program.cs
    Original file line number Diff line number Diff line change
    @@ -22,7 +22,6 @@ static void Main(string[] args)
    Channel channel1;
    int filter1;
    int filter2;
    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;
    @@ -39,37 +38,12 @@ static void Main(string[] args)
    Console.WriteLine("PTIoctl");
    // 32768 = CAN_MIXED_FORMAT
    channel1.SetConfig(new[] { new SConfig((Parameter)32768, 1) });
    Console.WriteLine("PTStartPeriodicMsg");
    // 192 = ISO15765_ADDR_TYPE + ISO15765_FRAME_PAD
    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");
    // 64 = ISO15765_FRAME_PAD
    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(2000)\n");
    Thread.Sleep(2000);
    Console.WriteLine("PTWriteMsgs");
    Console.WriteLine(">>> 00 00 07 e4 27 01");
    // 64 = ISO15765_FRAME_PAD
    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(2000)\n");
    Thread.Sleep(2000);
    Console.WriteLine("PTWriteMsgs");
    Console.WriteLine(">>> 00 00 07 e4 27 01");
    // 64 = ISO15765_FRAME_PAD
    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(2000)\n");
    Thread.Sleep(2000);
    @@ -100,10 +74,12 @@ static void Main(string[] args)
    Console.WriteLine("Pause");
    Console.WriteLine("Sleep(2000)\n");
    Thread.Sleep(2000);

    Console.WriteLine("PTStopMsgFilter");
    channel1.StopMsgFilter(filter1);
    Console.WriteLine("PTStopMsgFilter");
    channel1.StopMsgFilter(filter2);

    Console.WriteLine("PTDisconnect");
    channel1.Dispose();

  2. @cjdell cjdell revised this gist Apr 19, 2022. 1 changed file with 18 additions and 137 deletions.
    155 changes: 18 additions & 137 deletions Program.cs
    Original file line number Diff line number Diff line change
    @@ -22,8 +22,6 @@ static void Main(string[] args)
    Channel channel1;
    int filter1;
    int filter2;
    int filter3;
    int filter4;
    int msg1;

    // Change this line is using something different to the VXDIAG VCX Nano!
    @@ -36,137 +34,72 @@ static void Main(string[] args)
    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");
    // 6 = ISO15765
    channel1 = device1.GetChannel((Protocol)6, (Baud)500000, 0);
    Console.WriteLine("PTIoctl");
    // 32768 = CAN_MIXED_FORMAT
    channel1.SetConfig(new[] { new SConfig((Parameter)32768, 1) });
    Console.WriteLine("PTStartPeriodicMsg");
    // 192 = ISO15765_ADDR_TYPE + ISO15765_FRAME_PAD
    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");
    // 64 = ISO15765_FRAME_PAD
    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("Sleep(2000)\n");
    Thread.Sleep(2000);
    Console.WriteLine("PTWriteMsgs");
    Console.WriteLine(">>> 00 00 07 e4 27 01");
    // 64 = ISO15765_FRAME_PAD
    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("Sleep(2000)\n");
    Thread.Sleep(2000);
    Console.WriteLine("PTWriteMsgs");
    Console.WriteLine(">>> 00 00 07 e4 27 01");
    // 64 = ISO15765_FRAME_PAD
    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("Sleep(2000)\n");
    Thread.Sleep(2000);
    Console.WriteLine("PTWriteMsgs");
    Console.WriteLine(">>> 00 00 07 e4 27 01");
    // 64 = ISO15765_FRAME_PAD
    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");
    // 64 = ISO15765_FRAME_PAD
    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");
    // 64 = ISO15765_FRAME_PAD
    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");
    // 64 = ISO15765_FRAME_PAD
    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("Sleep(2000)\n");
    Thread.Sleep(2000);
    Console.WriteLine("PTStopMsgFilter");
    channel1.StopMsgFilter(filter1);
    Console.WriteLine("PTStopMsgFilter");
    @@ -178,33 +111,6 @@ static void Main(string[] args)
    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;
    @@ -231,31 +137,6 @@ static void ReadUntilMessage(Channel c, byte[] message, int timeout)
    }
    }

    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();
  3. @cjdell cjdell created this gist Jan 18, 2022.
    284 changes: 284 additions & 0 deletions Program.cs
    Original file line number Diff line number Diff line change
    @@ -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());
    }

    }
    }