From 18f1903c92915e59171ca89fe18ba098f9456a1b Mon Sep 17 00:00:00 2001 From: Federico Panzani Date: Wed, 18 Oct 2023 08:28:34 +0000 Subject: [PATCH 1/6] #43 Message's CycleTime property marked as obsolete. Provided extension method to access in easy way this property. Updated test. --- DbcParserLib.Tests/PropertiesLineParserTests.cs | 2 ++ DbcParserLib/DbcBuilder.cs | 10 ---------- DbcParserLib/ExtensionsAndHelpers.cs | 14 ++++++++++++++ DbcParserLib/IDbcBuilder.cs | 1 - DbcParserLib/Model/CustomPropertyDefinition.cs | 1 - DbcParserLib/Model/Message.cs | 14 ++++++++++++-- DbcParserLib/Parsers/PropertiesLineParser.cs | 4 ---- 7 files changed, 28 insertions(+), 18 deletions(-) diff --git a/DbcParserLib.Tests/PropertiesLineParserTests.cs b/DbcParserLib.Tests/PropertiesLineParserTests.cs index 546b5bf..06d944b 100644 --- a/DbcParserLib.Tests/PropertiesLineParserTests.cs +++ b/DbcParserLib.Tests/PropertiesLineParserTests.cs @@ -170,7 +170,9 @@ public void MsgCustomPropertyIsParsedTest() Assert.IsTrue(ParseLine(@"BA_ ""GenMsgCycleTime"" BO_ 2394947585 100;", msgCycleTimeLineParser, builder, nextLineProvider)); var dbc = builder.Build(); + Assert.AreEqual(true, dbc.Messages.First().CycleTime(out var cycleTime)); Assert.AreEqual(100, dbc.Messages.First().CycleTime); + Assert.AreEqual(100, cycleTime); } [Test] diff --git a/DbcParserLib/DbcBuilder.cs b/DbcParserLib/DbcBuilder.cs index 2b344b0..94d6256 100644 --- a/DbcParserLib/DbcBuilder.cs +++ b/DbcParserLib/DbcBuilder.cs @@ -263,16 +263,6 @@ public void AddNodeEnvironmentVariable(string nodeName, string variableName) m_observer.NodeNameNotFound(nodeName); } - public void AddMessageCycleTime(uint messageId, int cycleTime) - { - if (m_messages.TryGetValue(messageId, out var message)) - { - message.CycleTime = cycleTime; - } - else - m_observer.MessageIdNotFound(messageId); - } - public void AddNamedValueTable(string name, IReadOnlyDictionary dictValues, string stringValues) { if(m_namedTablesMap.TryGetValue(name, out _)) diff --git a/DbcParserLib/ExtensionsAndHelpers.cs b/DbcParserLib/ExtensionsAndHelpers.cs index 700e0b1..7514377 100644 --- a/DbcParserLib/ExtensionsAndHelpers.cs +++ b/DbcParserLib/ExtensionsAndHelpers.cs @@ -99,5 +99,19 @@ internal static IReadOnlyDictionary ToDictionary(this string record } return dict; } + + public static bool CycleTime(this Message message, out int cycleTime) + { + if (message.CustomProperties.TryGetValue("GenMsgCycleTime", out var property)) + { + cycleTime = property.IntegerCustomProperty.Value; + return true; + } + else + { + cycleTime = 0; + return false; + } + } } } \ No newline at end of file diff --git a/DbcParserLib/IDbcBuilder.cs b/DbcParserLib/IDbcBuilder.cs index 2c16f5e..378a732 100644 --- a/DbcParserLib/IDbcBuilder.cs +++ b/DbcParserLib/IDbcBuilder.cs @@ -7,7 +7,6 @@ internal interface IDbcBuilder { void AddMessage(Message message); void AddMessageComment(uint messageId, string comment); - void AddMessageCycleTime(uint messageId, int cycleTime); void AddNamedValueTable(string name, IReadOnlyDictionary dictValues, string stringValues); void AddNode(Node node); void AddNodeComment(string nodeName, string comment); diff --git a/DbcParserLib/Model/CustomPropertyDefinition.cs b/DbcParserLib/Model/CustomPropertyDefinition.cs index 92bc3c4..809f18f 100644 --- a/DbcParserLib/Model/CustomPropertyDefinition.cs +++ b/DbcParserLib/Model/CustomPropertyDefinition.cs @@ -20,7 +20,6 @@ public CustomPropertyDefinition(IParseFailureObserver observer) m_observer = observer; } - public void SetCustomPropertyDefaultValue(string value, bool isNumeric) { switch (DataType) diff --git a/DbcParserLib/Model/Message.cs b/DbcParserLib/Model/Message.cs index 8c179c5..191260d 100644 --- a/DbcParserLib/Model/Message.cs +++ b/DbcParserLib/Model/Message.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; namespace DbcParserLib.Model { @@ -37,7 +38,16 @@ public class Message public ushort DLC; public string Transmitter; public string Comment; - public int CycleTime; + [Obsolete("Please use CycleTime(out int cycleTime) instead. CycleTime property will be removed and will be accessible only through extension method")] + public int CycleTime + { + get + { + this.CycleTime(out var cycleTime); + return cycleTime; + } + } + public List Signals = new List(); public IDictionary CustomProperties = new Dictionary(); diff --git a/DbcParserLib/Parsers/PropertiesLineParser.cs b/DbcParserLib/Parsers/PropertiesLineParser.cs index b0b3b77..22bebce 100644 --- a/DbcParserLib/Parsers/PropertiesLineParser.cs +++ b/DbcParserLib/Parsers/PropertiesLineParser.cs @@ -34,11 +34,7 @@ public bool TryParse(string line, IDbcBuilder builder, INextLineProvider nextLin else if (match.Groups[2].Value == "EV_") builder.AddEnvironmentVariableCustomProperty(match.Groups[1].Value, match.Groups[3].Value, stringValue, isNumeric); else if (match.Groups[4].Value == "BO_") - { builder.AddMessageCustomProperty(match.Groups[1].Value, uint.Parse(match.Groups[5].Value, CultureInfo.InvariantCulture), stringValue, isNumeric); - if (match.Groups[1].Value == "GenMsgCycleTime") - builder.AddMessageCycleTime(uint.Parse(match.Groups[5].Value, CultureInfo.InvariantCulture), int.Parse(match.Groups[9].Value, CultureInfo.InvariantCulture)); - } else if (match.Groups[6].Value == "SG_") { builder.AddSignalCustomProperty(match.Groups[1].Value, uint.Parse(match.Groups[7].Value, CultureInfo.InvariantCulture), match.Groups[8].Value, stringValue, isNumeric); From 756fb8c6b970c64bd0646dcae89f7ee5f57523f0 Mon Sep 17 00:00:00 2001 From: Federico Panzani Date: Wed, 18 Oct 2023 12:55:57 +0000 Subject: [PATCH 2/6] #43 Removed special case for 'GenSigStartValue" property. Updated some tests --- .../PropertiesLineParserTests.cs | 27 ++++++++++++++-- DbcParserLib/DbcBuilder.cs | 8 ----- DbcParserLib/ExtensionsAndHelpers.cs | 32 +++++++++++++++++-- DbcParserLib/IDbcBuilder.cs | 1 - DbcParserLib/Model/Signal.cs | 11 ++++++- DbcParserLib/Parsers/PropertiesLineParser.cs | 4 --- 6 files changed, 65 insertions(+), 18 deletions(-) diff --git a/DbcParserLib.Tests/PropertiesLineParserTests.cs b/DbcParserLib.Tests/PropertiesLineParserTests.cs index 06d944b..a33e113 100644 --- a/DbcParserLib.Tests/PropertiesLineParserTests.cs +++ b/DbcParserLib.Tests/PropertiesLineParserTests.cs @@ -157,7 +157,7 @@ public void EnumDefinitionCustomPropertyMoreWhiteSpaceIsParsedTest() } [Test] - public void MsgCustomPropertyIsParsedTest() + public void MsgCycleTimePropertyIsParsedTest() { var builder = new DbcBuilder(new SilentFailureObserver()); var message = new Message { ID = 2394947585 }; @@ -176,7 +176,7 @@ public void MsgCustomPropertyIsParsedTest() } [Test] - public void SigCustomPropertyIsParsedTest() + public void SigInitialValueIntegerPropertyIsParsedTest() { var builder = new DbcBuilder(new SilentFailureObserver()); var message = new Message { ID = 2394947585 }; @@ -191,7 +191,30 @@ public void SigCustomPropertyIsParsedTest() Assert.IsTrue(ParseLine(@"BA_ ""GenSigStartValue"" SG_ 2394947585 sig_name 40;", sigInitialValueLineParser, builder, nextLineProvider)); var dbc = builder.Build(); + Assert.AreEqual(true, dbc.Messages.First().Signals.First().InitialValue(out var initialValue)); Assert.AreEqual(40, dbc.Messages.First().Signals.First().InitialValue); + Assert.AreEqual(40, initialValue); + } + + [Test] + public void SigInitialValueHexPropertyIsParsedTest() + { + var builder = new DbcBuilder(new SilentFailureObserver()); + var message = new Message { ID = 2394947585 }; + builder.AddMessage(message); + var signal = new Signal { Name = "sig_name" }; + builder.AddSignal(signal); + + var sigInitialValueLineParser = CreateParser(); + var nextLineProvider = new NextLineProvider(new StringReader(string.Empty)); + Assert.IsTrue(ParseLine(@"BA_DEF_ SG_ ""GenSigStartValue"" HEX 0 200;", sigInitialValueLineParser, builder, nextLineProvider)); + Assert.IsTrue(ParseLine(@"BA_DEF_DEF_ ""GenSigStartValue"" 150;", sigInitialValueLineParser, builder, nextLineProvider)); + Assert.IsTrue(ParseLine(@"BA_ ""GenSigStartValue"" SG_ 2394947585 sig_name 40;", sigInitialValueLineParser, builder, nextLineProvider)); + + var dbc = builder.Build(); + Assert.AreEqual(true, dbc.Messages.First().Signals.First().InitialValue(out var initialValue)); + Assert.AreEqual(40, dbc.Messages.First().Signals.First().InitialValue); + Assert.AreEqual(40, initialValue); } [Test] diff --git a/DbcParserLib/DbcBuilder.cs b/DbcParserLib/DbcBuilder.cs index 94d6256..d82eff3 100644 --- a/DbcParserLib/DbcBuilder.cs +++ b/DbcParserLib/DbcBuilder.cs @@ -184,14 +184,6 @@ public void AddSignalComment(uint messageId, string signalName, string comment) m_observer.SignalNameNotFound(messageId, signalName); } - public void AddSignalInitialValue(uint messageId, string signalName, double initialValue) - { - if (TryGetValueMessageSignal(messageId, signalName, out var signal)) - signal.InitialValue = initialValue * signal.Factor + signal.Offset; - else - m_observer.SignalNameNotFound(messageId, signalName); - } - public void AddSignalValueType(uint messageId, string signalName, DbcValueType valueType) { if (TryGetValueMessageSignal(messageId, signalName, out var signal)) diff --git a/DbcParserLib/ExtensionsAndHelpers.cs b/DbcParserLib/ExtensionsAndHelpers.cs index 7514377..0e54e76 100644 --- a/DbcParserLib/ExtensionsAndHelpers.cs +++ b/DbcParserLib/ExtensionsAndHelpers.cs @@ -102,16 +102,44 @@ internal static IReadOnlyDictionary ToDictionary(this string record public static bool CycleTime(this Message message, out int cycleTime) { + cycleTime = 0; + if (message.CustomProperties.TryGetValue("GenMsgCycleTime", out var property)) { cycleTime = property.IntegerCustomProperty.Value; return true; } else - { - cycleTime = 0; return false; + } + + internal static bool InitialValue(this Signal signal, out double initialValue) + { + initialValue = 0; + + if (signal.CustomProperties.TryGetValue("GenSigStartValue", out var property)) + { + double value = 0; + switch (property.CustomPropertyDefinition.DataType) + { + case CustomPropertyDataType.Float: + value = property.FloatCustomProperty.Value; + break; + case CustomPropertyDataType.Hex: + value = property.HexCustomProperty.Value; + break; + case CustomPropertyDataType.Integer: + value = property.IntegerCustomProperty.Value; + break; + default: + return false; + } + + initialValue = value * signal.Factor + signal.Offset; + return true; } + else + return false; } } } \ No newline at end of file diff --git a/DbcParserLib/IDbcBuilder.cs b/DbcParserLib/IDbcBuilder.cs index 378a732..e9bfa48 100644 --- a/DbcParserLib/IDbcBuilder.cs +++ b/DbcParserLib/IDbcBuilder.cs @@ -12,7 +12,6 @@ internal interface IDbcBuilder void AddNodeComment(string nodeName, string comment); void AddSignal(Signal signal); void AddSignalComment(uint messageId, string signalName, string comment); - void AddSignalInitialValue(uint messageId, string signalName, double initialValue); void AddSignalValueType(uint messageId, string signalName, DbcValueType valueType); void LinkNamedTableToSignal(uint messageId, string signalName, string tableName); void LinkTableValuesToSignal(uint messageId, string signalName, IReadOnlyDictionary dictValues, string stringValues); diff --git a/DbcParserLib/Model/Signal.cs b/DbcParserLib/Model/Signal.cs index d406cb5..206afa7 100644 --- a/DbcParserLib/Model/Signal.cs +++ b/DbcParserLib/Model/Signal.cs @@ -78,7 +78,16 @@ public DbcValueType ValueType IsSigned = (byte)(value == DbcValueType.Unsigned ? 0 : 1); } } - public double InitialValue; + + public double InitialValue + { + get + { + this.InitialValue(out var initialValue); + return initialValue; + } + } + public double Factor = 1; public bool IsInteger = false; public double Offset; diff --git a/DbcParserLib/Parsers/PropertiesLineParser.cs b/DbcParserLib/Parsers/PropertiesLineParser.cs index 22bebce..4a09bcb 100644 --- a/DbcParserLib/Parsers/PropertiesLineParser.cs +++ b/DbcParserLib/Parsers/PropertiesLineParser.cs @@ -36,11 +36,7 @@ public bool TryParse(string line, IDbcBuilder builder, INextLineProvider nextLin else if (match.Groups[4].Value == "BO_") builder.AddMessageCustomProperty(match.Groups[1].Value, uint.Parse(match.Groups[5].Value, CultureInfo.InvariantCulture), stringValue, isNumeric); else if (match.Groups[6].Value == "SG_") - { builder.AddSignalCustomProperty(match.Groups[1].Value, uint.Parse(match.Groups[7].Value, CultureInfo.InvariantCulture), match.Groups[8].Value, stringValue, isNumeric); - if (match.Groups[1].Value == "GenSigStartValue") - builder.AddSignalInitialValue(uint.Parse(match.Groups[7].Value, CultureInfo.InvariantCulture), match.Groups[8].Value, double.Parse(match.Groups[9].Value, CultureInfo.InvariantCulture)); - } } else m_observer.PropertySyntaxError(); From 02e44de31b271543965ccc6c2f2d6459f065ef21 Mon Sep 17 00:00:00 2001 From: Federico Panzani Date: Wed, 18 Oct 2023 14:04:38 +0000 Subject: [PATCH 3/6] Bugfixed on custom property parsing --- DbcParserLib/DbcBuilder.cs | 16 ++++++++++++---- DbcParserLib/Model/CustomProperty.cs | 13 +++++++------ 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/DbcParserLib/DbcBuilder.cs b/DbcParserLib/DbcBuilder.cs index d82eff3..207cb80 100644 --- a/DbcParserLib/DbcBuilder.cs +++ b/DbcParserLib/DbcBuilder.cs @@ -103,7 +103,9 @@ public void AddNodeCustomProperty(string propertyName, string nodeName, string v if (node != null) { var property = new CustomProperty(customProperty); - property.SetCustomPropertyValue(value, isNumeric); + if(!property.SetCustomPropertyValue(value, isNumeric)) + return; + if(node.CustomProperties.TryGetValue(propertyName, out _)) m_observer.DuplicatedPropertyInNode(propertyName, node.Name); else @@ -123,7 +125,9 @@ public void AddEnvironmentVariableCustomProperty(string propertyName, string var if (m_environmentVariables.TryGetValue(variableName, out var envVariable)) { var property = new CustomProperty(customProperty); - property.SetCustomPropertyValue(value, isNumeric); + if(!property.SetCustomPropertyValue(value, isNumeric)) + return; + if(envVariable.CustomProperties.TryGetValue(propertyName, out _)) m_observer.DuplicatedPropertyInEnvironmentVariable(propertyName, envVariable.Name); else @@ -143,7 +147,9 @@ public void AddMessageCustomProperty(string propertyName, uint messageId, string if (m_messages.TryGetValue(messageId, out var message)) { var property = new CustomProperty(customProperty); - property.SetCustomPropertyValue(value, isNumeric); + if(!property.SetCustomPropertyValue(value, isNumeric)) + return; + if(message.CustomProperties.TryGetValue(propertyName, out _)) m_observer.DuplicatedPropertyInMessage(propertyName, message.ID); else @@ -163,7 +169,9 @@ public void AddSignalCustomProperty(string propertyName, uint messageId, string if (TryGetValueMessageSignal(messageId, signalName, out var signal)) { var property = new CustomProperty(customProperty); - property.SetCustomPropertyValue(value, isNumeric); + if(!property.SetCustomPropertyValue(value, isNumeric)) + return; + if(signal.CustomProperties.TryGetValue(propertyName, out _)) m_observer.DuplicatedPropertyInSignal(propertyName, signal.Name); else diff --git a/DbcParserLib/Model/CustomProperty.cs b/DbcParserLib/Model/CustomProperty.cs index 22d840c..c982a11 100644 --- a/DbcParserLib/Model/CustomProperty.cs +++ b/DbcParserLib/Model/CustomProperty.cs @@ -14,13 +14,13 @@ public CustomProperty(CustomPropertyDefinition customPropertyDefinition) CustomPropertyDefinition = customPropertyDefinition; } - public void SetCustomPropertyValue(string value, bool isNumeric) + public bool SetCustomPropertyValue(string value, bool isNumeric) { switch (CustomPropertyDefinition.DataType) { case CustomPropertyDataType.Integer: if(!CustomPropertyDefinition.TryGetIntegerValue(value, isNumeric, out var integerValue)) - return; + return false; IntegerCustomProperty = new CustomPropertyValue() { @@ -30,7 +30,7 @@ public void SetCustomPropertyValue(string value, bool isNumeric) case CustomPropertyDataType.Hex: if(!CustomPropertyDefinition.TryGetHexValue(value, isNumeric, out var hexValue)) - return; + return false; HexCustomProperty = new CustomPropertyValue() { @@ -40,7 +40,7 @@ public void SetCustomPropertyValue(string value, bool isNumeric) case CustomPropertyDataType.Float: if(!CustomPropertyDefinition.TryGetFloatValue(value, isNumeric, out var floatValue)) - return; + return false; FloatCustomProperty = new CustomPropertyValue() { Value = floatValue @@ -49,7 +49,7 @@ public void SetCustomPropertyValue(string value, bool isNumeric) case CustomPropertyDataType.String: if(!CustomPropertyDefinition.IsString(isNumeric)) - return; + return false; StringCustomProperty = new CustomPropertyValue() { Value = value @@ -58,7 +58,7 @@ public void SetCustomPropertyValue(string value, bool isNumeric) case CustomPropertyDataType.Enum: if(!CustomPropertyDefinition.TryGetEnumValue(value, isNumeric, out var enumValue)) - return; + return false; EnumCustomProperty = new CustomPropertyValue() { @@ -66,6 +66,7 @@ public void SetCustomPropertyValue(string value, bool isNumeric) }; break; } + return true; } public void SetCustomPropertyValueFromDefault() From dc0c292ddeca78c9ae035150030315bc028ed3de Mon Sep 17 00:00:00 2001 From: Federico Panzani Date: Wed, 18 Oct 2023 14:41:08 +0000 Subject: [PATCH 4/6] Removed obsolete stuff --- DbcParserLib/ExtensionsAndHelpers.cs | 7 ------- DbcParserLib/Model/Signal.cs | 9 +++------ 2 files changed, 3 insertions(+), 13 deletions(-) diff --git a/DbcParserLib/ExtensionsAndHelpers.cs b/DbcParserLib/ExtensionsAndHelpers.cs index 0e54e76..0047e7e 100644 --- a/DbcParserLib/ExtensionsAndHelpers.cs +++ b/DbcParserLib/ExtensionsAndHelpers.cs @@ -2,7 +2,6 @@ using System.Linq; using System.Collections.Generic; using DbcParserLib.Model; -using System; namespace DbcParserLib { @@ -33,12 +32,6 @@ internal static ulong BitMask(this Signal signal) return (ulong.MaxValue >> (64 - signal.Length)); } - [Obsolete("Please use ValueTableMap instead. ToPairs() and ValueTable will be removed in future releases")] - public static IEnumerable> ToPairs(this Signal signal) - { - return signal.ValueTableMap; - } - private const string MultiplexorLabel = "M"; private const string MultiplexedLabel = "m"; diff --git a/DbcParserLib/Model/Signal.cs b/DbcParserLib/Model/Signal.cs index 206afa7..a7930f4 100644 --- a/DbcParserLib/Model/Signal.cs +++ b/DbcParserLib/Model/Signal.cs @@ -57,7 +57,7 @@ internal ImmutableSignal(Signal signal) public class Signal { - private DbcValueType m_ValueType = DbcValueType.Signed; + private DbcValueType m_valueType = DbcValueType.Signed; public uint ID; public string Name; @@ -68,13 +68,10 @@ public class Signal public byte IsSigned { get; private set; } = 1; public DbcValueType ValueType { - get - { - return m_ValueType; - } + get => m_valueType; set { - m_ValueType = value; + m_valueType = value; IsSigned = (byte)(value == DbcValueType.Unsigned ? 0 : 1); } } From d1e53d59bc4c687c42ceba3c61c4589002aa04f0 Mon Sep 17 00:00:00 2001 From: Federico Panzani Date: Wed, 18 Oct 2023 15:01:30 +0000 Subject: [PATCH 5/6] Updated README: added parsing error management chapter and obsolete stuff chapter --- README.md | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/README.md b/README.md index 05071d1..2dd737e 100644 --- a/README.md +++ b/README.md @@ -40,6 +40,30 @@ var filteredSelection = dbc .ToArray(); ``` +### Parsing errors management +From **v1.4.0** parsing errors management has been introduced to inform users about syntax errors occurred during parsing procedure. +The `IParseFailureObserver` interface provides all methods to handle syntax errors, like: +- Generic syntax error (eg. `;`, `'`, `,` missing) +- Duplicated object definition (eg. messages with same ID; nodes, signals, custom properties with same name etc..) +- Object definition missing (eg. custom property is assigned before its declaration) +- Value consistency (eg. custom property value is out of bound with respect to min and max values defined in the property) + +The library comes with two different implementations: +1. `SilentFailureObserver`: the default one. It silently swallow errors when parsing +2. `SimpleFailureObserver`: simple observer that logs any error. Errors list can be retrieve through `GetErrorList()` method, like in the example below + +```cs +// Comment this two lines to remove errors parsing management (errors will be silent) +// You can provide your own IParseFailureObserver implementation to customize errors parsing management +var failureObserver = new SimpleFailureObserver(); +Parser.SetParsingFailuresObserver(failureObserver); + +var dbc = Parser.ParseFromPath(filePath); +var errors = failureObserver.GetErrorList(); +``` + +The user is free to create its own implementation to customize error management. + ## Packing/Unpacking signals ### Simple scenario @@ -103,6 +127,22 @@ if(message.IsMultiplexed()) // ... } ``` + +
+ +# Obsolete stuff + +Below you can find a list of obsolete stuff that are going to be removed in the future releases. + +| Class | Property/Method | Obsolete | Removed | Replaced by | Comment | +| -------- | ------- | ------- | ------- | ------- | ------- | +| Signal | IsSigned | v1.3.0 | planned in **1.4.3** | `ValueType` | Byte property replaced by `DbcValueType` property which provides
more informations about signal type | +| Signal | ValueTable | v1.3.0 | planned in **1.4.3** | `ValueTableMap` | String property replaced by a `IDictionary` property | +| Signal | ToPairs() | v1.3.0 | **v1.4.2** | - | Extension method used to convert ValueTable into ValueTableMap | +| Message | CycleTime | v1.4.2 | planned in **1.4.4** | `CycleTime()` | CycleTime is no more a message property (replaced by an extension method) | + +
+ # Useful references - [High level overview](https://docs.openvehicles.com/en/latest/components/vehicle_dbc/docs/dbc-primer.html) - [Very well done overview, many resources on that site](https://github.com/stefanhoelzl/CANpy/blob/master/docs/DBC_Specification.md) From 828aeaff2ab4cbebef865bf02239b666488bea59 Mon Sep 17 00:00:00 2001 From: Federico Panzani Date: Wed, 18 Oct 2023 15:30:24 +0000 Subject: [PATCH 6/6] Updated README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2dd737e..36f6b49 100644 --- a/README.md +++ b/README.md @@ -139,7 +139,7 @@ Below you can find a list of obsolete stuff that are going to be removed in the | Signal | IsSigned | v1.3.0 | planned in **1.4.3** | `ValueType` | Byte property replaced by `DbcValueType` property which provides
more informations about signal type | | Signal | ValueTable | v1.3.0 | planned in **1.4.3** | `ValueTableMap` | String property replaced by a `IDictionary` property | | Signal | ToPairs() | v1.3.0 | **v1.4.2** | - | Extension method used to convert ValueTable into ValueTableMap | -| Message | CycleTime | v1.4.2 | planned in **1.4.4** | `CycleTime()` | CycleTime is no more a message property (replaced by an extension method) | +| Message | CycleTime | v1.4.2 | planned in **1.4.4** | `bool CycleTime(out int cycleTime)` | CycleTime is no more a message property (replaced by an extension method) |