From 4701a224a7bbcde6de4ddc43b3f952b27e33f000 Mon Sep 17 00:00:00 2001 From: Peter Butzhammer Date: Fri, 9 Feb 2024 12:33:24 +0100 Subject: [PATCH] Remove "S7" from some class names --- Sharp7.Rx.Tests/S7VariableNameParserTests.cs | 91 ------------------- .../ConvertBothWays.cs | 2 +- .../ConverterTestBase.cs | 12 +-- .../ReadFromBuffer.cs | 6 +- .../WriteToBuffer.cs | 6 +- .../MatchesType.cs | 6 +- Sharp7.Rx.Tests/VariableNameParserTests.cs | 91 +++++++++++++++++++ Sharp7.Rx/CacheVariableNameParser.cs | 10 +- Sharp7.Rx/Exceptions/S7Exception.cs | 8 +- Sharp7.Rx/Extensions/S7VariableExtensions.cs | 6 +- Sharp7.Rx/Interfaces/IS7VariableNameParser.cs | 7 -- Sharp7.Rx/Interfaces/IVariableNameParser.cs | 7 ++ Sharp7.Rx/Sharp7Connector.cs | 4 +- Sharp7.Rx/Sharp7Plc.cs | 10 +- ...{S7ValueConverter.cs => ValueConverter.cs} | 10 +- ...7VariableAddress.cs => VariableAddress.cs} | 2 +- ...bleNameParser.cs => VariableNameParser.cs} | 6 +- 17 files changed, 142 insertions(+), 142 deletions(-) delete mode 100644 Sharp7.Rx.Tests/S7VariableNameParserTests.cs rename Sharp7.Rx.Tests/{S7ValueConverterTests => ValueConverterTests}/ConvertBothWays.cs (92%) rename Sharp7.Rx.Tests/{S7ValueConverterTests => ValueConverterTests}/ConverterTestBase.cs (91%) rename Sharp7.Rx.Tests/{S7ValueConverterTests => ValueConverterTests}/ReadFromBuffer.cs (84%) rename Sharp7.Rx.Tests/{S7ValueConverterTests => ValueConverterTests}/WriteToBuffer.cs (84%) rename Sharp7.Rx.Tests/{S7VariableAddressTests => VariableAddressTests}/MatchesType.cs (92%) create mode 100644 Sharp7.Rx.Tests/VariableNameParserTests.cs delete mode 100644 Sharp7.Rx/Interfaces/IS7VariableNameParser.cs create mode 100644 Sharp7.Rx/Interfaces/IVariableNameParser.cs rename Sharp7.Rx/{S7ValueConverter.cs => ValueConverter.cs} (96%) rename Sharp7.Rx/{S7VariableAddress.cs => VariableAddress.cs} (96%) rename Sharp7.Rx/{S7VariableNameParser.cs => VariableNameParser.cs} (96%) diff --git a/Sharp7.Rx.Tests/S7VariableNameParserTests.cs b/Sharp7.Rx.Tests/S7VariableNameParserTests.cs deleted file mode 100644 index 50a460a..0000000 --- a/Sharp7.Rx.Tests/S7VariableNameParserTests.cs +++ /dev/null @@ -1,91 +0,0 @@ -using DeepEqual.Syntax; -using NUnit.Framework; -using Sharp7.Rx.Enums; -using Shouldly; - -namespace Sharp7.Rx.Tests; - -[TestFixture] -internal class S7VariableNameParserTests -{ - [TestCaseSource(nameof(ValidTestCases))] - public void Run(TestCase tc) - { - var parser = new S7VariableNameParser(); - var resp = parser.Parse(tc.Input); - resp.ShouldDeepEqual(tc.Expected); - } - - [TestCase("DB506.Bit216", TestName = "Bit without Bit")] - [TestCase("DB506.Bit216.8", TestName = "Bit to high")] - [TestCase("DB506.String216", TestName = "String without Length")] - [TestCase("DB506.WString216", TestName = "WString without Length")] - - [TestCase("DB506.Int216.1", TestName = "Int with Length")] - [TestCase("DB506.UInt216.1", TestName = "UInt with Length")] - [TestCase("DB506.DInt216.1", TestName = "DInt with Length")] - [TestCase("DB506.UDInt216.1", TestName = "UDInt with Length")] - [TestCase("DB506.LInt216.1", TestName = "LInt with Length")] - [TestCase("DB506.ULInt216.1", TestName = "ULInt with Length")] - [TestCase("DB506.Real216.1", TestName = "LReal with Length")] - [TestCase("DB506.LReal216.1", TestName = "LReal with Length")] - - [TestCase("DB506.xx216", TestName = "Invalid type")] - [TestCase("DB506.216", TestName = "No type")] - [TestCase("DB506.Int216.", TestName = "Trailing dot")] - [TestCase("x506.Int216", TestName = "Wrong type")] - [TestCase("506.Int216", TestName = "No type")] - [TestCase("", TestName = "empty")] - [TestCase(" ", TestName = "space")] - [TestCase(" DB506.Int216", TestName = "leading space")] - [TestCase("DB506.Int216 ", TestName = "trailing space")] - [TestCase("DB.Int216 ", TestName = "No db")] - [TestCase("DB5061234.Int216.1", TestName = "DB too large")] - public void Invalid(string? input) - { - var parser = new S7VariableNameParser(); - Should.Throw(() => parser.Parse(input)); - } - - public static IEnumerable ValidTestCases() - { - yield return new TestCase("DB506.Bit216.2", new S7VariableAddress {Operand = Operand.Db, DbNr = 506, Start = 216, Length = 1, Bit = 2, Type = DbType.Bit}); - - yield return new TestCase("DB506.String216.10", new S7VariableAddress {Operand = Operand.Db, DbNr = 506, Start = 216, Length = 10, Type = DbType.String}); - yield return new TestCase("DB506.WString216.10", new S7VariableAddress {Operand = Operand.Db, DbNr = 506, Start = 216, Length = 10, Type = DbType.WString}); - - yield return new TestCase("DB506.Byte216", new S7VariableAddress {Operand = Operand.Db, DbNr = 506, Start = 216, Length = 1, Type = DbType.Byte}); - yield return new TestCase("DB506.Byte216.100", new S7VariableAddress {Operand = Operand.Db, DbNr = 506, Start = 216, Length = 100, Type = DbType.Byte}); - yield return new TestCase("DB506.Int216", new S7VariableAddress {Operand = Operand.Db, DbNr = 506, Start = 216, Length = 2, Type = DbType.Int}); - yield return new TestCase("DB506.UInt216", new S7VariableAddress {Operand = Operand.Db, DbNr = 506, Start = 216, Length = 2, Type = DbType.UInt}); - yield return new TestCase("DB506.DInt216", new S7VariableAddress {Operand = Operand.Db, DbNr = 506, Start = 216, Length = 4, Type = DbType.DInt}); - yield return new TestCase("DB506.UDInt216", new S7VariableAddress {Operand = Operand.Db, DbNr = 506, Start = 216, Length = 4, Type = DbType.UDInt}); - yield return new TestCase("DB506.LInt216", new S7VariableAddress {Operand = Operand.Db, DbNr = 506, Start = 216, Length = 8, Type = DbType.LInt}); - yield return new TestCase("DB506.ULInt216", new S7VariableAddress {Operand = Operand.Db, DbNr = 506, Start = 216, Length = 8, Type = DbType.ULInt}); - - yield return new TestCase("DB506.Real216", new S7VariableAddress {Operand = Operand.Db, DbNr = 506, Start = 216, Length = 4, Type = DbType.Single}); - yield return new TestCase("DB506.LReal216", new S7VariableAddress {Operand = Operand.Db, DbNr = 506, Start = 216, Length = 8, Type = DbType.Double}); - - - // Legacy - yield return new TestCase("DB13.DBX3.1", new S7VariableAddress {Operand = Operand.Db, DbNr = 13, Start = 3, Length = 1, Bit = 1, Type = DbType.Bit}); - yield return new TestCase("Db403.X5.2", new S7VariableAddress {Operand = Operand.Db, DbNr = 403, Start = 5, Length = 1, Bit = 2, Type = DbType.Bit}); - yield return new TestCase("DB55DBX23.6", new S7VariableAddress {Operand = Operand.Db, DbNr = 55, Start = 23, Length = 1, Bit = 6, Type = DbType.Bit}); - yield return new TestCase("DB1.S255.20", new S7VariableAddress {Operand = Operand.Db, DbNr = 1, Start = 255, Length = 20, Type = DbType.String}); - yield return new TestCase("DB5.String887.20", new S7VariableAddress {Operand = Operand.Db, DbNr = 5, Start = 887, Length = 20, Type = DbType.String}); - yield return new TestCase("DB506.B216", new S7VariableAddress {Operand = Operand.Db, DbNr = 506, Start = 216, Length = 1, Type = DbType.Byte}); - yield return new TestCase("DB506.DBB216.5", new S7VariableAddress {Operand = Operand.Db, DbNr = 506, Start = 216, Length = 5, Type = DbType.Byte}); - yield return new TestCase("DB506.D216", new S7VariableAddress {Operand = Operand.Db, DbNr = 506, Start = 216, Length = 4, Type = DbType.Single}); - yield return new TestCase("DB506.DINT216", new S7VariableAddress {Operand = Operand.Db, DbNr = 506, Start = 216, Length = 4, Type = DbType.DInt}); - yield return new TestCase("DB506.INT216", new S7VariableAddress {Operand = Operand.Db, DbNr = 506, Start = 216, Length = 2, Type = DbType.Int}); - yield return new TestCase("DB506.DBW216", new S7VariableAddress {Operand = Operand.Db, DbNr = 506, Start = 216, Length = 2, Type = DbType.Int}); - yield return new TestCase("DB506.DUL216", new S7VariableAddress {Operand = Operand.Db, DbNr = 506, Start = 216, Length = 8, Type = DbType.ULInt}); - yield return new TestCase("DB506.DULINT216", new S7VariableAddress {Operand = Operand.Db, DbNr = 506, Start = 216, Length = 8, Type = DbType.ULInt}); - yield return new TestCase("DB506.DULONG216", new S7VariableAddress {Operand = Operand.Db, DbNr = 506, Start = 216, Length = 8, Type = DbType.ULInt}); - } - - public record TestCase(string Input, S7VariableAddress Expected) - { - public override string ToString() => Input; - } -} diff --git a/Sharp7.Rx.Tests/S7ValueConverterTests/ConvertBothWays.cs b/Sharp7.Rx.Tests/ValueConverterTests/ConvertBothWays.cs similarity index 92% rename from Sharp7.Rx.Tests/S7ValueConverterTests/ConvertBothWays.cs rename to Sharp7.Rx.Tests/ValueConverterTests/ConvertBothWays.cs index b3956ac..39c9be3 100644 --- a/Sharp7.Rx.Tests/S7ValueConverterTests/ConvertBothWays.cs +++ b/Sharp7.Rx.Tests/ValueConverterTests/ConvertBothWays.cs @@ -1,7 +1,7 @@ using NUnit.Framework; using Shouldly; -namespace Sharp7.Rx.Tests.S7ValueConverterTests; +namespace Sharp7.Rx.Tests.ValueConverterTests; [TestFixture] internal class ConvertBothWays : ConverterTestBase diff --git a/Sharp7.Rx.Tests/S7ValueConverterTests/ConverterTestBase.cs b/Sharp7.Rx.Tests/ValueConverterTests/ConverterTestBase.cs similarity index 91% rename from Sharp7.Rx.Tests/S7ValueConverterTests/ConverterTestBase.cs rename to Sharp7.Rx.Tests/ValueConverterTests/ConverterTestBase.cs index f344256..d09c3ed 100644 --- a/Sharp7.Rx.Tests/S7ValueConverterTests/ConverterTestBase.cs +++ b/Sharp7.Rx.Tests/ValueConverterTests/ConverterTestBase.cs @@ -1,15 +1,15 @@ using System.Reflection; using Sharp7.Rx.Interfaces; -namespace Sharp7.Rx.Tests.S7ValueConverterTests; +namespace Sharp7.Rx.Tests.ValueConverterTests; internal abstract class ConverterTestBase { - protected static readonly IS7VariableNameParser Parser = new S7VariableNameParser(); + protected static readonly IVariableNameParser Parser = new VariableNameParser(); public static MethodInfo CreateReadMethod(ConverterTestCase tc) { - var convertMi = typeof(S7ValueConverter).GetMethod(nameof(S7ValueConverter.ReadFromBuffer)); + var convertMi = typeof(ValueConverter).GetMethod(nameof(ValueConverter.ReadFromBuffer)); var convert = convertMi!.MakeGenericMethod(tc.Value.GetType()); return convert; } @@ -69,14 +69,14 @@ internal abstract class ConverterTestBase /// This helper method exists, since I could not manage to invoke a generic method /// accepring a Span<T> as parameter. /// - public static void WriteToBuffer(byte[] buffer, TValue value, S7VariableAddress address) + public static void WriteToBuffer(byte[] buffer, TValue value, VariableAddress address) { - S7ValueConverter.WriteToBuffer(buffer, value, address); + ValueConverter.WriteToBuffer(buffer, value, address); } public record ConverterTestCase(object Value, string Address, byte[] Data) { - public S7VariableAddress VariableAddress => Parser.Parse(Address); + public VariableAddress VariableAddress => Parser.Parse(Address); public override string ToString() => $"{Value.GetType().Name}, {Address}: {Value}"; } diff --git a/Sharp7.Rx.Tests/S7ValueConverterTests/ReadFromBuffer.cs b/Sharp7.Rx.Tests/ValueConverterTests/ReadFromBuffer.cs similarity index 84% rename from Sharp7.Rx.Tests/S7ValueConverterTests/ReadFromBuffer.cs rename to Sharp7.Rx.Tests/ValueConverterTests/ReadFromBuffer.cs index cbb4542..66f08aa 100644 --- a/Sharp7.Rx.Tests/S7ValueConverterTests/ReadFromBuffer.cs +++ b/Sharp7.Rx.Tests/ValueConverterTests/ReadFromBuffer.cs @@ -1,7 +1,7 @@ using NUnit.Framework; using Shouldly; -namespace Sharp7.Rx.Tests.S7ValueConverterTests; +namespace Sharp7.Rx.Tests.ValueConverterTests; [TestFixture] internal class ReadFromBuffer : ConverterTestBase @@ -34,7 +34,7 @@ internal class ReadFromBuffer : ConverterTestBase var variableAddress = Parser.Parse(address); //Act - Should.Throw(() => S7ValueConverter.ReadFromBuffer(data, variableAddress)); + Should.Throw(() => ValueConverter.ReadFromBuffer(data, variableAddress)); } [TestCase(123, "DB12.DINT3", new byte[] {0x01, 0x02, 0x03})] @@ -46,6 +46,6 @@ internal class ReadFromBuffer : ConverterTestBase var variableAddress = Parser.Parse(address); //Act - Should.Throw(() => S7ValueConverter.ReadFromBuffer(data, variableAddress)); + Should.Throw(() => ValueConverter.ReadFromBuffer(data, variableAddress)); } } diff --git a/Sharp7.Rx.Tests/S7ValueConverterTests/WriteToBuffer.cs b/Sharp7.Rx.Tests/ValueConverterTests/WriteToBuffer.cs similarity index 84% rename from Sharp7.Rx.Tests/S7ValueConverterTests/WriteToBuffer.cs rename to Sharp7.Rx.Tests/ValueConverterTests/WriteToBuffer.cs index 4e364fb..0d790f5 100644 --- a/Sharp7.Rx.Tests/S7ValueConverterTests/WriteToBuffer.cs +++ b/Sharp7.Rx.Tests/ValueConverterTests/WriteToBuffer.cs @@ -1,7 +1,7 @@ using NUnit.Framework; using Shouldly; -namespace Sharp7.Rx.Tests.S7ValueConverterTests; +namespace Sharp7.Rx.Tests.ValueConverterTests; [TestFixture] internal class WriteToBuffer : ConverterTestBase @@ -37,7 +37,7 @@ internal class WriteToBuffer : ConverterTestBase var buffer = new byte[bufferSize]; //Act - Should.Throw(() => S7ValueConverter.WriteToBuffer(buffer, input, variableAddress)); + Should.Throw(() => ValueConverter.WriteToBuffer(buffer, input, variableAddress)); } [TestCase((char) 18, "DB0.DBB0")] @@ -48,6 +48,6 @@ internal class WriteToBuffer : ConverterTestBase var buffer = new byte[variableAddress.BufferLength]; //Act - Should.Throw(() => S7ValueConverter.WriteToBuffer(buffer, input, variableAddress)); + Should.Throw(() => ValueConverter.WriteToBuffer(buffer, input, variableAddress)); } } diff --git a/Sharp7.Rx.Tests/S7VariableAddressTests/MatchesType.cs b/Sharp7.Rx.Tests/VariableAddressTests/MatchesType.cs similarity index 92% rename from Sharp7.Rx.Tests/S7VariableAddressTests/MatchesType.cs rename to Sharp7.Rx.Tests/VariableAddressTests/MatchesType.cs index 458c17d..abaeae5 100644 --- a/Sharp7.Rx.Tests/S7VariableAddressTests/MatchesType.cs +++ b/Sharp7.Rx.Tests/VariableAddressTests/MatchesType.cs @@ -1,15 +1,15 @@ using NUnit.Framework; using Sharp7.Rx.Extensions; using Sharp7.Rx.Interfaces; -using Sharp7.Rx.Tests.S7ValueConverterTests; +using Sharp7.Rx.Tests.ValueConverterTests; using Shouldly; -namespace Sharp7.Rx.Tests.S7VariableAddressTests; +namespace Sharp7.Rx.Tests.VariableAddressTests; [TestFixture] public class MatchesType { - static readonly IS7VariableNameParser parser = new S7VariableNameParser(); + static readonly IVariableNameParser parser = new VariableNameParser(); private static readonly IReadOnlyList typeList = new[] { diff --git a/Sharp7.Rx.Tests/VariableNameParserTests.cs b/Sharp7.Rx.Tests/VariableNameParserTests.cs new file mode 100644 index 0000000..577f7d0 --- /dev/null +++ b/Sharp7.Rx.Tests/VariableNameParserTests.cs @@ -0,0 +1,91 @@ +using DeepEqual.Syntax; +using NUnit.Framework; +using Sharp7.Rx.Enums; +using Shouldly; + +namespace Sharp7.Rx.Tests; + +[TestFixture] +internal class VariableNameParserTests +{ + [TestCaseSource(nameof(ValidTestCases))] + public void Run(TestCase tc) + { + var parser = new VariableNameParser(); + var resp = parser.Parse(tc.Input); + resp.ShouldDeepEqual(tc.Expected); + } + + [TestCase("DB506.Bit216", TestName = "Bit without Bit")] + [TestCase("DB506.Bit216.8", TestName = "Bit to high")] + [TestCase("DB506.String216", TestName = "String without Length")] + [TestCase("DB506.WString216", TestName = "WString without Length")] + + [TestCase("DB506.Int216.1", TestName = "Int with Length")] + [TestCase("DB506.UInt216.1", TestName = "UInt with Length")] + [TestCase("DB506.DInt216.1", TestName = "DInt with Length")] + [TestCase("DB506.UDInt216.1", TestName = "UDInt with Length")] + [TestCase("DB506.LInt216.1", TestName = "LInt with Length")] + [TestCase("DB506.ULInt216.1", TestName = "ULInt with Length")] + [TestCase("DB506.Real216.1", TestName = "LReal with Length")] + [TestCase("DB506.LReal216.1", TestName = "LReal with Length")] + + [TestCase("DB506.xx216", TestName = "Invalid type")] + [TestCase("DB506.216", TestName = "No type")] + [TestCase("DB506.Int216.", TestName = "Trailing dot")] + [TestCase("x506.Int216", TestName = "Wrong type")] + [TestCase("506.Int216", TestName = "No type")] + [TestCase("", TestName = "empty")] + [TestCase(" ", TestName = "space")] + [TestCase(" DB506.Int216", TestName = "leading space")] + [TestCase("DB506.Int216 ", TestName = "trailing space")] + [TestCase("DB.Int216 ", TestName = "No db")] + [TestCase("DB5061234.Int216.1", TestName = "DB too large")] + public void Invalid(string? input) + { + var parser = new VariableNameParser(); + Should.Throw(() => parser.Parse(input)); + } + + public static IEnumerable ValidTestCases() + { + yield return new TestCase("DB506.Bit216.2", new VariableAddress {Operand = Operand.Db, DbNr = 506, Start = 216, Length = 1, Bit = 2, Type = DbType.Bit}); + + yield return new TestCase("DB506.String216.10", new VariableAddress {Operand = Operand.Db, DbNr = 506, Start = 216, Length = 10, Type = DbType.String}); + yield return new TestCase("DB506.WString216.10", new VariableAddress {Operand = Operand.Db, DbNr = 506, Start = 216, Length = 10, Type = DbType.WString}); + + yield return new TestCase("DB506.Byte216", new VariableAddress {Operand = Operand.Db, DbNr = 506, Start = 216, Length = 1, Type = DbType.Byte}); + yield return new TestCase("DB506.Byte216.100", new VariableAddress {Operand = Operand.Db, DbNr = 506, Start = 216, Length = 100, Type = DbType.Byte}); + yield return new TestCase("DB506.Int216", new VariableAddress {Operand = Operand.Db, DbNr = 506, Start = 216, Length = 2, Type = DbType.Int}); + yield return new TestCase("DB506.UInt216", new VariableAddress {Operand = Operand.Db, DbNr = 506, Start = 216, Length = 2, Type = DbType.UInt}); + yield return new TestCase("DB506.DInt216", new VariableAddress {Operand = Operand.Db, DbNr = 506, Start = 216, Length = 4, Type = DbType.DInt}); + yield return new TestCase("DB506.UDInt216", new VariableAddress {Operand = Operand.Db, DbNr = 506, Start = 216, Length = 4, Type = DbType.UDInt}); + yield return new TestCase("DB506.LInt216", new VariableAddress {Operand = Operand.Db, DbNr = 506, Start = 216, Length = 8, Type = DbType.LInt}); + yield return new TestCase("DB506.ULInt216", new VariableAddress {Operand = Operand.Db, DbNr = 506, Start = 216, Length = 8, Type = DbType.ULInt}); + + yield return new TestCase("DB506.Real216", new VariableAddress {Operand = Operand.Db, DbNr = 506, Start = 216, Length = 4, Type = DbType.Single}); + yield return new TestCase("DB506.LReal216", new VariableAddress {Operand = Operand.Db, DbNr = 506, Start = 216, Length = 8, Type = DbType.Double}); + + + // Legacy + yield return new TestCase("DB13.DBX3.1", new VariableAddress {Operand = Operand.Db, DbNr = 13, Start = 3, Length = 1, Bit = 1, Type = DbType.Bit}); + yield return new TestCase("Db403.X5.2", new VariableAddress {Operand = Operand.Db, DbNr = 403, Start = 5, Length = 1, Bit = 2, Type = DbType.Bit}); + yield return new TestCase("DB55DBX23.6", new VariableAddress {Operand = Operand.Db, DbNr = 55, Start = 23, Length = 1, Bit = 6, Type = DbType.Bit}); + yield return new TestCase("DB1.S255.20", new VariableAddress {Operand = Operand.Db, DbNr = 1, Start = 255, Length = 20, Type = DbType.String}); + yield return new TestCase("DB5.String887.20", new VariableAddress {Operand = Operand.Db, DbNr = 5, Start = 887, Length = 20, Type = DbType.String}); + yield return new TestCase("DB506.B216", new VariableAddress {Operand = Operand.Db, DbNr = 506, Start = 216, Length = 1, Type = DbType.Byte}); + yield return new TestCase("DB506.DBB216.5", new VariableAddress {Operand = Operand.Db, DbNr = 506, Start = 216, Length = 5, Type = DbType.Byte}); + yield return new TestCase("DB506.D216", new VariableAddress {Operand = Operand.Db, DbNr = 506, Start = 216, Length = 4, Type = DbType.Single}); + yield return new TestCase("DB506.DINT216", new VariableAddress {Operand = Operand.Db, DbNr = 506, Start = 216, Length = 4, Type = DbType.DInt}); + yield return new TestCase("DB506.INT216", new VariableAddress {Operand = Operand.Db, DbNr = 506, Start = 216, Length = 2, Type = DbType.Int}); + yield return new TestCase("DB506.DBW216", new VariableAddress {Operand = Operand.Db, DbNr = 506, Start = 216, Length = 2, Type = DbType.Int}); + yield return new TestCase("DB506.DUL216", new VariableAddress {Operand = Operand.Db, DbNr = 506, Start = 216, Length = 8, Type = DbType.ULInt}); + yield return new TestCase("DB506.DULINT216", new VariableAddress {Operand = Operand.Db, DbNr = 506, Start = 216, Length = 8, Type = DbType.ULInt}); + yield return new TestCase("DB506.DULONG216", new VariableAddress {Operand = Operand.Db, DbNr = 506, Start = 216, Length = 8, Type = DbType.ULInt}); + } + + public record TestCase(string Input, VariableAddress Expected) + { + public override string ToString() => Input; + } +} diff --git a/Sharp7.Rx/CacheVariableNameParser.cs b/Sharp7.Rx/CacheVariableNameParser.cs index d24ef98..c4d42a9 100644 --- a/Sharp7.Rx/CacheVariableNameParser.cs +++ b/Sharp7.Rx/CacheVariableNameParser.cs @@ -3,16 +3,16 @@ using Sharp7.Rx.Interfaces; namespace Sharp7.Rx; -internal class CacheVariableNameParser : IS7VariableNameParser +internal class CacheVariableNameParser : IVariableNameParser { - private static readonly ConcurrentDictionary addressCache = new ConcurrentDictionary(StringComparer.OrdinalIgnoreCase); + private static readonly ConcurrentDictionary addressCache = new ConcurrentDictionary(StringComparer.OrdinalIgnoreCase); - private readonly IS7VariableNameParser inner; + private readonly IVariableNameParser inner; - public CacheVariableNameParser(IS7VariableNameParser inner) + public CacheVariableNameParser(IVariableNameParser inner) { this.inner = inner; } - public S7VariableAddress Parse(string input) => addressCache.GetOrAdd(input, inner.Parse); + public VariableAddress Parse(string input) => addressCache.GetOrAdd(input, inner.Parse); } diff --git a/Sharp7.Rx/Exceptions/S7Exception.cs b/Sharp7.Rx/Exceptions/S7Exception.cs index 2d8fb44..7fd9915 100644 --- a/Sharp7.Rx/Exceptions/S7Exception.cs +++ b/Sharp7.Rx/Exceptions/S7Exception.cs @@ -31,13 +31,13 @@ public class S7CommunicationException : S7Exception public class DataTypeMissmatchException : S7Exception { - internal DataTypeMissmatchException(string message, Type type, S7VariableAddress address) : base(message) + internal DataTypeMissmatchException(string message, Type type, VariableAddress address) : base(message) { Type = type; Address = address.ToString(); } - internal DataTypeMissmatchException(string message, Exception innerException, Type type, S7VariableAddress address) : base(message, innerException) + internal DataTypeMissmatchException(string message, Exception innerException, Type type, VariableAddress address) : base(message, innerException) { Type = type; Address = address.ToString(); @@ -50,13 +50,13 @@ public class DataTypeMissmatchException : S7Exception public class UnsupportedS7TypeException : S7Exception { - internal UnsupportedS7TypeException(string message, Type type, S7VariableAddress address) : base(message) + internal UnsupportedS7TypeException(string message, Type type, VariableAddress address) : base(message) { Type = type; Address = address.ToString(); } - internal UnsupportedS7TypeException(string message, Exception innerException, Type type, S7VariableAddress address) : base(message, innerException) + internal UnsupportedS7TypeException(string message, Exception innerException, Type type, VariableAddress address) : base(message, innerException) { Type = type; Address = address.ToString(); diff --git a/Sharp7.Rx/Extensions/S7VariableExtensions.cs b/Sharp7.Rx/Extensions/S7VariableExtensions.cs index 40c8eed..ae04de3 100644 --- a/Sharp7.Rx/Extensions/S7VariableExtensions.cs +++ b/Sharp7.Rx/Extensions/S7VariableExtensions.cs @@ -2,9 +2,9 @@ namespace Sharp7.Rx.Extensions; -internal static class S7VariableAddressExtensions +internal static class VariableAddressExtensions { - private static readonly Dictionary> supportedTypeMap = new() + private static readonly Dictionary> supportedTypeMap = new() { {typeof(bool), a => a.Type == DbType.Bit}, {typeof(string), a => a.Type is DbType.String or DbType.WString or DbType.Byte }, @@ -20,6 +20,6 @@ internal static class S7VariableAddressExtensions {typeof(byte[]), a => a.Type==DbType.Byte}, }; - public static bool MatchesType(this S7VariableAddress address, Type type) => + public static bool MatchesType(this VariableAddress address, Type type) => supportedTypeMap.TryGetValue(type, out var map) && map(address); } diff --git a/Sharp7.Rx/Interfaces/IS7VariableNameParser.cs b/Sharp7.Rx/Interfaces/IS7VariableNameParser.cs deleted file mode 100644 index ae81d67..0000000 --- a/Sharp7.Rx/Interfaces/IS7VariableNameParser.cs +++ /dev/null @@ -1,7 +0,0 @@ -#nullable enable -namespace Sharp7.Rx.Interfaces; - -internal interface IS7VariableNameParser -{ - S7VariableAddress Parse(string input); -} diff --git a/Sharp7.Rx/Interfaces/IVariableNameParser.cs b/Sharp7.Rx/Interfaces/IVariableNameParser.cs new file mode 100644 index 0000000..d6f8219 --- /dev/null +++ b/Sharp7.Rx/Interfaces/IVariableNameParser.cs @@ -0,0 +1,7 @@ +#nullable enable +namespace Sharp7.Rx.Interfaces; + +internal interface IVariableNameParser +{ + VariableAddress Parse(string input); +} diff --git a/Sharp7.Rx/Sharp7Connector.cs b/Sharp7.Rx/Sharp7Connector.cs index e1684cf..695e20d 100644 --- a/Sharp7.Rx/Sharp7Connector.cs +++ b/Sharp7.Rx/Sharp7Connector.cs @@ -32,13 +32,13 @@ internal class Sharp7Connector : IS7Connector private readonly int port; private readonly int rackNr; private readonly LimitedConcurrencyLevelTaskScheduler scheduler = new(maxDegreeOfParallelism: 1); - private readonly IS7VariableNameParser variableNameParser; + private readonly IVariableNameParser variableNameParser; private bool disposed; private S7Client sharp7; - public Sharp7Connector(PlcConnectionSettings settings, IS7VariableNameParser variableNameParser) + public Sharp7Connector(PlcConnectionSettings settings, IVariableNameParser variableNameParser) { this.variableNameParser = variableNameParser; ipAddress = settings.IpAddress; diff --git a/Sharp7.Rx/Sharp7Plc.cs b/Sharp7.Rx/Sharp7Plc.cs index 904294b..b799924 100644 --- a/Sharp7.Rx/Sharp7Plc.cs +++ b/Sharp7.Rx/Sharp7Plc.cs @@ -17,7 +17,7 @@ public class Sharp7Plc : IPlc private readonly ConcurrentSubjectDictionary multiVariableSubscriptions = new(StringComparer.InvariantCultureIgnoreCase); private readonly List performanceCoutner = new(1000); private readonly PlcConnectionSettings plcConnectionSettings; - private readonly IS7VariableNameParser varaibleNameParser = new CacheVariableNameParser(new S7VariableNameParser()); + private readonly IVariableNameParser varaibleNameParser = new CacheVariableNameParser(new VariableNameParser()); private bool disposed; private Sharp7Connector s7Connector; @@ -89,7 +89,7 @@ public class Sharp7Plc : IPlc Observable.FromAsync(() => GetValue(variableName)) .Concat( disposeableContainer.Observable - .Select(bytes => S7ValueConverter.ReadFromBuffer(bytes, address)) + .Select(bytes => ValueConverter.ReadFromBuffer(bytes, address)) ); if (transmissionMode == TransmissionMode.OnChange) @@ -119,7 +119,7 @@ public class Sharp7Plc : IPlc var address = ParseAndVerify(variableName, typeof(TValue)); var data = await s7Connector.ReadBytes(address.Operand, address.Start, address.BufferLength, address.DbNr, token); - return S7ValueConverter.ReadFromBuffer(data, address); + return ValueConverter.ReadFromBuffer(data, address); } public async Task InitializeAsync() @@ -161,7 +161,7 @@ public class Sharp7Plc : IPlc { // TODO: Use ArrayPool.Rent() once we drop Framwework support var bytes = new byte[address.BufferLength]; - S7ValueConverter.WriteToBuffer(bytes, value, address); + ValueConverter.WriteToBuffer(bytes, value, address); await s7Connector.WriteBytes(address.Operand, address.Start, bytes, address.DbNr, token); } @@ -213,7 +213,7 @@ public class Sharp7Plc : IPlc return Unit.Default; } - private S7VariableAddress ParseAndVerify(string variableName, Type type) + private VariableAddress ParseAndVerify(string variableName, Type type) { var address = varaibleNameParser.Parse(variableName); if (!address.MatchesType(type)) diff --git a/Sharp7.Rx/S7ValueConverter.cs b/Sharp7.Rx/ValueConverter.cs similarity index 96% rename from Sharp7.Rx/S7ValueConverter.cs rename to Sharp7.Rx/ValueConverter.cs index 4bc23f8..83078c2 100644 --- a/Sharp7.Rx/S7ValueConverter.cs +++ b/Sharp7.Rx/ValueConverter.cs @@ -5,7 +5,7 @@ using Sharp7.Rx.Enums; namespace Sharp7.Rx; -internal static class S7ValueConverter +internal static class ValueConverter { private static readonly Dictionary writeFunctions = new() { @@ -175,7 +175,7 @@ internal static class S7ValueConverter }, }; - public static TValue ReadFromBuffer(byte[] buffer, S7VariableAddress address) + public static TValue ReadFromBuffer(byte[] buffer, VariableAddress address) { // Todo: Change to Span when switched to newer .net @@ -191,7 +191,7 @@ internal static class S7ValueConverter return (TValue) result; } - public static void WriteToBuffer(Span buffer, TValue value, S7VariableAddress address) + public static void WriteToBuffer(Span buffer, TValue value, VariableAddress address) { if (buffer.Length < address.BufferLength) throw new ArgumentException($"Buffer must be at least {address.BufferLength} bytes long for {address}", nameof(buffer)); @@ -204,7 +204,7 @@ internal static class S7ValueConverter writeFunc(buffer, address, value); } - delegate object ReadFunc(byte[] data, S7VariableAddress address); + delegate object ReadFunc(byte[] data, VariableAddress address); [StructLayout(LayoutKind.Explicit)] private struct UInt32SingleMap @@ -220,5 +220,5 @@ internal static class S7ValueConverter [FieldOffset(0)] public double Double; } - delegate void WriteFunc(Span data, S7VariableAddress address, object value); + delegate void WriteFunc(Span data, VariableAddress address, object value); } diff --git a/Sharp7.Rx/S7VariableAddress.cs b/Sharp7.Rx/VariableAddress.cs similarity index 96% rename from Sharp7.Rx/S7VariableAddress.cs rename to Sharp7.Rx/VariableAddress.cs index f04bd34..7e116e7 100644 --- a/Sharp7.Rx/S7VariableAddress.cs +++ b/Sharp7.Rx/VariableAddress.cs @@ -4,7 +4,7 @@ using Sharp7.Rx.Enums; namespace Sharp7.Rx; [NoReorder] -internal class S7VariableAddress +internal class VariableAddress { public Operand Operand { get; set; } public ushort DbNr { get; set; } diff --git a/Sharp7.Rx/S7VariableNameParser.cs b/Sharp7.Rx/VariableNameParser.cs similarity index 96% rename from Sharp7.Rx/S7VariableNameParser.cs rename to Sharp7.Rx/VariableNameParser.cs index b53fcc9..8c2bef7 100644 --- a/Sharp7.Rx/S7VariableNameParser.cs +++ b/Sharp7.Rx/VariableNameParser.cs @@ -6,7 +6,7 @@ using Sharp7.Rx.Interfaces; namespace Sharp7.Rx; -internal class S7VariableNameParser : IS7VariableNameParser +internal class VariableNameParser : IVariableNameParser { private static readonly Regex regex = new(@"^(?db)(?\d+)\.?(?[a-z]+)(?\d+)(\.(?\d+))?$", RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.CultureInvariant); @@ -46,7 +46,7 @@ internal class S7VariableNameParser : IS7VariableNameParser {"x", DbType.Bit}, }; - public S7VariableAddress Parse(string input) + public VariableAddress Parse(string input) { if (input == null) throw new ArgumentNullException(nameof(input)); @@ -111,7 +111,7 @@ internal class S7VariableNameParser : IS7VariableNameParser byte? bit = type == DbType.Bit ? GetBit() : null; - var s7VariableAddress = new S7VariableAddress + var s7VariableAddress = new VariableAddress { Operand = operand, DbNr = dbNr,