pgmfi.org
http://uberdata.pgmfi.org/

[DataLogging] QD3 / ISR Info C#
http://uberdata.pgmfi.org/viewtopic.php?f=54&t=24512
Page 1 of 1

Author:  bmgjet [ Sat Feb 02, 2019 6:03 pm ]
Post subject:  [DataLogging] QD3 / ISR Info C#

Had a bit of a mission set out for myself to get QD3 logging directly to my dyno.
Bits of info were scattered every where so thought id make a post with it all in 1 place.

Here is what I came up with for processing QD3 serial string.
Use it how youd like.

Code:
 using System;
using System.Collections;
using System.Windows.Forms;

namespace QD3_processor
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //String to test
            byte[] byteData =
            {
                0X46, 0X26, 0Xc7, 0X05, 0X05, 0Xed, 0X00, 0X5d, 0X02, 0X74, 0X08, 0X48, 0X00, 0X80, 0Xb1, 0X22, 0X57, 0X0a, 0X49, 0X46, 0X00, 0X93, 0X23, 0X25, 0X22, 0X7c, 0X00, 0Xff, 0Xff, 0X00, 0X93, 0Xa9, 0Xa2, 0X72, 0Xbc, 0X02, 0XA8, 0XA0, 0X00, 0X00, 0X5D
               // 0X46, 0X26, 0X5f, 0X08, 0X02, 0Xed, 0X01, 0X80, 0X08, 0X74, 0X00, 0X65, 0X00, 0X80, 0Xf5, 0X25, 0X57, 0X0a, 0X49, 0X46, 0X00, 0X8f, 0X3f, 0X2b, 0X29, 0X7b, 0X00, 0Xff, 0Xff, 0X00, 0X8f, 0Xa9, 0Xa2, 0X75, 0Xfc, 0X02, 0X00, 0X00, 0X00, 0X00, 0X96
            };

            //Calls decode of QD3 data stream.
            QD3Decode(byteData);

        }

        private void QD3Decode(byte[] byteData)
        {
            byte rpmLowRaw = byteData[2];           // Low Byte of RPM
            byte rpmHighRaw = byteData[3];          // High Byte of RPM
            byte ignRaw = byteData[9];              // Ignition Timing Raw
            byte o2Raw = byteData[11];              // Oxygen Sensor Byte
            byte vtecRaw = byteData[19];            // Vtec Engaged Yes/No
            byte vssRaw = byteData[20];             // Vehicle Speed Sensor Byte
            byte batteryRaw = byteData[21];         // Battery Byte
            float mapRaw = byteData[22];            // Map Sensor Byte
            byte tpsRaw = byteData[24];             // Throttle Position Sensor Byte
            byte iatRaw = byteData[25];             // Intake Air Temp Byte
            byte ectRaw = byteData[33];             // Engine Coolant Temp Byte
            byte injLowRaw= byteData[7];            // Injector low Byte
            byte injHighRaw= byteData[8];           // Injector high Byte
            byte knockraw = byteData[10];              // Knock sensor Byte
            byte cel1 = byteData[36];               // Cel Byte1
            byte cel2 = byteData[37];               // Cel Byte2
            byte cel3 = byteData[38];               // Cel Byte3
            byte cel4 = byteData[39];               // Cel Byte4


            //RPM
            float rpm = 1875000 / ((rpmHighRaw * 256) + rpmLowRaw);

            //Injectors
            double injms = ((((256.0 * injHighRaw ) + injLowRaw) - 24.0) / 4.0 ) / 57;
            double dutycycle = Math.Round(rpm * injms / 1200,0,MidpointRounding.AwayFromZero);


            //Knock retard
            double knock = (0.25 * knockraw);

            //Ignition Advance
            double ign = (0.25 * ignRaw) - 6;
            //O2 sensor voltage 0-5V
            double O2 = o2Raw / 51.0;
            //TPS %
            double TPS = (0.472637 * tpsRaw) - 11.46119;
            //Battery Voltage
            double battery = (26.0 * batteryRaw) / 275.0;
            //Map Voltage
            float mapvolt = mapRaw / 51;
            //Map Mbar
            float map = (1764 / 255) * (mapRaw) * 2 + 6;
            //Map inghg
            double inHg = -10.87 * ((mapRaw) * 5 / 256) + 30.48;

            //vtec code
            var bits = new BitArray(vtecRaw);
            bool vtec = bits[0];

            //Speed kph
            double speed = vssRaw; //Do what ever conversion here

            //IAT C
              double iat = iatRaw;
              iat = iat / 51;
              iat = (0.1423* Math.Pow(iat, 6)) - (2.4938* Math.Pow(iat, 5))  + (17.837* Math.Pow(iat, 4)) - (68.698* Math.Pow(iat, 3)) + (154.69* Math.Pow(iat, 2)) - (232.75* iat) + 284.24;
              iat = ((iat - 32)*5)/9;

            //ECT C
              double ect = ectRaw;
              ect = ect / 51;
              ect = (0.1423 * Math.Pow(ect, 6)) - (2.4938 * Math.Pow(ect, 5)) + (17.837 * Math.Pow(ect, 4)) - (68.698 * Math.Pow(ect, 3)) + (154.69 * Math.Pow(ect, 2)) - (232.75 * ect) + 284.24;
              ect = ((ect - 32) * 5) / 9;


            // CRC CHECKING CODE HERE
            int checksum = byteData[0];
            int x = 0;
            while (x < 39)
            {
                x++;
                checksum = checksum + byteData[x];
            }
            byte calchecksum = (byte)(checksum & 0xff);

            if (calchecksum == byteData[40])
            {
                //Check sum matched code here
                //MessageBox.Show("checksum match");
            }
            else
            {
                //Checksum failed code here.
            }




            // Read error codes
            string errorstring = Reverse(ToBitsString(cel1)) + Reverse(ToBitsString(cel2))  + Reverse(ToBitsString(cel3))  + Reverse(ToBitsString(cel4)); ;
            char[] OBD1DTCL = errorstring.ToCharArray();
            int i = 0;
            while (i < 31)
            {

                if (OBD1DTCL[i].ToString() == "1")
                {
                    //Message box for each code (Code number = i + 1.
                  MessageBox.Show("error code " + (int.Parse(i.ToString())+1).ToString());
                }
                i++;
            }

        }


        //Converts a byte to a 8 bit
        public static string ToBitsString(byte value)
        {
            return Convert.ToString(value, 2).PadLeft(8, '0');
        }


        //Inverts the bit string to make storing error codes as a 0-32 bit array easier.
        public string Reverse(string text)
        {
            if (text == null) return null;
            char[] array = text.ToCharArray();
            Array.Reverse(array);
            return new String(array);
        }


    }
}


Author:  Majinsoftware [ Mon Feb 04, 2019 6:24 pm ]
Post subject:  Re: [DataLogging] QD3 Info C#

Thanks always wanted to work out the cel stuff

Author:  bmgjet [ Wed Feb 20, 2019 1:35 am ]
Post subject:  Re: [DataLogging] QD3 / ISR Info C#

ISR datalogging info (eCtune)

Code:
namespace ISRProcesser
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //String to test
            byte[] byteData =
            {                                                                           //
                0X7E, 0X8F, 0XA7, 0XF9, 0X2E, 0X2E, 0X17, 0X03, 0X01, 0X08, 0X03, 0X00, 0X00, 0X20, 0X00, 0X04, 0X00, 0X56, 0X04, 0XAD, 0X96, 0X08, 0X6D, 0X20, 0X00, 0X80, 0X95, 0X8F, 0X82, 0X00, 0X80, 0XA6, 0X81, 0X80, 0X80, 0X97, 0X80, 0X80, 0X01, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X80, 0X89, 0XAA, 0X00, 0X0D, 0X03, 0XAD
            };
            //Calls decode of ISR data stream.
            ISRDecode(byteData);

        }

        private void ISRDecode(byte[] byteData)
        {
            byte rpmLowRaw = byteData[6];           // Low Byte of RPM
            byte rpmHighRaw = byteData[7];          // High Byte of RPM
            byte ignRaw = byteData[19];              // Ignition Timing Raw
            byte o2Raw = byteData[2];              // Oxygen Sensor Byte
            byte vtecRaw = byteData[23];            // Vtec Engaged Yes/No
            byte vssRaw = byteData[16];             // Vehicle Speed Sensor Byte
            byte batteryRaw = byteData[25];         // Battery Byte
            float mapRaw = byteData[4];            // Map Sensor Byte
            byte tpsRaw = byteData[5];             // Throttle Position Sensor Byte
            byte iatRaw = byteData[1];             // Intake Air Temp Byte
            byte ectRaw = byteData[0];             // Engine Coolant Temp Byte
            byte injLowRaw = byteData[17];            // Injector low Byte
            byte injHighRaw = byteData[18];           // Injector high Byte
            byte knockraw = byteData[10];              // Knock sensor Byte
            byte cel1 = FixMil(byteData[12]);               // Cel Byte1
            byte cel2 = FixMil(byteData[13]);               // Cel Byte2
            byte cel3 = FixMil(byteData[14]);               // Cel Byte3
            byte cel4 = FixMil(byteData[15]);               // Cel Byte4


            //RPM
            float rpm = 1875000 / ((rpmHighRaw * 256) + rpmLowRaw); //valid

            double injms = ((256.0 * injHighRaw) + injLowRaw) * 3.20000004768372 / 1000.0;
            double dutycycle = Math.Round(rpm * injms / 1200, 0, MidpointRounding.AwayFromZero);


            //Knock retard
            double knock = (0.25 * knockraw);

            //Ignition Advance
            double ign = (0.25 * ignRaw) - 6;
            //O2 sensor voltage 0-5V
            double O2 = o2Raw / 51.0;
            //TPS %
            double TPS = (0.472637 * tpsRaw) - 11.46119;
            //Battery Voltage
            double battery = (26.0 * batteryRaw) / 270.0;
            //Map Voltage
            float mapvolt = mapRaw / 51;
            //Map Mbar
            float map = (1764 / 255) * (mapRaw) * 2 + 6;
            //Map inghg
            double inHg = -10.87 * ((mapRaw) * 5 / 256) + 30.48;

            //vtec code
            var bits = new BitArray(vtecRaw);
            bool vtec = bits[0];

            //Speed kph
            double speed = vssRaw; //Do what ever conversion here for ratio of wheels.

            //IAT C
            double iat = iatRaw;
            iat = iat / 51;
            iat = (0.1423 * Math.Pow(iat, 6)) - (2.4938 * Math.Pow(iat, 5)) + (17.837 * Math.Pow(iat, 4)) - (68.698 * Math.Pow(iat, 3)) + (154.69 * Math.Pow(iat, 2)) - (232.75 * iat) + 284.24;
            iat = ((iat - 32) * 5) / 9;

            //ECT C
            double ect = ectRaw;
            ect = ect / 51;
            ect = (0.1423 * Math.Pow(ect, 6)) - (2.4938 * Math.Pow(ect, 5)) + (17.837 * Math.Pow(ect, 4)) - (68.698 * Math.Pow(ect, 3)) + (154.69 * Math.Pow(ect, 2)) - (232.75 * ect) + 284.24;
            ect = ((ect - 32) * 5) / 9;

            // CRC CHECKING CODE HERE
            int checksum = byteData[0];
            int x = 0;
            while (x < 50)
            {
                x++;
                checksum = checksum + byteData[x];
            }
            byte calchecksum = (byte)(checksum & 0xff);
            byte realchecksum = (byte)(byteData[51] & 0xff);

            if (calchecksum == realchecksum)
            {
                //Check sum matched code here
                //MessageBox.Show("checksum match");
            }
            else
            {
                //Checksum failed code here.
            }




            // Read error codes
            string errorstring = Reverse(ToBitsString(FixMil(cel1))) + Reverse(ToBitsString(cel2)) + Reverse(ToBitsString(cel3)) + Reverse(ToBitsString(cel4)); ;
            char[] OBD1DTCL = errorstring.ToCharArray();
            int i = 0;
            while (i < 31)
            {


                if (OBD1DTCL[i].ToString() == "1")
                {
                    int milfix = i + 1;
                    switch (milfix)
                    {
                        case 24:
                            MessageBox.Show("30");
                            break;
                        case 25:
                            MessageBox.Show("31");
                            break;
                        case 26:
                            MessageBox.Show("36");
                            break;
                        case 27:
                            MessageBox.Show("41");
                            break;
                        case 28:
                            MessageBox.Show("43");
                            break;
                        case 29:
                            MessageBox.Show("45");
                            break;
                        case 30:
                            MessageBox.Show("48");
                            break;
                        default:
                            MessageBox.Show((i + 1).ToString());
                            break;


                    }
                }
                i++;
            }
         
        }

        public byte FixMil(byte Value)
        {
            switch (Value)
            {
                case 0x18:
                    return 0x30;
                case 0x19:
                    return 0x1f;
                case 0x1a:
                    return 0x24;
                case 0x1b:
                    return 0x29;
                case 0x1c:
                    return 0x2b;
                default:
                    return Value;
            }

        }


        //Converts a byte to a 8 bit
            public static string ToBitsString(byte value)
        {
            return Convert.ToString(value, 2).PadLeft(8, '0');
        }


        //Inverts the bit string to make storing error codes as a 0-32 bit array easier.
        public string Reverse(string text)
        {
            if (text == null) return null;
            char[] array = text.ToCharArray();
            Array.Reverse(array);
            return new String(array);
        }


    }
}

Page 1 of 1 All times are UTC - 5 hours [ DST ]
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/