Exemple #1
0
        /// <summary>
        /// This method sends a KWPRequest and returns a KWPReply.
        /// </summary>
        /// <param name="a_request">The request.</param>
        /// <param name="a_reply">The reply.</param>
        /// <returns>KWPResult</returns>
        private KWPResult sendRequest(KWPRequest a_request, out KWPReply a_reply, int expectedLength)
        {
            int       _maxSendRetries = 3;
            KWPResult _kwpResult      = KWPResult.Timeout;

            LogDataString("sendRequest");

            KWPReply      reply = new KWPReply();
            RequestResult result;

            a_reply = new KWPReply();
            //<GS-11012010> was allemaal 1000
            int keepAliveTimeout = 1000;

            //Console.WriteLine("Checking KWP device open");
            if (!m_kwpDevice.isOpen())
            {
                return(KWPResult.DeviceNotConnected);
            }

            // reset the timer for keep alive (set to 1 seconds now)
            if (stateTimer == null)
            {
                stateTimer = new System.Threading.Timer(sendKeepAlive, new Object(), keepAliveTimeout, keepAliveTimeout);
            }
            stateTimer.Change(keepAliveTimeout, keepAliveTimeout);

            m_requestMutex.WaitOne();
            int _retryCount = 0;

            result = RequestResult.Unknown; // <GS-11022010>
            while (_retryCount < _maxSendRetries && result != RequestResult.NoError)
            {
                LogDataString(a_request.ToString());
                result = m_kwpDevice.sendRequest(a_request, out reply);
                if ((int)reply.getLength() != expectedLength)
                {
                    result = RequestResult.InvalidLength;
                }
                if (result == RequestResult.NoError)
                {
                    a_reply = reply;
                    LogDataString(reply.ToString());
                    LogDataString(""); // empty line
                    m_requestMutex.ReleaseMutex();
                    //return KWPResult.OK;
                    _kwpResult = KWPResult.OK;
                }
                else
                {
                    LogDataString("Timeout in KWPHandler::sendRequest");
                    m_requestMutex.ReleaseMutex();
                    //return KWPResult.Timeout;
                    _kwpResult = KWPResult.Timeout;
                }
            }
            return(_kwpResult);
        }
Exemple #2
0
        public KWPResult sendEraseMemorySpaceRequest(Int32 StartAddress, Int32 Length)
        {
            /*02 FLASH memory erasure
             * 1 start address (high byte)
             * 2 start address (middle byte)
             * 3 start address (low byte)
             * 4 stop address (high byte)
             * 5 stop address (middle byte)
             * 6 stop address (low byte)
             */
            Int32 StopAddress = StartAddress + Length;

            LogDataString("sendEraseRequest");

            KWPReply  reply  = new KWPReply();
            KWPReply  reply2 = new KWPReply();
            KWPResult result = KWPResult.Timeout;
            int       i      = 0;

            //First erase message. Up to 5 retries.
            //Mode = 0x31
            //PID = 0x51
            //Expected result is 0x71
            byte[] a_data = new byte[6];
            int    bt     = 0;

            //a_data[0] = (byte)(StartAddress >> 24);
            a_data[bt++] = (byte)(StartAddress >> 16);
            a_data[bt++] = (byte)(StartAddress >> 8);
            a_data[bt++] = (byte)(StartAddress);
            //a_data[4] = (byte)(Length >> 24);
            a_data[bt++] = (byte)(StopAddress >> 16);
            a_data[bt++] = (byte)(StopAddress >> 8);
            a_data[bt++] = (byte)(StopAddress);

            requestSequrityAccess(true);
            KWPRequest req = new KWPRequest(0x31, 0x50, a_data);

            result = sendRequest(req, out reply);
            Console.WriteLine("Erase(1) " + reply.ToString());

            /*if (result != KWPResult.OK)
             *  return result;
             * System.Threading.Thread.Sleep(10000);
             * result = sendRequest(new KWPRequest(0x31, 0x53, a_data), out reply);
             * Console.WriteLine("Erase(2:" + i.ToString() + ") " + reply.ToString());
             */
            if (result != KWPResult.OK)
            {
                return(result);
            }

            result = sendRequest(new KWPRequest(0x3E, 0x50), out reply2); // tester present???
            Console.WriteLine("reply on exit " + reply2.ToString());

            return(result);
        }
Exemple #3
0
        public void GetECUInfo()
        {
            string vin;
            string immo;
            string engineType;
            string swVersion;
            float  e85level;

            KWPResult res = kwpHandler.getVIN(out vin);

            if (res == KWPResult.OK)
            {
                CastInfoEvent("VIN: " + vin, ActivityType.ConvertingFile);
            }
            else if (res == KWPResult.DeviceNotConnected)
            {
                CastInfoEvent("VIN: not connected", ActivityType.ConvertingFile);
            }
            else
            {
                CastInfoEvent("VIN: timeout", ActivityType.ConvertingFile);
            }
            res = kwpHandler.getImmo(out immo);
            if (res == KWPResult.OK)
            {
                CastInfoEvent("Immo: " + immo, ActivityType.ConvertingFile);
            }
            res = kwpHandler.getEngineType(out engineType);
            if (res == KWPResult.OK)
            {
                CastInfoEvent("Engine type: :" + engineType, ActivityType.ConvertingFile);
            }
            res = kwpHandler.getSwVersion(out swVersion);
            if (res == KWPResult.OK)
            {
                CastInfoEvent("Software version: " + swVersion, ActivityType.ConvertingFile);
            }
            res = kwpHandler.getE85Level(out e85level);
            if (res == KWPResult.OK)
            {
                CastInfoEvent("E85 : " + e85level + "%", ActivityType.ConvertingFile);
            }
        }
Exemple #4
0
        /// <summary>
        /// This method send a request for reading a symbol.
        /// </summary>
        /// <param name="a_address">The symbol number to read [0..0xFFFF-1].</param>
        /// <returns></returns>
        public bool setSymbolRequest(uint a_symbolNumber)
        {
            LogDataString("setSymbolRequest");

            KWPReply  reply  = new KWPReply();
            KWPResult result = KWPResult.Timeout;

            byte[] symbolNumber = new byte[5];
            //First two bytes should be zero
            symbolNumber[0] = 0;
            symbolNumber[1] = 0;
            symbolNumber[2] = 0x80;
            //set symbol number (byte 2 to 3);
            symbolNumber[3] = (byte)(a_symbolNumber >> 8);
            symbolNumber[4] = (byte)(a_symbolNumber);
            //<GS-11022010>
            // check result .. it should be 2 bytes long
            int _retryCount = 0;

            while (_retryCount++ < 3 && result != KWPResult.OK)
            {
                //result = sendRequest(new KWPRequest(0x2C, 0xF0, 0x03, symbolNumber), out reply);
                result = sendRequest(new KWPRequest(0x2C, 0xF0, 0x03, symbolNumber), out reply /*, 2*/);
                if (reply.getLength() != 2)
                {
                    result = KWPResult.Timeout;
                    LogDataString("Got wrong response on sendRequest in setSymbolRequest, len = " + reply.getLength().ToString("D2"));
                    Console.WriteLine("Got wrong response on sendRequest in setSymbolRequest, len = " + reply.getLength().ToString("D2"));
                }
            }
            if (result == KWPResult.OK)
            {
                return(true);
            }
            else
            {
                LogDataString("setSymbolRequest timed out");
                Console.WriteLine("setSymbolRequest timed out");
                return(false);
            }
        }
Exemple #5
0
        /// <summary>
        /// sendEraseRequest sends an erase request to the ECU.
        /// This method must be called before the ECU can be flashed.
        /// </summary>
        /// <returns>KWPResult</returns>
        public KWPResult sendEraseRequest()
        {
            LogDataString("sendEraseRequest");

            KWPReply  reply  = new KWPReply();
            KWPReply  reply2 = new KWPReply();
            KWPResult result = KWPResult.Timeout;
            int       i      = 0;

            //First erase message. Up to 5 retries.
            //Mode = 0x31
            //PID = 0x52
            //Expected result is 0x71
            result = sendRequest(new KWPRequest(0x31, 0x52), out reply);
            Console.WriteLine("Erase(1) " + reply.ToString());
            if (result != KWPResult.OK)
            {
                return(result);
            }
            while (reply.getMode() != 0x71)
            {
                System.Threading.Thread.Sleep(1000);
                result = sendRequest(new KWPRequest(0x31, 0x52), out reply);
                Console.WriteLine("Erase(2:" + i.ToString() + ") " + reply.ToString());
                if (i++ > 15)
                {
                    return(KWPResult.Timeout);
                }
            }
            if (result != KWPResult.OK)
            {
                return(result);
            }

            //Second erase message. Up to 10 retries.
            //Mode = 0x31
            //PID = 0x53
            //Expected result is 0x71
            i      = 0;
            result = sendRequest(new KWPRequest(0x31, 0x53), out reply2);
            Console.WriteLine("Erase(3) " + reply2.ToString());
            if (result != KWPResult.OK)
            {
                return(result);
            }
            while (reply2.getMode() != 0x71)
            {
                System.Threading.Thread.Sleep(1000);
                result = sendRequest(new KWPRequest(0x31, 0x53), out reply2);
                Console.WriteLine("Erase(4:" + i.ToString() + ") " + reply2.ToString());
                if (i++ > 20)
                {
                    return(KWPResult.Timeout);
                }
            }

            //Erase confirm message
            //Mode = 0x3E
            //Expected result is 0x7E
            result = sendRequest(new KWPRequest(0x3E, 0x53), out reply2);
            Console.WriteLine("Erase(5) " + reply2.ToString());

            return(result);
        }
Exemple #6
0
        private void button3_Click(object sender, EventArgs e)
        {
            string vin;
            string immo;
            string engineType;
            string swVersion;

            if (m_connectedToECU)
            {
                if (useCombiAdapter)
                {
                    // begin comms session
                    T7.Flasher.T7CombiFlasher cf =
                        (T7.Flasher.T7CombiFlasher) this.flash;
                    cf.beginSession();

                    // NB: does not work, but it's a firmware problem
                    //vin = cf.getHeaderString(T7.Flasher.T7HeaderField.vin);
                    //engineType = cf.getHeaderString(T7.Flasher.T7HeaderField.engtype);
                    //swVersion = cf.getHeaderString(T7.Flasher.T7HeaderField.swversion);

                    // end session
                    cf.endSession();
                }
                else
                {
                    if (checkBox1.Checked)
                    {
                        KWPHandler.startLogging();
                    }
                    KWPResult res = kwpHandler.getVIN(out vin);
                    if (res == KWPResult.OK)
                    {
                        AddToLog("VIN: " + vin);
                    }
                    else if (res == KWPResult.DeviceNotConnected)
                    {
                        AddToLog("VIN: not connected");
                    }
                    else
                    {
                        AddToLog("VIN: timeout");
                    }
                    res = kwpHandler.getImmo(out immo);
                    if (res == KWPResult.OK)
                    {
                        AddToLog("Immo: " + immo);
                    }
                    res = kwpHandler.getEngineType(out engineType);
                    if (res == KWPResult.OK)
                    {
                        AddToLog("Engine type: :" + engineType);
                    }
                    res = kwpHandler.getSwVersion(out swVersion);
                    if (res == KWPResult.OK)
                    {
                        AddToLog("Software version: " + swVersion);
                    }
                }
            }
        }