/// <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); }
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); }
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); } }
/// <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); } }
/// <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); }
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); } } } }