pgmfi.org

Hacking up Honda's ECU
It is currently Thu Aug 22, 2019 4:58 am

All times are UTC - 5 hours [ DST ]





Post new topic Reply to topic  [ 3 posts ] 
Author Message
PostPosted: Sat Feb 02, 2019 6:03 pm 
Offline

Joined: Wed Apr 27, 2011 2:30 am
Posts: 5
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);
        }


    }
}



Last edited by bmgjet on Wed Feb 20, 2019 1:34 am, edited 1 time in total.

Top
 Profile  
Reply with quote  
PostPosted: Mon Feb 04, 2019 6:24 pm 
Offline

Joined: Thu Jun 12, 2008 2:38 am
Posts: 33
Location: OZ
Thanks always wanted to work out the cel stuff


Top
 Profile  
Reply with quote  
PostPosted: Wed Feb 20, 2019 1:35 am 
Offline

Joined: Wed Apr 27, 2011 2:30 am
Posts: 5
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);
        }


    }
}


Top
 Profile  
Reply with quote  
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 3 posts ] 

All times are UTC - 5 hours [ DST ]


Who is online

Users browsing this forum: No registered users and 3 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  


Powered by phpBB® Forum Software © phpBB Group