public static bool InterfaceReceiveData(byte[] receiveData, int offset, int length, int timeout, int timeoutTelEnd, EdiabasNet ediabasLog) { if (TcpElmStream == null) { return(false); } if (_edElmInterface == null) { return(false); } return(_edElmInterface.InterfaceReceiveData(receiveData, offset, length, timeout, timeoutTelEnd, ediabasLog)); }
public static bool InterfaceReceiveData(byte[] receiveData, int offset, int length, int timeout, int timeoutTelEnd, EdiabasNet ediabasLog) { bool convertBaudResponse = ConvertBaudResponse; bool autoKeyByteResponse = AutoKeyByteResponse; ConvertBaudResponse = false; AutoKeyByteResponse = false; if ((_bluetoothSocket == null) || (_bluetoothInStream == null)) { return(false); } if (_elm327Device) { if (_edElmInterface == null) { return(false); } return(_edElmInterface.InterfaceReceiveData(receiveData, offset, length, timeout, timeoutTelEnd, ediabasLog)); } int timeoutOffset = ReadTimeoutOffsetLong; if (((Stopwatch.GetTimestamp() - LastCommTick) < 100 * TickResolMs) && (timeout < 100)) { timeoutOffset = ReadTimeoutOffsetShort; } //Ediabas?.LogFormat(EdiabasNet.EdLogLevel.Ifh, "Timeout offset {0}", timeoutOffset); timeout += timeoutOffset; timeoutTelEnd += timeoutOffset; try { if (!_rawMode && SettingsUpdateRequired()) { Ediabas?.LogString(EdiabasNet.EdLogLevel.Ifh, "InterfaceReceiveData, update settings"); UpdateAdapterInfo(); byte[] adapterTel = CreatePulseTelegram(0, 0, 0, false, false, 0); if (adapterTel == null) { return(false); } _bluetoothOutStream.Write(adapterTel, 0, adapterTel.Length); LastCommTick = Stopwatch.GetTimestamp(); UpdateActiveSettings(); } if (convertBaudResponse && length == 2) { Ediabas?.LogString(EdiabasNet.EdLogLevel.Ifh, "Convert baud response"); length = 1; AutoKeyByteResponse = true; } int recLen = 0; long startTime = Stopwatch.GetTimestamp(); while (recLen < length) { int currTimeout = (recLen == 0) ? timeout : timeoutTelEnd; if (_bluetoothInStream.IsDataAvailable()) { int bytesRead = _bluetoothInStream.Read(receiveData, offset + recLen, length - recLen); if (bytesRead > 0) { LastCommTick = Stopwatch.GetTimestamp(); } recLen += bytesRead; } if (recLen >= length) { break; } if ((Stopwatch.GetTimestamp() - startTime) > currTimeout * TickResolMs) { ediabasLog?.LogData(EdiabasNet.EdLogLevel.Ifh, receiveData, offset, recLen, "Rec "); return(false); } Thread.Sleep(10); } if (convertBaudResponse) { ConvertStdBaudResponse(receiveData, offset); } if (autoKeyByteResponse && length == 2) { // auto key byte response for old adapter Ediabas?.LogString(EdiabasNet.EdLogLevel.Ifh, "Auto key byte response"); byte[] keyByteResponse = { (byte)~receiveData[offset + 1] }; byte[] adapterTel = CreateAdapterTelegram(keyByteResponse, keyByteResponse.Length, true); if (adapterTel == null) { return(false); } _bluetoothOutStream.Write(adapterTel, 0, adapterTel.Length); LastCommTick = Stopwatch.GetTimestamp(); } } catch (Exception ex) { Ediabas?.LogFormat(EdiabasNet.EdLogLevel.Ifh, "*** Stream failure: {0}", ex.Message); _reconnectRequired = true; return(false); } return(true); }