Exemple #1
0
        /// <summary>
        /// This method writes to a symbol in RAM.
        /// The ECU must not be write protected for this to work.
        /// </summary>
        /// <param name="a_symbolNumber">Symbol number to write to.</param>
        /// <param name="a_data">Data to write.</param> 
        /// <returns></returns>
        public bool writeSymbolRequestAddress(uint a_address, byte[] a_data)
        {
            LogDataString("writeSymbolRequest: " + a_address.ToString("X8") + "len: " + a_data.Length.ToString("X4"));

            KWPReply reply = new KWPReply();
            KWPResult result;
            byte[] symbolNumberAndData = new byte[4 + a_data.Length];
            //symbolNumberAndData[0] = (byte)(a_address >> 24);
            symbolNumberAndData[0] = (byte)(a_address >> 16);
            symbolNumberAndData[1] = (byte)(a_address >> 8);
            symbolNumberAndData[2] = (byte)(a_address);
            symbolNumberAndData[3] = (byte)(a_data.Length);
            // len len
            // adr adr adr

            for (int i = 0; i < a_data.Length; i++)
                symbolNumberAndData[i + 4] = a_data[i];

            string requestString = "RequestString: ";
            foreach (byte b in symbolNumberAndData)
            {
                requestString += b.ToString("X2") + " ";
            }
            Console.WriteLine(requestString);
            // end dump to console
            Console.WriteLine("SymbolNumberAndData length: " + symbolNumberAndData.Length.ToString("X8"));
            KWPRequest t_request = new KWPRequest(0x3D, /*0x81, */symbolNumberAndData);
            Console.WriteLine(t_request.ToString());
            result = sendRequest(t_request, out reply);
            if (result != KWPResult.OK)
            {
                Console.WriteLine("Result != KWPResult.OK");
                return false;
            }
            Console.WriteLine("Result = " + reply.getData()[0].ToString("X2"));
            Console.WriteLine("Result-total = " + reply.ToString());
            if (reply.getData()[0] == 0x7D)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
Exemple #2
0
 public bool ResetECU()
 {
     LogDataString("ResetECU");
     KWPReply reply = new KWPReply();
     KWPResult result;
     byte[] data = new byte[1];
     data[0] = (byte)0x00;
     KWPRequest req = new KWPRequest(0x11, 0x01, data);
     Console.WriteLine(req.ToString());
     result = sendRequest(req, out reply);
     if (reply.getMode() == 0x51)
     {
         Console.WriteLine("Reset Success: " + reply.ToString());
         return true;
     }
     else if (reply.getMode() == 0x7F)
     {
         Console.WriteLine("Reset Failed: " + reply.ToString());
     }
     return false;
 }
Exemple #3
0
        /// <summary>
        /// This method writes to a symbol in RAM.
        /// The ECU must not be write protected for this to work.
        /// </summary>
        /// <param name="a_symbolNumber">Symbol number to write to.</param>
        /// <param name="a_data">Data to write.</param> 
        /// <returns></returns>
        public bool writeSymbolRequest(uint a_symbolNumber, byte[] a_data)
        {
            LogDataString("writeSymbolRequest: " + a_symbolNumber.ToString());

            KWPReply reply = new KWPReply();
            KWPResult result;
            int LengthToTx = a_data.Length;
            if (LengthToTx > 0x41) LengthToTx = 0x41; // FA
            byte[] symbolNumberAndData = new byte[3 + /*a_data.Length*/ LengthToTx];
            //First two bytes should be the symbol number
            symbolNumberAndData[0] = (byte)(a_symbolNumber >> 8);
            symbolNumberAndData[1] = (byte)(a_symbolNumber);
            symbolNumberAndData[2] = (byte)(0);
            // len len
            // adr adr adr

            for (int i = 0; i < /*a_data.Length*/ LengthToTx; i++)
                symbolNumberAndData[i + 3] = a_data[i];

            string requestString = "RequestString: ";
            foreach (byte b in symbolNumberAndData)
            {
                requestString += b.ToString("X2") + " ";
            }
            Console.WriteLine(requestString);
            // end dump to console
            Console.WriteLine("SymbolNumberAndData length: " + symbolNumberAndData.Length.ToString("X8"));
            KWPRequest t_request = new KWPRequest(0x3D, 0x80, symbolNumberAndData);
            Console.WriteLine(t_request.ToString());
            result = sendRequest(t_request, out reply);
            if (result != KWPResult.OK)
            {
                Console.WriteLine("Result != KWPResult.OK");
                return false;
            }
            Console.WriteLine("Result = " + reply.getData()[0].ToString("X2"));
            Console.WriteLine("Resulttotal = " + reply.ToString());
            if (reply.getData()[0] == 0x7D)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
Exemple #4
0
        public bool ReadDTCCodes(out List<string> list)
        {
            list = new List<string>();
            LogDataString("ReadDTCCodes");
            KWPReply reply = new KWPReply();
            KWPResult result;
            byte[] data = new byte[2];
            data[0] = (byte)0xFF;
            data[1] = (byte)0xFF;
            //data[2] = (byte)0x00;
            // Status byte
            // 7 Warning lamp illuminated for this code
            // 6 Warning lamp pending for this code, not illuminate but malfunction was detected
            // 5 Warning lamp was previously illuminated for this code, malfunction not currently detected, code not yet erased
            // 4 Stored trouble code
            // 3 Manufacturer specific status
            // 2 Manufacturer specific status
            // 1 Current code - present at time of request
            // 0 Maturing/intermittent code - insufficient data to consider as a malfunction
            KWPRequest req = new KWPRequest(0x18 , 0x02); // Request Diagnostic Trouble Codes by Status
            Console.WriteLine(req.ToString());
            result = sendRequest(req, out reply);
            Console.WriteLine(reply.ToString());
            // J2190
            // Multiple Mode $58 response messages may be reported to a single request, depending on the number of diagnostic
            // trouble codes stored in the module. Each response message will report up to three DTCs for
            // which at least one of the requested status bits is set. If no codes are stored in the module that meet the
            // requested status, then the module will respond with the following:
            // Reply: 58,00
            if (reply.getMode() == 0x58)
            {
                if (reply.getPid() == 0x00)
                {
                    Console.WriteLine("No DTC's");
                    list.Add("No DTC's");
                    return true;
                }
                else
                {
                    //P0605
                    //P1231
                    //P1230
                    //P1530
                    //P1606
                    //P1460
                    //+		reply	{Reply:   14,58,
                    // 06,
                    // 06,05,E4,
                    // 12,31,48,
                    // 12,30,E8,
                    // 15,30,E1,
                    // 16,06,E8,
                    // 14,60,41}	TrionicCANLib.KWP.KWPReply
                    uint number = reply.getPid();
                    byte[] dtc = new byte[number*2];

                    byte[] read = reply.getData();
                    int j = 0;
                    int i = 0;
                    while(i < read.Length)
                    {
                        dtc[j++] = read[i++];
                        dtc[j++] = read[i++];
                        i++;
                    }

                    for (int n = 0; n < dtc.Length; n = n + 2)
                    {
                        list.Add("DTC: P" + dtc[n].ToString("X2") + dtc[n+1].ToString("X2"));
                    }
                }

            }

            return false;
        }
Exemple #5
0
 public bool ReadFreezeFrameData(uint frameNumber)
 {
     LogDataString("ReadFreezeFrameData");
     KWPReply reply = new KWPReply();
     KWPResult result;
     byte[] data = new byte[1];
     data[0] = (byte)0x00;
     //data[1] = (byte)0x00;
     //data[2] = (byte)0x00;
     KWPRequest req = new KWPRequest(0x12, Convert.ToByte(frameNumber), data);
     Console.WriteLine(req.ToString());
     result = sendRequest(req, out reply);
     Console.WriteLine(reply.ToString());
     return true;
 }
Exemple #6
0
 public bool ClearDTCCodes()
 {
     LogDataString("ClearDTCCodes");
     KWPReply reply = new KWPReply();
     KWPResult result;
     byte[] data = new byte[1];
     data[0] = (byte)0xFF;
     //data[1] = (byte)0xFF;
     //data[2] = (byte)0x00;
     KWPRequest req = new KWPRequest(0x14, 0xFF, data);
     Console.WriteLine(req.ToString());
     result = sendRequest(req, out reply);
     Console.WriteLine(reply.ToString());
     return true;
 }
Exemple #7
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 #8
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)
        {
            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();

            LogDataString(a_request.ToString());

            result = m_kwpDevice.sendRequest(a_request, out reply);
            a_reply = reply;
            if (result == RequestResult.NoError)
            {
                LogDataString(reply.ToString());
                LogDataString(""); // empty line

                m_requestMutex.ReleaseMutex();
                return KWPResult.OK;
            }
            else
            {
                LogDataString("Timeout in KWPHandler::sendRequest: " + result.ToString());
                Console.WriteLine("Timeout in KWPHandler::sendRequest: " + result.ToString());
                m_requestMutex.ReleaseMutex();
                return KWPResult.Timeout;
            }
        }
Exemple #9
0
        /// <summary>
        /// Send a request for a sequrity access with one out of two methods to 
        /// calculate the key.
        /// </summary>
        /// <param name="a_method">Key calculation method [1,2]</param>
        /// <returns>true if sequrity access was granted, otherwise false</returns>
        private bool requestSequrityAccessLevel(uint a_method)
        {
            LogDataString("requestSequrityAccessLevel: " + a_method.ToString());
            KWPReply reply = new KWPReply();
            KWPResult result;
            byte[] seed = new byte[2];
            byte[] key = new byte[2];
            // Send a seed request.
            KWPRequest requestForKey = new KWPRequest(0x27, 0x05);
            Console.WriteLine("requestSequrityAccessLevel " + a_method.ToString() +  " request for key: " + requestForKey.ToString());
            result = sendRequest(requestForKey, out reply);
            Console.WriteLine("requestSequrityAccessLevel " + a_method.ToString() + " request for key result: " + reply.ToString());

            if (result != KWPResult.OK)
                return false;
            if (reply.getData().Length < 2)
                return false;
            seed[0] = reply.getData()[0];
            seed[1] = reply.getData()[1];
            if (a_method == 1)
                key = calculateKey(seed, 0);
            else
                key = calculateKey(seed, 1);
            // Send key reply.
            KWPRequest sendKeyRequest = new KWPRequest(0x27, 0x06, key);
            Console.WriteLine("requestSequrityAccessLevel " + a_method.ToString() +  " send Key request: " + sendKeyRequest.ToString());
            result = sendRequest(sendKeyRequest, out reply);
            Console.WriteLine("requestSequrityAccessLevel " + a_method.ToString() + " send Key reply: " + reply.ToString());
            if (result != KWPResult.OK)
            {
                Console.WriteLine("Security access request was not send");
                return false;
            }

            //Check if sequrity was granted.
            Console.WriteLine("Mode: " + reply.getMode().ToString("X2"));
            Console.WriteLine("Data: " + reply.getData()[0].ToString("X2"));
            if ((reply.getMode() == 0x67) && (reply.getData()[0] == 0x34)) // WAS [0]
            {
                Console.WriteLine("Security access granted: " + a_method.ToString());
                return true;
            }

            Console.WriteLine("Security access was not granted: " + reply.ToString());
            return false;
        }
Exemple #10
0
 public bool ClearDTCCode(int dtccode)
 {
     LogDataString("ClearDTCCode: " + dtccode.ToString("X4"));
     KWPReply reply = new KWPReply();
     KWPResult result;
     byte[] data = new byte[1];
     data[0] = (byte)(dtccode & 0x00FF);
     //data[1] = (byte)0xFF;
     //data[2] = (byte)0x00;
     KWPRequest req = new KWPRequest(0x14, (byte)(dtccode >> 8), data);
     Console.WriteLine(req.ToString());
     result = sendRequest(req, out reply);
     Console.WriteLine(reply.ToString());
     return true;
 }
Exemple #11
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;
            logger.Trace("sendRequest");

            KWPReply reply = new KWPReply();
            RequestResult result;
            a_reply = new KWPReply();
            //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.Change(keepAliveTimeout, keepAliveTimeout);
            }

            m_requestMutex.WaitOne();
            int _retryCount = 0;
            result = RequestResult.Unknown; // <GS-11022010>
            while (_retryCount < _maxSendRetries && result != RequestResult.NoError)
            {
                logger.Trace(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;
                    logger.Trace(reply.ToString());
                    logger.Trace(""); // empty line
                    m_requestMutex.ReleaseMutex();
                    //return KWPResult.OK;
                    _kwpResult = KWPResult.OK;
                }
                else
                {
                    logger.Trace("Error in KWPHandler::sendRequest" + result.ToString() + " " + reply.ToString());
                    m_requestMutex.ReleaseMutex();
                    //return KWPResult.Timeout;
                    _kwpResult = KWPResult.Timeout;
                }
            }
            return _kwpResult;
        }
Exemple #12
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)
        {
            logger.Trace("sendRequest");

            KWPReply reply = new KWPReply();
            RequestResult result;
            a_reply = new KWPReply();
            //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.Change(keepAliveTimeout, keepAliveTimeout);
            }

            m_requestMutex.WaitOne();

            logger.Trace(a_request.ToString());
            for (int retry = 0; retry < 3; retry++)
            {
                result = m_kwpDevice.sendRequest(a_request, out reply);
                a_reply = reply;
                if (result == RequestResult.NoError)
                {
                    logger.Trace(reply.ToString());
                    logger.Trace(""); // empty line

                    m_requestMutex.ReleaseMutex();
                    return KWPResult.OK;
                }
                else
                {
                    logger.Trace("Error in KWPHandler::sendRequest: " + result.ToString() + " " + retry.ToString());
                    Console.WriteLine("Error in KWPHandler::sendRequest: " + result.ToString() + " " + retry.ToString());
                }
            }
            m_requestMutex.ReleaseMutex();
            return KWPResult.Timeout;
        }