From 8219707dc3aedaba76863726c0af24b03624d863 Mon Sep 17 00:00:00 2001 From: Darth Affe Date: Sat, 15 Aug 2020 00:29:40 +0200 Subject: [PATCH] Added experimental support for splitted responses --- OBD.NET/OBD.NET.Common/Devices/ELM327.cs | 20 ++++++++++++++++++- .../OBD.NET.Common/OBDData/AbstractOBDData.cs | 4 ++-- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/OBD.NET/OBD.NET.Common/Devices/ELM327.cs b/OBD.NET/OBD.NET.Common/Devices/ELM327.cs index 1c96122..87e5c3f 100644 --- a/OBD.NET/OBD.NET.Common/Devices/ELM327.cs +++ b/OBD.NET/OBD.NET.Common/Devices/ELM327.cs @@ -25,6 +25,8 @@ namespace OBD.NET.Common.Devices protected Mode Mode { get; set; } = Mode.ShowCurrentData; //TODO DarthAffe 26.06.2016: Implement different modes + protected string MessageChunk { get; set; } + #endregion #region Events @@ -161,13 +163,29 @@ namespace OBD.NET.Common.Devices protected override object ProcessMessage(string message) { + if (message == null) return null; + DateTime timestamp = DateTime.Now; RawDataReceived?.Invoke(this, new RawDataReceivedEventArgs(message, timestamp)); if (message.Length > 4) { - if (message[0] == '4') + // DarthAffe 15.08.2020: Splitted messages are prefixed with 0: (first chunk) and 1: (second chunk) + // DarthAffe 15.08.2020: They also seem to be always preceded by a '009'-message, but since that's to short to be processed it should be safe to ignore. + // DarthAffe 15.08.2020: Since that behavior isn't really documented (at least I wasn't able to find it) that's all trial and error and might not work for all pids with long results. + if (message[1] == ':') + { + if (message[0] == '0') + MessageChunk = message.Substring(2, message.Length - 2); + else if (message[0] == '1') + { + string fullMessage = MessageChunk + message.Substring(2, message.Length - 2); + MessageChunk = null; + return ProcessMessage(fullMessage); + } + } + else if (message[0] == '4') { byte mode = (byte)message[1].GetHexVal(); if (mode == (byte)Mode) diff --git a/OBD.NET/OBD.NET.Common/OBDData/AbstractOBDData.cs b/OBD.NET/OBD.NET.Common/OBDData/AbstractOBDData.cs index 944f300..6fc3abd 100644 --- a/OBD.NET/OBD.NET.Common/OBDData/AbstractOBDData.cs +++ b/OBD.NET/OBD.NET.Common/OBDData/AbstractOBDData.cs @@ -22,7 +22,7 @@ namespace OBD.NET.Common.OBDData _rawData = value; } } - + public bool IsValid => RawData.Length == _length; protected byte A => RawData.Length > 0 ? RawData[0] : default(byte); @@ -55,7 +55,7 @@ namespace OBD.NET.Common.OBDData { try { - if (((data.Length % 2) == 1) || ((data.Length / 2) != _length)) + if (((data.Length % 2) != 0) || ((data.Length / 2) < _length)) throw new ArgumentException("The provided data is not valid", nameof(data)); _rawData = new byte[_length];