From 955b0e7118ed218911dcff6875773cbe151eaa44 Mon Sep 17 00:00:00 2001 From: ig Date: Sat, 25 Feb 2023 15:53:58 +0100 Subject: [PATCH 01/12] tie namespace and assembly names to directory structure --- csharp/InnovEnergy.props | 5 +-- csharp/InnovEnergy.sln | 2 +- csharp/app/Backend/Backend.csproj | 20 ++--------- csharp/app/BmsTunnel/BatteryConnection.cs | 4 +-- csharp/app/BmsTunnel/BmsTunnel.cs | 2 +- csharp/app/BmsTunnel/BmsTunnel.csproj | 4 --- csharp/app/BmsTunnel/CliPrograms.cs | 2 +- csharp/app/BmsTunnel/Program.cs | 2 +- csharp/app/Collector/Collector.csproj | 4 --- csharp/app/Collector/src/BatteryDataParser.cs | 8 ++--- .../app/Collector/src/BatteryDataParserV4.cs | 8 ++--- .../Collector/src/Influx/FieldAttribute.cs | 2 +- .../app/Collector/src/Influx/InfluxRecord.cs | 6 ++-- .../src/Influx/LineProtocolSyntax.cs | 2 +- .../app/Collector/src/Influx/TagAttribute.cs | 2 +- csharp/app/Collector/src/Program.cs | 12 +++---- csharp/app/Collector/src/Records/Alarms.cs | 4 +-- .../Collector/src/Records/BatteryRecord.cs | 2 +- .../Collector/src/Records/BatteryStatus.cs | 4 +-- csharp/app/Collector/src/Records/Error.cs | 4 +-- .../src/Records/InstallationStatus.cs | 4 +-- csharp/app/Collector/src/Records/IoStatus.cs | 4 +-- csharp/app/Collector/src/Records/Leds.cs | 4 +-- .../app/Collector/src/Records/Temperatures.cs | 5 ++- csharp/app/Collector/src/Records/Warnings.cs | 5 ++- csharp/app/Collector/src/Settings.cs | 2 +- csharp/app/Collector/src/Utils/Extensions.cs | 2 +- csharp/app/Collector/src/Utils/Log.cs | 2 +- csharp/app/Collector/src/Utils/Property.cs | 2 +- .../src/Utils/ReadOnlyListExtensions.cs | 2 +- csharp/app/Collector/src/Utils/Utils.cs | 2 +- csharp/app/EmuMeterDriver/Config.cs | 2 +- csharp/app/EmuMeterDriver/EmuMeterDriver.cs | 3 +- .../app/EmuMeterDriver/EmuMeterDriver.csproj | 4 --- csharp/app/EmuMeterDriver/Nic.cs | 2 +- csharp/app/EmuMeterDriver/Program.cs | 2 +- csharp/app/EmuMeterDriver/Signal.cs | 2 +- csharp/app/EmuMeterDriver/Utils.cs | 2 +- csharp/app/InnovEnergy.app.props | 2 +- csharp/app/OpenVpnCertificatesServer/Files.cs | 4 +-- csharp/app/OpenVpnCertificatesServer/Http.cs | 5 ++- .../OpenVpnCertificatesServer.csproj | 4 --- .../PKI/CertificateAuthority.cs | 2 +- .../app/OpenVpnCertificatesServer/PKI/Pem.cs | 2 +- .../PKI/PwdFinder.cs | 2 +- .../app/OpenVpnCertificatesServer/Program.cs | 13 ++++--- csharp/app/OpenVpnCertificatesServer/Utils.cs | 5 ++- csharp/app/RemoteSupportConsole/Login.cs | 2 +- .../ObservablePipeSource.cs | 2 +- csharp/app/RemoteSupportConsole/Program.cs | 2 +- .../RemoteSupportConsole.csproj | 4 --- csharp/app/RemoteSupportConsole/Ssh.cs | 2 +- .../app/RemoteSupportConsole/VpnConnection.cs | 2 +- csharp/app/RemoteSupportConsole/VpnInfo.cs | 2 +- .../app/RemoteSupportConsole/VrmConnection.cs | 2 +- csharp/app/RemoteSupportConsole/VrmInfo.cs | 2 +- csharp/app/RemoteSupportConsole/VrmProxy.cs | 2 +- csharp/app/SaliMax/SaliMax.csproj | 35 +++++++++---------- csharp/app/SaliMax/src/AsciiArt.cs | 2 +- csharp/app/SaliMax/src/BusPort.cs | 2 +- .../src/Controller/AvgBatteriesStatus.cs | 2 +- csharp/app/SaliMax/src/Controller/Control.cs | 4 +-- .../SaliMax/src/Controller/ControlRecord.cs | 6 ++-- .../SaliMax/src/Controller/ControlTarget.cs | 2 +- .../app/SaliMax/src/Controller/Controller.cs | 10 +++--- .../SaliMax/src/Controller/SaliMaxState.cs | 2 +- csharp/app/SaliMax/src/Controller/State.cs | 2 +- .../app/SaliMax/src/Controller/StateConfig.cs | 2 +- .../SaliMax/src/Controller/StatusRecord.cs | 8 ++--- csharp/app/SaliMax/src/Log/Ampt.cs | 4 +-- csharp/app/SaliMax/src/Log/Battery48Tl.cs | 2 +- csharp/app/SaliMax/src/Log/EmuMeter.cs | 4 +-- csharp/app/SaliMax/src/Log/JsonUtil.cs | 2 +- csharp/app/SaliMax/src/Log/Salimax.cs | 6 ++-- csharp/app/SaliMax/src/Log/TruConvertAc.cs | 4 +-- csharp/app/SaliMax/src/Log/TruConvertDc.cs | 4 +-- csharp/app/SaliMax/src/Program.cs | 20 +++++------ csharp/app/SaliMax/src/S3Config.cs | 2 +- .../src/SaliMaxRelays/RelayMapBoolean.cs | 2 +- .../src/SaliMaxRelays/SaliMaxRelaysDevice.cs | 2 +- .../src/SaliMaxRelays/SaliMaxRelaysStatus.cs | 2 +- csharp/app/SaliMax/src/SystemConfig/Config.cs | 2 +- .../app/SaliMax/src/SystemConfig/Defaults.cs | 2 +- .../SaliMax/src/SystemConfig/SalimaxConfig.cs | 4 +-- csharp/app/SaliMax/src/Topology.cs | 8 ++--- csharp/app/SaliMax/src/Utils.cs | 2 +- csharp/lib/Channels/Channels.csproj | 4 --- .../Channels/V2/Bak/Connections/Connection.cs | 2 +- .../V2/Bak/Connections/Connections.cs | 2 +- .../Channels/V2/Bak/Connections/Extensions.cs | 2 +- .../V2/Bak/Connections/IConnection.cs | 2 +- csharp/lib/Channels/V2/Bak/GenericChannel.cs | 4 +-- csharp/lib/Devices/AMPT/Ampt.csproj | 2 +- .../lib/Devices/AMPT/AmptCommunicationUnit.cs | 2 +- csharp/lib/Devices/AMPT/AmptDeviceStatus.cs | 2 +- csharp/lib/Devices/AMPT/AmptStatus.cs | 5 +-- csharp/lib/Devices/AMPT/AmptStringStatus.cs | 2 +- csharp/lib/Devices/Adam6060/Adam6060.csproj | 2 +- .../Devices/Battery48TL/Battery48TL.csproj | 2 +- csharp/lib/Devices/EmuMeter/EmuMeter.csproj | 2 +- .../Trumpf/TruConvert/TruConvert.csproj | 8 ++--- .../Trumpf/TruConvertAc/AlarmMessage.cs | 2 +- .../Trumpf/TruConvertAc/TruConvertAc.csproj | 2 +- .../Trumpf/TruConvertAc/WarningMessage.cs | 2 +- .../Trumpf/TruConvertDc/TruConvertDc.csproj | 2 +- csharp/lib/InnovEnergy.lib.props | 1 + csharp/lib/Protocols/DBus/DBus.csproj | 2 +- csharp/lib/Protocols/Modbus/Modbus.csproj | 2 +- csharp/lib/S3/DataRec.cs | 4 +-- .../Drivers/Internal/Delegates/ReadRecord.cs | 6 ++-- .../Drivers/Internal/Delegates/WriteRecord.cs | 6 ++-- csharp/lib/S3/Drivers/Internal/Reader.cs | 10 +++--- .../lib/S3/Drivers/Internal/Reader.public.cs | 8 ++--- .../S3/Drivers/Internal/Util/Aggregator.cs | 8 ++--- .../lib/S3/Drivers/Internal/Util/Sampler.cs | 10 +++--- csharp/lib/S3/Drivers/Internal/Writer.cs | 14 ++++---- .../lib/S3/Drivers/Internal/Writer.public.cs | 8 ++--- csharp/lib/S3/Drivers/MemoryDriver.cs | 12 +++---- csharp/lib/S3/Drivers/S3Config.cs | 2 +- csharp/lib/S3/Drivers/S3Driver.cs | 16 ++++----- csharp/lib/S3/Metadata/AggregationLevel.cs | 4 +-- csharp/lib/S3/Metadata/FieldType.cs | 2 +- csharp/lib/S3/Program.cs | 10 +++--- csharp/lib/S3/Records/Fields/Field.cs | 2 +- csharp/lib/S3/Records/Fields/NumberField.cs | 2 +- csharp/lib/S3/Records/Fields/TextField.cs | 2 +- csharp/lib/S3/Records/Fields/TextFrequency.cs | 2 +- csharp/lib/S3/Records/Fields/UnitAttribute.cs | 2 +- csharp/lib/S3/Records/Fields/WithUnit.cs | 2 +- .../lib/S3/Records/Operations/Aggregation.cs | 6 ++-- .../lib/S3/Records/Operations/Conversion.cs | 4 +-- csharp/lib/S3/Records/Record.cs | 8 ++--- .../lib/S3/Records/Serialization/FieldTag.cs | 2 +- csharp/lib/S3/Records/Serialization/Parser.cs | 8 ++--- .../S3/Records/Serialization/Serializer.cs | 8 ++--- .../Records/Specialized/AggregatedRecord.cs | 6 ++-- .../Records/Specialized/TimeStampedRecord.cs | 4 +-- csharp/lib/S3/S3.csproj | 5 --- csharp/lib/StatusApi/StatusApi.csproj | 2 +- csharp/lib/{Units => StatusData}/Current.cs | 4 +-- .../{Units => StatusData}/Json/Converters.cs | 2 +- .../Json/CurrentConverter.cs | 2 +- .../Json/PowerConverter.cs | 2 +- .../Json/ResistanceConverter.cs | 2 +- .../Json/VoltageConverter.cs | 2 +- csharp/lib/{Units => StatusData}/Power.cs | 4 ++- .../lib/{Units => StatusData}/Resistance.cs | 2 +- csharp/lib/StatusData/State.cs | 21 +++++++++++ .../StatusData.csproj} | 2 +- csharp/lib/{Units => StatusData}/Units.cs | 2 +- csharp/lib/{Units => StatusData}/Voltage.cs | 2 +- .../SysTools/Edges/RemoteCommandToProcess.cs | 6 ++-- .../Edges/RemotePathToRemoteCommand.cs | 4 +-- .../SysTools/Edges/SshHostToRemoteCommand.cs | 4 +-- .../lib/SysTools/Edges/SshHostToRemotePath.cs | 4 +-- csharp/lib/SysTools/Edges/StringToCommand.cs | 2 +- csharp/lib/SysTools/Edges/StringToProcess.cs | 4 +-- .../lib/SysTools/Edges/StringToRemotePath.cs | 4 +-- csharp/lib/SysTools/Edges/StringToSysPath.cs | 2 +- .../lib/SysTools/Edges/SysCommandToProcess.cs | 4 +-- .../Edges/SysCommandToRemoteCommand.cs | 4 +-- csharp/lib/SysTools/Edges/SysPathToProcess.cs | 4 +-- .../lib/SysTools/Edges/SysPathToRemotePath.cs | 4 +-- .../lib/SysTools/Edges/SysPathToSysCommand.cs | 2 +- csharp/lib/SysTools/FileIo.cs | 4 +-- csharp/lib/SysTools/Process/AsyncProcess.cs | 4 +-- csharp/lib/SysTools/Process/ProcessResult.cs | 4 +-- csharp/lib/SysTools/Process/SyncProcess.cs | 4 +-- csharp/lib/SysTools/Remote/RemoteCommand.cs | 4 +-- csharp/lib/SysTools/Remote/RemoteFileIo.cs | 6 ++-- csharp/lib/SysTools/Remote/RemotePath.cs | 2 +- csharp/lib/SysTools/Remote/SshHost.cs | 6 ++-- csharp/lib/SysTools/SysCommand.cs | 4 +-- csharp/lib/SysTools/SysDirs.cs | 2 +- csharp/lib/SysTools/SysPath.cs | 6 ++-- csharp/lib/SysTools/SysTools.csproj | 12 ------- csharp/lib/SysTools/Utils/ConsoleUtils.cs | 2 +- csharp/lib/SysTools/Utils/EnumerableUtils.cs | 2 +- csharp/lib/SysTools/Utils/StringUtils.cs | 2 +- csharp/lib/SysTools/Utils/Utils.cs | 2 +- csharp/lib/Time/Time.csproj | 6 ---- csharp/lib/Time/Unix/UnixTime.Compare.cs | 2 +- csharp/lib/Time/Unix/UnixTime.Constructors.cs | 2 +- csharp/lib/Time/Unix/UnixTime.Converters.cs | 2 +- csharp/lib/Time/Unix/UnixTime.Operators.cs | 2 +- csharp/lib/Time/Unix/UnixTime.Overrides.cs | 2 +- csharp/lib/Time/Unix/UnixTime.cs | 2 +- csharp/lib/Time/Unix/UnixTimeDelta.Compare.cs | 2 +- .../Time/Unix/UnixTimeDelta.Constructors.cs | 2 +- .../lib/Time/Unix/UnixTimeDelta.Operators.cs | 2 +- .../lib/Time/Unix/UnixTimeDelta.Overrides.cs | 2 +- .../lib/Time/Unix/UnixTimeDeltaExtensions.cs | 2 +- csharp/lib/Time/Unix/UnixTimeSpan.cs | 2 +- csharp/lib/Utils/Utils.csproj | 2 +- csharp/lib/Victron/VeDBus/VeDBus.csproj | 2 +- csharp/lib/Victron/VictronVRM/Installation.cs | 2 +- .../lib/Victron/VictronVRM/VictronVRM.csproj | 2 +- csharp/lib/WebServer/WebServer.csproj | 2 +- 198 files changed, 372 insertions(+), 430 deletions(-) rename csharp/lib/{Units => StatusData}/Current.cs (97%) rename csharp/lib/{Units => StatusData}/Json/Converters.cs (90%) rename csharp/lib/{Units => StatusData}/Json/CurrentConverter.cs (91%) rename csharp/lib/{Units => StatusData}/Json/PowerConverter.cs (90%) rename csharp/lib/{Units => StatusData}/Json/ResistanceConverter.cs (91%) rename csharp/lib/{Units => StatusData}/Json/VoltageConverter.cs (91%) rename csharp/lib/{Units => StatusData}/Power.cs (95%) rename csharp/lib/{Units => StatusData}/Resistance.cs (97%) create mode 100644 csharp/lib/StatusData/State.cs rename csharp/lib/{Units/Units.csproj => StatusData/StatusData.csproj} (75%) rename csharp/lib/{Units => StatusData}/Units.cs (89%) rename csharp/lib/{Units => StatusData}/Voltage.cs (97%) diff --git a/csharp/InnovEnergy.props b/csharp/InnovEnergy.props index 57ac5931e..c6c92bd2a 100644 --- a/csharp/InnovEnergy.props +++ b/csharp/InnovEnergy.props @@ -3,13 +3,14 @@ InnovEnergy enable - default + preview true - InnovEnergy enable net6.0 true false + $(Company).$(MSBuildProjectDirectory.Replace($(SolutionDir), "").Replace("lib/", "Lib/").Replace("app/", "App/").Replace("src/", "").Replace("/",".")) + $(Company) Team diff --git a/csharp/InnovEnergy.sln b/csharp/InnovEnergy.sln index 69f33a105..5002df0a2 100644 --- a/csharp/InnovEnergy.sln +++ b/csharp/InnovEnergy.sln @@ -65,7 +65,7 @@ EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Backend", "app/Backend/Backend.csproj", "{A56F58C2-B265-435B-A985-53B4D6F49B1A}" EndProject EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Units", "lib/Units/Units.csproj", "{C04FB6DA-23C6-46BB-9B21-8F4FBA32FFF7}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StatusData", "lib\StatusData\StatusData.csproj", "{C04FB6DA-23C6-46BB-9B21-8F4FBA32FFF7}" EndProject Global diff --git a/csharp/app/Backend/Backend.csproj b/csharp/app/Backend/Backend.csproj index e6a136cb1..eebe0dae8 100644 --- a/csharp/app/Backend/Backend.csproj +++ b/csharp/app/Backend/Backend.csproj @@ -1,12 +1,5 @@ - - - net6.0 - enable - enable - preview - Innovenergy.Backend - + @@ -28,17 +21,10 @@ - - - ..\..\..\..\..\..\.nuget\packages\awssdk.core\3.7.8.10\lib\netcoreapp3.1\AWSSDK.Core.dll - - - ..\..\..\..\..\.nuget\packages\sqlite-net-pcl\1.8.116\lib\netstandard2.0\SQLite-net.dll - - + - + diff --git a/csharp/app/BmsTunnel/BatteryConnection.cs b/csharp/app/BmsTunnel/BatteryConnection.cs index 1dd0378a6..28dd3ee8a 100644 --- a/csharp/app/BmsTunnel/BatteryConnection.cs +++ b/csharp/app/BmsTunnel/BatteryConnection.cs @@ -1,9 +1,9 @@ using CliWrap; using CliWrap.Buffered; using InnovEnergy.Lib.Utils; -using static InnovEnergy.BmsTunnel.CliPrograms; +using static InnovEnergy.App.BmsTunnel.CliPrograms; -namespace InnovEnergy.BmsTunnel; +namespace InnovEnergy.App.BmsTunnel; using Nodes = IReadOnlyList; diff --git a/csharp/app/BmsTunnel/BmsTunnel.cs b/csharp/app/BmsTunnel/BmsTunnel.cs index 2af527047..85cefdf14 100644 --- a/csharp/app/BmsTunnel/BmsTunnel.cs +++ b/csharp/app/BmsTunnel/BmsTunnel.cs @@ -3,7 +3,7 @@ using System.Text; using CliWrap.Buffered; using InnovEnergy.Lib.Utils; -namespace InnovEnergy.BmsTunnel; +namespace InnovEnergy.App.BmsTunnel; public class BmsTunnel : IDisposable diff --git a/csharp/app/BmsTunnel/BmsTunnel.csproj b/csharp/app/BmsTunnel/BmsTunnel.csproj index 6078a616a..9fe1fc75d 100644 --- a/csharp/app/BmsTunnel/BmsTunnel.csproj +++ b/csharp/app/BmsTunnel/BmsTunnel.csproj @@ -1,10 +1,6 @@ - - InnovEnergy.BmsTunnel - - diff --git a/csharp/app/BmsTunnel/CliPrograms.cs b/csharp/app/BmsTunnel/CliPrograms.cs index 98588b622..c27df92df 100644 --- a/csharp/app/BmsTunnel/CliPrograms.cs +++ b/csharp/app/BmsTunnel/CliPrograms.cs @@ -1,6 +1,6 @@ using CliWrap; -namespace InnovEnergy.BmsTunnel; +namespace InnovEnergy.App.BmsTunnel; public static class CliPrograms { diff --git a/csharp/app/BmsTunnel/Program.cs b/csharp/app/BmsTunnel/Program.cs index 5f2d42de7..c3ce8f71e 100644 --- a/csharp/app/BmsTunnel/Program.cs +++ b/csharp/app/BmsTunnel/Program.cs @@ -5,7 +5,7 @@ using InnovEnergy.Lib.Utils; using static System.String; -namespace InnovEnergy.BmsTunnel; +namespace InnovEnergy.App.BmsTunnel; public static class Program { diff --git a/csharp/app/Collector/Collector.csproj b/csharp/app/Collector/Collector.csproj index 9bbb60eb9..b2e28418b 100644 --- a/csharp/app/Collector/Collector.csproj +++ b/csharp/app/Collector/Collector.csproj @@ -1,9 +1,5 @@ - - - InnovEnergy.Collector - diff --git a/csharp/app/Collector/src/BatteryDataParser.cs b/csharp/app/Collector/src/BatteryDataParser.cs index 81c84313e..23e0c2bfb 100644 --- a/csharp/app/Collector/src/BatteryDataParser.cs +++ b/csharp/app/Collector/src/BatteryDataParser.cs @@ -1,14 +1,14 @@ using System.Net; using System.Text; -using InnovEnergy.Collector.Influx; -using InnovEnergy.Collector.Records; -using InnovEnergy.Collector.Utils; +using InnovEnergy.App.Collector.Influx; +using InnovEnergy.App.Collector.Records; +using InnovEnergy.App.Collector.Utils; using InnovEnergy.Lib.Utils; using InnovEnergy.Lib.Utils.Net; using Convert = System.Convert; -namespace InnovEnergy.Collector; +namespace InnovEnergy.App.Collector; using Data = IReadOnlyList; diff --git a/csharp/app/Collector/src/BatteryDataParserV4.cs b/csharp/app/Collector/src/BatteryDataParserV4.cs index dc3064f0c..8d8ae5bd0 100644 --- a/csharp/app/Collector/src/BatteryDataParserV4.cs +++ b/csharp/app/Collector/src/BatteryDataParserV4.cs @@ -1,15 +1,15 @@ using System.Net; using System.Text; -using InnovEnergy.Collector.Influx; -using InnovEnergy.Collector.Records; -using InnovEnergy.Collector.Utils; +using InnovEnergy.App.Collector.Influx; +using InnovEnergy.App.Collector.Records; +using InnovEnergy.App.Collector.Utils; using InnovEnergy.Lib.Utils; using Convert = System.Convert; // NOT (YET) USED -namespace InnovEnergy.Collector; +namespace InnovEnergy.App.Collector; using Data = IReadOnlyList; diff --git a/csharp/app/Collector/src/Influx/FieldAttribute.cs b/csharp/app/Collector/src/Influx/FieldAttribute.cs index 9f8438ac7..58dc3d0ba 100644 --- a/csharp/app/Collector/src/Influx/FieldAttribute.cs +++ b/csharp/app/Collector/src/Influx/FieldAttribute.cs @@ -2,7 +2,7 @@ using static System.AttributeTargets; #nullable disable -namespace InnovEnergy.Collector.Influx; +namespace InnovEnergy.App.Collector.Influx; [AttributeUsage(Property)] public class FieldAttribute : Attribute diff --git a/csharp/app/Collector/src/Influx/InfluxRecord.cs b/csharp/app/Collector/src/Influx/InfluxRecord.cs index 4043f0837..6406ea876 100644 --- a/csharp/app/Collector/src/Influx/InfluxRecord.cs +++ b/csharp/app/Collector/src/Influx/InfluxRecord.cs @@ -1,10 +1,10 @@ using System.Text; -using InnovEnergy.Collector.Utils; +using InnovEnergy.App.Collector.Utils; using InnovEnergy.Lib.Utils; using static System.Globalization.CultureInfo; -using static InnovEnergy.Collector.Influx.LineProtocolSyntax; +using static InnovEnergy.App.Collector.Influx.LineProtocolSyntax; -namespace InnovEnergy.Collector.Influx; +namespace InnovEnergy.App.Collector.Influx; public static class InfluxRecord { diff --git a/csharp/app/Collector/src/Influx/LineProtocolSyntax.cs b/csharp/app/Collector/src/Influx/LineProtocolSyntax.cs index 95b1a2bd6..2c55b3725 100644 --- a/csharp/app/Collector/src/Influx/LineProtocolSyntax.cs +++ b/csharp/app/Collector/src/Influx/LineProtocolSyntax.cs @@ -1,7 +1,7 @@ using System.Diagnostics.CodeAnalysis; using static System.Globalization.CultureInfo; -namespace InnovEnergy.Collector.Influx; +namespace InnovEnergy.App.Collector.Influx; internal static class LineProtocolSyntax { diff --git a/csharp/app/Collector/src/Influx/TagAttribute.cs b/csharp/app/Collector/src/Influx/TagAttribute.cs index 3db4ee3a1..db028d6a8 100644 --- a/csharp/app/Collector/src/Influx/TagAttribute.cs +++ b/csharp/app/Collector/src/Influx/TagAttribute.cs @@ -1,6 +1,6 @@ using static System.AttributeTargets; -namespace InnovEnergy.Collector.Influx; +namespace InnovEnergy.App.Collector.Influx; [AttributeUsage(Property)] public class TagAttribute : Attribute diff --git a/csharp/app/Collector/src/Program.cs b/csharp/app/Collector/src/Program.cs index 01d02ce43..28b58dbcf 100644 --- a/csharp/app/Collector/src/Program.cs +++ b/csharp/app/Collector/src/Program.cs @@ -2,17 +2,17 @@ using System.Reactive.Concurrency; using System.Reactive.Linq; using System.Reactive.Subjects; -using InnovEnergy.Collector.Influx; -using InnovEnergy.Collector.Records; -using InnovEnergy.Lib.Utils; -using static System.Text.Encoding; -using static InnovEnergy.Lib.Utils.ExceptionHandling; using System.Text.Json; +using InnovEnergy.App.Collector.Influx; +using InnovEnergy.App.Collector.Records; +using InnovEnergy.Lib.Utils; using InnovEnergy.Lib.Utils.Net; using InnovEnergy.Lib.WebServer; +using static System.Text.Encoding; +using static InnovEnergy.Lib.Utils.ExceptionHandling; -namespace InnovEnergy.Collector; +namespace InnovEnergy.App.Collector; // TODO: net6 diff --git a/csharp/app/Collector/src/Records/Alarms.cs b/csharp/app/Collector/src/Records/Alarms.cs index 959855519..793680e82 100644 --- a/csharp/app/Collector/src/Records/Alarms.cs +++ b/csharp/app/Collector/src/Records/Alarms.cs @@ -1,10 +1,10 @@ -using InnovEnergy.Collector.Influx; +using InnovEnergy.App.Collector.Influx; // ReSharper disable IdentifierTypo // ReSharper disable UnusedAutoPropertyAccessor.Global // ReSharper disable InconsistentNaming -namespace InnovEnergy.Collector.Records; +namespace InnovEnergy.App.Collector.Records; public class Alarms : BatteryRecord { diff --git a/csharp/app/Collector/src/Records/BatteryRecord.cs b/csharp/app/Collector/src/Records/BatteryRecord.cs index a244d1a77..49cfcc00c 100644 --- a/csharp/app/Collector/src/Records/BatteryRecord.cs +++ b/csharp/app/Collector/src/Records/BatteryRecord.cs @@ -1,4 +1,4 @@ -namespace InnovEnergy.Collector.Records; +namespace InnovEnergy.App.Collector.Records; public abstract class BatteryRecord {} \ No newline at end of file diff --git a/csharp/app/Collector/src/Records/BatteryStatus.cs b/csharp/app/Collector/src/Records/BatteryStatus.cs index 25f2a6ab3..2816b7545 100644 --- a/csharp/app/Collector/src/Records/BatteryStatus.cs +++ b/csharp/app/Collector/src/Records/BatteryStatus.cs @@ -1,9 +1,9 @@ -using InnovEnergy.Collector.Influx; +using InnovEnergy.App.Collector.Influx; // ReSharper disable UnusedAutoPropertyAccessor.Global // ReSharper disable MemberCanBePrivate.Global -namespace InnovEnergy.Collector.Records; +namespace InnovEnergy.App.Collector.Records; public class BatteryStatus : BatteryRecord { diff --git a/csharp/app/Collector/src/Records/Error.cs b/csharp/app/Collector/src/Records/Error.cs index 3d151af2e..9ffa399ef 100644 --- a/csharp/app/Collector/src/Records/Error.cs +++ b/csharp/app/Collector/src/Records/Error.cs @@ -1,8 +1,8 @@ -using InnovEnergy.Collector.Influx; +using InnovEnergy.App.Collector.Influx; // ReSharper disable UnusedAutoPropertyAccessor.Global -namespace InnovEnergy.Collector.Records; +namespace InnovEnergy.App.Collector.Records; public class Error : BatteryRecord { diff --git a/csharp/app/Collector/src/Records/InstallationStatus.cs b/csharp/app/Collector/src/Records/InstallationStatus.cs index 99937ddb7..a93a4374c 100644 --- a/csharp/app/Collector/src/Records/InstallationStatus.cs +++ b/csharp/app/Collector/src/Records/InstallationStatus.cs @@ -1,6 +1,6 @@ -using InnovEnergy.Collector.Influx; +using InnovEnergy.App.Collector.Influx; -namespace InnovEnergy.Collector.Records; +namespace InnovEnergy.App.Collector.Records; public class InstallationStatus : BatteryRecord { diff --git a/csharp/app/Collector/src/Records/IoStatus.cs b/csharp/app/Collector/src/Records/IoStatus.cs index 4d0791219..a9c2c7247 100644 --- a/csharp/app/Collector/src/Records/IoStatus.cs +++ b/csharp/app/Collector/src/Records/IoStatus.cs @@ -1,8 +1,8 @@ -using InnovEnergy.Collector.Influx; +using InnovEnergy.App.Collector.Influx; // ReSharper disable UnusedAutoPropertyAccessor.Global -namespace InnovEnergy.Collector.Records; +namespace InnovEnergy.App.Collector.Records; public class IoStatus : BatteryRecord { diff --git a/csharp/app/Collector/src/Records/Leds.cs b/csharp/app/Collector/src/Records/Leds.cs index 39a7e97be..6dc3170cb 100644 --- a/csharp/app/Collector/src/Records/Leds.cs +++ b/csharp/app/Collector/src/Records/Leds.cs @@ -1,9 +1,9 @@ -using InnovEnergy.Collector.Influx; +using InnovEnergy.App.Collector.Influx; // ReSharper disable UnusedAutoPropertyAccessor.Global // ReSharper disable UnusedMember.Global -namespace InnovEnergy.Collector.Records; +namespace InnovEnergy.App.Collector.Records; public class Leds : BatteryRecord { diff --git a/csharp/app/Collector/src/Records/Temperatures.cs b/csharp/app/Collector/src/Records/Temperatures.cs index 6b621084d..34d53a92e 100644 --- a/csharp/app/Collector/src/Records/Temperatures.cs +++ b/csharp/app/Collector/src/Records/Temperatures.cs @@ -1,7 +1,6 @@ -using InnovEnergy.Collector.Influx; +using InnovEnergy.App.Collector.Influx; - -namespace InnovEnergy.Collector.Records; +namespace InnovEnergy.App.Collector.Records; #pragma warning disable CS8618 diff --git a/csharp/app/Collector/src/Records/Warnings.cs b/csharp/app/Collector/src/Records/Warnings.cs index c74aee213..3d5d2a176 100644 --- a/csharp/app/Collector/src/Records/Warnings.cs +++ b/csharp/app/Collector/src/Records/Warnings.cs @@ -1,7 +1,6 @@ -using InnovEnergy.Collector.Influx; +using InnovEnergy.App.Collector.Influx; - -namespace InnovEnergy.Collector.Records; +namespace InnovEnergy.App.Collector.Records; #pragma warning disable CS8618 diff --git a/csharp/app/Collector/src/Settings.cs b/csharp/app/Collector/src/Settings.cs index 10502f536..7708dc819 100644 --- a/csharp/app/Collector/src/Settings.cs +++ b/csharp/app/Collector/src/Settings.cs @@ -1,6 +1,6 @@ using System.Net; -namespace InnovEnergy.Collector; +namespace InnovEnergy.App.Collector; public static class Settings { diff --git a/csharp/app/Collector/src/Utils/Extensions.cs b/csharp/app/Collector/src/Utils/Extensions.cs index 3371ec718..9b79e4ab4 100644 --- a/csharp/app/Collector/src/Utils/Extensions.cs +++ b/csharp/app/Collector/src/Utils/Extensions.cs @@ -1,6 +1,6 @@ using System.Globalization; -namespace InnovEnergy.Collector.Utils; +namespace InnovEnergy.App.Collector.Utils; public static class Extensions { diff --git a/csharp/app/Collector/src/Utils/Log.cs b/csharp/app/Collector/src/Utils/Log.cs index 316f41af3..8e32f0174 100644 --- a/csharp/app/Collector/src/Utils/Log.cs +++ b/csharp/app/Collector/src/Utils/Log.cs @@ -1,4 +1,4 @@ -namespace InnovEnergy.Collector.Utils; +namespace InnovEnergy.App.Collector.Utils; internal static class Log { diff --git a/csharp/app/Collector/src/Utils/Property.cs b/csharp/app/Collector/src/Utils/Property.cs index 89d0aa012..ccf4b45ac 100644 --- a/csharp/app/Collector/src/Utils/Property.cs +++ b/csharp/app/Collector/src/Utils/Property.cs @@ -1,7 +1,7 @@ using System.Reflection; using InnovEnergy.Lib.Utils; -namespace InnovEnergy.Collector.Utils; +namespace InnovEnergy.App.Collector.Utils; public readonly struct Property { diff --git a/csharp/app/Collector/src/Utils/ReadOnlyListExtensions.cs b/csharp/app/Collector/src/Utils/ReadOnlyListExtensions.cs index ec53ff191..7c8d915b3 100644 --- a/csharp/app/Collector/src/Utils/ReadOnlyListExtensions.cs +++ b/csharp/app/Collector/src/Utils/ReadOnlyListExtensions.cs @@ -1,4 +1,4 @@ -namespace InnovEnergy.Collector.Utils; +namespace InnovEnergy.App.Collector.Utils; public static class ReadOnlyListExtensions { diff --git a/csharp/app/Collector/src/Utils/Utils.cs b/csharp/app/Collector/src/Utils/Utils.cs index fd47cc583..51c9d3fbb 100644 --- a/csharp/app/Collector/src/Utils/Utils.cs +++ b/csharp/app/Collector/src/Utils/Utils.cs @@ -1,4 +1,4 @@ -namespace InnovEnergy.Collector.Utils; +namespace InnovEnergy.App.Collector.Utils; public static class Utils { diff --git a/csharp/app/EmuMeterDriver/Config.cs b/csharp/app/EmuMeterDriver/Config.cs index e7bad3e06..ee0ad64db 100644 --- a/csharp/app/EmuMeterDriver/Config.cs +++ b/csharp/app/EmuMeterDriver/Config.cs @@ -1,7 +1,7 @@ using System.Reflection; using InnovEnergy.Lib.Victron.VeDBus; -namespace InnovEnergy.EmuMeter; +namespace InnovEnergy.App.EmuMeterDriver; public static class Config { diff --git a/csharp/app/EmuMeterDriver/EmuMeterDriver.cs b/csharp/app/EmuMeterDriver/EmuMeterDriver.cs index 6e923678a..9c57f2c7a 100644 --- a/csharp/app/EmuMeterDriver/EmuMeterDriver.cs +++ b/csharp/app/EmuMeterDriver/EmuMeterDriver.cs @@ -5,8 +5,7 @@ using InnovEnergy.Lib.Protocols.Modbus.Clients; using InnovEnergy.Lib.Utils; using InnovEnergy.Lib.Victron.VeDBus; - -namespace InnovEnergy.EmuMeter; +namespace InnovEnergy.App.EmuMeterDriver; public static class EmuMeterDriver { diff --git a/csharp/app/EmuMeterDriver/EmuMeterDriver.csproj b/csharp/app/EmuMeterDriver/EmuMeterDriver.csproj index 9132521ae..ae7263dc2 100644 --- a/csharp/app/EmuMeterDriver/EmuMeterDriver.csproj +++ b/csharp/app/EmuMeterDriver/EmuMeterDriver.csproj @@ -1,10 +1,6 @@ - - InnovEnergy.EmuMeter - - diff --git a/csharp/app/EmuMeterDriver/Nic.cs b/csharp/app/EmuMeterDriver/Nic.cs index 9ddb9096e..0b81b0843 100644 --- a/csharp/app/EmuMeterDriver/Nic.cs +++ b/csharp/app/EmuMeterDriver/Nic.cs @@ -2,7 +2,7 @@ using System.Text.Json.Nodes; using CliWrap; using CliWrap.Buffered; -namespace InnovEnergy.EmuMeter; +namespace InnovEnergy.App.EmuMeterDriver; public readonly struct Nic { diff --git a/csharp/app/EmuMeterDriver/Program.cs b/csharp/app/EmuMeterDriver/Program.cs index 8a8c70561..6ad63d04d 100644 --- a/csharp/app/EmuMeterDriver/Program.cs +++ b/csharp/app/EmuMeterDriver/Program.cs @@ -1,4 +1,4 @@ -using InnovEnergy.EmuMeter; +using InnovEnergy.App.EmuMeterDriver; using InnovEnergy.Lib.Protocols.DBus; using InnovEnergy.Lib.Utils; using InnovEnergy.Lib.Utils.Net; diff --git a/csharp/app/EmuMeterDriver/Signal.cs b/csharp/app/EmuMeterDriver/Signal.cs index e606e2f53..ef375bb91 100644 --- a/csharp/app/EmuMeterDriver/Signal.cs +++ b/csharp/app/EmuMeterDriver/Signal.cs @@ -2,7 +2,7 @@ using InnovEnergy.Lib.Devices.EmuMeter; using InnovEnergy.Lib.Protocols.DBus.Protocol.DataTypes; using InnovEnergy.Lib.Victron.VeDBus; -namespace InnovEnergy.EmuMeter; +namespace InnovEnergy.App.EmuMeterDriver; public record Signal(Func Source, ObjectPath Path, String Format = "") { diff --git a/csharp/app/EmuMeterDriver/Utils.cs b/csharp/app/EmuMeterDriver/Utils.cs index cab67bd3c..65f02de6a 100644 --- a/csharp/app/EmuMeterDriver/Utils.cs +++ b/csharp/app/EmuMeterDriver/Utils.cs @@ -1,4 +1,4 @@ -namespace InnovEnergy.EmuMeter; +namespace InnovEnergy.App.EmuMeterDriver; public static class Utils { diff --git a/csharp/app/InnovEnergy.app.props b/csharp/app/InnovEnergy.app.props index beb4a7a4a..38d62f4dc 100644 --- a/csharp/app/InnovEnergy.app.props +++ b/csharp/app/InnovEnergy.app.props @@ -11,7 +11,6 @@ true true true - @@ -20,6 +19,7 @@ Exe + InnovEnergy.App.$(AssemblyName) diff --git a/csharp/app/OpenVpnCertificatesServer/Files.cs b/csharp/app/OpenVpnCertificatesServer/Files.cs index 35f78f44b..00fbf58d5 100644 --- a/csharp/app/OpenVpnCertificatesServer/Files.cs +++ b/csharp/app/OpenVpnCertificatesServer/Files.cs @@ -1,6 +1,4 @@ -namespace InnovEnergy.OpenVpnCertificatesServer; - -using System; +namespace InnovEnergy.App.OpenVpnCertificatesServer; public static class Files { diff --git a/csharp/app/OpenVpnCertificatesServer/Http.cs b/csharp/app/OpenVpnCertificatesServer/Http.cs index 3f72fb5da..5442047ae 100644 --- a/csharp/app/OpenVpnCertificatesServer/Http.cs +++ b/csharp/app/OpenVpnCertificatesServer/Http.cs @@ -1,9 +1,8 @@ -namespace InnovEnergy.OpenVpnCertificatesServer; - -using System; using System.Net; using Flurl; +namespace InnovEnergy.App.OpenVpnCertificatesServer; + public static class Http { // TODO: use worker thread diff --git a/csharp/app/OpenVpnCertificatesServer/OpenVpnCertificatesServer.csproj b/csharp/app/OpenVpnCertificatesServer/OpenVpnCertificatesServer.csproj index c2110f3cb..2773cd430 100644 --- a/csharp/app/OpenVpnCertificatesServer/OpenVpnCertificatesServer.csproj +++ b/csharp/app/OpenVpnCertificatesServer/OpenVpnCertificatesServer.csproj @@ -1,10 +1,6 @@ - - InnovEnergy.OpenVpnCertificatesServer - - diff --git a/csharp/app/OpenVpnCertificatesServer/PKI/CertificateAuthority.cs b/csharp/app/OpenVpnCertificatesServer/PKI/CertificateAuthority.cs index ec35a7836..b782c8165 100644 --- a/csharp/app/OpenVpnCertificatesServer/PKI/CertificateAuthority.cs +++ b/csharp/app/OpenVpnCertificatesServer/PKI/CertificateAuthority.cs @@ -7,7 +7,7 @@ using Org.BouncyCastle.Math; using Org.BouncyCastle.Security; using Org.BouncyCastle.X509; -namespace InnovEnergy.OpenVpnCertificatesServer.PKI; +namespace InnovEnergy.App.OpenVpnCertificatesServer.PKI; public static class CertificateAuthority { diff --git a/csharp/app/OpenVpnCertificatesServer/PKI/Pem.cs b/csharp/app/OpenVpnCertificatesServer/PKI/Pem.cs index 3698135ee..8015c4e71 100644 --- a/csharp/app/OpenVpnCertificatesServer/PKI/Pem.cs +++ b/csharp/app/OpenVpnCertificatesServer/PKI/Pem.cs @@ -1,6 +1,6 @@ using Org.BouncyCastle.OpenSsl; -namespace InnovEnergy.OpenVpnCertificatesServer.PKI; +namespace InnovEnergy.App.OpenVpnCertificatesServer.PKI; public static class Pem { diff --git a/csharp/app/OpenVpnCertificatesServer/PKI/PwdFinder.cs b/csharp/app/OpenVpnCertificatesServer/PKI/PwdFinder.cs index 70d54fd51..3bbe9354a 100644 --- a/csharp/app/OpenVpnCertificatesServer/PKI/PwdFinder.cs +++ b/csharp/app/OpenVpnCertificatesServer/PKI/PwdFinder.cs @@ -1,6 +1,6 @@ using Org.BouncyCastle.OpenSsl; -namespace InnovEnergy.OpenVpnCertificatesServer.PKI; +namespace InnovEnergy.App.OpenVpnCertificatesServer.PKI; public class PwdFinder : IPasswordFinder { diff --git a/csharp/app/OpenVpnCertificatesServer/Program.cs b/csharp/app/OpenVpnCertificatesServer/Program.cs index 3d765b2cd..c9bff3a03 100644 --- a/csharp/app/OpenVpnCertificatesServer/Program.cs +++ b/csharp/app/OpenVpnCertificatesServer/Program.cs @@ -1,15 +1,14 @@ -using InnovEnergy.Lib.Utils; -using InnovEnergy.Lib.Victron.VictronVRM; -using InnovEnergy.OpenVpnCertificatesServer.PKI; -using System.Diagnostics; +using System.Diagnostics; using System.Text; using Flurl; using ICSharpCode.SharpZipLib.Tar; +using InnovEnergy.App.OpenVpnCertificatesServer.PKI; +using InnovEnergy.Lib.Utils; +using InnovEnergy.Lib.Victron.VictronVRM; using Org.BouncyCastle.Crypto; +using static InnovEnergy.App.OpenVpnCertificatesServer.PKI.CertificateAuthority; -using static InnovEnergy.OpenVpnCertificatesServer.PKI.CertificateAuthority; - -namespace InnovEnergy.OpenVpnCertificatesServer; +namespace InnovEnergy.App.OpenVpnCertificatesServer; // dotnet publish OpenVpnCertificatesServer.csproj -c Release -r linux-x64 -p:PublishSingleFile=true --self-contained true && scp bin/Release/net6.0/linux-x64/publish/OpenVpnCertificatesServer ig@salidomo.innovenergy.ch:~/get_cert/get_cert diff --git a/csharp/app/OpenVpnCertificatesServer/Utils.cs b/csharp/app/OpenVpnCertificatesServer/Utils.cs index 9ed8734f7..aea6faf59 100644 --- a/csharp/app/OpenVpnCertificatesServer/Utils.cs +++ b/csharp/app/OpenVpnCertificatesServer/Utils.cs @@ -1,9 +1,8 @@ -namespace InnovEnergy.OpenVpnCertificatesServer; - -using System; using System.Text; using ICSharpCode.SharpZipLib.Tar; +namespace InnovEnergy.App.OpenVpnCertificatesServer; + public static class Utils { public static void WriteFile(this TarOutputStream tar, String fileName, Byte[] contents, Boolean executable = false) diff --git a/csharp/app/RemoteSupportConsole/Login.cs b/csharp/app/RemoteSupportConsole/Login.cs index 901fd7175..7e3edbe35 100644 --- a/csharp/app/RemoteSupportConsole/Login.cs +++ b/csharp/app/RemoteSupportConsole/Login.cs @@ -1,4 +1,4 @@ -namespace InnovEnergy.RemoteSupportConsole; +namespace InnovEnergy.App.RemoteSupportConsole; public static class Login { diff --git a/csharp/app/RemoteSupportConsole/ObservablePipeSource.cs b/csharp/app/RemoteSupportConsole/ObservablePipeSource.cs index 281ee75f4..a5e1af9d7 100644 --- a/csharp/app/RemoteSupportConsole/ObservablePipeSource.cs +++ b/csharp/app/RemoteSupportConsole/ObservablePipeSource.cs @@ -2,7 +2,7 @@ using System.Reactive.Linq; using System.Reactive.Threading.Tasks; using CliWrap; -namespace InnovEnergy.RemoteSupportConsole; +namespace InnovEnergy.App.RemoteSupportConsole; public static class ObservablePipeSource { diff --git a/csharp/app/RemoteSupportConsole/Program.cs b/csharp/app/RemoteSupportConsole/Program.cs index bd21d71d0..7ce5cbdcd 100644 --- a/csharp/app/RemoteSupportConsole/Program.cs +++ b/csharp/app/RemoteSupportConsole/Program.cs @@ -4,7 +4,7 @@ using InnovEnergy.Lib.Utils; using InnovEnergy.Lib.Victron.VictronVRM; using static System.Globalization.CompareOptions; -namespace InnovEnergy.RemoteSupportConsole; +namespace InnovEnergy.App.RemoteSupportConsole; // dotnet publish -c release -r ubuntu-x64 // dotnet publish RemoteSupportConsole.csproj -c Release -r linux-x64 -p:PublishSingleFile=true --self-contained true diff --git a/csharp/app/RemoteSupportConsole/RemoteSupportConsole.csproj b/csharp/app/RemoteSupportConsole/RemoteSupportConsole.csproj index 3a4a4aaa3..cb8c7d1b8 100644 --- a/csharp/app/RemoteSupportConsole/RemoteSupportConsole.csproj +++ b/csharp/app/RemoteSupportConsole/RemoteSupportConsole.csproj @@ -1,10 +1,6 @@ - - InnovEnergy.RemoteSupportConsole - - diff --git a/csharp/app/RemoteSupportConsole/Ssh.cs b/csharp/app/RemoteSupportConsole/Ssh.cs index 55502ecb7..d9acc9662 100644 --- a/csharp/app/RemoteSupportConsole/Ssh.cs +++ b/csharp/app/RemoteSupportConsole/Ssh.cs @@ -1,7 +1,7 @@ using CliWrap; using InnovEnergy.Lib.Utils; -namespace InnovEnergy.RemoteSupportConsole; +namespace InnovEnergy.App.RemoteSupportConsole; public static class Ssh { diff --git a/csharp/app/RemoteSupportConsole/VpnConnection.cs b/csharp/app/RemoteSupportConsole/VpnConnection.cs index 29f52b40c..b2442eea1 100644 --- a/csharp/app/RemoteSupportConsole/VpnConnection.cs +++ b/csharp/app/RemoteSupportConsole/VpnConnection.cs @@ -2,7 +2,7 @@ using InnovEnergy.Lib.Utils; using InnovEnergy.Lib.Victron.VictronVRM; using static System.ConsoleColor; -namespace InnovEnergy.RemoteSupportConsole; +namespace InnovEnergy.App.RemoteSupportConsole; public static class VpnConnection { diff --git a/csharp/app/RemoteSupportConsole/VpnInfo.cs b/csharp/app/RemoteSupportConsole/VpnInfo.cs index d7f39fbbc..0137a3b50 100644 --- a/csharp/app/RemoteSupportConsole/VpnInfo.cs +++ b/csharp/app/RemoteSupportConsole/VpnInfo.cs @@ -2,7 +2,7 @@ using Flurl; using Flurl.Http; using InnovEnergy.Lib.Utils; -namespace InnovEnergy.RemoteSupportConsole; +namespace InnovEnergy.App.RemoteSupportConsole; public static class VpnInfo { diff --git a/csharp/app/RemoteSupportConsole/VrmConnection.cs b/csharp/app/RemoteSupportConsole/VrmConnection.cs index 52515a025..03dd1e252 100644 --- a/csharp/app/RemoteSupportConsole/VrmConnection.cs +++ b/csharp/app/RemoteSupportConsole/VrmConnection.cs @@ -7,7 +7,7 @@ using InnovEnergy.Lib.Victron.VictronVRM; using static System.ConsoleColor; using static System.StringSplitOptions; -namespace InnovEnergy.RemoteSupportConsole; +namespace InnovEnergy.App.RemoteSupportConsole; public static class VrmConnection { diff --git a/csharp/app/RemoteSupportConsole/VrmInfo.cs b/csharp/app/RemoteSupportConsole/VrmInfo.cs index 9b37d00fc..32568ae23 100644 --- a/csharp/app/RemoteSupportConsole/VrmInfo.cs +++ b/csharp/app/RemoteSupportConsole/VrmInfo.cs @@ -3,7 +3,7 @@ using InnovEnergy.Lib.Utils; using InnovEnergy.Lib.Victron.VictronVRM; using static System.ConsoleColor; -namespace InnovEnergy.RemoteSupportConsole; +namespace InnovEnergy.App.RemoteSupportConsole; public static class VrmInfo diff --git a/csharp/app/RemoteSupportConsole/VrmProxy.cs b/csharp/app/RemoteSupportConsole/VrmProxy.cs index cc00370c5..c629c5476 100644 --- a/csharp/app/RemoteSupportConsole/VrmProxy.cs +++ b/csharp/app/RemoteSupportConsole/VrmProxy.cs @@ -1,4 +1,4 @@ -namespace InnovEnergy.RemoteSupportConsole; +namespace InnovEnergy.App.RemoteSupportConsole; public readonly record struct VrmProxy(IDisposable Connection, String User, String Host, String Port) : IDisposable { diff --git a/csharp/app/SaliMax/SaliMax.csproj b/csharp/app/SaliMax/SaliMax.csproj index 0893e2a24..2c2d378bd 100644 --- a/csharp/app/SaliMax/SaliMax.csproj +++ b/csharp/app/SaliMax/SaliMax.csproj @@ -1,25 +1,24 @@ - - InnovEnergy.SaliMax - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + diff --git a/csharp/app/SaliMax/src/AsciiArt.cs b/csharp/app/SaliMax/src/AsciiArt.cs index c8ffc4596..7485a1363 100644 --- a/csharp/app/SaliMax/src/AsciiArt.cs +++ b/csharp/app/SaliMax/src/AsciiArt.cs @@ -1,6 +1,6 @@ using InnovEnergy.Lib.Utils; -namespace InnovEnergy.SaliMax; +namespace InnovEnergy.App.SaliMax; public static class AsciiArt { diff --git a/csharp/app/SaliMax/src/BusPort.cs b/csharp/app/SaliMax/src/BusPort.cs index 20fc1c9a6..e8cbd649b 100644 --- a/csharp/app/SaliMax/src/BusPort.cs +++ b/csharp/app/SaliMax/src/BusPort.cs @@ -1,4 +1,4 @@ -namespace InnovEnergy.SaliMax; +namespace InnovEnergy.App.SaliMax; public enum BusPort { diff --git a/csharp/app/SaliMax/src/Controller/AvgBatteriesStatus.cs b/csharp/app/SaliMax/src/Controller/AvgBatteriesStatus.cs index 7b90a6640..b62316d85 100644 --- a/csharp/app/SaliMax/src/Controller/AvgBatteriesStatus.cs +++ b/csharp/app/SaliMax/src/Controller/AvgBatteriesStatus.cs @@ -1,6 +1,6 @@ using InnovEnergy.Lib.Devices.Battery48TL; -namespace InnovEnergy.SaliMax.Controller; +namespace InnovEnergy.App.SaliMax.Controller; public class AvgBatteriesStatus { diff --git a/csharp/app/SaliMax/src/Controller/Control.cs b/csharp/app/SaliMax/src/Controller/Control.cs index 144e2b166..08589edb5 100644 --- a/csharp/app/SaliMax/src/Controller/Control.cs +++ b/csharp/app/SaliMax/src/Controller/Control.cs @@ -1,6 +1,4 @@ -using static InnovEnergy.SaliMax.SystemConfig.SalimaxConfig; - -namespace InnovEnergy.SaliMax.Controller; +namespace InnovEnergy.App.SaliMax.Controller; public static class Control { diff --git a/csharp/app/SaliMax/src/Controller/ControlRecord.cs b/csharp/app/SaliMax/src/Controller/ControlRecord.cs index c00373efb..ce7e4fc8f 100644 --- a/csharp/app/SaliMax/src/Controller/ControlRecord.cs +++ b/csharp/app/SaliMax/src/Controller/ControlRecord.cs @@ -1,9 +1,9 @@ +using InnovEnergy.App.SaliMax.SaliMaxRelays; +using InnovEnergy.App.SaliMax.SystemConfig; using InnovEnergy.Lib.Devices.Trumpf.TruConvertAc; using InnovEnergy.Lib.Devices.Trumpf.TruConvertDc; -using InnovEnergy.SaliMax.SaliMaxRelays; -using InnovEnergy.SaliMax.SystemConfig; -namespace InnovEnergy.SaliMax.Controller; +namespace InnovEnergy.App.SaliMax.Controller; public class ControlRecord { diff --git a/csharp/app/SaliMax/src/Controller/ControlTarget.cs b/csharp/app/SaliMax/src/Controller/ControlTarget.cs index d08fa47ab..1e279f8d3 100644 --- a/csharp/app/SaliMax/src/Controller/ControlTarget.cs +++ b/csharp/app/SaliMax/src/Controller/ControlTarget.cs @@ -1,4 +1,4 @@ -namespace InnovEnergy.SaliMax.Controller; +namespace InnovEnergy.App.SaliMax.Controller; public enum ControlTarget // TODO to delete { diff --git a/csharp/app/SaliMax/src/Controller/Controller.cs b/csharp/app/SaliMax/src/Controller/Controller.cs index e578c5b2d..cadb47477 100644 --- a/csharp/app/SaliMax/src/Controller/Controller.cs +++ b/csharp/app/SaliMax/src/Controller/Controller.cs @@ -1,14 +1,14 @@ +using InnovEnergy.App.SaliMax.SaliMaxRelays; +using InnovEnergy.App.SaliMax.SystemConfig; using InnovEnergy.Lib.Devices.Trumpf.TruConvert; using InnovEnergy.Lib.Devices.Trumpf.TruConvertAc; using InnovEnergy.Lib.Devices.Trumpf.TruConvertDc; +using InnovEnergy.Lib.Time.Unix; using InnovEnergy.Lib.Utils; -using InnovEnergy.SaliMax.SaliMaxRelays; -using InnovEnergy.SaliMax.SystemConfig; -using InnovEnergy.Time.Unix; -using static InnovEnergy.SaliMax.SaliMaxRelays.RelayState; +using static InnovEnergy.App.SaliMax.SaliMaxRelays.RelayState; -namespace InnovEnergy.SaliMax.Controller; +namespace InnovEnergy.App.SaliMax.Controller; public static class Controller { diff --git a/csharp/app/SaliMax/src/Controller/SaliMaxState.cs b/csharp/app/SaliMax/src/Controller/SaliMaxState.cs index cd81b24b5..be7470fae 100644 --- a/csharp/app/SaliMax/src/Controller/SaliMaxState.cs +++ b/csharp/app/SaliMax/src/Controller/SaliMaxState.cs @@ -1,4 +1,4 @@ -namespace InnovEnergy.SaliMax.Controller; +namespace InnovEnergy.App.SaliMax.Controller; public struct SaliMaxState { diff --git a/csharp/app/SaliMax/src/Controller/State.cs b/csharp/app/SaliMax/src/Controller/State.cs index a8ad8d11b..7634d1d66 100644 --- a/csharp/app/SaliMax/src/Controller/State.cs +++ b/csharp/app/SaliMax/src/Controller/State.cs @@ -1,5 +1,5 @@ -namespace InnovEnergy.SaliMax.Controller; +namespace InnovEnergy.App.SaliMax.Controller; public enum State : Int16 { diff --git a/csharp/app/SaliMax/src/Controller/StateConfig.cs b/csharp/app/SaliMax/src/Controller/StateConfig.cs index be40aafc0..ce356d311 100644 --- a/csharp/app/SaliMax/src/Controller/StateConfig.cs +++ b/csharp/app/SaliMax/src/Controller/StateConfig.cs @@ -1,5 +1,5 @@ -namespace InnovEnergy.SaliMax.Controller; +namespace InnovEnergy.App.SaliMax.Controller; public static class StateConfig { diff --git a/csharp/app/SaliMax/src/Controller/StatusRecord.cs b/csharp/app/SaliMax/src/Controller/StatusRecord.cs index 0969b841b..53de658b8 100644 --- a/csharp/app/SaliMax/src/Controller/StatusRecord.cs +++ b/csharp/app/SaliMax/src/Controller/StatusRecord.cs @@ -1,12 +1,12 @@ -using InnovEnergy.Lib.Devices.Ampt; +using InnovEnergy.App.SaliMax.SaliMaxRelays; +using InnovEnergy.App.SaliMax.SystemConfig; +using InnovEnergy.Lib.Devices.AMPT; using InnovEnergy.Lib.Devices.Battery48TL; using InnovEnergy.Lib.Devices.EmuMeter; using InnovEnergy.Lib.Devices.Trumpf.TruConvertAc; using InnovEnergy.Lib.Devices.Trumpf.TruConvertDc; -using InnovEnergy.SaliMax.SaliMaxRelays; -using InnovEnergy.SaliMax.SystemConfig; -namespace InnovEnergy.SaliMax.Controller; +namespace InnovEnergy.App.SaliMax.Controller; public record StatusRecord { diff --git a/csharp/app/SaliMax/src/Log/Ampt.cs b/csharp/app/SaliMax/src/Log/Ampt.cs index 1a63b9eab..efaa6e388 100644 --- a/csharp/app/SaliMax/src/Log/Ampt.cs +++ b/csharp/app/SaliMax/src/Log/Ampt.cs @@ -1,8 +1,8 @@ using System.Text.Json.Nodes; -using InnovEnergy.Lib.Devices.Ampt; +using InnovEnergy.Lib.Devices.AMPT; using InnovEnergy.Lib.StatusApi; -namespace InnovEnergy.SaliMax.Log; +namespace InnovEnergy.App.SaliMax.Log; public static class Ampt { diff --git a/csharp/app/SaliMax/src/Log/Battery48Tl.cs b/csharp/app/SaliMax/src/Log/Battery48Tl.cs index db755c78d..f2c85bcbf 100644 --- a/csharp/app/SaliMax/src/Log/Battery48Tl.cs +++ b/csharp/app/SaliMax/src/Log/Battery48Tl.cs @@ -2,7 +2,7 @@ using System.Text.Json.Nodes; using InnovEnergy.Lib.Devices.Battery48TL; using InnovEnergy.Lib.StatusApi; -namespace InnovEnergy.SaliMax.Log; +namespace InnovEnergy.App.SaliMax.Log; public static class Battery48Tl { diff --git a/csharp/app/SaliMax/src/Log/EmuMeter.cs b/csharp/app/SaliMax/src/Log/EmuMeter.cs index 8b61199cf..bb5dbbf29 100644 --- a/csharp/app/SaliMax/src/Log/EmuMeter.cs +++ b/csharp/app/SaliMax/src/Log/EmuMeter.cs @@ -3,9 +3,9 @@ using InnovEnergy.Lib.Devices.EmuMeter; using InnovEnergy.Lib.StatusApi; using InnovEnergy.Lib.Utils; using static DecimalMath.DecimalEx; -using static InnovEnergy.SaliMax.Log.JsonUtil; +using static InnovEnergy.App.SaliMax.Log.JsonUtil; -namespace InnovEnergy.SaliMax.Log; +namespace InnovEnergy.App.SaliMax.Log; public static class EmuMeter { diff --git a/csharp/app/SaliMax/src/Log/JsonUtil.cs b/csharp/app/SaliMax/src/Log/JsonUtil.cs index 3201cb9b5..e82f2af01 100644 --- a/csharp/app/SaliMax/src/Log/JsonUtil.cs +++ b/csharp/app/SaliMax/src/Log/JsonUtil.cs @@ -1,7 +1,7 @@ using System.Text.Json.Nodes; using InnovEnergy.Lib.StatusApi; -namespace InnovEnergy.SaliMax.Log; +namespace InnovEnergy.App.SaliMax.Log; public static class JsonUtil { diff --git a/csharp/app/SaliMax/src/Log/Salimax.cs b/csharp/app/SaliMax/src/Log/Salimax.cs index 76bd25648..09a7de12f 100644 --- a/csharp/app/SaliMax/src/Log/Salimax.cs +++ b/csharp/app/SaliMax/src/Log/Salimax.cs @@ -1,9 +1,9 @@ using System.Text.Json.Nodes; +using InnovEnergy.App.SaliMax.Controller; using InnovEnergy.Lib.StatusApi; -using InnovEnergy.SaliMax.Controller; -using InnovEnergy.Time.Unix; +using InnovEnergy.Lib.Time.Unix; -namespace InnovEnergy.SaliMax.Log; +namespace InnovEnergy.App.SaliMax.Log; public static class Salimax { diff --git a/csharp/app/SaliMax/src/Log/TruConvertAc.cs b/csharp/app/SaliMax/src/Log/TruConvertAc.cs index eeb56ea4c..af49cbc66 100644 --- a/csharp/app/SaliMax/src/Log/TruConvertAc.cs +++ b/csharp/app/SaliMax/src/Log/TruConvertAc.cs @@ -2,9 +2,9 @@ using System.Text.Json.Nodes; using InnovEnergy.Lib.Devices.Trumpf.TruConvertAc; using InnovEnergy.Lib.Utils; using static DecimalMath.DecimalEx; -using static InnovEnergy.SaliMax.Log.JsonUtil; +using static InnovEnergy.App.SaliMax.Log.JsonUtil; -namespace InnovEnergy.SaliMax.Log; +namespace InnovEnergy.App.SaliMax.Log; public static class TruConvertAc { diff --git a/csharp/app/SaliMax/src/Log/TruConvertDc.cs b/csharp/app/SaliMax/src/Log/TruConvertDc.cs index 09e39d1f2..34c23942b 100644 --- a/csharp/app/SaliMax/src/Log/TruConvertDc.cs +++ b/csharp/app/SaliMax/src/Log/TruConvertDc.cs @@ -1,8 +1,8 @@ using System.Text.Json.Nodes; using InnovEnergy.Lib.Devices.Trumpf.TruConvertDc; -using static InnovEnergy.SaliMax.Log.JsonUtil; +using static InnovEnergy.App.SaliMax.Log.JsonUtil; -namespace InnovEnergy.SaliMax.Log; +namespace InnovEnergy.App.SaliMax.Log; using JO = JsonObject; diff --git a/csharp/app/SaliMax/src/Program.cs b/csharp/app/SaliMax/src/Program.cs index 0734b5b6f..229e3f0b8 100644 --- a/csharp/app/SaliMax/src/Program.cs +++ b/csharp/app/SaliMax/src/Program.cs @@ -1,27 +1,23 @@ - - - using System.Diagnostics; using System.Text.Json; using System.Text.Json.Nodes; using System.Text.Json.Serialization; using Flurl.Http; +using InnovEnergy.App.SaliMax.Controller; +using InnovEnergy.App.SaliMax.Log; +using InnovEnergy.App.SaliMax.SaliMaxRelays; +using InnovEnergy.App.SaliMax.SystemConfig; +using InnovEnergy.Lib.Devices.AMPT; +using InnovEnergy.Lib.Devices.Battery48TL; using InnovEnergy.Lib.Devices.EmuMeter; using InnovEnergy.Lib.Devices.Trumpf.TruConvertAc; using InnovEnergy.Lib.Devices.Trumpf.TruConvertDc; -using InnovEnergy.Lib.Devices.Ampt; -using InnovEnergy.Lib.Devices.Battery48TL; -using InnovEnergy.SaliMax.Controller; -using InnovEnergy.SaliMax.Log; -using InnovEnergy.SaliMax.SaliMaxRelays; -using InnovEnergy.SaliMax.SystemConfig; -using InnovEnergy.Time.Unix; - +using InnovEnergy.Lib.Time.Unix; #pragma warning disable IL2026 -namespace InnovEnergy.SaliMax; +namespace InnovEnergy.App.SaliMax; internal static class Program { diff --git a/csharp/app/SaliMax/src/S3Config.cs b/csharp/app/SaliMax/src/S3Config.cs index 92238fb96..2e04acd81 100644 --- a/csharp/app/SaliMax/src/S3Config.cs +++ b/csharp/app/SaliMax/src/S3Config.cs @@ -5,7 +5,7 @@ using InnovEnergy.Lib.Utils; using static System.Text.Encoding; using Convert = System.Convert; -namespace InnovEnergy.SaliMax; +namespace InnovEnergy.App.SaliMax; public record S3Config { diff --git a/csharp/app/SaliMax/src/SaliMaxRelays/RelayMapBoolean.cs b/csharp/app/SaliMax/src/SaliMaxRelays/RelayMapBoolean.cs index c1408c2ff..bafd76793 100644 --- a/csharp/app/SaliMax/src/SaliMaxRelays/RelayMapBoolean.cs +++ b/csharp/app/SaliMax/src/SaliMaxRelays/RelayMapBoolean.cs @@ -1,4 +1,4 @@ -namespace InnovEnergy.SaliMax.SaliMaxRelays; +namespace InnovEnergy.App.SaliMax.SaliMaxRelays; public enum RelayState { diff --git a/csharp/app/SaliMax/src/SaliMaxRelays/SaliMaxRelaysDevice.cs b/csharp/app/SaliMax/src/SaliMaxRelays/SaliMaxRelaysDevice.cs index 5fb1b8a69..4b5db1e06 100644 --- a/csharp/app/SaliMax/src/SaliMaxRelays/SaliMaxRelaysDevice.cs +++ b/csharp/app/SaliMax/src/SaliMaxRelays/SaliMaxRelaysDevice.cs @@ -1,7 +1,7 @@ using InnovEnergy.Lib.Devices.Adam6060; using InnovEnergy.Lib.Utils; -namespace InnovEnergy.SaliMax.SaliMaxRelays; +namespace InnovEnergy.App.SaliMax.SaliMaxRelays; public class SaliMaxRelaysDevice { diff --git a/csharp/app/SaliMax/src/SaliMaxRelays/SaliMaxRelaysStatus.cs b/csharp/app/SaliMax/src/SaliMaxRelays/SaliMaxRelaysStatus.cs index 64c08b992..915896d54 100644 --- a/csharp/app/SaliMax/src/SaliMaxRelays/SaliMaxRelaysStatus.cs +++ b/csharp/app/SaliMax/src/SaliMaxRelays/SaliMaxRelaysStatus.cs @@ -1,4 +1,4 @@ -namespace InnovEnergy.SaliMax.SaliMaxRelays; +namespace InnovEnergy.App.SaliMax.SaliMaxRelays; public record SaliMaxRelayStatus { diff --git a/csharp/app/SaliMax/src/SystemConfig/Config.cs b/csharp/app/SaliMax/src/SystemConfig/Config.cs index c11f7d6f7..73e42897a 100644 --- a/csharp/app/SaliMax/src/SystemConfig/Config.cs +++ b/csharp/app/SaliMax/src/SystemConfig/Config.cs @@ -1,4 +1,4 @@ -namespace InnovEnergy.SaliMax.SystemConfig; +namespace InnovEnergy.App.SaliMax.SystemConfig; public static class Config { diff --git a/csharp/app/SaliMax/src/SystemConfig/Defaults.cs b/csharp/app/SaliMax/src/SystemConfig/Defaults.cs index 6b11b6ad1..1fcb95d25 100644 --- a/csharp/app/SaliMax/src/SystemConfig/Defaults.cs +++ b/csharp/app/SaliMax/src/SystemConfig/Defaults.cs @@ -1,7 +1,7 @@ using InnovEnergy.Lib.Devices.Trumpf.TruConvertAc; using InnovEnergy.Lib.Devices.Trumpf.TruConvertDc; -namespace InnovEnergy.SaliMax.SystemConfig; +namespace InnovEnergy.App.SaliMax.SystemConfig; public static class Defaults { diff --git a/csharp/app/SaliMax/src/SystemConfig/SalimaxConfig.cs b/csharp/app/SaliMax/src/SystemConfig/SalimaxConfig.cs index 79d01fdd5..2170783e3 100644 --- a/csharp/app/SaliMax/src/SystemConfig/SalimaxConfig.cs +++ b/csharp/app/SaliMax/src/SystemConfig/SalimaxConfig.cs @@ -1,9 +1,9 @@ using System.Text.Json; +using InnovEnergy.Lib.Time.Unix; using InnovEnergy.Lib.Utils; -using InnovEnergy.Time.Unix; using static System.Text.Json.JsonSerializer; -namespace InnovEnergy.SaliMax.SystemConfig; +namespace InnovEnergy.App.SaliMax.SystemConfig; // shut up trim warnings #pragma warning disable IL2026 diff --git a/csharp/app/SaliMax/src/Topology.cs b/csharp/app/SaliMax/src/Topology.cs index ab8a26ee9..f9db2b68b 100644 --- a/csharp/app/SaliMax/src/Topology.cs +++ b/csharp/app/SaliMax/src/Topology.cs @@ -1,10 +1,10 @@ -#undef BatteriesAllowed +#undef BatteriesAllowed +using InnovEnergy.App.SaliMax.Controller; +using InnovEnergy.App.SaliMax.Log; using InnovEnergy.Lib.Utils; -using InnovEnergy.SaliMax.Controller; -using InnovEnergy.SaliMax.Log; -namespace InnovEnergy.SaliMax; +namespace InnovEnergy.App.SaliMax; public static class Topology { diff --git a/csharp/app/SaliMax/src/Utils.cs b/csharp/app/SaliMax/src/Utils.cs index 337502413..4104b5384 100644 --- a/csharp/app/SaliMax/src/Utils.cs +++ b/csharp/app/SaliMax/src/Utils.cs @@ -1,6 +1,6 @@ using InnovEnergy.Lib.Utils; -namespace InnovEnergy.SaliMax; +namespace InnovEnergy.App.SaliMax; public static class Utils { diff --git a/csharp/lib/Channels/Channels.csproj b/csharp/lib/Channels/Channels.csproj index ad3b1fed5..38b2fa318 100644 --- a/csharp/lib/Channels/Channels.csproj +++ b/csharp/lib/Channels/Channels.csproj @@ -2,10 +2,6 @@ - - InnovEnergy.Lib.Channels - - diff --git a/csharp/lib/Channels/V2/Bak/Connections/Connection.cs b/csharp/lib/Channels/V2/Bak/Connections/Connection.cs index 82d0b9f67..ecd18b168 100644 --- a/csharp/lib/Channels/V2/Bak/Connections/Connection.cs +++ b/csharp/lib/Channels/V2/Bak/Connections/Connection.cs @@ -1,4 +1,4 @@ -namespace InnovEnergy.Lib.Channels.V2.Connections; +namespace InnovEnergy.Lib.Channels.V2.Bak.Connections; public abstract class Connection : IConnection where C : IDisposable { diff --git a/csharp/lib/Channels/V2/Bak/Connections/Connections.cs b/csharp/lib/Channels/V2/Bak/Connections/Connections.cs index 1af0c31a1..12e2f7207 100644 --- a/csharp/lib/Channels/V2/Bak/Connections/Connections.cs +++ b/csharp/lib/Channels/V2/Bak/Connections/Connections.cs @@ -1,6 +1,6 @@ using System.Net.Sockets; -namespace InnovEnergy.Lib.Channels.V2.Connections; +namespace InnovEnergy.Lib.Channels.V2.Bak.Connections; public class TcpClientConnection : Connection { diff --git a/csharp/lib/Channels/V2/Bak/Connections/Extensions.cs b/csharp/lib/Channels/V2/Bak/Connections/Extensions.cs index 1dd40eb78..d681564ce 100644 --- a/csharp/lib/Channels/V2/Bak/Connections/Extensions.cs +++ b/csharp/lib/Channels/V2/Bak/Connections/Extensions.cs @@ -1,4 +1,4 @@ -namespace InnovEnergy.Lib.Channels.V2.Connections; +namespace InnovEnergy.Lib.Channels.V2.Bak.Connections; public static class Connection { diff --git a/csharp/lib/Channels/V2/Bak/Connections/IConnection.cs b/csharp/lib/Channels/V2/Bak/Connections/IConnection.cs index 8490accec..7463f3132 100644 --- a/csharp/lib/Channels/V2/Bak/Connections/IConnection.cs +++ b/csharp/lib/Channels/V2/Bak/Connections/IConnection.cs @@ -1,4 +1,4 @@ -namespace InnovEnergy.Lib.Channels.V2.Connections; +namespace InnovEnergy.Lib.Channels.V2.Bak.Connections; public interface IConnection { diff --git a/csharp/lib/Channels/V2/Bak/GenericChannel.cs b/csharp/lib/Channels/V2/Bak/GenericChannel.cs index 6cad9ba22..151bc8aea 100644 --- a/csharp/lib/Channels/V2/Bak/GenericChannel.cs +++ b/csharp/lib/Channels/V2/Bak/GenericChannel.cs @@ -1,6 +1,6 @@ -using InnovEnergy.Lib.Channels.V2.Connections; +using InnovEnergy.Lib.Channels.V2.Bak.Connections; -namespace InnovEnergy.Lib.Channels.V2; +namespace InnovEnergy.Lib.Channels.V2.Bak; public abstract class GenericChannel2 : IChannel, IConnection { diff --git a/csharp/lib/Devices/AMPT/Ampt.csproj b/csharp/lib/Devices/AMPT/Ampt.csproj index 5f3e41475..a576a4ee7 100644 --- a/csharp/lib/Devices/AMPT/Ampt.csproj +++ b/csharp/lib/Devices/AMPT/Ampt.csproj @@ -3,7 +3,7 @@ InnovEnergy.Lib.Devices.Ampt - InnovEnergy.Lib.Devices.Ampt + diff --git a/csharp/lib/Devices/AMPT/AmptCommunicationUnit.cs b/csharp/lib/Devices/AMPT/AmptCommunicationUnit.cs index 239502762..e701c8463 100644 --- a/csharp/lib/Devices/AMPT/AmptCommunicationUnit.cs +++ b/csharp/lib/Devices/AMPT/AmptCommunicationUnit.cs @@ -3,7 +3,7 @@ using InnovEnergy.Lib.Protocols.Modbus.Clients; using InnovEnergy.Lib.Protocols.Modbus.Connections; using InnovEnergy.Lib.StatusApi.Connections; -namespace InnovEnergy.Lib.Devices.Ampt; +namespace InnovEnergy.Lib.Devices.AMPT; public class AmptCommunicationUnit { diff --git a/csharp/lib/Devices/AMPT/AmptDeviceStatus.cs b/csharp/lib/Devices/AMPT/AmptDeviceStatus.cs index 00d9e352f..371395e46 100644 --- a/csharp/lib/Devices/AMPT/AmptDeviceStatus.cs +++ b/csharp/lib/Devices/AMPT/AmptDeviceStatus.cs @@ -1,7 +1,7 @@ using InnovEnergy.Lib.StatusApi.Connections; using InnovEnergy.Lib.StatusApi.Devices; -namespace InnovEnergy.Lib.Devices.Ampt; +namespace InnovEnergy.Lib.Devices.AMPT; public record AmptDeviceStatus ( diff --git a/csharp/lib/Devices/AMPT/AmptStatus.cs b/csharp/lib/Devices/AMPT/AmptStatus.cs index 48ce01d2f..45ff33662 100644 --- a/csharp/lib/Devices/AMPT/AmptStatus.cs +++ b/csharp/lib/Devices/AMPT/AmptStatus.cs @@ -1,7 +1,4 @@ -using InnovEnergy.Lib.StatusApi.Connections; -using InnovEnergy.Lib.StatusApi.Devices; - -namespace InnovEnergy.Lib.Devices.Ampt; +namespace InnovEnergy.Lib.Devices.AMPT; public record AmptStatus ( diff --git a/csharp/lib/Devices/AMPT/AmptStringStatus.cs b/csharp/lib/Devices/AMPT/AmptStringStatus.cs index e8776950f..bd3b2c5e0 100644 --- a/csharp/lib/Devices/AMPT/AmptStringStatus.cs +++ b/csharp/lib/Devices/AMPT/AmptStringStatus.cs @@ -1,4 +1,4 @@ -namespace InnovEnergy.Lib.Devices.Ampt; +namespace InnovEnergy.Lib.Devices.AMPT; public record AmptStringStatus { diff --git a/csharp/lib/Devices/Adam6060/Adam6060.csproj b/csharp/lib/Devices/Adam6060/Adam6060.csproj index f4fcbcbb6..9cc351396 100644 --- a/csharp/lib/Devices/Adam6060/Adam6060.csproj +++ b/csharp/lib/Devices/Adam6060/Adam6060.csproj @@ -3,7 +3,7 @@ InnovEnergy.Lib.Devices.Adam6060 - InnovEnergy.Lib.Devices.Adam6060 + diff --git a/csharp/lib/Devices/Battery48TL/Battery48TL.csproj b/csharp/lib/Devices/Battery48TL/Battery48TL.csproj index 51feacfe1..5007b1d4b 100644 --- a/csharp/lib/Devices/Battery48TL/Battery48TL.csproj +++ b/csharp/lib/Devices/Battery48TL/Battery48TL.csproj @@ -3,7 +3,7 @@ InnovEnergy.Lib.Devices.Battery48TL - InnovEnergy.Lib.Devices.Battery48TL + diff --git a/csharp/lib/Devices/EmuMeter/EmuMeter.csproj b/csharp/lib/Devices/EmuMeter/EmuMeter.csproj index c05adbe6b..fc57021a4 100644 --- a/csharp/lib/Devices/EmuMeter/EmuMeter.csproj +++ b/csharp/lib/Devices/EmuMeter/EmuMeter.csproj @@ -3,7 +3,7 @@ InnovEnergy.Lib.Devices.EmuMeter - InnovEnergy.Lib.Devices.EmuMeter + diff --git a/csharp/lib/Devices/Trumpf/TruConvert/TruConvert.csproj b/csharp/lib/Devices/Trumpf/TruConvert/TruConvert.csproj index 0f5571422..ffe741177 100644 --- a/csharp/lib/Devices/Trumpf/TruConvert/TruConvert.csproj +++ b/csharp/lib/Devices/Trumpf/TruConvert/TruConvert.csproj @@ -2,14 +2,12 @@ - InnovEnergy.Lib.Devices.Trumpf.TruConvert - InnovEnergy.Lib.Devices.Trumpf.TruConvert - latest + - + - + diff --git a/csharp/lib/Devices/Trumpf/TruConvertAc/AlarmMessage.cs b/csharp/lib/Devices/Trumpf/TruConvertAc/AlarmMessage.cs index aceada544..df5535008 100644 --- a/csharp/lib/Devices/Trumpf/TruConvertAc/AlarmMessage.cs +++ b/csharp/lib/Devices/Trumpf/TruConvertAc/AlarmMessage.cs @@ -1,6 +1,6 @@ using System.Diagnostics.CodeAnalysis; -namespace InnovEnergy.Lib.Devices.Trumpf.TruConvert; +namespace InnovEnergy.Lib.Devices.Trumpf.TruConvertAc; [SuppressMessage("ReSharper", "IdentifierTypo")] [SuppressMessage("ReSharper", "UnusedMember.Global")] diff --git a/csharp/lib/Devices/Trumpf/TruConvertAc/TruConvertAc.csproj b/csharp/lib/Devices/Trumpf/TruConvertAc/TruConvertAc.csproj index 31669d385..0e28aa423 100644 --- a/csharp/lib/Devices/Trumpf/TruConvertAc/TruConvertAc.csproj +++ b/csharp/lib/Devices/Trumpf/TruConvertAc/TruConvertAc.csproj @@ -3,7 +3,7 @@ InnovEnergy.Lib.Devices.Trumpf.TruConvertAc - InnovEnergy.Lib.Devices.Trumpf.TruConvertAc + latest diff --git a/csharp/lib/Devices/Trumpf/TruConvertAc/WarningMessage.cs b/csharp/lib/Devices/Trumpf/TruConvertAc/WarningMessage.cs index 45a5538de..2fb74b947 100644 --- a/csharp/lib/Devices/Trumpf/TruConvertAc/WarningMessage.cs +++ b/csharp/lib/Devices/Trumpf/TruConvertAc/WarningMessage.cs @@ -1,6 +1,6 @@ using System.Diagnostics.CodeAnalysis; -namespace InnovEnergy.Lib.Devices.Trumpf.TruConvert; +namespace InnovEnergy.Lib.Devices.Trumpf.TruConvertAc; [SuppressMessage("ReSharper", "IdentifierTypo")] [SuppressMessage("ReSharper", "UnusedMember.Global")] diff --git a/csharp/lib/Devices/Trumpf/TruConvertDc/TruConvertDc.csproj b/csharp/lib/Devices/Trumpf/TruConvertDc/TruConvertDc.csproj index c2acc0062..109275eee 100644 --- a/csharp/lib/Devices/Trumpf/TruConvertDc/TruConvertDc.csproj +++ b/csharp/lib/Devices/Trumpf/TruConvertDc/TruConvertDc.csproj @@ -3,7 +3,7 @@ InnovEnergy.Lib.Devices.Trumpf.TruConvertDc - InnovEnergy.Lib.Devices.Trumpf.TruConvertDc + latest diff --git a/csharp/lib/InnovEnergy.lib.props b/csharp/lib/InnovEnergy.lib.props index 0e1ca7736..de75048b8 100644 --- a/csharp/lib/InnovEnergy.lib.props +++ b/csharp/lib/InnovEnergy.lib.props @@ -4,6 +4,7 @@ Library + $(RootNamespace) diff --git a/csharp/lib/Protocols/DBus/DBus.csproj b/csharp/lib/Protocols/DBus/DBus.csproj index 7f74a94ad..7a32ff8a1 100644 --- a/csharp/lib/Protocols/DBus/DBus.csproj +++ b/csharp/lib/Protocols/DBus/DBus.csproj @@ -5,7 +5,7 @@ DBus Library true InnovEnergy.Lib.Protocols.DBus - InnovEnergy.Lib.Protocols.DBus + diff --git a/csharp/lib/Protocols/Modbus/Modbus.csproj b/csharp/lib/Protocols/Modbus/Modbus.csproj index ec6eb7bf8..18f18b58f 100644 --- a/csharp/lib/Protocols/Modbus/Modbus.csproj +++ b/csharp/lib/Protocols/Modbus/Modbus.csproj @@ -3,7 +3,7 @@ InnovEnergy.Lib.Protocols.Modbus - InnovEnergy.Lib.Protocols.Modbus + diff --git a/csharp/lib/S3/DataRec.cs b/csharp/lib/S3/DataRec.cs index f0d9b2e30..5ae585689 100644 --- a/csharp/lib/S3/DataRec.cs +++ b/csharp/lib/S3/DataRec.cs @@ -1,6 +1,6 @@ -using InnovEnergy.S3.Records.Fields; +using InnovEnergy.Lib.S3.Records.Fields; -namespace InnovEnergy.S3; +namespace InnovEnergy.Lib.S3; public record DataRec { diff --git a/csharp/lib/S3/Drivers/Internal/Delegates/ReadRecord.cs b/csharp/lib/S3/Drivers/Internal/Delegates/ReadRecord.cs index 82c56cda8..ad088d513 100644 --- a/csharp/lib/S3/Drivers/Internal/Delegates/ReadRecord.cs +++ b/csharp/lib/S3/Drivers/Internal/Delegates/ReadRecord.cs @@ -1,6 +1,6 @@ -using InnovEnergy.S3.Metadata; -using InnovEnergy.S3.Records.Specialized; +using InnovEnergy.Lib.S3.Metadata; +using InnovEnergy.Lib.S3.Records.Specialized; -namespace InnovEnergy.S3.Drivers.Internal.Delegates; +namespace InnovEnergy.Lib.S3.Drivers.Internal.Delegates; public delegate Task ReadRecord(AggregationLevel level, UInt32 index); \ No newline at end of file diff --git a/csharp/lib/S3/Drivers/Internal/Delegates/WriteRecord.cs b/csharp/lib/S3/Drivers/Internal/Delegates/WriteRecord.cs index 3c06195ab..4bccde97d 100644 --- a/csharp/lib/S3/Drivers/Internal/Delegates/WriteRecord.cs +++ b/csharp/lib/S3/Drivers/Internal/Delegates/WriteRecord.cs @@ -1,6 +1,6 @@ -using InnovEnergy.S3.Metadata; -using InnovEnergy.S3.Records.Specialized; +using InnovEnergy.Lib.S3.Metadata; +using InnovEnergy.Lib.S3.Records.Specialized; -namespace InnovEnergy.S3.Drivers.Internal.Delegates; +namespace InnovEnergy.Lib.S3.Drivers.Internal.Delegates; public delegate Task WriteRecord(TimeStampedRecord record, AggregationLevel level, UInt32 index); \ No newline at end of file diff --git a/csharp/lib/S3/Drivers/Internal/Reader.cs b/csharp/lib/S3/Drivers/Internal/Reader.cs index eccfc84c4..e5ba5c59e 100644 --- a/csharp/lib/S3/Drivers/Internal/Reader.cs +++ b/csharp/lib/S3/Drivers/Internal/Reader.cs @@ -1,10 +1,10 @@ -using InnovEnergy.S3.Drivers.Internal.Delegates; -using InnovEnergy.S3.Metadata; -using InnovEnergy.S3.Records.Specialized; -using InnovEnergy.Time.Unix; +using InnovEnergy.Lib.S3.Drivers.Internal.Delegates; +using InnovEnergy.Lib.S3.Metadata; +using InnovEnergy.Lib.S3.Records.Specialized; +using InnovEnergy.Lib.Time.Unix; using InnovEnergy.Lib.Utils; -namespace InnovEnergy.S3.Drivers.Internal; +namespace InnovEnergy.Lib.S3.Drivers.Internal; public partial class Reader { diff --git a/csharp/lib/S3/Drivers/Internal/Reader.public.cs b/csharp/lib/S3/Drivers/Internal/Reader.public.cs index 622571c83..424b3ccfe 100644 --- a/csharp/lib/S3/Drivers/Internal/Reader.public.cs +++ b/csharp/lib/S3/Drivers/Internal/Reader.public.cs @@ -1,9 +1,9 @@ -using InnovEnergy.S3.Metadata; -using InnovEnergy.S3.Records.Specialized; -using InnovEnergy.Time.Unix; +using InnovEnergy.Lib.S3.Metadata; +using InnovEnergy.Lib.S3.Records.Specialized; +using InnovEnergy.Lib.Time.Unix; using InnovEnergy.Lib.Utils; -namespace InnovEnergy.S3.Drivers.Internal; +namespace InnovEnergy.Lib.S3.Drivers.Internal; public partial class Reader { diff --git a/csharp/lib/S3/Drivers/Internal/Util/Aggregator.cs b/csharp/lib/S3/Drivers/Internal/Util/Aggregator.cs index de1721858..999a2aa1a 100644 --- a/csharp/lib/S3/Drivers/Internal/Util/Aggregator.cs +++ b/csharp/lib/S3/Drivers/Internal/Util/Aggregator.cs @@ -1,9 +1,9 @@ -using InnovEnergy.S3.Metadata; -using InnovEnergy.S3.Records; -using InnovEnergy.S3.Records.Operations; +using InnovEnergy.Lib.S3.Metadata; +using InnovEnergy.Lib.S3.Records; +using InnovEnergy.Lib.S3.Records.Operations; using InnovEnergy.Lib.Utils; -namespace InnovEnergy.S3.Drivers.Internal.Util; +namespace InnovEnergy.Lib.S3.Drivers.Internal.Util; public class Aggregator { diff --git a/csharp/lib/S3/Drivers/Internal/Util/Sampler.cs b/csharp/lib/S3/Drivers/Internal/Util/Sampler.cs index e8b136265..384b00487 100644 --- a/csharp/lib/S3/Drivers/Internal/Util/Sampler.cs +++ b/csharp/lib/S3/Drivers/Internal/Util/Sampler.cs @@ -1,9 +1,9 @@ -using InnovEnergy.S3.Metadata; -using InnovEnergy.S3.Records; -using InnovEnergy.S3.Records.Specialized; -using InnovEnergy.Time.Unix; +using InnovEnergy.Lib.S3.Metadata; +using InnovEnergy.Lib.S3.Records; +using InnovEnergy.Lib.S3.Records.Specialized; +using InnovEnergy.Lib.Time.Unix; -namespace InnovEnergy.S3.Drivers.Internal.Util; +namespace InnovEnergy.Lib.S3.Drivers.Internal.Util; internal class Sampler { diff --git a/csharp/lib/S3/Drivers/Internal/Writer.cs b/csharp/lib/S3/Drivers/Internal/Writer.cs index e9ee15700..19156a4d3 100644 --- a/csharp/lib/S3/Drivers/Internal/Writer.cs +++ b/csharp/lib/S3/Drivers/Internal/Writer.cs @@ -1,13 +1,13 @@ using System.Diagnostics; -using InnovEnergy.S3.Drivers.Internal.Delegates; -using InnovEnergy.S3.Drivers.Internal.Util; -using InnovEnergy.S3.Metadata; -using InnovEnergy.S3.Records; -using InnovEnergy.S3.Records.Specialized; -using InnovEnergy.Time.Unix; +using InnovEnergy.Lib.S3.Drivers.Internal.Delegates; +using InnovEnergy.Lib.S3.Drivers.Internal.Util; +using InnovEnergy.Lib.S3.Metadata; +using InnovEnergy.Lib.S3.Records; +using InnovEnergy.Lib.S3.Records.Specialized; +using InnovEnergy.Lib.Time.Unix; using InnovEnergy.Lib.Utils; -namespace InnovEnergy.S3.Drivers.Internal; +namespace InnovEnergy.Lib.S3.Drivers.Internal; using AggregationLevels = IReadOnlyList; using Aggregators = IReadOnlyList; diff --git a/csharp/lib/S3/Drivers/Internal/Writer.public.cs b/csharp/lib/S3/Drivers/Internal/Writer.public.cs index 4d5ee131e..15ab491cf 100644 --- a/csharp/lib/S3/Drivers/Internal/Writer.public.cs +++ b/csharp/lib/S3/Drivers/Internal/Writer.public.cs @@ -1,9 +1,9 @@ -using InnovEnergy.S3.Records; -using InnovEnergy.S3.Records.Specialized; -using InnovEnergy.Time.Unix; +using InnovEnergy.Lib.S3.Records; +using InnovEnergy.Lib.S3.Records.Specialized; +using InnovEnergy.Lib.Time.Unix; using InnovEnergy.Lib.Utils; -namespace InnovEnergy.S3.Drivers.Internal; +namespace InnovEnergy.Lib.S3.Drivers.Internal; public partial class Writer { diff --git a/csharp/lib/S3/Drivers/MemoryDriver.cs b/csharp/lib/S3/Drivers/MemoryDriver.cs index 31f3e998a..8b70abf5e 100644 --- a/csharp/lib/S3/Drivers/MemoryDriver.cs +++ b/csharp/lib/S3/Drivers/MemoryDriver.cs @@ -1,10 +1,10 @@ -using InnovEnergy.S3.Drivers.Internal; -using InnovEnergy.S3.Drivers.Internal.Delegates; -using InnovEnergy.S3.Metadata; -using InnovEnergy.S3.Records.Specialized; -using InnovEnergy.Time.Unix; +using InnovEnergy.Lib.S3.Drivers.Internal; +using InnovEnergy.Lib.S3.Drivers.Internal.Delegates; +using InnovEnergy.Lib.S3.Metadata; +using InnovEnergy.Lib.S3.Records.Specialized; +using InnovEnergy.Lib.Time.Unix; -namespace InnovEnergy.S3.Drivers; +namespace InnovEnergy.Lib.S3.Drivers; using Levels = IReadOnlyList; using Memory = Dictionary; diff --git a/csharp/lib/S3/Drivers/S3Config.cs b/csharp/lib/S3/Drivers/S3Config.cs index 4b4d60d18..758244b3f 100644 --- a/csharp/lib/S3/Drivers/S3Config.cs +++ b/csharp/lib/S3/Drivers/S3Config.cs @@ -5,7 +5,7 @@ using InnovEnergy.Lib.Utils; using static System.Text.Encoding; using Convert = System.Convert; -namespace InnovEnergy.S3.Drivers; +namespace InnovEnergy.Lib.S3.Drivers; public record S3Config { diff --git a/csharp/lib/S3/Drivers/S3Driver.cs b/csharp/lib/S3/Drivers/S3Driver.cs index 91a4ada47..9d231e998 100644 --- a/csharp/lib/S3/Drivers/S3Driver.cs +++ b/csharp/lib/S3/Drivers/S3Driver.cs @@ -1,16 +1,14 @@ using Flurl.Http; -using InnovEnergy.S3.Drivers.Internal; -using InnovEnergy.S3.Drivers.Internal.Delegates; -using InnovEnergy.S3.Metadata; -using InnovEnergy.S3.Records.Serialization; -using InnovEnergy.S3.Records.Specialized; -using InnovEnergy.Time.Unix; +using InnovEnergy.Lib.S3.Drivers.Internal; +using InnovEnergy.Lib.S3.Drivers.Internal.Delegates; +using InnovEnergy.Lib.S3.Metadata; +using InnovEnergy.Lib.S3.Records.Serialization; +using InnovEnergy.Lib.S3.Records.Specialized; +using InnovEnergy.Lib.Time.Unix; -namespace InnovEnergy.S3.Drivers; +namespace InnovEnergy.Lib.S3.Drivers; using Levels = IReadOnlyList; -using Memory = Dictionary; - public class S3Driver : Writer { diff --git a/csharp/lib/S3/Metadata/AggregationLevel.cs b/csharp/lib/S3/Metadata/AggregationLevel.cs index 895ca3306..fd1ecd184 100644 --- a/csharp/lib/S3/Metadata/AggregationLevel.cs +++ b/csharp/lib/S3/Metadata/AggregationLevel.cs @@ -1,6 +1,6 @@ -using InnovEnergy.Time.Unix; +using InnovEnergy.Lib.Time.Unix; -namespace InnovEnergy.S3.Metadata; +namespace InnovEnergy.Lib.S3.Metadata; public record AggregationLevel { diff --git a/csharp/lib/S3/Metadata/FieldType.cs b/csharp/lib/S3/Metadata/FieldType.cs index aa4093858..9ca91a1af 100644 --- a/csharp/lib/S3/Metadata/FieldType.cs +++ b/csharp/lib/S3/Metadata/FieldType.cs @@ -1,4 +1,4 @@ -namespace InnovEnergy.S3.Metadata; +namespace InnovEnergy.Lib.S3.Metadata; public enum FieldType { diff --git a/csharp/lib/S3/Program.cs b/csharp/lib/S3/Program.cs index 91fd538c8..4ba261f71 100644 --- a/csharp/lib/S3/Program.cs +++ b/csharp/lib/S3/Program.cs @@ -1,12 +1,14 @@ using System.Reactive.Concurrency; using System.Reactive.Linq; using System.Reactive.Subjects; -using InnovEnergy.S3.Metadata; -using InnovEnergy.Time.Unix; +using InnovEnergy.Lib.S3.Metadata; +using InnovEnergy.Lib.Time.Unix; using InnovEnergy.Lib.Utils; -using static InnovEnergy.Time.Unix.UnixTimeSpan; +using static InnovEnergy.Lib.Time.Unix.UnixTimeSpan; + +namespace InnovEnergy.Lib.S3; + -namespace InnovEnergy.S3; public enum MyEnum { diff --git a/csharp/lib/S3/Records/Fields/Field.cs b/csharp/lib/S3/Records/Fields/Field.cs index 6831a6957..a68f29cd4 100644 --- a/csharp/lib/S3/Records/Fields/Field.cs +++ b/csharp/lib/S3/Records/Fields/Field.cs @@ -1,3 +1,3 @@ -namespace InnovEnergy.S3.Records.Fields; +namespace InnovEnergy.Lib.S3.Records.Fields; public abstract record Field; \ No newline at end of file diff --git a/csharp/lib/S3/Records/Fields/NumberField.cs b/csharp/lib/S3/Records/Fields/NumberField.cs index dca272106..62aca9f6c 100644 --- a/csharp/lib/S3/Records/Fields/NumberField.cs +++ b/csharp/lib/S3/Records/Fields/NumberField.cs @@ -1,4 +1,4 @@ -namespace InnovEnergy.S3.Records.Fields; +namespace InnovEnergy.Lib.S3.Records.Fields; public record NumberField : Field { diff --git a/csharp/lib/S3/Records/Fields/TextField.cs b/csharp/lib/S3/Records/Fields/TextField.cs index 561d50772..7b1ebd2e4 100644 --- a/csharp/lib/S3/Records/Fields/TextField.cs +++ b/csharp/lib/S3/Records/Fields/TextField.cs @@ -1,6 +1,6 @@ using InnovEnergy.Lib.Utils; -namespace InnovEnergy.S3.Records.Fields; +namespace InnovEnergy.Lib.S3.Records.Fields; public record TextField : Field { diff --git a/csharp/lib/S3/Records/Fields/TextFrequency.cs b/csharp/lib/S3/Records/Fields/TextFrequency.cs index 39631a4c1..60974957f 100644 --- a/csharp/lib/S3/Records/Fields/TextFrequency.cs +++ b/csharp/lib/S3/Records/Fields/TextFrequency.cs @@ -1,4 +1,4 @@ -namespace InnovEnergy.S3.Records.Fields; +namespace InnovEnergy.Lib.S3.Records.Fields; public record TextFrequency { diff --git a/csharp/lib/S3/Records/Fields/UnitAttribute.cs b/csharp/lib/S3/Records/Fields/UnitAttribute.cs index af47ca5b7..1bd25600c 100644 --- a/csharp/lib/S3/Records/Fields/UnitAttribute.cs +++ b/csharp/lib/S3/Records/Fields/UnitAttribute.cs @@ -1,4 +1,4 @@ -namespace InnovEnergy.S3.Records.Fields; +namespace InnovEnergy.Lib.S3.Records.Fields; [AttributeUsage(AttributeTargets.Property)] public sealed class UnitAttribute : Attribute diff --git a/csharp/lib/S3/Records/Fields/WithUnit.cs b/csharp/lib/S3/Records/Fields/WithUnit.cs index 26dcdc9ad..01104d9de 100644 --- a/csharp/lib/S3/Records/Fields/WithUnit.cs +++ b/csharp/lib/S3/Records/Fields/WithUnit.cs @@ -1,4 +1,4 @@ -namespace InnovEnergy.S3.Records.Fields; +namespace InnovEnergy.Lib.S3.Records.Fields; public readonly struct WithUnit { diff --git a/csharp/lib/S3/Records/Operations/Aggregation.cs b/csharp/lib/S3/Records/Operations/Aggregation.cs index b13ddd651..1b938947f 100644 --- a/csharp/lib/S3/Records/Operations/Aggregation.cs +++ b/csharp/lib/S3/Records/Operations/Aggregation.cs @@ -1,11 +1,11 @@ using System.Diagnostics.CodeAnalysis; -using InnovEnergy.S3.Records.Fields; +using InnovEnergy.Lib.S3.Records.Fields; using InnovEnergy.Lib.Utils; -namespace InnovEnergy.S3.Records.Operations; +namespace InnovEnergy.Lib.S3.Records.Operations; // ReSharper disable ArgumentsStyleOther -using NamedField = KeyValuePair; + public static class Aggregation { diff --git a/csharp/lib/S3/Records/Operations/Conversion.cs b/csharp/lib/S3/Records/Operations/Conversion.cs index 489d9648f..cb68eb4ca 100644 --- a/csharp/lib/S3/Records/Operations/Conversion.cs +++ b/csharp/lib/S3/Records/Operations/Conversion.cs @@ -1,9 +1,9 @@ using System.Reflection; -using InnovEnergy.S3.Records.Fields; +using InnovEnergy.Lib.S3.Records.Fields; using InnovEnergy.Lib.Utils; using static System.Reflection.BindingFlags; -namespace InnovEnergy.S3.Records.Operations; +namespace InnovEnergy.Lib.S3.Records.Operations; public static class Conversion { diff --git a/csharp/lib/S3/Records/Record.cs b/csharp/lib/S3/Records/Record.cs index 050151c07..365765843 100644 --- a/csharp/lib/S3/Records/Record.cs +++ b/csharp/lib/S3/Records/Record.cs @@ -1,8 +1,8 @@ -using InnovEnergy.S3.Records.Fields; -using InnovEnergy.S3.Records.Specialized; -using InnovEnergy.Time.Unix; +using InnovEnergy.Lib.S3.Records.Fields; +using InnovEnergy.Lib.S3.Records.Specialized; +using InnovEnergy.Lib.Time.Unix; -namespace InnovEnergy.S3.Records; +namespace InnovEnergy.Lib.S3.Records; public record Record : Field { diff --git a/csharp/lib/S3/Records/Serialization/FieldTag.cs b/csharp/lib/S3/Records/Serialization/FieldTag.cs index 19d486da5..8dff3261b 100644 --- a/csharp/lib/S3/Records/Serialization/FieldTag.cs +++ b/csharp/lib/S3/Records/Serialization/FieldTag.cs @@ -1,4 +1,4 @@ -namespace InnovEnergy.S3.Records.Serialization; +namespace InnovEnergy.Lib.S3.Records.Serialization; public enum FieldTag : Byte { diff --git a/csharp/lib/S3/Records/Serialization/Parser.cs b/csharp/lib/S3/Records/Serialization/Parser.cs index 694b9bc26..76319a31a 100644 --- a/csharp/lib/S3/Records/Serialization/Parser.cs +++ b/csharp/lib/S3/Records/Serialization/Parser.cs @@ -1,10 +1,10 @@ using System.Text; -using InnovEnergy.S3.Records.Fields; -using InnovEnergy.S3.Records.Specialized; -using InnovEnergy.Time.Unix; +using InnovEnergy.Lib.S3.Records.Fields; +using InnovEnergy.Lib.S3.Records.Specialized; +using InnovEnergy.Lib.Time.Unix; using InnovEnergy.Lib.Utils; -namespace InnovEnergy.S3.Records.Serialization; +namespace InnovEnergy.Lib.S3.Records.Serialization; public class Parser { diff --git a/csharp/lib/S3/Records/Serialization/Serializer.cs b/csharp/lib/S3/Records/Serialization/Serializer.cs index 888132fbf..d7766df8d 100644 --- a/csharp/lib/S3/Records/Serialization/Serializer.cs +++ b/csharp/lib/S3/Records/Serialization/Serializer.cs @@ -1,10 +1,10 @@ -using InnovEnergy.S3.Records.Fields; -using InnovEnergy.S3.Records.Specialized; -using InnovEnergy.Time.Unix; +using InnovEnergy.Lib.S3.Records.Fields; +using InnovEnergy.Lib.S3.Records.Specialized; +using InnovEnergy.Lib.Time.Unix; using InnovEnergy.Lib.Utils; using static System.Text.Encoding; -namespace InnovEnergy.S3.Records.Serialization; +namespace InnovEnergy.Lib.S3.Records.Serialization; public static class Serializer { diff --git a/csharp/lib/S3/Records/Specialized/AggregatedRecord.cs b/csharp/lib/S3/Records/Specialized/AggregatedRecord.cs index f8340d63d..e4b9a2283 100644 --- a/csharp/lib/S3/Records/Specialized/AggregatedRecord.cs +++ b/csharp/lib/S3/Records/Specialized/AggregatedRecord.cs @@ -1,7 +1,7 @@ -using InnovEnergy.S3.Metadata; -using InnovEnergy.Time.Unix; +using InnovEnergy.Lib.S3.Metadata; +using InnovEnergy.Lib.Time.Unix; -namespace InnovEnergy.S3.Records.Specialized; +namespace InnovEnergy.Lib.S3.Records.Specialized; public readonly struct AggregatedRecord { diff --git a/csharp/lib/S3/Records/Specialized/TimeStampedRecord.cs b/csharp/lib/S3/Records/Specialized/TimeStampedRecord.cs index 28060830a..57dc56aed 100644 --- a/csharp/lib/S3/Records/Specialized/TimeStampedRecord.cs +++ b/csharp/lib/S3/Records/Specialized/TimeStampedRecord.cs @@ -1,6 +1,6 @@ -using InnovEnergy.Time.Unix; +using InnovEnergy.Lib.Time.Unix; -namespace InnovEnergy.S3.Records.Specialized; +namespace InnovEnergy.Lib.S3.Records.Specialized; public readonly struct TimeStampedRecord { diff --git a/csharp/lib/S3/S3.csproj b/csharp/lib/S3/S3.csproj index c68d60ec8..0da1127e5 100644 --- a/csharp/lib/S3/S3.csproj +++ b/csharp/lib/S3/S3.csproj @@ -2,11 +2,6 @@ - - InnovEnergy.S3 - latest - - diff --git a/csharp/lib/StatusApi/StatusApi.csproj b/csharp/lib/StatusApi/StatusApi.csproj index 96f7a934f..edc182ef8 100644 --- a/csharp/lib/StatusApi/StatusApi.csproj +++ b/csharp/lib/StatusApi/StatusApi.csproj @@ -3,7 +3,7 @@ InnovEnergy.Lib.StatusApi - InnovEnergy.Lib.StatusApi + diff --git a/csharp/lib/Units/Current.cs b/csharp/lib/StatusData/Current.cs similarity index 97% rename from csharp/lib/Units/Current.cs rename to csharp/lib/StatusData/Current.cs index e313271b8..2f65add3c 100644 --- a/csharp/lib/Units/Current.cs +++ b/csharp/lib/StatusData/Current.cs @@ -1,4 +1,4 @@ -namespace InnovEnergy.Units; +namespace InnovEnergy.Lib.StatusData; public readonly struct Current { @@ -29,6 +29,4 @@ public readonly struct Current // U=RI public static Voltage operator *(Current current, Resistance resistance) => new Voltage(resistance.Value* current.Value); - - } \ No newline at end of file diff --git a/csharp/lib/Units/Json/Converters.cs b/csharp/lib/StatusData/Json/Converters.cs similarity index 90% rename from csharp/lib/Units/Json/Converters.cs rename to csharp/lib/StatusData/Json/Converters.cs index 81406754f..ab6a4336b 100644 --- a/csharp/lib/Units/Json/Converters.cs +++ b/csharp/lib/StatusData/Json/Converters.cs @@ -1,5 +1,5 @@ using System.Text.Json.Serialization; -using InnovEnergy.Units.Json; +using InnovEnergy.Lib.StatusData.Json; // ReSharper disable once CheckNamespace namespace InnovEnergy.Units; diff --git a/csharp/lib/Units/Json/CurrentConverter.cs b/csharp/lib/StatusData/Json/CurrentConverter.cs similarity index 91% rename from csharp/lib/Units/Json/CurrentConverter.cs rename to csharp/lib/StatusData/Json/CurrentConverter.cs index 93733110f..64707325f 100644 --- a/csharp/lib/Units/Json/CurrentConverter.cs +++ b/csharp/lib/StatusData/Json/CurrentConverter.cs @@ -1,7 +1,7 @@ using System.Text.Json; using System.Text.Json.Serialization; -namespace InnovEnergy.Units.Json; +namespace InnovEnergy.Lib.StatusData.Json; public class CurrentConverter : JsonConverter { diff --git a/csharp/lib/Units/Json/PowerConverter.cs b/csharp/lib/StatusData/Json/PowerConverter.cs similarity index 90% rename from csharp/lib/Units/Json/PowerConverter.cs rename to csharp/lib/StatusData/Json/PowerConverter.cs index 037252da4..8c33d3eae 100644 --- a/csharp/lib/Units/Json/PowerConverter.cs +++ b/csharp/lib/StatusData/Json/PowerConverter.cs @@ -1,7 +1,7 @@ using System.Text.Json; using System.Text.Json.Serialization; -namespace InnovEnergy.Units.Json; +namespace InnovEnergy.Lib.StatusData.Json; public class PowerConverter : JsonConverter { diff --git a/csharp/lib/Units/Json/ResistanceConverter.cs b/csharp/lib/StatusData/Json/ResistanceConverter.cs similarity index 91% rename from csharp/lib/Units/Json/ResistanceConverter.cs rename to csharp/lib/StatusData/Json/ResistanceConverter.cs index 022daff8c..a60d99009 100644 --- a/csharp/lib/Units/Json/ResistanceConverter.cs +++ b/csharp/lib/StatusData/Json/ResistanceConverter.cs @@ -1,7 +1,7 @@ using System.Text.Json; using System.Text.Json.Serialization; -namespace InnovEnergy.Units.Json; +namespace InnovEnergy.Lib.StatusData.Json; public class ResistanceConverter : JsonConverter { diff --git a/csharp/lib/Units/Json/VoltageConverter.cs b/csharp/lib/StatusData/Json/VoltageConverter.cs similarity index 91% rename from csharp/lib/Units/Json/VoltageConverter.cs rename to csharp/lib/StatusData/Json/VoltageConverter.cs index 62922c1d7..b51ceabf5 100644 --- a/csharp/lib/Units/Json/VoltageConverter.cs +++ b/csharp/lib/StatusData/Json/VoltageConverter.cs @@ -1,7 +1,7 @@ using System.Text.Json; using System.Text.Json.Serialization; -namespace InnovEnergy.Units.Json; +namespace InnovEnergy.Lib.StatusData.Json; public class VoltageConverter : JsonConverter { diff --git a/csharp/lib/Units/Power.cs b/csharp/lib/StatusData/Power.cs similarity index 95% rename from csharp/lib/Units/Power.cs rename to csharp/lib/StatusData/Power.cs index d6e88bccc..3a605dfca 100644 --- a/csharp/lib/Units/Power.cs +++ b/csharp/lib/StatusData/Power.cs @@ -1,4 +1,6 @@ -namespace InnovEnergy.Units; +using InnovEnergy.Units; + +namespace InnovEnergy.Lib.StatusData; public readonly struct Power { diff --git a/csharp/lib/Units/Resistance.cs b/csharp/lib/StatusData/Resistance.cs similarity index 97% rename from csharp/lib/Units/Resistance.cs rename to csharp/lib/StatusData/Resistance.cs index ae551e019..d10573e77 100644 --- a/csharp/lib/Units/Resistance.cs +++ b/csharp/lib/StatusData/Resistance.cs @@ -1,4 +1,4 @@ -namespace InnovEnergy.Units; +namespace InnovEnergy.Lib.StatusData; public readonly struct Resistance { diff --git a/csharp/lib/StatusData/State.cs b/csharp/lib/StatusData/State.cs new file mode 100644 index 000000000..1f91b1249 --- /dev/null +++ b/csharp/lib/StatusData/State.cs @@ -0,0 +1,21 @@ +namespace InnovEnergy.Lib.StatusData; + +public readonly struct State +{ + public IReadOnlyList Values { get; } + + public State(IReadOnlyList values) => Values = values; + + public State(params String[] values) : this((IReadOnlyList)values){} + public State(params State[] states) : this(states.SelectMany(s => s.Values).ToList()){} + + public State(Enum e) : this(e.ToString()) + { + } + + public static implicit operator State(Enum e) => new State(e); + public static implicit operator State(String s) => new State(s); + + // parallel + public static State operator |(State left, State right) => new State(left, right); +} \ No newline at end of file diff --git a/csharp/lib/Units/Units.csproj b/csharp/lib/StatusData/StatusData.csproj similarity index 75% rename from csharp/lib/Units/Units.csproj rename to csharp/lib/StatusData/StatusData.csproj index 090825d42..22522002f 100644 --- a/csharp/lib/Units/Units.csproj +++ b/csharp/lib/StatusData/StatusData.csproj @@ -3,7 +3,7 @@ Library - InnovEnergy.Units + preview diff --git a/csharp/lib/Units/Units.cs b/csharp/lib/StatusData/Units.cs similarity index 89% rename from csharp/lib/Units/Units.cs rename to csharp/lib/StatusData/Units.cs index ced38eb03..4dacaa297 100644 --- a/csharp/lib/Units/Units.cs +++ b/csharp/lib/StatusData/Units.cs @@ -1,4 +1,4 @@ -namespace InnovEnergy.Units; +namespace InnovEnergy.Lib.StatusData; public static partial class Units { diff --git a/csharp/lib/Units/Voltage.cs b/csharp/lib/StatusData/Voltage.cs similarity index 97% rename from csharp/lib/Units/Voltage.cs rename to csharp/lib/StatusData/Voltage.cs index ae39f9a0d..fa7c8a7fc 100644 --- a/csharp/lib/Units/Voltage.cs +++ b/csharp/lib/StatusData/Voltage.cs @@ -1,4 +1,4 @@ -namespace InnovEnergy.Units; +namespace InnovEnergy.Lib.StatusData; public readonly struct Voltage { diff --git a/csharp/lib/SysTools/Edges/RemoteCommandToProcess.cs b/csharp/lib/SysTools/Edges/RemoteCommandToProcess.cs index 71453ab3d..984594e11 100644 --- a/csharp/lib/SysTools/Edges/RemoteCommandToProcess.cs +++ b/csharp/lib/SysTools/Edges/RemoteCommandToProcess.cs @@ -1,7 +1,7 @@ -using InnovEnergy.SysTools.Process; -using InnovEnergy.SysTools.Remote; +using InnovEnergy.Lib.SysTools.Process; +using InnovEnergy.Lib.SysTools.Remote; -namespace InnovEnergy.SysTools.Edges; +namespace InnovEnergy.Lib.SysTools.Edges; public static class RemoteCommandToProcess { diff --git a/csharp/lib/SysTools/Edges/RemotePathToRemoteCommand.cs b/csharp/lib/SysTools/Edges/RemotePathToRemoteCommand.cs index 112623032..5e882d473 100644 --- a/csharp/lib/SysTools/Edges/RemotePathToRemoteCommand.cs +++ b/csharp/lib/SysTools/Edges/RemotePathToRemoteCommand.cs @@ -1,6 +1,6 @@ -using InnovEnergy.SysTools.Remote; +using InnovEnergy.Lib.SysTools.Remote; -namespace InnovEnergy.SysTools.Edges; +namespace InnovEnergy.Lib.SysTools.Edges; public static class RemotePathToRemoteCommand { diff --git a/csharp/lib/SysTools/Edges/SshHostToRemoteCommand.cs b/csharp/lib/SysTools/Edges/SshHostToRemoteCommand.cs index 9dd56a042..c9cfba220 100644 --- a/csharp/lib/SysTools/Edges/SshHostToRemoteCommand.cs +++ b/csharp/lib/SysTools/Edges/SshHostToRemoteCommand.cs @@ -1,6 +1,6 @@ -using InnovEnergy.SysTools.Remote; +using InnovEnergy.Lib.SysTools.Remote; -namespace InnovEnergy.SysTools.Edges; +namespace InnovEnergy.Lib.SysTools.Edges; public static class SshHostToRemoteCommand { diff --git a/csharp/lib/SysTools/Edges/SshHostToRemotePath.cs b/csharp/lib/SysTools/Edges/SshHostToRemotePath.cs index 3d7c75156..4833861b6 100644 --- a/csharp/lib/SysTools/Edges/SshHostToRemotePath.cs +++ b/csharp/lib/SysTools/Edges/SshHostToRemotePath.cs @@ -1,6 +1,6 @@ -using InnovEnergy.SysTools.Remote; +using InnovEnergy.Lib.SysTools.Remote; -namespace InnovEnergy.SysTools.Edges; +namespace InnovEnergy.Lib.SysTools.Edges; public static class SshHostToRemotePath { diff --git a/csharp/lib/SysTools/Edges/StringToCommand.cs b/csharp/lib/SysTools/Edges/StringToCommand.cs index f905db3d8..1dc691b7f 100644 --- a/csharp/lib/SysTools/Edges/StringToCommand.cs +++ b/csharp/lib/SysTools/Edges/StringToCommand.cs @@ -1,4 +1,4 @@ -namespace InnovEnergy.SysTools.Edges; +namespace InnovEnergy.Lib.SysTools.Edges; public static class StringToCommand { diff --git a/csharp/lib/SysTools/Edges/StringToProcess.cs b/csharp/lib/SysTools/Edges/StringToProcess.cs index 6a4229ef6..e8d3c4d63 100644 --- a/csharp/lib/SysTools/Edges/StringToProcess.cs +++ b/csharp/lib/SysTools/Edges/StringToProcess.cs @@ -1,6 +1,6 @@ -using InnovEnergy.SysTools.Process; +using InnovEnergy.Lib.SysTools.Process; -namespace InnovEnergy.SysTools.Edges; +namespace InnovEnergy.Lib.SysTools.Edges; using Env = Dictionary; diff --git a/csharp/lib/SysTools/Edges/StringToRemotePath.cs b/csharp/lib/SysTools/Edges/StringToRemotePath.cs index 5fd37b695..9a32e16b1 100644 --- a/csharp/lib/SysTools/Edges/StringToRemotePath.cs +++ b/csharp/lib/SysTools/Edges/StringToRemotePath.cs @@ -1,6 +1,6 @@ -using InnovEnergy.SysTools.Remote; +using InnovEnergy.Lib.SysTools.Remote; -namespace InnovEnergy.SysTools.Edges; +namespace InnovEnergy.Lib.SysTools.Edges; public static class StringToRemotePath { diff --git a/csharp/lib/SysTools/Edges/StringToSysPath.cs b/csharp/lib/SysTools/Edges/StringToSysPath.cs index 4e31e2836..bf7a93615 100644 --- a/csharp/lib/SysTools/Edges/StringToSysPath.cs +++ b/csharp/lib/SysTools/Edges/StringToSysPath.cs @@ -1,4 +1,4 @@ -namespace InnovEnergy.SysTools.Edges; +namespace InnovEnergy.Lib.SysTools.Edges; public static class StringToSysPath { diff --git a/csharp/lib/SysTools/Edges/SysCommandToProcess.cs b/csharp/lib/SysTools/Edges/SysCommandToProcess.cs index ceee12ebe..b8b142b6f 100644 --- a/csharp/lib/SysTools/Edges/SysCommandToProcess.cs +++ b/csharp/lib/SysTools/Edges/SysCommandToProcess.cs @@ -1,9 +1,9 @@ using System.Diagnostics; using System.Reactive.Linq; using System.Text; -using InnovEnergy.SysTools.Process; +using InnovEnergy.Lib.SysTools.Process; -namespace InnovEnergy.SysTools.Edges; +namespace InnovEnergy.Lib.SysTools.Edges; public static class SysCommandToProcess { diff --git a/csharp/lib/SysTools/Edges/SysCommandToRemoteCommand.cs b/csharp/lib/SysTools/Edges/SysCommandToRemoteCommand.cs index acb42b570..faa77d432 100644 --- a/csharp/lib/SysTools/Edges/SysCommandToRemoteCommand.cs +++ b/csharp/lib/SysTools/Edges/SysCommandToRemoteCommand.cs @@ -1,6 +1,6 @@ -using InnovEnergy.SysTools.Remote; +using InnovEnergy.Lib.SysTools.Remote; -namespace InnovEnergy.SysTools.Edges; +namespace InnovEnergy.Lib.SysTools.Edges; public static class SysCommandToRemoteCommand { diff --git a/csharp/lib/SysTools/Edges/SysPathToProcess.cs b/csharp/lib/SysTools/Edges/SysPathToProcess.cs index be8fe9904..60a030fe8 100644 --- a/csharp/lib/SysTools/Edges/SysPathToProcess.cs +++ b/csharp/lib/SysTools/Edges/SysPathToProcess.cs @@ -1,6 +1,6 @@ -using InnovEnergy.SysTools.Process; +using InnovEnergy.Lib.SysTools.Process; -namespace InnovEnergy.SysTools.Edges; +namespace InnovEnergy.Lib.SysTools.Edges; public static class SysPathToProcess { diff --git a/csharp/lib/SysTools/Edges/SysPathToRemotePath.cs b/csharp/lib/SysTools/Edges/SysPathToRemotePath.cs index aebf6eade..410f6bb7e 100644 --- a/csharp/lib/SysTools/Edges/SysPathToRemotePath.cs +++ b/csharp/lib/SysTools/Edges/SysPathToRemotePath.cs @@ -1,6 +1,6 @@ -using InnovEnergy.SysTools.Remote; +using InnovEnergy.Lib.SysTools.Remote; -namespace InnovEnergy.SysTools.Edges; +namespace InnovEnergy.Lib.SysTools.Edges; public static class SysPathToRemotePath { diff --git a/csharp/lib/SysTools/Edges/SysPathToSysCommand.cs b/csharp/lib/SysTools/Edges/SysPathToSysCommand.cs index 647778e9d..9f27e68ff 100644 --- a/csharp/lib/SysTools/Edges/SysPathToSysCommand.cs +++ b/csharp/lib/SysTools/Edges/SysPathToSysCommand.cs @@ -1,4 +1,4 @@ -namespace InnovEnergy.SysTools.Edges; +namespace InnovEnergy.Lib.SysTools.Edges; public static class SysPathToSysCommand { diff --git a/csharp/lib/SysTools/FileIo.cs b/csharp/lib/SysTools/FileIo.cs index 1df5a0adf..7328bd324 100644 --- a/csharp/lib/SysTools/FileIo.cs +++ b/csharp/lib/SysTools/FileIo.cs @@ -1,7 +1,7 @@ using System.Text; -using InnovEnergy.SysTools.Utils; +using InnovEnergy.Lib.SysTools.Utils; -namespace InnovEnergy.SysTools; +namespace InnovEnergy.Lib.SysTools; public static class FileIo { diff --git a/csharp/lib/SysTools/Process/AsyncProcess.cs b/csharp/lib/SysTools/Process/AsyncProcess.cs index c8c0f3262..3fb9e967f 100644 --- a/csharp/lib/SysTools/Process/AsyncProcess.cs +++ b/csharp/lib/SysTools/Process/AsyncProcess.cs @@ -2,10 +2,10 @@ using System.Diagnostics; using System.Reactive.Concurrency; using System.Reactive.Linq; using System.Reactive.Subjects; -using InnovEnergy.SysTools.Utils; +using InnovEnergy.Lib.SysTools.Utils; using static System.ConsoleColor; -namespace InnovEnergy.SysTools.Process; +namespace InnovEnergy.Lib.SysTools.Process; using Env = Dictionary; diff --git a/csharp/lib/SysTools/Process/ProcessResult.cs b/csharp/lib/SysTools/Process/ProcessResult.cs index bf9f3a52a..162a2280d 100644 --- a/csharp/lib/SysTools/Process/ProcessResult.cs +++ b/csharp/lib/SysTools/Process/ProcessResult.cs @@ -1,6 +1,6 @@ -using InnovEnergy.SysTools.Utils; +using InnovEnergy.Lib.SysTools.Utils; -namespace InnovEnergy.SysTools.Process; +namespace InnovEnergy.Lib.SysTools.Process; public readonly struct ProcessResult { diff --git a/csharp/lib/SysTools/Process/SyncProcess.cs b/csharp/lib/SysTools/Process/SyncProcess.cs index 89b23073e..36caedf3a 100644 --- a/csharp/lib/SysTools/Process/SyncProcess.cs +++ b/csharp/lib/SysTools/Process/SyncProcess.cs @@ -1,9 +1,9 @@ using System.Diagnostics; using System.Text.RegularExpressions; -using InnovEnergy.SysTools.Utils; +using InnovEnergy.Lib.SysTools.Utils; using static System.ConsoleColor; -namespace InnovEnergy.SysTools.Process; +namespace InnovEnergy.Lib.SysTools.Process; using Env = Dictionary; diff --git a/csharp/lib/SysTools/Remote/RemoteCommand.cs b/csharp/lib/SysTools/Remote/RemoteCommand.cs index 75d1febf5..69e59d571 100644 --- a/csharp/lib/SysTools/Remote/RemoteCommand.cs +++ b/csharp/lib/SysTools/Remote/RemoteCommand.cs @@ -1,6 +1,6 @@ -using InnovEnergy.SysTools.Utils; +using InnovEnergy.Lib.SysTools.Utils; -namespace InnovEnergy.SysTools.Remote; +namespace InnovEnergy.Lib.SysTools.Remote; public readonly struct RemoteCommand { diff --git a/csharp/lib/SysTools/Remote/RemoteFileIo.cs b/csharp/lib/SysTools/Remote/RemoteFileIo.cs index 1ecdf6868..1444b5539 100644 --- a/csharp/lib/SysTools/Remote/RemoteFileIo.cs +++ b/csharp/lib/SysTools/Remote/RemoteFileIo.cs @@ -1,7 +1,7 @@ -using InnovEnergy.SysTools.Edges; -using InnovEnergy.SysTools.Utils; +using InnovEnergy.Lib.SysTools.Edges; +using InnovEnergy.Lib.SysTools.Utils; -namespace InnovEnergy.SysTools.Remote; +namespace InnovEnergy.Lib.SysTools.Remote; public static class RemoteFileIo { diff --git a/csharp/lib/SysTools/Remote/RemotePath.cs b/csharp/lib/SysTools/Remote/RemotePath.cs index e8a048bdd..97b21da39 100644 --- a/csharp/lib/SysTools/Remote/RemotePath.cs +++ b/csharp/lib/SysTools/Remote/RemotePath.cs @@ -1,4 +1,4 @@ -namespace InnovEnergy.SysTools.Remote; +namespace InnovEnergy.Lib.SysTools.Remote; public readonly struct RemotePath { diff --git a/csharp/lib/SysTools/Remote/SshHost.cs b/csharp/lib/SysTools/Remote/SshHost.cs index 7f7187302..5afade016 100644 --- a/csharp/lib/SysTools/Remote/SshHost.cs +++ b/csharp/lib/SysTools/Remote/SshHost.cs @@ -1,7 +1,7 @@ -using InnovEnergy.SysTools.Edges; -using InnovEnergy.SysTools.Utils; +using InnovEnergy.Lib.SysTools.Edges; +using InnovEnergy.Lib.SysTools.Utils; -namespace InnovEnergy.SysTools.Remote; +namespace InnovEnergy.Lib.SysTools.Remote; public readonly struct SshHost { diff --git a/csharp/lib/SysTools/SysCommand.cs b/csharp/lib/SysTools/SysCommand.cs index da3826e83..9d264c27d 100644 --- a/csharp/lib/SysTools/SysCommand.cs +++ b/csharp/lib/SysTools/SysCommand.cs @@ -1,6 +1,6 @@ -using InnovEnergy.SysTools.Utils; +using InnovEnergy.Lib.SysTools.Utils; -namespace InnovEnergy.SysTools; +namespace InnovEnergy.Lib.SysTools; public readonly struct SysCommand { diff --git a/csharp/lib/SysTools/SysDirs.cs b/csharp/lib/SysTools/SysDirs.cs index afec2e014..5c3c5bc68 100644 --- a/csharp/lib/SysTools/SysDirs.cs +++ b/csharp/lib/SysTools/SysDirs.cs @@ -1,7 +1,7 @@ using static System.Environment; using static System.Environment.SpecialFolder; -namespace InnovEnergy.SysTools; +namespace InnovEnergy.Lib.SysTools; public static class SysDirs { diff --git a/csharp/lib/SysTools/SysPath.cs b/csharp/lib/SysTools/SysPath.cs index 42bd090e0..383460ab8 100644 --- a/csharp/lib/SysTools/SysPath.cs +++ b/csharp/lib/SysTools/SysPath.cs @@ -1,9 +1,9 @@ using System.Text; -using InnovEnergy.SysTools.Remote; -using InnovEnergy.SysTools.Utils; +using InnovEnergy.Lib.SysTools.Remote; +using InnovEnergy.Lib.SysTools.Utils; using static System.IO.Path; -namespace InnovEnergy.SysTools; +namespace InnovEnergy.Lib.SysTools; public readonly struct SysPath { diff --git a/csharp/lib/SysTools/SysTools.csproj b/csharp/lib/SysTools/SysTools.csproj index 506350df6..aa11972a1 100644 --- a/csharp/lib/SysTools/SysTools.csproj +++ b/csharp/lib/SysTools/SysTools.csproj @@ -1,18 +1,6 @@ - - Library - - - - full - - - - InnovEnergy.SysTools - - diff --git a/csharp/lib/SysTools/Utils/ConsoleUtils.cs b/csharp/lib/SysTools/Utils/ConsoleUtils.cs index f1d418b3b..5c58ef3b4 100644 --- a/csharp/lib/SysTools/Utils/ConsoleUtils.cs +++ b/csharp/lib/SysTools/Utils/ConsoleUtils.cs @@ -1,4 +1,4 @@ -namespace InnovEnergy.SysTools.Utils; +namespace InnovEnergy.Lib.SysTools.Utils; internal static class ConsoleUtils { diff --git a/csharp/lib/SysTools/Utils/EnumerableUtils.cs b/csharp/lib/SysTools/Utils/EnumerableUtils.cs index e0e6338dc..16d6c8671 100644 --- a/csharp/lib/SysTools/Utils/EnumerableUtils.cs +++ b/csharp/lib/SysTools/Utils/EnumerableUtils.cs @@ -1,4 +1,4 @@ -namespace InnovEnergy.SysTools.Utils; +namespace InnovEnergy.Lib.SysTools.Utils; internal static class EnumerableUtils { diff --git a/csharp/lib/SysTools/Utils/StringUtils.cs b/csharp/lib/SysTools/Utils/StringUtils.cs index c67f724c7..c6a6ef12c 100644 --- a/csharp/lib/SysTools/Utils/StringUtils.cs +++ b/csharp/lib/SysTools/Utils/StringUtils.cs @@ -1,4 +1,4 @@ -namespace InnovEnergy.SysTools.Utils; +namespace InnovEnergy.Lib.SysTools.Utils; internal static class StringUtils { diff --git a/csharp/lib/SysTools/Utils/Utils.cs b/csharp/lib/SysTools/Utils/Utils.cs index 6129cc8df..73e37198e 100644 --- a/csharp/lib/SysTools/Utils/Utils.cs +++ b/csharp/lib/SysTools/Utils/Utils.cs @@ -1,4 +1,4 @@ -namespace InnovEnergy.SysTools.Utils; +namespace InnovEnergy.Lib.SysTools.Utils; public static class Utils { diff --git a/csharp/lib/Time/Time.csproj b/csharp/lib/Time/Time.csproj index 5b0b36b7e..a2a63460f 100644 --- a/csharp/lib/Time/Time.csproj +++ b/csharp/lib/Time/Time.csproj @@ -1,9 +1,3 @@ - - - Library - InnovEnergy.Time - - diff --git a/csharp/lib/Time/Unix/UnixTime.Compare.cs b/csharp/lib/Time/Unix/UnixTime.Compare.cs index ca91d5ce2..044ef1a32 100644 --- a/csharp/lib/Time/Unix/UnixTime.Compare.cs +++ b/csharp/lib/Time/Unix/UnixTime.Compare.cs @@ -1,4 +1,4 @@ -namespace InnovEnergy.Time.Unix; +namespace InnovEnergy.Lib.Time.Unix; public readonly partial struct UnixTime : IComparable, IEquatable { diff --git a/csharp/lib/Time/Unix/UnixTime.Constructors.cs b/csharp/lib/Time/Unix/UnixTime.Constructors.cs index ba26db8f3..5d963e488 100644 --- a/csharp/lib/Time/Unix/UnixTime.Constructors.cs +++ b/csharp/lib/Time/Unix/UnixTime.Constructors.cs @@ -1,4 +1,4 @@ -namespace InnovEnergy.Time.Unix; +namespace InnovEnergy.Lib.Time.Unix; public readonly partial struct UnixTime { diff --git a/csharp/lib/Time/Unix/UnixTime.Converters.cs b/csharp/lib/Time/Unix/UnixTime.Converters.cs index d8495f092..0d5d17aeb 100644 --- a/csharp/lib/Time/Unix/UnixTime.Converters.cs +++ b/csharp/lib/Time/Unix/UnixTime.Converters.cs @@ -1,4 +1,4 @@ -namespace InnovEnergy.Time.Unix; +namespace InnovEnergy.Lib.Time.Unix; public readonly partial struct UnixTime { diff --git a/csharp/lib/Time/Unix/UnixTime.Operators.cs b/csharp/lib/Time/Unix/UnixTime.Operators.cs index 850ccbfe3..7aeb71b69 100644 --- a/csharp/lib/Time/Unix/UnixTime.Operators.cs +++ b/csharp/lib/Time/Unix/UnixTime.Operators.cs @@ -1,4 +1,4 @@ -namespace InnovEnergy.Time.Unix; +namespace InnovEnergy.Lib.Time.Unix; public readonly partial struct UnixTime { diff --git a/csharp/lib/Time/Unix/UnixTime.Overrides.cs b/csharp/lib/Time/Unix/UnixTime.Overrides.cs index 66621de8e..c2ba77a5e 100644 --- a/csharp/lib/Time/Unix/UnixTime.Overrides.cs +++ b/csharp/lib/Time/Unix/UnixTime.Overrides.cs @@ -1,4 +1,4 @@ -namespace InnovEnergy.Time.Unix; +namespace InnovEnergy.Lib.Time.Unix; public readonly partial struct UnixTime { diff --git a/csharp/lib/Time/Unix/UnixTime.cs b/csharp/lib/Time/Unix/UnixTime.cs index b441c0c5f..f771fd01d 100644 --- a/csharp/lib/Time/Unix/UnixTime.cs +++ b/csharp/lib/Time/Unix/UnixTime.cs @@ -2,7 +2,7 @@ // ReSharper disable ArrangeStaticMemberQualifier -namespace InnovEnergy.Time.Unix; +namespace InnovEnergy.Lib.Time.Unix; public readonly partial struct UnixTime { diff --git a/csharp/lib/Time/Unix/UnixTimeDelta.Compare.cs b/csharp/lib/Time/Unix/UnixTimeDelta.Compare.cs index aac266c70..72f59f82e 100644 --- a/csharp/lib/Time/Unix/UnixTimeDelta.Compare.cs +++ b/csharp/lib/Time/Unix/UnixTimeDelta.Compare.cs @@ -1,4 +1,4 @@ -namespace InnovEnergy.Time.Unix; +namespace InnovEnergy.Lib.Time.Unix; public readonly partial struct UnixTimeSpan : IComparable, IEquatable { diff --git a/csharp/lib/Time/Unix/UnixTimeDelta.Constructors.cs b/csharp/lib/Time/Unix/UnixTimeDelta.Constructors.cs index 7811fb4d6..c1fa4f877 100644 --- a/csharp/lib/Time/Unix/UnixTimeDelta.Constructors.cs +++ b/csharp/lib/Time/Unix/UnixTimeDelta.Constructors.cs @@ -1,4 +1,4 @@ -namespace InnovEnergy.Time.Unix; +namespace InnovEnergy.Lib.Time.Unix; public readonly partial struct UnixTimeSpan { diff --git a/csharp/lib/Time/Unix/UnixTimeDelta.Operators.cs b/csharp/lib/Time/Unix/UnixTimeDelta.Operators.cs index d373ccde1..dc2805e2d 100644 --- a/csharp/lib/Time/Unix/UnixTimeDelta.Operators.cs +++ b/csharp/lib/Time/Unix/UnixTimeDelta.Operators.cs @@ -1,4 +1,4 @@ -namespace InnovEnergy.Time.Unix; +namespace InnovEnergy.Lib.Time.Unix; public readonly partial struct UnixTimeSpan { diff --git a/csharp/lib/Time/Unix/UnixTimeDelta.Overrides.cs b/csharp/lib/Time/Unix/UnixTimeDelta.Overrides.cs index 0c000fab9..9552fbbe3 100644 --- a/csharp/lib/Time/Unix/UnixTimeDelta.Overrides.cs +++ b/csharp/lib/Time/Unix/UnixTimeDelta.Overrides.cs @@ -1,6 +1,6 @@ using System.Text; -namespace InnovEnergy.Time.Unix; +namespace InnovEnergy.Lib.Time.Unix; public readonly partial struct UnixTimeSpan { diff --git a/csharp/lib/Time/Unix/UnixTimeDeltaExtensions.cs b/csharp/lib/Time/Unix/UnixTimeDeltaExtensions.cs index c51928b98..fd98e3487 100644 --- a/csharp/lib/Time/Unix/UnixTimeDeltaExtensions.cs +++ b/csharp/lib/Time/Unix/UnixTimeDeltaExtensions.cs @@ -1,4 +1,4 @@ -namespace InnovEnergy.Time.Unix; +namespace InnovEnergy.Lib.Time.Unix; public static class UnixTimeDeltaExtensions { diff --git a/csharp/lib/Time/Unix/UnixTimeSpan.cs b/csharp/lib/Time/Unix/UnixTimeSpan.cs index cb54ae279..d525deaba 100644 --- a/csharp/lib/Time/Unix/UnixTimeSpan.cs +++ b/csharp/lib/Time/Unix/UnixTimeSpan.cs @@ -1,4 +1,4 @@ -namespace InnovEnergy.Time.Unix; +namespace InnovEnergy.Lib.Time.Unix; public readonly partial struct UnixTimeSpan { diff --git a/csharp/lib/Utils/Utils.csproj b/csharp/lib/Utils/Utils.csproj index 0ddcddea5..222f85663 100644 --- a/csharp/lib/Utils/Utils.csproj +++ b/csharp/lib/Utils/Utils.csproj @@ -2,7 +2,7 @@ - InnovEnergy.Lib.Utils + diff --git a/csharp/lib/Victron/VeDBus/VeDBus.csproj b/csharp/lib/Victron/VeDBus/VeDBus.csproj index 939a409a2..5f986d84c 100644 --- a/csharp/lib/Victron/VeDBus/VeDBus.csproj +++ b/csharp/lib/Victron/VeDBus/VeDBus.csproj @@ -3,7 +3,7 @@ - InnovEnergy.Lib.Victron.VeDBus + latest diff --git a/csharp/lib/Victron/VictronVRM/Installation.cs b/csharp/lib/Victron/VictronVRM/Installation.cs index ba479b0f6..aa233e275 100644 --- a/csharp/lib/Victron/VictronVRM/Installation.cs +++ b/csharp/lib/Victron/VictronVRM/Installation.cs @@ -1,6 +1,6 @@ using System.Text.Json.Nodes; +using InnovEnergy.Lib.Time.Unix; using InnovEnergy.Lib.Utils; -using InnovEnergy.Time.Unix; // ReSharper disable StringLiteralTypo diff --git a/csharp/lib/Victron/VictronVRM/VictronVRM.csproj b/csharp/lib/Victron/VictronVRM/VictronVRM.csproj index d8fe8e6dd..4370080ea 100644 --- a/csharp/lib/Victron/VictronVRM/VictronVRM.csproj +++ b/csharp/lib/Victron/VictronVRM/VictronVRM.csproj @@ -7,7 +7,7 @@ - InnovEnergy.Lib.Victron.VictronVRM + latest diff --git a/csharp/lib/WebServer/WebServer.csproj b/csharp/lib/WebServer/WebServer.csproj index e879bb272..8063be2ce 100644 --- a/csharp/lib/WebServer/WebServer.csproj +++ b/csharp/lib/WebServer/WebServer.csproj @@ -3,7 +3,7 @@ - InnovEnergy.Lib.WebServer + From 5a3ee3d37ebb5d2b36c93d6c854a54d7f2476686 Mon Sep 17 00:00:00 2001 From: ig Date: Sat, 25 Feb 2023 15:56:48 +0100 Subject: [PATCH 02/12] tie namespace and assembly names to directory structure --- csharp/lib/Devices/AMPT/Ampt.csproj | 6 ------ csharp/lib/Devices/Adam6060/Adam6060.csproj | 6 ------ csharp/lib/Devices/Battery48TL/Battery48TL.csproj | 5 ----- csharp/lib/Devices/EmuMeter/EmuMeter.csproj | 5 ----- csharp/lib/Devices/Trumpf/TruConvert/TruConvert.csproj | 5 ----- .../lib/Devices/Trumpf/TruConvertAc/TruConvertAc.csproj | 6 +----- .../lib/Devices/Trumpf/TruConvertDc/TruConvertDc.csproj | 6 ------ csharp/lib/Protocols/DBus/DBus.csproj | 2 -- csharp/lib/Protocols/Modbus/Modbus.csproj | 5 ----- csharp/lib/StatusApi/StatusApi.csproj | 9 --------- 10 files changed, 1 insertion(+), 54 deletions(-) diff --git a/csharp/lib/Devices/AMPT/Ampt.csproj b/csharp/lib/Devices/AMPT/Ampt.csproj index a576a4ee7..2190a3c06 100644 --- a/csharp/lib/Devices/AMPT/Ampt.csproj +++ b/csharp/lib/Devices/AMPT/Ampt.csproj @@ -1,12 +1,6 @@ - - InnovEnergy.Lib.Devices.Ampt - - - - diff --git a/csharp/lib/Devices/Adam6060/Adam6060.csproj b/csharp/lib/Devices/Adam6060/Adam6060.csproj index 9cc351396..de99fbbaa 100644 --- a/csharp/lib/Devices/Adam6060/Adam6060.csproj +++ b/csharp/lib/Devices/Adam6060/Adam6060.csproj @@ -1,12 +1,6 @@ - - InnovEnergy.Lib.Devices.Adam6060 - - - - diff --git a/csharp/lib/Devices/Battery48TL/Battery48TL.csproj b/csharp/lib/Devices/Battery48TL/Battery48TL.csproj index 5007b1d4b..bbfe44b02 100644 --- a/csharp/lib/Devices/Battery48TL/Battery48TL.csproj +++ b/csharp/lib/Devices/Battery48TL/Battery48TL.csproj @@ -1,11 +1,6 @@ - - InnovEnergy.Lib.Devices.Battery48TL - - - diff --git a/csharp/lib/Devices/EmuMeter/EmuMeter.csproj b/csharp/lib/Devices/EmuMeter/EmuMeter.csproj index fc57021a4..bbfe44b02 100644 --- a/csharp/lib/Devices/EmuMeter/EmuMeter.csproj +++ b/csharp/lib/Devices/EmuMeter/EmuMeter.csproj @@ -1,11 +1,6 @@ - - InnovEnergy.Lib.Devices.EmuMeter - - - diff --git a/csharp/lib/Devices/Trumpf/TruConvert/TruConvert.csproj b/csharp/lib/Devices/Trumpf/TruConvert/TruConvert.csproj index ffe741177..660a234b8 100644 --- a/csharp/lib/Devices/Trumpf/TruConvert/TruConvert.csproj +++ b/csharp/lib/Devices/Trumpf/TruConvert/TruConvert.csproj @@ -1,13 +1,8 @@ - - - - - diff --git a/csharp/lib/Devices/Trumpf/TruConvertAc/TruConvertAc.csproj b/csharp/lib/Devices/Trumpf/TruConvertAc/TruConvertAc.csproj index 0e28aa423..b29f9d3f8 100644 --- a/csharp/lib/Devices/Trumpf/TruConvertAc/TruConvertAc.csproj +++ b/csharp/lib/Devices/Trumpf/TruConvertAc/TruConvertAc.csproj @@ -1,11 +1,7 @@ - - InnovEnergy.Lib.Devices.Trumpf.TruConvertAc - - latest - + diff --git a/csharp/lib/Devices/Trumpf/TruConvertDc/TruConvertDc.csproj b/csharp/lib/Devices/Trumpf/TruConvertDc/TruConvertDc.csproj index 109275eee..8f13140f6 100644 --- a/csharp/lib/Devices/Trumpf/TruConvertDc/TruConvertDc.csproj +++ b/csharp/lib/Devices/Trumpf/TruConvertDc/TruConvertDc.csproj @@ -1,12 +1,6 @@ - - InnovEnergy.Lib.Devices.Trumpf.TruConvertDc - - latest - - diff --git a/csharp/lib/Protocols/DBus/DBus.csproj b/csharp/lib/Protocols/DBus/DBus.csproj index 7a32ff8a1..e33bdceca 100644 --- a/csharp/lib/Protocols/DBus/DBus.csproj +++ b/csharp/lib/Protocols/DBus/DBus.csproj @@ -4,8 +4,6 @@ DBus Library true - InnovEnergy.Lib.Protocols.DBus - diff --git a/csharp/lib/Protocols/Modbus/Modbus.csproj b/csharp/lib/Protocols/Modbus/Modbus.csproj index 18f18b58f..d40e6dc28 100644 --- a/csharp/lib/Protocols/Modbus/Modbus.csproj +++ b/csharp/lib/Protocols/Modbus/Modbus.csproj @@ -1,11 +1,6 @@ - - InnovEnergy.Lib.Protocols.Modbus - - - diff --git a/csharp/lib/StatusApi/StatusApi.csproj b/csharp/lib/StatusApi/StatusApi.csproj index edc182ef8..bb446855b 100644 --- a/csharp/lib/StatusApi/StatusApi.csproj +++ b/csharp/lib/StatusApi/StatusApi.csproj @@ -1,12 +1,6 @@ - - InnovEnergy.Lib.StatusApi - - - - @@ -14,6 +8,3 @@ - - - From aa46ad37b66c827840bec9ab9dfd661e689321ef Mon Sep 17 00:00:00 2001 From: ig Date: Sat, 25 Feb 2023 16:04:41 +0100 Subject: [PATCH 03/12] app => App, lib => Lib --- csharp/{app => App}/Backend/Backend.csproj | 4 +- .../Backend/Controllers/Controller.cs | 0 .../Backend/Controllers/Credentials.cs | 0 .../Backend/Controllers/ReturnsAttribute.cs | 0 csharp/{app => App}/Backend/Database/Db.cs | 0 csharp/{app => App}/Backend/Database/Fake.cs | 0 .../{app => App}/Backend/Database/Folder.cs | 0 .../Backend/Database/Installation.cs | 0 csharp/{app => App}/Backend/Database/User.cs | 0 .../Backend/Database/User2Folder.cs | 0 .../Backend/Database/User2Installation.cs | 0 csharp/{app => App}/Backend/FakeFolders.csv | 0 .../Backend/FakeInstallations.csv | 0 csharp/{app => App}/Backend/FakePasswords.csv | 0 csharp/{app => App}/Backend/FakeUsers.csv | 0 csharp/{app => App}/Backend/HeaderFilter.cs | 0 csharp/{app => App}/Backend/Model/Folder.cs | 0 .../Backend/Model/Installation.cs | 0 .../Backend/Model/Relations/Relation.cs | 0 .../Backend/Model/Relations/Session.cs | 0 .../Backend/Model/Relations/User2Folder.cs | 0 .../Model/Relations/User2Installation.cs | 0 .../Backend/Model/TreeNode.Equality.cs | 0 csharp/{app => App}/Backend/Model/TreeNode.cs | 0 csharp/{app => App}/Backend/Model/User.cs | 0 csharp/{app => App}/Backend/Program.cs | 0 .../Backend/Properties/launchSettings.json | 0 csharp/{app => App}/Backend/Utils/Crypto.cs | 0 csharp/{app => App}/Backend/Utils/Result.cs | 0 csharp/App/Backend/db.sqlite | Bin 0 -> 290816 bytes .../BmsTunnel/BatteryConnection.cs | 0 csharp/{app => App}/BmsTunnel/BmsTunnel.cs | 0 .../{app => App}/BmsTunnel/BmsTunnel.csproj | 4 +- csharp/{app => App}/BmsTunnel/CliPrograms.cs | 0 csharp/{app => App}/BmsTunnel/Program.cs | 0 csharp/{app => App}/BmsTunnel/debug.sh | 0 csharp/{app => App}/BmsTunnel/parameters.txt | 0 .../{app => App}/Collector/Collector.csproj | 6 +- csharp/{app => App}/Collector/Collector.sln | 0 .../Collector/src/BatteryDataParser.cs | 0 .../Collector/src/BatteryDataParserV4.cs | 0 .../Collector/src/Influx/FieldAttribute.cs | 0 .../Collector/src/Influx/InfluxRecord.cs | 0 .../src/Influx/LineProtocolSyntax.cs | 0 .../Collector/src/Influx/TagAttribute.cs | 0 csharp/{app => App}/Collector/src/Program.cs | 0 .../Collector/src/Records/Alarms.cs | 0 .../Collector/src/Records/BatteryRecord.cs | 0 .../Collector/src/Records/BatteryStatus.cs | 0 .../Collector/src/Records/Error.cs | 0 .../src/Records/InstallationStatus.cs | 0 .../Collector/src/Records/IoStatus.cs | 0 .../Collector/src/Records/Leds.cs | 0 .../Collector/src/Records/Temperatures.cs | 0 .../Collector/src/Records/Warnings.cs | 0 csharp/{app => App}/Collector/src/Settings.cs | 0 .../Collector/src/Utils/Extensions.cs | 0 .../{app => App}/Collector/src/Utils/Log.cs | 0 .../Collector/src/Utils/Property.cs | 0 .../src/Utils/ReadOnlyListExtensions.cs | 0 .../{app => App}/Collector/src/Utils/Utils.cs | 0 csharp/{app => App}/EmuMeterDriver/Config.cs | 0 .../EmuMeterDriver/EmuMeterDriver.cs | 0 .../App/EmuMeterDriver/EmuMeterDriver.csproj | 16 +++++ csharp/{app => App}/EmuMeterDriver/Nic.cs | 0 csharp/{app => App}/EmuMeterDriver/Program.cs | 0 csharp/{app => App}/EmuMeterDriver/Signal.cs | 0 csharp/{app => App}/EmuMeterDriver/Utils.cs | 0 csharp/{app => App}/EmuMeterDriver/debug.sh | 0 .../EmuMeterDriver/service/log/run | 0 .../{app => App}/EmuMeterDriver/service/run | 0 .../InnovEnergy.App.props} | 0 .../OpenVpnCertificatesServer/Files.cs | 0 .../OpenVpnCertificatesServer/Http.cs | 0 .../OpenVpnCertificatesServer.csproj | 7 ++- .../OpenVpnCertificatesServer.sln | 0 .../PKI/CertificateAuthority.cs | 0 .../OpenVpnCertificatesServer/PKI/Pem.cs | 0 .../PKI/PwdFinder.cs | 0 .../OpenVpnCertificatesServer/Program.cs | 0 .../OpenVpnCertificatesServer/Utils.cs | 0 .../RemoteSupportConsole/Login.cs | 0 .../ObservablePipeSource.cs | 0 .../RemoteSupportConsole/Program.cs | 0 .../RemoteSupportConsole.csproj | 6 +- .../RemoteSupportConsole.csproj.DotSettings | 0 .../{app => App}/RemoteSupportConsole/Ssh.cs | 0 .../RemoteSupportConsole/VpnConnection.cs | 0 .../RemoteSupportConsole/VpnInfo.cs | 0 .../RemoteSupportConsole/VrmConnection.cs | 0 .../RemoteSupportConsole/VrmInfo.cs | 0 .../RemoteSupportConsole/VrmProxy.cs | 0 csharp/App/SaliMax/SaliMax.csproj | 25 ++++++++ .../SaliMax/run (BeagleBone Meiringen).sh | 0 csharp/{app => App}/SaliMax/src/AsciiArt.cs | 0 csharp/{app => App}/SaliMax/src/BusPort.cs | 0 .../src/Controller/AvgBatteriesStatus.cs | 0 .../SaliMax/src/Controller/Control.cs | 0 .../SaliMax/src/Controller/ControlRecord.cs | 0 .../SaliMax/src/Controller/ControlTarget.cs | 0 .../SaliMax/src/Controller/Controller.cs | 0 .../SaliMax/src/Controller/SaliMaxState.cs | 0 .../SaliMax/src/Controller/State.cs | 0 .../SaliMax/src/Controller/StateConfig.cs | 0 .../SaliMax/src/Controller/StatusRecord.cs | 0 csharp/{app => App}/SaliMax/src/Log/Ampt.cs | 0 .../SaliMax/src/Log/Battery48Tl.cs | 0 .../{app => App}/SaliMax/src/Log/EmuMeter.cs | 0 .../{app => App}/SaliMax/src/Log/JsonUtil.cs | 0 .../{app => App}/SaliMax/src/Log/Salimax.cs | 0 .../SaliMax/src/Log/TruConvertAc.cs | 0 .../SaliMax/src/Log/TruConvertDc.cs | 0 csharp/{app => App}/SaliMax/src/Program.cs | 0 csharp/{app => App}/SaliMax/src/S3Config.cs | 0 .../src/SaliMaxRelays/RelayMapBoolean.cs | 0 .../src/SaliMaxRelays/SaliMaxRelaysDevice.cs | 0 .../src/SaliMaxRelays/SaliMaxRelaysStatus.cs | 0 .../SaliMax/src/SystemConfig/Config.cs | 0 .../SaliMax/src/SystemConfig/Defaults.cs | 0 .../SaliMax/src/SystemConfig/SalimaxConfig.cs | 0 csharp/{app => App}/SaliMax/src/Topology.cs | 0 csharp/{app => App}/SaliMax/src/Utils.cs | 0 csharp/{app => App}/SaliMax/tunnels.html | 0 csharp/{app => App}/SaliMax/tunnels.sh | 0 csharp/InnovEnergy.sln | 56 +++++++++--------- csharp/Lib/Channels/Channels.csproj | 9 +++ csharp/{lib => Lib}/Channels/CloseAfter.cs | 0 csharp/{lib => Lib}/Channels/Connection.cs | 0 .../{lib => Lib}/Channels/Framed/Channel.cs | 0 .../{lib => Lib}/Channels/Stages/Channel.cs | 0 .../Channels/Stages/ConnectedChannel.cs | 0 csharp/{lib => Lib}/Channels/Stages/Stage.cs | 0 .../Channels/V2/Bak/Connections/Connection.cs | 0 .../V2/Bak/Connections/Connections.cs | 0 .../Channels/V2/Bak/Connections/Extensions.cs | 0 .../V2/Bak/Connections/IConnection.cs | 0 .../Channels/V2/Bak/GenericChannel.cs | 0 .../Channels/V2/Bak/StreamChannel.cs | 0 .../Channels/V2/CommandChannel.cs | 0 csharp/{lib => Lib}/Channels/V2/IChannel.cs | 0 .../Channels/V2/Pipes/AsyncPipeSource.cs | 0 .../Channels/V2/Pipes/AsyncPipeTarget.cs | 0 .../Channels/V2/Pipes/ChannelPipeSource.cs | 0 .../Channels/V2/Pipes/ChannelPipeTarget.cs | 0 csharp/{lib => Lib}/Channels/V2/Stage.cs | 0 .../{lib => Lib}/Channels/V2/StreamChannel.cs | 0 csharp/{lib => Lib}/Channels/V2/TcpChannel.cs | 0 csharp/{lib => Lib}/Devices/AMPT/Ampt.csproj | 2 +- .../Devices/AMPT/AmptCommunicationUnit.cs | 0 .../Devices/AMPT/AmptDeviceStatus.cs | 0 .../{lib => Lib}/Devices/AMPT/AmptStatus.cs | 0 .../Devices/AMPT/AmptStringStatus.cs | 0 .../Devices/Adam6060/Adam6060.csproj | 2 +- .../Devices/Adam6060/Adam6060Control.cs | 0 .../Devices/Adam6060/Adam6060Device.cs | 0 .../Devices/Adam6060/Adam6060Status.cs | 0 .../Devices/Battery48TL/Battery48TL.csproj | 2 +- .../Devices/Battery48TL/Battery48TLDevice.cs | 0 .../Battery48TL/Battery48TLStatusRecord.cs | 0 .../Devices/Battery48TL/BatteryDataParser.cs | 0 .../Devices/Battery48TL/Constants.cs | 0 .../Devices/Battery48TL/LedColor.cs | 0 .../Devices/Battery48TL/LedState.cs | 0 .../Devices/EmuMeter/Conversions.cs | 0 .../Devices/EmuMeter/EmuMeter.csproj | 2 +- .../Devices/EmuMeter/EmuMeterDevice.cs | 0 .../Devices/EmuMeter/EmuMeterStatus.cs | 0 .../Devices/Trumpf/TruConvert/AlarmState.cs | 0 .../Devices/Trumpf/TruConvert/MainState.cs | 0 .../Devices/Trumpf/TruConvert/Slave.cs | 0 .../Devices/Trumpf/TruConvert/SystemConfig.cs | 0 .../Trumpf/TruConvert/TruConvert.csproj | 2 +- .../Devices/Trumpf/TruConvert/Utils.cs | 0 .../Trumpf/TruConvertAc/AcControlRegisters.cs | 0 .../Devices/Trumpf/TruConvertAc/AcEnums.cs | 0 .../Trumpf/TruConvertAc/AlarmMessage.cs | 0 .../Trumpf/TruConvertAc/TruConvertAc.csproj | 2 +- .../TruConvertAc/TruConvertAcControl.cs | 0 .../Trumpf/TruConvertAc/TruConvertAcDevice.cs | 0 .../Trumpf/TruConvertAc/TruConvertAcStatus.cs | 0 .../Trumpf/TruConvertAc/WarningMessage.cs | 0 .../Trumpf/TruConvertDc/AlarmMessage.cs | 0 .../Trumpf/TruConvertDc/DcControlRegisters.cs | 0 .../Devices/Trumpf/TruConvertDc/DcEnums.cs | 0 .../Trumpf/TruConvertDc/TruConvertDc.csproj | 2 +- .../TruConvertDc/TruConvertDcControl.cs | 0 .../Trumpf/TruConvertDc/TruConvertDcDevice.cs | 0 .../Trumpf/TruConvertDc/TruConvertDcStatus.cs | 0 .../Trumpf/TruConvertDc/WarningMessage.cs | 0 .../InnovEnergy.Lib.props} | 0 csharp/{lib => Lib}/Protocols/DBus/Bus.cs | 0 .../{lib => Lib}/Protocols/DBus/DBus.csproj | 2 +- .../Protocols/DBus/DBusConnection.cs | 0 .../Protocols/DBus/DBusMessageStream.cs | 0 .../Protocols/DBus/DBusService.cs | 0 .../Protocols/DBus/Daemon/DBusDaemonApi.cs | 0 .../Daemon/DBusDaemonConnection.Resolver.cs | 0 .../DBus/Daemon/DBusDaemonConnection.cs | 0 .../Protocols/DBus/Daemon/MatchRule.cs | 0 .../DBus/Daemon/ObservableDictionary.cs | 0 .../Protocols/DBus/Daemon/ReleaseNameReply.cs | 0 .../DBus/Daemon/RequestNameOptions.cs | 0 .../Protocols/DBus/Daemon/RequestNameReply.cs | 0 csharp/{lib => Lib}/Protocols/DBus/Env.cs | 0 csharp/{lib => Lib}/Protocols/DBus/Interop.cs | 0 .../DataTypes/Convert/StringToSignature.cs | 0 .../DataTypes/Convert/TypeToSignature.cs | 0 .../DBus/Protocol/DataTypes/ObjectPath.cs | 0 .../Signatures/Signature.Equality.cs | 0 .../Signatures/Signature.Terminals.cs | 0 .../DataTypes/Signatures/Signature.cs | 0 .../Signatures/Specialized/ArraySignature.cs | 0 .../Specialized/BasicTypeSignature.cs | 0 .../Specialized/BooleanSignature.cs | 0 .../Signatures/Specialized/ByteSignature.cs | 0 .../Specialized/CompositeSignature.cs | 0 .../Specialized/ContainerTypeSignature.cs | 0 .../Specialized/DictionarySignature.cs | 0 .../Signatures/Specialized/DoubleSignature.cs | 0 .../Signatures/Specialized/EmptySignature.cs | 0 .../Specialized/FixedTypeSignature.cs | 0 .../Signatures/Specialized/Int16Signature.cs | 0 .../Signatures/Specialized/Int32Signature.cs | 0 .../Signatures/Specialized/Int64Signature.cs | 0 .../Specialized/ObjectPathSignature.cs | 0 .../Specialized/SignatureTypeSignature.cs | 0 .../Specialized/StringLikeTypeSignature.cs | 0 .../Signatures/Specialized/StringSignature.cs | 0 .../Signatures/Specialized/StructSignature.cs | 0 .../Signatures/Specialized/UInt16Signature.cs | 0 .../Signatures/Specialized/UInt32Signature.cs | 0 .../Signatures/Specialized/UInt64Signature.cs | 0 .../Specialized/VariantSignature.cs | 0 .../DBus/Protocol/DataTypes/Variant.cs | 0 .../Protocols/DBus/Protocol/Header/Endian.cs | 0 .../DBus/Protocol/Header/FieldCode.cs | 0 .../DBus/Protocol/Header/HeaderExtensions.cs | 0 .../DBus/Protocol/Header/HeaderFlags.cs | 0 .../DBus/Protocol/Header/MessageType.cs | 0 .../Protocols/DBus/Protocol/Message.cs | 0 .../Protocols/DBus/Protocol/Replies.cs | 0 .../Protocols/DBus/Protocol/SerialSource.cs | 0 .../DBus/Transport/AuthenticationMethod.cs | 0 .../DBus/Transport/BufferedSocketReader.cs | 0 .../DBus/Transport/DBusBufferReader.cs | 0 .../DBus/Transport/DBusBufferWriter.cs | 0 .../Protocols/DBus/Transport/DBusSocket.cs | 0 .../Protocols/DBus/Utils/DisposableStack.cs | 0 .../Protocols/DBus/Utils/Extensions.cs | 0 .../Protocols/DBus/Utils/HexView.cs | 0 .../DBus/WireFormat/DBusMeasureWriter.cs | 0 .../Protocols/DBus/WireFormat/DBusReader.cs | 0 .../DBus/WireFormat/DBusSocketReader.cs | 0 .../Protocols/DBus/WireFormat/DBusWriter.cs | 0 .../Protocols/Modbus/Clients/ModbusClient.cs | 0 .../Modbus/Clients/ModbusRtuClient.cs | 0 .../Modbus/Clients/ModbusTcpClient.cs | 0 .../Modbus/Connections/ModbusConnection.cs | 0 .../Connections/ModbusSerialConnection.cs | 0 .../Modbus/Connections/ModbusTcpConnection.cs | 0 .../Modbus/Conversions/Endianness.cs | 0 .../Modbus/Conversions/ModbusRegisters.Bit.cs | 0 .../Conversions/ModbusRegisters.Boolean.cs | 0 .../Conversions/ModbusRegisters.Bytes.cs | 0 .../Conversions/ModbusRegisters.Int16.cs | 0 .../Conversions/ModbusRegisters.Int32.cs | 0 .../Conversions/ModbusRegisters.Single.cs | 0 .../Conversions/ModbusRegisters.String.cs | 0 .../Conversions/ModbusRegisters.UInt16.cs | 0 .../Conversions/ModbusRegisters.UInt32.cs | 0 .../Modbus/Conversions/ModbusRegisters.cs | 0 .../Protocols/Modbus/Modbus.csproj | 2 +- .../Modbus/Protocol/ExceptionCode.cs | 0 .../Protocols/Modbus/Protocol/Exceptions.cs | 0 .../Protocol/Frames/Accessors/Accessors.cs | 0 .../Protocol/Frames/Accessors/MbAddress.cs | 0 .../Protocol/Frames/Accessors/MbBits.cs | 0 .../Protocol/Frames/Accessors/MbByte.cs | 0 .../Protocol/Frames/Accessors/MbByte{T}.cs | 0 .../Protocol/Frames/Accessors/MbWord.cs | 0 .../Protocol/Frames/Accessors/MbWords.cs | 0 .../ReadDiscreteInputsCommandFrame.cs | 0 .../ReadHoldingRegistersCommandFrame.cs | 0 .../ReadInputRegistersCommandFrame.cs | 0 .../ReadWriteRegistersCommandFrame.cs | 0 .../Frames/Commands/WriteCoilsCommandFrame.cs | 0 .../Commands/WriteRegistersCommandFrame.cs | 0 .../Modbus/Protocol/Frames/Constants.cs | 0 .../Modbus/Protocol/Frames/ModbusFrame.cs | 0 .../Frames/Replies/ErrorResponseFrame.cs | 0 .../Replies/ReadDiscreteInputResponseFrame.cs | 0 .../ReadHoldingRegistersResponseFrame.cs | 0 .../ReadInputRegistersResponseFrame.cs | 0 .../Replies/ReadWriteRegistersCommandFrame.cs | 0 .../Frames/Replies/WriteCoilsResponseFrame.cs | 0 .../Replies/WriteRegistersResponseFrame.cs | 0 .../Protocols/Modbus/Protocol/FunctionCode.cs | 0 .../Protocols/Modbus/Tcp/MbapHeader.cs | 0 .../Protocols/Modbus/Tcp/ModbusTcpFrame.cs | 0 .../Modbus/Util/ArraySegmentExtensions.cs | 0 csharp/{lib => Lib}/S3/DataRec.cs | 0 .../Drivers/Internal/Delegates/ReadRecord.cs | 0 .../Drivers/Internal/Delegates/WriteRecord.cs | 0 .../S3/Drivers/Internal/Reader.cs | 0 .../S3/Drivers/Internal/Reader.public.cs | 0 .../S3/Drivers/Internal/Util/Aggregator.cs | 0 .../S3/Drivers/Internal/Util/Sampler.cs | 0 .../S3/Drivers/Internal/Writer.cs | 0 .../S3/Drivers/Internal/Writer.public.cs | 0 .../{lib => Lib}/S3/Drivers/MemoryDriver.cs | 0 csharp/{lib => Lib}/S3/Drivers/S3Config.cs | 0 csharp/{lib => Lib}/S3/Drivers/S3Driver.cs | 0 .../S3/Metadata/AggregationLevel.cs | 0 csharp/{lib => Lib}/S3/Metadata/FieldType.cs | 0 csharp/{lib => Lib}/S3/Program.cs | 0 .../{lib => Lib}/S3/Records/Fields/Field.cs | 0 .../S3/Records/Fields/NumberField.cs | 0 .../S3/Records/Fields/TextField.cs | 0 .../S3/Records/Fields/TextFrequency.cs | 0 .../S3/Records/Fields/UnitAttribute.cs | 0 .../S3/Records/Fields/WithUnit.cs | 0 .../S3/Records/Operations/Aggregation.cs | 0 .../S3/Records/Operations/Conversion.cs | 0 csharp/{lib => Lib}/S3/Records/Record.cs | 0 .../S3/Records/Serialization/FieldTag.cs | 0 .../S3/Records/Serialization/Parser.cs | 0 .../S3/Records/Serialization/Serializer.cs | 0 .../Records/Specialized/AggregatedRecord.cs | 0 .../Records/Specialized/TimeStampedRecord.cs | 0 csharp/{lib => Lib}/S3/S3.csproj | 6 +- .../S3/Serialization/JsonConverters.cs | 0 .../StatusApi/Connections/DcConnection.cs | 0 .../Connections/SinglePhaseAcConnection.cs | 0 .../Connections/ThreePhaseAcConnection.cs | 0 csharp/{lib => Lib}/StatusApi/DeviceType.cs | 0 .../{lib => Lib}/StatusApi/Devices/Battery.cs | 0 .../StatusApi/Devices/DcDcConverter.cs | 0 .../StatusApi/Devices/DcDevice.cs | 0 .../{lib => Lib}/StatusApi/Devices/Device.cs | 0 .../StatusApi/Devices/GridMeter.cs | 0 .../StatusApi/Devices/IPvCoupledDevice.cs | 0 csharp/{lib => Lib}/StatusApi/Devices/Mppt.cs | 0 .../StatusApi/Devices/SinglePhaseAcDevice.cs | 0 .../StatusApi/Devices/SinglePhaseInverter.cs | 0 .../Devices/SinglePhasePvInverter.cs | 0 .../StatusApi/Devices/ThreePhaseAcDevice.cs | 0 .../StatusApi/Devices/ThreePhaseInverter.cs | 0 .../StatusApi/Devices/ThreePhasePvInverter.cs | 0 .../{lib => Lib}/StatusApi/Phases/AcPhase.cs | 0 csharp/{lib => Lib}/StatusApi/Phases/Phase.cs | 0 .../{lib => Lib}/StatusApi/StatusApi.csproj | 2 +- csharp/{lib => Lib}/StatusApi/Utils.cs | 0 csharp/{lib => Lib}/StatusData/Current.cs | 0 .../StatusData/Json/Converters.cs | 0 .../StatusData/Json/CurrentConverter.cs | 0 .../StatusData/Json/PowerConverter.cs | 0 .../StatusData/Json/ResistanceConverter.cs | 0 .../StatusData/Json/VoltageConverter.cs | 0 csharp/{lib => Lib}/StatusData/Power.cs | 0 csharp/{lib => Lib}/StatusData/Resistance.cs | 0 csharp/{lib => Lib}/StatusData/State.cs | 0 .../{lib => Lib}/StatusData/StatusData.csproj | 2 +- csharp/{lib => Lib}/StatusData/Units.cs | 0 csharp/{lib => Lib}/StatusData/Voltage.cs | 0 .../SysTools/Edges/RemoteCommandToProcess.cs | 0 .../Edges/RemotePathToRemoteCommand.cs | 0 .../SysTools/Edges/SshHostToRemoteCommand.cs | 0 .../SysTools/Edges/SshHostToRemotePath.cs | 0 .../SysTools/Edges/StringToCommand.cs | 0 .../SysTools/Edges/StringToProcess.cs | 0 .../SysTools/Edges/StringToRemotePath.cs | 0 .../SysTools/Edges/StringToSysPath.cs | 0 .../SysTools/Edges/SysCommandToProcess.cs | 0 .../Edges/SysCommandToRemoteCommand.cs | 0 .../SysTools/Edges/SysPathToProcess.cs | 0 .../SysTools/Edges/SysPathToRemotePath.cs | 0 .../SysTools/Edges/SysPathToSysCommand.cs | 0 csharp/{lib => Lib}/SysTools/FileIo.cs | 0 .../SysTools/Process/AsyncProcess.cs | 0 .../SysTools/Process/ProcessResult.cs | 0 .../SysTools/Process/SyncProcess.cs | 0 .../SysTools/Remote/RemoteCommand.cs | 0 .../SysTools/Remote/RemoteFileIo.cs | 0 .../SysTools/Remote/RemotePath.cs | 0 .../{lib => Lib}/SysTools/Remote/SshHost.cs | 0 csharp/{lib => Lib}/SysTools/SysCommand.cs | 0 csharp/{lib => Lib}/SysTools/SysDirs.cs | 0 csharp/{lib => Lib}/SysTools/SysPath.cs | 0 csharp/{lib => Lib}/SysTools/SysTools.csproj | 2 +- .../SysTools/Utils/ConsoleUtils.cs | 0 .../SysTools/Utils/EnumerableUtils.cs | 0 .../SysTools/Utils/StringUtils.cs | 0 csharp/{lib => Lib}/SysTools/Utils/Utils.cs | 0 csharp/Lib/Time/Time.csproj | 3 + .../Time/Unix/UnixTime.Compare.cs | 0 .../Time/Unix/UnixTime.Constructors.cs | 0 .../Time/Unix/UnixTime.Converters.cs | 0 .../Time/Unix/UnixTime.Operators.cs | 0 .../Time/Unix/UnixTime.Overrides.cs | 0 csharp/{lib => Lib}/Time/Unix/UnixTime.cs | 0 .../Time/Unix/UnixTimeDelta.Compare.cs | 0 .../Time/Unix/UnixTimeDelta.Constructors.cs | 0 .../Time/Unix/UnixTimeDelta.Operators.cs | 0 .../Time/Unix/UnixTimeDelta.Overrides.cs | 0 .../Time/Unix/UnixTimeDeltaExtensions.cs | 0 csharp/{lib => Lib}/Time/Unix/UnixTimeSpan.cs | 0 csharp/{lib => Lib}/Utils/ArrayExtensions.cs | 0 csharp/{lib => Lib}/Utils/AsyncDelegates.cs | 0 .../{lib => Lib}/Utils/AsyncEnumerableEx.cs | 0 csharp/{lib => Lib}/Utils/AutoComplete.cs | 0 csharp/{lib => Lib}/Utils/CliCommandUtils.cs | 0 csharp/{lib => Lib}/Utils/ConsoleUtils.cs | 0 csharp/{lib => Lib}/Utils/DecimalUtils.cs | 0 csharp/{lib => Lib}/Utils/DictObservables.cs | 0 csharp/{lib => Lib}/Utils/Disposable.cs | 0 csharp/{lib => Lib}/Utils/EnumerableUtils.cs | 0 .../{lib => Lib}/Utils/ExceptionHandling.cs | 0 csharp/{lib => Lib}/Utils/FileSystem.cs | 0 .../{lib => Lib}/Utils/JsonNodeAccessors.cs | 0 csharp/{lib => Lib}/Utils/Maybe.cs | 0 csharp/{lib => Lib}/Utils/Net/NetUtils.cs | 0 .../{lib => Lib}/Utils/Net/PingExtensions.cs | 0 .../{lib => Lib}/Utils/Net/UdpExtensions.cs | 0 csharp/{lib => Lib}/Utils/None.cs | 0 csharp/{lib => Lib}/Utils/NullableUtils.cs | 0 .../Utils/ObservableExceptionHandling.cs | 0 csharp/{lib => Lib}/Utils/ObservableUtils.cs | 0 csharp/{lib => Lib}/Utils/PointFree.cs | 0 csharp/{lib => Lib}/Utils/SshHost.cs | 0 csharp/{lib => Lib}/Utils/StreamExtensions.cs | 0 csharp/{lib => Lib}/Utils/StringUtils.cs | 0 csharp/{lib => Lib}/Utils/TaskUtils.cs | 0 csharp/{lib => Lib}/Utils/TextBlock.cs | 0 .../{lib => Lib}/Utils/Try/Operators.async.cs | 0 .../{lib => Lib}/Utils/Try/Operators.sync.cs | 0 csharp/{lib => Lib}/Utils/Try/Policy.cs | 0 .../{lib => Lib}/Utils/Try/TryAsync.async.cs | 0 csharp/{lib => Lib}/Utils/Try/TryAsync.cs | 0 .../{lib => Lib}/Utils/Try/TryAsync.sync.cs | 0 .../{lib => Lib}/Utils/Try/TrySync.async.cs | 0 csharp/{lib => Lib}/Utils/Try/TrySync.cs | 0 csharp/{lib => Lib}/Utils/Try/TrySync.sync.cs | 0 csharp/{lib => Lib}/Utils/Units.cs | 0 csharp/{lib => Lib}/Utils/Utils.cs | 0 csharp/{lib => Lib}/Utils/Utils.csproj | 2 +- csharp/{lib => Lib}/Utils/Utils.sln | 0 csharp/{lib => Lib}/Utils/ValueTupleUtils.cs | 0 csharp/{lib => Lib}/Victron/VeDBus/Program.cs | 0 csharp/{lib => Lib}/Victron/VeDBus/VeDBus.cs | 0 .../{lib => Lib}/Victron/VeDBus/VeDBus.csproj | 2 +- .../{lib => Lib}/Victron/VeDBus/VeDBusApi.cs | 0 .../Victron/VeDBus/VeDbusService.cs | 0 .../Victron/VeDBus/VeProperties.Dbus.cs | 0 .../Victron/VeDBus/VeProperties.cs | 0 .../{lib => Lib}/Victron/VeDBus/VeProperty.cs | 0 .../{lib => Lib}/Victron/VictronVRM/Detail.cs | 0 .../Victron/VictronVRM/Details.cs | 0 .../{lib => Lib}/Victron/VictronVRM/Device.cs | 0 .../Victron/VictronVRM/FlurlExtensions.cs | 0 .../VictronVRM/Installation.Settings.cs | 0 .../Victron/VictronVRM/Installation.Tags.cs | 0 .../Victron/VictronVRM/Installation.cs | 0 .../{lib => Lib}/Victron/VictronVRM/Reply.cs | 0 .../Victron/VictronVRM/Requests.cs | 0 .../Victron/VictronVRM/Settings.cs | 0 .../Victron/VictronVRM/VictronVRM.csproj | 2 +- .../Victron/VictronVRM/VrmAccount.cs | 0 csharp/{lib => Lib}/WebServer/ContentType.cs | 0 csharp/{lib => Lib}/WebServer/Default.cs | 0 .../{lib => Lib}/WebServer/HttpExtensions.cs | 0 csharp/{lib => Lib}/WebServer/HttpHeader.cs | 0 csharp/{lib => Lib}/WebServer/HttpMethod.cs | 0 csharp/{lib => Lib}/WebServer/HttpRequest.cs | 0 csharp/{lib => Lib}/WebServer/HttpResponse.cs | 0 csharp/{lib => Lib}/WebServer/WebServer.cs | 0 .../{lib => Lib}/WebServer/WebServer.csproj | 4 +- .../Wireformat/WireFormat.csproj.DotSettings | 0 csharp/{lib => Lib}/Wireformat/build_proto.sh | 0 .../{lib => Lib}/Wireformat/package-lock.json | 0 csharp/{lib => Lib}/Wireformat/package.json | 0 .../Wireformat/proto/Payload.proto | 0 .../proto/VictronV1/BatteryStatus48TL.proto | 0 .../Wireformat/proto/VictronV1/Device.proto | 0 .../proto/VictronV1/VictronTopologyV1.proto | 0 csharp/app/Backend/db.sqlite | Bin 290816 -> 0 bytes .../app/EmuMeterDriver/EmuMeterDriver.csproj | 16 ----- csharp/app/SaliMax/SaliMax.csproj | 25 -------- csharp/lib/Channels/Channels.csproj | 9 --- csharp/lib/Time/Time.csproj | 3 - 489 files changed, 115 insertions(+), 114 deletions(-) rename csharp/{app => App}/Backend/Backend.csproj (93%) rename csharp/{app => App}/Backend/Controllers/Controller.cs (100%) rename csharp/{app => App}/Backend/Controllers/Credentials.cs (100%) rename csharp/{app => App}/Backend/Controllers/ReturnsAttribute.cs (100%) rename csharp/{app => App}/Backend/Database/Db.cs (100%) rename csharp/{app => App}/Backend/Database/Fake.cs (100%) rename csharp/{app => App}/Backend/Database/Folder.cs (100%) rename csharp/{app => App}/Backend/Database/Installation.cs (100%) rename csharp/{app => App}/Backend/Database/User.cs (100%) rename csharp/{app => App}/Backend/Database/User2Folder.cs (100%) rename csharp/{app => App}/Backend/Database/User2Installation.cs (100%) rename csharp/{app => App}/Backend/FakeFolders.csv (100%) rename csharp/{app => App}/Backend/FakeInstallations.csv (100%) rename csharp/{app => App}/Backend/FakePasswords.csv (100%) rename csharp/{app => App}/Backend/FakeUsers.csv (100%) rename csharp/{app => App}/Backend/HeaderFilter.cs (100%) rename csharp/{app => App}/Backend/Model/Folder.cs (100%) rename csharp/{app => App}/Backend/Model/Installation.cs (100%) rename csharp/{app => App}/Backend/Model/Relations/Relation.cs (100%) rename csharp/{app => App}/Backend/Model/Relations/Session.cs (100%) rename csharp/{app => App}/Backend/Model/Relations/User2Folder.cs (100%) rename csharp/{app => App}/Backend/Model/Relations/User2Installation.cs (100%) rename csharp/{app => App}/Backend/Model/TreeNode.Equality.cs (100%) rename csharp/{app => App}/Backend/Model/TreeNode.cs (100%) rename csharp/{app => App}/Backend/Model/User.cs (100%) rename csharp/{app => App}/Backend/Program.cs (100%) rename csharp/{app => App}/Backend/Properties/launchSettings.json (100%) rename csharp/{app => App}/Backend/Utils/Crypto.cs (100%) rename csharp/{app => App}/Backend/Utils/Result.cs (100%) create mode 100644 csharp/App/Backend/db.sqlite rename csharp/{app => App}/BmsTunnel/BatteryConnection.cs (100%) rename csharp/{app => App}/BmsTunnel/BmsTunnel.cs (100%) rename csharp/{app => App}/BmsTunnel/BmsTunnel.csproj (68%) rename csharp/{app => App}/BmsTunnel/CliPrograms.cs (100%) rename csharp/{app => App}/BmsTunnel/Program.cs (100%) rename csharp/{app => App}/BmsTunnel/debug.sh (100%) rename csharp/{app => App}/BmsTunnel/parameters.txt (100%) rename csharp/{app => App}/Collector/Collector.csproj (52%) rename csharp/{app => App}/Collector/Collector.sln (100%) rename csharp/{app => App}/Collector/src/BatteryDataParser.cs (100%) rename csharp/{app => App}/Collector/src/BatteryDataParserV4.cs (100%) rename csharp/{app => App}/Collector/src/Influx/FieldAttribute.cs (100%) rename csharp/{app => App}/Collector/src/Influx/InfluxRecord.cs (100%) rename csharp/{app => App}/Collector/src/Influx/LineProtocolSyntax.cs (100%) rename csharp/{app => App}/Collector/src/Influx/TagAttribute.cs (100%) rename csharp/{app => App}/Collector/src/Program.cs (100%) rename csharp/{app => App}/Collector/src/Records/Alarms.cs (100%) rename csharp/{app => App}/Collector/src/Records/BatteryRecord.cs (100%) rename csharp/{app => App}/Collector/src/Records/BatteryStatus.cs (100%) rename csharp/{app => App}/Collector/src/Records/Error.cs (100%) rename csharp/{app => App}/Collector/src/Records/InstallationStatus.cs (100%) rename csharp/{app => App}/Collector/src/Records/IoStatus.cs (100%) rename csharp/{app => App}/Collector/src/Records/Leds.cs (100%) rename csharp/{app => App}/Collector/src/Records/Temperatures.cs (100%) rename csharp/{app => App}/Collector/src/Records/Warnings.cs (100%) rename csharp/{app => App}/Collector/src/Settings.cs (100%) rename csharp/{app => App}/Collector/src/Utils/Extensions.cs (100%) rename csharp/{app => App}/Collector/src/Utils/Log.cs (100%) rename csharp/{app => App}/Collector/src/Utils/Property.cs (100%) rename csharp/{app => App}/Collector/src/Utils/ReadOnlyListExtensions.cs (100%) rename csharp/{app => App}/Collector/src/Utils/Utils.cs (100%) rename csharp/{app => App}/EmuMeterDriver/Config.cs (100%) rename csharp/{app => App}/EmuMeterDriver/EmuMeterDriver.cs (100%) create mode 100644 csharp/App/EmuMeterDriver/EmuMeterDriver.csproj rename csharp/{app => App}/EmuMeterDriver/Nic.cs (100%) rename csharp/{app => App}/EmuMeterDriver/Program.cs (100%) rename csharp/{app => App}/EmuMeterDriver/Signal.cs (100%) rename csharp/{app => App}/EmuMeterDriver/Utils.cs (100%) rename csharp/{app => App}/EmuMeterDriver/debug.sh (100%) rename csharp/{app => App}/EmuMeterDriver/service/log/run (100%) rename csharp/{app => App}/EmuMeterDriver/service/run (100%) rename csharp/{app/InnovEnergy.app.props => App/InnovEnergy.App.props} (100%) rename csharp/{app => App}/OpenVpnCertificatesServer/Files.cs (100%) rename csharp/{app => App}/OpenVpnCertificatesServer/Http.cs (100%) rename csharp/{app => App}/OpenVpnCertificatesServer/OpenVpnCertificatesServer.csproj (58%) rename csharp/{app => App}/OpenVpnCertificatesServer/OpenVpnCertificatesServer.sln (100%) rename csharp/{app => App}/OpenVpnCertificatesServer/PKI/CertificateAuthority.cs (100%) rename csharp/{app => App}/OpenVpnCertificatesServer/PKI/Pem.cs (100%) rename csharp/{app => App}/OpenVpnCertificatesServer/PKI/PwdFinder.cs (100%) rename csharp/{app => App}/OpenVpnCertificatesServer/Program.cs (100%) rename csharp/{app => App}/OpenVpnCertificatesServer/Utils.cs (100%) rename csharp/{app => App}/RemoteSupportConsole/Login.cs (100%) rename csharp/{app => App}/RemoteSupportConsole/ObservablePipeSource.cs (100%) rename csharp/{app => App}/RemoteSupportConsole/Program.cs (100%) rename csharp/{app => App}/RemoteSupportConsole/RemoteSupportConsole.csproj (67%) rename csharp/{app => App}/RemoteSupportConsole/RemoteSupportConsole.csproj.DotSettings (100%) rename csharp/{app => App}/RemoteSupportConsole/Ssh.cs (100%) rename csharp/{app => App}/RemoteSupportConsole/VpnConnection.cs (100%) rename csharp/{app => App}/RemoteSupportConsole/VpnInfo.cs (100%) rename csharp/{app => App}/RemoteSupportConsole/VrmConnection.cs (100%) rename csharp/{app => App}/RemoteSupportConsole/VrmInfo.cs (100%) rename csharp/{app => App}/RemoteSupportConsole/VrmProxy.cs (100%) create mode 100644 csharp/App/SaliMax/SaliMax.csproj rename csharp/{app => App}/SaliMax/run (BeagleBone Meiringen).sh (100%) rename csharp/{app => App}/SaliMax/src/AsciiArt.cs (100%) rename csharp/{app => App}/SaliMax/src/BusPort.cs (100%) rename csharp/{app => App}/SaliMax/src/Controller/AvgBatteriesStatus.cs (100%) rename csharp/{app => App}/SaliMax/src/Controller/Control.cs (100%) rename csharp/{app => App}/SaliMax/src/Controller/ControlRecord.cs (100%) rename csharp/{app => App}/SaliMax/src/Controller/ControlTarget.cs (100%) rename csharp/{app => App}/SaliMax/src/Controller/Controller.cs (100%) rename csharp/{app => App}/SaliMax/src/Controller/SaliMaxState.cs (100%) rename csharp/{app => App}/SaliMax/src/Controller/State.cs (100%) rename csharp/{app => App}/SaliMax/src/Controller/StateConfig.cs (100%) rename csharp/{app => App}/SaliMax/src/Controller/StatusRecord.cs (100%) rename csharp/{app => App}/SaliMax/src/Log/Ampt.cs (100%) rename csharp/{app => App}/SaliMax/src/Log/Battery48Tl.cs (100%) rename csharp/{app => App}/SaliMax/src/Log/EmuMeter.cs (100%) rename csharp/{app => App}/SaliMax/src/Log/JsonUtil.cs (100%) rename csharp/{app => App}/SaliMax/src/Log/Salimax.cs (100%) rename csharp/{app => App}/SaliMax/src/Log/TruConvertAc.cs (100%) rename csharp/{app => App}/SaliMax/src/Log/TruConvertDc.cs (100%) rename csharp/{app => App}/SaliMax/src/Program.cs (100%) rename csharp/{app => App}/SaliMax/src/S3Config.cs (100%) rename csharp/{app => App}/SaliMax/src/SaliMaxRelays/RelayMapBoolean.cs (100%) rename csharp/{app => App}/SaliMax/src/SaliMaxRelays/SaliMaxRelaysDevice.cs (100%) rename csharp/{app => App}/SaliMax/src/SaliMaxRelays/SaliMaxRelaysStatus.cs (100%) rename csharp/{app => App}/SaliMax/src/SystemConfig/Config.cs (100%) rename csharp/{app => App}/SaliMax/src/SystemConfig/Defaults.cs (100%) rename csharp/{app => App}/SaliMax/src/SystemConfig/SalimaxConfig.cs (100%) rename csharp/{app => App}/SaliMax/src/Topology.cs (100%) rename csharp/{app => App}/SaliMax/src/Utils.cs (100%) rename csharp/{app => App}/SaliMax/tunnels.html (100%) rename csharp/{app => App}/SaliMax/tunnels.sh (100%) create mode 100644 csharp/Lib/Channels/Channels.csproj rename csharp/{lib => Lib}/Channels/CloseAfter.cs (100%) rename csharp/{lib => Lib}/Channels/Connection.cs (100%) rename csharp/{lib => Lib}/Channels/Framed/Channel.cs (100%) rename csharp/{lib => Lib}/Channels/Stages/Channel.cs (100%) rename csharp/{lib => Lib}/Channels/Stages/ConnectedChannel.cs (100%) rename csharp/{lib => Lib}/Channels/Stages/Stage.cs (100%) rename csharp/{lib => Lib}/Channels/V2/Bak/Connections/Connection.cs (100%) rename csharp/{lib => Lib}/Channels/V2/Bak/Connections/Connections.cs (100%) rename csharp/{lib => Lib}/Channels/V2/Bak/Connections/Extensions.cs (100%) rename csharp/{lib => Lib}/Channels/V2/Bak/Connections/IConnection.cs (100%) rename csharp/{lib => Lib}/Channels/V2/Bak/GenericChannel.cs (100%) rename csharp/{lib => Lib}/Channels/V2/Bak/StreamChannel.cs (100%) rename csharp/{lib => Lib}/Channels/V2/CommandChannel.cs (100%) rename csharp/{lib => Lib}/Channels/V2/IChannel.cs (100%) rename csharp/{lib => Lib}/Channels/V2/Pipes/AsyncPipeSource.cs (100%) rename csharp/{lib => Lib}/Channels/V2/Pipes/AsyncPipeTarget.cs (100%) rename csharp/{lib => Lib}/Channels/V2/Pipes/ChannelPipeSource.cs (100%) rename csharp/{lib => Lib}/Channels/V2/Pipes/ChannelPipeTarget.cs (100%) rename csharp/{lib => Lib}/Channels/V2/Stage.cs (100%) rename csharp/{lib => Lib}/Channels/V2/StreamChannel.cs (100%) rename csharp/{lib => Lib}/Channels/V2/TcpChannel.cs (100%) rename csharp/{lib => Lib}/Devices/AMPT/Ampt.csproj (88%) rename csharp/{lib => Lib}/Devices/AMPT/AmptCommunicationUnit.cs (100%) rename csharp/{lib => Lib}/Devices/AMPT/AmptDeviceStatus.cs (100%) rename csharp/{lib => Lib}/Devices/AMPT/AmptStatus.cs (100%) rename csharp/{lib => Lib}/Devices/AMPT/AmptStringStatus.cs (100%) rename csharp/{lib => Lib}/Devices/Adam6060/Adam6060.csproj (75%) rename csharp/{lib => Lib}/Devices/Adam6060/Adam6060Control.cs (100%) rename csharp/{lib => Lib}/Devices/Adam6060/Adam6060Device.cs (100%) rename csharp/{lib => Lib}/Devices/Adam6060/Adam6060Status.cs (100%) rename csharp/{lib => Lib}/Devices/Battery48TL/Battery48TL.csproj (84%) rename csharp/{lib => Lib}/Devices/Battery48TL/Battery48TLDevice.cs (100%) rename csharp/{lib => Lib}/Devices/Battery48TL/Battery48TLStatusRecord.cs (100%) rename csharp/{lib => Lib}/Devices/Battery48TL/BatteryDataParser.cs (100%) rename csharp/{lib => Lib}/Devices/Battery48TL/Constants.cs (100%) rename csharp/{lib => Lib}/Devices/Battery48TL/LedColor.cs (100%) rename csharp/{lib => Lib}/Devices/Battery48TL/LedState.cs (100%) rename csharp/{lib => Lib}/Devices/EmuMeter/Conversions.cs (100%) rename csharp/{lib => Lib}/Devices/EmuMeter/EmuMeter.csproj (84%) rename csharp/{lib => Lib}/Devices/EmuMeter/EmuMeterDevice.cs (100%) rename csharp/{lib => Lib}/Devices/EmuMeter/EmuMeterStatus.cs (100%) rename csharp/{lib => Lib}/Devices/Trumpf/TruConvert/AlarmState.cs (100%) rename csharp/{lib => Lib}/Devices/Trumpf/TruConvert/MainState.cs (100%) rename csharp/{lib => Lib}/Devices/Trumpf/TruConvert/Slave.cs (100%) rename csharp/{lib => Lib}/Devices/Trumpf/TruConvert/SystemConfig.cs (100%) rename csharp/{lib => Lib}/Devices/Trumpf/TruConvert/TruConvert.csproj (72%) rename csharp/{lib => Lib}/Devices/Trumpf/TruConvert/Utils.cs (100%) rename csharp/{lib => Lib}/Devices/Trumpf/TruConvertAc/AcControlRegisters.cs (100%) rename csharp/{lib => Lib}/Devices/Trumpf/TruConvertAc/AcEnums.cs (100%) rename csharp/{lib => Lib}/Devices/Trumpf/TruConvertAc/AlarmMessage.cs (100%) rename csharp/{lib => Lib}/Devices/Trumpf/TruConvertAc/TruConvertAc.csproj (84%) rename csharp/{lib => Lib}/Devices/Trumpf/TruConvertAc/TruConvertAcControl.cs (100%) rename csharp/{lib => Lib}/Devices/Trumpf/TruConvertAc/TruConvertAcDevice.cs (100%) rename csharp/{lib => Lib}/Devices/Trumpf/TruConvertAc/TruConvertAcStatus.cs (100%) rename csharp/{lib => Lib}/Devices/Trumpf/TruConvertAc/WarningMessage.cs (100%) rename csharp/{lib => Lib}/Devices/Trumpf/TruConvertDc/AlarmMessage.cs (100%) rename csharp/{lib => Lib}/Devices/Trumpf/TruConvertDc/DcControlRegisters.cs (100%) rename csharp/{lib => Lib}/Devices/Trumpf/TruConvertDc/DcEnums.cs (100%) rename csharp/{lib => Lib}/Devices/Trumpf/TruConvertDc/TruConvertDc.csproj (84%) rename csharp/{lib => Lib}/Devices/Trumpf/TruConvertDc/TruConvertDcControl.cs (100%) rename csharp/{lib => Lib}/Devices/Trumpf/TruConvertDc/TruConvertDcDevice.cs (100%) rename csharp/{lib => Lib}/Devices/Trumpf/TruConvertDc/TruConvertDcStatus.cs (100%) rename csharp/{lib => Lib}/Devices/Trumpf/TruConvertDc/WarningMessage.cs (100%) rename csharp/{lib/InnovEnergy.lib.props => Lib/InnovEnergy.Lib.props} (100%) rename csharp/{lib => Lib}/Protocols/DBus/Bus.cs (100%) rename csharp/{lib => Lib}/Protocols/DBus/DBus.csproj (89%) rename csharp/{lib => Lib}/Protocols/DBus/DBusConnection.cs (100%) rename csharp/{lib => Lib}/Protocols/DBus/DBusMessageStream.cs (100%) rename csharp/{lib => Lib}/Protocols/DBus/DBusService.cs (100%) rename csharp/{lib => Lib}/Protocols/DBus/Daemon/DBusDaemonApi.cs (100%) rename csharp/{lib => Lib}/Protocols/DBus/Daemon/DBusDaemonConnection.Resolver.cs (100%) rename csharp/{lib => Lib}/Protocols/DBus/Daemon/DBusDaemonConnection.cs (100%) rename csharp/{lib => Lib}/Protocols/DBus/Daemon/MatchRule.cs (100%) rename csharp/{lib => Lib}/Protocols/DBus/Daemon/ObservableDictionary.cs (100%) rename csharp/{lib => Lib}/Protocols/DBus/Daemon/ReleaseNameReply.cs (100%) rename csharp/{lib => Lib}/Protocols/DBus/Daemon/RequestNameOptions.cs (100%) rename csharp/{lib => Lib}/Protocols/DBus/Daemon/RequestNameReply.cs (100%) rename csharp/{lib => Lib}/Protocols/DBus/Env.cs (100%) rename csharp/{lib => Lib}/Protocols/DBus/Interop.cs (100%) rename csharp/{lib => Lib}/Protocols/DBus/Protocol/DataTypes/Convert/StringToSignature.cs (100%) rename csharp/{lib => Lib}/Protocols/DBus/Protocol/DataTypes/Convert/TypeToSignature.cs (100%) rename csharp/{lib => Lib}/Protocols/DBus/Protocol/DataTypes/ObjectPath.cs (100%) rename csharp/{lib => Lib}/Protocols/DBus/Protocol/DataTypes/Signatures/Signature.Equality.cs (100%) rename csharp/{lib => Lib}/Protocols/DBus/Protocol/DataTypes/Signatures/Signature.Terminals.cs (100%) rename csharp/{lib => Lib}/Protocols/DBus/Protocol/DataTypes/Signatures/Signature.cs (100%) rename csharp/{lib => Lib}/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/ArraySignature.cs (100%) rename csharp/{lib => Lib}/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/BasicTypeSignature.cs (100%) rename csharp/{lib => Lib}/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/BooleanSignature.cs (100%) rename csharp/{lib => Lib}/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/ByteSignature.cs (100%) rename csharp/{lib => Lib}/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/CompositeSignature.cs (100%) rename csharp/{lib => Lib}/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/ContainerTypeSignature.cs (100%) rename csharp/{lib => Lib}/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/DictionarySignature.cs (100%) rename csharp/{lib => Lib}/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/DoubleSignature.cs (100%) rename csharp/{lib => Lib}/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/EmptySignature.cs (100%) rename csharp/{lib => Lib}/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/FixedTypeSignature.cs (100%) rename csharp/{lib => Lib}/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/Int16Signature.cs (100%) rename csharp/{lib => Lib}/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/Int32Signature.cs (100%) rename csharp/{lib => Lib}/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/Int64Signature.cs (100%) rename csharp/{lib => Lib}/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/ObjectPathSignature.cs (100%) rename csharp/{lib => Lib}/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/SignatureTypeSignature.cs (100%) rename csharp/{lib => Lib}/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/StringLikeTypeSignature.cs (100%) rename csharp/{lib => Lib}/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/StringSignature.cs (100%) rename csharp/{lib => Lib}/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/StructSignature.cs (100%) rename csharp/{lib => Lib}/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/UInt16Signature.cs (100%) rename csharp/{lib => Lib}/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/UInt32Signature.cs (100%) rename csharp/{lib => Lib}/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/UInt64Signature.cs (100%) rename csharp/{lib => Lib}/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/VariantSignature.cs (100%) rename csharp/{lib => Lib}/Protocols/DBus/Protocol/DataTypes/Variant.cs (100%) rename csharp/{lib => Lib}/Protocols/DBus/Protocol/Header/Endian.cs (100%) rename csharp/{lib => Lib}/Protocols/DBus/Protocol/Header/FieldCode.cs (100%) rename csharp/{lib => Lib}/Protocols/DBus/Protocol/Header/HeaderExtensions.cs (100%) rename csharp/{lib => Lib}/Protocols/DBus/Protocol/Header/HeaderFlags.cs (100%) rename csharp/{lib => Lib}/Protocols/DBus/Protocol/Header/MessageType.cs (100%) rename csharp/{lib => Lib}/Protocols/DBus/Protocol/Message.cs (100%) rename csharp/{lib => Lib}/Protocols/DBus/Protocol/Replies.cs (100%) rename csharp/{lib => Lib}/Protocols/DBus/Protocol/SerialSource.cs (100%) rename csharp/{lib => Lib}/Protocols/DBus/Transport/AuthenticationMethod.cs (100%) rename csharp/{lib => Lib}/Protocols/DBus/Transport/BufferedSocketReader.cs (100%) rename csharp/{lib => Lib}/Protocols/DBus/Transport/DBusBufferReader.cs (100%) rename csharp/{lib => Lib}/Protocols/DBus/Transport/DBusBufferWriter.cs (100%) rename csharp/{lib => Lib}/Protocols/DBus/Transport/DBusSocket.cs (100%) rename csharp/{lib => Lib}/Protocols/DBus/Utils/DisposableStack.cs (100%) rename csharp/{lib => Lib}/Protocols/DBus/Utils/Extensions.cs (100%) rename csharp/{lib => Lib}/Protocols/DBus/Utils/HexView.cs (100%) rename csharp/{lib => Lib}/Protocols/DBus/WireFormat/DBusMeasureWriter.cs (100%) rename csharp/{lib => Lib}/Protocols/DBus/WireFormat/DBusReader.cs (100%) rename csharp/{lib => Lib}/Protocols/DBus/WireFormat/DBusSocketReader.cs (100%) rename csharp/{lib => Lib}/Protocols/DBus/WireFormat/DBusWriter.cs (100%) rename csharp/{lib => Lib}/Protocols/Modbus/Clients/ModbusClient.cs (100%) rename csharp/{lib => Lib}/Protocols/Modbus/Clients/ModbusRtuClient.cs (100%) rename csharp/{lib => Lib}/Protocols/Modbus/Clients/ModbusTcpClient.cs (100%) rename csharp/{lib => Lib}/Protocols/Modbus/Connections/ModbusConnection.cs (100%) rename csharp/{lib => Lib}/Protocols/Modbus/Connections/ModbusSerialConnection.cs (100%) rename csharp/{lib => Lib}/Protocols/Modbus/Connections/ModbusTcpConnection.cs (100%) rename csharp/{lib => Lib}/Protocols/Modbus/Conversions/Endianness.cs (100%) rename csharp/{lib => Lib}/Protocols/Modbus/Conversions/ModbusRegisters.Bit.cs (100%) rename csharp/{lib => Lib}/Protocols/Modbus/Conversions/ModbusRegisters.Boolean.cs (100%) rename csharp/{lib => Lib}/Protocols/Modbus/Conversions/ModbusRegisters.Bytes.cs (100%) rename csharp/{lib => Lib}/Protocols/Modbus/Conversions/ModbusRegisters.Int16.cs (100%) rename csharp/{lib => Lib}/Protocols/Modbus/Conversions/ModbusRegisters.Int32.cs (100%) rename csharp/{lib => Lib}/Protocols/Modbus/Conversions/ModbusRegisters.Single.cs (100%) rename csharp/{lib => Lib}/Protocols/Modbus/Conversions/ModbusRegisters.String.cs (100%) rename csharp/{lib => Lib}/Protocols/Modbus/Conversions/ModbusRegisters.UInt16.cs (100%) rename csharp/{lib => Lib}/Protocols/Modbus/Conversions/ModbusRegisters.UInt32.cs (100%) rename csharp/{lib => Lib}/Protocols/Modbus/Conversions/ModbusRegisters.cs (100%) rename csharp/{lib => Lib}/Protocols/Modbus/Modbus.csproj (82%) rename csharp/{lib => Lib}/Protocols/Modbus/Protocol/ExceptionCode.cs (100%) rename csharp/{lib => Lib}/Protocols/Modbus/Protocol/Exceptions.cs (100%) rename csharp/{lib => Lib}/Protocols/Modbus/Protocol/Frames/Accessors/Accessors.cs (100%) rename csharp/{lib => Lib}/Protocols/Modbus/Protocol/Frames/Accessors/MbAddress.cs (100%) rename csharp/{lib => Lib}/Protocols/Modbus/Protocol/Frames/Accessors/MbBits.cs (100%) rename csharp/{lib => Lib}/Protocols/Modbus/Protocol/Frames/Accessors/MbByte.cs (100%) rename csharp/{lib => Lib}/Protocols/Modbus/Protocol/Frames/Accessors/MbByte{T}.cs (100%) rename csharp/{lib => Lib}/Protocols/Modbus/Protocol/Frames/Accessors/MbWord.cs (100%) rename csharp/{lib => Lib}/Protocols/Modbus/Protocol/Frames/Accessors/MbWords.cs (100%) rename csharp/{lib => Lib}/Protocols/Modbus/Protocol/Frames/Commands/ReadDiscreteInputsCommandFrame.cs (100%) rename csharp/{lib => Lib}/Protocols/Modbus/Protocol/Frames/Commands/ReadHoldingRegistersCommandFrame.cs (100%) rename csharp/{lib => Lib}/Protocols/Modbus/Protocol/Frames/Commands/ReadInputRegistersCommandFrame.cs (100%) rename csharp/{lib => Lib}/Protocols/Modbus/Protocol/Frames/Commands/ReadWriteRegistersCommandFrame.cs (100%) rename csharp/{lib => Lib}/Protocols/Modbus/Protocol/Frames/Commands/WriteCoilsCommandFrame.cs (100%) rename csharp/{lib => Lib}/Protocols/Modbus/Protocol/Frames/Commands/WriteRegistersCommandFrame.cs (100%) rename csharp/{lib => Lib}/Protocols/Modbus/Protocol/Frames/Constants.cs (100%) rename csharp/{lib => Lib}/Protocols/Modbus/Protocol/Frames/ModbusFrame.cs (100%) rename csharp/{lib => Lib}/Protocols/Modbus/Protocol/Frames/Replies/ErrorResponseFrame.cs (100%) rename csharp/{lib => Lib}/Protocols/Modbus/Protocol/Frames/Replies/ReadDiscreteInputResponseFrame.cs (100%) rename csharp/{lib => Lib}/Protocols/Modbus/Protocol/Frames/Replies/ReadHoldingRegistersResponseFrame.cs (100%) rename csharp/{lib => Lib}/Protocols/Modbus/Protocol/Frames/Replies/ReadInputRegistersResponseFrame.cs (100%) rename csharp/{lib => Lib}/Protocols/Modbus/Protocol/Frames/Replies/ReadWriteRegistersCommandFrame.cs (100%) rename csharp/{lib => Lib}/Protocols/Modbus/Protocol/Frames/Replies/WriteCoilsResponseFrame.cs (100%) rename csharp/{lib => Lib}/Protocols/Modbus/Protocol/Frames/Replies/WriteRegistersResponseFrame.cs (100%) rename csharp/{lib => Lib}/Protocols/Modbus/Protocol/FunctionCode.cs (100%) rename csharp/{lib => Lib}/Protocols/Modbus/Tcp/MbapHeader.cs (100%) rename csharp/{lib => Lib}/Protocols/Modbus/Tcp/ModbusTcpFrame.cs (100%) rename csharp/{lib => Lib}/Protocols/Modbus/Util/ArraySegmentExtensions.cs (100%) rename csharp/{lib => Lib}/S3/DataRec.cs (100%) rename csharp/{lib => Lib}/S3/Drivers/Internal/Delegates/ReadRecord.cs (100%) rename csharp/{lib => Lib}/S3/Drivers/Internal/Delegates/WriteRecord.cs (100%) rename csharp/{lib => Lib}/S3/Drivers/Internal/Reader.cs (100%) rename csharp/{lib => Lib}/S3/Drivers/Internal/Reader.public.cs (100%) rename csharp/{lib => Lib}/S3/Drivers/Internal/Util/Aggregator.cs (100%) rename csharp/{lib => Lib}/S3/Drivers/Internal/Util/Sampler.cs (100%) rename csharp/{lib => Lib}/S3/Drivers/Internal/Writer.cs (100%) rename csharp/{lib => Lib}/S3/Drivers/Internal/Writer.public.cs (100%) rename csharp/{lib => Lib}/S3/Drivers/MemoryDriver.cs (100%) rename csharp/{lib => Lib}/S3/Drivers/S3Config.cs (100%) rename csharp/{lib => Lib}/S3/Drivers/S3Driver.cs (100%) rename csharp/{lib => Lib}/S3/Metadata/AggregationLevel.cs (100%) rename csharp/{lib => Lib}/S3/Metadata/FieldType.cs (100%) rename csharp/{lib => Lib}/S3/Program.cs (100%) rename csharp/{lib => Lib}/S3/Records/Fields/Field.cs (100%) rename csharp/{lib => Lib}/S3/Records/Fields/NumberField.cs (100%) rename csharp/{lib => Lib}/S3/Records/Fields/TextField.cs (100%) rename csharp/{lib => Lib}/S3/Records/Fields/TextFrequency.cs (100%) rename csharp/{lib => Lib}/S3/Records/Fields/UnitAttribute.cs (100%) rename csharp/{lib => Lib}/S3/Records/Fields/WithUnit.cs (100%) rename csharp/{lib => Lib}/S3/Records/Operations/Aggregation.cs (100%) rename csharp/{lib => Lib}/S3/Records/Operations/Conversion.cs (100%) rename csharp/{lib => Lib}/S3/Records/Record.cs (100%) rename csharp/{lib => Lib}/S3/Records/Serialization/FieldTag.cs (100%) rename csharp/{lib => Lib}/S3/Records/Serialization/Parser.cs (100%) rename csharp/{lib => Lib}/S3/Records/Serialization/Serializer.cs (100%) rename csharp/{lib => Lib}/S3/Records/Specialized/AggregatedRecord.cs (100%) rename csharp/{lib => Lib}/S3/Records/Specialized/TimeStampedRecord.cs (100%) rename csharp/{lib => Lib}/S3/S3.csproj (60%) rename csharp/{lib => Lib}/S3/Serialization/JsonConverters.cs (100%) rename csharp/{lib => Lib}/StatusApi/Connections/DcConnection.cs (100%) rename csharp/{lib => Lib}/StatusApi/Connections/SinglePhaseAcConnection.cs (100%) rename csharp/{lib => Lib}/StatusApi/Connections/ThreePhaseAcConnection.cs (100%) rename csharp/{lib => Lib}/StatusApi/DeviceType.cs (100%) rename csharp/{lib => Lib}/StatusApi/Devices/Battery.cs (100%) rename csharp/{lib => Lib}/StatusApi/Devices/DcDcConverter.cs (100%) rename csharp/{lib => Lib}/StatusApi/Devices/DcDevice.cs (100%) rename csharp/{lib => Lib}/StatusApi/Devices/Device.cs (100%) rename csharp/{lib => Lib}/StatusApi/Devices/GridMeter.cs (100%) rename csharp/{lib => Lib}/StatusApi/Devices/IPvCoupledDevice.cs (100%) rename csharp/{lib => Lib}/StatusApi/Devices/Mppt.cs (100%) rename csharp/{lib => Lib}/StatusApi/Devices/SinglePhaseAcDevice.cs (100%) rename csharp/{lib => Lib}/StatusApi/Devices/SinglePhaseInverter.cs (100%) rename csharp/{lib => Lib}/StatusApi/Devices/SinglePhasePvInverter.cs (100%) rename csharp/{lib => Lib}/StatusApi/Devices/ThreePhaseAcDevice.cs (100%) rename csharp/{lib => Lib}/StatusApi/Devices/ThreePhaseInverter.cs (100%) rename csharp/{lib => Lib}/StatusApi/Devices/ThreePhasePvInverter.cs (100%) rename csharp/{lib => Lib}/StatusApi/Phases/AcPhase.cs (100%) rename csharp/{lib => Lib}/StatusApi/Phases/Phase.cs (100%) rename csharp/{lib => Lib}/StatusApi/StatusApi.csproj (75%) rename csharp/{lib => Lib}/StatusApi/Utils.cs (100%) rename csharp/{lib => Lib}/StatusData/Current.cs (100%) rename csharp/{lib => Lib}/StatusData/Json/Converters.cs (100%) rename csharp/{lib => Lib}/StatusData/Json/CurrentConverter.cs (100%) rename csharp/{lib => Lib}/StatusData/Json/PowerConverter.cs (100%) rename csharp/{lib => Lib}/StatusData/Json/ResistanceConverter.cs (100%) rename csharp/{lib => Lib}/StatusData/Json/VoltageConverter.cs (100%) rename csharp/{lib => Lib}/StatusData/Power.cs (100%) rename csharp/{lib => Lib}/StatusData/Resistance.cs (100%) rename csharp/{lib => Lib}/StatusData/State.cs (100%) rename csharp/{lib => Lib}/StatusData/StatusData.csproj (77%) rename csharp/{lib => Lib}/StatusData/Units.cs (100%) rename csharp/{lib => Lib}/StatusData/Voltage.cs (100%) rename csharp/{lib => Lib}/SysTools/Edges/RemoteCommandToProcess.cs (100%) rename csharp/{lib => Lib}/SysTools/Edges/RemotePathToRemoteCommand.cs (100%) rename csharp/{lib => Lib}/SysTools/Edges/SshHostToRemoteCommand.cs (100%) rename csharp/{lib => Lib}/SysTools/Edges/SshHostToRemotePath.cs (100%) rename csharp/{lib => Lib}/SysTools/Edges/StringToCommand.cs (100%) rename csharp/{lib => Lib}/SysTools/Edges/StringToProcess.cs (100%) rename csharp/{lib => Lib}/SysTools/Edges/StringToRemotePath.cs (100%) rename csharp/{lib => Lib}/SysTools/Edges/StringToSysPath.cs (100%) rename csharp/{lib => Lib}/SysTools/Edges/SysCommandToProcess.cs (100%) rename csharp/{lib => Lib}/SysTools/Edges/SysCommandToRemoteCommand.cs (100%) rename csharp/{lib => Lib}/SysTools/Edges/SysPathToProcess.cs (100%) rename csharp/{lib => Lib}/SysTools/Edges/SysPathToRemotePath.cs (100%) rename csharp/{lib => Lib}/SysTools/Edges/SysPathToSysCommand.cs (100%) rename csharp/{lib => Lib}/SysTools/FileIo.cs (100%) rename csharp/{lib => Lib}/SysTools/Process/AsyncProcess.cs (100%) rename csharp/{lib => Lib}/SysTools/Process/ProcessResult.cs (100%) rename csharp/{lib => Lib}/SysTools/Process/SyncProcess.cs (100%) rename csharp/{lib => Lib}/SysTools/Remote/RemoteCommand.cs (100%) rename csharp/{lib => Lib}/SysTools/Remote/RemoteFileIo.cs (100%) rename csharp/{lib => Lib}/SysTools/Remote/RemotePath.cs (100%) rename csharp/{lib => Lib}/SysTools/Remote/SshHost.cs (100%) rename csharp/{lib => Lib}/SysTools/SysCommand.cs (100%) rename csharp/{lib => Lib}/SysTools/SysDirs.cs (100%) rename csharp/{lib => Lib}/SysTools/SysPath.cs (100%) rename csharp/{lib => Lib}/SysTools/SysTools.csproj (75%) rename csharp/{lib => Lib}/SysTools/Utils/ConsoleUtils.cs (100%) rename csharp/{lib => Lib}/SysTools/Utils/EnumerableUtils.cs (100%) rename csharp/{lib => Lib}/SysTools/Utils/StringUtils.cs (100%) rename csharp/{lib => Lib}/SysTools/Utils/Utils.cs (100%) create mode 100644 csharp/Lib/Time/Time.csproj rename csharp/{lib => Lib}/Time/Unix/UnixTime.Compare.cs (100%) rename csharp/{lib => Lib}/Time/Unix/UnixTime.Constructors.cs (100%) rename csharp/{lib => Lib}/Time/Unix/UnixTime.Converters.cs (100%) rename csharp/{lib => Lib}/Time/Unix/UnixTime.Operators.cs (100%) rename csharp/{lib => Lib}/Time/Unix/UnixTime.Overrides.cs (100%) rename csharp/{lib => Lib}/Time/Unix/UnixTime.cs (100%) rename csharp/{lib => Lib}/Time/Unix/UnixTimeDelta.Compare.cs (100%) rename csharp/{lib => Lib}/Time/Unix/UnixTimeDelta.Constructors.cs (100%) rename csharp/{lib => Lib}/Time/Unix/UnixTimeDelta.Operators.cs (100%) rename csharp/{lib => Lib}/Time/Unix/UnixTimeDelta.Overrides.cs (100%) rename csharp/{lib => Lib}/Time/Unix/UnixTimeDeltaExtensions.cs (100%) rename csharp/{lib => Lib}/Time/Unix/UnixTimeSpan.cs (100%) rename csharp/{lib => Lib}/Utils/ArrayExtensions.cs (100%) rename csharp/{lib => Lib}/Utils/AsyncDelegates.cs (100%) rename csharp/{lib => Lib}/Utils/AsyncEnumerableEx.cs (100%) rename csharp/{lib => Lib}/Utils/AutoComplete.cs (100%) rename csharp/{lib => Lib}/Utils/CliCommandUtils.cs (100%) rename csharp/{lib => Lib}/Utils/ConsoleUtils.cs (100%) rename csharp/{lib => Lib}/Utils/DecimalUtils.cs (100%) rename csharp/{lib => Lib}/Utils/DictObservables.cs (100%) rename csharp/{lib => Lib}/Utils/Disposable.cs (100%) rename csharp/{lib => Lib}/Utils/EnumerableUtils.cs (100%) rename csharp/{lib => Lib}/Utils/ExceptionHandling.cs (100%) rename csharp/{lib => Lib}/Utils/FileSystem.cs (100%) rename csharp/{lib => Lib}/Utils/JsonNodeAccessors.cs (100%) rename csharp/{lib => Lib}/Utils/Maybe.cs (100%) rename csharp/{lib => Lib}/Utils/Net/NetUtils.cs (100%) rename csharp/{lib => Lib}/Utils/Net/PingExtensions.cs (100%) rename csharp/{lib => Lib}/Utils/Net/UdpExtensions.cs (100%) rename csharp/{lib => Lib}/Utils/None.cs (100%) rename csharp/{lib => Lib}/Utils/NullableUtils.cs (100%) rename csharp/{lib => Lib}/Utils/ObservableExceptionHandling.cs (100%) rename csharp/{lib => Lib}/Utils/ObservableUtils.cs (100%) rename csharp/{lib => Lib}/Utils/PointFree.cs (100%) rename csharp/{lib => Lib}/Utils/SshHost.cs (100%) rename csharp/{lib => Lib}/Utils/StreamExtensions.cs (100%) rename csharp/{lib => Lib}/Utils/StringUtils.cs (100%) rename csharp/{lib => Lib}/Utils/TaskUtils.cs (100%) rename csharp/{lib => Lib}/Utils/TextBlock.cs (100%) rename csharp/{lib => Lib}/Utils/Try/Operators.async.cs (100%) rename csharp/{lib => Lib}/Utils/Try/Operators.sync.cs (100%) rename csharp/{lib => Lib}/Utils/Try/Policy.cs (100%) rename csharp/{lib => Lib}/Utils/Try/TryAsync.async.cs (100%) rename csharp/{lib => Lib}/Utils/Try/TryAsync.cs (100%) rename csharp/{lib => Lib}/Utils/Try/TryAsync.sync.cs (100%) rename csharp/{lib => Lib}/Utils/Try/TrySync.async.cs (100%) rename csharp/{lib => Lib}/Utils/Try/TrySync.cs (100%) rename csharp/{lib => Lib}/Utils/Try/TrySync.sync.cs (100%) rename csharp/{lib => Lib}/Utils/Units.cs (100%) rename csharp/{lib => Lib}/Utils/Utils.cs (100%) rename csharp/{lib => Lib}/Utils/Utils.csproj (87%) rename csharp/{lib => Lib}/Utils/Utils.sln (100%) rename csharp/{lib => Lib}/Utils/ValueTupleUtils.cs (100%) rename csharp/{lib => Lib}/Victron/VeDBus/Program.cs (100%) rename csharp/{lib => Lib}/Victron/VeDBus/VeDBus.cs (100%) rename csharp/{lib => Lib}/Victron/VeDBus/VeDBus.csproj (88%) rename csharp/{lib => Lib}/Victron/VeDBus/VeDBusApi.cs (100%) rename csharp/{lib => Lib}/Victron/VeDBus/VeDbusService.cs (100%) rename csharp/{lib => Lib}/Victron/VeDBus/VeProperties.Dbus.cs (100%) rename csharp/{lib => Lib}/Victron/VeDBus/VeProperties.cs (100%) rename csharp/{lib => Lib}/Victron/VeDBus/VeProperty.cs (100%) rename csharp/{lib => Lib}/Victron/VictronVRM/Detail.cs (100%) rename csharp/{lib => Lib}/Victron/VictronVRM/Details.cs (100%) rename csharp/{lib => Lib}/Victron/VictronVRM/Device.cs (100%) rename csharp/{lib => Lib}/Victron/VictronVRM/FlurlExtensions.cs (100%) rename csharp/{lib => Lib}/Victron/VictronVRM/Installation.Settings.cs (100%) rename csharp/{lib => Lib}/Victron/VictronVRM/Installation.Tags.cs (100%) rename csharp/{lib => Lib}/Victron/VictronVRM/Installation.cs (100%) rename csharp/{lib => Lib}/Victron/VictronVRM/Reply.cs (100%) rename csharp/{lib => Lib}/Victron/VictronVRM/Requests.cs (100%) rename csharp/{lib => Lib}/Victron/VictronVRM/Settings.cs (100%) rename csharp/{lib => Lib}/Victron/VictronVRM/VictronVRM.csproj (92%) rename csharp/{lib => Lib}/Victron/VictronVRM/VrmAccount.cs (100%) rename csharp/{lib => Lib}/WebServer/ContentType.cs (100%) rename csharp/{lib => Lib}/WebServer/Default.cs (100%) rename csharp/{lib => Lib}/WebServer/HttpExtensions.cs (100%) rename csharp/{lib => Lib}/WebServer/HttpHeader.cs (100%) rename csharp/{lib => Lib}/WebServer/HttpMethod.cs (100%) rename csharp/{lib => Lib}/WebServer/HttpRequest.cs (100%) rename csharp/{lib => Lib}/WebServer/HttpResponse.cs (100%) rename csharp/{lib => Lib}/WebServer/WebServer.cs (100%) rename csharp/{lib => Lib}/WebServer/WebServer.csproj (76%) rename csharp/{lib => Lib}/Wireformat/WireFormat.csproj.DotSettings (100%) rename csharp/{lib => Lib}/Wireformat/build_proto.sh (100%) rename csharp/{lib => Lib}/Wireformat/package-lock.json (100%) rename csharp/{lib => Lib}/Wireformat/package.json (100%) rename csharp/{lib => Lib}/Wireformat/proto/Payload.proto (100%) rename csharp/{lib => Lib}/Wireformat/proto/VictronV1/BatteryStatus48TL.proto (100%) rename csharp/{lib => Lib}/Wireformat/proto/VictronV1/Device.proto (100%) rename csharp/{lib => Lib}/Wireformat/proto/VictronV1/VictronTopologyV1.proto (100%) delete mode 100644 csharp/app/Backend/db.sqlite delete mode 100644 csharp/app/EmuMeterDriver/EmuMeterDriver.csproj delete mode 100644 csharp/app/SaliMax/SaliMax.csproj delete mode 100644 csharp/lib/Channels/Channels.csproj delete mode 100644 csharp/lib/Time/Time.csproj diff --git a/csharp/app/Backend/Backend.csproj b/csharp/App/Backend/Backend.csproj similarity index 93% rename from csharp/app/Backend/Backend.csproj rename to csharp/App/Backend/Backend.csproj index eebe0dae8..6be32dee4 100644 --- a/csharp/app/Backend/Backend.csproj +++ b/csharp/App/Backend/Backend.csproj @@ -1,5 +1,5 @@ - + @@ -24,7 +24,7 @@ - + diff --git a/csharp/app/Backend/Controllers/Controller.cs b/csharp/App/Backend/Controllers/Controller.cs similarity index 100% rename from csharp/app/Backend/Controllers/Controller.cs rename to csharp/App/Backend/Controllers/Controller.cs diff --git a/csharp/app/Backend/Controllers/Credentials.cs b/csharp/App/Backend/Controllers/Credentials.cs similarity index 100% rename from csharp/app/Backend/Controllers/Credentials.cs rename to csharp/App/Backend/Controllers/Credentials.cs diff --git a/csharp/app/Backend/Controllers/ReturnsAttribute.cs b/csharp/App/Backend/Controllers/ReturnsAttribute.cs similarity index 100% rename from csharp/app/Backend/Controllers/ReturnsAttribute.cs rename to csharp/App/Backend/Controllers/ReturnsAttribute.cs diff --git a/csharp/app/Backend/Database/Db.cs b/csharp/App/Backend/Database/Db.cs similarity index 100% rename from csharp/app/Backend/Database/Db.cs rename to csharp/App/Backend/Database/Db.cs diff --git a/csharp/app/Backend/Database/Fake.cs b/csharp/App/Backend/Database/Fake.cs similarity index 100% rename from csharp/app/Backend/Database/Fake.cs rename to csharp/App/Backend/Database/Fake.cs diff --git a/csharp/app/Backend/Database/Folder.cs b/csharp/App/Backend/Database/Folder.cs similarity index 100% rename from csharp/app/Backend/Database/Folder.cs rename to csharp/App/Backend/Database/Folder.cs diff --git a/csharp/app/Backend/Database/Installation.cs b/csharp/App/Backend/Database/Installation.cs similarity index 100% rename from csharp/app/Backend/Database/Installation.cs rename to csharp/App/Backend/Database/Installation.cs diff --git a/csharp/app/Backend/Database/User.cs b/csharp/App/Backend/Database/User.cs similarity index 100% rename from csharp/app/Backend/Database/User.cs rename to csharp/App/Backend/Database/User.cs diff --git a/csharp/app/Backend/Database/User2Folder.cs b/csharp/App/Backend/Database/User2Folder.cs similarity index 100% rename from csharp/app/Backend/Database/User2Folder.cs rename to csharp/App/Backend/Database/User2Folder.cs diff --git a/csharp/app/Backend/Database/User2Installation.cs b/csharp/App/Backend/Database/User2Installation.cs similarity index 100% rename from csharp/app/Backend/Database/User2Installation.cs rename to csharp/App/Backend/Database/User2Installation.cs diff --git a/csharp/app/Backend/FakeFolders.csv b/csharp/App/Backend/FakeFolders.csv similarity index 100% rename from csharp/app/Backend/FakeFolders.csv rename to csharp/App/Backend/FakeFolders.csv diff --git a/csharp/app/Backend/FakeInstallations.csv b/csharp/App/Backend/FakeInstallations.csv similarity index 100% rename from csharp/app/Backend/FakeInstallations.csv rename to csharp/App/Backend/FakeInstallations.csv diff --git a/csharp/app/Backend/FakePasswords.csv b/csharp/App/Backend/FakePasswords.csv similarity index 100% rename from csharp/app/Backend/FakePasswords.csv rename to csharp/App/Backend/FakePasswords.csv diff --git a/csharp/app/Backend/FakeUsers.csv b/csharp/App/Backend/FakeUsers.csv similarity index 100% rename from csharp/app/Backend/FakeUsers.csv rename to csharp/App/Backend/FakeUsers.csv diff --git a/csharp/app/Backend/HeaderFilter.cs b/csharp/App/Backend/HeaderFilter.cs similarity index 100% rename from csharp/app/Backend/HeaderFilter.cs rename to csharp/App/Backend/HeaderFilter.cs diff --git a/csharp/app/Backend/Model/Folder.cs b/csharp/App/Backend/Model/Folder.cs similarity index 100% rename from csharp/app/Backend/Model/Folder.cs rename to csharp/App/Backend/Model/Folder.cs diff --git a/csharp/app/Backend/Model/Installation.cs b/csharp/App/Backend/Model/Installation.cs similarity index 100% rename from csharp/app/Backend/Model/Installation.cs rename to csharp/App/Backend/Model/Installation.cs diff --git a/csharp/app/Backend/Model/Relations/Relation.cs b/csharp/App/Backend/Model/Relations/Relation.cs similarity index 100% rename from csharp/app/Backend/Model/Relations/Relation.cs rename to csharp/App/Backend/Model/Relations/Relation.cs diff --git a/csharp/app/Backend/Model/Relations/Session.cs b/csharp/App/Backend/Model/Relations/Session.cs similarity index 100% rename from csharp/app/Backend/Model/Relations/Session.cs rename to csharp/App/Backend/Model/Relations/Session.cs diff --git a/csharp/app/Backend/Model/Relations/User2Folder.cs b/csharp/App/Backend/Model/Relations/User2Folder.cs similarity index 100% rename from csharp/app/Backend/Model/Relations/User2Folder.cs rename to csharp/App/Backend/Model/Relations/User2Folder.cs diff --git a/csharp/app/Backend/Model/Relations/User2Installation.cs b/csharp/App/Backend/Model/Relations/User2Installation.cs similarity index 100% rename from csharp/app/Backend/Model/Relations/User2Installation.cs rename to csharp/App/Backend/Model/Relations/User2Installation.cs diff --git a/csharp/app/Backend/Model/TreeNode.Equality.cs b/csharp/App/Backend/Model/TreeNode.Equality.cs similarity index 100% rename from csharp/app/Backend/Model/TreeNode.Equality.cs rename to csharp/App/Backend/Model/TreeNode.Equality.cs diff --git a/csharp/app/Backend/Model/TreeNode.cs b/csharp/App/Backend/Model/TreeNode.cs similarity index 100% rename from csharp/app/Backend/Model/TreeNode.cs rename to csharp/App/Backend/Model/TreeNode.cs diff --git a/csharp/app/Backend/Model/User.cs b/csharp/App/Backend/Model/User.cs similarity index 100% rename from csharp/app/Backend/Model/User.cs rename to csharp/App/Backend/Model/User.cs diff --git a/csharp/app/Backend/Program.cs b/csharp/App/Backend/Program.cs similarity index 100% rename from csharp/app/Backend/Program.cs rename to csharp/App/Backend/Program.cs diff --git a/csharp/app/Backend/Properties/launchSettings.json b/csharp/App/Backend/Properties/launchSettings.json similarity index 100% rename from csharp/app/Backend/Properties/launchSettings.json rename to csharp/App/Backend/Properties/launchSettings.json diff --git a/csharp/app/Backend/Utils/Crypto.cs b/csharp/App/Backend/Utils/Crypto.cs similarity index 100% rename from csharp/app/Backend/Utils/Crypto.cs rename to csharp/App/Backend/Utils/Crypto.cs diff --git a/csharp/app/Backend/Utils/Result.cs b/csharp/App/Backend/Utils/Result.cs similarity index 100% rename from csharp/app/Backend/Utils/Result.cs rename to csharp/App/Backend/Utils/Result.cs diff --git a/csharp/App/Backend/db.sqlite b/csharp/App/Backend/db.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..982a3ab9194e88a44231a09570b7baa0be6f249f GIT binary patch literal 290816 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 - + @@ -7,7 +7,7 @@ - + diff --git a/csharp/app/BmsTunnel/CliPrograms.cs b/csharp/App/BmsTunnel/CliPrograms.cs similarity index 100% rename from csharp/app/BmsTunnel/CliPrograms.cs rename to csharp/App/BmsTunnel/CliPrograms.cs diff --git a/csharp/app/BmsTunnel/Program.cs b/csharp/App/BmsTunnel/Program.cs similarity index 100% rename from csharp/app/BmsTunnel/Program.cs rename to csharp/App/BmsTunnel/Program.cs diff --git a/csharp/app/BmsTunnel/debug.sh b/csharp/App/BmsTunnel/debug.sh similarity index 100% rename from csharp/app/BmsTunnel/debug.sh rename to csharp/App/BmsTunnel/debug.sh diff --git a/csharp/app/BmsTunnel/parameters.txt b/csharp/App/BmsTunnel/parameters.txt similarity index 100% rename from csharp/app/BmsTunnel/parameters.txt rename to csharp/App/BmsTunnel/parameters.txt diff --git a/csharp/app/Collector/Collector.csproj b/csharp/App/Collector/Collector.csproj similarity index 52% rename from csharp/app/Collector/Collector.csproj rename to csharp/App/Collector/Collector.csproj index b2e28418b..27b560c8d 100644 --- a/csharp/app/Collector/Collector.csproj +++ b/csharp/App/Collector/Collector.csproj @@ -1,9 +1,9 @@ - + - - + + diff --git a/csharp/app/Collector/Collector.sln b/csharp/App/Collector/Collector.sln similarity index 100% rename from csharp/app/Collector/Collector.sln rename to csharp/App/Collector/Collector.sln diff --git a/csharp/app/Collector/src/BatteryDataParser.cs b/csharp/App/Collector/src/BatteryDataParser.cs similarity index 100% rename from csharp/app/Collector/src/BatteryDataParser.cs rename to csharp/App/Collector/src/BatteryDataParser.cs diff --git a/csharp/app/Collector/src/BatteryDataParserV4.cs b/csharp/App/Collector/src/BatteryDataParserV4.cs similarity index 100% rename from csharp/app/Collector/src/BatteryDataParserV4.cs rename to csharp/App/Collector/src/BatteryDataParserV4.cs diff --git a/csharp/app/Collector/src/Influx/FieldAttribute.cs b/csharp/App/Collector/src/Influx/FieldAttribute.cs similarity index 100% rename from csharp/app/Collector/src/Influx/FieldAttribute.cs rename to csharp/App/Collector/src/Influx/FieldAttribute.cs diff --git a/csharp/app/Collector/src/Influx/InfluxRecord.cs b/csharp/App/Collector/src/Influx/InfluxRecord.cs similarity index 100% rename from csharp/app/Collector/src/Influx/InfluxRecord.cs rename to csharp/App/Collector/src/Influx/InfluxRecord.cs diff --git a/csharp/app/Collector/src/Influx/LineProtocolSyntax.cs b/csharp/App/Collector/src/Influx/LineProtocolSyntax.cs similarity index 100% rename from csharp/app/Collector/src/Influx/LineProtocolSyntax.cs rename to csharp/App/Collector/src/Influx/LineProtocolSyntax.cs diff --git a/csharp/app/Collector/src/Influx/TagAttribute.cs b/csharp/App/Collector/src/Influx/TagAttribute.cs similarity index 100% rename from csharp/app/Collector/src/Influx/TagAttribute.cs rename to csharp/App/Collector/src/Influx/TagAttribute.cs diff --git a/csharp/app/Collector/src/Program.cs b/csharp/App/Collector/src/Program.cs similarity index 100% rename from csharp/app/Collector/src/Program.cs rename to csharp/App/Collector/src/Program.cs diff --git a/csharp/app/Collector/src/Records/Alarms.cs b/csharp/App/Collector/src/Records/Alarms.cs similarity index 100% rename from csharp/app/Collector/src/Records/Alarms.cs rename to csharp/App/Collector/src/Records/Alarms.cs diff --git a/csharp/app/Collector/src/Records/BatteryRecord.cs b/csharp/App/Collector/src/Records/BatteryRecord.cs similarity index 100% rename from csharp/app/Collector/src/Records/BatteryRecord.cs rename to csharp/App/Collector/src/Records/BatteryRecord.cs diff --git a/csharp/app/Collector/src/Records/BatteryStatus.cs b/csharp/App/Collector/src/Records/BatteryStatus.cs similarity index 100% rename from csharp/app/Collector/src/Records/BatteryStatus.cs rename to csharp/App/Collector/src/Records/BatteryStatus.cs diff --git a/csharp/app/Collector/src/Records/Error.cs b/csharp/App/Collector/src/Records/Error.cs similarity index 100% rename from csharp/app/Collector/src/Records/Error.cs rename to csharp/App/Collector/src/Records/Error.cs diff --git a/csharp/app/Collector/src/Records/InstallationStatus.cs b/csharp/App/Collector/src/Records/InstallationStatus.cs similarity index 100% rename from csharp/app/Collector/src/Records/InstallationStatus.cs rename to csharp/App/Collector/src/Records/InstallationStatus.cs diff --git a/csharp/app/Collector/src/Records/IoStatus.cs b/csharp/App/Collector/src/Records/IoStatus.cs similarity index 100% rename from csharp/app/Collector/src/Records/IoStatus.cs rename to csharp/App/Collector/src/Records/IoStatus.cs diff --git a/csharp/app/Collector/src/Records/Leds.cs b/csharp/App/Collector/src/Records/Leds.cs similarity index 100% rename from csharp/app/Collector/src/Records/Leds.cs rename to csharp/App/Collector/src/Records/Leds.cs diff --git a/csharp/app/Collector/src/Records/Temperatures.cs b/csharp/App/Collector/src/Records/Temperatures.cs similarity index 100% rename from csharp/app/Collector/src/Records/Temperatures.cs rename to csharp/App/Collector/src/Records/Temperatures.cs diff --git a/csharp/app/Collector/src/Records/Warnings.cs b/csharp/App/Collector/src/Records/Warnings.cs similarity index 100% rename from csharp/app/Collector/src/Records/Warnings.cs rename to csharp/App/Collector/src/Records/Warnings.cs diff --git a/csharp/app/Collector/src/Settings.cs b/csharp/App/Collector/src/Settings.cs similarity index 100% rename from csharp/app/Collector/src/Settings.cs rename to csharp/App/Collector/src/Settings.cs diff --git a/csharp/app/Collector/src/Utils/Extensions.cs b/csharp/App/Collector/src/Utils/Extensions.cs similarity index 100% rename from csharp/app/Collector/src/Utils/Extensions.cs rename to csharp/App/Collector/src/Utils/Extensions.cs diff --git a/csharp/app/Collector/src/Utils/Log.cs b/csharp/App/Collector/src/Utils/Log.cs similarity index 100% rename from csharp/app/Collector/src/Utils/Log.cs rename to csharp/App/Collector/src/Utils/Log.cs diff --git a/csharp/app/Collector/src/Utils/Property.cs b/csharp/App/Collector/src/Utils/Property.cs similarity index 100% rename from csharp/app/Collector/src/Utils/Property.cs rename to csharp/App/Collector/src/Utils/Property.cs diff --git a/csharp/app/Collector/src/Utils/ReadOnlyListExtensions.cs b/csharp/App/Collector/src/Utils/ReadOnlyListExtensions.cs similarity index 100% rename from csharp/app/Collector/src/Utils/ReadOnlyListExtensions.cs rename to csharp/App/Collector/src/Utils/ReadOnlyListExtensions.cs diff --git a/csharp/app/Collector/src/Utils/Utils.cs b/csharp/App/Collector/src/Utils/Utils.cs similarity index 100% rename from csharp/app/Collector/src/Utils/Utils.cs rename to csharp/App/Collector/src/Utils/Utils.cs diff --git a/csharp/app/EmuMeterDriver/Config.cs b/csharp/App/EmuMeterDriver/Config.cs similarity index 100% rename from csharp/app/EmuMeterDriver/Config.cs rename to csharp/App/EmuMeterDriver/Config.cs diff --git a/csharp/app/EmuMeterDriver/EmuMeterDriver.cs b/csharp/App/EmuMeterDriver/EmuMeterDriver.cs similarity index 100% rename from csharp/app/EmuMeterDriver/EmuMeterDriver.cs rename to csharp/App/EmuMeterDriver/EmuMeterDriver.cs diff --git a/csharp/App/EmuMeterDriver/EmuMeterDriver.csproj b/csharp/App/EmuMeterDriver/EmuMeterDriver.csproj new file mode 100644 index 000000000..b2f8696ed --- /dev/null +++ b/csharp/App/EmuMeterDriver/EmuMeterDriver.csproj @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/csharp/app/EmuMeterDriver/Nic.cs b/csharp/App/EmuMeterDriver/Nic.cs similarity index 100% rename from csharp/app/EmuMeterDriver/Nic.cs rename to csharp/App/EmuMeterDriver/Nic.cs diff --git a/csharp/app/EmuMeterDriver/Program.cs b/csharp/App/EmuMeterDriver/Program.cs similarity index 100% rename from csharp/app/EmuMeterDriver/Program.cs rename to csharp/App/EmuMeterDriver/Program.cs diff --git a/csharp/app/EmuMeterDriver/Signal.cs b/csharp/App/EmuMeterDriver/Signal.cs similarity index 100% rename from csharp/app/EmuMeterDriver/Signal.cs rename to csharp/App/EmuMeterDriver/Signal.cs diff --git a/csharp/app/EmuMeterDriver/Utils.cs b/csharp/App/EmuMeterDriver/Utils.cs similarity index 100% rename from csharp/app/EmuMeterDriver/Utils.cs rename to csharp/App/EmuMeterDriver/Utils.cs diff --git a/csharp/app/EmuMeterDriver/debug.sh b/csharp/App/EmuMeterDriver/debug.sh similarity index 100% rename from csharp/app/EmuMeterDriver/debug.sh rename to csharp/App/EmuMeterDriver/debug.sh diff --git a/csharp/app/EmuMeterDriver/service/log/run b/csharp/App/EmuMeterDriver/service/log/run similarity index 100% rename from csharp/app/EmuMeterDriver/service/log/run rename to csharp/App/EmuMeterDriver/service/log/run diff --git a/csharp/app/EmuMeterDriver/service/run b/csharp/App/EmuMeterDriver/service/run similarity index 100% rename from csharp/app/EmuMeterDriver/service/run rename to csharp/App/EmuMeterDriver/service/run diff --git a/csharp/app/InnovEnergy.app.props b/csharp/App/InnovEnergy.App.props similarity index 100% rename from csharp/app/InnovEnergy.app.props rename to csharp/App/InnovEnergy.App.props diff --git a/csharp/app/OpenVpnCertificatesServer/Files.cs b/csharp/App/OpenVpnCertificatesServer/Files.cs similarity index 100% rename from csharp/app/OpenVpnCertificatesServer/Files.cs rename to csharp/App/OpenVpnCertificatesServer/Files.cs diff --git a/csharp/app/OpenVpnCertificatesServer/Http.cs b/csharp/App/OpenVpnCertificatesServer/Http.cs similarity index 100% rename from csharp/app/OpenVpnCertificatesServer/Http.cs rename to csharp/App/OpenVpnCertificatesServer/Http.cs diff --git a/csharp/app/OpenVpnCertificatesServer/OpenVpnCertificatesServer.csproj b/csharp/App/OpenVpnCertificatesServer/OpenVpnCertificatesServer.csproj similarity index 58% rename from csharp/app/OpenVpnCertificatesServer/OpenVpnCertificatesServer.csproj rename to csharp/App/OpenVpnCertificatesServer/OpenVpnCertificatesServer.csproj index 2773cd430..e44b0a11e 100644 --- a/csharp/app/OpenVpnCertificatesServer/OpenVpnCertificatesServer.csproj +++ b/csharp/App/OpenVpnCertificatesServer/OpenVpnCertificatesServer.csproj @@ -1,5 +1,5 @@ - + @@ -8,8 +8,9 @@ - - + + + diff --git a/csharp/app/OpenVpnCertificatesServer/OpenVpnCertificatesServer.sln b/csharp/App/OpenVpnCertificatesServer/OpenVpnCertificatesServer.sln similarity index 100% rename from csharp/app/OpenVpnCertificatesServer/OpenVpnCertificatesServer.sln rename to csharp/App/OpenVpnCertificatesServer/OpenVpnCertificatesServer.sln diff --git a/csharp/app/OpenVpnCertificatesServer/PKI/CertificateAuthority.cs b/csharp/App/OpenVpnCertificatesServer/PKI/CertificateAuthority.cs similarity index 100% rename from csharp/app/OpenVpnCertificatesServer/PKI/CertificateAuthority.cs rename to csharp/App/OpenVpnCertificatesServer/PKI/CertificateAuthority.cs diff --git a/csharp/app/OpenVpnCertificatesServer/PKI/Pem.cs b/csharp/App/OpenVpnCertificatesServer/PKI/Pem.cs similarity index 100% rename from csharp/app/OpenVpnCertificatesServer/PKI/Pem.cs rename to csharp/App/OpenVpnCertificatesServer/PKI/Pem.cs diff --git a/csharp/app/OpenVpnCertificatesServer/PKI/PwdFinder.cs b/csharp/App/OpenVpnCertificatesServer/PKI/PwdFinder.cs similarity index 100% rename from csharp/app/OpenVpnCertificatesServer/PKI/PwdFinder.cs rename to csharp/App/OpenVpnCertificatesServer/PKI/PwdFinder.cs diff --git a/csharp/app/OpenVpnCertificatesServer/Program.cs b/csharp/App/OpenVpnCertificatesServer/Program.cs similarity index 100% rename from csharp/app/OpenVpnCertificatesServer/Program.cs rename to csharp/App/OpenVpnCertificatesServer/Program.cs diff --git a/csharp/app/OpenVpnCertificatesServer/Utils.cs b/csharp/App/OpenVpnCertificatesServer/Utils.cs similarity index 100% rename from csharp/app/OpenVpnCertificatesServer/Utils.cs rename to csharp/App/OpenVpnCertificatesServer/Utils.cs diff --git a/csharp/app/RemoteSupportConsole/Login.cs b/csharp/App/RemoteSupportConsole/Login.cs similarity index 100% rename from csharp/app/RemoteSupportConsole/Login.cs rename to csharp/App/RemoteSupportConsole/Login.cs diff --git a/csharp/app/RemoteSupportConsole/ObservablePipeSource.cs b/csharp/App/RemoteSupportConsole/ObservablePipeSource.cs similarity index 100% rename from csharp/app/RemoteSupportConsole/ObservablePipeSource.cs rename to csharp/App/RemoteSupportConsole/ObservablePipeSource.cs diff --git a/csharp/app/RemoteSupportConsole/Program.cs b/csharp/App/RemoteSupportConsole/Program.cs similarity index 100% rename from csharp/app/RemoteSupportConsole/Program.cs rename to csharp/App/RemoteSupportConsole/Program.cs diff --git a/csharp/app/RemoteSupportConsole/RemoteSupportConsole.csproj b/csharp/App/RemoteSupportConsole/RemoteSupportConsole.csproj similarity index 67% rename from csharp/app/RemoteSupportConsole/RemoteSupportConsole.csproj rename to csharp/App/RemoteSupportConsole/RemoteSupportConsole.csproj index cb8c7d1b8..c00eed4bb 100644 --- a/csharp/app/RemoteSupportConsole/RemoteSupportConsole.csproj +++ b/csharp/App/RemoteSupportConsole/RemoteSupportConsole.csproj @@ -1,9 +1,9 @@ - + - - + + diff --git a/csharp/app/RemoteSupportConsole/RemoteSupportConsole.csproj.DotSettings b/csharp/App/RemoteSupportConsole/RemoteSupportConsole.csproj.DotSettings similarity index 100% rename from csharp/app/RemoteSupportConsole/RemoteSupportConsole.csproj.DotSettings rename to csharp/App/RemoteSupportConsole/RemoteSupportConsole.csproj.DotSettings diff --git a/csharp/app/RemoteSupportConsole/Ssh.cs b/csharp/App/RemoteSupportConsole/Ssh.cs similarity index 100% rename from csharp/app/RemoteSupportConsole/Ssh.cs rename to csharp/App/RemoteSupportConsole/Ssh.cs diff --git a/csharp/app/RemoteSupportConsole/VpnConnection.cs b/csharp/App/RemoteSupportConsole/VpnConnection.cs similarity index 100% rename from csharp/app/RemoteSupportConsole/VpnConnection.cs rename to csharp/App/RemoteSupportConsole/VpnConnection.cs diff --git a/csharp/app/RemoteSupportConsole/VpnInfo.cs b/csharp/App/RemoteSupportConsole/VpnInfo.cs similarity index 100% rename from csharp/app/RemoteSupportConsole/VpnInfo.cs rename to csharp/App/RemoteSupportConsole/VpnInfo.cs diff --git a/csharp/app/RemoteSupportConsole/VrmConnection.cs b/csharp/App/RemoteSupportConsole/VrmConnection.cs similarity index 100% rename from csharp/app/RemoteSupportConsole/VrmConnection.cs rename to csharp/App/RemoteSupportConsole/VrmConnection.cs diff --git a/csharp/app/RemoteSupportConsole/VrmInfo.cs b/csharp/App/RemoteSupportConsole/VrmInfo.cs similarity index 100% rename from csharp/app/RemoteSupportConsole/VrmInfo.cs rename to csharp/App/RemoteSupportConsole/VrmInfo.cs diff --git a/csharp/app/RemoteSupportConsole/VrmProxy.cs b/csharp/App/RemoteSupportConsole/VrmProxy.cs similarity index 100% rename from csharp/app/RemoteSupportConsole/VrmProxy.cs rename to csharp/App/RemoteSupportConsole/VrmProxy.cs diff --git a/csharp/App/SaliMax/SaliMax.csproj b/csharp/App/SaliMax/SaliMax.csproj new file mode 100644 index 000000000..c647ee0d5 --- /dev/null +++ b/csharp/App/SaliMax/SaliMax.csproj @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/csharp/app/SaliMax/run (BeagleBone Meiringen).sh b/csharp/App/SaliMax/run (BeagleBone Meiringen).sh similarity index 100% rename from csharp/app/SaliMax/run (BeagleBone Meiringen).sh rename to csharp/App/SaliMax/run (BeagleBone Meiringen).sh diff --git a/csharp/app/SaliMax/src/AsciiArt.cs b/csharp/App/SaliMax/src/AsciiArt.cs similarity index 100% rename from csharp/app/SaliMax/src/AsciiArt.cs rename to csharp/App/SaliMax/src/AsciiArt.cs diff --git a/csharp/app/SaliMax/src/BusPort.cs b/csharp/App/SaliMax/src/BusPort.cs similarity index 100% rename from csharp/app/SaliMax/src/BusPort.cs rename to csharp/App/SaliMax/src/BusPort.cs diff --git a/csharp/app/SaliMax/src/Controller/AvgBatteriesStatus.cs b/csharp/App/SaliMax/src/Controller/AvgBatteriesStatus.cs similarity index 100% rename from csharp/app/SaliMax/src/Controller/AvgBatteriesStatus.cs rename to csharp/App/SaliMax/src/Controller/AvgBatteriesStatus.cs diff --git a/csharp/app/SaliMax/src/Controller/Control.cs b/csharp/App/SaliMax/src/Controller/Control.cs similarity index 100% rename from csharp/app/SaliMax/src/Controller/Control.cs rename to csharp/App/SaliMax/src/Controller/Control.cs diff --git a/csharp/app/SaliMax/src/Controller/ControlRecord.cs b/csharp/App/SaliMax/src/Controller/ControlRecord.cs similarity index 100% rename from csharp/app/SaliMax/src/Controller/ControlRecord.cs rename to csharp/App/SaliMax/src/Controller/ControlRecord.cs diff --git a/csharp/app/SaliMax/src/Controller/ControlTarget.cs b/csharp/App/SaliMax/src/Controller/ControlTarget.cs similarity index 100% rename from csharp/app/SaliMax/src/Controller/ControlTarget.cs rename to csharp/App/SaliMax/src/Controller/ControlTarget.cs diff --git a/csharp/app/SaliMax/src/Controller/Controller.cs b/csharp/App/SaliMax/src/Controller/Controller.cs similarity index 100% rename from csharp/app/SaliMax/src/Controller/Controller.cs rename to csharp/App/SaliMax/src/Controller/Controller.cs diff --git a/csharp/app/SaliMax/src/Controller/SaliMaxState.cs b/csharp/App/SaliMax/src/Controller/SaliMaxState.cs similarity index 100% rename from csharp/app/SaliMax/src/Controller/SaliMaxState.cs rename to csharp/App/SaliMax/src/Controller/SaliMaxState.cs diff --git a/csharp/app/SaliMax/src/Controller/State.cs b/csharp/App/SaliMax/src/Controller/State.cs similarity index 100% rename from csharp/app/SaliMax/src/Controller/State.cs rename to csharp/App/SaliMax/src/Controller/State.cs diff --git a/csharp/app/SaliMax/src/Controller/StateConfig.cs b/csharp/App/SaliMax/src/Controller/StateConfig.cs similarity index 100% rename from csharp/app/SaliMax/src/Controller/StateConfig.cs rename to csharp/App/SaliMax/src/Controller/StateConfig.cs diff --git a/csharp/app/SaliMax/src/Controller/StatusRecord.cs b/csharp/App/SaliMax/src/Controller/StatusRecord.cs similarity index 100% rename from csharp/app/SaliMax/src/Controller/StatusRecord.cs rename to csharp/App/SaliMax/src/Controller/StatusRecord.cs diff --git a/csharp/app/SaliMax/src/Log/Ampt.cs b/csharp/App/SaliMax/src/Log/Ampt.cs similarity index 100% rename from csharp/app/SaliMax/src/Log/Ampt.cs rename to csharp/App/SaliMax/src/Log/Ampt.cs diff --git a/csharp/app/SaliMax/src/Log/Battery48Tl.cs b/csharp/App/SaliMax/src/Log/Battery48Tl.cs similarity index 100% rename from csharp/app/SaliMax/src/Log/Battery48Tl.cs rename to csharp/App/SaliMax/src/Log/Battery48Tl.cs diff --git a/csharp/app/SaliMax/src/Log/EmuMeter.cs b/csharp/App/SaliMax/src/Log/EmuMeter.cs similarity index 100% rename from csharp/app/SaliMax/src/Log/EmuMeter.cs rename to csharp/App/SaliMax/src/Log/EmuMeter.cs diff --git a/csharp/app/SaliMax/src/Log/JsonUtil.cs b/csharp/App/SaliMax/src/Log/JsonUtil.cs similarity index 100% rename from csharp/app/SaliMax/src/Log/JsonUtil.cs rename to csharp/App/SaliMax/src/Log/JsonUtil.cs diff --git a/csharp/app/SaliMax/src/Log/Salimax.cs b/csharp/App/SaliMax/src/Log/Salimax.cs similarity index 100% rename from csharp/app/SaliMax/src/Log/Salimax.cs rename to csharp/App/SaliMax/src/Log/Salimax.cs diff --git a/csharp/app/SaliMax/src/Log/TruConvertAc.cs b/csharp/App/SaliMax/src/Log/TruConvertAc.cs similarity index 100% rename from csharp/app/SaliMax/src/Log/TruConvertAc.cs rename to csharp/App/SaliMax/src/Log/TruConvertAc.cs diff --git a/csharp/app/SaliMax/src/Log/TruConvertDc.cs b/csharp/App/SaliMax/src/Log/TruConvertDc.cs similarity index 100% rename from csharp/app/SaliMax/src/Log/TruConvertDc.cs rename to csharp/App/SaliMax/src/Log/TruConvertDc.cs diff --git a/csharp/app/SaliMax/src/Program.cs b/csharp/App/SaliMax/src/Program.cs similarity index 100% rename from csharp/app/SaliMax/src/Program.cs rename to csharp/App/SaliMax/src/Program.cs diff --git a/csharp/app/SaliMax/src/S3Config.cs b/csharp/App/SaliMax/src/S3Config.cs similarity index 100% rename from csharp/app/SaliMax/src/S3Config.cs rename to csharp/App/SaliMax/src/S3Config.cs diff --git a/csharp/app/SaliMax/src/SaliMaxRelays/RelayMapBoolean.cs b/csharp/App/SaliMax/src/SaliMaxRelays/RelayMapBoolean.cs similarity index 100% rename from csharp/app/SaliMax/src/SaliMaxRelays/RelayMapBoolean.cs rename to csharp/App/SaliMax/src/SaliMaxRelays/RelayMapBoolean.cs diff --git a/csharp/app/SaliMax/src/SaliMaxRelays/SaliMaxRelaysDevice.cs b/csharp/App/SaliMax/src/SaliMaxRelays/SaliMaxRelaysDevice.cs similarity index 100% rename from csharp/app/SaliMax/src/SaliMaxRelays/SaliMaxRelaysDevice.cs rename to csharp/App/SaliMax/src/SaliMaxRelays/SaliMaxRelaysDevice.cs diff --git a/csharp/app/SaliMax/src/SaliMaxRelays/SaliMaxRelaysStatus.cs b/csharp/App/SaliMax/src/SaliMaxRelays/SaliMaxRelaysStatus.cs similarity index 100% rename from csharp/app/SaliMax/src/SaliMaxRelays/SaliMaxRelaysStatus.cs rename to csharp/App/SaliMax/src/SaliMaxRelays/SaliMaxRelaysStatus.cs diff --git a/csharp/app/SaliMax/src/SystemConfig/Config.cs b/csharp/App/SaliMax/src/SystemConfig/Config.cs similarity index 100% rename from csharp/app/SaliMax/src/SystemConfig/Config.cs rename to csharp/App/SaliMax/src/SystemConfig/Config.cs diff --git a/csharp/app/SaliMax/src/SystemConfig/Defaults.cs b/csharp/App/SaliMax/src/SystemConfig/Defaults.cs similarity index 100% rename from csharp/app/SaliMax/src/SystemConfig/Defaults.cs rename to csharp/App/SaliMax/src/SystemConfig/Defaults.cs diff --git a/csharp/app/SaliMax/src/SystemConfig/SalimaxConfig.cs b/csharp/App/SaliMax/src/SystemConfig/SalimaxConfig.cs similarity index 100% rename from csharp/app/SaliMax/src/SystemConfig/SalimaxConfig.cs rename to csharp/App/SaliMax/src/SystemConfig/SalimaxConfig.cs diff --git a/csharp/app/SaliMax/src/Topology.cs b/csharp/App/SaliMax/src/Topology.cs similarity index 100% rename from csharp/app/SaliMax/src/Topology.cs rename to csharp/App/SaliMax/src/Topology.cs diff --git a/csharp/app/SaliMax/src/Utils.cs b/csharp/App/SaliMax/src/Utils.cs similarity index 100% rename from csharp/app/SaliMax/src/Utils.cs rename to csharp/App/SaliMax/src/Utils.cs diff --git a/csharp/app/SaliMax/tunnels.html b/csharp/App/SaliMax/tunnels.html similarity index 100% rename from csharp/app/SaliMax/tunnels.html rename to csharp/App/SaliMax/tunnels.html diff --git a/csharp/app/SaliMax/tunnels.sh b/csharp/App/SaliMax/tunnels.sh similarity index 100% rename from csharp/app/SaliMax/tunnels.sh rename to csharp/App/SaliMax/tunnels.sh diff --git a/csharp/InnovEnergy.sln b/csharp/InnovEnergy.sln index 5002df0a2..70c4b2f57 100644 --- a/csharp/InnovEnergy.sln +++ b/csharp/InnovEnergy.sln @@ -1,32 +1,32 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Collector", "app/Collector/Collector.csproj", "{E3A5F3A3-72A5-47CC-85C6-2D8E962A0EC1}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Collector", "App/Collector/Collector.csproj", "{E3A5F3A3-72A5-47CC-85C6-2D8E962A0EC1}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenVpnCertificatesServer", "app/OpenVpnCertificatesServer/OpenVpnCertificatesServer.csproj", "{CF4834CB-91B7-4172-AC13-ECDA8613CD17}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenVpnCertificatesServer", "App/OpenVpnCertificatesServer/OpenVpnCertificatesServer.csproj", "{CF4834CB-91B7-4172-AC13-ECDA8613CD17}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RemoteSupportConsole", "app/RemoteSupportConsole/RemoteSupportConsole.csproj", "{B1268C03-66EB-4486-8BFC-B439225D9D54}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RemoteSupportConsole", "App/RemoteSupportConsole/RemoteSupportConsole.csproj", "{B1268C03-66EB-4486-8BFC-B439225D9D54}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SysTools", "lib/SysTools/SysTools.csproj", "{4A67D79F-F0C9-4BBC-9601-D5948E6C05D3}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SysTools", "Lib/SysTools/SysTools.csproj", "{4A67D79F-F0C9-4BBC-9601-D5948E6C05D3}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebServer", "lib/WebServer/WebServer.csproj", "{B2627B9F-41DF-44F7-A0D1-CA71FF4A007A}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebServer", "Lib/WebServer/WebServer.csproj", "{B2627B9F-41DF-44F7-A0D1-CA71FF4A007A}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Time", "lib/Time/Time.csproj", "{442A8366-C177-48FE-84A7-BDF6470A09FF}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Time", "Lib/Time/Time.csproj", "{442A8366-C177-48FE-84A7-BDF6470A09FF}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EmuMeterDriver", "app/EmuMeterDriver/EmuMeterDriver.csproj", "{F65F33B0-3522-4008-8D1E-47EF8E4C7AC7}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EmuMeterDriver", "App/EmuMeterDriver/EmuMeterDriver.csproj", "{F65F33B0-3522-4008-8D1E-47EF8E4C7AC7}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BmsTunnel", "app/BmsTunnel/BmsTunnel.csproj", "{40B45363-BE34-420B-8F87-775EE6EE3513}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BmsTunnel", "App/BmsTunnel/BmsTunnel.csproj", "{40B45363-BE34-420B-8F87-775EE6EE3513}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "app", "app", "{145597B4-3E30-45E6-9F72-4DD43194539A}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "App", "App", "{145597B4-3E30-45E6-9F72-4DD43194539A}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "lib", "lib", "{AD5B98A8-AB7F-4DA2-B66D-5B4E63E7D854}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Lib", "Lib", "{AD5B98A8-AB7F-4DA2-B66D-5B4E63E7D854}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "S3", "lib/S3/S3.csproj", "{C3639841-13F4-4F24-99C6-7D965593BF89}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "S3", "Lib/S3/S3.csproj", "{C3639841-13F4-4F24-99C6-7D965593BF89}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "deprecated", "deprecated", "{46DE03C4-52D1-47AA-8E60-8BB15361D723}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SaliMax", "app/SaliMax/SaliMax.csproj", "{25073794-D859-4824-9984-194C7E928496}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SaliMax", "App/SaliMax/SaliMax.csproj", "{25073794-D859-4824-9984-194C7E928496}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StatusApi", "lib/StatusApi/StatusApi.csproj", "{9D17E78C-8A70-43DB-A619-DC12D20D023D}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StatusApi", "Lib/StatusApi/StatusApi.csproj", "{9D17E78C-8A70-43DB-A619-DC12D20D023D}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Devices", "Devices", "{4931A385-24DC-4E78-BFF4-356F8D6D5183}" EndProject @@ -36,36 +36,36 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Victron", "Victron", "{BD8C EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Trumpf", "Trumpf", "{DDDBEFD0-5DEA-4C7C-A9F2-FDB4636CF092}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TruConvert", "lib/Devices/Trumpf/TruConvert/TruConvert.csproj", "{EF46CF7B-823E-4CB7-966F-EDDC144C7954}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TruConvert", "Lib/Devices/Trumpf/TruConvert/TruConvert.csproj", "{EF46CF7B-823E-4CB7-966F-EDDC144C7954}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TruConvertAc", "lib/Devices/Trumpf/TruConvertAc/TruConvertAc.csproj", "{1F4B445E-459E-44CD-813E-6D725EBB81E8}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TruConvertAc", "Lib/Devices/Trumpf/TruConvertAc/TruConvertAc.csproj", "{1F4B445E-459E-44CD-813E-6D725EBB81E8}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TruConvertDc", "lib/Devices/Trumpf/TruConvertDc/TruConvertDc.csproj", "{F6F29829-C31A-4994-A698-E441BEA631C6}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TruConvertDc", "Lib/Devices/Trumpf/TruConvertDc/TruConvertDc.csproj", "{F6F29829-C31A-4994-A698-E441BEA631C6}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DBus", "lib/Protocols/DBus/DBus.csproj", "{8C3C620A-087D-4DD6-B493-A47FC643F8DC}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DBus", "Lib/Protocols/DBus/DBus.csproj", "{8C3C620A-087D-4DD6-B493-A47FC643F8DC}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Modbus", "lib/Protocols/Modbus/Modbus.csproj", "{E4AE6A33-0DEB-48EB-9D57-C0C7C63FC267}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Modbus", "Lib/Protocols/Modbus/Modbus.csproj", "{E4AE6A33-0DEB-48EB-9D57-C0C7C63FC267}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VeDBus", "lib/Victron/VeDBus/VeDBus.csproj", "{50B26E29-1B99-4D07-BCA5-359CD550BBAA}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VeDBus", "Lib/Victron/VeDBus/VeDBus.csproj", "{50B26E29-1B99-4D07-BCA5-359CD550BBAA}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VictronVRM", "lib/Victron/VictronVRM/VictronVRM.csproj", "{FE05DF69-B5C7-4C2E-8FB9-7776441A7622}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VictronVRM", "Lib/Victron/VictronVRM/VictronVRM.csproj", "{FE05DF69-B5C7-4C2E-8FB9-7776441A7622}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ampt", "lib/Devices/AMPT/Ampt.csproj", "{77AF3A64-2878-4150-BCD0-F16530783165}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ampt", "Lib/Devices/AMPT/Ampt.csproj", "{77AF3A64-2878-4150-BCD0-F16530783165}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Battery48TL", "lib/Devices/Battery48TL/Battery48TL.csproj", "{1C3F443A-B339-4B08-80E6-8A84817FFEC9}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Battery48TL", "Lib/Devices/Battery48TL/Battery48TL.csproj", "{1C3F443A-B339-4B08-80E6-8A84817FFEC9}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EmuMeter", "lib/Devices/EmuMeter/EmuMeter.csproj", "{152A4168-F612-493C-BBEA-8EB26E6E2D34}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EmuMeter", "Lib/Devices/EmuMeter/EmuMeter.csproj", "{152A4168-F612-493C-BBEA-8EB26E6E2D34}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Utils", "lib/Utils/Utils.csproj", "{89A3E29C-4E57-47FE-A800-12AC68418264}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Utils", "Lib/Utils/Utils.csproj", "{89A3E29C-4E57-47FE-A800-12AC68418264}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Adam6060", "lib/Devices/Adam6060/Adam6060.csproj", "{4AFDB799-E6A4-4DCA-8B6D-8C0F98398461}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Adam6060", "Lib/Devices/Adam6060/Adam6060.csproj", "{4AFDB799-E6A4-4DCA-8B6D-8C0F98398461}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Channels", "lib/Channels/Channels.csproj", "{AF7E8DCA-8D48-498E-AB3D-208061B244DC}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Channels", "Lib/Channels/Channels.csproj", "{AF7E8DCA-8D48-498E-AB3D-208061B244DC}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Backend", "app/Backend/Backend.csproj", "{A56F58C2-B265-435B-A985-53B4D6F49B1A}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Backend", "App/Backend/Backend.csproj", "{A56F58C2-B265-435B-A985-53B4D6F49B1A}" EndProject EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StatusData", "lib\StatusData\StatusData.csproj", "{C04FB6DA-23C6-46BB-9B21-8F4FBA32FFF7}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StatusData", "Lib\StatusData\StatusData.csproj", "{C04FB6DA-23C6-46BB-9B21-8F4FBA32FFF7}" EndProject Global diff --git a/csharp/Lib/Channels/Channels.csproj b/csharp/Lib/Channels/Channels.csproj new file mode 100644 index 000000000..9eb898d4e --- /dev/null +++ b/csharp/Lib/Channels/Channels.csproj @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/csharp/lib/Channels/CloseAfter.cs b/csharp/Lib/Channels/CloseAfter.cs similarity index 100% rename from csharp/lib/Channels/CloseAfter.cs rename to csharp/Lib/Channels/CloseAfter.cs diff --git a/csharp/lib/Channels/Connection.cs b/csharp/Lib/Channels/Connection.cs similarity index 100% rename from csharp/lib/Channels/Connection.cs rename to csharp/Lib/Channels/Connection.cs diff --git a/csharp/lib/Channels/Framed/Channel.cs b/csharp/Lib/Channels/Framed/Channel.cs similarity index 100% rename from csharp/lib/Channels/Framed/Channel.cs rename to csharp/Lib/Channels/Framed/Channel.cs diff --git a/csharp/lib/Channels/Stages/Channel.cs b/csharp/Lib/Channels/Stages/Channel.cs similarity index 100% rename from csharp/lib/Channels/Stages/Channel.cs rename to csharp/Lib/Channels/Stages/Channel.cs diff --git a/csharp/lib/Channels/Stages/ConnectedChannel.cs b/csharp/Lib/Channels/Stages/ConnectedChannel.cs similarity index 100% rename from csharp/lib/Channels/Stages/ConnectedChannel.cs rename to csharp/Lib/Channels/Stages/ConnectedChannel.cs diff --git a/csharp/lib/Channels/Stages/Stage.cs b/csharp/Lib/Channels/Stages/Stage.cs similarity index 100% rename from csharp/lib/Channels/Stages/Stage.cs rename to csharp/Lib/Channels/Stages/Stage.cs diff --git a/csharp/lib/Channels/V2/Bak/Connections/Connection.cs b/csharp/Lib/Channels/V2/Bak/Connections/Connection.cs similarity index 100% rename from csharp/lib/Channels/V2/Bak/Connections/Connection.cs rename to csharp/Lib/Channels/V2/Bak/Connections/Connection.cs diff --git a/csharp/lib/Channels/V2/Bak/Connections/Connections.cs b/csharp/Lib/Channels/V2/Bak/Connections/Connections.cs similarity index 100% rename from csharp/lib/Channels/V2/Bak/Connections/Connections.cs rename to csharp/Lib/Channels/V2/Bak/Connections/Connections.cs diff --git a/csharp/lib/Channels/V2/Bak/Connections/Extensions.cs b/csharp/Lib/Channels/V2/Bak/Connections/Extensions.cs similarity index 100% rename from csharp/lib/Channels/V2/Bak/Connections/Extensions.cs rename to csharp/Lib/Channels/V2/Bak/Connections/Extensions.cs diff --git a/csharp/lib/Channels/V2/Bak/Connections/IConnection.cs b/csharp/Lib/Channels/V2/Bak/Connections/IConnection.cs similarity index 100% rename from csharp/lib/Channels/V2/Bak/Connections/IConnection.cs rename to csharp/Lib/Channels/V2/Bak/Connections/IConnection.cs diff --git a/csharp/lib/Channels/V2/Bak/GenericChannel.cs b/csharp/Lib/Channels/V2/Bak/GenericChannel.cs similarity index 100% rename from csharp/lib/Channels/V2/Bak/GenericChannel.cs rename to csharp/Lib/Channels/V2/Bak/GenericChannel.cs diff --git a/csharp/lib/Channels/V2/Bak/StreamChannel.cs b/csharp/Lib/Channels/V2/Bak/StreamChannel.cs similarity index 100% rename from csharp/lib/Channels/V2/Bak/StreamChannel.cs rename to csharp/Lib/Channels/V2/Bak/StreamChannel.cs diff --git a/csharp/lib/Channels/V2/CommandChannel.cs b/csharp/Lib/Channels/V2/CommandChannel.cs similarity index 100% rename from csharp/lib/Channels/V2/CommandChannel.cs rename to csharp/Lib/Channels/V2/CommandChannel.cs diff --git a/csharp/lib/Channels/V2/IChannel.cs b/csharp/Lib/Channels/V2/IChannel.cs similarity index 100% rename from csharp/lib/Channels/V2/IChannel.cs rename to csharp/Lib/Channels/V2/IChannel.cs diff --git a/csharp/lib/Channels/V2/Pipes/AsyncPipeSource.cs b/csharp/Lib/Channels/V2/Pipes/AsyncPipeSource.cs similarity index 100% rename from csharp/lib/Channels/V2/Pipes/AsyncPipeSource.cs rename to csharp/Lib/Channels/V2/Pipes/AsyncPipeSource.cs diff --git a/csharp/lib/Channels/V2/Pipes/AsyncPipeTarget.cs b/csharp/Lib/Channels/V2/Pipes/AsyncPipeTarget.cs similarity index 100% rename from csharp/lib/Channels/V2/Pipes/AsyncPipeTarget.cs rename to csharp/Lib/Channels/V2/Pipes/AsyncPipeTarget.cs diff --git a/csharp/lib/Channels/V2/Pipes/ChannelPipeSource.cs b/csharp/Lib/Channels/V2/Pipes/ChannelPipeSource.cs similarity index 100% rename from csharp/lib/Channels/V2/Pipes/ChannelPipeSource.cs rename to csharp/Lib/Channels/V2/Pipes/ChannelPipeSource.cs diff --git a/csharp/lib/Channels/V2/Pipes/ChannelPipeTarget.cs b/csharp/Lib/Channels/V2/Pipes/ChannelPipeTarget.cs similarity index 100% rename from csharp/lib/Channels/V2/Pipes/ChannelPipeTarget.cs rename to csharp/Lib/Channels/V2/Pipes/ChannelPipeTarget.cs diff --git a/csharp/lib/Channels/V2/Stage.cs b/csharp/Lib/Channels/V2/Stage.cs similarity index 100% rename from csharp/lib/Channels/V2/Stage.cs rename to csharp/Lib/Channels/V2/Stage.cs diff --git a/csharp/lib/Channels/V2/StreamChannel.cs b/csharp/Lib/Channels/V2/StreamChannel.cs similarity index 100% rename from csharp/lib/Channels/V2/StreamChannel.cs rename to csharp/Lib/Channels/V2/StreamChannel.cs diff --git a/csharp/lib/Channels/V2/TcpChannel.cs b/csharp/Lib/Channels/V2/TcpChannel.cs similarity index 100% rename from csharp/lib/Channels/V2/TcpChannel.cs rename to csharp/Lib/Channels/V2/TcpChannel.cs diff --git a/csharp/lib/Devices/AMPT/Ampt.csproj b/csharp/Lib/Devices/AMPT/Ampt.csproj similarity index 88% rename from csharp/lib/Devices/AMPT/Ampt.csproj rename to csharp/Lib/Devices/AMPT/Ampt.csproj index 2190a3c06..ea8cbf21c 100644 --- a/csharp/lib/Devices/AMPT/Ampt.csproj +++ b/csharp/Lib/Devices/AMPT/Ampt.csproj @@ -1,5 +1,5 @@ - + diff --git a/csharp/lib/Devices/AMPT/AmptCommunicationUnit.cs b/csharp/Lib/Devices/AMPT/AmptCommunicationUnit.cs similarity index 100% rename from csharp/lib/Devices/AMPT/AmptCommunicationUnit.cs rename to csharp/Lib/Devices/AMPT/AmptCommunicationUnit.cs diff --git a/csharp/lib/Devices/AMPT/AmptDeviceStatus.cs b/csharp/Lib/Devices/AMPT/AmptDeviceStatus.cs similarity index 100% rename from csharp/lib/Devices/AMPT/AmptDeviceStatus.cs rename to csharp/Lib/Devices/AMPT/AmptDeviceStatus.cs diff --git a/csharp/lib/Devices/AMPT/AmptStatus.cs b/csharp/Lib/Devices/AMPT/AmptStatus.cs similarity index 100% rename from csharp/lib/Devices/AMPT/AmptStatus.cs rename to csharp/Lib/Devices/AMPT/AmptStatus.cs diff --git a/csharp/lib/Devices/AMPT/AmptStringStatus.cs b/csharp/Lib/Devices/AMPT/AmptStringStatus.cs similarity index 100% rename from csharp/lib/Devices/AMPT/AmptStringStatus.cs rename to csharp/Lib/Devices/AMPT/AmptStringStatus.cs diff --git a/csharp/lib/Devices/Adam6060/Adam6060.csproj b/csharp/Lib/Devices/Adam6060/Adam6060.csproj similarity index 75% rename from csharp/lib/Devices/Adam6060/Adam6060.csproj rename to csharp/Lib/Devices/Adam6060/Adam6060.csproj index de99fbbaa..1a36e43e1 100644 --- a/csharp/lib/Devices/Adam6060/Adam6060.csproj +++ b/csharp/Lib/Devices/Adam6060/Adam6060.csproj @@ -1,5 +1,5 @@ - + diff --git a/csharp/lib/Devices/Adam6060/Adam6060Control.cs b/csharp/Lib/Devices/Adam6060/Adam6060Control.cs similarity index 100% rename from csharp/lib/Devices/Adam6060/Adam6060Control.cs rename to csharp/Lib/Devices/Adam6060/Adam6060Control.cs diff --git a/csharp/lib/Devices/Adam6060/Adam6060Device.cs b/csharp/Lib/Devices/Adam6060/Adam6060Device.cs similarity index 100% rename from csharp/lib/Devices/Adam6060/Adam6060Device.cs rename to csharp/Lib/Devices/Adam6060/Adam6060Device.cs diff --git a/csharp/lib/Devices/Adam6060/Adam6060Status.cs b/csharp/Lib/Devices/Adam6060/Adam6060Status.cs similarity index 100% rename from csharp/lib/Devices/Adam6060/Adam6060Status.cs rename to csharp/Lib/Devices/Adam6060/Adam6060Status.cs diff --git a/csharp/lib/Devices/Battery48TL/Battery48TL.csproj b/csharp/Lib/Devices/Battery48TL/Battery48TL.csproj similarity index 84% rename from csharp/lib/Devices/Battery48TL/Battery48TL.csproj rename to csharp/Lib/Devices/Battery48TL/Battery48TL.csproj index bbfe44b02..ce3b83de6 100644 --- a/csharp/lib/Devices/Battery48TL/Battery48TL.csproj +++ b/csharp/Lib/Devices/Battery48TL/Battery48TL.csproj @@ -1,5 +1,5 @@ - + diff --git a/csharp/lib/Devices/Battery48TL/Battery48TLDevice.cs b/csharp/Lib/Devices/Battery48TL/Battery48TLDevice.cs similarity index 100% rename from csharp/lib/Devices/Battery48TL/Battery48TLDevice.cs rename to csharp/Lib/Devices/Battery48TL/Battery48TLDevice.cs diff --git a/csharp/lib/Devices/Battery48TL/Battery48TLStatusRecord.cs b/csharp/Lib/Devices/Battery48TL/Battery48TLStatusRecord.cs similarity index 100% rename from csharp/lib/Devices/Battery48TL/Battery48TLStatusRecord.cs rename to csharp/Lib/Devices/Battery48TL/Battery48TLStatusRecord.cs diff --git a/csharp/lib/Devices/Battery48TL/BatteryDataParser.cs b/csharp/Lib/Devices/Battery48TL/BatteryDataParser.cs similarity index 100% rename from csharp/lib/Devices/Battery48TL/BatteryDataParser.cs rename to csharp/Lib/Devices/Battery48TL/BatteryDataParser.cs diff --git a/csharp/lib/Devices/Battery48TL/Constants.cs b/csharp/Lib/Devices/Battery48TL/Constants.cs similarity index 100% rename from csharp/lib/Devices/Battery48TL/Constants.cs rename to csharp/Lib/Devices/Battery48TL/Constants.cs diff --git a/csharp/lib/Devices/Battery48TL/LedColor.cs b/csharp/Lib/Devices/Battery48TL/LedColor.cs similarity index 100% rename from csharp/lib/Devices/Battery48TL/LedColor.cs rename to csharp/Lib/Devices/Battery48TL/LedColor.cs diff --git a/csharp/lib/Devices/Battery48TL/LedState.cs b/csharp/Lib/Devices/Battery48TL/LedState.cs similarity index 100% rename from csharp/lib/Devices/Battery48TL/LedState.cs rename to csharp/Lib/Devices/Battery48TL/LedState.cs diff --git a/csharp/lib/Devices/EmuMeter/Conversions.cs b/csharp/Lib/Devices/EmuMeter/Conversions.cs similarity index 100% rename from csharp/lib/Devices/EmuMeter/Conversions.cs rename to csharp/Lib/Devices/EmuMeter/Conversions.cs diff --git a/csharp/lib/Devices/EmuMeter/EmuMeter.csproj b/csharp/Lib/Devices/EmuMeter/EmuMeter.csproj similarity index 84% rename from csharp/lib/Devices/EmuMeter/EmuMeter.csproj rename to csharp/Lib/Devices/EmuMeter/EmuMeter.csproj index bbfe44b02..ce3b83de6 100644 --- a/csharp/lib/Devices/EmuMeter/EmuMeter.csproj +++ b/csharp/Lib/Devices/EmuMeter/EmuMeter.csproj @@ -1,5 +1,5 @@ - + diff --git a/csharp/lib/Devices/EmuMeter/EmuMeterDevice.cs b/csharp/Lib/Devices/EmuMeter/EmuMeterDevice.cs similarity index 100% rename from csharp/lib/Devices/EmuMeter/EmuMeterDevice.cs rename to csharp/Lib/Devices/EmuMeter/EmuMeterDevice.cs diff --git a/csharp/lib/Devices/EmuMeter/EmuMeterStatus.cs b/csharp/Lib/Devices/EmuMeter/EmuMeterStatus.cs similarity index 100% rename from csharp/lib/Devices/EmuMeter/EmuMeterStatus.cs rename to csharp/Lib/Devices/EmuMeter/EmuMeterStatus.cs diff --git a/csharp/lib/Devices/Trumpf/TruConvert/AlarmState.cs b/csharp/Lib/Devices/Trumpf/TruConvert/AlarmState.cs similarity index 100% rename from csharp/lib/Devices/Trumpf/TruConvert/AlarmState.cs rename to csharp/Lib/Devices/Trumpf/TruConvert/AlarmState.cs diff --git a/csharp/lib/Devices/Trumpf/TruConvert/MainState.cs b/csharp/Lib/Devices/Trumpf/TruConvert/MainState.cs similarity index 100% rename from csharp/lib/Devices/Trumpf/TruConvert/MainState.cs rename to csharp/Lib/Devices/Trumpf/TruConvert/MainState.cs diff --git a/csharp/lib/Devices/Trumpf/TruConvert/Slave.cs b/csharp/Lib/Devices/Trumpf/TruConvert/Slave.cs similarity index 100% rename from csharp/lib/Devices/Trumpf/TruConvert/Slave.cs rename to csharp/Lib/Devices/Trumpf/TruConvert/Slave.cs diff --git a/csharp/lib/Devices/Trumpf/TruConvert/SystemConfig.cs b/csharp/Lib/Devices/Trumpf/TruConvert/SystemConfig.cs similarity index 100% rename from csharp/lib/Devices/Trumpf/TruConvert/SystemConfig.cs rename to csharp/Lib/Devices/Trumpf/TruConvert/SystemConfig.cs diff --git a/csharp/lib/Devices/Trumpf/TruConvert/TruConvert.csproj b/csharp/Lib/Devices/Trumpf/TruConvert/TruConvert.csproj similarity index 72% rename from csharp/lib/Devices/Trumpf/TruConvert/TruConvert.csproj rename to csharp/Lib/Devices/Trumpf/TruConvert/TruConvert.csproj index 660a234b8..ca3eb7a2a 100644 --- a/csharp/lib/Devices/Trumpf/TruConvert/TruConvert.csproj +++ b/csharp/Lib/Devices/Trumpf/TruConvert/TruConvert.csproj @@ -1,5 +1,5 @@ - + diff --git a/csharp/lib/Devices/Trumpf/TruConvert/Utils.cs b/csharp/Lib/Devices/Trumpf/TruConvert/Utils.cs similarity index 100% rename from csharp/lib/Devices/Trumpf/TruConvert/Utils.cs rename to csharp/Lib/Devices/Trumpf/TruConvert/Utils.cs diff --git a/csharp/lib/Devices/Trumpf/TruConvertAc/AcControlRegisters.cs b/csharp/Lib/Devices/Trumpf/TruConvertAc/AcControlRegisters.cs similarity index 100% rename from csharp/lib/Devices/Trumpf/TruConvertAc/AcControlRegisters.cs rename to csharp/Lib/Devices/Trumpf/TruConvertAc/AcControlRegisters.cs diff --git a/csharp/lib/Devices/Trumpf/TruConvertAc/AcEnums.cs b/csharp/Lib/Devices/Trumpf/TruConvertAc/AcEnums.cs similarity index 100% rename from csharp/lib/Devices/Trumpf/TruConvertAc/AcEnums.cs rename to csharp/Lib/Devices/Trumpf/TruConvertAc/AcEnums.cs diff --git a/csharp/lib/Devices/Trumpf/TruConvertAc/AlarmMessage.cs b/csharp/Lib/Devices/Trumpf/TruConvertAc/AlarmMessage.cs similarity index 100% rename from csharp/lib/Devices/Trumpf/TruConvertAc/AlarmMessage.cs rename to csharp/Lib/Devices/Trumpf/TruConvertAc/AlarmMessage.cs diff --git a/csharp/lib/Devices/Trumpf/TruConvertAc/TruConvertAc.csproj b/csharp/Lib/Devices/Trumpf/TruConvertAc/TruConvertAc.csproj similarity index 84% rename from csharp/lib/Devices/Trumpf/TruConvertAc/TruConvertAc.csproj rename to csharp/Lib/Devices/Trumpf/TruConvertAc/TruConvertAc.csproj index b29f9d3f8..3a70b12a0 100644 --- a/csharp/lib/Devices/Trumpf/TruConvertAc/TruConvertAc.csproj +++ b/csharp/Lib/Devices/Trumpf/TruConvertAc/TruConvertAc.csproj @@ -1,5 +1,5 @@ - + diff --git a/csharp/lib/Devices/Trumpf/TruConvertAc/TruConvertAcControl.cs b/csharp/Lib/Devices/Trumpf/TruConvertAc/TruConvertAcControl.cs similarity index 100% rename from csharp/lib/Devices/Trumpf/TruConvertAc/TruConvertAcControl.cs rename to csharp/Lib/Devices/Trumpf/TruConvertAc/TruConvertAcControl.cs diff --git a/csharp/lib/Devices/Trumpf/TruConvertAc/TruConvertAcDevice.cs b/csharp/Lib/Devices/Trumpf/TruConvertAc/TruConvertAcDevice.cs similarity index 100% rename from csharp/lib/Devices/Trumpf/TruConvertAc/TruConvertAcDevice.cs rename to csharp/Lib/Devices/Trumpf/TruConvertAc/TruConvertAcDevice.cs diff --git a/csharp/lib/Devices/Trumpf/TruConvertAc/TruConvertAcStatus.cs b/csharp/Lib/Devices/Trumpf/TruConvertAc/TruConvertAcStatus.cs similarity index 100% rename from csharp/lib/Devices/Trumpf/TruConvertAc/TruConvertAcStatus.cs rename to csharp/Lib/Devices/Trumpf/TruConvertAc/TruConvertAcStatus.cs diff --git a/csharp/lib/Devices/Trumpf/TruConvertAc/WarningMessage.cs b/csharp/Lib/Devices/Trumpf/TruConvertAc/WarningMessage.cs similarity index 100% rename from csharp/lib/Devices/Trumpf/TruConvertAc/WarningMessage.cs rename to csharp/Lib/Devices/Trumpf/TruConvertAc/WarningMessage.cs diff --git a/csharp/lib/Devices/Trumpf/TruConvertDc/AlarmMessage.cs b/csharp/Lib/Devices/Trumpf/TruConvertDc/AlarmMessage.cs similarity index 100% rename from csharp/lib/Devices/Trumpf/TruConvertDc/AlarmMessage.cs rename to csharp/Lib/Devices/Trumpf/TruConvertDc/AlarmMessage.cs diff --git a/csharp/lib/Devices/Trumpf/TruConvertDc/DcControlRegisters.cs b/csharp/Lib/Devices/Trumpf/TruConvertDc/DcControlRegisters.cs similarity index 100% rename from csharp/lib/Devices/Trumpf/TruConvertDc/DcControlRegisters.cs rename to csharp/Lib/Devices/Trumpf/TruConvertDc/DcControlRegisters.cs diff --git a/csharp/lib/Devices/Trumpf/TruConvertDc/DcEnums.cs b/csharp/Lib/Devices/Trumpf/TruConvertDc/DcEnums.cs similarity index 100% rename from csharp/lib/Devices/Trumpf/TruConvertDc/DcEnums.cs rename to csharp/Lib/Devices/Trumpf/TruConvertDc/DcEnums.cs diff --git a/csharp/lib/Devices/Trumpf/TruConvertDc/TruConvertDc.csproj b/csharp/Lib/Devices/Trumpf/TruConvertDc/TruConvertDc.csproj similarity index 84% rename from csharp/lib/Devices/Trumpf/TruConvertDc/TruConvertDc.csproj rename to csharp/Lib/Devices/Trumpf/TruConvertDc/TruConvertDc.csproj index 8f13140f6..1628a2b19 100644 --- a/csharp/lib/Devices/Trumpf/TruConvertDc/TruConvertDc.csproj +++ b/csharp/Lib/Devices/Trumpf/TruConvertDc/TruConvertDc.csproj @@ -1,5 +1,5 @@ - + diff --git a/csharp/lib/Devices/Trumpf/TruConvertDc/TruConvertDcControl.cs b/csharp/Lib/Devices/Trumpf/TruConvertDc/TruConvertDcControl.cs similarity index 100% rename from csharp/lib/Devices/Trumpf/TruConvertDc/TruConvertDcControl.cs rename to csharp/Lib/Devices/Trumpf/TruConvertDc/TruConvertDcControl.cs diff --git a/csharp/lib/Devices/Trumpf/TruConvertDc/TruConvertDcDevice.cs b/csharp/Lib/Devices/Trumpf/TruConvertDc/TruConvertDcDevice.cs similarity index 100% rename from csharp/lib/Devices/Trumpf/TruConvertDc/TruConvertDcDevice.cs rename to csharp/Lib/Devices/Trumpf/TruConvertDc/TruConvertDcDevice.cs diff --git a/csharp/lib/Devices/Trumpf/TruConvertDc/TruConvertDcStatus.cs b/csharp/Lib/Devices/Trumpf/TruConvertDc/TruConvertDcStatus.cs similarity index 100% rename from csharp/lib/Devices/Trumpf/TruConvertDc/TruConvertDcStatus.cs rename to csharp/Lib/Devices/Trumpf/TruConvertDc/TruConvertDcStatus.cs diff --git a/csharp/lib/Devices/Trumpf/TruConvertDc/WarningMessage.cs b/csharp/Lib/Devices/Trumpf/TruConvertDc/WarningMessage.cs similarity index 100% rename from csharp/lib/Devices/Trumpf/TruConvertDc/WarningMessage.cs rename to csharp/Lib/Devices/Trumpf/TruConvertDc/WarningMessage.cs diff --git a/csharp/lib/InnovEnergy.lib.props b/csharp/Lib/InnovEnergy.Lib.props similarity index 100% rename from csharp/lib/InnovEnergy.lib.props rename to csharp/Lib/InnovEnergy.Lib.props diff --git a/csharp/lib/Protocols/DBus/Bus.cs b/csharp/Lib/Protocols/DBus/Bus.cs similarity index 100% rename from csharp/lib/Protocols/DBus/Bus.cs rename to csharp/Lib/Protocols/DBus/Bus.cs diff --git a/csharp/lib/Protocols/DBus/DBus.csproj b/csharp/Lib/Protocols/DBus/DBus.csproj similarity index 89% rename from csharp/lib/Protocols/DBus/DBus.csproj rename to csharp/Lib/Protocols/DBus/DBus.csproj index e33bdceca..01a9e0400 100644 --- a/csharp/lib/Protocols/DBus/DBus.csproj +++ b/csharp/Lib/Protocols/DBus/DBus.csproj @@ -1,5 +1,5 @@ - + DBus Library diff --git a/csharp/lib/Protocols/DBus/DBusConnection.cs b/csharp/Lib/Protocols/DBus/DBusConnection.cs similarity index 100% rename from csharp/lib/Protocols/DBus/DBusConnection.cs rename to csharp/Lib/Protocols/DBus/DBusConnection.cs diff --git a/csharp/lib/Protocols/DBus/DBusMessageStream.cs b/csharp/Lib/Protocols/DBus/DBusMessageStream.cs similarity index 100% rename from csharp/lib/Protocols/DBus/DBusMessageStream.cs rename to csharp/Lib/Protocols/DBus/DBusMessageStream.cs diff --git a/csharp/lib/Protocols/DBus/DBusService.cs b/csharp/Lib/Protocols/DBus/DBusService.cs similarity index 100% rename from csharp/lib/Protocols/DBus/DBusService.cs rename to csharp/Lib/Protocols/DBus/DBusService.cs diff --git a/csharp/lib/Protocols/DBus/Daemon/DBusDaemonApi.cs b/csharp/Lib/Protocols/DBus/Daemon/DBusDaemonApi.cs similarity index 100% rename from csharp/lib/Protocols/DBus/Daemon/DBusDaemonApi.cs rename to csharp/Lib/Protocols/DBus/Daemon/DBusDaemonApi.cs diff --git a/csharp/lib/Protocols/DBus/Daemon/DBusDaemonConnection.Resolver.cs b/csharp/Lib/Protocols/DBus/Daemon/DBusDaemonConnection.Resolver.cs similarity index 100% rename from csharp/lib/Protocols/DBus/Daemon/DBusDaemonConnection.Resolver.cs rename to csharp/Lib/Protocols/DBus/Daemon/DBusDaemonConnection.Resolver.cs diff --git a/csharp/lib/Protocols/DBus/Daemon/DBusDaemonConnection.cs b/csharp/Lib/Protocols/DBus/Daemon/DBusDaemonConnection.cs similarity index 100% rename from csharp/lib/Protocols/DBus/Daemon/DBusDaemonConnection.cs rename to csharp/Lib/Protocols/DBus/Daemon/DBusDaemonConnection.cs diff --git a/csharp/lib/Protocols/DBus/Daemon/MatchRule.cs b/csharp/Lib/Protocols/DBus/Daemon/MatchRule.cs similarity index 100% rename from csharp/lib/Protocols/DBus/Daemon/MatchRule.cs rename to csharp/Lib/Protocols/DBus/Daemon/MatchRule.cs diff --git a/csharp/lib/Protocols/DBus/Daemon/ObservableDictionary.cs b/csharp/Lib/Protocols/DBus/Daemon/ObservableDictionary.cs similarity index 100% rename from csharp/lib/Protocols/DBus/Daemon/ObservableDictionary.cs rename to csharp/Lib/Protocols/DBus/Daemon/ObservableDictionary.cs diff --git a/csharp/lib/Protocols/DBus/Daemon/ReleaseNameReply.cs b/csharp/Lib/Protocols/DBus/Daemon/ReleaseNameReply.cs similarity index 100% rename from csharp/lib/Protocols/DBus/Daemon/ReleaseNameReply.cs rename to csharp/Lib/Protocols/DBus/Daemon/ReleaseNameReply.cs diff --git a/csharp/lib/Protocols/DBus/Daemon/RequestNameOptions.cs b/csharp/Lib/Protocols/DBus/Daemon/RequestNameOptions.cs similarity index 100% rename from csharp/lib/Protocols/DBus/Daemon/RequestNameOptions.cs rename to csharp/Lib/Protocols/DBus/Daemon/RequestNameOptions.cs diff --git a/csharp/lib/Protocols/DBus/Daemon/RequestNameReply.cs b/csharp/Lib/Protocols/DBus/Daemon/RequestNameReply.cs similarity index 100% rename from csharp/lib/Protocols/DBus/Daemon/RequestNameReply.cs rename to csharp/Lib/Protocols/DBus/Daemon/RequestNameReply.cs diff --git a/csharp/lib/Protocols/DBus/Env.cs b/csharp/Lib/Protocols/DBus/Env.cs similarity index 100% rename from csharp/lib/Protocols/DBus/Env.cs rename to csharp/Lib/Protocols/DBus/Env.cs diff --git a/csharp/lib/Protocols/DBus/Interop.cs b/csharp/Lib/Protocols/DBus/Interop.cs similarity index 100% rename from csharp/lib/Protocols/DBus/Interop.cs rename to csharp/Lib/Protocols/DBus/Interop.cs diff --git a/csharp/lib/Protocols/DBus/Protocol/DataTypes/Convert/StringToSignature.cs b/csharp/Lib/Protocols/DBus/Protocol/DataTypes/Convert/StringToSignature.cs similarity index 100% rename from csharp/lib/Protocols/DBus/Protocol/DataTypes/Convert/StringToSignature.cs rename to csharp/Lib/Protocols/DBus/Protocol/DataTypes/Convert/StringToSignature.cs diff --git a/csharp/lib/Protocols/DBus/Protocol/DataTypes/Convert/TypeToSignature.cs b/csharp/Lib/Protocols/DBus/Protocol/DataTypes/Convert/TypeToSignature.cs similarity index 100% rename from csharp/lib/Protocols/DBus/Protocol/DataTypes/Convert/TypeToSignature.cs rename to csharp/Lib/Protocols/DBus/Protocol/DataTypes/Convert/TypeToSignature.cs diff --git a/csharp/lib/Protocols/DBus/Protocol/DataTypes/ObjectPath.cs b/csharp/Lib/Protocols/DBus/Protocol/DataTypes/ObjectPath.cs similarity index 100% rename from csharp/lib/Protocols/DBus/Protocol/DataTypes/ObjectPath.cs rename to csharp/Lib/Protocols/DBus/Protocol/DataTypes/ObjectPath.cs diff --git a/csharp/lib/Protocols/DBus/Protocol/DataTypes/Signatures/Signature.Equality.cs b/csharp/Lib/Protocols/DBus/Protocol/DataTypes/Signatures/Signature.Equality.cs similarity index 100% rename from csharp/lib/Protocols/DBus/Protocol/DataTypes/Signatures/Signature.Equality.cs rename to csharp/Lib/Protocols/DBus/Protocol/DataTypes/Signatures/Signature.Equality.cs diff --git a/csharp/lib/Protocols/DBus/Protocol/DataTypes/Signatures/Signature.Terminals.cs b/csharp/Lib/Protocols/DBus/Protocol/DataTypes/Signatures/Signature.Terminals.cs similarity index 100% rename from csharp/lib/Protocols/DBus/Protocol/DataTypes/Signatures/Signature.Terminals.cs rename to csharp/Lib/Protocols/DBus/Protocol/DataTypes/Signatures/Signature.Terminals.cs diff --git a/csharp/lib/Protocols/DBus/Protocol/DataTypes/Signatures/Signature.cs b/csharp/Lib/Protocols/DBus/Protocol/DataTypes/Signatures/Signature.cs similarity index 100% rename from csharp/lib/Protocols/DBus/Protocol/DataTypes/Signatures/Signature.cs rename to csharp/Lib/Protocols/DBus/Protocol/DataTypes/Signatures/Signature.cs diff --git a/csharp/lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/ArraySignature.cs b/csharp/Lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/ArraySignature.cs similarity index 100% rename from csharp/lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/ArraySignature.cs rename to csharp/Lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/ArraySignature.cs diff --git a/csharp/lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/BasicTypeSignature.cs b/csharp/Lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/BasicTypeSignature.cs similarity index 100% rename from csharp/lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/BasicTypeSignature.cs rename to csharp/Lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/BasicTypeSignature.cs diff --git a/csharp/lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/BooleanSignature.cs b/csharp/Lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/BooleanSignature.cs similarity index 100% rename from csharp/lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/BooleanSignature.cs rename to csharp/Lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/BooleanSignature.cs diff --git a/csharp/lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/ByteSignature.cs b/csharp/Lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/ByteSignature.cs similarity index 100% rename from csharp/lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/ByteSignature.cs rename to csharp/Lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/ByteSignature.cs diff --git a/csharp/lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/CompositeSignature.cs b/csharp/Lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/CompositeSignature.cs similarity index 100% rename from csharp/lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/CompositeSignature.cs rename to csharp/Lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/CompositeSignature.cs diff --git a/csharp/lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/ContainerTypeSignature.cs b/csharp/Lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/ContainerTypeSignature.cs similarity index 100% rename from csharp/lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/ContainerTypeSignature.cs rename to csharp/Lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/ContainerTypeSignature.cs diff --git a/csharp/lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/DictionarySignature.cs b/csharp/Lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/DictionarySignature.cs similarity index 100% rename from csharp/lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/DictionarySignature.cs rename to csharp/Lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/DictionarySignature.cs diff --git a/csharp/lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/DoubleSignature.cs b/csharp/Lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/DoubleSignature.cs similarity index 100% rename from csharp/lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/DoubleSignature.cs rename to csharp/Lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/DoubleSignature.cs diff --git a/csharp/lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/EmptySignature.cs b/csharp/Lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/EmptySignature.cs similarity index 100% rename from csharp/lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/EmptySignature.cs rename to csharp/Lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/EmptySignature.cs diff --git a/csharp/lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/FixedTypeSignature.cs b/csharp/Lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/FixedTypeSignature.cs similarity index 100% rename from csharp/lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/FixedTypeSignature.cs rename to csharp/Lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/FixedTypeSignature.cs diff --git a/csharp/lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/Int16Signature.cs b/csharp/Lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/Int16Signature.cs similarity index 100% rename from csharp/lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/Int16Signature.cs rename to csharp/Lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/Int16Signature.cs diff --git a/csharp/lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/Int32Signature.cs b/csharp/Lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/Int32Signature.cs similarity index 100% rename from csharp/lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/Int32Signature.cs rename to csharp/Lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/Int32Signature.cs diff --git a/csharp/lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/Int64Signature.cs b/csharp/Lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/Int64Signature.cs similarity index 100% rename from csharp/lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/Int64Signature.cs rename to csharp/Lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/Int64Signature.cs diff --git a/csharp/lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/ObjectPathSignature.cs b/csharp/Lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/ObjectPathSignature.cs similarity index 100% rename from csharp/lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/ObjectPathSignature.cs rename to csharp/Lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/ObjectPathSignature.cs diff --git a/csharp/lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/SignatureTypeSignature.cs b/csharp/Lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/SignatureTypeSignature.cs similarity index 100% rename from csharp/lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/SignatureTypeSignature.cs rename to csharp/Lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/SignatureTypeSignature.cs diff --git a/csharp/lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/StringLikeTypeSignature.cs b/csharp/Lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/StringLikeTypeSignature.cs similarity index 100% rename from csharp/lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/StringLikeTypeSignature.cs rename to csharp/Lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/StringLikeTypeSignature.cs diff --git a/csharp/lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/StringSignature.cs b/csharp/Lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/StringSignature.cs similarity index 100% rename from csharp/lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/StringSignature.cs rename to csharp/Lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/StringSignature.cs diff --git a/csharp/lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/StructSignature.cs b/csharp/Lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/StructSignature.cs similarity index 100% rename from csharp/lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/StructSignature.cs rename to csharp/Lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/StructSignature.cs diff --git a/csharp/lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/UInt16Signature.cs b/csharp/Lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/UInt16Signature.cs similarity index 100% rename from csharp/lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/UInt16Signature.cs rename to csharp/Lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/UInt16Signature.cs diff --git a/csharp/lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/UInt32Signature.cs b/csharp/Lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/UInt32Signature.cs similarity index 100% rename from csharp/lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/UInt32Signature.cs rename to csharp/Lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/UInt32Signature.cs diff --git a/csharp/lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/UInt64Signature.cs b/csharp/Lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/UInt64Signature.cs similarity index 100% rename from csharp/lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/UInt64Signature.cs rename to csharp/Lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/UInt64Signature.cs diff --git a/csharp/lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/VariantSignature.cs b/csharp/Lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/VariantSignature.cs similarity index 100% rename from csharp/lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/VariantSignature.cs rename to csharp/Lib/Protocols/DBus/Protocol/DataTypes/Signatures/Specialized/VariantSignature.cs diff --git a/csharp/lib/Protocols/DBus/Protocol/DataTypes/Variant.cs b/csharp/Lib/Protocols/DBus/Protocol/DataTypes/Variant.cs similarity index 100% rename from csharp/lib/Protocols/DBus/Protocol/DataTypes/Variant.cs rename to csharp/Lib/Protocols/DBus/Protocol/DataTypes/Variant.cs diff --git a/csharp/lib/Protocols/DBus/Protocol/Header/Endian.cs b/csharp/Lib/Protocols/DBus/Protocol/Header/Endian.cs similarity index 100% rename from csharp/lib/Protocols/DBus/Protocol/Header/Endian.cs rename to csharp/Lib/Protocols/DBus/Protocol/Header/Endian.cs diff --git a/csharp/lib/Protocols/DBus/Protocol/Header/FieldCode.cs b/csharp/Lib/Protocols/DBus/Protocol/Header/FieldCode.cs similarity index 100% rename from csharp/lib/Protocols/DBus/Protocol/Header/FieldCode.cs rename to csharp/Lib/Protocols/DBus/Protocol/Header/FieldCode.cs diff --git a/csharp/lib/Protocols/DBus/Protocol/Header/HeaderExtensions.cs b/csharp/Lib/Protocols/DBus/Protocol/Header/HeaderExtensions.cs similarity index 100% rename from csharp/lib/Protocols/DBus/Protocol/Header/HeaderExtensions.cs rename to csharp/Lib/Protocols/DBus/Protocol/Header/HeaderExtensions.cs diff --git a/csharp/lib/Protocols/DBus/Protocol/Header/HeaderFlags.cs b/csharp/Lib/Protocols/DBus/Protocol/Header/HeaderFlags.cs similarity index 100% rename from csharp/lib/Protocols/DBus/Protocol/Header/HeaderFlags.cs rename to csharp/Lib/Protocols/DBus/Protocol/Header/HeaderFlags.cs diff --git a/csharp/lib/Protocols/DBus/Protocol/Header/MessageType.cs b/csharp/Lib/Protocols/DBus/Protocol/Header/MessageType.cs similarity index 100% rename from csharp/lib/Protocols/DBus/Protocol/Header/MessageType.cs rename to csharp/Lib/Protocols/DBus/Protocol/Header/MessageType.cs diff --git a/csharp/lib/Protocols/DBus/Protocol/Message.cs b/csharp/Lib/Protocols/DBus/Protocol/Message.cs similarity index 100% rename from csharp/lib/Protocols/DBus/Protocol/Message.cs rename to csharp/Lib/Protocols/DBus/Protocol/Message.cs diff --git a/csharp/lib/Protocols/DBus/Protocol/Replies.cs b/csharp/Lib/Protocols/DBus/Protocol/Replies.cs similarity index 100% rename from csharp/lib/Protocols/DBus/Protocol/Replies.cs rename to csharp/Lib/Protocols/DBus/Protocol/Replies.cs diff --git a/csharp/lib/Protocols/DBus/Protocol/SerialSource.cs b/csharp/Lib/Protocols/DBus/Protocol/SerialSource.cs similarity index 100% rename from csharp/lib/Protocols/DBus/Protocol/SerialSource.cs rename to csharp/Lib/Protocols/DBus/Protocol/SerialSource.cs diff --git a/csharp/lib/Protocols/DBus/Transport/AuthenticationMethod.cs b/csharp/Lib/Protocols/DBus/Transport/AuthenticationMethod.cs similarity index 100% rename from csharp/lib/Protocols/DBus/Transport/AuthenticationMethod.cs rename to csharp/Lib/Protocols/DBus/Transport/AuthenticationMethod.cs diff --git a/csharp/lib/Protocols/DBus/Transport/BufferedSocketReader.cs b/csharp/Lib/Protocols/DBus/Transport/BufferedSocketReader.cs similarity index 100% rename from csharp/lib/Protocols/DBus/Transport/BufferedSocketReader.cs rename to csharp/Lib/Protocols/DBus/Transport/BufferedSocketReader.cs diff --git a/csharp/lib/Protocols/DBus/Transport/DBusBufferReader.cs b/csharp/Lib/Protocols/DBus/Transport/DBusBufferReader.cs similarity index 100% rename from csharp/lib/Protocols/DBus/Transport/DBusBufferReader.cs rename to csharp/Lib/Protocols/DBus/Transport/DBusBufferReader.cs diff --git a/csharp/lib/Protocols/DBus/Transport/DBusBufferWriter.cs b/csharp/Lib/Protocols/DBus/Transport/DBusBufferWriter.cs similarity index 100% rename from csharp/lib/Protocols/DBus/Transport/DBusBufferWriter.cs rename to csharp/Lib/Protocols/DBus/Transport/DBusBufferWriter.cs diff --git a/csharp/lib/Protocols/DBus/Transport/DBusSocket.cs b/csharp/Lib/Protocols/DBus/Transport/DBusSocket.cs similarity index 100% rename from csharp/lib/Protocols/DBus/Transport/DBusSocket.cs rename to csharp/Lib/Protocols/DBus/Transport/DBusSocket.cs diff --git a/csharp/lib/Protocols/DBus/Utils/DisposableStack.cs b/csharp/Lib/Protocols/DBus/Utils/DisposableStack.cs similarity index 100% rename from csharp/lib/Protocols/DBus/Utils/DisposableStack.cs rename to csharp/Lib/Protocols/DBus/Utils/DisposableStack.cs diff --git a/csharp/lib/Protocols/DBus/Utils/Extensions.cs b/csharp/Lib/Protocols/DBus/Utils/Extensions.cs similarity index 100% rename from csharp/lib/Protocols/DBus/Utils/Extensions.cs rename to csharp/Lib/Protocols/DBus/Utils/Extensions.cs diff --git a/csharp/lib/Protocols/DBus/Utils/HexView.cs b/csharp/Lib/Protocols/DBus/Utils/HexView.cs similarity index 100% rename from csharp/lib/Protocols/DBus/Utils/HexView.cs rename to csharp/Lib/Protocols/DBus/Utils/HexView.cs diff --git a/csharp/lib/Protocols/DBus/WireFormat/DBusMeasureWriter.cs b/csharp/Lib/Protocols/DBus/WireFormat/DBusMeasureWriter.cs similarity index 100% rename from csharp/lib/Protocols/DBus/WireFormat/DBusMeasureWriter.cs rename to csharp/Lib/Protocols/DBus/WireFormat/DBusMeasureWriter.cs diff --git a/csharp/lib/Protocols/DBus/WireFormat/DBusReader.cs b/csharp/Lib/Protocols/DBus/WireFormat/DBusReader.cs similarity index 100% rename from csharp/lib/Protocols/DBus/WireFormat/DBusReader.cs rename to csharp/Lib/Protocols/DBus/WireFormat/DBusReader.cs diff --git a/csharp/lib/Protocols/DBus/WireFormat/DBusSocketReader.cs b/csharp/Lib/Protocols/DBus/WireFormat/DBusSocketReader.cs similarity index 100% rename from csharp/lib/Protocols/DBus/WireFormat/DBusSocketReader.cs rename to csharp/Lib/Protocols/DBus/WireFormat/DBusSocketReader.cs diff --git a/csharp/lib/Protocols/DBus/WireFormat/DBusWriter.cs b/csharp/Lib/Protocols/DBus/WireFormat/DBusWriter.cs similarity index 100% rename from csharp/lib/Protocols/DBus/WireFormat/DBusWriter.cs rename to csharp/Lib/Protocols/DBus/WireFormat/DBusWriter.cs diff --git a/csharp/lib/Protocols/Modbus/Clients/ModbusClient.cs b/csharp/Lib/Protocols/Modbus/Clients/ModbusClient.cs similarity index 100% rename from csharp/lib/Protocols/Modbus/Clients/ModbusClient.cs rename to csharp/Lib/Protocols/Modbus/Clients/ModbusClient.cs diff --git a/csharp/lib/Protocols/Modbus/Clients/ModbusRtuClient.cs b/csharp/Lib/Protocols/Modbus/Clients/ModbusRtuClient.cs similarity index 100% rename from csharp/lib/Protocols/Modbus/Clients/ModbusRtuClient.cs rename to csharp/Lib/Protocols/Modbus/Clients/ModbusRtuClient.cs diff --git a/csharp/lib/Protocols/Modbus/Clients/ModbusTcpClient.cs b/csharp/Lib/Protocols/Modbus/Clients/ModbusTcpClient.cs similarity index 100% rename from csharp/lib/Protocols/Modbus/Clients/ModbusTcpClient.cs rename to csharp/Lib/Protocols/Modbus/Clients/ModbusTcpClient.cs diff --git a/csharp/lib/Protocols/Modbus/Connections/ModbusConnection.cs b/csharp/Lib/Protocols/Modbus/Connections/ModbusConnection.cs similarity index 100% rename from csharp/lib/Protocols/Modbus/Connections/ModbusConnection.cs rename to csharp/Lib/Protocols/Modbus/Connections/ModbusConnection.cs diff --git a/csharp/lib/Protocols/Modbus/Connections/ModbusSerialConnection.cs b/csharp/Lib/Protocols/Modbus/Connections/ModbusSerialConnection.cs similarity index 100% rename from csharp/lib/Protocols/Modbus/Connections/ModbusSerialConnection.cs rename to csharp/Lib/Protocols/Modbus/Connections/ModbusSerialConnection.cs diff --git a/csharp/lib/Protocols/Modbus/Connections/ModbusTcpConnection.cs b/csharp/Lib/Protocols/Modbus/Connections/ModbusTcpConnection.cs similarity index 100% rename from csharp/lib/Protocols/Modbus/Connections/ModbusTcpConnection.cs rename to csharp/Lib/Protocols/Modbus/Connections/ModbusTcpConnection.cs diff --git a/csharp/lib/Protocols/Modbus/Conversions/Endianness.cs b/csharp/Lib/Protocols/Modbus/Conversions/Endianness.cs similarity index 100% rename from csharp/lib/Protocols/Modbus/Conversions/Endianness.cs rename to csharp/Lib/Protocols/Modbus/Conversions/Endianness.cs diff --git a/csharp/lib/Protocols/Modbus/Conversions/ModbusRegisters.Bit.cs b/csharp/Lib/Protocols/Modbus/Conversions/ModbusRegisters.Bit.cs similarity index 100% rename from csharp/lib/Protocols/Modbus/Conversions/ModbusRegisters.Bit.cs rename to csharp/Lib/Protocols/Modbus/Conversions/ModbusRegisters.Bit.cs diff --git a/csharp/lib/Protocols/Modbus/Conversions/ModbusRegisters.Boolean.cs b/csharp/Lib/Protocols/Modbus/Conversions/ModbusRegisters.Boolean.cs similarity index 100% rename from csharp/lib/Protocols/Modbus/Conversions/ModbusRegisters.Boolean.cs rename to csharp/Lib/Protocols/Modbus/Conversions/ModbusRegisters.Boolean.cs diff --git a/csharp/lib/Protocols/Modbus/Conversions/ModbusRegisters.Bytes.cs b/csharp/Lib/Protocols/Modbus/Conversions/ModbusRegisters.Bytes.cs similarity index 100% rename from csharp/lib/Protocols/Modbus/Conversions/ModbusRegisters.Bytes.cs rename to csharp/Lib/Protocols/Modbus/Conversions/ModbusRegisters.Bytes.cs diff --git a/csharp/lib/Protocols/Modbus/Conversions/ModbusRegisters.Int16.cs b/csharp/Lib/Protocols/Modbus/Conversions/ModbusRegisters.Int16.cs similarity index 100% rename from csharp/lib/Protocols/Modbus/Conversions/ModbusRegisters.Int16.cs rename to csharp/Lib/Protocols/Modbus/Conversions/ModbusRegisters.Int16.cs diff --git a/csharp/lib/Protocols/Modbus/Conversions/ModbusRegisters.Int32.cs b/csharp/Lib/Protocols/Modbus/Conversions/ModbusRegisters.Int32.cs similarity index 100% rename from csharp/lib/Protocols/Modbus/Conversions/ModbusRegisters.Int32.cs rename to csharp/Lib/Protocols/Modbus/Conversions/ModbusRegisters.Int32.cs diff --git a/csharp/lib/Protocols/Modbus/Conversions/ModbusRegisters.Single.cs b/csharp/Lib/Protocols/Modbus/Conversions/ModbusRegisters.Single.cs similarity index 100% rename from csharp/lib/Protocols/Modbus/Conversions/ModbusRegisters.Single.cs rename to csharp/Lib/Protocols/Modbus/Conversions/ModbusRegisters.Single.cs diff --git a/csharp/lib/Protocols/Modbus/Conversions/ModbusRegisters.String.cs b/csharp/Lib/Protocols/Modbus/Conversions/ModbusRegisters.String.cs similarity index 100% rename from csharp/lib/Protocols/Modbus/Conversions/ModbusRegisters.String.cs rename to csharp/Lib/Protocols/Modbus/Conversions/ModbusRegisters.String.cs diff --git a/csharp/lib/Protocols/Modbus/Conversions/ModbusRegisters.UInt16.cs b/csharp/Lib/Protocols/Modbus/Conversions/ModbusRegisters.UInt16.cs similarity index 100% rename from csharp/lib/Protocols/Modbus/Conversions/ModbusRegisters.UInt16.cs rename to csharp/Lib/Protocols/Modbus/Conversions/ModbusRegisters.UInt16.cs diff --git a/csharp/lib/Protocols/Modbus/Conversions/ModbusRegisters.UInt32.cs b/csharp/Lib/Protocols/Modbus/Conversions/ModbusRegisters.UInt32.cs similarity index 100% rename from csharp/lib/Protocols/Modbus/Conversions/ModbusRegisters.UInt32.cs rename to csharp/Lib/Protocols/Modbus/Conversions/ModbusRegisters.UInt32.cs diff --git a/csharp/lib/Protocols/Modbus/Conversions/ModbusRegisters.cs b/csharp/Lib/Protocols/Modbus/Conversions/ModbusRegisters.cs similarity index 100% rename from csharp/lib/Protocols/Modbus/Conversions/ModbusRegisters.cs rename to csharp/Lib/Protocols/Modbus/Conversions/ModbusRegisters.cs diff --git a/csharp/lib/Protocols/Modbus/Modbus.csproj b/csharp/Lib/Protocols/Modbus/Modbus.csproj similarity index 82% rename from csharp/lib/Protocols/Modbus/Modbus.csproj rename to csharp/Lib/Protocols/Modbus/Modbus.csproj index d40e6dc28..460195f09 100644 --- a/csharp/lib/Protocols/Modbus/Modbus.csproj +++ b/csharp/Lib/Protocols/Modbus/Modbus.csproj @@ -1,5 +1,5 @@ - + diff --git a/csharp/lib/Protocols/Modbus/Protocol/ExceptionCode.cs b/csharp/Lib/Protocols/Modbus/Protocol/ExceptionCode.cs similarity index 100% rename from csharp/lib/Protocols/Modbus/Protocol/ExceptionCode.cs rename to csharp/Lib/Protocols/Modbus/Protocol/ExceptionCode.cs diff --git a/csharp/lib/Protocols/Modbus/Protocol/Exceptions.cs b/csharp/Lib/Protocols/Modbus/Protocol/Exceptions.cs similarity index 100% rename from csharp/lib/Protocols/Modbus/Protocol/Exceptions.cs rename to csharp/Lib/Protocols/Modbus/Protocol/Exceptions.cs diff --git a/csharp/lib/Protocols/Modbus/Protocol/Frames/Accessors/Accessors.cs b/csharp/Lib/Protocols/Modbus/Protocol/Frames/Accessors/Accessors.cs similarity index 100% rename from csharp/lib/Protocols/Modbus/Protocol/Frames/Accessors/Accessors.cs rename to csharp/Lib/Protocols/Modbus/Protocol/Frames/Accessors/Accessors.cs diff --git a/csharp/lib/Protocols/Modbus/Protocol/Frames/Accessors/MbAddress.cs b/csharp/Lib/Protocols/Modbus/Protocol/Frames/Accessors/MbAddress.cs similarity index 100% rename from csharp/lib/Protocols/Modbus/Protocol/Frames/Accessors/MbAddress.cs rename to csharp/Lib/Protocols/Modbus/Protocol/Frames/Accessors/MbAddress.cs diff --git a/csharp/lib/Protocols/Modbus/Protocol/Frames/Accessors/MbBits.cs b/csharp/Lib/Protocols/Modbus/Protocol/Frames/Accessors/MbBits.cs similarity index 100% rename from csharp/lib/Protocols/Modbus/Protocol/Frames/Accessors/MbBits.cs rename to csharp/Lib/Protocols/Modbus/Protocol/Frames/Accessors/MbBits.cs diff --git a/csharp/lib/Protocols/Modbus/Protocol/Frames/Accessors/MbByte.cs b/csharp/Lib/Protocols/Modbus/Protocol/Frames/Accessors/MbByte.cs similarity index 100% rename from csharp/lib/Protocols/Modbus/Protocol/Frames/Accessors/MbByte.cs rename to csharp/Lib/Protocols/Modbus/Protocol/Frames/Accessors/MbByte.cs diff --git a/csharp/lib/Protocols/Modbus/Protocol/Frames/Accessors/MbByte{T}.cs b/csharp/Lib/Protocols/Modbus/Protocol/Frames/Accessors/MbByte{T}.cs similarity index 100% rename from csharp/lib/Protocols/Modbus/Protocol/Frames/Accessors/MbByte{T}.cs rename to csharp/Lib/Protocols/Modbus/Protocol/Frames/Accessors/MbByte{T}.cs diff --git a/csharp/lib/Protocols/Modbus/Protocol/Frames/Accessors/MbWord.cs b/csharp/Lib/Protocols/Modbus/Protocol/Frames/Accessors/MbWord.cs similarity index 100% rename from csharp/lib/Protocols/Modbus/Protocol/Frames/Accessors/MbWord.cs rename to csharp/Lib/Protocols/Modbus/Protocol/Frames/Accessors/MbWord.cs diff --git a/csharp/lib/Protocols/Modbus/Protocol/Frames/Accessors/MbWords.cs b/csharp/Lib/Protocols/Modbus/Protocol/Frames/Accessors/MbWords.cs similarity index 100% rename from csharp/lib/Protocols/Modbus/Protocol/Frames/Accessors/MbWords.cs rename to csharp/Lib/Protocols/Modbus/Protocol/Frames/Accessors/MbWords.cs diff --git a/csharp/lib/Protocols/Modbus/Protocol/Frames/Commands/ReadDiscreteInputsCommandFrame.cs b/csharp/Lib/Protocols/Modbus/Protocol/Frames/Commands/ReadDiscreteInputsCommandFrame.cs similarity index 100% rename from csharp/lib/Protocols/Modbus/Protocol/Frames/Commands/ReadDiscreteInputsCommandFrame.cs rename to csharp/Lib/Protocols/Modbus/Protocol/Frames/Commands/ReadDiscreteInputsCommandFrame.cs diff --git a/csharp/lib/Protocols/Modbus/Protocol/Frames/Commands/ReadHoldingRegistersCommandFrame.cs b/csharp/Lib/Protocols/Modbus/Protocol/Frames/Commands/ReadHoldingRegistersCommandFrame.cs similarity index 100% rename from csharp/lib/Protocols/Modbus/Protocol/Frames/Commands/ReadHoldingRegistersCommandFrame.cs rename to csharp/Lib/Protocols/Modbus/Protocol/Frames/Commands/ReadHoldingRegistersCommandFrame.cs diff --git a/csharp/lib/Protocols/Modbus/Protocol/Frames/Commands/ReadInputRegistersCommandFrame.cs b/csharp/Lib/Protocols/Modbus/Protocol/Frames/Commands/ReadInputRegistersCommandFrame.cs similarity index 100% rename from csharp/lib/Protocols/Modbus/Protocol/Frames/Commands/ReadInputRegistersCommandFrame.cs rename to csharp/Lib/Protocols/Modbus/Protocol/Frames/Commands/ReadInputRegistersCommandFrame.cs diff --git a/csharp/lib/Protocols/Modbus/Protocol/Frames/Commands/ReadWriteRegistersCommandFrame.cs b/csharp/Lib/Protocols/Modbus/Protocol/Frames/Commands/ReadWriteRegistersCommandFrame.cs similarity index 100% rename from csharp/lib/Protocols/Modbus/Protocol/Frames/Commands/ReadWriteRegistersCommandFrame.cs rename to csharp/Lib/Protocols/Modbus/Protocol/Frames/Commands/ReadWriteRegistersCommandFrame.cs diff --git a/csharp/lib/Protocols/Modbus/Protocol/Frames/Commands/WriteCoilsCommandFrame.cs b/csharp/Lib/Protocols/Modbus/Protocol/Frames/Commands/WriteCoilsCommandFrame.cs similarity index 100% rename from csharp/lib/Protocols/Modbus/Protocol/Frames/Commands/WriteCoilsCommandFrame.cs rename to csharp/Lib/Protocols/Modbus/Protocol/Frames/Commands/WriteCoilsCommandFrame.cs diff --git a/csharp/lib/Protocols/Modbus/Protocol/Frames/Commands/WriteRegistersCommandFrame.cs b/csharp/Lib/Protocols/Modbus/Protocol/Frames/Commands/WriteRegistersCommandFrame.cs similarity index 100% rename from csharp/lib/Protocols/Modbus/Protocol/Frames/Commands/WriteRegistersCommandFrame.cs rename to csharp/Lib/Protocols/Modbus/Protocol/Frames/Commands/WriteRegistersCommandFrame.cs diff --git a/csharp/lib/Protocols/Modbus/Protocol/Frames/Constants.cs b/csharp/Lib/Protocols/Modbus/Protocol/Frames/Constants.cs similarity index 100% rename from csharp/lib/Protocols/Modbus/Protocol/Frames/Constants.cs rename to csharp/Lib/Protocols/Modbus/Protocol/Frames/Constants.cs diff --git a/csharp/lib/Protocols/Modbus/Protocol/Frames/ModbusFrame.cs b/csharp/Lib/Protocols/Modbus/Protocol/Frames/ModbusFrame.cs similarity index 100% rename from csharp/lib/Protocols/Modbus/Protocol/Frames/ModbusFrame.cs rename to csharp/Lib/Protocols/Modbus/Protocol/Frames/ModbusFrame.cs diff --git a/csharp/lib/Protocols/Modbus/Protocol/Frames/Replies/ErrorResponseFrame.cs b/csharp/Lib/Protocols/Modbus/Protocol/Frames/Replies/ErrorResponseFrame.cs similarity index 100% rename from csharp/lib/Protocols/Modbus/Protocol/Frames/Replies/ErrorResponseFrame.cs rename to csharp/Lib/Protocols/Modbus/Protocol/Frames/Replies/ErrorResponseFrame.cs diff --git a/csharp/lib/Protocols/Modbus/Protocol/Frames/Replies/ReadDiscreteInputResponseFrame.cs b/csharp/Lib/Protocols/Modbus/Protocol/Frames/Replies/ReadDiscreteInputResponseFrame.cs similarity index 100% rename from csharp/lib/Protocols/Modbus/Protocol/Frames/Replies/ReadDiscreteInputResponseFrame.cs rename to csharp/Lib/Protocols/Modbus/Protocol/Frames/Replies/ReadDiscreteInputResponseFrame.cs diff --git a/csharp/lib/Protocols/Modbus/Protocol/Frames/Replies/ReadHoldingRegistersResponseFrame.cs b/csharp/Lib/Protocols/Modbus/Protocol/Frames/Replies/ReadHoldingRegistersResponseFrame.cs similarity index 100% rename from csharp/lib/Protocols/Modbus/Protocol/Frames/Replies/ReadHoldingRegistersResponseFrame.cs rename to csharp/Lib/Protocols/Modbus/Protocol/Frames/Replies/ReadHoldingRegistersResponseFrame.cs diff --git a/csharp/lib/Protocols/Modbus/Protocol/Frames/Replies/ReadInputRegistersResponseFrame.cs b/csharp/Lib/Protocols/Modbus/Protocol/Frames/Replies/ReadInputRegistersResponseFrame.cs similarity index 100% rename from csharp/lib/Protocols/Modbus/Protocol/Frames/Replies/ReadInputRegistersResponseFrame.cs rename to csharp/Lib/Protocols/Modbus/Protocol/Frames/Replies/ReadInputRegistersResponseFrame.cs diff --git a/csharp/lib/Protocols/Modbus/Protocol/Frames/Replies/ReadWriteRegistersCommandFrame.cs b/csharp/Lib/Protocols/Modbus/Protocol/Frames/Replies/ReadWriteRegistersCommandFrame.cs similarity index 100% rename from csharp/lib/Protocols/Modbus/Protocol/Frames/Replies/ReadWriteRegistersCommandFrame.cs rename to csharp/Lib/Protocols/Modbus/Protocol/Frames/Replies/ReadWriteRegistersCommandFrame.cs diff --git a/csharp/lib/Protocols/Modbus/Protocol/Frames/Replies/WriteCoilsResponseFrame.cs b/csharp/Lib/Protocols/Modbus/Protocol/Frames/Replies/WriteCoilsResponseFrame.cs similarity index 100% rename from csharp/lib/Protocols/Modbus/Protocol/Frames/Replies/WriteCoilsResponseFrame.cs rename to csharp/Lib/Protocols/Modbus/Protocol/Frames/Replies/WriteCoilsResponseFrame.cs diff --git a/csharp/lib/Protocols/Modbus/Protocol/Frames/Replies/WriteRegistersResponseFrame.cs b/csharp/Lib/Protocols/Modbus/Protocol/Frames/Replies/WriteRegistersResponseFrame.cs similarity index 100% rename from csharp/lib/Protocols/Modbus/Protocol/Frames/Replies/WriteRegistersResponseFrame.cs rename to csharp/Lib/Protocols/Modbus/Protocol/Frames/Replies/WriteRegistersResponseFrame.cs diff --git a/csharp/lib/Protocols/Modbus/Protocol/FunctionCode.cs b/csharp/Lib/Protocols/Modbus/Protocol/FunctionCode.cs similarity index 100% rename from csharp/lib/Protocols/Modbus/Protocol/FunctionCode.cs rename to csharp/Lib/Protocols/Modbus/Protocol/FunctionCode.cs diff --git a/csharp/lib/Protocols/Modbus/Tcp/MbapHeader.cs b/csharp/Lib/Protocols/Modbus/Tcp/MbapHeader.cs similarity index 100% rename from csharp/lib/Protocols/Modbus/Tcp/MbapHeader.cs rename to csharp/Lib/Protocols/Modbus/Tcp/MbapHeader.cs diff --git a/csharp/lib/Protocols/Modbus/Tcp/ModbusTcpFrame.cs b/csharp/Lib/Protocols/Modbus/Tcp/ModbusTcpFrame.cs similarity index 100% rename from csharp/lib/Protocols/Modbus/Tcp/ModbusTcpFrame.cs rename to csharp/Lib/Protocols/Modbus/Tcp/ModbusTcpFrame.cs diff --git a/csharp/lib/Protocols/Modbus/Util/ArraySegmentExtensions.cs b/csharp/Lib/Protocols/Modbus/Util/ArraySegmentExtensions.cs similarity index 100% rename from csharp/lib/Protocols/Modbus/Util/ArraySegmentExtensions.cs rename to csharp/Lib/Protocols/Modbus/Util/ArraySegmentExtensions.cs diff --git a/csharp/lib/S3/DataRec.cs b/csharp/Lib/S3/DataRec.cs similarity index 100% rename from csharp/lib/S3/DataRec.cs rename to csharp/Lib/S3/DataRec.cs diff --git a/csharp/lib/S3/Drivers/Internal/Delegates/ReadRecord.cs b/csharp/Lib/S3/Drivers/Internal/Delegates/ReadRecord.cs similarity index 100% rename from csharp/lib/S3/Drivers/Internal/Delegates/ReadRecord.cs rename to csharp/Lib/S3/Drivers/Internal/Delegates/ReadRecord.cs diff --git a/csharp/lib/S3/Drivers/Internal/Delegates/WriteRecord.cs b/csharp/Lib/S3/Drivers/Internal/Delegates/WriteRecord.cs similarity index 100% rename from csharp/lib/S3/Drivers/Internal/Delegates/WriteRecord.cs rename to csharp/Lib/S3/Drivers/Internal/Delegates/WriteRecord.cs diff --git a/csharp/lib/S3/Drivers/Internal/Reader.cs b/csharp/Lib/S3/Drivers/Internal/Reader.cs similarity index 100% rename from csharp/lib/S3/Drivers/Internal/Reader.cs rename to csharp/Lib/S3/Drivers/Internal/Reader.cs diff --git a/csharp/lib/S3/Drivers/Internal/Reader.public.cs b/csharp/Lib/S3/Drivers/Internal/Reader.public.cs similarity index 100% rename from csharp/lib/S3/Drivers/Internal/Reader.public.cs rename to csharp/Lib/S3/Drivers/Internal/Reader.public.cs diff --git a/csharp/lib/S3/Drivers/Internal/Util/Aggregator.cs b/csharp/Lib/S3/Drivers/Internal/Util/Aggregator.cs similarity index 100% rename from csharp/lib/S3/Drivers/Internal/Util/Aggregator.cs rename to csharp/Lib/S3/Drivers/Internal/Util/Aggregator.cs diff --git a/csharp/lib/S3/Drivers/Internal/Util/Sampler.cs b/csharp/Lib/S3/Drivers/Internal/Util/Sampler.cs similarity index 100% rename from csharp/lib/S3/Drivers/Internal/Util/Sampler.cs rename to csharp/Lib/S3/Drivers/Internal/Util/Sampler.cs diff --git a/csharp/lib/S3/Drivers/Internal/Writer.cs b/csharp/Lib/S3/Drivers/Internal/Writer.cs similarity index 100% rename from csharp/lib/S3/Drivers/Internal/Writer.cs rename to csharp/Lib/S3/Drivers/Internal/Writer.cs diff --git a/csharp/lib/S3/Drivers/Internal/Writer.public.cs b/csharp/Lib/S3/Drivers/Internal/Writer.public.cs similarity index 100% rename from csharp/lib/S3/Drivers/Internal/Writer.public.cs rename to csharp/Lib/S3/Drivers/Internal/Writer.public.cs diff --git a/csharp/lib/S3/Drivers/MemoryDriver.cs b/csharp/Lib/S3/Drivers/MemoryDriver.cs similarity index 100% rename from csharp/lib/S3/Drivers/MemoryDriver.cs rename to csharp/Lib/S3/Drivers/MemoryDriver.cs diff --git a/csharp/lib/S3/Drivers/S3Config.cs b/csharp/Lib/S3/Drivers/S3Config.cs similarity index 100% rename from csharp/lib/S3/Drivers/S3Config.cs rename to csharp/Lib/S3/Drivers/S3Config.cs diff --git a/csharp/lib/S3/Drivers/S3Driver.cs b/csharp/Lib/S3/Drivers/S3Driver.cs similarity index 100% rename from csharp/lib/S3/Drivers/S3Driver.cs rename to csharp/Lib/S3/Drivers/S3Driver.cs diff --git a/csharp/lib/S3/Metadata/AggregationLevel.cs b/csharp/Lib/S3/Metadata/AggregationLevel.cs similarity index 100% rename from csharp/lib/S3/Metadata/AggregationLevel.cs rename to csharp/Lib/S3/Metadata/AggregationLevel.cs diff --git a/csharp/lib/S3/Metadata/FieldType.cs b/csharp/Lib/S3/Metadata/FieldType.cs similarity index 100% rename from csharp/lib/S3/Metadata/FieldType.cs rename to csharp/Lib/S3/Metadata/FieldType.cs diff --git a/csharp/lib/S3/Program.cs b/csharp/Lib/S3/Program.cs similarity index 100% rename from csharp/lib/S3/Program.cs rename to csharp/Lib/S3/Program.cs diff --git a/csharp/lib/S3/Records/Fields/Field.cs b/csharp/Lib/S3/Records/Fields/Field.cs similarity index 100% rename from csharp/lib/S3/Records/Fields/Field.cs rename to csharp/Lib/S3/Records/Fields/Field.cs diff --git a/csharp/lib/S3/Records/Fields/NumberField.cs b/csharp/Lib/S3/Records/Fields/NumberField.cs similarity index 100% rename from csharp/lib/S3/Records/Fields/NumberField.cs rename to csharp/Lib/S3/Records/Fields/NumberField.cs diff --git a/csharp/lib/S3/Records/Fields/TextField.cs b/csharp/Lib/S3/Records/Fields/TextField.cs similarity index 100% rename from csharp/lib/S3/Records/Fields/TextField.cs rename to csharp/Lib/S3/Records/Fields/TextField.cs diff --git a/csharp/lib/S3/Records/Fields/TextFrequency.cs b/csharp/Lib/S3/Records/Fields/TextFrequency.cs similarity index 100% rename from csharp/lib/S3/Records/Fields/TextFrequency.cs rename to csharp/Lib/S3/Records/Fields/TextFrequency.cs diff --git a/csharp/lib/S3/Records/Fields/UnitAttribute.cs b/csharp/Lib/S3/Records/Fields/UnitAttribute.cs similarity index 100% rename from csharp/lib/S3/Records/Fields/UnitAttribute.cs rename to csharp/Lib/S3/Records/Fields/UnitAttribute.cs diff --git a/csharp/lib/S3/Records/Fields/WithUnit.cs b/csharp/Lib/S3/Records/Fields/WithUnit.cs similarity index 100% rename from csharp/lib/S3/Records/Fields/WithUnit.cs rename to csharp/Lib/S3/Records/Fields/WithUnit.cs diff --git a/csharp/lib/S3/Records/Operations/Aggregation.cs b/csharp/Lib/S3/Records/Operations/Aggregation.cs similarity index 100% rename from csharp/lib/S3/Records/Operations/Aggregation.cs rename to csharp/Lib/S3/Records/Operations/Aggregation.cs diff --git a/csharp/lib/S3/Records/Operations/Conversion.cs b/csharp/Lib/S3/Records/Operations/Conversion.cs similarity index 100% rename from csharp/lib/S3/Records/Operations/Conversion.cs rename to csharp/Lib/S3/Records/Operations/Conversion.cs diff --git a/csharp/lib/S3/Records/Record.cs b/csharp/Lib/S3/Records/Record.cs similarity index 100% rename from csharp/lib/S3/Records/Record.cs rename to csharp/Lib/S3/Records/Record.cs diff --git a/csharp/lib/S3/Records/Serialization/FieldTag.cs b/csharp/Lib/S3/Records/Serialization/FieldTag.cs similarity index 100% rename from csharp/lib/S3/Records/Serialization/FieldTag.cs rename to csharp/Lib/S3/Records/Serialization/FieldTag.cs diff --git a/csharp/lib/S3/Records/Serialization/Parser.cs b/csharp/Lib/S3/Records/Serialization/Parser.cs similarity index 100% rename from csharp/lib/S3/Records/Serialization/Parser.cs rename to csharp/Lib/S3/Records/Serialization/Parser.cs diff --git a/csharp/lib/S3/Records/Serialization/Serializer.cs b/csharp/Lib/S3/Records/Serialization/Serializer.cs similarity index 100% rename from csharp/lib/S3/Records/Serialization/Serializer.cs rename to csharp/Lib/S3/Records/Serialization/Serializer.cs diff --git a/csharp/lib/S3/Records/Specialized/AggregatedRecord.cs b/csharp/Lib/S3/Records/Specialized/AggregatedRecord.cs similarity index 100% rename from csharp/lib/S3/Records/Specialized/AggregatedRecord.cs rename to csharp/Lib/S3/Records/Specialized/AggregatedRecord.cs diff --git a/csharp/lib/S3/Records/Specialized/TimeStampedRecord.cs b/csharp/Lib/S3/Records/Specialized/TimeStampedRecord.cs similarity index 100% rename from csharp/lib/S3/Records/Specialized/TimeStampedRecord.cs rename to csharp/Lib/S3/Records/Specialized/TimeStampedRecord.cs diff --git a/csharp/lib/S3/S3.csproj b/csharp/Lib/S3/S3.csproj similarity index 60% rename from csharp/lib/S3/S3.csproj rename to csharp/Lib/S3/S3.csproj index 0da1127e5..946c4841f 100644 --- a/csharp/lib/S3/S3.csproj +++ b/csharp/Lib/S3/S3.csproj @@ -1,10 +1,10 @@ - + - - + + diff --git a/csharp/lib/S3/Serialization/JsonConverters.cs b/csharp/Lib/S3/Serialization/JsonConverters.cs similarity index 100% rename from csharp/lib/S3/Serialization/JsonConverters.cs rename to csharp/Lib/S3/Serialization/JsonConverters.cs diff --git a/csharp/lib/StatusApi/Connections/DcConnection.cs b/csharp/Lib/StatusApi/Connections/DcConnection.cs similarity index 100% rename from csharp/lib/StatusApi/Connections/DcConnection.cs rename to csharp/Lib/StatusApi/Connections/DcConnection.cs diff --git a/csharp/lib/StatusApi/Connections/SinglePhaseAcConnection.cs b/csharp/Lib/StatusApi/Connections/SinglePhaseAcConnection.cs similarity index 100% rename from csharp/lib/StatusApi/Connections/SinglePhaseAcConnection.cs rename to csharp/Lib/StatusApi/Connections/SinglePhaseAcConnection.cs diff --git a/csharp/lib/StatusApi/Connections/ThreePhaseAcConnection.cs b/csharp/Lib/StatusApi/Connections/ThreePhaseAcConnection.cs similarity index 100% rename from csharp/lib/StatusApi/Connections/ThreePhaseAcConnection.cs rename to csharp/Lib/StatusApi/Connections/ThreePhaseAcConnection.cs diff --git a/csharp/lib/StatusApi/DeviceType.cs b/csharp/Lib/StatusApi/DeviceType.cs similarity index 100% rename from csharp/lib/StatusApi/DeviceType.cs rename to csharp/Lib/StatusApi/DeviceType.cs diff --git a/csharp/lib/StatusApi/Devices/Battery.cs b/csharp/Lib/StatusApi/Devices/Battery.cs similarity index 100% rename from csharp/lib/StatusApi/Devices/Battery.cs rename to csharp/Lib/StatusApi/Devices/Battery.cs diff --git a/csharp/lib/StatusApi/Devices/DcDcConverter.cs b/csharp/Lib/StatusApi/Devices/DcDcConverter.cs similarity index 100% rename from csharp/lib/StatusApi/Devices/DcDcConverter.cs rename to csharp/Lib/StatusApi/Devices/DcDcConverter.cs diff --git a/csharp/lib/StatusApi/Devices/DcDevice.cs b/csharp/Lib/StatusApi/Devices/DcDevice.cs similarity index 100% rename from csharp/lib/StatusApi/Devices/DcDevice.cs rename to csharp/Lib/StatusApi/Devices/DcDevice.cs diff --git a/csharp/lib/StatusApi/Devices/Device.cs b/csharp/Lib/StatusApi/Devices/Device.cs similarity index 100% rename from csharp/lib/StatusApi/Devices/Device.cs rename to csharp/Lib/StatusApi/Devices/Device.cs diff --git a/csharp/lib/StatusApi/Devices/GridMeter.cs b/csharp/Lib/StatusApi/Devices/GridMeter.cs similarity index 100% rename from csharp/lib/StatusApi/Devices/GridMeter.cs rename to csharp/Lib/StatusApi/Devices/GridMeter.cs diff --git a/csharp/lib/StatusApi/Devices/IPvCoupledDevice.cs b/csharp/Lib/StatusApi/Devices/IPvCoupledDevice.cs similarity index 100% rename from csharp/lib/StatusApi/Devices/IPvCoupledDevice.cs rename to csharp/Lib/StatusApi/Devices/IPvCoupledDevice.cs diff --git a/csharp/lib/StatusApi/Devices/Mppt.cs b/csharp/Lib/StatusApi/Devices/Mppt.cs similarity index 100% rename from csharp/lib/StatusApi/Devices/Mppt.cs rename to csharp/Lib/StatusApi/Devices/Mppt.cs diff --git a/csharp/lib/StatusApi/Devices/SinglePhaseAcDevice.cs b/csharp/Lib/StatusApi/Devices/SinglePhaseAcDevice.cs similarity index 100% rename from csharp/lib/StatusApi/Devices/SinglePhaseAcDevice.cs rename to csharp/Lib/StatusApi/Devices/SinglePhaseAcDevice.cs diff --git a/csharp/lib/StatusApi/Devices/SinglePhaseInverter.cs b/csharp/Lib/StatusApi/Devices/SinglePhaseInverter.cs similarity index 100% rename from csharp/lib/StatusApi/Devices/SinglePhaseInverter.cs rename to csharp/Lib/StatusApi/Devices/SinglePhaseInverter.cs diff --git a/csharp/lib/StatusApi/Devices/SinglePhasePvInverter.cs b/csharp/Lib/StatusApi/Devices/SinglePhasePvInverter.cs similarity index 100% rename from csharp/lib/StatusApi/Devices/SinglePhasePvInverter.cs rename to csharp/Lib/StatusApi/Devices/SinglePhasePvInverter.cs diff --git a/csharp/lib/StatusApi/Devices/ThreePhaseAcDevice.cs b/csharp/Lib/StatusApi/Devices/ThreePhaseAcDevice.cs similarity index 100% rename from csharp/lib/StatusApi/Devices/ThreePhaseAcDevice.cs rename to csharp/Lib/StatusApi/Devices/ThreePhaseAcDevice.cs diff --git a/csharp/lib/StatusApi/Devices/ThreePhaseInverter.cs b/csharp/Lib/StatusApi/Devices/ThreePhaseInverter.cs similarity index 100% rename from csharp/lib/StatusApi/Devices/ThreePhaseInverter.cs rename to csharp/Lib/StatusApi/Devices/ThreePhaseInverter.cs diff --git a/csharp/lib/StatusApi/Devices/ThreePhasePvInverter.cs b/csharp/Lib/StatusApi/Devices/ThreePhasePvInverter.cs similarity index 100% rename from csharp/lib/StatusApi/Devices/ThreePhasePvInverter.cs rename to csharp/Lib/StatusApi/Devices/ThreePhasePvInverter.cs diff --git a/csharp/lib/StatusApi/Phases/AcPhase.cs b/csharp/Lib/StatusApi/Phases/AcPhase.cs similarity index 100% rename from csharp/lib/StatusApi/Phases/AcPhase.cs rename to csharp/Lib/StatusApi/Phases/AcPhase.cs diff --git a/csharp/lib/StatusApi/Phases/Phase.cs b/csharp/Lib/StatusApi/Phases/Phase.cs similarity index 100% rename from csharp/lib/StatusApi/Phases/Phase.cs rename to csharp/Lib/StatusApi/Phases/Phase.cs diff --git a/csharp/lib/StatusApi/StatusApi.csproj b/csharp/Lib/StatusApi/StatusApi.csproj similarity index 75% rename from csharp/lib/StatusApi/StatusApi.csproj rename to csharp/Lib/StatusApi/StatusApi.csproj index bb446855b..f1e4bc0f8 100644 --- a/csharp/lib/StatusApi/StatusApi.csproj +++ b/csharp/Lib/StatusApi/StatusApi.csproj @@ -1,5 +1,5 @@ - + diff --git a/csharp/lib/StatusApi/Utils.cs b/csharp/Lib/StatusApi/Utils.cs similarity index 100% rename from csharp/lib/StatusApi/Utils.cs rename to csharp/Lib/StatusApi/Utils.cs diff --git a/csharp/lib/StatusData/Current.cs b/csharp/Lib/StatusData/Current.cs similarity index 100% rename from csharp/lib/StatusData/Current.cs rename to csharp/Lib/StatusData/Current.cs diff --git a/csharp/lib/StatusData/Json/Converters.cs b/csharp/Lib/StatusData/Json/Converters.cs similarity index 100% rename from csharp/lib/StatusData/Json/Converters.cs rename to csharp/Lib/StatusData/Json/Converters.cs diff --git a/csharp/lib/StatusData/Json/CurrentConverter.cs b/csharp/Lib/StatusData/Json/CurrentConverter.cs similarity index 100% rename from csharp/lib/StatusData/Json/CurrentConverter.cs rename to csharp/Lib/StatusData/Json/CurrentConverter.cs diff --git a/csharp/lib/StatusData/Json/PowerConverter.cs b/csharp/Lib/StatusData/Json/PowerConverter.cs similarity index 100% rename from csharp/lib/StatusData/Json/PowerConverter.cs rename to csharp/Lib/StatusData/Json/PowerConverter.cs diff --git a/csharp/lib/StatusData/Json/ResistanceConverter.cs b/csharp/Lib/StatusData/Json/ResistanceConverter.cs similarity index 100% rename from csharp/lib/StatusData/Json/ResistanceConverter.cs rename to csharp/Lib/StatusData/Json/ResistanceConverter.cs diff --git a/csharp/lib/StatusData/Json/VoltageConverter.cs b/csharp/Lib/StatusData/Json/VoltageConverter.cs similarity index 100% rename from csharp/lib/StatusData/Json/VoltageConverter.cs rename to csharp/Lib/StatusData/Json/VoltageConverter.cs diff --git a/csharp/lib/StatusData/Power.cs b/csharp/Lib/StatusData/Power.cs similarity index 100% rename from csharp/lib/StatusData/Power.cs rename to csharp/Lib/StatusData/Power.cs diff --git a/csharp/lib/StatusData/Resistance.cs b/csharp/Lib/StatusData/Resistance.cs similarity index 100% rename from csharp/lib/StatusData/Resistance.cs rename to csharp/Lib/StatusData/Resistance.cs diff --git a/csharp/lib/StatusData/State.cs b/csharp/Lib/StatusData/State.cs similarity index 100% rename from csharp/lib/StatusData/State.cs rename to csharp/Lib/StatusData/State.cs diff --git a/csharp/lib/StatusData/StatusData.csproj b/csharp/Lib/StatusData/StatusData.csproj similarity index 77% rename from csharp/lib/StatusData/StatusData.csproj rename to csharp/Lib/StatusData/StatusData.csproj index 22522002f..69d164c4f 100644 --- a/csharp/lib/StatusData/StatusData.csproj +++ b/csharp/Lib/StatusData/StatusData.csproj @@ -1,5 +1,5 @@ - + Library diff --git a/csharp/lib/StatusData/Units.cs b/csharp/Lib/StatusData/Units.cs similarity index 100% rename from csharp/lib/StatusData/Units.cs rename to csharp/Lib/StatusData/Units.cs diff --git a/csharp/lib/StatusData/Voltage.cs b/csharp/Lib/StatusData/Voltage.cs similarity index 100% rename from csharp/lib/StatusData/Voltage.cs rename to csharp/Lib/StatusData/Voltage.cs diff --git a/csharp/lib/SysTools/Edges/RemoteCommandToProcess.cs b/csharp/Lib/SysTools/Edges/RemoteCommandToProcess.cs similarity index 100% rename from csharp/lib/SysTools/Edges/RemoteCommandToProcess.cs rename to csharp/Lib/SysTools/Edges/RemoteCommandToProcess.cs diff --git a/csharp/lib/SysTools/Edges/RemotePathToRemoteCommand.cs b/csharp/Lib/SysTools/Edges/RemotePathToRemoteCommand.cs similarity index 100% rename from csharp/lib/SysTools/Edges/RemotePathToRemoteCommand.cs rename to csharp/Lib/SysTools/Edges/RemotePathToRemoteCommand.cs diff --git a/csharp/lib/SysTools/Edges/SshHostToRemoteCommand.cs b/csharp/Lib/SysTools/Edges/SshHostToRemoteCommand.cs similarity index 100% rename from csharp/lib/SysTools/Edges/SshHostToRemoteCommand.cs rename to csharp/Lib/SysTools/Edges/SshHostToRemoteCommand.cs diff --git a/csharp/lib/SysTools/Edges/SshHostToRemotePath.cs b/csharp/Lib/SysTools/Edges/SshHostToRemotePath.cs similarity index 100% rename from csharp/lib/SysTools/Edges/SshHostToRemotePath.cs rename to csharp/Lib/SysTools/Edges/SshHostToRemotePath.cs diff --git a/csharp/lib/SysTools/Edges/StringToCommand.cs b/csharp/Lib/SysTools/Edges/StringToCommand.cs similarity index 100% rename from csharp/lib/SysTools/Edges/StringToCommand.cs rename to csharp/Lib/SysTools/Edges/StringToCommand.cs diff --git a/csharp/lib/SysTools/Edges/StringToProcess.cs b/csharp/Lib/SysTools/Edges/StringToProcess.cs similarity index 100% rename from csharp/lib/SysTools/Edges/StringToProcess.cs rename to csharp/Lib/SysTools/Edges/StringToProcess.cs diff --git a/csharp/lib/SysTools/Edges/StringToRemotePath.cs b/csharp/Lib/SysTools/Edges/StringToRemotePath.cs similarity index 100% rename from csharp/lib/SysTools/Edges/StringToRemotePath.cs rename to csharp/Lib/SysTools/Edges/StringToRemotePath.cs diff --git a/csharp/lib/SysTools/Edges/StringToSysPath.cs b/csharp/Lib/SysTools/Edges/StringToSysPath.cs similarity index 100% rename from csharp/lib/SysTools/Edges/StringToSysPath.cs rename to csharp/Lib/SysTools/Edges/StringToSysPath.cs diff --git a/csharp/lib/SysTools/Edges/SysCommandToProcess.cs b/csharp/Lib/SysTools/Edges/SysCommandToProcess.cs similarity index 100% rename from csharp/lib/SysTools/Edges/SysCommandToProcess.cs rename to csharp/Lib/SysTools/Edges/SysCommandToProcess.cs diff --git a/csharp/lib/SysTools/Edges/SysCommandToRemoteCommand.cs b/csharp/Lib/SysTools/Edges/SysCommandToRemoteCommand.cs similarity index 100% rename from csharp/lib/SysTools/Edges/SysCommandToRemoteCommand.cs rename to csharp/Lib/SysTools/Edges/SysCommandToRemoteCommand.cs diff --git a/csharp/lib/SysTools/Edges/SysPathToProcess.cs b/csharp/Lib/SysTools/Edges/SysPathToProcess.cs similarity index 100% rename from csharp/lib/SysTools/Edges/SysPathToProcess.cs rename to csharp/Lib/SysTools/Edges/SysPathToProcess.cs diff --git a/csharp/lib/SysTools/Edges/SysPathToRemotePath.cs b/csharp/Lib/SysTools/Edges/SysPathToRemotePath.cs similarity index 100% rename from csharp/lib/SysTools/Edges/SysPathToRemotePath.cs rename to csharp/Lib/SysTools/Edges/SysPathToRemotePath.cs diff --git a/csharp/lib/SysTools/Edges/SysPathToSysCommand.cs b/csharp/Lib/SysTools/Edges/SysPathToSysCommand.cs similarity index 100% rename from csharp/lib/SysTools/Edges/SysPathToSysCommand.cs rename to csharp/Lib/SysTools/Edges/SysPathToSysCommand.cs diff --git a/csharp/lib/SysTools/FileIo.cs b/csharp/Lib/SysTools/FileIo.cs similarity index 100% rename from csharp/lib/SysTools/FileIo.cs rename to csharp/Lib/SysTools/FileIo.cs diff --git a/csharp/lib/SysTools/Process/AsyncProcess.cs b/csharp/Lib/SysTools/Process/AsyncProcess.cs similarity index 100% rename from csharp/lib/SysTools/Process/AsyncProcess.cs rename to csharp/Lib/SysTools/Process/AsyncProcess.cs diff --git a/csharp/lib/SysTools/Process/ProcessResult.cs b/csharp/Lib/SysTools/Process/ProcessResult.cs similarity index 100% rename from csharp/lib/SysTools/Process/ProcessResult.cs rename to csharp/Lib/SysTools/Process/ProcessResult.cs diff --git a/csharp/lib/SysTools/Process/SyncProcess.cs b/csharp/Lib/SysTools/Process/SyncProcess.cs similarity index 100% rename from csharp/lib/SysTools/Process/SyncProcess.cs rename to csharp/Lib/SysTools/Process/SyncProcess.cs diff --git a/csharp/lib/SysTools/Remote/RemoteCommand.cs b/csharp/Lib/SysTools/Remote/RemoteCommand.cs similarity index 100% rename from csharp/lib/SysTools/Remote/RemoteCommand.cs rename to csharp/Lib/SysTools/Remote/RemoteCommand.cs diff --git a/csharp/lib/SysTools/Remote/RemoteFileIo.cs b/csharp/Lib/SysTools/Remote/RemoteFileIo.cs similarity index 100% rename from csharp/lib/SysTools/Remote/RemoteFileIo.cs rename to csharp/Lib/SysTools/Remote/RemoteFileIo.cs diff --git a/csharp/lib/SysTools/Remote/RemotePath.cs b/csharp/Lib/SysTools/Remote/RemotePath.cs similarity index 100% rename from csharp/lib/SysTools/Remote/RemotePath.cs rename to csharp/Lib/SysTools/Remote/RemotePath.cs diff --git a/csharp/lib/SysTools/Remote/SshHost.cs b/csharp/Lib/SysTools/Remote/SshHost.cs similarity index 100% rename from csharp/lib/SysTools/Remote/SshHost.cs rename to csharp/Lib/SysTools/Remote/SshHost.cs diff --git a/csharp/lib/SysTools/SysCommand.cs b/csharp/Lib/SysTools/SysCommand.cs similarity index 100% rename from csharp/lib/SysTools/SysCommand.cs rename to csharp/Lib/SysTools/SysCommand.cs diff --git a/csharp/lib/SysTools/SysDirs.cs b/csharp/Lib/SysTools/SysDirs.cs similarity index 100% rename from csharp/lib/SysTools/SysDirs.cs rename to csharp/Lib/SysTools/SysDirs.cs diff --git a/csharp/lib/SysTools/SysPath.cs b/csharp/Lib/SysTools/SysPath.cs similarity index 100% rename from csharp/lib/SysTools/SysPath.cs rename to csharp/Lib/SysTools/SysPath.cs diff --git a/csharp/lib/SysTools/SysTools.csproj b/csharp/Lib/SysTools/SysTools.csproj similarity index 75% rename from csharp/lib/SysTools/SysTools.csproj rename to csharp/Lib/SysTools/SysTools.csproj index aa11972a1..9fd38651b 100644 --- a/csharp/lib/SysTools/SysTools.csproj +++ b/csharp/Lib/SysTools/SysTools.csproj @@ -1,5 +1,5 @@ - + diff --git a/csharp/lib/SysTools/Utils/ConsoleUtils.cs b/csharp/Lib/SysTools/Utils/ConsoleUtils.cs similarity index 100% rename from csharp/lib/SysTools/Utils/ConsoleUtils.cs rename to csharp/Lib/SysTools/Utils/ConsoleUtils.cs diff --git a/csharp/lib/SysTools/Utils/EnumerableUtils.cs b/csharp/Lib/SysTools/Utils/EnumerableUtils.cs similarity index 100% rename from csharp/lib/SysTools/Utils/EnumerableUtils.cs rename to csharp/Lib/SysTools/Utils/EnumerableUtils.cs diff --git a/csharp/lib/SysTools/Utils/StringUtils.cs b/csharp/Lib/SysTools/Utils/StringUtils.cs similarity index 100% rename from csharp/lib/SysTools/Utils/StringUtils.cs rename to csharp/Lib/SysTools/Utils/StringUtils.cs diff --git a/csharp/lib/SysTools/Utils/Utils.cs b/csharp/Lib/SysTools/Utils/Utils.cs similarity index 100% rename from csharp/lib/SysTools/Utils/Utils.cs rename to csharp/Lib/SysTools/Utils/Utils.cs diff --git a/csharp/Lib/Time/Time.csproj b/csharp/Lib/Time/Time.csproj new file mode 100644 index 000000000..e971a1f7d --- /dev/null +++ b/csharp/Lib/Time/Time.csproj @@ -0,0 +1,3 @@ + + + diff --git a/csharp/lib/Time/Unix/UnixTime.Compare.cs b/csharp/Lib/Time/Unix/UnixTime.Compare.cs similarity index 100% rename from csharp/lib/Time/Unix/UnixTime.Compare.cs rename to csharp/Lib/Time/Unix/UnixTime.Compare.cs diff --git a/csharp/lib/Time/Unix/UnixTime.Constructors.cs b/csharp/Lib/Time/Unix/UnixTime.Constructors.cs similarity index 100% rename from csharp/lib/Time/Unix/UnixTime.Constructors.cs rename to csharp/Lib/Time/Unix/UnixTime.Constructors.cs diff --git a/csharp/lib/Time/Unix/UnixTime.Converters.cs b/csharp/Lib/Time/Unix/UnixTime.Converters.cs similarity index 100% rename from csharp/lib/Time/Unix/UnixTime.Converters.cs rename to csharp/Lib/Time/Unix/UnixTime.Converters.cs diff --git a/csharp/lib/Time/Unix/UnixTime.Operators.cs b/csharp/Lib/Time/Unix/UnixTime.Operators.cs similarity index 100% rename from csharp/lib/Time/Unix/UnixTime.Operators.cs rename to csharp/Lib/Time/Unix/UnixTime.Operators.cs diff --git a/csharp/lib/Time/Unix/UnixTime.Overrides.cs b/csharp/Lib/Time/Unix/UnixTime.Overrides.cs similarity index 100% rename from csharp/lib/Time/Unix/UnixTime.Overrides.cs rename to csharp/Lib/Time/Unix/UnixTime.Overrides.cs diff --git a/csharp/lib/Time/Unix/UnixTime.cs b/csharp/Lib/Time/Unix/UnixTime.cs similarity index 100% rename from csharp/lib/Time/Unix/UnixTime.cs rename to csharp/Lib/Time/Unix/UnixTime.cs diff --git a/csharp/lib/Time/Unix/UnixTimeDelta.Compare.cs b/csharp/Lib/Time/Unix/UnixTimeDelta.Compare.cs similarity index 100% rename from csharp/lib/Time/Unix/UnixTimeDelta.Compare.cs rename to csharp/Lib/Time/Unix/UnixTimeDelta.Compare.cs diff --git a/csharp/lib/Time/Unix/UnixTimeDelta.Constructors.cs b/csharp/Lib/Time/Unix/UnixTimeDelta.Constructors.cs similarity index 100% rename from csharp/lib/Time/Unix/UnixTimeDelta.Constructors.cs rename to csharp/Lib/Time/Unix/UnixTimeDelta.Constructors.cs diff --git a/csharp/lib/Time/Unix/UnixTimeDelta.Operators.cs b/csharp/Lib/Time/Unix/UnixTimeDelta.Operators.cs similarity index 100% rename from csharp/lib/Time/Unix/UnixTimeDelta.Operators.cs rename to csharp/Lib/Time/Unix/UnixTimeDelta.Operators.cs diff --git a/csharp/lib/Time/Unix/UnixTimeDelta.Overrides.cs b/csharp/Lib/Time/Unix/UnixTimeDelta.Overrides.cs similarity index 100% rename from csharp/lib/Time/Unix/UnixTimeDelta.Overrides.cs rename to csharp/Lib/Time/Unix/UnixTimeDelta.Overrides.cs diff --git a/csharp/lib/Time/Unix/UnixTimeDeltaExtensions.cs b/csharp/Lib/Time/Unix/UnixTimeDeltaExtensions.cs similarity index 100% rename from csharp/lib/Time/Unix/UnixTimeDeltaExtensions.cs rename to csharp/Lib/Time/Unix/UnixTimeDeltaExtensions.cs diff --git a/csharp/lib/Time/Unix/UnixTimeSpan.cs b/csharp/Lib/Time/Unix/UnixTimeSpan.cs similarity index 100% rename from csharp/lib/Time/Unix/UnixTimeSpan.cs rename to csharp/Lib/Time/Unix/UnixTimeSpan.cs diff --git a/csharp/lib/Utils/ArrayExtensions.cs b/csharp/Lib/Utils/ArrayExtensions.cs similarity index 100% rename from csharp/lib/Utils/ArrayExtensions.cs rename to csharp/Lib/Utils/ArrayExtensions.cs diff --git a/csharp/lib/Utils/AsyncDelegates.cs b/csharp/Lib/Utils/AsyncDelegates.cs similarity index 100% rename from csharp/lib/Utils/AsyncDelegates.cs rename to csharp/Lib/Utils/AsyncDelegates.cs diff --git a/csharp/lib/Utils/AsyncEnumerableEx.cs b/csharp/Lib/Utils/AsyncEnumerableEx.cs similarity index 100% rename from csharp/lib/Utils/AsyncEnumerableEx.cs rename to csharp/Lib/Utils/AsyncEnumerableEx.cs diff --git a/csharp/lib/Utils/AutoComplete.cs b/csharp/Lib/Utils/AutoComplete.cs similarity index 100% rename from csharp/lib/Utils/AutoComplete.cs rename to csharp/Lib/Utils/AutoComplete.cs diff --git a/csharp/lib/Utils/CliCommandUtils.cs b/csharp/Lib/Utils/CliCommandUtils.cs similarity index 100% rename from csharp/lib/Utils/CliCommandUtils.cs rename to csharp/Lib/Utils/CliCommandUtils.cs diff --git a/csharp/lib/Utils/ConsoleUtils.cs b/csharp/Lib/Utils/ConsoleUtils.cs similarity index 100% rename from csharp/lib/Utils/ConsoleUtils.cs rename to csharp/Lib/Utils/ConsoleUtils.cs diff --git a/csharp/lib/Utils/DecimalUtils.cs b/csharp/Lib/Utils/DecimalUtils.cs similarity index 100% rename from csharp/lib/Utils/DecimalUtils.cs rename to csharp/Lib/Utils/DecimalUtils.cs diff --git a/csharp/lib/Utils/DictObservables.cs b/csharp/Lib/Utils/DictObservables.cs similarity index 100% rename from csharp/lib/Utils/DictObservables.cs rename to csharp/Lib/Utils/DictObservables.cs diff --git a/csharp/lib/Utils/Disposable.cs b/csharp/Lib/Utils/Disposable.cs similarity index 100% rename from csharp/lib/Utils/Disposable.cs rename to csharp/Lib/Utils/Disposable.cs diff --git a/csharp/lib/Utils/EnumerableUtils.cs b/csharp/Lib/Utils/EnumerableUtils.cs similarity index 100% rename from csharp/lib/Utils/EnumerableUtils.cs rename to csharp/Lib/Utils/EnumerableUtils.cs diff --git a/csharp/lib/Utils/ExceptionHandling.cs b/csharp/Lib/Utils/ExceptionHandling.cs similarity index 100% rename from csharp/lib/Utils/ExceptionHandling.cs rename to csharp/Lib/Utils/ExceptionHandling.cs diff --git a/csharp/lib/Utils/FileSystem.cs b/csharp/Lib/Utils/FileSystem.cs similarity index 100% rename from csharp/lib/Utils/FileSystem.cs rename to csharp/Lib/Utils/FileSystem.cs diff --git a/csharp/lib/Utils/JsonNodeAccessors.cs b/csharp/Lib/Utils/JsonNodeAccessors.cs similarity index 100% rename from csharp/lib/Utils/JsonNodeAccessors.cs rename to csharp/Lib/Utils/JsonNodeAccessors.cs diff --git a/csharp/lib/Utils/Maybe.cs b/csharp/Lib/Utils/Maybe.cs similarity index 100% rename from csharp/lib/Utils/Maybe.cs rename to csharp/Lib/Utils/Maybe.cs diff --git a/csharp/lib/Utils/Net/NetUtils.cs b/csharp/Lib/Utils/Net/NetUtils.cs similarity index 100% rename from csharp/lib/Utils/Net/NetUtils.cs rename to csharp/Lib/Utils/Net/NetUtils.cs diff --git a/csharp/lib/Utils/Net/PingExtensions.cs b/csharp/Lib/Utils/Net/PingExtensions.cs similarity index 100% rename from csharp/lib/Utils/Net/PingExtensions.cs rename to csharp/Lib/Utils/Net/PingExtensions.cs diff --git a/csharp/lib/Utils/Net/UdpExtensions.cs b/csharp/Lib/Utils/Net/UdpExtensions.cs similarity index 100% rename from csharp/lib/Utils/Net/UdpExtensions.cs rename to csharp/Lib/Utils/Net/UdpExtensions.cs diff --git a/csharp/lib/Utils/None.cs b/csharp/Lib/Utils/None.cs similarity index 100% rename from csharp/lib/Utils/None.cs rename to csharp/Lib/Utils/None.cs diff --git a/csharp/lib/Utils/NullableUtils.cs b/csharp/Lib/Utils/NullableUtils.cs similarity index 100% rename from csharp/lib/Utils/NullableUtils.cs rename to csharp/Lib/Utils/NullableUtils.cs diff --git a/csharp/lib/Utils/ObservableExceptionHandling.cs b/csharp/Lib/Utils/ObservableExceptionHandling.cs similarity index 100% rename from csharp/lib/Utils/ObservableExceptionHandling.cs rename to csharp/Lib/Utils/ObservableExceptionHandling.cs diff --git a/csharp/lib/Utils/ObservableUtils.cs b/csharp/Lib/Utils/ObservableUtils.cs similarity index 100% rename from csharp/lib/Utils/ObservableUtils.cs rename to csharp/Lib/Utils/ObservableUtils.cs diff --git a/csharp/lib/Utils/PointFree.cs b/csharp/Lib/Utils/PointFree.cs similarity index 100% rename from csharp/lib/Utils/PointFree.cs rename to csharp/Lib/Utils/PointFree.cs diff --git a/csharp/lib/Utils/SshHost.cs b/csharp/Lib/Utils/SshHost.cs similarity index 100% rename from csharp/lib/Utils/SshHost.cs rename to csharp/Lib/Utils/SshHost.cs diff --git a/csharp/lib/Utils/StreamExtensions.cs b/csharp/Lib/Utils/StreamExtensions.cs similarity index 100% rename from csharp/lib/Utils/StreamExtensions.cs rename to csharp/Lib/Utils/StreamExtensions.cs diff --git a/csharp/lib/Utils/StringUtils.cs b/csharp/Lib/Utils/StringUtils.cs similarity index 100% rename from csharp/lib/Utils/StringUtils.cs rename to csharp/Lib/Utils/StringUtils.cs diff --git a/csharp/lib/Utils/TaskUtils.cs b/csharp/Lib/Utils/TaskUtils.cs similarity index 100% rename from csharp/lib/Utils/TaskUtils.cs rename to csharp/Lib/Utils/TaskUtils.cs diff --git a/csharp/lib/Utils/TextBlock.cs b/csharp/Lib/Utils/TextBlock.cs similarity index 100% rename from csharp/lib/Utils/TextBlock.cs rename to csharp/Lib/Utils/TextBlock.cs diff --git a/csharp/lib/Utils/Try/Operators.async.cs b/csharp/Lib/Utils/Try/Operators.async.cs similarity index 100% rename from csharp/lib/Utils/Try/Operators.async.cs rename to csharp/Lib/Utils/Try/Operators.async.cs diff --git a/csharp/lib/Utils/Try/Operators.sync.cs b/csharp/Lib/Utils/Try/Operators.sync.cs similarity index 100% rename from csharp/lib/Utils/Try/Operators.sync.cs rename to csharp/Lib/Utils/Try/Operators.sync.cs diff --git a/csharp/lib/Utils/Try/Policy.cs b/csharp/Lib/Utils/Try/Policy.cs similarity index 100% rename from csharp/lib/Utils/Try/Policy.cs rename to csharp/Lib/Utils/Try/Policy.cs diff --git a/csharp/lib/Utils/Try/TryAsync.async.cs b/csharp/Lib/Utils/Try/TryAsync.async.cs similarity index 100% rename from csharp/lib/Utils/Try/TryAsync.async.cs rename to csharp/Lib/Utils/Try/TryAsync.async.cs diff --git a/csharp/lib/Utils/Try/TryAsync.cs b/csharp/Lib/Utils/Try/TryAsync.cs similarity index 100% rename from csharp/lib/Utils/Try/TryAsync.cs rename to csharp/Lib/Utils/Try/TryAsync.cs diff --git a/csharp/lib/Utils/Try/TryAsync.sync.cs b/csharp/Lib/Utils/Try/TryAsync.sync.cs similarity index 100% rename from csharp/lib/Utils/Try/TryAsync.sync.cs rename to csharp/Lib/Utils/Try/TryAsync.sync.cs diff --git a/csharp/lib/Utils/Try/TrySync.async.cs b/csharp/Lib/Utils/Try/TrySync.async.cs similarity index 100% rename from csharp/lib/Utils/Try/TrySync.async.cs rename to csharp/Lib/Utils/Try/TrySync.async.cs diff --git a/csharp/lib/Utils/Try/TrySync.cs b/csharp/Lib/Utils/Try/TrySync.cs similarity index 100% rename from csharp/lib/Utils/Try/TrySync.cs rename to csharp/Lib/Utils/Try/TrySync.cs diff --git a/csharp/lib/Utils/Try/TrySync.sync.cs b/csharp/Lib/Utils/Try/TrySync.sync.cs similarity index 100% rename from csharp/lib/Utils/Try/TrySync.sync.cs rename to csharp/Lib/Utils/Try/TrySync.sync.cs diff --git a/csharp/lib/Utils/Units.cs b/csharp/Lib/Utils/Units.cs similarity index 100% rename from csharp/lib/Utils/Units.cs rename to csharp/Lib/Utils/Units.cs diff --git a/csharp/lib/Utils/Utils.cs b/csharp/Lib/Utils/Utils.cs similarity index 100% rename from csharp/lib/Utils/Utils.cs rename to csharp/Lib/Utils/Utils.cs diff --git a/csharp/lib/Utils/Utils.csproj b/csharp/Lib/Utils/Utils.csproj similarity index 87% rename from csharp/lib/Utils/Utils.csproj rename to csharp/Lib/Utils/Utils.csproj index 222f85663..59af027d7 100644 --- a/csharp/lib/Utils/Utils.csproj +++ b/csharp/Lib/Utils/Utils.csproj @@ -1,5 +1,5 @@ - + diff --git a/csharp/lib/Utils/Utils.sln b/csharp/Lib/Utils/Utils.sln similarity index 100% rename from csharp/lib/Utils/Utils.sln rename to csharp/Lib/Utils/Utils.sln diff --git a/csharp/lib/Utils/ValueTupleUtils.cs b/csharp/Lib/Utils/ValueTupleUtils.cs similarity index 100% rename from csharp/lib/Utils/ValueTupleUtils.cs rename to csharp/Lib/Utils/ValueTupleUtils.cs diff --git a/csharp/lib/Victron/VeDBus/Program.cs b/csharp/Lib/Victron/VeDBus/Program.cs similarity index 100% rename from csharp/lib/Victron/VeDBus/Program.cs rename to csharp/Lib/Victron/VeDBus/Program.cs diff --git a/csharp/lib/Victron/VeDBus/VeDBus.cs b/csharp/Lib/Victron/VeDBus/VeDBus.cs similarity index 100% rename from csharp/lib/Victron/VeDBus/VeDBus.cs rename to csharp/Lib/Victron/VeDBus/VeDBus.cs diff --git a/csharp/lib/Victron/VeDBus/VeDBus.csproj b/csharp/Lib/Victron/VeDBus/VeDBus.csproj similarity index 88% rename from csharp/lib/Victron/VeDBus/VeDBus.csproj rename to csharp/Lib/Victron/VeDBus/VeDBus.csproj index 5f986d84c..fe0000124 100644 --- a/csharp/lib/Victron/VeDBus/VeDBus.csproj +++ b/csharp/Lib/Victron/VeDBus/VeDBus.csproj @@ -1,6 +1,6 @@ - + diff --git a/csharp/lib/Victron/VeDBus/VeDBusApi.cs b/csharp/Lib/Victron/VeDBus/VeDBusApi.cs similarity index 100% rename from csharp/lib/Victron/VeDBus/VeDBusApi.cs rename to csharp/Lib/Victron/VeDBus/VeDBusApi.cs diff --git a/csharp/lib/Victron/VeDBus/VeDbusService.cs b/csharp/Lib/Victron/VeDBus/VeDbusService.cs similarity index 100% rename from csharp/lib/Victron/VeDBus/VeDbusService.cs rename to csharp/Lib/Victron/VeDBus/VeDbusService.cs diff --git a/csharp/lib/Victron/VeDBus/VeProperties.Dbus.cs b/csharp/Lib/Victron/VeDBus/VeProperties.Dbus.cs similarity index 100% rename from csharp/lib/Victron/VeDBus/VeProperties.Dbus.cs rename to csharp/Lib/Victron/VeDBus/VeProperties.Dbus.cs diff --git a/csharp/lib/Victron/VeDBus/VeProperties.cs b/csharp/Lib/Victron/VeDBus/VeProperties.cs similarity index 100% rename from csharp/lib/Victron/VeDBus/VeProperties.cs rename to csharp/Lib/Victron/VeDBus/VeProperties.cs diff --git a/csharp/lib/Victron/VeDBus/VeProperty.cs b/csharp/Lib/Victron/VeDBus/VeProperty.cs similarity index 100% rename from csharp/lib/Victron/VeDBus/VeProperty.cs rename to csharp/Lib/Victron/VeDBus/VeProperty.cs diff --git a/csharp/lib/Victron/VictronVRM/Detail.cs b/csharp/Lib/Victron/VictronVRM/Detail.cs similarity index 100% rename from csharp/lib/Victron/VictronVRM/Detail.cs rename to csharp/Lib/Victron/VictronVRM/Detail.cs diff --git a/csharp/lib/Victron/VictronVRM/Details.cs b/csharp/Lib/Victron/VictronVRM/Details.cs similarity index 100% rename from csharp/lib/Victron/VictronVRM/Details.cs rename to csharp/Lib/Victron/VictronVRM/Details.cs diff --git a/csharp/lib/Victron/VictronVRM/Device.cs b/csharp/Lib/Victron/VictronVRM/Device.cs similarity index 100% rename from csharp/lib/Victron/VictronVRM/Device.cs rename to csharp/Lib/Victron/VictronVRM/Device.cs diff --git a/csharp/lib/Victron/VictronVRM/FlurlExtensions.cs b/csharp/Lib/Victron/VictronVRM/FlurlExtensions.cs similarity index 100% rename from csharp/lib/Victron/VictronVRM/FlurlExtensions.cs rename to csharp/Lib/Victron/VictronVRM/FlurlExtensions.cs diff --git a/csharp/lib/Victron/VictronVRM/Installation.Settings.cs b/csharp/Lib/Victron/VictronVRM/Installation.Settings.cs similarity index 100% rename from csharp/lib/Victron/VictronVRM/Installation.Settings.cs rename to csharp/Lib/Victron/VictronVRM/Installation.Settings.cs diff --git a/csharp/lib/Victron/VictronVRM/Installation.Tags.cs b/csharp/Lib/Victron/VictronVRM/Installation.Tags.cs similarity index 100% rename from csharp/lib/Victron/VictronVRM/Installation.Tags.cs rename to csharp/Lib/Victron/VictronVRM/Installation.Tags.cs diff --git a/csharp/lib/Victron/VictronVRM/Installation.cs b/csharp/Lib/Victron/VictronVRM/Installation.cs similarity index 100% rename from csharp/lib/Victron/VictronVRM/Installation.cs rename to csharp/Lib/Victron/VictronVRM/Installation.cs diff --git a/csharp/lib/Victron/VictronVRM/Reply.cs b/csharp/Lib/Victron/VictronVRM/Reply.cs similarity index 100% rename from csharp/lib/Victron/VictronVRM/Reply.cs rename to csharp/Lib/Victron/VictronVRM/Reply.cs diff --git a/csharp/lib/Victron/VictronVRM/Requests.cs b/csharp/Lib/Victron/VictronVRM/Requests.cs similarity index 100% rename from csharp/lib/Victron/VictronVRM/Requests.cs rename to csharp/Lib/Victron/VictronVRM/Requests.cs diff --git a/csharp/lib/Victron/VictronVRM/Settings.cs b/csharp/Lib/Victron/VictronVRM/Settings.cs similarity index 100% rename from csharp/lib/Victron/VictronVRM/Settings.cs rename to csharp/Lib/Victron/VictronVRM/Settings.cs diff --git a/csharp/lib/Victron/VictronVRM/VictronVRM.csproj b/csharp/Lib/Victron/VictronVRM/VictronVRM.csproj similarity index 92% rename from csharp/lib/Victron/VictronVRM/VictronVRM.csproj rename to csharp/Lib/Victron/VictronVRM/VictronVRM.csproj index 4370080ea..f37c8f354 100644 --- a/csharp/lib/Victron/VictronVRM/VictronVRM.csproj +++ b/csharp/Lib/Victron/VictronVRM/VictronVRM.csproj @@ -1,6 +1,6 @@ - + full diff --git a/csharp/lib/Victron/VictronVRM/VrmAccount.cs b/csharp/Lib/Victron/VictronVRM/VrmAccount.cs similarity index 100% rename from csharp/lib/Victron/VictronVRM/VrmAccount.cs rename to csharp/Lib/Victron/VictronVRM/VrmAccount.cs diff --git a/csharp/lib/WebServer/ContentType.cs b/csharp/Lib/WebServer/ContentType.cs similarity index 100% rename from csharp/lib/WebServer/ContentType.cs rename to csharp/Lib/WebServer/ContentType.cs diff --git a/csharp/lib/WebServer/Default.cs b/csharp/Lib/WebServer/Default.cs similarity index 100% rename from csharp/lib/WebServer/Default.cs rename to csharp/Lib/WebServer/Default.cs diff --git a/csharp/lib/WebServer/HttpExtensions.cs b/csharp/Lib/WebServer/HttpExtensions.cs similarity index 100% rename from csharp/lib/WebServer/HttpExtensions.cs rename to csharp/Lib/WebServer/HttpExtensions.cs diff --git a/csharp/lib/WebServer/HttpHeader.cs b/csharp/Lib/WebServer/HttpHeader.cs similarity index 100% rename from csharp/lib/WebServer/HttpHeader.cs rename to csharp/Lib/WebServer/HttpHeader.cs diff --git a/csharp/lib/WebServer/HttpMethod.cs b/csharp/Lib/WebServer/HttpMethod.cs similarity index 100% rename from csharp/lib/WebServer/HttpMethod.cs rename to csharp/Lib/WebServer/HttpMethod.cs diff --git a/csharp/lib/WebServer/HttpRequest.cs b/csharp/Lib/WebServer/HttpRequest.cs similarity index 100% rename from csharp/lib/WebServer/HttpRequest.cs rename to csharp/Lib/WebServer/HttpRequest.cs diff --git a/csharp/lib/WebServer/HttpResponse.cs b/csharp/Lib/WebServer/HttpResponse.cs similarity index 100% rename from csharp/lib/WebServer/HttpResponse.cs rename to csharp/Lib/WebServer/HttpResponse.cs diff --git a/csharp/lib/WebServer/WebServer.cs b/csharp/Lib/WebServer/WebServer.cs similarity index 100% rename from csharp/lib/WebServer/WebServer.cs rename to csharp/Lib/WebServer/WebServer.cs diff --git a/csharp/lib/WebServer/WebServer.csproj b/csharp/Lib/WebServer/WebServer.csproj similarity index 76% rename from csharp/lib/WebServer/WebServer.csproj rename to csharp/Lib/WebServer/WebServer.csproj index 8063be2ce..00c76841c 100644 --- a/csharp/lib/WebServer/WebServer.csproj +++ b/csharp/Lib/WebServer/WebServer.csproj @@ -1,6 +1,6 @@ - + @@ -13,7 +13,7 @@ - + diff --git a/csharp/lib/Wireformat/WireFormat.csproj.DotSettings b/csharp/Lib/Wireformat/WireFormat.csproj.DotSettings similarity index 100% rename from csharp/lib/Wireformat/WireFormat.csproj.DotSettings rename to csharp/Lib/Wireformat/WireFormat.csproj.DotSettings diff --git a/csharp/lib/Wireformat/build_proto.sh b/csharp/Lib/Wireformat/build_proto.sh similarity index 100% rename from csharp/lib/Wireformat/build_proto.sh rename to csharp/Lib/Wireformat/build_proto.sh diff --git a/csharp/lib/Wireformat/package-lock.json b/csharp/Lib/Wireformat/package-lock.json similarity index 100% rename from csharp/lib/Wireformat/package-lock.json rename to csharp/Lib/Wireformat/package-lock.json diff --git a/csharp/lib/Wireformat/package.json b/csharp/Lib/Wireformat/package.json similarity index 100% rename from csharp/lib/Wireformat/package.json rename to csharp/Lib/Wireformat/package.json diff --git a/csharp/lib/Wireformat/proto/Payload.proto b/csharp/Lib/Wireformat/proto/Payload.proto similarity index 100% rename from csharp/lib/Wireformat/proto/Payload.proto rename to csharp/Lib/Wireformat/proto/Payload.proto diff --git a/csharp/lib/Wireformat/proto/VictronV1/BatteryStatus48TL.proto b/csharp/Lib/Wireformat/proto/VictronV1/BatteryStatus48TL.proto similarity index 100% rename from csharp/lib/Wireformat/proto/VictronV1/BatteryStatus48TL.proto rename to csharp/Lib/Wireformat/proto/VictronV1/BatteryStatus48TL.proto diff --git a/csharp/lib/Wireformat/proto/VictronV1/Device.proto b/csharp/Lib/Wireformat/proto/VictronV1/Device.proto similarity index 100% rename from csharp/lib/Wireformat/proto/VictronV1/Device.proto rename to csharp/Lib/Wireformat/proto/VictronV1/Device.proto diff --git a/csharp/lib/Wireformat/proto/VictronV1/VictronTopologyV1.proto b/csharp/Lib/Wireformat/proto/VictronV1/VictronTopologyV1.proto similarity index 100% rename from csharp/lib/Wireformat/proto/VictronV1/VictronTopologyV1.proto rename to csharp/Lib/Wireformat/proto/VictronV1/VictronTopologyV1.proto diff --git a/csharp/app/Backend/db.sqlite b/csharp/app/Backend/db.sqlite deleted file mode 100644 index fc3ad2ed8207696af0e245f9f64a04984997fcba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 290816 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

)vO`dF$*ul2_5nMn15SWmZTwepLlvE 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

D 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

s%ile-&AEBHK#S-WiWBWjhu~O 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

{3`(T` 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 Si3S$9goLy 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 qUG`Zih#2=s@yr-!q - - - - - - - - - - - - - - - diff --git a/csharp/app/SaliMax/SaliMax.csproj b/csharp/app/SaliMax/SaliMax.csproj deleted file mode 100644 index 2c2d378bd..000000000 --- a/csharp/app/SaliMax/SaliMax.csproj +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/csharp/lib/Channels/Channels.csproj b/csharp/lib/Channels/Channels.csproj deleted file mode 100644 index 38b2fa318..000000000 --- a/csharp/lib/Channels/Channels.csproj +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/csharp/lib/Time/Time.csproj b/csharp/lib/Time/Time.csproj deleted file mode 100644 index a2a63460f..000000000 --- a/csharp/lib/Time/Time.csproj +++ /dev/null @@ -1,3 +0,0 @@ - - - From 1aec8e1fe97e1d1c31a3cc7a7eb10a49cba5d719 Mon Sep 17 00:00:00 2001 From: ig Date: Sat, 25 Feb 2023 16:16:12 +0100 Subject: [PATCH 04/12] Remove S3 lib --- csharp/InnovEnergy.props | 2 +- csharp/InnovEnergy.sln | 12 +- csharp/Lib/S3/DataRec.cs | 11 - .../Drivers/Internal/Delegates/ReadRecord.cs | 6 - .../Drivers/Internal/Delegates/WriteRecord.cs | 6 - csharp/Lib/S3/Drivers/Internal/Reader.cs | 50 ----- .../Lib/S3/Drivers/Internal/Reader.public.cs | 37 --- .../S3/Drivers/Internal/Util/Aggregator.cs | 60 ----- .../Lib/S3/Drivers/Internal/Util/Sampler.cs | 43 ---- csharp/Lib/S3/Drivers/Internal/Writer.cs | 129 ----------- .../Lib/S3/Drivers/Internal/Writer.public.cs | 26 --- csharp/Lib/S3/Drivers/MemoryDriver.cs | 57 ----- csharp/Lib/S3/Drivers/S3Config.cs | 83 ------- csharp/Lib/S3/Drivers/S3Driver.cs | 82 ------- csharp/Lib/S3/Metadata/AggregationLevel.cs | 52 ----- csharp/Lib/S3/Metadata/FieldType.cs | 8 - csharp/Lib/S3/Program.cs | 211 ------------------ csharp/Lib/S3/Records/Fields/Field.cs | 3 - csharp/Lib/S3/Records/Fields/NumberField.cs | 25 --- csharp/Lib/S3/Records/Fields/TextField.cs | 38 ---- csharp/Lib/S3/Records/Fields/TextFrequency.cs | 13 -- csharp/Lib/S3/Records/Fields/UnitAttribute.cs | 16 -- csharp/Lib/S3/Records/Fields/WithUnit.cs | 30 --- .../Lib/S3/Records/Operations/Aggregation.cs | 83 ------- .../Lib/S3/Records/Operations/Conversion.cs | 46 ---- csharp/Lib/S3/Records/Record.cs | 59 ----- .../Lib/S3/Records/Serialization/FieldTag.cs | 8 - csharp/Lib/S3/Records/Serialization/Parser.cs | 134 ----------- .../S3/Records/Serialization/Serializer.cs | 121 ---------- .../Records/Specialized/AggregatedRecord.cs | 23 -- .../Records/Specialized/TimeStampedRecord.cs | 27 --- csharp/Lib/S3/S3.csproj | 17 -- csharp/Lib/S3/Serialization/JsonConverters.cs | 167 -------------- csharp/Lib/SysTools/Edges/StringToCommand.cs | 28 +-- csharp/Lib/SysTools/FileIo.cs | 75 +++---- csharp/Lib/SysTools/Process/AsyncProcess.cs | 1 + csharp/Lib/SysTools/Process/ProcessResult.cs | 1 + csharp/Lib/SysTools/Process/SyncProcess.cs | 2 +- csharp/Lib/SysTools/Remote/RemoteCommand.cs | 1 + csharp/Lib/SysTools/Remote/RemoteFileIo.cs | 1 + csharp/Lib/SysTools/Remote/RemotePath.cs | 1 + csharp/Lib/SysTools/Remote/SshHost.cs | 1 + csharp/Lib/SysTools/SysCommand.cs | 1 + csharp/Lib/SysTools/SysDirs.cs | 1 + csharp/Lib/SysTools/SysPath.cs | 1 + csharp/Lib/SysTools/SysTools.csproj | 4 + csharp/Lib/SysTools/Utils/EnumerableUtils.cs | 34 +-- csharp/Lib/SysTools/Utils/Utils.cs | 50 ----- csharp/Lib/Utils/Utils.cs | 4 +- 49 files changed, 78 insertions(+), 1813 deletions(-) delete mode 100644 csharp/Lib/S3/DataRec.cs delete mode 100644 csharp/Lib/S3/Drivers/Internal/Delegates/ReadRecord.cs delete mode 100644 csharp/Lib/S3/Drivers/Internal/Delegates/WriteRecord.cs delete mode 100644 csharp/Lib/S3/Drivers/Internal/Reader.cs delete mode 100644 csharp/Lib/S3/Drivers/Internal/Reader.public.cs delete mode 100644 csharp/Lib/S3/Drivers/Internal/Util/Aggregator.cs delete mode 100644 csharp/Lib/S3/Drivers/Internal/Util/Sampler.cs delete mode 100644 csharp/Lib/S3/Drivers/Internal/Writer.cs delete mode 100644 csharp/Lib/S3/Drivers/Internal/Writer.public.cs delete mode 100644 csharp/Lib/S3/Drivers/MemoryDriver.cs delete mode 100644 csharp/Lib/S3/Drivers/S3Config.cs delete mode 100644 csharp/Lib/S3/Drivers/S3Driver.cs delete mode 100644 csharp/Lib/S3/Metadata/AggregationLevel.cs delete mode 100644 csharp/Lib/S3/Metadata/FieldType.cs delete mode 100644 csharp/Lib/S3/Program.cs delete mode 100644 csharp/Lib/S3/Records/Fields/Field.cs delete mode 100644 csharp/Lib/S3/Records/Fields/NumberField.cs delete mode 100644 csharp/Lib/S3/Records/Fields/TextField.cs delete mode 100644 csharp/Lib/S3/Records/Fields/TextFrequency.cs delete mode 100644 csharp/Lib/S3/Records/Fields/UnitAttribute.cs delete mode 100644 csharp/Lib/S3/Records/Fields/WithUnit.cs delete mode 100644 csharp/Lib/S3/Records/Operations/Aggregation.cs delete mode 100644 csharp/Lib/S3/Records/Operations/Conversion.cs delete mode 100644 csharp/Lib/S3/Records/Record.cs delete mode 100644 csharp/Lib/S3/Records/Serialization/FieldTag.cs delete mode 100644 csharp/Lib/S3/Records/Serialization/Parser.cs delete mode 100644 csharp/Lib/S3/Records/Serialization/Serializer.cs delete mode 100644 csharp/Lib/S3/Records/Specialized/AggregatedRecord.cs delete mode 100644 csharp/Lib/S3/Records/Specialized/TimeStampedRecord.cs delete mode 100644 csharp/Lib/S3/S3.csproj delete mode 100644 csharp/Lib/S3/Serialization/JsonConverters.cs diff --git a/csharp/InnovEnergy.props b/csharp/InnovEnergy.props index c6c92bd2a..5a4943931 100644 --- a/csharp/InnovEnergy.props +++ b/csharp/InnovEnergy.props @@ -9,7 +9,7 @@ net6.0 true false - $(Company).$(MSBuildProjectDirectory.Replace($(SolutionDir), "").Replace("lib/", "Lib/").Replace("app/", "App/").Replace("src/", "").Replace("/",".")) + $(Company).$(MSBuildProjectDirectory.Replace($(SolutionDir), "").Replace("src/", "").Replace("/",".")) $(Company) Team diff --git a/csharp/InnovEnergy.sln b/csharp/InnovEnergy.sln index 70c4b2f57..88f01a87d 100644 --- a/csharp/InnovEnergy.sln +++ b/csharp/InnovEnergy.sln @@ -20,10 +20,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "App", "App", "{145597B4-3E3 EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Lib", "Lib", "{AD5B98A8-AB7F-4DA2-B66D-5B4E63E7D854}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "S3", "Lib/S3/S3.csproj", "{C3639841-13F4-4F24-99C6-7D965593BF89}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "deprecated", "deprecated", "{46DE03C4-52D1-47AA-8E60-8BB15361D723}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SaliMax", "App/SaliMax/SaliMax.csproj", "{25073794-D859-4824-9984-194C7E928496}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StatusApi", "Lib/StatusApi/StatusApi.csproj", "{9D17E78C-8A70-43DB-A619-DC12D20D023D}" @@ -106,10 +102,6 @@ Global {40B45363-BE34-420B-8F87-775EE6EE3513}.Debug|Any CPU.Build.0 = Debug|Any CPU {40B45363-BE34-420B-8F87-775EE6EE3513}.Release|Any CPU.ActiveCfg = Release|Any CPU {40B45363-BE34-420B-8F87-775EE6EE3513}.Release|Any CPU.Build.0 = Release|Any CPU - {C3639841-13F4-4F24-99C6-7D965593BF89}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C3639841-13F4-4F24-99C6-7D965593BF89}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C3639841-13F4-4F24-99C6-7D965593BF89}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C3639841-13F4-4F24-99C6-7D965593BF89}.Release|Any CPU.Build.0 = Release|Any CPU {25073794-D859-4824-9984-194C7E928496}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {25073794-D859-4824-9984-194C7E928496}.Debug|Any CPU.Build.0 = Debug|Any CPU {25073794-D859-4824-9984-194C7E928496}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -187,11 +179,8 @@ Global {B2627B9F-41DF-44F7-A0D1-CA71FF4A007A} = {AD5B98A8-AB7F-4DA2-B66D-5B4E63E7D854} {F65F33B0-3522-4008-8D1E-47EF8E4C7AC7} = {145597B4-3E30-45E6-9F72-4DD43194539A} {E3A5F3A3-72A5-47CC-85C6-2D8E962A0EC1} = {145597B4-3E30-45E6-9F72-4DD43194539A} - {46DE03C4-52D1-47AA-8E60-8BB15361D723} = {AD5B98A8-AB7F-4DA2-B66D-5B4E63E7D854} - {4A67D79F-F0C9-4BBC-9601-D5948E6C05D3} = {46DE03C4-52D1-47AA-8E60-8BB15361D723} {25073794-D859-4824-9984-194C7E928496} = {145597B4-3E30-45E6-9F72-4DD43194539A} {9D17E78C-8A70-43DB-A619-DC12D20D023D} = {AD5B98A8-AB7F-4DA2-B66D-5B4E63E7D854} - {C3639841-13F4-4F24-99C6-7D965593BF89} = {46DE03C4-52D1-47AA-8E60-8BB15361D723} {4931A385-24DC-4E78-BFF4-356F8D6D5183} = {AD5B98A8-AB7F-4DA2-B66D-5B4E63E7D854} {794FD07C-93E9-4803-982E-1CA261504AB5} = {AD5B98A8-AB7F-4DA2-B66D-5B4E63E7D854} {BD8CBC5C-0B9E-48A3-BC4E-725E3FAB2348} = {AD5B98A8-AB7F-4DA2-B66D-5B4E63E7D854} @@ -211,5 +200,6 @@ Global {AF7E8DCA-8D48-498E-AB3D-208061B244DC} = {AD5B98A8-AB7F-4DA2-B66D-5B4E63E7D854} {A56F58C2-B265-435B-A985-53B4D6F49B1A} = {145597B4-3E30-45E6-9F72-4DD43194539A} {C04FB6DA-23C6-46BB-9B21-8F4FBA32FFF7} = {AD5B98A8-AB7F-4DA2-B66D-5B4E63E7D854} + {4A67D79F-F0C9-4BBC-9601-D5948E6C05D3} = {AD5B98A8-AB7F-4DA2-B66D-5B4E63E7D854} EndGlobalSection EndGlobal diff --git a/csharp/Lib/S3/DataRec.cs b/csharp/Lib/S3/DataRec.cs deleted file mode 100644 index 5ae585689..000000000 --- a/csharp/Lib/S3/DataRec.cs +++ /dev/null @@ -1,11 +0,0 @@ -using InnovEnergy.Lib.S3.Records.Fields; - -namespace InnovEnergy.Lib.S3; - -public record DataRec -{ - [Unit("V")] public Double Voltage { get; init; } - [Unit("A")] public Double Current { get; init; } - public Boolean Error { get; init; } - public String State { get; init; } -} \ No newline at end of file diff --git a/csharp/Lib/S3/Drivers/Internal/Delegates/ReadRecord.cs b/csharp/Lib/S3/Drivers/Internal/Delegates/ReadRecord.cs deleted file mode 100644 index ad088d513..000000000 --- a/csharp/Lib/S3/Drivers/Internal/Delegates/ReadRecord.cs +++ /dev/null @@ -1,6 +0,0 @@ -using InnovEnergy.Lib.S3.Metadata; -using InnovEnergy.Lib.S3.Records.Specialized; - -namespace InnovEnergy.Lib.S3.Drivers.Internal.Delegates; - -public delegate Task ReadRecord(AggregationLevel level, UInt32 index); \ No newline at end of file diff --git a/csharp/Lib/S3/Drivers/Internal/Delegates/WriteRecord.cs b/csharp/Lib/S3/Drivers/Internal/Delegates/WriteRecord.cs deleted file mode 100644 index 4bccde97d..000000000 --- a/csharp/Lib/S3/Drivers/Internal/Delegates/WriteRecord.cs +++ /dev/null @@ -1,6 +0,0 @@ -using InnovEnergy.Lib.S3.Metadata; -using InnovEnergy.Lib.S3.Records.Specialized; - -namespace InnovEnergy.Lib.S3.Drivers.Internal.Delegates; - -public delegate Task WriteRecord(TimeStampedRecord record, AggregationLevel level, UInt32 index); \ No newline at end of file diff --git a/csharp/Lib/S3/Drivers/Internal/Reader.cs b/csharp/Lib/S3/Drivers/Internal/Reader.cs deleted file mode 100644 index e5ba5c59e..000000000 --- a/csharp/Lib/S3/Drivers/Internal/Reader.cs +++ /dev/null @@ -1,50 +0,0 @@ -using InnovEnergy.Lib.S3.Drivers.Internal.Delegates; -using InnovEnergy.Lib.S3.Metadata; -using InnovEnergy.Lib.S3.Records.Specialized; -using InnovEnergy.Lib.Time.Unix; -using InnovEnergy.Lib.Utils; - -namespace InnovEnergy.Lib.S3.Drivers.Internal; - -public partial class Reader -{ - public IReadOnlyList AggregationLevels { get; } - public UnixTimeSpan SamplePeriod => AggregationLevels[0].SamplePeriod; - - private readonly ReadRecord _ReadRecord; - - internal Reader(IReadOnlyList levels, ReadRecord readRecord) - { - _ReadRecord = readRecord; - AggregationLevels = InitLevels(levels); - } - - public Task ReadRecord(AggregationLevel level, UInt32 index) - { - return _ReadRecord(level, index); - } - - private static IReadOnlyList InitLevels(IReadOnlyList levels) - { - if (!levels.Any()) - throw new ArgumentOutOfRangeException(nameof(levels)); - - levels = levels - .OrderBy(l => l.SamplePeriod.Ticks) - .ToReadOnlyList(levels.Count); - - var pairwise = levels - .Select(l => l.SamplePeriod) - .Pairwise() - .ToReadOnlyList(levels.Count - 1); - - var greater = pairwise.Any(ls => ls.right <= ls.left); - var multiple = pairwise.Any(ls => ls.right % ls.left != 0 ); - var retention = levels .Any(l => l.RetentionPeriod % l.SamplePeriod != 0); - - if (greater || multiple || retention) - throw new ArgumentException(nameof(levels)); // TODO: error messages - - return levels; - } -} \ No newline at end of file diff --git a/csharp/Lib/S3/Drivers/Internal/Reader.public.cs b/csharp/Lib/S3/Drivers/Internal/Reader.public.cs deleted file mode 100644 index 424b3ccfe..000000000 --- a/csharp/Lib/S3/Drivers/Internal/Reader.public.cs +++ /dev/null @@ -1,37 +0,0 @@ -using InnovEnergy.Lib.S3.Metadata; -using InnovEnergy.Lib.S3.Records.Specialized; -using InnovEnergy.Lib.Time.Unix; -using InnovEnergy.Lib.Utils; - -namespace InnovEnergy.Lib.S3.Drivers.Internal; - -public partial class Reader -{ - public Task> ReadRecords(UnixTime from, UnixTime to, Int32 minNumber) - { - var maxDt = (to - from) / minNumber; - return ReadRecords(from, to, maxDt); - } - - public async Task> ReadRecords(UnixTime from, UnixTime to, UnixTimeSpan maxDt) - { - if (maxDt < SamplePeriod) - maxDt = SamplePeriod; - - var level = AggregationLevels.LastOrDefault(l => l.SamplePeriod <= maxDt) ?? AggregationLevels[^1]; - - return await level - .RangeExclusive(from, to) - .Select(t => ReadRecord(level, t)) - .WhenAll(); - } - - public async Task ReadRecord(AggregationLevel level, UnixTime time) - { - var tsRecord = await ReadRecord(level, level.GetRetentionIndex(time)); - - return tsRecord.TimeStamp == time - ? tsRecord - : TimeStampedRecord.Empty(time); - } -} \ No newline at end of file diff --git a/csharp/Lib/S3/Drivers/Internal/Util/Aggregator.cs b/csharp/Lib/S3/Drivers/Internal/Util/Aggregator.cs deleted file mode 100644 index 999a2aa1a..000000000 --- a/csharp/Lib/S3/Drivers/Internal/Util/Aggregator.cs +++ /dev/null @@ -1,60 +0,0 @@ -using InnovEnergy.Lib.S3.Metadata; -using InnovEnergy.Lib.S3.Records; -using InnovEnergy.Lib.S3.Records.Operations; -using InnovEnergy.Lib.Utils; - -namespace InnovEnergy.Lib.S3.Drivers.Internal.Util; - -public class Aggregator -{ - public AggregationLevel AggregationLevel { get; } - - private Record[] Buffer { get; } - private UInt32 Index { get; set; } - - public Aggregator(AggregationLevel thisLevel, - AggregationLevel levelBelow, - IEnumerable initialRecords) - { - var ratio = thisLevel.SamplePeriod / levelBelow.SamplePeriod; - - AggregationLevel = thisLevel; - - Index = 0; - Buffer = new Record[ratio]; - - Clear(); - - foreach (var record in initialRecords) - Aggregate(record); - } - - public Record? Aggregate(Record r) - { - Buffer[Index++] = r; - - return IsFull - ? ForceAggregation() - : null; - } - - public Record? ForceAggregation() - { - if (IsEmpty) - return null; // nothing to aggregate - - var aggregated = Buffer.Aggregate(); - Clear(); - return aggregated; - } - - private void Clear() - { - Buffer.Fill(Record.Empty); - Index = 0; - } - - private Boolean IsFull => Index == Buffer.Length; - private Boolean IsEmpty => Index == 0; - -} \ No newline at end of file diff --git a/csharp/Lib/S3/Drivers/Internal/Util/Sampler.cs b/csharp/Lib/S3/Drivers/Internal/Util/Sampler.cs deleted file mode 100644 index 384b00487..000000000 --- a/csharp/Lib/S3/Drivers/Internal/Util/Sampler.cs +++ /dev/null @@ -1,43 +0,0 @@ -using InnovEnergy.Lib.S3.Metadata; -using InnovEnergy.Lib.S3.Records; -using InnovEnergy.Lib.S3.Records.Specialized; -using InnovEnergy.Lib.Time.Unix; - -namespace InnovEnergy.Lib.S3.Drivers.Internal.Util; - -internal class Sampler -{ - public Record CurrentRecord { get; set; } - public UnixTime CurrentTimeStamp { get; set; } - public AggregationLevel AggregationLevel { get; } - - private UnixTimeSpan SamplePeriod => AggregationLevel.SamplePeriod; - - public Sampler(AggregationLevel aggregationLevel, Record record, UnixTime currentTime) - { - AggregationLevel = aggregationLevel; - CurrentRecord = record; - CurrentTimeStamp = aggregationLevel.GetPeriodStartTime(currentTime); - } - - - // TODO: repeat/max age - public IEnumerable Sample(Record record, UnixTime timeStamp) - { - timeStamp = AggregationLevel.GetPeriodStartTime(timeStamp); - - if (timeStamp < CurrentTimeStamp) - yield break; //throw new IndexOutOfRangeException(nameof(index)); // TODO: log - - if (timeStamp > CurrentTimeStamp) - yield return new AggregatedRecord(CurrentRecord, AggregationLevel, CurrentTimeStamp); - - for (var t = CurrentTimeStamp + SamplePeriod; t < timeStamp; t += SamplePeriod) - yield return new AggregatedRecord(Record.Empty, AggregationLevel, t); - - CurrentTimeStamp = timeStamp; - CurrentRecord = record; - } - - -} \ No newline at end of file diff --git a/csharp/Lib/S3/Drivers/Internal/Writer.cs b/csharp/Lib/S3/Drivers/Internal/Writer.cs deleted file mode 100644 index 19156a4d3..000000000 --- a/csharp/Lib/S3/Drivers/Internal/Writer.cs +++ /dev/null @@ -1,129 +0,0 @@ -using System.Diagnostics; -using InnovEnergy.Lib.S3.Drivers.Internal.Delegates; -using InnovEnergy.Lib.S3.Drivers.Internal.Util; -using InnovEnergy.Lib.S3.Metadata; -using InnovEnergy.Lib.S3.Records; -using InnovEnergy.Lib.S3.Records.Specialized; -using InnovEnergy.Lib.Time.Unix; -using InnovEnergy.Lib.Utils; - -namespace InnovEnergy.Lib.S3.Drivers.Internal; - -using AggregationLevels = IReadOnlyList; -using Aggregators = IReadOnlyList; - -public partial class Writer : Reader, IDisposable -{ - private Sampler Sampler { get; } - private Aggregators Aggregators { get; } - - private readonly WriteRecord _WriteRecord; - - internal Writer(UnixTime startTime, - AggregationLevels levels, - ReadRecord readRecord, - WriteRecord writeRecord) : base(levels, readRecord) - { - _WriteRecord = writeRecord; - startTime = AggregationLevels.First().GetPeriodStartTime(startTime); - Sampler = InitializeSampler(startTime); - Aggregators = InitializeAggregators(startTime); - } - - private IReadOnlyList InitializeAggregators(UnixTime startTime) - { - return AggregationLevels - .Pairwise() - .SelectTuple((lo, hi) => InitializeAggregator(lo, hi, startTime)) - .ToReadOnlyList(AggregationLevels.Count - 1); - } - - private Aggregator InitializeAggregator(AggregationLevel lo, - AggregationLevel hi, - UnixTime currentTime) - { - // This was a REAL brainfuck to get right - - var loStartTime = lo.GetPeriodStartTime(currentTime); - var hiStartTime = hi.GetPeriodStartTime(currentTime); - - Debug.Assert(hiStartTime <= loStartTime); - - var initialRecords = lo - .RangeExclusive(hiStartTime, loStartTime) - .Select(t => ReadRecord(lo, t)) - .WhenAll() - .Result - .Select(r => r.Record); - - return new Aggregator(hi, lo, initialRecords); - } - - private Sampler InitializeSampler(UnixTime startTime) - { - var samplerLevel = AggregationLevels.First(); - var initialRecord = ReadRecord(samplerLevel, startTime).Result.Record; - - return new Sampler(samplerLevel, initialRecord, startTime); - } - - private IEnumerable Aggregate(Record record, UnixTime timeStamp) - { - return Sampler - .Sample(record, timeStamp) - .SelectMany(Aggregate); - } - - private IEnumerable Aggregate(AggregatedRecord r) - { - yield return r; - - var record = r.Record; - - foreach (var a in Aggregators) - { - record = a.Aggregate(record); - if (record is null) break; - - var timeStamp = a.AggregationLevel.GetPeriodStartTime(r.TimeStamp); - yield return new AggregatedRecord(record, a.AggregationLevel, timeStamp); - } - } - - private Task WriteRecord(AggregatedRecord rec) - { - var tsr = rec.ToTimeStamped(); - var level = rec.AggregationLevel; - var index = level.GetRetentionIndex(rec.TimeStamp); - - return _WriteRecord(tsr, level, index); - } - - void IDisposable.Dispose() - { - DisposeAsync().Wait(); - } - - private async Task DisposeAsync() - { - // feed the sampler an empty "next" record, so it writes and aggregates the current one. - await WriteRecord(Record.Empty, Sampler.CurrentTimeStamp + SamplePeriod); - - foreach (var a in Aggregators) - { - // force and write incomplete aggregation for each level - - var agg = a.ForceAggregation(); - if (agg is null) - continue; - - var lev = a.AggregationLevel; - var ts = lev.GetPeriodStartTime(Sampler.CurrentTimeStamp); - var tsr = agg!.TimeStamped(ts); - var idx = lev.GetRetentionIndex(ts); - - await _WriteRecord(tsr, lev, idx); - } - } - -} \ No newline at end of file diff --git a/csharp/Lib/S3/Drivers/Internal/Writer.public.cs b/csharp/Lib/S3/Drivers/Internal/Writer.public.cs deleted file mode 100644 index 15ab491cf..000000000 --- a/csharp/Lib/S3/Drivers/Internal/Writer.public.cs +++ /dev/null @@ -1,26 +0,0 @@ -using InnovEnergy.Lib.S3.Records; -using InnovEnergy.Lib.S3.Records.Specialized; -using InnovEnergy.Lib.Time.Unix; -using InnovEnergy.Lib.Utils; - -namespace InnovEnergy.Lib.S3.Drivers.Internal; - -public partial class Writer -{ - public Task WriteRecord(Record record) - { - return WriteRecord(record, UnixTime.Now); - } - - public Task WriteRecord(TimeStampedRecord tsr) - { - return WriteRecord(tsr.Record, tsr.TimeStamp); - } - - public Task WriteRecord(Record record, UnixTime time) - { - return Aggregate(record, time) - .Select(WriteRecord) - .WhenAll(); - } -} \ No newline at end of file diff --git a/csharp/Lib/S3/Drivers/MemoryDriver.cs b/csharp/Lib/S3/Drivers/MemoryDriver.cs deleted file mode 100644 index 8b70abf5e..000000000 --- a/csharp/Lib/S3/Drivers/MemoryDriver.cs +++ /dev/null @@ -1,57 +0,0 @@ -using InnovEnergy.Lib.S3.Drivers.Internal; -using InnovEnergy.Lib.S3.Drivers.Internal.Delegates; -using InnovEnergy.Lib.S3.Metadata; -using InnovEnergy.Lib.S3.Records.Specialized; -using InnovEnergy.Lib.Time.Unix; - -namespace InnovEnergy.Lib.S3.Drivers; - -using Levels = IReadOnlyList; -using Memory = Dictionary; - -public class MemoryDriver : Writer -{ - - public MemoryDriver(Levels levels, UnixTime startTime, Memory memory) : - base( - startTime, - levels, - ReadRecord(memory), - WriteRecord(memory) - ) - { - } - - private static String GetKey(AggregationLevel level, UInt32 index) - { - return $"{level}/{index}"; - } - - private static ReadRecord ReadRecord(Memory memory) - { - Task Read(AggregationLevel level, UInt32 index) - { - var key = GetKey(level, index); - - var result = memory.TryGetValue(key, out var tsRecord) - ? tsRecord - : TimeStampedRecord.Empty(); - - return Task.FromResult(result); - } - - return Read; - } - - private static WriteRecord WriteRecord(Memory memory) - { - Task Write(TimeStampedRecord record, AggregationLevel level, UInt32 index) - { - var key = GetKey(level, index); - memory[key] = record; - return Task.CompletedTask; - } - - return Write; - } -} \ No newline at end of file diff --git a/csharp/Lib/S3/Drivers/S3Config.cs b/csharp/Lib/S3/Drivers/S3Config.cs deleted file mode 100644 index 758244b3f..000000000 --- a/csharp/Lib/S3/Drivers/S3Config.cs +++ /dev/null @@ -1,83 +0,0 @@ -using System.Security.Cryptography; -using Flurl; -using Flurl.Http; -using InnovEnergy.Lib.Utils; -using static System.Text.Encoding; -using Convert = System.Convert; - -namespace InnovEnergy.Lib.S3.Drivers; - -public record S3Config -{ - public String Bucket { get; init; } = ""; - public String Region { get; init; } = ""; - public String Provider { get; init; } = ""; - public String Key { get; init; } = ""; - public String Secret { get; init; } = ""; - public String ContentType { get; init; } = ""; - - public String Host => $"{Bucket}.{Region}.{Provider}"; - public String Url => $"https://{Host}"; - - public IFlurlRequest CreatePutRequest(String s3Path) => CreateRequest("PUT", s3Path); - public IFlurlRequest CreateGetRequest(String s3Path) => CreateRequest("GET", s3Path); - - private IFlurlRequest CreateRequest(String method, String s3Path) - { - var date = DateTime.UtcNow.ToString("r"); - var auth = CreateAuthorization(method, s3Path, date); - - return Url - .AppendPathSegment(s3Path) - .WithHeader("Host", Host) - .WithHeader("Date", date) - .WithHeader("Authorization", auth) - .AllowAnyHttpStatus(); - } - - private String CreateAuthorization(String method, - String s3Path, - String date) - { - return CreateAuthorization - ( - method : method, - bucket : Bucket, - s3Path : s3Path, - date : date, - s3Key : Key, - s3Secret : Secret, - contentType: ContentType - ); - } - - - - private static String CreateAuthorization(String method, - String bucket, - String s3Path, - String date, - String s3Key, - String s3Secret, - String contentType = "", - String md5Hash = "") - { - // StringToSign = HTTP-Verb + "\n" + - // Content-MD5 + "\n" + - // Content-Type + "\n" + - // Date + "\n" + - // CanonicalizedAmzHeaders + - // CanonicalizedResource; - - var payload = $"{method}\n{md5Hash}\n{contentType}\n{date}\n/{bucket.Trim('/')}/{s3Path.Trim('/')}"; - using var hmacSha1 = new HMACSHA1(UTF8.GetBytes(s3Secret)); - - var signature = UTF8 - .GetBytes(payload) - .Apply(hmacSha1.ComputeHash) - .Apply(Convert.ToBase64String); - - return $"AWS {s3Key}:{signature}"; - } - -} \ No newline at end of file diff --git a/csharp/Lib/S3/Drivers/S3Driver.cs b/csharp/Lib/S3/Drivers/S3Driver.cs deleted file mode 100644 index 9d231e998..000000000 --- a/csharp/Lib/S3/Drivers/S3Driver.cs +++ /dev/null @@ -1,82 +0,0 @@ -using Flurl.Http; -using InnovEnergy.Lib.S3.Drivers.Internal; -using InnovEnergy.Lib.S3.Drivers.Internal.Delegates; -using InnovEnergy.Lib.S3.Metadata; -using InnovEnergy.Lib.S3.Records.Serialization; -using InnovEnergy.Lib.S3.Records.Specialized; -using InnovEnergy.Lib.Time.Unix; - -namespace InnovEnergy.Lib.S3.Drivers; - -using Levels = IReadOnlyList; - -public class S3Driver : Writer -{ - - public S3Driver(Levels levels, UnixTime startTime, S3Config config) : - base( - startTime, - levels, - ReadRecord(config), - WriteRecord(config) - ) - { - } - - private static String GetS3Path(AggregationLevel level, UInt32 index) - { - return $"/{level}/{index}"; - } - - private static ReadRecord ReadRecord(S3Config config) - { - async Task Read(AggregationLevel level, UInt32 index) - { - var s3Path = GetS3Path(level, index); - var request = config.CreateGetRequest(s3Path); - var response = await request.GetAsync(); - - if (response.StatusCode != 200) - { - Console.WriteLine("ERROR: Get " + s3Path); - var error = await response.GetStringAsync(); - Console.WriteLine(error); - return TimeStampedRecord.Empty(); - } - - var payload = await response.GetBytesAsync(); - - Console.WriteLine("GET " + s3Path); - return Parser.ParseTimeStampedRecord(payload); - } - - return Read; - } - - private static WriteRecord WriteRecord(S3Config config) - { - async Task Write(TimeStampedRecord record, AggregationLevel level, UInt32 index) - { - var payload = record.Serialize().ToArray(); - var s3Path = GetS3Path(level, index); - var request = config.CreatePutRequest(s3Path); - var response = await request.PutAsync(new ByteArrayContent(payload)); - - if (response.StatusCode == 200) - { - //Console.WriteLine("PUT " + s3Path); - } - else - { - Console.WriteLine("ERROR: PUT"); - var error = await response.GetStringAsync(); - Console.WriteLine(error); - } - } - - return Write; - } - - - -} \ No newline at end of file diff --git a/csharp/Lib/S3/Metadata/AggregationLevel.cs b/csharp/Lib/S3/Metadata/AggregationLevel.cs deleted file mode 100644 index fd1ecd184..000000000 --- a/csharp/Lib/S3/Metadata/AggregationLevel.cs +++ /dev/null @@ -1,52 +0,0 @@ -using InnovEnergy.Lib.Time.Unix; - -namespace InnovEnergy.Lib.S3.Metadata; - -public record AggregationLevel -{ - public UnixTimeSpan RetentionPeriod { get; } - public UnixTimeSpan SamplePeriod { get; } - public UInt32 RetentionBufferSize { get; } - - public AggregationLevel(UnixTimeSpan samplePeriod, UnixTimeSpan retentionPeriod) - { - SamplePeriod = samplePeriod; - RetentionPeriod = retentionPeriod; - RetentionBufferSize = retentionPeriod / samplePeriod; - } - - public IEnumerable RangeExclusive(UnixTime from, UnixTime to) - { - if (from > to) - throw new ArgumentOutOfRangeException(nameof(to)); - - for (var t = GetPeriodStartTime(from); t < to; t += SamplePeriod) - yield return t; - } - - - // TODO: - public IEnumerable RangeInclusive(UnixTime from, UnixTime to) - { - if (from >= to) - throw new ArgumentOutOfRangeException(nameof(to)); - - from = GetPeriodStartTime(from); - to = GetPeriodStartTime(to) + SamplePeriod; - - for (var t = GetPeriodStartTime(from); t < to; t += SamplePeriod) - yield return t; - } - - public UInt32 GetRetentionIndex(UnixTime t) - { - return t / SamplePeriod % RetentionBufferSize; - } - - public UnixTime GetPeriodStartTime(UnixTime t) - { - return UnixTime.Epoch + t / SamplePeriod * SamplePeriod; // integer division! - } - - public override String ToString() => SamplePeriod.ToString(); -} \ No newline at end of file diff --git a/csharp/Lib/S3/Metadata/FieldType.cs b/csharp/Lib/S3/Metadata/FieldType.cs deleted file mode 100644 index 9ca91a1af..000000000 --- a/csharp/Lib/S3/Metadata/FieldType.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace InnovEnergy.Lib.S3.Metadata; - -public enum FieldType -{ - Number, - Text, - Boolean, -} \ No newline at end of file diff --git a/csharp/Lib/S3/Program.cs b/csharp/Lib/S3/Program.cs deleted file mode 100644 index 4ba261f71..000000000 --- a/csharp/Lib/S3/Program.cs +++ /dev/null @@ -1,211 +0,0 @@ -using System.Reactive.Concurrency; -using System.Reactive.Linq; -using System.Reactive.Subjects; -using InnovEnergy.Lib.S3.Metadata; -using InnovEnergy.Lib.Time.Unix; -using InnovEnergy.Lib.Utils; -using static InnovEnergy.Lib.Time.Unix.UnixTimeSpan; - -namespace InnovEnergy.Lib.S3; - - - -public enum MyEnum -{ - Foo = 0x01, - Bar = 0x02, - Baz = 0x04 -} - - -public record Test(Double X, Double Y, Double Z); - - - - -public static class Program -{ - private static readonly Random Rng = new Random(0); - - - - - - - public static void Main(String[] args) - { - - // var x = Observable - // .Range(0, 22) - // .Select(i=> new Dictionary - // { - // {"i", i}, - // {"i*2", i * 2}, - // {"i/2", i / 2}, - // }) - // .DictObserve(o => Observable.Where(o, i=> i < 10)); - // - // x.Subscribe(ints => Console.WriteLine(String.Join(Environment.NewLine,ints) + "\n") ); - - - var src = Observable - .Interval(TimeSpan.FromSeconds(1)) - .BufferBy(i => i / 5) - .Subscribe(b => - { - var values = b.Select(e => e.ToString()).Aggregate("", (x, y) => $"{x}\n{y}"); - var average = b.Average(); - var msg = $"{values}\nAverage: {average}"; - - Console.WriteLine(msg); - }); - - - - Console.ReadLine(); - // var t = new Test(12, 2, 1); - // - // foreach (var m in typeof(Test).GetMembers().OfType()) - // { - // var parameters = m - // .GetParameters() - // .Select(p => $"{p.ParameterType.Name} {p.Name}") - // .Aggregate("", (a, b) => a + ", " + b) - // .TrimStart(", ".ToCharArray()); - // - // Console.WriteLine($"{m.ReturnType.Name} {m.Name}({parameters})"); - // } - - - return; - - var s = new Subject(); - - Observable.Interval(TimeSpan.FromSeconds(2), TaskPoolScheduler.Default) - .WithLatestFrom(s, (_, x) => x) - .Subscribe(Console.WriteLine); - - while (true) - { - var k = Console.ReadKey(true); - s.OnNext(k.KeyChar.ToString()); - } - - - - - var levels = new [] - { - new AggregationLevel( 2.Seconds(), 54.Weeks()), - new AggregationLevel(10.Seconds(), 54.Weeks()), - new AggregationLevel( 1.Minutes(), 54.Weeks()), - new AggregationLevel( 5.Minutes(), 540.Weeks()), - new AggregationLevel(15.Minutes(), 540.Weeks()), - new AggregationLevel( 1.Hours() , 540.Weeks()), - new AggregationLevel( 6.Hours() , 540.Weeks()), - new AggregationLevel( 1.Days() , 540.Weeks()), - new AggregationLevel( 1.Weeks() , Forever) - }; - - var resolution = 2.Seconds(); - - for (int i = 0; i < 10; i++) - { - var startTime = UnixTime.Epoch + Rng.Next(0, 2.Weeks().Ticks.ConvertTo()).Seconds(); - var split = Rng.Next(2, 1000); - - //Test(startTime, resolution, levels, split); - } - - - Console.WriteLine("Done"); - } - - // private static void Test(UnixTime startTime, UnixTimeSpan resolution, AggregationLevel[] aggregationLevels, Int32 split) - // { - // var times = Enumerable - // .Range(0, 2.Weeks().Ticks.ConvertTo()) - // .Select(t => startTime + t * resolution) - // .ToReadOnlyList(); - // - // var records = times - // //.Where(_ => Rng.NextDouble() > .25) // "loose" 1 in 4 - // .Select(t => ( - // record: new Record - // ( - // // new NumberField("Current", t.Ticks / 2, "A"), - // new SubRecord("Sub1", new Record(new NumberField("Current1", t.Ticks / 4, "A"))), - // new SubRecord("Sub2", new Record(new NumberField("Current2", t.Ticks / 8, "A"))) - // ), - // time: t + Rng.NextDouble().Apply(Math.Round).ConvertTo().Seconds() // add noise - // )) - // .ToList(); - // - // - // var allMemory = new Dictionary(); - // using (var driverAll = new MemoryDriver(aggregationLevels, startTime, allMemory)) - // { - // foreach (var record in records) - // driverAll.WriteRecord(record.record, record.time); - // } - // - // var list = allMemory.Where(kv => kv.Key.StartsWith("1w")).ToList(); - // - // var splitMemory = new Dictionary(); - // using (var driver1 = new MemoryDriver(aggregationLevels, startTime, splitMemory)) - // { - // foreach (var record in records.Take(split)) - // driver1.WriteRecord(record.record, record.time); - // } - // - // using (var driver2 = new MemoryDriver(aggregationLevels, records.ElementAt(split-1).time, splitMemory)) - // { - // foreach (var record in records.Skip(split-1)) - // driver2.WriteRecord(record.record, record.time); - // } - // - // - // - // var zip = Enumerable.Zip( - // allMemory.OrderBy(kv => kv.Key), - // splitMemory.OrderBy(kv => kv.Key) - // ); - // - // foreach (var (l, r) in zip) - // { - // var nl = l.Value.Record.Fields.OfType().FirstOrDefault()?.Value; - // var nr = r.Value.Record.Fields.OfType().FirstOrDefault()?.Value; - // - // if (l.Key != r.Key) - // { - // Console.WriteLine($"{l.Key} <=> {r.Key}"); - // break; - // } - // - // if (nl != nr) - // { - // Console.WriteLine($"{l.Value.TimeStamp.ToUtcDateTime()}: {nl} <=> {nr}"); - // } - // } - // } - - - public static String CreateRandomState() - { - var r = Rng.NextDouble() * 100; - - return r switch - { - >= 90 => "Heating", - >= 10 => "SelfConsumption", - _ => "CalibrationCharge" - }; - } - - - - - - - -} \ No newline at end of file diff --git a/csharp/Lib/S3/Records/Fields/Field.cs b/csharp/Lib/S3/Records/Fields/Field.cs deleted file mode 100644 index a68f29cd4..000000000 --- a/csharp/Lib/S3/Records/Fields/Field.cs +++ /dev/null @@ -1,3 +0,0 @@ -namespace InnovEnergy.Lib.S3.Records.Fields; - -public abstract record Field; \ No newline at end of file diff --git a/csharp/Lib/S3/Records/Fields/NumberField.cs b/csharp/Lib/S3/Records/Fields/NumberField.cs deleted file mode 100644 index 62aca9f6c..000000000 --- a/csharp/Lib/S3/Records/Fields/NumberField.cs +++ /dev/null @@ -1,25 +0,0 @@ -namespace InnovEnergy.Lib.S3.Records.Fields; - -public record NumberField : Field -{ - public Double Value { get; } - public Double Min { get; } - public Double Max { get; } - public String Unit { get; } - - public NumberField(Double value, Double min, Double max, String unit = "") - { - Value = value; - Min = min; - Max = max; - Unit = unit; - } - - public NumberField(Double value, String unit = "") : this(value, value, value, unit) - { - } - - public NumberField(Boolean value) : this(value?100:0, "%") - { - } -} \ No newline at end of file diff --git a/csharp/Lib/S3/Records/Fields/TextField.cs b/csharp/Lib/S3/Records/Fields/TextField.cs deleted file mode 100644 index 7b1ebd2e4..000000000 --- a/csharp/Lib/S3/Records/Fields/TextField.cs +++ /dev/null @@ -1,38 +0,0 @@ -using InnovEnergy.Lib.Utils; - -namespace InnovEnergy.Lib.S3.Records.Fields; - -public record TextField : Field -{ - public IReadOnlyList Frequencies { get; } - - public TextField(IReadOnlyList frequencies) - { - Frequencies = frequencies; - } - - public TextField(params TextFrequency[] frequencies) : this((IReadOnlyList)frequencies) - { - } - - public TextField(String text) : this(new TextFrequency(text)) - { - } - - public TextField(Enum enumValue) : this(GetEnumFlagsAsFrequencies(enumValue)) - { - } - - private static IReadOnlyList GetEnumFlagsAsFrequencies(Enum enumValue) - { - return enumValue - .ToString() - .Split(',') // debug view is '|' separated, toString() uses ',' !! - .Select(v => v.Trim()) - .Where(v => !v.IsInteger()) // filter "unknown" enum flags - .Select(f => new TextFrequency(f)) - .ToReadOnlyList(); - } - - -} \ No newline at end of file diff --git a/csharp/Lib/S3/Records/Fields/TextFrequency.cs b/csharp/Lib/S3/Records/Fields/TextFrequency.cs deleted file mode 100644 index 60974957f..000000000 --- a/csharp/Lib/S3/Records/Fields/TextFrequency.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace InnovEnergy.Lib.S3.Records.Fields; - -public record TextFrequency -{ - public TextFrequency(String text, Double percent = 100) - { - Text = text; - Percent = percent; - } - - public String Text { get; } - public Double Percent { get; } -} \ No newline at end of file diff --git a/csharp/Lib/S3/Records/Fields/UnitAttribute.cs b/csharp/Lib/S3/Records/Fields/UnitAttribute.cs deleted file mode 100644 index 1bd25600c..000000000 --- a/csharp/Lib/S3/Records/Fields/UnitAttribute.cs +++ /dev/null @@ -1,16 +0,0 @@ -namespace InnovEnergy.Lib.S3.Records.Fields; - -[AttributeUsage(AttributeTargets.Property)] -public sealed class UnitAttribute : Attribute -{ - private readonly String _Unit; - - public UnitAttribute(String unit) - { - _Unit = unit; - } - - public override String ToString() => _Unit; - - public static implicit operator String(UnitAttribute a) => a.ToString(); -} \ No newline at end of file diff --git a/csharp/Lib/S3/Records/Fields/WithUnit.cs b/csharp/Lib/S3/Records/Fields/WithUnit.cs deleted file mode 100644 index 01104d9de..000000000 --- a/csharp/Lib/S3/Records/Fields/WithUnit.cs +++ /dev/null @@ -1,30 +0,0 @@ -namespace InnovEnergy.Lib.S3.Records.Fields; - -public readonly struct WithUnit -{ - public String Unit { get; } - public Double Value { get; } - - public WithUnit(Double value, String unit) - { - Unit = unit; - Value = value; - } - - public override String ToString() => Unit; -} - -public static class UnitExtensions -{ - public static WithUnit Unit(this Double number, String unit) => new WithUnit(number, unit); - public static WithUnit Unit(this Single number, String unit) => new WithUnit(number, unit); - public static WithUnit Unit(this Half number, String unit) => new WithUnit((Double) number, unit); - public static WithUnit Unit(this SByte number, String unit) => new WithUnit(number, unit); - public static WithUnit Unit(this Byte number, String unit) => new WithUnit(number, unit); - public static WithUnit Unit(this Int16 number, String unit) => new WithUnit(number, unit); - public static WithUnit Unit(this UInt16 number, String unit) => new WithUnit(number, unit); - public static WithUnit Unit(this Int32 number, String unit) => new WithUnit(number, unit); - public static WithUnit Unit(this UInt32 number, String unit) => new WithUnit(number, unit); - public static WithUnit Unit(this Int64 number, String unit) => new WithUnit(number, unit); - public static WithUnit Unit(this UInt64 number, String unit) => new WithUnit(number, unit); -} \ No newline at end of file diff --git a/csharp/Lib/S3/Records/Operations/Aggregation.cs b/csharp/Lib/S3/Records/Operations/Aggregation.cs deleted file mode 100644 index 1b938947f..000000000 --- a/csharp/Lib/S3/Records/Operations/Aggregation.cs +++ /dev/null @@ -1,83 +0,0 @@ -using System.Diagnostics.CodeAnalysis; -using InnovEnergy.Lib.S3.Records.Fields; -using InnovEnergy.Lib.Utils; - -namespace InnovEnergy.Lib.S3.Records.Operations; - -// ReSharper disable ArgumentsStyleOther - - -public static class Aggregation -{ - - [SuppressMessage("ReSharper", "PossibleMultipleEnumeration")] - public static Record Aggregate(this IReadOnlyList records) - { - var availability = records.Sum(r => r.Availability) / records.Count; - - if (availability == 0) - return Record.Empty; - - var numbers = records.GetColumns().Select(AggregateNumbers); - var texts = records.GetColumns() .Select(AggregateTexts); - var subRecords = records.GetColumns() .Select(AggregateRecords); - - var aggregated = numbers.Concat(texts).Concat(subRecords); - - var fields = new Dictionary(aggregated); - - return new Record - ( - fields, - availability - ); - } - - private static IEnumerable<(String name, F field)> GetFields(this IEnumerable records) where F : Field - { - foreach (var record in records) - foreach (var (name, field) in record.Fields) - if (field is F f) - yield return (name, f); - } - - private static ILookup GetColumns(this IEnumerable records) where F : Field - { - return records - .GetFields() - .ToLookup(nf => nf.name, nf => nf.field); - } - - - private static KeyValuePair AggregateTexts(IGrouping column) - { - var textFrequencies = column - .SelectMany(s => s.Frequencies) - .GroupBy(f => f.Text, f => f.Percent) - .Select(g => new TextFrequency(text: g.Key, percent: g.Sum() / g.Count())) - .OrderBy(f => f.Text) - .ToReadOnlyList(); - - return new (column.Key, new TextField(textFrequencies)); - } - - private static KeyValuePair AggregateNumbers(IGrouping column) - { - var aggregated = new NumberField - ( - min: column.Min(f => f.Min), - max: column.Max(f => f.Max), - value: column.Average(f => f.Value), - unit: column.First().Unit - ); - - return new (column.Key, aggregated); - } - - private static KeyValuePair AggregateRecords(IGrouping column) - { - var aggregate = column.ToReadOnlyList().Apply(Aggregate); - - return new(column.Key, aggregate); - } -} \ No newline at end of file diff --git a/csharp/Lib/S3/Records/Operations/Conversion.cs b/csharp/Lib/S3/Records/Operations/Conversion.cs deleted file mode 100644 index cb68eb4ca..000000000 --- a/csharp/Lib/S3/Records/Operations/Conversion.cs +++ /dev/null @@ -1,46 +0,0 @@ -using System.Reflection; -using InnovEnergy.Lib.S3.Records.Fields; -using InnovEnergy.Lib.Utils; -using static System.Reflection.BindingFlags; - -namespace InnovEnergy.Lib.S3.Records.Operations; - -public static class Conversion -{ - public static Record ToRecord(this Object t) - { - var fields = t.GetType() - .Apply(GetProperties) - .ToDictionary(p => p.Name, PropertyToField); - - return new Record(fields); - - Field PropertyToField(PropertyInfo p) => p.GetValue(t) switch - { - Double d => new NumberField(d, Unit(p)), - Boolean b => new NumberField(b), - Enum e => new TextField(e), - String s => new TextField(s), // ReSharper disable once PatternAlwaysOfType - Object o => ToRecord(o), - _ => throw new ArgumentException() - }; - } - - private static String Unit(MemberInfo member) - { - return member - .GetCustomAttributes() - .OfType() - .FirstOrDefault()? - .ToString() - ?? ""; - } - - private static IEnumerable GetProperties() => typeof(T).GetProperties(Instance | Public); - - private static IEnumerable GetProperties(Type t) => t.GetProperties(Instance | Public); - - - - -} \ No newline at end of file diff --git a/csharp/Lib/S3/Records/Record.cs b/csharp/Lib/S3/Records/Record.cs deleted file mode 100644 index 365765843..000000000 --- a/csharp/Lib/S3/Records/Record.cs +++ /dev/null @@ -1,59 +0,0 @@ -using InnovEnergy.Lib.S3.Records.Fields; -using InnovEnergy.Lib.S3.Records.Specialized; -using InnovEnergy.Lib.Time.Unix; - -namespace InnovEnergy.Lib.S3.Records; - -public record Record : Field -{ - public static Record Empty { get; } = new Record(new Dictionary(), 0); - - public IReadOnlyDictionary Fields { get; } - public Double Availability { get; } - - public Boolean IsEmpty => Fields.Count == 0; - - - public Record(IReadOnlyDictionary fields, Double availability = 1.0) - { - Fields = fields; - Availability = availability; - } - - public F GetField(String name) where F : Field - { - return (F) Fields[name]; - } - - public TimeStampedRecord TimeStamped(UnixTime unixTime) => new TimeStampedRecord(this, unixTime); - - - public static Record ParseDict(Dictionary dict, Double availability = 1.0) - { - var fields = dict.ToDictionary(kv => kv.Key, kv => ParseField(kv.Value)); - return new Record(fields, availability); - } - - private static Field ParseField(Object value) => - value switch - { - WithUnit v => new NumberField(v.Value, v.Unit), - Enum v => new TextField(v), - String v => new TextField(v), - Double v => new NumberField(v), - Field v => v, - Single v => new NumberField(v), - SByte v => new NumberField(v), - Byte v => new NumberField(v), - Int16 v => new NumberField(v), - UInt16 v => new NumberField(v), - Int32 v => new NumberField(v), - UInt32 v => new NumberField(v), - Int64 v => new NumberField(v), - UInt64 v => new NumberField(v), - Half v => new NumberField((Double)v), - _ => throw new ArgumentOutOfRangeException(nameof(value)) - }; - - -} \ No newline at end of file diff --git a/csharp/Lib/S3/Records/Serialization/FieldTag.cs b/csharp/Lib/S3/Records/Serialization/FieldTag.cs deleted file mode 100644 index 8dff3261b..000000000 --- a/csharp/Lib/S3/Records/Serialization/FieldTag.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace InnovEnergy.Lib.S3.Records.Serialization; - -public enum FieldTag : Byte -{ - NumberField = 0, - TextField = 1, - RecordField = 2, -} \ No newline at end of file diff --git a/csharp/Lib/S3/Records/Serialization/Parser.cs b/csharp/Lib/S3/Records/Serialization/Parser.cs deleted file mode 100644 index 76319a31a..000000000 --- a/csharp/Lib/S3/Records/Serialization/Parser.cs +++ /dev/null @@ -1,134 +0,0 @@ -using System.Text; -using InnovEnergy.Lib.S3.Records.Fields; -using InnovEnergy.Lib.S3.Records.Specialized; -using InnovEnergy.Lib.Time.Unix; -using InnovEnergy.Lib.Utils; - -namespace InnovEnergy.Lib.S3.Records.Serialization; - -public class Parser -{ - private Int32 Position { get; set; } - private Byte[] Data { get; } - - private Parser(Byte[] data, Int32 position = 0) - { - Data = data; - Position = position; - } - - public Boolean IsPastEnd => Position >= Data.Length; - - public static TimeStampedRecord ParseTimeStampedRecord(Byte[] data) - { - var parser = new Parser(data); - - var timeStamp = parser.ParseUnixTime(); - var record = parser.ParseRecord(); - - return new TimeStampedRecord(record, timeStamp); - } - - - private UnixTime ParseUnixTime() - { - var span = new ReadOnlySpan(Data, Position, sizeof(UInt32)); - var ticks = BitConverter.ToUInt32(span); - - Position += span.Length; - - return UnixTime.FromTicks(ticks); - } - - private Single ParseFloat() - { - var span = new ReadOnlySpan(Data, Position, sizeof(Single)); - Position += span.Length; - return BitConverter.ToSingle(span); - } - - private String ParseString() - { - var len = GetByte(); - var span = new ReadOnlySpan(Data, Position, len); - - Position += span.Length; - - return Encoding.UTF8.GetString(span); - } - - private NumberField ParseNumberField() - { - var value = ParseFloat(); - var min = ParseFloat(); - var max = ParseFloat(); - var unit = ParseString(); - - return new NumberField(value, min, max, unit); - } - - private TextFrequency ParseTextFrequency() - { - var txt = ParseString(); - var frq = ParseFloat(); - - return new TextFrequency(txt, frq); - } - - private Record ParseRecord() - { - var availability = ParseFloat(); - var fields = ParseFields(); - - return new Record(fields, availability); - } - - private IReadOnlyDictionary ParseFields() - { - var len = GetByte(); - - var fields = Enumerable - .Range(0, len) - .Select(_ => ParseNamedField()); - - return new Dictionary(fields); - } - - private Field ParseField() - { - var tag = ParseFieldTag(); - - return tag switch - { - FieldTag.NumberField => ParseNumberField(), - FieldTag.TextField => ParseTextField(), - FieldTag.RecordField => ParseRecord(), - _ => throw new ArgumentOutOfRangeException(nameof(FieldTag)) - }; - } - - private KeyValuePair ParseNamedField() - { - var name = ParseString(); - var field = ParseField(); - - return new KeyValuePair(name, field); - } - - - private TextField ParseTextField() - { - var len = GetByte(); - - var fqs = Enumerable - .Range(0, len) - .Select(_ => ParseTextFrequency()) - .ToReadOnlyList(len); - - return new TextField(fqs); - } - - private Byte GetByte() => Data[Position++]; - - private FieldTag ParseFieldTag() => (FieldTag) GetByte(); -} \ No newline at end of file diff --git a/csharp/Lib/S3/Records/Serialization/Serializer.cs b/csharp/Lib/S3/Records/Serialization/Serializer.cs deleted file mode 100644 index d7766df8d..000000000 --- a/csharp/Lib/S3/Records/Serialization/Serializer.cs +++ /dev/null @@ -1,121 +0,0 @@ -using InnovEnergy.Lib.S3.Records.Fields; -using InnovEnergy.Lib.S3.Records.Specialized; -using InnovEnergy.Lib.Time.Unix; -using InnovEnergy.Lib.Utils; -using static System.Text.Encoding; - -namespace InnovEnergy.Lib.S3.Records.Serialization; - -public static class Serializer -{ - public static IEnumerable Serialize(this TimeStampedRecord tsr) - { - if (!BitConverter.IsLittleEndian) - throw new ArgumentException(nameof(BitConverter)); - - var timeStamp = tsr.TimeStamp.Serialize(); - var record = tsr.Record.Serialize(); - return timeStamp.Concat(record); - } - - private static IEnumerable Serialize(this UnixTime t) - { - return BitConverter.GetBytes(t.Ticks); - } - - private static IEnumerable Serialize(this Record r) - { - var availability = r.Availability.Serialize(); - var fields = r.Fields.Serialize(); - - return availability.Concat(fields); - } - - private static IEnumerable Serialize(this IReadOnlyDictionary fields) - { - var len = fields.GetLength(); - - return fields - .SelectMany(Serialize) - .Prepend(len); - } - - private static IEnumerable Serialize(this KeyValuePair kv) - { - var name = kv.Key.Serialize(); - var field = kv.Value.Serialize(); - - return name.Concat(field); - } - - - public static IEnumerable Serialize(this Field f) - { - return f switch - { - NumberField nf => Serialize(nf).PrependTag(FieldTag.NumberField), - TextField tf => Serialize(tf).PrependTag(FieldTag.TextField), - Record r => Serialize(r).PrependTag(FieldTag.RecordField), - _ => throw new ArgumentException(nameof(f)) - }; - } - - public static IEnumerable Serialize(NumberField nf) - { - var value = nf.Value.Serialize(); - var min = nf.Min .Serialize(); - var max = nf.Max .Serialize(); - var unit = nf.Unit .Serialize(); - - return value - .Concat(min) - .Concat(max) - .Concat(unit); - } - - public static IEnumerable Serialize(this TextField tf) - { - var len = tf.Frequencies.GetLength(); - return tf - .Frequencies - .SelectMany(Serialize) - .Prepend(len); - } - - public static IEnumerable Serialize(this TextFrequency tf) - { - var txt = tf.Text.Serialize(); - var frq = tf.Percent.Serialize(); - - return txt.Concat(frq); - } - - public static IEnumerable Serialize(this Double d) - { - return BitConverter.GetBytes((Single) d); // use float to save space - } - - - public static IEnumerable Serialize(this String s) - { - return UTF8 - .GetBytes(s) - .Apply(PrependLength); - } - - private static IEnumerable PrependTag(this IEnumerable data, FieldTag fieldTag) - { - return data.Prepend((Byte) fieldTag); - } - - private static IEnumerable PrependLength(IReadOnlyCollection data) - { - var len = (Byte) data.Count; - return data.Prepend(len); - } - - private static Byte GetLength(this IReadOnlyCollection data) - { - return (Byte) data.Count; - } -} \ No newline at end of file diff --git a/csharp/Lib/S3/Records/Specialized/AggregatedRecord.cs b/csharp/Lib/S3/Records/Specialized/AggregatedRecord.cs deleted file mode 100644 index e4b9a2283..000000000 --- a/csharp/Lib/S3/Records/Specialized/AggregatedRecord.cs +++ /dev/null @@ -1,23 +0,0 @@ -using InnovEnergy.Lib.S3.Metadata; -using InnovEnergy.Lib.Time.Unix; - -namespace InnovEnergy.Lib.S3.Records.Specialized; - -public readonly struct AggregatedRecord -{ - public UnixTime TimeStamp { get; } - public Record Record { get; } - public AggregationLevel AggregationLevel { get; } - - public AggregatedRecord(Record record, AggregationLevel level, UnixTime timeStamp) - { - AggregationLevel = level; - TimeStamp = timeStamp; - Record = record; - } - - public TimeStampedRecord ToTimeStamped() - { - return new TimeStampedRecord(Record, TimeStamp); - } -} \ No newline at end of file diff --git a/csharp/Lib/S3/Records/Specialized/TimeStampedRecord.cs b/csharp/Lib/S3/Records/Specialized/TimeStampedRecord.cs deleted file mode 100644 index 57dc56aed..000000000 --- a/csharp/Lib/S3/Records/Specialized/TimeStampedRecord.cs +++ /dev/null @@ -1,27 +0,0 @@ -using InnovEnergy.Lib.Time.Unix; - -namespace InnovEnergy.Lib.S3.Records.Specialized; - -public readonly struct TimeStampedRecord -{ - public UnixTime TimeStamp { get; } - public Record Record { get; } - - public TimeStampedRecord(Record record, UnixTime timeStamp) - { - Record = record; - TimeStamp = timeStamp; - } - - public Boolean IsEmpty => Record.IsEmpty; - - public static TimeStampedRecord Empty() - { - return Empty(UnixTime.Epoch); - } - - public static TimeStampedRecord Empty(UnixTime timeStamp) - { - return new TimeStampedRecord(Record.Empty, timeStamp); - } -} \ No newline at end of file diff --git a/csharp/Lib/S3/S3.csproj b/csharp/Lib/S3/S3.csproj deleted file mode 100644 index 946c4841f..000000000 --- a/csharp/Lib/S3/S3.csproj +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/csharp/Lib/S3/Serialization/JsonConverters.cs b/csharp/Lib/S3/Serialization/JsonConverters.cs deleted file mode 100644 index aa2de6bb2..000000000 --- a/csharp/Lib/S3/Serialization/JsonConverters.cs +++ /dev/null @@ -1,167 +0,0 @@ -// using System; -// using System.Text.Json; -// using System.Text.Json.Serialization; -// using InnovEnergy.S3.Records; -// using InnovEnergy.S3.Records.Fields; -// -// namespace InnovEnergy.S3.Serialization -// { -// public class SubClassConverterFactory : JsonConverterFactory -// { -// public override Boolean CanConvert(Type t) -// { -// return t.IsAbstract && t.IsClass; -// } -// -// public override JsonConverter CreateConverter(Type type, JsonSerializerOptions options) -// { -// var converterType = typeof(SubClassConverter<>).MakeGenericType(type); -// return (JsonConverter) Activator.CreateInstance(converterType)!; -// } -// -// public class SubClassConverter : JsonConverter -// { -// public override Boolean CanConvert(Type type) -// { -// return type == typeof(T); -// } -// -// public override T Read(ref Utf8JsonReader r, Type t, JsonSerializerOptions o) -// { -// throw new NotImplementedException(); -// } -// -// public override void Write(Utf8JsonWriter writer, T obj, JsonSerializerOptions options) -// { -// JsonSerializer.Serialize(writer, obj, obj!.GetType()); -// } -// } -// } -// -// public class DataRecordConverter : JsonConverter -// { -// public override Boolean CanConvert(Type type) -// { -// return typeof(Record).IsAssignableFrom(type); -// } -// -// public override Record Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) -// { -// throw new NotImplementedException(); -// } -// -// public override void Write(Utf8JsonWriter writer, Record @record, JsonSerializerOptions options) -// { -// writer.WriteStartObject(); -// -// foreach (var field in record.Fields) -// { -// writer.WritePropertyName(field.Name); -// -// if (field is NumberField an) -// { -// writer.WriteStartObject(); -// writer.WriteNumber("Min", an.Min); -// writer.WriteNumber("Max", an.Max); -// writer.WriteNumber("Mean", an.Value); -// writer.WriteEndObject(); -// } -// else if (field is TextField at) -// { -// writer.WriteStartObject(); -// foreach (var f in at.Frequencies) -// { -// writer.WriteNumber(f.Text, f.Percent); -// } -// writer.WriteEndObject(); -// } -// else if (field is BooleanField ab) -// { -// writer.WriteStartObject(); -// writer.WriteNumber("PercentTrue", ab.PercentTrue); -// writer.WriteEndObject(); -// } -// else -// throw new NotSupportedException(); -// } -// -// writer.WriteNumber("Time", record.TimeStamp.Ticks); -// writer.WriteNumber("Availability", record.Availability); -// -// writer.WriteEndObject(); -// } -// } -// -// // public class AggregatedRecordConverter : JsonConverter -// // { -// // public override Boolean CanConvert(Type type) -// // { -// // return typeof(AggregatedRecord).IsAssignableFrom(type); -// // } -// // -// // public override AggregatedRecord Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) => throw new NotImplementedException(); -// // -// // public override void Write(Utf8JsonWriter writer, AggregatedRecord dataRecord, JsonSerializerOptions options) -// // { -// // writer.WriteStartObject(); -// // -// // foreach (var field in dataRecord.Fields) -// // { -// // if (field is AggregatedNumber n) -// // { -// // writer.WritePropertyName(n.Name); -// // writer.WriteStartObject(); -// // writer.WritePropertyName("Mean"); -// // writer.WriteNumberValue(n.Mean); -// // -// // writer.WritePropertyName("Min"); -// // writer.WriteNumberValue(n.Min); -// // -// // writer.WritePropertyName("Max"); -// // writer.WriteNumberValue(n.Max); -// // -// // writer.WriteEndObject(); -// // } -// // else if (field is AggregatedText t) -// // { -// // writer.WritePropertyName(t.Name); -// // JsonSerializer.Serialize(writer, t); -// // } -// // else if (field is AggregatedBoolean b) -// // { -// // writer.WritePropertyName(b.Name); -// // JsonSerializer.Serialize(writer, b); -// // } -// // -// // else throw new NotSupportedException(); -// // } -// // -// // writer.WriteEndObject(); -// // } -// // -// // -// // -// // -// // } -// -// // public class TextFrequencyConverter : JsonConverter -// // { -// // public override Boolean CanConvert(Type type) -// // { -// // return typeof(TextFrequency).IsAssignableFrom(type); -// // } -// // -// // public override TextFrequency Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) => throw new NotImplementedException(); -// // -// // public override void Write(Utf8JsonWriter writer, TextFrequency textFrequency, JsonSerializerOptions options) -// // { -// // writer.WriteStartObject(); -// // writer.WritePropertyName(textFrequency.Text); -// // writer.WriteNumberValue(textFrequency.Percent); -// // writer.WriteEndObject(); -// // } -// // } -// -// -// -// } \ No newline at end of file diff --git a/csharp/Lib/SysTools/Edges/StringToCommand.cs b/csharp/Lib/SysTools/Edges/StringToCommand.cs index 1dc691b7f..62c595f75 100644 --- a/csharp/Lib/SysTools/Edges/StringToCommand.cs +++ b/csharp/Lib/SysTools/Edges/StringToCommand.cs @@ -7,50 +7,50 @@ public static class StringToCommand public static SysCommand Opt1(this String cmd, String option) { return cmd - .ToCommand() - .Opt1(option); + .ToCommand() + .Opt1(option); } public static SysCommand Opt1(this String cmd, String option, Object value, String separator = " ") { return cmd - .ToCommand() - .Opt1(option, value, separator); + .ToCommand() + .Opt1(option, value, separator); } public static SysCommand Opt2(this String cmd, String option) { return cmd - .ToCommand() - .Opt2(option); + .ToCommand() + .Opt2(option); } public static SysCommand Opt2(this String cmd, String option, Object value, String separator = "=") { return cmd - .ToCommand() - .Opt2(option, value, separator); + .ToCommand() + .Opt2(option, value, separator); } public static SysCommand Opt(this String cmd, String option) { return cmd - .ToCommand() - .Opt(option); + .ToCommand() + .Opt(option); } public static SysCommand Opt(this String cmd, String option, Object value) { return cmd - .ToCommand() - .Opt(option, value); + .ToCommand() + .Opt(option, value); } public static SysCommand Arg(this String cmd, Object argument) { return cmd - .ToCommand() - .Arg(argument); + .ToCommand() + .Arg(argument); } } \ No newline at end of file diff --git a/csharp/Lib/SysTools/FileIo.cs b/csharp/Lib/SysTools/FileIo.cs index 7328bd324..bec888e56 100644 --- a/csharp/Lib/SysTools/FileIo.cs +++ b/csharp/Lib/SysTools/FileIo.cs @@ -1,8 +1,9 @@ using System.Text; -using InnovEnergy.Lib.SysTools.Utils; +using InnovEnergy.Lib.Utils; namespace InnovEnergy.Lib.SysTools; +[Obsolete("Needs rework before use")] public static class FileIo { public static Boolean Exists (this SysPath path) => path.FileExists() || path.DirectoryExists(); @@ -14,12 +15,12 @@ public static class FileIo public static IEnumerable Directories(this SysPath sysPath) => Directory - .GetDirectories(sysPath) - .Select(SysPath.FromString); + .GetDirectories(sysPath) + .Select(SysPath.FromString); public static IEnumerable Files(this SysPath sysPath) => Directory - .GetFiles(sysPath) - .Select(SysPath.FromString); + .GetFiles(sysPath) + .Select(SysPath.FromString); public static SysPath CreateDirectory(this SysPath path) @@ -91,10 +92,10 @@ public static class FileIo SysPath Target(SysPath path) => targetDir.Append(path.RelativeTo(sourceDir)); - Utils.Utils.Traverse(sourceDir, Directories) - .Do(d => Target(d).CreateDirectory()) - .SelectMany(Files) - .ForEach(f => f.CopyFileTo(Target(f))); + sourceDir.Traverse(Directories) + .Do(d => Target(d).CreateDirectory()) + .SelectMany(Files) + .ForEach(f => f.CopyFileTo(Target(f))); return sourceDir; } @@ -115,14 +116,14 @@ public static class FileIo public static IEnumerable DescendantDirectories(this SysPath path) { - return Utils.Utils.Traverse(path, Directories); + return path.Traverse(Directories); } public static IEnumerable DescendantFiles(this SysPath path) { return path - .DescendantDirectories() - .SelectMany(Files); + .DescendantDirectories() + .SelectMany(Files); } public static IEnumerable Descendants(this SysPath path) @@ -140,13 +141,11 @@ public static class FileIo { var buf = new Byte[4096]; - using (var fs = File.OpenRead(path)) - { - var n = fs.Read(buf, 0, buf.Length); + using var fs = File.OpenRead(path); + var n = fs.Read(buf, 0, buf.Length); - foreach (var b in buf.Take(Math.Max(0, n))) - yield return b; - } + foreach (var b in buf.Take(Math.Max(0, n))) + yield return b; } @@ -154,29 +153,29 @@ public static class FileIo public static IEnumerable ReadLines(this SysPath path, Encoding encoding) { - using (var sr = new StreamReader(path, encoding)) - while (true) - { - var str = sr.ReadLine(); - if (str == null) - yield break; + using var sr = new StreamReader(path, encoding); + while (true) + { + var str = sr.ReadLine(); + if (str == null) + yield break; - yield return str; - } + yield return str; + } } public static String ReadText(this SysPath path) => path.ReadText(Encoding.UTF8); public static String ReadText(this SysPath path, Encoding encoding) { - using (var sr = new StreamReader(path, encoding)) - return sr.ReadToEnd(); + using var sr = new StreamReader(path, encoding); + return sr.ReadToEnd(); } public static SysPath WriteText(this SysPath filePath, String text) { - using (var sw = new StreamWriter(filePath, append: false)) - sw.Write(text); + using var sw = new StreamWriter(filePath, append: false); + sw.Write(text); return filePath; } @@ -189,17 +188,17 @@ public static class FileIo public static SysPath WriteLines(this SysPath filePath, IEnumerable lines) { - using (var sw = new StreamWriter(filePath, append: false)) - foreach (var line in lines) - sw.WriteLine(line); + using var sw = new StreamWriter(filePath, append: false); + foreach (var line in lines) + sw.WriteLine(line); return filePath; } public static SysPath AppendText(this SysPath filePath, String text) { - using (var sw = new StreamWriter(filePath, append: true)) - sw.Write(text); + using var sw = new StreamWriter(filePath, append: true); + sw.Write(text); return filePath; } @@ -212,9 +211,9 @@ public static class FileIo public static SysPath AppendLines(this SysPath filePath, IEnumerable lines) { - using (var sw = new StreamWriter(filePath, append: true)) - foreach (var line in lines) - sw.WriteLine(line); + using var sw = new StreamWriter(filePath, append: true); + foreach (var line in lines) + sw.WriteLine(line); return filePath; } diff --git a/csharp/Lib/SysTools/Process/AsyncProcess.cs b/csharp/Lib/SysTools/Process/AsyncProcess.cs index 3fb9e967f..ee0137482 100644 --- a/csharp/Lib/SysTools/Process/AsyncProcess.cs +++ b/csharp/Lib/SysTools/Process/AsyncProcess.cs @@ -9,6 +9,7 @@ namespace InnovEnergy.Lib.SysTools.Process; using Env = Dictionary; +[Obsolete("Use CliWrap instead")] public class AsyncProcess { private readonly Subject _StandardIn; diff --git a/csharp/Lib/SysTools/Process/ProcessResult.cs b/csharp/Lib/SysTools/Process/ProcessResult.cs index 162a2280d..e8af589b3 100644 --- a/csharp/Lib/SysTools/Process/ProcessResult.cs +++ b/csharp/Lib/SysTools/Process/ProcessResult.cs @@ -2,6 +2,7 @@ using InnovEnergy.Lib.SysTools.Utils; namespace InnovEnergy.Lib.SysTools.Process; +[Obsolete("Use CliWrap instead")] public readonly struct ProcessResult { public ProcessResult(Int32 exitCode, diff --git a/csharp/Lib/SysTools/Process/SyncProcess.cs b/csharp/Lib/SysTools/Process/SyncProcess.cs index 36caedf3a..7d47f447f 100644 --- a/csharp/Lib/SysTools/Process/SyncProcess.cs +++ b/csharp/Lib/SysTools/Process/SyncProcess.cs @@ -7,7 +7,7 @@ namespace InnovEnergy.Lib.SysTools.Process; using Env = Dictionary; - +[Obsolete("Use CliWrap instead")] public class SyncProcess { public SysCommand Command { get; } diff --git a/csharp/Lib/SysTools/Remote/RemoteCommand.cs b/csharp/Lib/SysTools/Remote/RemoteCommand.cs index 69e59d571..fa80d2671 100644 --- a/csharp/Lib/SysTools/Remote/RemoteCommand.cs +++ b/csharp/Lib/SysTools/Remote/RemoteCommand.cs @@ -2,6 +2,7 @@ using InnovEnergy.Lib.SysTools.Utils; namespace InnovEnergy.Lib.SysTools.Remote; +[Obsolete("Use CliWrap instead")] public readonly struct RemoteCommand { public SshHost Host { get; } diff --git a/csharp/Lib/SysTools/Remote/RemoteFileIo.cs b/csharp/Lib/SysTools/Remote/RemoteFileIo.cs index 1444b5539..e317d7227 100644 --- a/csharp/Lib/SysTools/Remote/RemoteFileIo.cs +++ b/csharp/Lib/SysTools/Remote/RemoteFileIo.cs @@ -3,6 +3,7 @@ using InnovEnergy.Lib.SysTools.Utils; namespace InnovEnergy.Lib.SysTools.Remote; +[Obsolete("Needs rework before use")] public static class RemoteFileIo { diff --git a/csharp/Lib/SysTools/Remote/RemotePath.cs b/csharp/Lib/SysTools/Remote/RemotePath.cs index 97b21da39..dcb75adb3 100644 --- a/csharp/Lib/SysTools/Remote/RemotePath.cs +++ b/csharp/Lib/SysTools/Remote/RemotePath.cs @@ -1,5 +1,6 @@ namespace InnovEnergy.Lib.SysTools.Remote; +[Obsolete] public readonly struct RemotePath { public SysPath Path { get; } diff --git a/csharp/Lib/SysTools/Remote/SshHost.cs b/csharp/Lib/SysTools/Remote/SshHost.cs index 5afade016..a957f2887 100644 --- a/csharp/Lib/SysTools/Remote/SshHost.cs +++ b/csharp/Lib/SysTools/Remote/SshHost.cs @@ -3,6 +3,7 @@ using InnovEnergy.Lib.SysTools.Utils; namespace InnovEnergy.Lib.SysTools.Remote; +[Obsolete("Needs rework before use")] public readonly struct SshHost { public const Int32 DefaultPort = 22; diff --git a/csharp/Lib/SysTools/SysCommand.cs b/csharp/Lib/SysTools/SysCommand.cs index 9d264c27d..50237a5d8 100644 --- a/csharp/Lib/SysTools/SysCommand.cs +++ b/csharp/Lib/SysTools/SysCommand.cs @@ -2,6 +2,7 @@ using InnovEnergy.Lib.SysTools.Utils; namespace InnovEnergy.Lib.SysTools; +[Obsolete("Use CliWrap instead")] public readonly struct SysCommand { public SysPath Path { get; } diff --git a/csharp/Lib/SysTools/SysDirs.cs b/csharp/Lib/SysTools/SysDirs.cs index 5c3c5bc68..c65d4e7b7 100644 --- a/csharp/Lib/SysTools/SysDirs.cs +++ b/csharp/Lib/SysTools/SysDirs.cs @@ -3,6 +3,7 @@ using static System.Environment.SpecialFolder; namespace InnovEnergy.Lib.SysTools; +[Obsolete] public static class SysDirs { diff --git a/csharp/Lib/SysTools/SysPath.cs b/csharp/Lib/SysTools/SysPath.cs index 383460ab8..b5ff40c36 100644 --- a/csharp/Lib/SysTools/SysPath.cs +++ b/csharp/Lib/SysTools/SysPath.cs @@ -5,6 +5,7 @@ using static System.IO.Path; namespace InnovEnergy.Lib.SysTools; +[Obsolete("Needs rework before use")] public readonly struct SysPath { private readonly String _Path; diff --git a/csharp/Lib/SysTools/SysTools.csproj b/csharp/Lib/SysTools/SysTools.csproj index 9fd38651b..629608dc6 100644 --- a/csharp/Lib/SysTools/SysTools.csproj +++ b/csharp/Lib/SysTools/SysTools.csproj @@ -5,4 +5,8 @@ + + + + diff --git a/csharp/Lib/SysTools/Utils/EnumerableUtils.cs b/csharp/Lib/SysTools/Utils/EnumerableUtils.cs index 16d6c8671..9f02caacf 100644 --- a/csharp/Lib/SysTools/Utils/EnumerableUtils.cs +++ b/csharp/Lib/SysTools/Utils/EnumerableUtils.cs @@ -5,14 +5,12 @@ internal static class EnumerableUtils public static IEnumerable Pad(this IEnumerable src, Int32 length, T padding) { - using (var enumerator = src.GetEnumerator()) - { - while (enumerator.MoveNext() && length-- > 0) - yield return enumerator.Current; + using var enumerator = src.GetEnumerator(); + while (enumerator.MoveNext() && length-- > 0) + yield return enumerator.Current; - while (length-- > 0) - yield return padding; - } + while (length-- > 0) + yield return padding; } public static Dictionary> IndexColumn(this IEnumerable> src, UInt16 index) @@ -33,10 +31,10 @@ internal static class EnumerableUtils public static IEnumerable<(TLeft left, TRight right)> Zip(IEnumerable left, IEnumerable right) { - using (var l = left.GetEnumerator()) - using (var r = right.GetEnumerator()) - while (l.MoveNext() && r.MoveNext()) - yield return (l.Current, r.Current); + using var l = left.GetEnumerator(); + using var r = right.GetEnumerator(); + while (l.MoveNext() && r.MoveNext()) + yield return (l.Current, r.Current); } public static IEnumerator Enumerator(this T t) @@ -57,20 +55,6 @@ internal static class EnumerableUtils action(e); } - public static IEnumerable Do(this IEnumerable enumerable, Action action) - { - return enumerable.Select(e => - { - action(e); - return e; - }); - } - - public static void ForEach(this IEnumerable enumerable, Func func) - { - foreach (var e in enumerable) - func(e); - } public static IEnumerable WhereNot(this IEnumerable enumerable, Func predicate) diff --git a/csharp/Lib/SysTools/Utils/Utils.cs b/csharp/Lib/SysTools/Utils/Utils.cs index 73e37198e..026c63e8c 100644 --- a/csharp/Lib/SysTools/Utils/Utils.cs +++ b/csharp/Lib/SysTools/Utils/Utils.cs @@ -2,55 +2,6 @@ namespace InnovEnergy.Lib.SysTools.Utils; public static class Utils { - public static IEnumerable Traverse(T root, Func> getChildren) - { - var stack = new Stack>(); - var it = root.Enumerator(); - it.MoveNext(); - - while (true) - { - //////// going down //////// - - while (true) - { - var cit = getChildren(it.Current).GetEnumerator(); - - if (cit.MoveNext()) // node has children, must be a branch - { - yield return it.Current; - - stack.Push(it); - it = cit; - } - else // no children, hence a leaf - { - var node = it.Current; - - yield return node; - - if (!it.MoveNext()) - break; // no more siblings: goto parent - } - } - - //////// going up //////// - - while (true) - { - it.Dispose(); - if (stack.Count == 0) yield break; // we got to the bottom of the stack, were done - - it = stack.Pop(); - - if (it.MoveNext()) - break; - } - } - - - } - private static readonly DateTime Epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); @@ -59,7 +10,6 @@ public static class Utils return Epoch.AddSeconds(unixTime); } - public static R ValueOrDefault(this Dictionary dict, T key) { return ValueOrDefault(dict, key, default); diff --git a/csharp/Lib/Utils/Utils.cs b/csharp/Lib/Utils/Utils.cs index b07ab7111..f4e5deb88 100644 --- a/csharp/Lib/Utils/Utils.cs +++ b/csharp/Lib/Utils/Utils.cs @@ -76,8 +76,8 @@ public static class Utils var res = index % length; return res >= 0 - ? res - : res + length; + ? res + : res + length; } public static IEnumerable Traverse(this T root, Func> getChildren) From afa662a843cf26ff4f39ef16f6a84a8259caa79a Mon Sep 17 00:00:00 2001 From: ig Date: Sat, 25 Feb 2023 16:52:26 +0100 Subject: [PATCH 05/12] Add Meta Solution Folder --- csharp/InnovEnergy.sln | 9 +++++++++ csharp/InnovEnergy.sln.DotSettings | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/csharp/InnovEnergy.sln b/csharp/InnovEnergy.sln index 88f01a87d..b3c6b3b26 100644 --- a/csharp/InnovEnergy.sln +++ b/csharp/InnovEnergy.sln @@ -63,6 +63,15 @@ EndProject EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StatusData", "Lib\StatusData\StatusData.csproj", "{C04FB6DA-23C6-46BB-9B21-8F4FBA32FFF7}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Meta", "Meta", "{AED84693-C389-44C9-B2C0-ACB560189CF2}" + ProjectSection(SolutionItems) = preProject + InnovEnergy.props = InnovEnergy.props + App\InnovEnergy.App.props = App\InnovEnergy.App.props + Lib\InnovEnergy.Lib.props = Lib\InnovEnergy.Lib.props + InnovEnergy.sln.DotSettings = InnovEnergy.sln.DotSettings + EndProjectSection +EndProject + Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/csharp/InnovEnergy.sln.DotSettings b/csharp/InnovEnergy.sln.DotSettings index b1ba507d9..308df85e9 100644 --- a/csharp/InnovEnergy.sln.DotSettings +++ b/csharp/InnovEnergy.sln.DotSettings @@ -33,4 +33,5 @@ True True True - True \ No newline at end of file + True + \ No newline at end of file From 13942bfaf5f55d646c93fc645e10b7071e76fe63 Mon Sep 17 00:00:00 2001 From: ig Date: Sat, 25 Feb 2023 18:57:45 +0100 Subject: [PATCH 06/12] remove stray package-lock.json --- package-lock.json | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 package-lock.json diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 7ff72816a..000000000 --- a/package-lock.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "new", - "lockfileVersion": 2, - "requires": true, - "packages": {} -} From fd1b47978311bb931fa9fa048261c8e5f0e1d1c5 Mon Sep 17 00:00:00 2001 From: ig Date: Sun, 26 Feb 2023 10:38:28 +0100 Subject: [PATCH 07/12] move Phases from StatusApi.csproj to Units.csproj --- csharp/InnovEnergy.sln | 2 +- csharp/InnovEnergy.sln.DotSettings | 5 +- csharp/Lib/StatusApi/BatteryStatus.cs | 7 ++ .../Lib/StatusApi/Connections/DcConnection.cs | 8 -- .../StatusApi/Connections/IAc1Connection.cs | 8 ++ .../StatusApi/Connections/IAc3Connection.cs | 8 ++ .../StatusApi/Connections/IDcConnection.cs | 9 +++ .../StatusApi/Connections/IPvConnection.cs | 8 ++ .../Connections/SinglePhaseAcConnection.cs | 12 --- .../Connections/ThreePhaseAcConnection.cs | 10 --- csharp/Lib/StatusApi/DcDcConverterStatus.cs | 8 ++ .../{Devices/Device.cs => DeviceStatus.cs} | 6 +- csharp/Lib/StatusApi/DeviceType.cs | 34 --------- csharp/Lib/StatusApi/Devices/Battery.cs | 12 --- csharp/Lib/StatusApi/Devices/DcDcConverter.cs | 10 --- csharp/Lib/StatusApi/Devices/DcDevice.cs | 5 -- csharp/Lib/StatusApi/Devices/GridMeter.cs | 5 -- .../Lib/StatusApi/Devices/IPvCoupledDevice.cs | 8 -- csharp/Lib/StatusApi/Devices/Mppt.cs | 10 --- .../StatusApi/Devices/SinglePhaseAcDevice.cs | 6 -- .../StatusApi/Devices/SinglePhaseInverter.cs | 7 -- .../Devices/SinglePhasePvInverter.cs | 10 --- .../StatusApi/Devices/ThreePhaseAcDevice.cs | 5 -- .../StatusApi/Devices/ThreePhaseInverter.cs | 12 --- .../StatusApi/Devices/ThreePhasePvInverter.cs | 10 --- csharp/Lib/StatusApi/MpptStatus.cs | 8 ++ csharp/Lib/StatusApi/Phases/AcPhase.cs | 35 --------- csharp/Lib/StatusApi/Phases/Phase.cs | 12 --- csharp/Lib/StatusApi/PowerMeterStatus.cs | 6 ++ .../StatusApi/SinglePhaseInverterStatus.cs | 9 +++ .../StatusApi/SinglePhasePvInverterStatus.cs | 9 +++ csharp/Lib/StatusApi/StatusApi.csproj | 1 + .../Lib/StatusApi/ThreePhaseInverterStatus.cs | 10 +++ .../StatusApi/ThreePhasePvInverterStatus.cs | 9 +++ csharp/Lib/StatusData/Current.cs | 32 -------- csharp/Lib/StatusData/Json/Converters.cs | 16 ---- csharp/Lib/StatusData/Power.cs | 33 --------- csharp/Lib/StatusData/Resistance.cs | 35 --------- csharp/Lib/StatusData/Units.cs | 9 --- csharp/Lib/StatusData/Voltage.cs | 32 -------- csharp/Lib/Units/Angle.cs | 73 +++++++++++++++++++ csharp/Lib/Units/Composite/Ac1Phase.cs | 10 +++ csharp/Lib/Units/Composite/Ac3Phase.cs | 8 ++ csharp/Lib/Units/Composite/AcPhase.cs | 22 ++++++ csharp/Lib/Units/Composite/DcPhase.cs | 6 ++ csharp/Lib/Units/Composite/Phase.cs | 7 ++ csharp/Lib/Units/Frequency.cs | 59 +++++++++++++++ .../Json/CurrentConverter.cs | 2 +- .../Json/PowerConverter.cs | 2 +- .../Json/ResistanceConverter.cs | 2 +- .../Json/VoltageConverter.cs | 2 +- csharp/Lib/Units/Power.cs | 66 +++++++++++++++++ csharp/Lib/Units/Resistance.cs | 63 ++++++++++++++++ csharp/Lib/{StatusData => Units}/State.cs | 9 +-- csharp/Lib/Units/Temperature.cs | 61 ++++++++++++++++ csharp/Lib/Units/Units.cs | 20 +++++ .../StatusData.csproj => Units/Units.csproj} | 8 ++ csharp/Lib/Units/Voltage.cs | 69 ++++++++++++++++++ csharp/Lib/Utils/Units.cs | 15 ---- csharp/Lib/Utils/Utils.cs | 9 +++ 60 files changed, 596 insertions(+), 398 deletions(-) create mode 100644 csharp/Lib/StatusApi/BatteryStatus.cs delete mode 100644 csharp/Lib/StatusApi/Connections/DcConnection.cs create mode 100644 csharp/Lib/StatusApi/Connections/IAc1Connection.cs create mode 100644 csharp/Lib/StatusApi/Connections/IAc3Connection.cs create mode 100644 csharp/Lib/StatusApi/Connections/IDcConnection.cs create mode 100644 csharp/Lib/StatusApi/Connections/IPvConnection.cs delete mode 100644 csharp/Lib/StatusApi/Connections/SinglePhaseAcConnection.cs delete mode 100644 csharp/Lib/StatusApi/Connections/ThreePhaseAcConnection.cs create mode 100644 csharp/Lib/StatusApi/DcDcConverterStatus.cs rename csharp/Lib/StatusApi/{Devices/Device.cs => DeviceStatus.cs} (59%) delete mode 100644 csharp/Lib/StatusApi/DeviceType.cs delete mode 100644 csharp/Lib/StatusApi/Devices/Battery.cs delete mode 100644 csharp/Lib/StatusApi/Devices/DcDcConverter.cs delete mode 100644 csharp/Lib/StatusApi/Devices/DcDevice.cs delete mode 100644 csharp/Lib/StatusApi/Devices/GridMeter.cs delete mode 100644 csharp/Lib/StatusApi/Devices/IPvCoupledDevice.cs delete mode 100644 csharp/Lib/StatusApi/Devices/Mppt.cs delete mode 100644 csharp/Lib/StatusApi/Devices/SinglePhaseAcDevice.cs delete mode 100644 csharp/Lib/StatusApi/Devices/SinglePhaseInverter.cs delete mode 100644 csharp/Lib/StatusApi/Devices/SinglePhasePvInverter.cs delete mode 100644 csharp/Lib/StatusApi/Devices/ThreePhaseAcDevice.cs delete mode 100644 csharp/Lib/StatusApi/Devices/ThreePhaseInverter.cs delete mode 100644 csharp/Lib/StatusApi/Devices/ThreePhasePvInverter.cs create mode 100644 csharp/Lib/StatusApi/MpptStatus.cs delete mode 100644 csharp/Lib/StatusApi/Phases/AcPhase.cs delete mode 100644 csharp/Lib/StatusApi/Phases/Phase.cs create mode 100644 csharp/Lib/StatusApi/PowerMeterStatus.cs create mode 100644 csharp/Lib/StatusApi/SinglePhaseInverterStatus.cs create mode 100644 csharp/Lib/StatusApi/SinglePhasePvInverterStatus.cs create mode 100644 csharp/Lib/StatusApi/ThreePhaseInverterStatus.cs create mode 100644 csharp/Lib/StatusApi/ThreePhasePvInverterStatus.cs delete mode 100644 csharp/Lib/StatusData/Current.cs delete mode 100644 csharp/Lib/StatusData/Json/Converters.cs delete mode 100644 csharp/Lib/StatusData/Power.cs delete mode 100644 csharp/Lib/StatusData/Resistance.cs delete mode 100644 csharp/Lib/StatusData/Units.cs delete mode 100644 csharp/Lib/StatusData/Voltage.cs create mode 100644 csharp/Lib/Units/Angle.cs create mode 100644 csharp/Lib/Units/Composite/Ac1Phase.cs create mode 100644 csharp/Lib/Units/Composite/Ac3Phase.cs create mode 100644 csharp/Lib/Units/Composite/AcPhase.cs create mode 100644 csharp/Lib/Units/Composite/DcPhase.cs create mode 100644 csharp/Lib/Units/Composite/Phase.cs create mode 100644 csharp/Lib/Units/Frequency.cs rename csharp/Lib/{StatusData => Units}/Json/CurrentConverter.cs (91%) rename csharp/Lib/{StatusData => Units}/Json/PowerConverter.cs (90%) rename csharp/Lib/{StatusData => Units}/Json/ResistanceConverter.cs (91%) rename csharp/Lib/{StatusData => Units}/Json/VoltageConverter.cs (91%) create mode 100644 csharp/Lib/Units/Power.cs create mode 100644 csharp/Lib/Units/Resistance.cs rename csharp/Lib/{StatusData => Units}/State.cs (73%) create mode 100644 csharp/Lib/Units/Temperature.cs create mode 100644 csharp/Lib/Units/Units.cs rename csharp/Lib/{StatusData/StatusData.csproj => Units/Units.csproj} (52%) create mode 100644 csharp/Lib/Units/Voltage.cs delete mode 100644 csharp/Lib/Utils/Units.cs diff --git a/csharp/InnovEnergy.sln b/csharp/InnovEnergy.sln index b3c6b3b26..3a0fa6fcd 100644 --- a/csharp/InnovEnergy.sln +++ b/csharp/InnovEnergy.sln @@ -61,7 +61,7 @@ EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Backend", "App/Backend/Backend.csproj", "{A56F58C2-B265-435B-A985-53B4D6F49B1A}" EndProject EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StatusData", "Lib\StatusData\StatusData.csproj", "{C04FB6DA-23C6-46BB-9B21-8F4FBA32FFF7}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Units", "Lib\Units\Units.csproj", "{C04FB6DA-23C6-46BB-9B21-8F4FBA32FFF7}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Meta", "Meta", "{AED84693-C389-44C9-B2C0-ACB560189CF2}" ProjectSection(SolutionItems) = preProject diff --git a/csharp/InnovEnergy.sln.DotSettings b/csharp/InnovEnergy.sln.DotSettings index 308df85e9..f48e450b2 100644 --- a/csharp/InnovEnergy.sln.DotSettings +++ b/csharp/InnovEnergy.sln.DotSettings @@ -1,6 +1,8 @@  - False + <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> + False + True True True @@ -34,4 +36,5 @@ True True True + \ No newline at end of file diff --git a/csharp/Lib/StatusApi/BatteryStatus.cs b/csharp/Lib/StatusApi/BatteryStatus.cs new file mode 100644 index 000000000..0b033b420 --- /dev/null +++ b/csharp/Lib/StatusApi/BatteryStatus.cs @@ -0,0 +1,7 @@ +using InnovEnergy.Lib.StatusApi.Connections; +using InnovEnergy.Lib.Units.Composite; + +namespace InnovEnergy.Lib.StatusApi; + +public abstract record BatteryStatus(DcPhase Dc) : DeviceStatus, IDcConnection; + \ No newline at end of file diff --git a/csharp/Lib/StatusApi/Connections/DcConnection.cs b/csharp/Lib/StatusApi/Connections/DcConnection.cs deleted file mode 100644 index cac41968d..000000000 --- a/csharp/Lib/StatusApi/Connections/DcConnection.cs +++ /dev/null @@ -1,8 +0,0 @@ -using InnovEnergy.Lib.StatusApi.Phases; -namespace InnovEnergy.Lib.StatusApi.Connections; - - -public record DcConnection(Decimal Voltage, Decimal Current) : Phase(Voltage, Current) -{ - public Decimal Power => (Current * Voltage).Round3(); -} \ No newline at end of file diff --git a/csharp/Lib/StatusApi/Connections/IAc1Connection.cs b/csharp/Lib/StatusApi/Connections/IAc1Connection.cs new file mode 100644 index 000000000..df3a472a1 --- /dev/null +++ b/csharp/Lib/StatusApi/Connections/IAc1Connection.cs @@ -0,0 +1,8 @@ +using InnovEnergy.Lib.Units.Composite; + +namespace InnovEnergy.Lib.StatusApi.Connections; + +public interface IAc1Connection +{ + Ac1Phase Ac1 { get; } +} \ No newline at end of file diff --git a/csharp/Lib/StatusApi/Connections/IAc3Connection.cs b/csharp/Lib/StatusApi/Connections/IAc3Connection.cs new file mode 100644 index 000000000..231982cf0 --- /dev/null +++ b/csharp/Lib/StatusApi/Connections/IAc3Connection.cs @@ -0,0 +1,8 @@ +using InnovEnergy.Lib.Units.Composite; + +namespace InnovEnergy.Lib.StatusApi.Connections; + +public interface IAc3Connection +{ + Ac1Phase Ac3 { get; } +} \ No newline at end of file diff --git a/csharp/Lib/StatusApi/Connections/IDcConnection.cs b/csharp/Lib/StatusApi/Connections/IDcConnection.cs new file mode 100644 index 000000000..6074a6750 --- /dev/null +++ b/csharp/Lib/StatusApi/Connections/IDcConnection.cs @@ -0,0 +1,9 @@ +using InnovEnergy.Lib.Units.Composite; + +namespace InnovEnergy.Lib.StatusApi.Connections; + + +public interface IDcConnection +{ + DcPhase Dc { get; } +} \ No newline at end of file diff --git a/csharp/Lib/StatusApi/Connections/IPvConnection.cs b/csharp/Lib/StatusApi/Connections/IPvConnection.cs new file mode 100644 index 000000000..a117f2d17 --- /dev/null +++ b/csharp/Lib/StatusApi/Connections/IPvConnection.cs @@ -0,0 +1,8 @@ +using InnovEnergy.Lib.Units.Composite; + +namespace InnovEnergy.Lib.StatusApi.Connections; + +public interface IPvConnection +{ + IReadOnlyList Strings { get; } +} \ No newline at end of file diff --git a/csharp/Lib/StatusApi/Connections/SinglePhaseAcConnection.cs b/csharp/Lib/StatusApi/Connections/SinglePhaseAcConnection.cs deleted file mode 100644 index 6b8c57b2d..000000000 --- a/csharp/Lib/StatusApi/Connections/SinglePhaseAcConnection.cs +++ /dev/null @@ -1,12 +0,0 @@ -using InnovEnergy.Lib.StatusApi.Phases; - -namespace InnovEnergy.Lib.StatusApi.Connections; - -public record SinglePhaseAcConnection -( - Decimal Voltage, - Decimal Current, - Decimal Phi, - Decimal Frequency -); - //: AcPhase(Voltage, Current, Phi); \ No newline at end of file diff --git a/csharp/Lib/StatusApi/Connections/ThreePhaseAcConnection.cs b/csharp/Lib/StatusApi/Connections/ThreePhaseAcConnection.cs deleted file mode 100644 index f029b2fc4..000000000 --- a/csharp/Lib/StatusApi/Connections/ThreePhaseAcConnection.cs +++ /dev/null @@ -1,10 +0,0 @@ -using InnovEnergy.Lib.StatusApi.Phases; - -namespace InnovEnergy.Lib.StatusApi.Connections; - -public record ThreePhaseAcConnection(AcPhase L1, AcPhase L2, AcPhase L3, Decimal Frequency) -{ - public Decimal ApparentPower => L1.ApparentPower + L2.ApparentPower + L3.ApparentPower; - public Decimal ReactivePower => L1.ReactivePower + L2.ReactivePower + L3.ReactivePower; - public Decimal ActivePower => L1.ActivePower + L2.ActivePower + L3.ActivePower; -} \ No newline at end of file diff --git a/csharp/Lib/StatusApi/DcDcConverterStatus.cs b/csharp/Lib/StatusApi/DcDcConverterStatus.cs new file mode 100644 index 000000000..cdda395d9 --- /dev/null +++ b/csharp/Lib/StatusApi/DcDcConverterStatus.cs @@ -0,0 +1,8 @@ +using InnovEnergy.Lib.Units.Composite; + +namespace InnovEnergy.Lib.StatusApi; + +public abstract record DcDcConverterStatus(DcPhase Left, DcPhase Right) : DeviceStatus; + + + \ No newline at end of file diff --git a/csharp/Lib/StatusApi/Devices/Device.cs b/csharp/Lib/StatusApi/DeviceStatus.cs similarity index 59% rename from csharp/Lib/StatusApi/Devices/Device.cs rename to csharp/Lib/StatusApi/DeviceStatus.cs index 879e03326..f34a37d23 100644 --- a/csharp/Lib/StatusApi/Devices/Device.cs +++ b/csharp/Lib/StatusApi/DeviceStatus.cs @@ -1,6 +1,6 @@ -namespace InnovEnergy.Lib.StatusApi.Devices; +namespace InnovEnergy.Lib.StatusApi; -public abstract record Device +public abstract record DeviceStatus { public String DeviceType { @@ -11,7 +11,7 @@ public abstract record Device while (!t!.IsAbstract) t = t.BaseType; - return t.Name; + return t.Name.Replace("Status", ""); } } } \ No newline at end of file diff --git a/csharp/Lib/StatusApi/DeviceType.cs b/csharp/Lib/StatusApi/DeviceType.cs deleted file mode 100644 index 47b391875..000000000 --- a/csharp/Lib/StatusApi/DeviceType.cs +++ /dev/null @@ -1,34 +0,0 @@ -namespace InnovEnergy.Lib.StatusApi; - -/// SIGN CONVENTION -/// -/// Voltages have to be measured/indicated so that they are guaranteed to be never negative. -/// In the case of AC this is accomplished by using the RMS measurement. -/// The sign convention of the current (and hence power, since voltage defined to be never negative) -/// depends on the type of the device. -/// If the device can only produce (e.g. PV) or only consume (e.g. Loads), -/// then the current has to be 0 or positive. -/// If the device is a prosumer (e.g. inverter, battery, grid...) -/// then a positive sign denotes current (power) flow away from the grid (to the "right") -/// and a negative sign denotes current (power) flow towards the grid (to the "left") - - - - -/// the currently known DeviceTypes, to be serialized as string in JSON -public enum DeviceType -{ - None, - PvOnAcIn , - PvOnAcOut , - PvOnDc , - Load , - CriticalLoad, - Battery , - Grid , - Inverter , - AcInToAcOut , - DcDc , - DcLoad , - Losses -} \ No newline at end of file diff --git a/csharp/Lib/StatusApi/Devices/Battery.cs b/csharp/Lib/StatusApi/Devices/Battery.cs deleted file mode 100644 index 3b8b1d476..000000000 --- a/csharp/Lib/StatusApi/Devices/Battery.cs +++ /dev/null @@ -1,12 +0,0 @@ - -using InnovEnergy.Lib.StatusApi.Connections; - -namespace InnovEnergy.Lib.StatusApi.Devices; - -public abstract record Battery - ( - DcConnection Dc, - Decimal Soc, - Decimal Temperature - ) - : DcDevice(Dc); \ No newline at end of file diff --git a/csharp/Lib/StatusApi/Devices/DcDcConverter.cs b/csharp/Lib/StatusApi/Devices/DcDcConverter.cs deleted file mode 100644 index dd754d1f1..000000000 --- a/csharp/Lib/StatusApi/Devices/DcDcConverter.cs +++ /dev/null @@ -1,10 +0,0 @@ -using InnovEnergy.Lib.StatusApi.Connections; - -namespace InnovEnergy.Lib.StatusApi.Devices; - -public abstract record DcDcConverter -( - DcConnection Left, - DcConnection Right -) - : Device; \ No newline at end of file diff --git a/csharp/Lib/StatusApi/Devices/DcDevice.cs b/csharp/Lib/StatusApi/Devices/DcDevice.cs deleted file mode 100644 index 280086f26..000000000 --- a/csharp/Lib/StatusApi/Devices/DcDevice.cs +++ /dev/null @@ -1,5 +0,0 @@ -using InnovEnergy.Lib.StatusApi.Connections; - -namespace InnovEnergy.Lib.StatusApi.Devices; - -public abstract record DcDevice(DcConnection Dc) : Device; \ No newline at end of file diff --git a/csharp/Lib/StatusApi/Devices/GridMeter.cs b/csharp/Lib/StatusApi/Devices/GridMeter.cs deleted file mode 100644 index 32223244b..000000000 --- a/csharp/Lib/StatusApi/Devices/GridMeter.cs +++ /dev/null @@ -1,5 +0,0 @@ -using InnovEnergy.Lib.StatusApi.Connections; - -namespace InnovEnergy.Lib.StatusApi.Devices; - -public abstract record GridMeter(ThreePhaseAcConnection Ac) : ThreePhaseAcDevice(Ac); \ No newline at end of file diff --git a/csharp/Lib/StatusApi/Devices/IPvCoupledDevice.cs b/csharp/Lib/StatusApi/Devices/IPvCoupledDevice.cs deleted file mode 100644 index 53281d8ce..000000000 --- a/csharp/Lib/StatusApi/Devices/IPvCoupledDevice.cs +++ /dev/null @@ -1,8 +0,0 @@ -using InnovEnergy.Lib.StatusApi.Connections; - -namespace InnovEnergy.Lib.StatusApi.Devices; - -public interface IPvCoupledDevice -{ - IReadOnlyList Strings { get; } -} \ No newline at end of file diff --git a/csharp/Lib/StatusApi/Devices/Mppt.cs b/csharp/Lib/StatusApi/Devices/Mppt.cs deleted file mode 100644 index 2e9630d22..000000000 --- a/csharp/Lib/StatusApi/Devices/Mppt.cs +++ /dev/null @@ -1,10 +0,0 @@ -using InnovEnergy.Lib.StatusApi.Connections; - -namespace InnovEnergy.Lib.StatusApi.Devices; - -public abstract record Mppt - ( - DcConnection Dc, - IReadOnlyList Strings - ) - : DcDevice(Dc), IPvCoupledDevice; \ No newline at end of file diff --git a/csharp/Lib/StatusApi/Devices/SinglePhaseAcDevice.cs b/csharp/Lib/StatusApi/Devices/SinglePhaseAcDevice.cs deleted file mode 100644 index 4e259e05a..000000000 --- a/csharp/Lib/StatusApi/Devices/SinglePhaseAcDevice.cs +++ /dev/null @@ -1,6 +0,0 @@ -using InnovEnergy.Lib.StatusApi.Connections; - -namespace InnovEnergy.Lib.StatusApi.Devices; - - -public abstract record SinglePhaseAcDevice(SinglePhaseAcConnection Ac) : Device; \ No newline at end of file diff --git a/csharp/Lib/StatusApi/Devices/SinglePhaseInverter.cs b/csharp/Lib/StatusApi/Devices/SinglePhaseInverter.cs deleted file mode 100644 index d63747161..000000000 --- a/csharp/Lib/StatusApi/Devices/SinglePhaseInverter.cs +++ /dev/null @@ -1,7 +0,0 @@ -using InnovEnergy.Lib.StatusApi.Connections; - -namespace InnovEnergy.Lib.StatusApi.Devices; - -public abstract record SinglePhaseInverter(SinglePhaseAcConnection Ac, DcConnection Dc); - - diff --git a/csharp/Lib/StatusApi/Devices/SinglePhasePvInverter.cs b/csharp/Lib/StatusApi/Devices/SinglePhasePvInverter.cs deleted file mode 100644 index bf0a65c50..000000000 --- a/csharp/Lib/StatusApi/Devices/SinglePhasePvInverter.cs +++ /dev/null @@ -1,10 +0,0 @@ -using InnovEnergy.Lib.StatusApi.Connections; - -namespace InnovEnergy.Lib.StatusApi.Devices; - -public abstract record SinglePhasePvInverter - ( - SinglePhaseAcConnection Ac, - IReadOnlyList Strings - ) - : SinglePhaseAcDevice(Ac), IPvCoupledDevice; \ No newline at end of file diff --git a/csharp/Lib/StatusApi/Devices/ThreePhaseAcDevice.cs b/csharp/Lib/StatusApi/Devices/ThreePhaseAcDevice.cs deleted file mode 100644 index 340218e09..000000000 --- a/csharp/Lib/StatusApi/Devices/ThreePhaseAcDevice.cs +++ /dev/null @@ -1,5 +0,0 @@ -using InnovEnergy.Lib.StatusApi.Connections; - -namespace InnovEnergy.Lib.StatusApi.Devices; - -public abstract record ThreePhaseAcDevice(ThreePhaseAcConnection Ac) : Device; \ No newline at end of file diff --git a/csharp/Lib/StatusApi/Devices/ThreePhaseInverter.cs b/csharp/Lib/StatusApi/Devices/ThreePhaseInverter.cs deleted file mode 100644 index 895a9edf2..000000000 --- a/csharp/Lib/StatusApi/Devices/ThreePhaseInverter.cs +++ /dev/null @@ -1,12 +0,0 @@ - - -using InnovEnergy.Lib.StatusApi.Connections; - -namespace InnovEnergy.Lib.StatusApi.Devices; - -public abstract record ThreePhaseInverter - ( - ThreePhaseAcConnection Ac, - DcConnection Dc - ) - : Device; \ No newline at end of file diff --git a/csharp/Lib/StatusApi/Devices/ThreePhasePvInverter.cs b/csharp/Lib/StatusApi/Devices/ThreePhasePvInverter.cs deleted file mode 100644 index ad07f5202..000000000 --- a/csharp/Lib/StatusApi/Devices/ThreePhasePvInverter.cs +++ /dev/null @@ -1,10 +0,0 @@ -using InnovEnergy.Lib.StatusApi.Connections; - -namespace InnovEnergy.Lib.StatusApi.Devices; - -public abstract record ThreePhasePvInverter - ( - ThreePhaseAcConnection Ac, - IReadOnlyList Strings - ) - : ThreePhaseAcDevice(Ac), IPvCoupledDevice; \ No newline at end of file diff --git a/csharp/Lib/StatusApi/MpptStatus.cs b/csharp/Lib/StatusApi/MpptStatus.cs new file mode 100644 index 000000000..bec31ddec --- /dev/null +++ b/csharp/Lib/StatusApi/MpptStatus.cs @@ -0,0 +1,8 @@ +using InnovEnergy.Lib.StatusApi.Connections; +using InnovEnergy.Lib.Units.Composite; + +namespace InnovEnergy.Lib.StatusApi; + +public record MpptStatus(DcPhase Dc, IReadOnlyList Strings) : IDcConnection, IPvConnection; + + \ No newline at end of file diff --git a/csharp/Lib/StatusApi/Phases/AcPhase.cs b/csharp/Lib/StatusApi/Phases/AcPhase.cs deleted file mode 100644 index 068e19393..000000000 --- a/csharp/Lib/StatusApi/Phases/AcPhase.cs +++ /dev/null @@ -1,35 +0,0 @@ -using static DecimalMath.DecimalEx; - -namespace InnovEnergy.Lib.StatusApi.Phases; - - -public record AcPhase(Decimal Voltage, Decimal Current, Decimal Phi) - : Phase(Voltage, Current) -{ - - public Decimal ApparentPower => Voltage * Current; - public Decimal ActivePower => ApparentPower * PowerFactor; - public Decimal ReactivePower => ApparentPower * Sin(Phi); - public Decimal PowerFactor => Cos(Phi); - - public static AcPhase FromActiveReactive - ( - Decimal activePower, - Decimal reactivePower, - Decimal voltage, - Decimal current - ) - { - var phi = ATan2(reactivePower, activePower); - - return new AcPhase - ( - Voltage: voltage, - Current: current, - Phi: phi - ); - - } - - -} \ No newline at end of file diff --git a/csharp/Lib/StatusApi/Phases/Phase.cs b/csharp/Lib/StatusApi/Phases/Phase.cs deleted file mode 100644 index 236d6cf77..000000000 --- a/csharp/Lib/StatusApi/Phases/Phase.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace InnovEnergy.Lib.StatusApi.Phases; - -/// A phase must have at least a known Voltage and Current. -/// For DC this is already enough. -/// For AC the values have to be in RMS (not amplitude or P2P) -/// Power can be inferred, P = UI - -public abstract record Phase - ( - Decimal Voltage, - Decimal Current - ); \ No newline at end of file diff --git a/csharp/Lib/StatusApi/PowerMeterStatus.cs b/csharp/Lib/StatusApi/PowerMeterStatus.cs new file mode 100644 index 000000000..41038f4dc --- /dev/null +++ b/csharp/Lib/StatusApi/PowerMeterStatus.cs @@ -0,0 +1,6 @@ +using InnovEnergy.Lib.StatusApi.Connections; +using InnovEnergy.Lib.Units.Composite; + +namespace InnovEnergy.Lib.StatusApi; + +public abstract record PowerMeterStatus(Ac1Phase Ac3) : DeviceStatus, IAc3Connection; \ No newline at end of file diff --git a/csharp/Lib/StatusApi/SinglePhaseInverterStatus.cs b/csharp/Lib/StatusApi/SinglePhaseInverterStatus.cs new file mode 100644 index 000000000..a1b404bd6 --- /dev/null +++ b/csharp/Lib/StatusApi/SinglePhaseInverterStatus.cs @@ -0,0 +1,9 @@ +using InnovEnergy.Lib.StatusApi.Connections; +using InnovEnergy.Lib.Units.Composite; + +namespace InnovEnergy.Lib.StatusApi; + +public abstract record SinglePhaseInverterStatus(Ac1Phase Ac1, DcPhase Dc) : + DeviceStatus, + IAc1Connection, + IDcConnection; diff --git a/csharp/Lib/StatusApi/SinglePhasePvInverterStatus.cs b/csharp/Lib/StatusApi/SinglePhasePvInverterStatus.cs new file mode 100644 index 000000000..377f9f6f3 --- /dev/null +++ b/csharp/Lib/StatusApi/SinglePhasePvInverterStatus.cs @@ -0,0 +1,9 @@ +using InnovEnergy.Lib.StatusApi.Connections; +using InnovEnergy.Lib.Units.Composite; + +namespace InnovEnergy.Lib.StatusApi; + +public abstract record SinglePhasePvInverterStatus(Ac1Phase Ac1, IReadOnlyList Strings) : + DeviceStatus, + IAc1Connection, + IPvConnection; diff --git a/csharp/Lib/StatusApi/StatusApi.csproj b/csharp/Lib/StatusApi/StatusApi.csproj index f1e4bc0f8..88fda982e 100644 --- a/csharp/Lib/StatusApi/StatusApi.csproj +++ b/csharp/Lib/StatusApi/StatusApi.csproj @@ -3,6 +3,7 @@ + diff --git a/csharp/Lib/StatusApi/ThreePhaseInverterStatus.cs b/csharp/Lib/StatusApi/ThreePhaseInverterStatus.cs new file mode 100644 index 000000000..8c2fc424f --- /dev/null +++ b/csharp/Lib/StatusApi/ThreePhaseInverterStatus.cs @@ -0,0 +1,10 @@ +using InnovEnergy.Lib.StatusApi.Connections; +using InnovEnergy.Lib.Units.Composite; + +namespace InnovEnergy.Lib.StatusApi; + +public abstract record ThreePhaseInverterStatus(Ac1Phase Ac3, DcPhase Dc) : + DeviceStatus, + IAc3Connection, + IDcConnection; + \ No newline at end of file diff --git a/csharp/Lib/StatusApi/ThreePhasePvInverterStatus.cs b/csharp/Lib/StatusApi/ThreePhasePvInverterStatus.cs new file mode 100644 index 000000000..c09471d4b --- /dev/null +++ b/csharp/Lib/StatusApi/ThreePhasePvInverterStatus.cs @@ -0,0 +1,9 @@ +using InnovEnergy.Lib.StatusApi.Connections; +using InnovEnergy.Lib.Units.Composite; + +namespace InnovEnergy.Lib.StatusApi; + +public abstract record ThreePhasePvInverterStatus(Ac1Phase Ac3, IReadOnlyList Strings) : + DeviceStatus, + IAc3Connection, + IPvConnection; diff --git a/csharp/Lib/StatusData/Current.cs b/csharp/Lib/StatusData/Current.cs deleted file mode 100644 index 2f65add3c..000000000 --- a/csharp/Lib/StatusData/Current.cs +++ /dev/null @@ -1,32 +0,0 @@ -namespace InnovEnergy.Lib.StatusData; - -public readonly struct Current -{ - public static String Unit => "A"; - public static String Symbol => "I"; - - public Decimal Value { get; } - - public Current(Decimal value) => Value = value; - - public override String ToString() => Value + Unit; - - - // parallel - public static Current operator |(Current left, Current right) => new Current(left.Value + right.Value); - - // scalar multiplication - public static Current operator *(Decimal scalar , Current current) => new Current(scalar * current.Value); - public static Current operator *(Current current, Decimal scalar) => new Current(scalar * current.Value); - public static Current operator *(Int32 scalar , Current current) => new Current(scalar * current.Value); - public static Current operator *(Current current, Int32 scalar) => new Current(scalar * current.Value); - public static Current operator /(Current current, Decimal scalar) => new Current(current.Value / scalar); - public static Current operator /(Current current, Int32 scalar) => new Current(current.Value / scalar); - - // P=UI - public static Power operator *(Current current, Voltage voltage) => new Power(current.Value * voltage.Value); - - // U=RI - public static Voltage operator *(Current current, Resistance resistance) => new Voltage(resistance.Value* current.Value); - -} \ No newline at end of file diff --git a/csharp/Lib/StatusData/Json/Converters.cs b/csharp/Lib/StatusData/Json/Converters.cs deleted file mode 100644 index ab6a4336b..000000000 --- a/csharp/Lib/StatusData/Json/Converters.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System.Text.Json.Serialization; -using InnovEnergy.Lib.StatusData.Json; - -// ReSharper disable once CheckNamespace -namespace InnovEnergy.Units; - -public static partial class Units -{ - public static IReadOnlyList JsonConverters = new JsonConverter[] - { - new CurrentConverter(), - new VoltageConverter(), - new PowerConverter(), - new ResistanceConverter() - }; -} \ No newline at end of file diff --git a/csharp/Lib/StatusData/Power.cs b/csharp/Lib/StatusData/Power.cs deleted file mode 100644 index 3a605dfca..000000000 --- a/csharp/Lib/StatusData/Power.cs +++ /dev/null @@ -1,33 +0,0 @@ -using InnovEnergy.Units; - -namespace InnovEnergy.Lib.StatusData; - -public readonly struct Power -{ - public static String Unit => "W"; - public static String Symbol => "P"; - - public Decimal Value { get; } - - public Power(Decimal value) => Value = value; - - public override String ToString() => Value + Unit; - - - // parallel - public static Power operator |(Power left, Power right) => new Power(left.Value + right.Value); - // series - public static Power operator +(Power left, Power right) => new Power(left.Value + right.Value); - - // scalar multiplication - public static Power operator *(Decimal scalar, Power power ) => new Power(scalar * power.Value); - public static Power operator *(Power power , Decimal scalar) => new Power(scalar * power.Value); - public static Power operator *(Int32 scalar, Power power ) => new Power(scalar * power.Value); - public static Power operator *(Power power , Int32 scalar) => new Power(scalar * power.Value); - public static Power operator /(Power power , Decimal scalar) => new Power(power.Value / scalar); - public static Power operator /(Power power , Int32 scalar) => new Power(power.Value / scalar); - - // P=UI - public static Voltage operator /(Power power, Current current) => new Voltage(power.Value / current.Value); - public static Current operator /(Power power, Voltage voltage) => new Current(power.Value / voltage.Value); -} \ No newline at end of file diff --git a/csharp/Lib/StatusData/Resistance.cs b/csharp/Lib/StatusData/Resistance.cs deleted file mode 100644 index d10573e77..000000000 --- a/csharp/Lib/StatusData/Resistance.cs +++ /dev/null @@ -1,35 +0,0 @@ -namespace InnovEnergy.Lib.StatusData; - -public readonly struct Resistance -{ - public static String Unit => "Ω"; - public static String Symbol => "R"; - - public Decimal Value { get; } - - public Resistance(Decimal value) => Value = value; - - public override String ToString() => Value + Unit; - - // series - public static Resistance operator +(Resistance left, Resistance right) => new Resistance(left.Value + right.Value); - // parallel - public static Resistance operator |(Resistance left, Resistance right) => new Resistance(1m / (1m / left.Value + 1m / right.Value)); - - // scalar multiplication - public static Resistance operator *(Decimal scalar , Resistance resistance) => new Resistance(scalar * resistance.Value); - public static Resistance operator *(Resistance resistance, Decimal scalar ) => new Resistance(scalar * resistance.Value); - public static Resistance operator *(Int32 scalar , Resistance resistance) => new Resistance(scalar * resistance.Value); - public static Resistance operator *(Resistance resistance, Int32 scalar ) => new Resistance(scalar * resistance.Value); - public static Resistance operator /(Resistance resistance, Decimal scalar ) => new Resistance(resistance.Value / scalar); - public static Resistance operator /(Resistance resistance, Int32 scalar ) => new Resistance(resistance.Value / scalar); - - - // U=RI - public static Voltage operator *(Resistance resistance, Current current) => new Voltage(resistance.Value* current.Value); - - - - // public static Voltage operator /(Power power, Current current) => new Voltage(power.Value / current.Value); - // public static Current operator /(Power power, Voltage voltage) => new Current(power.Value / voltage.Value); -} \ No newline at end of file diff --git a/csharp/Lib/StatusData/Units.cs b/csharp/Lib/StatusData/Units.cs deleted file mode 100644 index 4dacaa297..000000000 --- a/csharp/Lib/StatusData/Units.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace InnovEnergy.Lib.StatusData; - -public static partial class Units -{ - public static Current A (this Decimal value) => new Current(value); - public static Voltage V (this Decimal value) => new Voltage(value); - public static Power W (this Decimal value) => new Power(value); - public static Resistance Ohm(this Decimal value) => new Resistance(value); -} \ No newline at end of file diff --git a/csharp/Lib/StatusData/Voltage.cs b/csharp/Lib/StatusData/Voltage.cs deleted file mode 100644 index fa7c8a7fc..000000000 --- a/csharp/Lib/StatusData/Voltage.cs +++ /dev/null @@ -1,32 +0,0 @@ -namespace InnovEnergy.Lib.StatusData; - -public readonly struct Voltage -{ - public static String Unit => "V"; - public static String Symbol => "U"; - - public Decimal Value { get; } - - public Voltage(Decimal value) => Value = value; - - public override String ToString() => Value + Unit; - - - // series - public static Voltage operator +(Voltage left, Voltage right) => new Voltage(left.Value + right.Value); - - public static Voltage operator *(Decimal scalar , Voltage voltage) => new Voltage(scalar * voltage.Value); - public static Voltage operator *(Voltage voltage, Decimal scalar) => new Voltage(scalar * voltage.Value); - public static Voltage operator *(Int32 scalar , Voltage voltage) => new Voltage(scalar * voltage.Value); - public static Voltage operator *(Voltage voltage, Int32 scalar) => new Voltage(scalar * voltage.Value); - - public static Voltage operator /(Voltage voltage, Decimal scalar) => new Voltage(voltage.Value / scalar); - public static Voltage operator /(Voltage voltage, Int32 scalar) => new Voltage(voltage.Value / scalar); - - - // U=RI - public static Current operator /(Voltage voltage, Resistance resistance) => new Current(voltage.Value / resistance.Value); - - // P=UI - public static Power operator *(Voltage voltage, Current current) => new Power(current.Value * voltage.Value); -} \ No newline at end of file diff --git a/csharp/Lib/Units/Angle.cs b/csharp/Lib/Units/Angle.cs new file mode 100644 index 000000000..0f0aa7d8f --- /dev/null +++ b/csharp/Lib/Units/Angle.cs @@ -0,0 +1,73 @@ +using DecimalMath; +using InnovEnergy.Lib.Utils; + +namespace InnovEnergy.Lib.Units; + +using T = Angle; + +public readonly struct Angle +{ + + + public static String Unit => "rad"; + public static String Symbol => "∠"; + + public static readonly Angle Pi = new Angle(DecimalEx.Pi); + + public Decimal Value { get; } + + public Angle(Decimal value) + { + var modulo = value.Modulo(DecimalEx.TwoPi); + + Value = modulo > DecimalEx.Pi + ? modulo - DecimalEx.TwoPi + : modulo; + } + + public override String ToString() => Value + Unit; + + + #region scalar multiplication + + public static Angle operator *(Decimal scalar, Angle angle ) => new Angle(scalar * angle.Value); + public static Angle operator *(Angle angle , Decimal scalar) => new Angle(scalar * angle.Value); + public static Angle operator /(Angle angle , Decimal scalar) => new Angle(angle.Value / scalar); + + #endregion + + #region addition + + public static T operator +(T left, T right) => new T(left.Value + right.Value); + public static T operator -(T left, T right) => new T(left.Value - right.Value); + public static T operator -(T t) => new T(-t.Value); + + #endregion + + #region compare + + public static Boolean operator ==(T left, T right) => left.Value == right.Value; + public static Boolean operator !=(T left, T right) => left.Value != right.Value; + public static Boolean operator > (T left, T right) => left.Value > right.Value; + public static Boolean operator < (T left, T right) => left.Value < right.Value; + public static Boolean operator >=(T left, T right) => left.Value >= right.Value; + public static Boolean operator <=(T left, T right) => left.Value <= right.Value; + + #endregion + + #region conversion + + public static implicit operator T(Decimal d) => new T(d); + public static implicit operator T(Double d) => new T((Decimal)d); + public static implicit operator T(Int32 i) => new T(i); + public static implicit operator Decimal(T t) => t.Value; + + #endregion + + #region equality + + public override Boolean Equals(Object? obj) => obj is T other && Equals(other); + public override Int32 GetHashCode() => Value.GetHashCode(); + + #endregion +} \ No newline at end of file diff --git a/csharp/Lib/Units/Composite/Ac1Phase.cs b/csharp/Lib/Units/Composite/Ac1Phase.cs new file mode 100644 index 000000000..e9970378b --- /dev/null +++ b/csharp/Lib/Units/Composite/Ac1Phase.cs @@ -0,0 +1,10 @@ +namespace InnovEnergy.Lib.Units.Composite; + +public record Ac1Phase + ( + Voltage Voltage, + Current Current, + Angle Phi, + Frequency Frequency + ) : + AcPhase(Voltage, Current, Phi); \ No newline at end of file diff --git a/csharp/Lib/Units/Composite/Ac3Phase.cs b/csharp/Lib/Units/Composite/Ac3Phase.cs new file mode 100644 index 000000000..1fc44306f --- /dev/null +++ b/csharp/Lib/Units/Composite/Ac3Phase.cs @@ -0,0 +1,8 @@ +namespace InnovEnergy.Lib.Units.Composite; + +public record Ac3Phase(AcPhase L1, AcPhase L2, AcPhase L3, Decimal Frequency) +{ + public Power ApparentPower => L1.ApparentPower + L2.ApparentPower + L3.ApparentPower; + public Power ReactivePower => L1.ReactivePower + L2.ReactivePower + L3.ReactivePower; + public Power ActivePower => L1.ActivePower + L2.ActivePower + L3.ActivePower; +} \ No newline at end of file diff --git a/csharp/Lib/Units/Composite/AcPhase.cs b/csharp/Lib/Units/Composite/AcPhase.cs new file mode 100644 index 000000000..c616b9c57 --- /dev/null +++ b/csharp/Lib/Units/Composite/AcPhase.cs @@ -0,0 +1,22 @@ +using static DecimalMath.DecimalEx; + +namespace InnovEnergy.Lib.Units.Composite; + + +public record AcPhase : Phase +{ + protected AcPhase(Voltage voltage, Current current, Angle phi) : base(voltage, current) + { + if (voltage < 0) throw new ArgumentException("RMS value cannot be negative", nameof(voltage)); + if (current < 0) throw new ArgumentException("RMS value cannot be negative", nameof(current)); + + Phi = phi; + } + + public Angle Phi { get; } + + public Power ApparentPower => Voltage * Current; + public Power ActivePower => ApparentPower * PowerFactor; + public Power ReactivePower => ApparentPower * Sin(Phi); + public Decimal PowerFactor => Cos(Phi); +} \ No newline at end of file diff --git a/csharp/Lib/Units/Composite/DcPhase.cs b/csharp/Lib/Units/Composite/DcPhase.cs new file mode 100644 index 000000000..8e73313bf --- /dev/null +++ b/csharp/Lib/Units/Composite/DcPhase.cs @@ -0,0 +1,6 @@ +namespace InnovEnergy.Lib.Units.Composite; + +public record DcPhase(Voltage Voltage, Current Current) : Phase(Voltage, Current) +{ + public Power Power => Current * Voltage; +} \ No newline at end of file diff --git a/csharp/Lib/Units/Composite/Phase.cs b/csharp/Lib/Units/Composite/Phase.cs new file mode 100644 index 000000000..45a3ef86d --- /dev/null +++ b/csharp/Lib/Units/Composite/Phase.cs @@ -0,0 +1,7 @@ +namespace InnovEnergy.Lib.Units.Composite; + +public abstract record Phase +( + Voltage Voltage, + Current Current +); \ No newline at end of file diff --git a/csharp/Lib/Units/Frequency.cs b/csharp/Lib/Units/Frequency.cs new file mode 100644 index 000000000..91a3e3849 --- /dev/null +++ b/csharp/Lib/Units/Frequency.cs @@ -0,0 +1,59 @@ +namespace InnovEnergy.Lib.Units; + +using T = Frequency; + +public readonly struct Frequency +{ + public static String Unit => "Hz"; + public static String Symbol => "f"; + + public Decimal Value { get; } + + public Frequency(Decimal value) => Value = value; + + public override String ToString() => Value + Unit; + + #region scalar multiplication + + public static T operator *(Decimal scalar, T t) => new T(scalar * t.Value); + public static T operator *(T t, Decimal scalar) => new T(scalar * t.Value); + public static T operator /(T t, Decimal scalar) => new T(t.Value / scalar); + + #endregion + + #region addition + + public static T operator +(T left, T right) => new T(left.Value + right.Value); + public static T operator -(T left, T right) => new T(left.Value - right.Value); + public static T operator -(T t) => new T(-t.Value); + + #endregion + + #region compare + + public static Boolean operator ==(T left, T right) => left.Value == right.Value; + public static Boolean operator !=(T left, T right) => left.Value != right.Value; + public static Boolean operator > (T left, T right) => left.Value > right.Value; + public static Boolean operator < (T left, T right) => left.Value < right.Value; + public static Boolean operator >=(T left, T right) => left.Value >= right.Value; + public static Boolean operator <=(T left, T right) => left.Value <= right.Value; + + #endregion + + #region conversion + + public static implicit operator T(Decimal d) => new T(d); + public static implicit operator T(Double d) => new T((Decimal)d); + public static implicit operator T(Int32 i) => new T(i); + public static implicit operator Decimal(T t) => t.Value; + + #endregion + + #region equality + + public Boolean Equals(T other) => Value == other.Value; + public override Boolean Equals(Object? obj) => obj is T other && Equals(other); + public override Int32 GetHashCode() => Value.GetHashCode(); + + #endregion +} \ No newline at end of file diff --git a/csharp/Lib/StatusData/Json/CurrentConverter.cs b/csharp/Lib/Units/Json/CurrentConverter.cs similarity index 91% rename from csharp/Lib/StatusData/Json/CurrentConverter.cs rename to csharp/Lib/Units/Json/CurrentConverter.cs index 64707325f..b89ec4a90 100644 --- a/csharp/Lib/StatusData/Json/CurrentConverter.cs +++ b/csharp/Lib/Units/Json/CurrentConverter.cs @@ -1,7 +1,7 @@ using System.Text.Json; using System.Text.Json.Serialization; -namespace InnovEnergy.Lib.StatusData.Json; +namespace InnovEnergy.Lib.Units.Json; public class CurrentConverter : JsonConverter { diff --git a/csharp/Lib/StatusData/Json/PowerConverter.cs b/csharp/Lib/Units/Json/PowerConverter.cs similarity index 90% rename from csharp/Lib/StatusData/Json/PowerConverter.cs rename to csharp/Lib/Units/Json/PowerConverter.cs index 8c33d3eae..766f3636c 100644 --- a/csharp/Lib/StatusData/Json/PowerConverter.cs +++ b/csharp/Lib/Units/Json/PowerConverter.cs @@ -1,7 +1,7 @@ using System.Text.Json; using System.Text.Json.Serialization; -namespace InnovEnergy.Lib.StatusData.Json; +namespace InnovEnergy.Lib.Units.Json; public class PowerConverter : JsonConverter { diff --git a/csharp/Lib/StatusData/Json/ResistanceConverter.cs b/csharp/Lib/Units/Json/ResistanceConverter.cs similarity index 91% rename from csharp/Lib/StatusData/Json/ResistanceConverter.cs rename to csharp/Lib/Units/Json/ResistanceConverter.cs index a60d99009..67ec28a13 100644 --- a/csharp/Lib/StatusData/Json/ResistanceConverter.cs +++ b/csharp/Lib/Units/Json/ResistanceConverter.cs @@ -1,7 +1,7 @@ using System.Text.Json; using System.Text.Json.Serialization; -namespace InnovEnergy.Lib.StatusData.Json; +namespace InnovEnergy.Lib.Units.Json; public class ResistanceConverter : JsonConverter { diff --git a/csharp/Lib/StatusData/Json/VoltageConverter.cs b/csharp/Lib/Units/Json/VoltageConverter.cs similarity index 91% rename from csharp/Lib/StatusData/Json/VoltageConverter.cs rename to csharp/Lib/Units/Json/VoltageConverter.cs index b51ceabf5..290c6f38b 100644 --- a/csharp/Lib/StatusData/Json/VoltageConverter.cs +++ b/csharp/Lib/Units/Json/VoltageConverter.cs @@ -1,7 +1,7 @@ using System.Text.Json; using System.Text.Json.Serialization; -namespace InnovEnergy.Lib.StatusData.Json; +namespace InnovEnergy.Lib.Units.Json; public class VoltageConverter : JsonConverter { diff --git a/csharp/Lib/Units/Power.cs b/csharp/Lib/Units/Power.cs new file mode 100644 index 000000000..4bc44a53a --- /dev/null +++ b/csharp/Lib/Units/Power.cs @@ -0,0 +1,66 @@ + +namespace InnovEnergy.Lib.Units; + +using T = Power; + +public readonly struct Power +{ + public static String Unit => "W"; + public static String Symbol => "P"; + + public Decimal Value { get; } + + public Power(Decimal value) => Value = value; + + public override String ToString() => Value + Unit; + + + // P=UI + public static Voltage operator /(Power power, Current current) => new Voltage(power.Value / current.Value); + public static Current operator /(Power power, Voltage voltage) => new Current(power.Value / voltage.Value); + + #region scalar multiplication + + public static T operator *(Decimal scalar, T t) => new T(scalar * t.Value); + public static T operator *(T t, Decimal scalar) => new T(scalar * t.Value); + public static T operator /(T t, Decimal scalar) => new T(t.Value / scalar); + + #endregion + + #region addition + + public static T operator +(T left, T right) => new T(left.Value + right.Value); + public static T operator -(T left, T right) => new T(left.Value - right.Value); + public static T operator -(T t) => new T(-t.Value); + + #endregion + + #region compare + + public static Boolean operator ==(T left, T right) => left.Value == right.Value; + public static Boolean operator !=(T left, T right) => left.Value != right.Value; + public static Boolean operator > (T left, T right) => left.Value > right.Value; + public static Boolean operator < (T left, T right) => left.Value < right.Value; + public static Boolean operator >=(T left, T right) => left.Value >= right.Value; + public static Boolean operator <=(T left, T right) => left.Value <= right.Value; + + #endregion + + #region conversion + + public static implicit operator T(Decimal d) => new T(d); + public static implicit operator T(Double d) => new T((Decimal)d); + public static implicit operator T(Int32 i) => new T(i); + public static implicit operator Decimal(T t) => t.Value; + + #endregion + + #region equality + + public Boolean Equals(T other) => Value == other.Value; + public override Boolean Equals(Object? obj) => obj is T other && Equals(other); + public override Int32 GetHashCode() => Value.GetHashCode(); + + #endregion + +} \ No newline at end of file diff --git a/csharp/Lib/Units/Resistance.cs b/csharp/Lib/Units/Resistance.cs new file mode 100644 index 000000000..c3c0b34c0 --- /dev/null +++ b/csharp/Lib/Units/Resistance.cs @@ -0,0 +1,63 @@ +namespace InnovEnergy.Lib.Units; + +using T = Resistance; + +public readonly struct Resistance +{ + public static String Unit => "Ω"; + public static String Symbol => "R"; + + public Decimal Value { get; } + + public Resistance(Decimal value) => Value = value; + + public override String ToString() => Value + Unit; + + // U=RI + public static Voltage operator *(Resistance resistance, Current current) => new Voltage(resistance.Value * current.Value); + + #region scalar multiplication + + public static T operator *(Decimal scalar, T t) => new T(scalar * t.Value); + public static T operator *(T t, Decimal scalar) => new T(scalar * t.Value); + public static T operator /(T t, Decimal scalar) => new T(t.Value / scalar); + + #endregion + + #region addition + + public static T operator +(T left, T right) => new T(left.Value + right.Value); + public static T operator -(T left, T right) => new T(left.Value - right.Value); + public static T operator -(T t) => new T(-t.Value); + + #endregion + + #region compare + + public static Boolean operator ==(T left, T right) => left.Value == right.Value; + public static Boolean operator !=(T left, T right) => left.Value != right.Value; + public static Boolean operator > (T left, T right) => left.Value > right.Value; + public static Boolean operator < (T left, T right) => left.Value < right.Value; + public static Boolean operator >=(T left, T right) => left.Value >= right.Value; + public static Boolean operator <=(T left, T right) => left.Value <= right.Value; + + #endregion + + #region conversion + + public static implicit operator T(Decimal d) => new T(d); + public static implicit operator T(Double d) => new T((Decimal)d); + public static implicit operator T(Int32 i) => new T(i); + public static implicit operator Decimal(T t) => t.Value; + + #endregion + + #region equality + + public Boolean Equals(T other) => Value == other.Value; + public override Boolean Equals(Object? obj) => obj is T other && Equals(other); + public override Int32 GetHashCode() => Value.GetHashCode(); + + #endregion + +} \ No newline at end of file diff --git a/csharp/Lib/StatusData/State.cs b/csharp/Lib/Units/State.cs similarity index 73% rename from csharp/Lib/StatusData/State.cs rename to csharp/Lib/Units/State.cs index 1f91b1249..752a5751d 100644 --- a/csharp/Lib/StatusData/State.cs +++ b/csharp/Lib/Units/State.cs @@ -1,4 +1,4 @@ -namespace InnovEnergy.Lib.StatusData; +namespace InnovEnergy.Lib.Units; public readonly struct State { @@ -9,13 +9,10 @@ public readonly struct State public State(params String[] values) : this((IReadOnlyList)values){} public State(params State[] states) : this(states.SelectMany(s => s.Values).ToList()){} - public State(Enum e) : this(e.ToString()) - { - } + public State(Enum e) : this(e.ToString()){} public static implicit operator State(Enum e) => new State(e); public static implicit operator State(String s) => new State(s); - // parallel - public static State operator |(State left, State right) => new State(left, right); + public static State operator +(State left, State right) => new State(left, right); } \ No newline at end of file diff --git a/csharp/Lib/Units/Temperature.cs b/csharp/Lib/Units/Temperature.cs new file mode 100644 index 000000000..22a411338 --- /dev/null +++ b/csharp/Lib/Units/Temperature.cs @@ -0,0 +1,61 @@ +namespace InnovEnergy.Lib.Units; + +using T = Temperature; + +public readonly struct Temperature +{ + public static String Unit => "°C"; + public static String Symbol => "T"; + + public Decimal Value { get; } + + public Temperature(Decimal value) => Value = value; + + public override String ToString() => Value + Unit; + + + #region scalar multiplication + + public static T operator *(Decimal scalar, T t) => new T(scalar * t.Value); + public static T operator *(T t, Decimal scalar) => new T(scalar * t.Value); + public static T operator /(T t, Decimal scalar) => new T(t.Value / scalar); + + #endregion + + #region addition + + public static T operator +(T left, T right) => new T(left.Value + right.Value); + public static T operator -(T left, T right) => new T(left.Value - right.Value); + public static T operator -(T t) => new T(-t.Value); + + #endregion + + #region compare + + public static Boolean operator ==(T left, T right) => left.Value == right.Value; + public static Boolean operator !=(T left, T right) => left.Value != right.Value; + public static Boolean operator > (T left, T right) => left.Value > right.Value; + public static Boolean operator < (T left, T right) => left.Value < right.Value; + public static Boolean operator >=(T left, T right) => left.Value >= right.Value; + public static Boolean operator <=(T left, T right) => left.Value <= right.Value; + + #endregion + + #region conversion + + public static implicit operator T(Decimal d) => new T(d); + public static implicit operator T(Double d) => new T((Decimal)d); + public static implicit operator T(Int32 i) => new T(i); + public static implicit operator Decimal(T t) => t.Value; + + #endregion + + #region equality + + public Boolean Equals(T other) => Value == other.Value; + public override Boolean Equals(Object? obj) => obj is T other && Equals(other); + public override Int32 GetHashCode() => Value.GetHashCode(); + + #endregion + +} \ No newline at end of file diff --git a/csharp/Lib/Units/Units.cs b/csharp/Lib/Units/Units.cs new file mode 100644 index 000000000..88b9e04aa --- /dev/null +++ b/csharp/Lib/Units/Units.cs @@ -0,0 +1,20 @@ +using System.Text.Json.Serialization; +using InnovEnergy.Lib.Units.Json; + +namespace InnovEnergy.Lib.Units; + +public static class Units +{ + public static Current A (this Decimal value) => new Current(value); + public static Voltage V (this Decimal value) => new Voltage(value); + public static Power W (this Decimal value) => new Power(value); + public static Resistance Ohm(this Decimal value) => new Resistance(value); + + public static readonly IReadOnlyList JsonConverters = new JsonConverter[] + { + new CurrentConverter(), + new VoltageConverter(), + new PowerConverter(), + new ResistanceConverter() + }; +} \ No newline at end of file diff --git a/csharp/Lib/StatusData/StatusData.csproj b/csharp/Lib/Units/Units.csproj similarity index 52% rename from csharp/Lib/StatusData/StatusData.csproj rename to csharp/Lib/Units/Units.csproj index 69d164c4f..eab4f3f58 100644 --- a/csharp/Lib/StatusData/StatusData.csproj +++ b/csharp/Lib/Units/Units.csproj @@ -6,4 +6,12 @@ preview + + + + + + + + diff --git a/csharp/Lib/Units/Voltage.cs b/csharp/Lib/Units/Voltage.cs new file mode 100644 index 000000000..db75e63e0 --- /dev/null +++ b/csharp/Lib/Units/Voltage.cs @@ -0,0 +1,69 @@ +namespace InnovEnergy.Lib.Units; + +using T = Voltage; + +public readonly struct Voltage +{ + public static String Unit => "V"; + public static String Symbol => "U"; + + public Decimal Value { get; } + + public Voltage(Decimal value) => Value = value; + + public override String ToString() => Value + Unit; + + // U=RI + public static Current operator /(Voltage voltage, Resistance resistance) => new Current(voltage.Value / resistance.Value); + + // P=UI + public static Power operator *(Voltage voltage, Current current) => new Power(current.Value * voltage.Value); + + + #region scalar multiplication + + public static T operator *(Decimal scalar, T t) => new T(scalar * t.Value); + public static T operator *(T t, Decimal scalar) => new T(scalar * t.Value); + public static T operator /(T t, Decimal scalar) => new T(t.Value / scalar); + + #endregion + + #region addition + + public static T operator +(T left, T right) => new T(left.Value + right.Value); + public static T operator -(T left, T right) => new T(left.Value - right.Value); + public static T operator -(T t) => new T(-t.Value); + + #endregion + + #region compare + + public static Boolean operator ==(T left, T right) => left.Value == right.Value; + public static Boolean operator !=(T left, T right) => left.Value != right.Value; + public static Boolean operator > (T left, T right) => left.Value > right.Value; + public static Boolean operator < (T left, T right) => left.Value < right.Value; + public static Boolean operator >=(T left, T right) => left.Value >= right.Value; + public static Boolean operator <=(T left, T right) => left.Value <= right.Value; + + #endregion + + #region conversion + + public static implicit operator T(Decimal d) => new T(d); + public static implicit operator T(Double d) => new T((Decimal)d); + public static implicit operator T(Int32 i) => new T(i); + public static implicit operator Decimal(T t) => t.Value; + + #endregion + + #region equality + + public Boolean Equals(T other) => Value == other.Value; + public override Boolean Equals(Object? obj) => obj is T other && Equals(other); + public override Int32 GetHashCode() => Value.GetHashCode(); + + #endregion + + + +} \ No newline at end of file diff --git a/csharp/Lib/Utils/Units.cs b/csharp/Lib/Utils/Units.cs deleted file mode 100644 index db95bfcbb..000000000 --- a/csharp/Lib/Utils/Units.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace InnovEnergy.Lib.Utils; - -public static class Units -{ - public static String Unit(this Object v, String unit) => $"{v} {unit}"; - - public static String V(this Object v) => v.Unit("V"); - public static String W(this Object v) => v.Unit("W"); - public static String A(this Object v) => v.Unit("A"); - - public static String Degrees(this Object v) => v.Unit("°"); - public static String Celsius(this Object v) => v.Unit("°C"); - public static String Percent(this Object v) => v.Unit("%"); - -} \ No newline at end of file diff --git a/csharp/Lib/Utils/Utils.cs b/csharp/Lib/Utils/Utils.cs index f4e5deb88..690d6abaa 100644 --- a/csharp/Lib/Utils/Utils.cs +++ b/csharp/Lib/Utils/Utils.cs @@ -79,6 +79,15 @@ public static class Utils ? res : res + length; } + + public static Decimal Modulo(this Decimal dividend, Decimal divisor) + { + var res = dividend % divisor; + + return res >= 0 + ? res + : res + divisor; + } public static IEnumerable Traverse(this T root, Func> getChildren) { From 53737a8e1c4d1d6def681068a2cb86bef3692f04 Mon Sep 17 00:00:00 2001 From: ig Date: Sun, 26 Feb 2023 15:39:55 +0100 Subject: [PATCH 08/12] Completely rewrite Units.csproj --- csharp/Lib/Units/Angle.cs | 56 ++---------------- csharp/Lib/Units/ApparentPower.cs | 16 +++++ csharp/Lib/Units/Composite/Ac1Phase.cs | 14 ++--- csharp/Lib/Units/Composite/Ac3Phase.cs | 10 +++- csharp/Lib/Units/Composite/AcPhase.cs | 10 ++-- csharp/Lib/Units/Frequency.cs | 54 ++--------------- .../Lib/Units/Generator/GenerateAttribute.cs | 5 ++ csharp/Lib/Units/Generator/Template.txt | 46 +++++++++++++++ csharp/Lib/Units/Generator/generate.sh | 13 +++++ csharp/Lib/Units/Power.cs | 55 ++---------------- csharp/Lib/Units/Power.generated.cs | 46 +++++++++++++++ csharp/Lib/Units/ReactivePower.cs | 13 +++++ csharp/Lib/Units/Resistance.cs | 54 ++--------------- csharp/Lib/Units/Temperature.cs | 57 ++---------------- csharp/Lib/Units/Units.cs | 17 ++++-- csharp/Lib/Units/Units.csproj | 9 ++- csharp/Lib/Units/Voltage.cs | 58 ++----------------- 17 files changed, 199 insertions(+), 334 deletions(-) create mode 100644 csharp/Lib/Units/ApparentPower.cs create mode 100644 csharp/Lib/Units/Generator/GenerateAttribute.cs create mode 100644 csharp/Lib/Units/Generator/Template.txt create mode 100755 csharp/Lib/Units/Generator/generate.sh create mode 100644 csharp/Lib/Units/Power.generated.cs create mode 100644 csharp/Lib/Units/ReactivePower.cs diff --git a/csharp/Lib/Units/Angle.cs b/csharp/Lib/Units/Angle.cs index 0f0aa7d8f..87a3ed2b4 100644 --- a/csharp/Lib/Units/Angle.cs +++ b/csharp/Lib/Units/Angle.cs @@ -1,20 +1,17 @@ using DecimalMath; +using InnovEnergy.Lib.Units.Generator; using InnovEnergy.Lib.Utils; namespace InnovEnergy.Lib.Units; -using T = Angle; - -public readonly struct Angle +[Generate] +public readonly partial struct Angle { - - public static String Unit => "rad"; public static String Symbol => "∠"; public static readonly Angle Pi = new Angle(DecimalEx.Pi); - public Decimal Value { get; } public Angle(Decimal value) { @@ -24,50 +21,5 @@ public readonly struct Angle ? modulo - DecimalEx.TwoPi : modulo; } - - public override String ToString() => Value + Unit; - - - #region scalar multiplication - - public static Angle operator *(Decimal scalar, Angle angle ) => new Angle(scalar * angle.Value); - public static Angle operator *(Angle angle , Decimal scalar) => new Angle(scalar * angle.Value); - public static Angle operator /(Angle angle , Decimal scalar) => new Angle(angle.Value / scalar); - - #endregion - - #region addition - - public static T operator +(T left, T right) => new T(left.Value + right.Value); - public static T operator -(T left, T right) => new T(left.Value - right.Value); - public static T operator -(T t) => new T(-t.Value); - - #endregion - - #region compare - - public static Boolean operator ==(T left, T right) => left.Value == right.Value; - public static Boolean operator !=(T left, T right) => left.Value != right.Value; - public static Boolean operator > (T left, T right) => left.Value > right.Value; - public static Boolean operator < (T left, T right) => left.Value < right.Value; - public static Boolean operator >=(T left, T right) => left.Value >= right.Value; - public static Boolean operator <=(T left, T right) => left.Value <= right.Value; - - #endregion - - #region conversion - - public static implicit operator T(Decimal d) => new T(d); - public static implicit operator T(Double d) => new T((Decimal)d); - public static implicit operator T(Int32 i) => new T(i); - public static implicit operator Decimal(T t) => t.Value; - - #endregion - - #region equality - - public override Boolean Equals(Object? obj) => obj is T other && Equals(other); - public override Int32 GetHashCode() => Value.GetHashCode(); - - #endregion + } \ No newline at end of file diff --git a/csharp/Lib/Units/ApparentPower.cs b/csharp/Lib/Units/ApparentPower.cs new file mode 100644 index 000000000..b2a5bba6c --- /dev/null +++ b/csharp/Lib/Units/ApparentPower.cs @@ -0,0 +1,16 @@ +using InnovEnergy.Lib.Units.Generator; + +namespace InnovEnergy.Lib.Units; + +[Generate] +public readonly partial struct ApparentPower +{ + public static String Unit => "VA"; + public static String Symbol => "S"; + + public ApparentPower(Decimal value) + { + if (value < 0) throw new ArgumentException("Apparent power cannot be negative", nameof(value)); + Value = value; + } +} \ No newline at end of file diff --git a/csharp/Lib/Units/Composite/Ac1Phase.cs b/csharp/Lib/Units/Composite/Ac1Phase.cs index e9970378b..00f823791 100644 --- a/csharp/Lib/Units/Composite/Ac1Phase.cs +++ b/csharp/Lib/Units/Composite/Ac1Phase.cs @@ -1,10 +1,10 @@ namespace InnovEnergy.Lib.Units.Composite; public record Ac1Phase - ( - Voltage Voltage, - Current Current, - Angle Phi, - Frequency Frequency - ) : - AcPhase(Voltage, Current, Phi); \ No newline at end of file +( + Voltage Voltage, + Current Current, + Angle Phi, + Frequency Frequency +) : +AcPhase(Voltage, Current, Phi); \ No newline at end of file diff --git a/csharp/Lib/Units/Composite/Ac3Phase.cs b/csharp/Lib/Units/Composite/Ac3Phase.cs index 1fc44306f..be4f7c73d 100644 --- a/csharp/Lib/Units/Composite/Ac3Phase.cs +++ b/csharp/Lib/Units/Composite/Ac3Phase.cs @@ -1,8 +1,12 @@ +using static DecimalMath.DecimalEx; + namespace InnovEnergy.Lib.Units.Composite; public record Ac3Phase(AcPhase L1, AcPhase L2, AcPhase L3, Decimal Frequency) { - public Power ApparentPower => L1.ApparentPower + L2.ApparentPower + L3.ApparentPower; - public Power ReactivePower => L1.ReactivePower + L2.ReactivePower + L3.ReactivePower; - public Power ActivePower => L1.ActivePower + L2.ActivePower + L3.ActivePower; + public ApparentPower ApparentPower => L1.ApparentPower + L2.ApparentPower + L3.ApparentPower; + public ReactivePower ReactivePower => L1.ReactivePower + L2.ReactivePower + L3.ReactivePower; + public Power ActivePower => L1.ActivePower + L2.ActivePower + L3.ActivePower; + + public Angle Phi => ATan2(ReactivePower, ActivePower); } \ No newline at end of file diff --git a/csharp/Lib/Units/Composite/AcPhase.cs b/csharp/Lib/Units/Composite/AcPhase.cs index c616b9c57..f194f28af 100644 --- a/csharp/Lib/Units/Composite/AcPhase.cs +++ b/csharp/Lib/Units/Composite/AcPhase.cs @@ -5,7 +5,7 @@ namespace InnovEnergy.Lib.Units.Composite; public record AcPhase : Phase { - protected AcPhase(Voltage voltage, Current current, Angle phi) : base(voltage, current) + public AcPhase(Voltage voltage, Current current, Angle phi) : base(voltage, current) { if (voltage < 0) throw new ArgumentException("RMS value cannot be negative", nameof(voltage)); if (current < 0) throw new ArgumentException("RMS value cannot be negative", nameof(current)); @@ -15,8 +15,8 @@ public record AcPhase : Phase public Angle Phi { get; } - public Power ApparentPower => Voltage * Current; - public Power ActivePower => ApparentPower * PowerFactor; - public Power ReactivePower => ApparentPower * Sin(Phi); - public Decimal PowerFactor => Cos(Phi); + public ApparentPower ApparentPower => Math.Abs(Voltage.Value * Current.Value) ; + public Power ActivePower => ApparentPower.Value * PowerFactor; + public ReactivePower ReactivePower => ApparentPower.Value * Sin(Phi); + public Decimal PowerFactor => Cos(Phi); } \ No newline at end of file diff --git a/csharp/Lib/Units/Frequency.cs b/csharp/Lib/Units/Frequency.cs index 91a3e3849..173f5037d 100644 --- a/csharp/Lib/Units/Frequency.cs +++ b/csharp/Lib/Units/Frequency.cs @@ -1,59 +1,13 @@ +using InnovEnergy.Lib.Units.Generator; + namespace InnovEnergy.Lib.Units; -using T = Frequency; -public readonly struct Frequency +[Generate] +public readonly partial struct Frequency { public static String Unit => "Hz"; public static String Symbol => "f"; - public Decimal Value { get; } - public Frequency(Decimal value) => Value = value; - - public override String ToString() => Value + Unit; - - #region scalar multiplication - - public static T operator *(Decimal scalar, T t) => new T(scalar * t.Value); - public static T operator *(T t, Decimal scalar) => new T(scalar * t.Value); - public static T operator /(T t, Decimal scalar) => new T(t.Value / scalar); - - #endregion - - #region addition - - public static T operator +(T left, T right) => new T(left.Value + right.Value); - public static T operator -(T left, T right) => new T(left.Value - right.Value); - public static T operator -(T t) => new T(-t.Value); - - #endregion - - #region compare - - public static Boolean operator ==(T left, T right) => left.Value == right.Value; - public static Boolean operator !=(T left, T right) => left.Value != right.Value; - public static Boolean operator > (T left, T right) => left.Value > right.Value; - public static Boolean operator < (T left, T right) => left.Value < right.Value; - public static Boolean operator >=(T left, T right) => left.Value >= right.Value; - public static Boolean operator <=(T left, T right) => left.Value <= right.Value; - - #endregion - - #region conversion - - public static implicit operator T(Decimal d) => new T(d); - public static implicit operator T(Double d) => new T((Decimal)d); - public static implicit operator T(Int32 i) => new T(i); - public static implicit operator Decimal(T t) => t.Value; - - #endregion - - #region equality - - public Boolean Equals(T other) => Value == other.Value; - public override Boolean Equals(Object? obj) => obj is T other && Equals(other); - public override Int32 GetHashCode() => Value.GetHashCode(); - - #endregion } \ No newline at end of file diff --git a/csharp/Lib/Units/Generator/GenerateAttribute.cs b/csharp/Lib/Units/Generator/GenerateAttribute.cs new file mode 100644 index 000000000..c6643d2d7 --- /dev/null +++ b/csharp/Lib/Units/Generator/GenerateAttribute.cs @@ -0,0 +1,5 @@ +namespace InnovEnergy.Lib.Units.Generator; + +[AttributeUsage(AttributeTargets.Struct)] +internal class GenerateAttribute: Attribute +{} \ No newline at end of file diff --git a/csharp/Lib/Units/Generator/Template.txt b/csharp/Lib/Units/Generator/Template.txt new file mode 100644 index 000000000..6055ace01 --- /dev/null +++ b/csharp/Lib/Units/Generator/Template.txt @@ -0,0 +1,46 @@ +#nullable enable // Auto-generated code requires an explicit '#nullable' directive in source. + +namespace InnovEnergy.Lib.Units; + +using T = Template; + +public readonly partial struct Template +{ + public Decimal Value { get; } + public override String ToString() => Value + Unit; + + // scalar multiplication + + public static T operator *(Decimal scalar, T t) => new T(scalar * t.Value); + public static T operator *(T t, Decimal scalar) => new T(scalar * t.Value); + public static T operator /(T t, Decimal scalar) => new T(t.Value / scalar); + + // addition + + public static T operator +(T left, T right) => new T(left.Value + right.Value); + public static T operator -(T left, T right) => new T(left.Value - right.Value); + public static T operator -(T t) => new T(-t.Value); + + // compare + + public static Boolean operator ==(T left, T right) => left.Value == right.Value; + public static Boolean operator !=(T left, T right) => left.Value != right.Value; + public static Boolean operator > (T left, T right) => left.Value > right.Value; + public static Boolean operator < (T left, T right) => left.Value < right.Value; + public static Boolean operator >=(T left, T right) => left.Value >= right.Value; + public static Boolean operator <=(T left, T right) => left.Value <= right.Value; + + // conversion + + public static implicit operator T(Decimal d) => new T(d); + public static implicit operator T(Double d) => new T((Decimal)d); + public static implicit operator T(Int32 i) => new T(i); + public static implicit operator Decimal(T t) => t.Value; + + // equality + + public Boolean Equals(T other) => Value == other.Value; + public override Boolean Equals(Object? obj) => obj is T other && Equals(other); + public override Int32 GetHashCode() => Value.GetHashCode(); + +} diff --git a/csharp/Lib/Units/Generator/generate.sh b/csharp/Lib/Units/Generator/generate.sh new file mode 100755 index 000000000..01ff06f64 --- /dev/null +++ b/csharp/Lib/Units/Generator/generate.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash + + +scriptDir=$( dirname -- "$0"; ) +cd "$scriptDir/.." || exit + +for file in $(grep -l '\[Generate\]' *.cs) +do + filename=$(basename -- "$file") + class="${filename%.*}" + echo "generating $filename" + sed "s/Template/$class/g" "./Generator/Template.txt" > "./$class.generated.cs" +done \ No newline at end of file diff --git a/csharp/Lib/Units/Power.cs b/csharp/Lib/Units/Power.cs index 4bc44a53a..716336a5e 100644 --- a/csharp/Lib/Units/Power.cs +++ b/csharp/Lib/Units/Power.cs @@ -1,66 +1,19 @@ +using InnovEnergy.Lib.Units.Generator; + namespace InnovEnergy.Lib.Units; -using T = Power; - -public readonly struct Power +[Generate] +public readonly partial struct Power { public static String Unit => "W"; public static String Symbol => "P"; - - public Decimal Value { get; } public Power(Decimal value) => Value = value; - public override String ToString() => Value + Unit; - // P=UI public static Voltage operator /(Power power, Current current) => new Voltage(power.Value / current.Value); public static Current operator /(Power power, Voltage voltage) => new Current(power.Value / voltage.Value); - #region scalar multiplication - - public static T operator *(Decimal scalar, T t) => new T(scalar * t.Value); - public static T operator *(T t, Decimal scalar) => new T(scalar * t.Value); - public static T operator /(T t, Decimal scalar) => new T(t.Value / scalar); - - #endregion - - #region addition - - public static T operator +(T left, T right) => new T(left.Value + right.Value); - public static T operator -(T left, T right) => new T(left.Value - right.Value); - public static T operator -(T t) => new T(-t.Value); - - #endregion - - #region compare - - public static Boolean operator ==(T left, T right) => left.Value == right.Value; - public static Boolean operator !=(T left, T right) => left.Value != right.Value; - public static Boolean operator > (T left, T right) => left.Value > right.Value; - public static Boolean operator < (T left, T right) => left.Value < right.Value; - public static Boolean operator >=(T left, T right) => left.Value >= right.Value; - public static Boolean operator <=(T left, T right) => left.Value <= right.Value; - - #endregion - - #region conversion - - public static implicit operator T(Decimal d) => new T(d); - public static implicit operator T(Double d) => new T((Decimal)d); - public static implicit operator T(Int32 i) => new T(i); - public static implicit operator Decimal(T t) => t.Value; - - #endregion - - #region equality - - public Boolean Equals(T other) => Value == other.Value; - public override Boolean Equals(Object? obj) => obj is T other && Equals(other); - public override Int32 GetHashCode() => Value.GetHashCode(); - - #endregion - } \ No newline at end of file diff --git a/csharp/Lib/Units/Power.generated.cs b/csharp/Lib/Units/Power.generated.cs new file mode 100644 index 000000000..3d4d12a65 --- /dev/null +++ b/csharp/Lib/Units/Power.generated.cs @@ -0,0 +1,46 @@ +#nullable enable // Auto-generated code requires an explicit '#nullable' directive in source. + +namespace InnovEnergy.Lib.Units; + +using T = ReactivePower; + +public readonly partial struct ReactivePower +{ + public Decimal Value { get; } + public override String ToString() => Value + Unit; + + // scalar multiplication + + public static T operator *(Decimal scalar, T t) => new T(scalar * t.Value); + public static T operator *(T t, Decimal scalar) => new T(scalar * t.Value); + public static T operator /(T t, Decimal scalar) => new T(t.Value / scalar); + + // addition + + public static T operator +(T left, T right) => new T(left.Value + right.Value); + public static T operator -(T left, T right) => new T(left.Value - right.Value); + public static T operator -(T t) => new T(-t.Value); + + // compare + + public static Boolean operator ==(T left, T right) => left.Value == right.Value; + public static Boolean operator !=(T left, T right) => left.Value != right.Value; + public static Boolean operator > (T left, T right) => left.Value > right.Value; + public static Boolean operator < (T left, T right) => left.Value < right.Value; + public static Boolean operator >=(T left, T right) => left.Value >= right.Value; + public static Boolean operator <=(T left, T right) => left.Value <= right.Value; + + // conversion + + public static implicit operator T(Decimal d) => new T(d); + public static implicit operator T(Double d) => new T((Decimal)d); + public static implicit operator T(Int32 i) => new T(i); + public static implicit operator Decimal(T t) => t.Value; + + // equality + + public Boolean Equals(T other) => Value == other.Value; + public override Boolean Equals(Object? obj) => obj is T other && Equals(other); + public override Int32 GetHashCode() => Value.GetHashCode(); + +} \ No newline at end of file diff --git a/csharp/Lib/Units/ReactivePower.cs b/csharp/Lib/Units/ReactivePower.cs new file mode 100644 index 000000000..a7017cb32 --- /dev/null +++ b/csharp/Lib/Units/ReactivePower.cs @@ -0,0 +1,13 @@ + +using InnovEnergy.Lib.Units.Generator; + +namespace InnovEnergy.Lib.Units; + +[Generate] +public readonly partial struct ReactivePower +{ + public static String Unit => "var"; + public static String Symbol => "Q"; + + public ReactivePower(Decimal value) => Value = value; +} \ No newline at end of file diff --git a/csharp/Lib/Units/Resistance.cs b/csharp/Lib/Units/Resistance.cs index c3c0b34c0..f31cd4a4b 100644 --- a/csharp/Lib/Units/Resistance.cs +++ b/csharp/Lib/Units/Resistance.cs @@ -1,63 +1,19 @@ +using InnovEnergy.Lib.Units.Generator; + namespace InnovEnergy.Lib.Units; -using T = Resistance; - -public readonly struct Resistance +[Generate] +public readonly partial struct Resistance { public static String Unit => "Ω"; public static String Symbol => "R"; - public Decimal Value { get; } public Resistance(Decimal value) => Value = value; - public override String ToString() => Value + Unit; - // U=RI public static Voltage operator *(Resistance resistance, Current current) => new Voltage(resistance.Value * current.Value); - #region scalar multiplication - - public static T operator *(Decimal scalar, T t) => new T(scalar * t.Value); - public static T operator *(T t, Decimal scalar) => new T(scalar * t.Value); - public static T operator /(T t, Decimal scalar) => new T(t.Value / scalar); - - #endregion - - #region addition - - public static T operator +(T left, T right) => new T(left.Value + right.Value); - public static T operator -(T left, T right) => new T(left.Value - right.Value); - public static T operator -(T t) => new T(-t.Value); - - #endregion - - #region compare - - public static Boolean operator ==(T left, T right) => left.Value == right.Value; - public static Boolean operator !=(T left, T right) => left.Value != right.Value; - public static Boolean operator > (T left, T right) => left.Value > right.Value; - public static Boolean operator < (T left, T right) => left.Value < right.Value; - public static Boolean operator >=(T left, T right) => left.Value >= right.Value; - public static Boolean operator <=(T left, T right) => left.Value <= right.Value; - - #endregion - - #region conversion - - public static implicit operator T(Decimal d) => new T(d); - public static implicit operator T(Double d) => new T((Decimal)d); - public static implicit operator T(Int32 i) => new T(i); - public static implicit operator Decimal(T t) => t.Value; - - #endregion - - #region equality - - public Boolean Equals(T other) => Value == other.Value; - public override Boolean Equals(Object? obj) => obj is T other && Equals(other); - public override Int32 GetHashCode() => Value.GetHashCode(); - - #endregion + } \ No newline at end of file diff --git a/csharp/Lib/Units/Temperature.cs b/csharp/Lib/Units/Temperature.cs index 22a411338..243487d7f 100644 --- a/csharp/Lib/Units/Temperature.cs +++ b/csharp/Lib/Units/Temperature.cs @@ -1,61 +1,12 @@ +using InnovEnergy.Lib.Units.Generator; + namespace InnovEnergy.Lib.Units; -using T = Temperature; - -public readonly struct Temperature +[Generate] +public readonly partial struct Temperature { public static String Unit => "°C"; public static String Symbol => "T"; - public Decimal Value { get; } - public Temperature(Decimal value) => Value = value; - - public override String ToString() => Value + Unit; - - - #region scalar multiplication - - public static T operator *(Decimal scalar, T t) => new T(scalar * t.Value); - public static T operator *(T t, Decimal scalar) => new T(scalar * t.Value); - public static T operator /(T t, Decimal scalar) => new T(t.Value / scalar); - - #endregion - - #region addition - - public static T operator +(T left, T right) => new T(left.Value + right.Value); - public static T operator -(T left, T right) => new T(left.Value - right.Value); - public static T operator -(T t) => new T(-t.Value); - - #endregion - - #region compare - - public static Boolean operator ==(T left, T right) => left.Value == right.Value; - public static Boolean operator !=(T left, T right) => left.Value != right.Value; - public static Boolean operator > (T left, T right) => left.Value > right.Value; - public static Boolean operator < (T left, T right) => left.Value < right.Value; - public static Boolean operator >=(T left, T right) => left.Value >= right.Value; - public static Boolean operator <=(T left, T right) => left.Value <= right.Value; - - #endregion - - #region conversion - - public static implicit operator T(Decimal d) => new T(d); - public static implicit operator T(Double d) => new T((Decimal)d); - public static implicit operator T(Int32 i) => new T(i); - public static implicit operator Decimal(T t) => t.Value; - - #endregion - - #region equality - - public Boolean Equals(T other) => Value == other.Value; - public override Boolean Equals(Object? obj) => obj is T other && Equals(other); - public override Int32 GetHashCode() => Value.GetHashCode(); - - #endregion - } \ No newline at end of file diff --git a/csharp/Lib/Units/Units.cs b/csharp/Lib/Units/Units.cs index 88b9e04aa..de1b246ad 100644 --- a/csharp/Lib/Units/Units.cs +++ b/csharp/Lib/Units/Units.cs @@ -5,16 +5,23 @@ namespace InnovEnergy.Lib.Units; public static class Units { - public static Current A (this Decimal value) => new Current(value); - public static Voltage V (this Decimal value) => new Voltage(value); - public static Power W (this Decimal value) => new Power(value); - public static Resistance Ohm(this Decimal value) => new Resistance(value); + public static Current A (this Decimal value) => new Current(value); + public static Voltage V (this Decimal value) => new Voltage(value); + public static Power W (this Decimal value) => new Power(value); + public static ReactivePower Var (this Decimal value) => new ReactivePower(value); + public static ApparentPower Va (this Decimal value) => new ApparentPower(value); + public static Resistance Ohm (this Decimal value) => new Resistance(value); + public static Frequency Hz (this Decimal value) => new Frequency(value); + public static Angle Rad (this Decimal value) => new Angle(value); + public static Temperature Celsius(this Decimal value) => new Temperature(value); public static readonly IReadOnlyList JsonConverters = new JsonConverter[] { new CurrentConverter(), new VoltageConverter(), new PowerConverter(), - new ResistanceConverter() + new ResistanceConverter(), + + // TODO }; } \ No newline at end of file diff --git a/csharp/Lib/Units/Units.csproj b/csharp/Lib/Units/Units.csproj index eab4f3f58..4cedc809f 100644 --- a/csharp/Lib/Units/Units.csproj +++ b/csharp/Lib/Units/Units.csproj @@ -1,11 +1,6 @@ - - Library - preview - - @@ -14,4 +9,8 @@ + + + + diff --git a/csharp/Lib/Units/Voltage.cs b/csharp/Lib/Units/Voltage.cs index db75e63e0..5bbfc088f 100644 --- a/csharp/Lib/Units/Voltage.cs +++ b/csharp/Lib/Units/Voltage.cs @@ -1,69 +1,19 @@ +using InnovEnergy.Lib.Units.Generator; + namespace InnovEnergy.Lib.Units; -using T = Voltage; - -public readonly struct Voltage +[Generate] +public readonly partial struct Voltage { public static String Unit => "V"; public static String Symbol => "U"; - - public Decimal Value { get; } public Voltage(Decimal value) => Value = value; - public override String ToString() => Value + Unit; // U=RI public static Current operator /(Voltage voltage, Resistance resistance) => new Current(voltage.Value / resistance.Value); // P=UI public static Power operator *(Voltage voltage, Current current) => new Power(current.Value * voltage.Value); - - - #region scalar multiplication - - public static T operator *(Decimal scalar, T t) => new T(scalar * t.Value); - public static T operator *(T t, Decimal scalar) => new T(scalar * t.Value); - public static T operator /(T t, Decimal scalar) => new T(t.Value / scalar); - - #endregion - - #region addition - - public static T operator +(T left, T right) => new T(left.Value + right.Value); - public static T operator -(T left, T right) => new T(left.Value - right.Value); - public static T operator -(T t) => new T(-t.Value); - - #endregion - - #region compare - - public static Boolean operator ==(T left, T right) => left.Value == right.Value; - public static Boolean operator !=(T left, T right) => left.Value != right.Value; - public static Boolean operator > (T left, T right) => left.Value > right.Value; - public static Boolean operator < (T left, T right) => left.Value < right.Value; - public static Boolean operator >=(T left, T right) => left.Value >= right.Value; - public static Boolean operator <=(T left, T right) => left.Value <= right.Value; - - #endregion - - #region conversion - - public static implicit operator T(Decimal d) => new T(d); - public static implicit operator T(Double d) => new T((Decimal)d); - public static implicit operator T(Int32 i) => new T(i); - public static implicit operator Decimal(T t) => t.Value; - - #endregion - - #region equality - - public Boolean Equals(T other) => Value == other.Value; - public override Boolean Equals(Object? obj) => obj is T other && Equals(other); - public override Int32 GetHashCode() => Value.GetHashCode(); - - #endregion - - - } \ No newline at end of file From e74d94e268998a5a13116e396abcbb377d515c3e Mon Sep 17 00:00:00 2001 From: ig Date: Sun, 26 Feb 2023 15:43:53 +0100 Subject: [PATCH 09/12] Add missing .generated.cs files. --- csharp/InnovEnergy.sln | 1 + csharp/Lib/Units/Angle.generated.cs | 46 +++++++++++++++++++++ csharp/Lib/Units/Current.cs | 20 +++++++++ csharp/Lib/Units/Current.generated.cs | 46 +++++++++++++++++++++ csharp/Lib/Units/Frequency.generated.cs | 46 +++++++++++++++++++++ csharp/Lib/Units/ReactivePower.generated.cs | 46 +++++++++++++++++++++ csharp/Lib/Units/Resistance.generated.cs | 46 +++++++++++++++++++++ csharp/Lib/Units/Temperature.generated.cs | 46 +++++++++++++++++++++ csharp/Lib/Units/Voltage.generated.cs | 46 +++++++++++++++++++++ 9 files changed, 343 insertions(+) create mode 100644 csharp/Lib/Units/Angle.generated.cs create mode 100644 csharp/Lib/Units/Current.cs create mode 100644 csharp/Lib/Units/Current.generated.cs create mode 100644 csharp/Lib/Units/Frequency.generated.cs create mode 100644 csharp/Lib/Units/ReactivePower.generated.cs create mode 100644 csharp/Lib/Units/Resistance.generated.cs create mode 100644 csharp/Lib/Units/Temperature.generated.cs create mode 100644 csharp/Lib/Units/Voltage.generated.cs diff --git a/csharp/InnovEnergy.sln b/csharp/InnovEnergy.sln index 3a0fa6fcd..8d368b9cb 100644 --- a/csharp/InnovEnergy.sln +++ b/csharp/InnovEnergy.sln @@ -69,6 +69,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Meta", "Meta", "{AED84693-C App\InnovEnergy.App.props = App\InnovEnergy.App.props Lib\InnovEnergy.Lib.props = Lib\InnovEnergy.Lib.props InnovEnergy.sln.DotSettings = InnovEnergy.sln.DotSettings + ..\.gitignore = ..\.gitignore EndProjectSection EndProject diff --git a/csharp/Lib/Units/Angle.generated.cs b/csharp/Lib/Units/Angle.generated.cs new file mode 100644 index 000000000..77f634fd3 --- /dev/null +++ b/csharp/Lib/Units/Angle.generated.cs @@ -0,0 +1,46 @@ +#nullable enable // Auto-generated code requires an explicit '#nullable' directive in source. + +namespace InnovEnergy.Lib.Units; + +using T = Angle; + +public readonly partial struct Angle +{ + public Decimal Value { get; } + public override String ToString() => Value + Unit; + + // scalar multiplication + + public static T operator *(Decimal scalar, T t) => new T(scalar * t.Value); + public static T operator *(T t, Decimal scalar) => new T(scalar * t.Value); + public static T operator /(T t, Decimal scalar) => new T(t.Value / scalar); + + // addition + + public static T operator +(T left, T right) => new T(left.Value + right.Value); + public static T operator -(T left, T right) => new T(left.Value - right.Value); + public static T operator -(T t) => new T(-t.Value); + + // compare + + public static Boolean operator ==(T left, T right) => left.Value == right.Value; + public static Boolean operator !=(T left, T right) => left.Value != right.Value; + public static Boolean operator > (T left, T right) => left.Value > right.Value; + public static Boolean operator < (T left, T right) => left.Value < right.Value; + public static Boolean operator >=(T left, T right) => left.Value >= right.Value; + public static Boolean operator <=(T left, T right) => left.Value <= right.Value; + + // conversion + + public static implicit operator T(Decimal d) => new T(d); + public static implicit operator T(Double d) => new T((Decimal)d); + public static implicit operator T(Int32 i) => new T(i); + public static implicit operator Decimal(T t) => t.Value; + + // equality + + public Boolean Equals(T other) => Value == other.Value; + public override Boolean Equals(Object? obj) => obj is T other && Equals(other); + public override Int32 GetHashCode() => Value.GetHashCode(); + +} \ No newline at end of file diff --git a/csharp/Lib/Units/Current.cs b/csharp/Lib/Units/Current.cs new file mode 100644 index 000000000..d2d674d04 --- /dev/null +++ b/csharp/Lib/Units/Current.cs @@ -0,0 +1,20 @@ +using InnovEnergy.Lib.Units.Generator; + +namespace InnovEnergy.Lib.Units; + + +[Generate] +public readonly partial struct Current +{ + public static String Unit => "A"; + public static String Symbol => "I"; + + public Current(Decimal value) => Value = value; + + // P=UI + public static Power operator *(Current current, Voltage voltage) => new Power(current.Value * voltage.Value); + + // U=RI + public static Voltage operator *(Current current, Resistance resistance) => new Voltage(resistance.Value* current.Value); + +} \ No newline at end of file diff --git a/csharp/Lib/Units/Current.generated.cs b/csharp/Lib/Units/Current.generated.cs new file mode 100644 index 000000000..bc1964810 --- /dev/null +++ b/csharp/Lib/Units/Current.generated.cs @@ -0,0 +1,46 @@ +#nullable enable // Auto-generated code requires an explicit '#nullable' directive in source. + +namespace InnovEnergy.Lib.Units; + +using T = Current; + +public readonly partial struct Current +{ + public Decimal Value { get; } + public override String ToString() => Value + Unit; + + // scalar multiplication + + public static T operator *(Decimal scalar, T t) => new T(scalar * t.Value); + public static T operator *(T t, Decimal scalar) => new T(scalar * t.Value); + public static T operator /(T t, Decimal scalar) => new T(t.Value / scalar); + + // addition + + public static T operator +(T left, T right) => new T(left.Value + right.Value); + public static T operator -(T left, T right) => new T(left.Value - right.Value); + public static T operator -(T t) => new T(-t.Value); + + // compare + + public static Boolean operator ==(T left, T right) => left.Value == right.Value; + public static Boolean operator !=(T left, T right) => left.Value != right.Value; + public static Boolean operator > (T left, T right) => left.Value > right.Value; + public static Boolean operator < (T left, T right) => left.Value < right.Value; + public static Boolean operator >=(T left, T right) => left.Value >= right.Value; + public static Boolean operator <=(T left, T right) => left.Value <= right.Value; + + // conversion + + public static implicit operator T(Decimal d) => new T(d); + public static implicit operator T(Double d) => new T((Decimal)d); + public static implicit operator T(Int32 i) => new T(i); + public static implicit operator Decimal(T t) => t.Value; + + // equality + + public Boolean Equals(T other) => Value == other.Value; + public override Boolean Equals(Object? obj) => obj is T other && Equals(other); + public override Int32 GetHashCode() => Value.GetHashCode(); + +} \ No newline at end of file diff --git a/csharp/Lib/Units/Frequency.generated.cs b/csharp/Lib/Units/Frequency.generated.cs new file mode 100644 index 000000000..2959bdbc4 --- /dev/null +++ b/csharp/Lib/Units/Frequency.generated.cs @@ -0,0 +1,46 @@ +#nullable enable // Auto-generated code requires an explicit '#nullable' directive in source. + +namespace InnovEnergy.Lib.Units; + +using T = Frequency; + +public readonly partial struct Frequency +{ + public Decimal Value { get; } + public override String ToString() => Value + Unit; + + // scalar multiplication + + public static T operator *(Decimal scalar, T t) => new T(scalar * t.Value); + public static T operator *(T t, Decimal scalar) => new T(scalar * t.Value); + public static T operator /(T t, Decimal scalar) => new T(t.Value / scalar); + + // addition + + public static T operator +(T left, T right) => new T(left.Value + right.Value); + public static T operator -(T left, T right) => new T(left.Value - right.Value); + public static T operator -(T t) => new T(-t.Value); + + // compare + + public static Boolean operator ==(T left, T right) => left.Value == right.Value; + public static Boolean operator !=(T left, T right) => left.Value != right.Value; + public static Boolean operator > (T left, T right) => left.Value > right.Value; + public static Boolean operator < (T left, T right) => left.Value < right.Value; + public static Boolean operator >=(T left, T right) => left.Value >= right.Value; + public static Boolean operator <=(T left, T right) => left.Value <= right.Value; + + // conversion + + public static implicit operator T(Decimal d) => new T(d); + public static implicit operator T(Double d) => new T((Decimal)d); + public static implicit operator T(Int32 i) => new T(i); + public static implicit operator Decimal(T t) => t.Value; + + // equality + + public Boolean Equals(T other) => Value == other.Value; + public override Boolean Equals(Object? obj) => obj is T other && Equals(other); + public override Int32 GetHashCode() => Value.GetHashCode(); + +} \ No newline at end of file diff --git a/csharp/Lib/Units/ReactivePower.generated.cs b/csharp/Lib/Units/ReactivePower.generated.cs new file mode 100644 index 000000000..20a55cccc --- /dev/null +++ b/csharp/Lib/Units/ReactivePower.generated.cs @@ -0,0 +1,46 @@ +#nullable enable // Auto-generated code requires an explicit '#nullable' directive in source. + +namespace InnovEnergy.Lib.Units; + +using T = Power; + +public readonly partial struct Power +{ + public Decimal Value { get; } + public override String ToString() => Value + Unit; + + // scalar multiplication + + public static T operator *(Decimal scalar, T t) => new T(scalar * t.Value); + public static T operator *(T t, Decimal scalar) => new T(scalar * t.Value); + public static T operator /(T t, Decimal scalar) => new T(t.Value / scalar); + + // addition + + public static T operator +(T left, T right) => new T(left.Value + right.Value); + public static T operator -(T left, T right) => new T(left.Value - right.Value); + public static T operator -(T t) => new T(-t.Value); + + // compare + + public static Boolean operator ==(T left, T right) => left.Value == right.Value; + public static Boolean operator !=(T left, T right) => left.Value != right.Value; + public static Boolean operator > (T left, T right) => left.Value > right.Value; + public static Boolean operator < (T left, T right) => left.Value < right.Value; + public static Boolean operator >=(T left, T right) => left.Value >= right.Value; + public static Boolean operator <=(T left, T right) => left.Value <= right.Value; + + // conversion + + public static implicit operator T(Decimal d) => new T(d); + public static implicit operator T(Double d) => new T((Decimal)d); + public static implicit operator T(Int32 i) => new T(i); + public static implicit operator Decimal(T t) => t.Value; + + // equality + + public Boolean Equals(T other) => Value == other.Value; + public override Boolean Equals(Object? obj) => obj is T other && Equals(other); + public override Int32 GetHashCode() => Value.GetHashCode(); + +} \ No newline at end of file diff --git a/csharp/Lib/Units/Resistance.generated.cs b/csharp/Lib/Units/Resistance.generated.cs new file mode 100644 index 000000000..9a715bf51 --- /dev/null +++ b/csharp/Lib/Units/Resistance.generated.cs @@ -0,0 +1,46 @@ +#nullable enable // Auto-generated code requires an explicit '#nullable' directive in source. + +namespace InnovEnergy.Lib.Units; + +using T = Resistance; + +public readonly partial struct Resistance +{ + public Decimal Value { get; } + public override String ToString() => Value + Unit; + + // scalar multiplication + + public static T operator *(Decimal scalar, T t) => new T(scalar * t.Value); + public static T operator *(T t, Decimal scalar) => new T(scalar * t.Value); + public static T operator /(T t, Decimal scalar) => new T(t.Value / scalar); + + // addition + + public static T operator +(T left, T right) => new T(left.Value + right.Value); + public static T operator -(T left, T right) => new T(left.Value - right.Value); + public static T operator -(T t) => new T(-t.Value); + + // compare + + public static Boolean operator ==(T left, T right) => left.Value == right.Value; + public static Boolean operator !=(T left, T right) => left.Value != right.Value; + public static Boolean operator > (T left, T right) => left.Value > right.Value; + public static Boolean operator < (T left, T right) => left.Value < right.Value; + public static Boolean operator >=(T left, T right) => left.Value >= right.Value; + public static Boolean operator <=(T left, T right) => left.Value <= right.Value; + + // conversion + + public static implicit operator T(Decimal d) => new T(d); + public static implicit operator T(Double d) => new T((Decimal)d); + public static implicit operator T(Int32 i) => new T(i); + public static implicit operator Decimal(T t) => t.Value; + + // equality + + public Boolean Equals(T other) => Value == other.Value; + public override Boolean Equals(Object? obj) => obj is T other && Equals(other); + public override Int32 GetHashCode() => Value.GetHashCode(); + +} \ No newline at end of file diff --git a/csharp/Lib/Units/Temperature.generated.cs b/csharp/Lib/Units/Temperature.generated.cs new file mode 100644 index 000000000..1c87f4c31 --- /dev/null +++ b/csharp/Lib/Units/Temperature.generated.cs @@ -0,0 +1,46 @@ +#nullable enable // Auto-generated code requires an explicit '#nullable' directive in source. + +namespace InnovEnergy.Lib.Units; + +using T = Temperature; + +public readonly partial struct Temperature +{ + public Decimal Value { get; } + public override String ToString() => Value + Unit; + + // scalar multiplication + + public static T operator *(Decimal scalar, T t) => new T(scalar * t.Value); + public static T operator *(T t, Decimal scalar) => new T(scalar * t.Value); + public static T operator /(T t, Decimal scalar) => new T(t.Value / scalar); + + // addition + + public static T operator +(T left, T right) => new T(left.Value + right.Value); + public static T operator -(T left, T right) => new T(left.Value - right.Value); + public static T operator -(T t) => new T(-t.Value); + + // compare + + public static Boolean operator ==(T left, T right) => left.Value == right.Value; + public static Boolean operator !=(T left, T right) => left.Value != right.Value; + public static Boolean operator > (T left, T right) => left.Value > right.Value; + public static Boolean operator < (T left, T right) => left.Value < right.Value; + public static Boolean operator >=(T left, T right) => left.Value >= right.Value; + public static Boolean operator <=(T left, T right) => left.Value <= right.Value; + + // conversion + + public static implicit operator T(Decimal d) => new T(d); + public static implicit operator T(Double d) => new T((Decimal)d); + public static implicit operator T(Int32 i) => new T(i); + public static implicit operator Decimal(T t) => t.Value; + + // equality + + public Boolean Equals(T other) => Value == other.Value; + public override Boolean Equals(Object? obj) => obj is T other && Equals(other); + public override Int32 GetHashCode() => Value.GetHashCode(); + +} \ No newline at end of file diff --git a/csharp/Lib/Units/Voltage.generated.cs b/csharp/Lib/Units/Voltage.generated.cs new file mode 100644 index 000000000..d64264d60 --- /dev/null +++ b/csharp/Lib/Units/Voltage.generated.cs @@ -0,0 +1,46 @@ +#nullable enable // Auto-generated code requires an explicit '#nullable' directive in source. + +namespace InnovEnergy.Lib.Units; + +using T = Voltage; + +public readonly partial struct Voltage +{ + public Decimal Value { get; } + public override String ToString() => Value + Unit; + + // scalar multiplication + + public static T operator *(Decimal scalar, T t) => new T(scalar * t.Value); + public static T operator *(T t, Decimal scalar) => new T(scalar * t.Value); + public static T operator /(T t, Decimal scalar) => new T(t.Value / scalar); + + // addition + + public static T operator +(T left, T right) => new T(left.Value + right.Value); + public static T operator -(T left, T right) => new T(left.Value - right.Value); + public static T operator -(T t) => new T(-t.Value); + + // compare + + public static Boolean operator ==(T left, T right) => left.Value == right.Value; + public static Boolean operator !=(T left, T right) => left.Value != right.Value; + public static Boolean operator > (T left, T right) => left.Value > right.Value; + public static Boolean operator < (T left, T right) => left.Value < right.Value; + public static Boolean operator >=(T left, T right) => left.Value >= right.Value; + public static Boolean operator <=(T left, T right) => left.Value <= right.Value; + + // conversion + + public static implicit operator T(Decimal d) => new T(d); + public static implicit operator T(Double d) => new T((Decimal)d); + public static implicit operator T(Int32 i) => new T(i); + public static implicit operator Decimal(T t) => t.Value; + + // equality + + public Boolean Equals(T other) => Value == other.Value; + public override Boolean Equals(Object? obj) => obj is T other && Equals(other); + public override Int32 GetHashCode() => Value.GetHashCode(); + +} \ No newline at end of file From d2bef311c01ce031a2cea411833f9492195e87a0 Mon Sep 17 00:00:00 2001 From: ig Date: Sun, 26 Feb 2023 15:59:55 +0100 Subject: [PATCH 10/12] Add missing .generated.cs files. --- csharp/Lib/Units/ApparentPower.generated.cs | 46 +++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 csharp/Lib/Units/ApparentPower.generated.cs diff --git a/csharp/Lib/Units/ApparentPower.generated.cs b/csharp/Lib/Units/ApparentPower.generated.cs new file mode 100644 index 000000000..f413a8811 --- /dev/null +++ b/csharp/Lib/Units/ApparentPower.generated.cs @@ -0,0 +1,46 @@ +#nullable enable // Auto-generated code requires an explicit '#nullable' directive in source. + +namespace InnovEnergy.Lib.Units; + +using T = ApparentPower; + +public readonly partial struct ApparentPower +{ + public Decimal Value { get; } + public override String ToString() => Value + Unit; + + // scalar multiplication + + public static T operator *(Decimal scalar, T t) => new T(scalar * t.Value); + public static T operator *(T t, Decimal scalar) => new T(scalar * t.Value); + public static T operator /(T t, Decimal scalar) => new T(t.Value / scalar); + + // addition + + public static T operator +(T left, T right) => new T(left.Value + right.Value); + public static T operator -(T left, T right) => new T(left.Value - right.Value); + public static T operator -(T t) => new T(-t.Value); + + // compare + + public static Boolean operator ==(T left, T right) => left.Value == right.Value; + public static Boolean operator !=(T left, T right) => left.Value != right.Value; + public static Boolean operator > (T left, T right) => left.Value > right.Value; + public static Boolean operator < (T left, T right) => left.Value < right.Value; + public static Boolean operator >=(T left, T right) => left.Value >= right.Value; + public static Boolean operator <=(T left, T right) => left.Value <= right.Value; + + // conversion + + public static implicit operator T(Decimal d) => new T(d); + public static implicit operator T(Double d) => new T((Decimal)d); + public static implicit operator T(Int32 i) => new T(i); + public static implicit operator Decimal(T t) => t.Value; + + // equality + + public Boolean Equals(T other) => Value == other.Value; + public override Boolean Equals(Object? obj) => obj is T other && Equals(other); + public override Int32 GetHashCode() => Value.GetHashCode(); + +} \ No newline at end of file From d5c523974425c94e73d9ce2216d339f29bcfe9ad Mon Sep 17 00:00:00 2001 From: ig Date: Sun, 26 Feb 2023 19:19:16 +0100 Subject: [PATCH 11/12] implement operator + for all Units --- csharp/Lib/Units/Angle.cs | 2 +- csharp/Lib/Units/Angle.generated.cs | 36 ++++++++++++++++- csharp/Lib/Units/ApparentPower.cs | 2 +- csharp/Lib/Units/ApparentPower.generated.cs | 36 ++++++++++++++++- csharp/Lib/Units/Composite/Ac1Phase.cs | 26 +++++++++--- csharp/Lib/Units/Composite/Ac3Phase.cs | 15 ++++++- csharp/Lib/Units/Composite/AcPhase.cs | 34 +++++++++++++++- csharp/Lib/Units/Composite/DcPhase.cs | 9 +++++ csharp/Lib/Units/Current.cs | 2 +- csharp/Lib/Units/Current.generated.cs | 36 ++++++++++++++++- csharp/Lib/Units/Frequency.cs | 11 +++-- csharp/Lib/Units/Frequency.generated.cs | 36 ++++++++++++++++- ...GenerateAttribute.cs => EqualAttribute.cs} | 2 +- csharp/Lib/Units/Generator/MeanAttribute.cs | 5 +++ csharp/Lib/Units/Generator/SumAttribute.cs | 5 +++ csharp/Lib/Units/Generator/Template.txt | 34 +++++++++++++++- csharp/Lib/Units/Generator/generate.sh | 12 +++--- csharp/Lib/Units/Power.cs | 2 +- csharp/Lib/Units/Power.generated.cs | 40 +++++++++++++++++-- csharp/Lib/Units/ReactivePower.cs | 2 +- csharp/Lib/Units/ReactivePower.generated.cs | 40 +++++++++++++++++-- csharp/Lib/Units/Resistance.cs | 4 +- csharp/Lib/Units/Resistance.generated.cs | 36 ++++++++++++++++- csharp/Lib/Units/Temperature.cs | 6 ++- csharp/Lib/Units/Temperature.generated.cs | 36 ++++++++++++++++- csharp/Lib/Units/Voltage.cs | 2 +- csharp/Lib/Units/Voltage.generated.cs | 36 ++++++++++++++++- 27 files changed, 458 insertions(+), 49 deletions(-) rename csharp/Lib/Units/Generator/{GenerateAttribute.cs => EqualAttribute.cs} (65%) create mode 100644 csharp/Lib/Units/Generator/MeanAttribute.cs create mode 100644 csharp/Lib/Units/Generator/SumAttribute.cs diff --git a/csharp/Lib/Units/Angle.cs b/csharp/Lib/Units/Angle.cs index 87a3ed2b4..b8972c826 100644 --- a/csharp/Lib/Units/Angle.cs +++ b/csharp/Lib/Units/Angle.cs @@ -4,7 +4,7 @@ using InnovEnergy.Lib.Utils; namespace InnovEnergy.Lib.Units; -[Generate] +[Sum] public readonly partial struct Angle { public static String Unit => "rad"; diff --git a/csharp/Lib/Units/Angle.generated.cs b/csharp/Lib/Units/Angle.generated.cs index 77f634fd3..ad576594a 100644 --- a/csharp/Lib/Units/Angle.generated.cs +++ b/csharp/Lib/Units/Angle.generated.cs @@ -1,4 +1,7 @@ #nullable enable // Auto-generated code requires an explicit '#nullable' directive in source. +#define Sum + +using static System.Math; namespace InnovEnergy.Lib.Units; @@ -16,10 +19,39 @@ public readonly partial struct Angle public static T operator /(T t, Decimal scalar) => new T(t.Value / scalar); // addition - + + #if Sum + public static T operator +(T left, T right) => new T(left.Value + right.Value); public static T operator -(T left, T right) => new T(left.Value - right.Value); public static T operator -(T t) => new T(-t.Value); + + #elif Mean + + public static T operator +(T left, T right) => new T((left.Value + right.Value)/2m); + + #elif Equal + + public static T operator +(T left, T right) + { + var d = Max(Abs(left.Value), Abs(right.Value)); + + if (d != 0m) + return new T(0m); + + var relativeError = Abs(left.Value - right.Value) / d; + + const Decimal maxRelativeError = 0.05m; + + if (relativeError > maxRelativeError) + throw new Exception($"{nameof(left)} and {nameof(right)} must be approximately equal.\n" + + $"Difference > {maxRelativeError * 100}% detected\n" + + $"{nameof(left)} : {left}\n" + + $"{nameof(right)}: {right}"); + + return new T((left.Value + right.Value) / 2m); + } + #endif // compare @@ -43,4 +75,4 @@ public readonly partial struct Angle public override Boolean Equals(Object? obj) => obj is T other && Equals(other); public override Int32 GetHashCode() => Value.GetHashCode(); -} \ No newline at end of file +} diff --git a/csharp/Lib/Units/ApparentPower.cs b/csharp/Lib/Units/ApparentPower.cs index b2a5bba6c..8c92385de 100644 --- a/csharp/Lib/Units/ApparentPower.cs +++ b/csharp/Lib/Units/ApparentPower.cs @@ -2,7 +2,7 @@ using InnovEnergy.Lib.Units.Generator; namespace InnovEnergy.Lib.Units; -[Generate] +[Sum] public readonly partial struct ApparentPower { public static String Unit => "VA"; diff --git a/csharp/Lib/Units/ApparentPower.generated.cs b/csharp/Lib/Units/ApparentPower.generated.cs index f413a8811..cfa6174ed 100644 --- a/csharp/Lib/Units/ApparentPower.generated.cs +++ b/csharp/Lib/Units/ApparentPower.generated.cs @@ -1,4 +1,7 @@ #nullable enable // Auto-generated code requires an explicit '#nullable' directive in source. +#define Sum + +using static System.Math; namespace InnovEnergy.Lib.Units; @@ -16,10 +19,39 @@ public readonly partial struct ApparentPower public static T operator /(T t, Decimal scalar) => new T(t.Value / scalar); // addition - + + #if Sum + public static T operator +(T left, T right) => new T(left.Value + right.Value); public static T operator -(T left, T right) => new T(left.Value - right.Value); public static T operator -(T t) => new T(-t.Value); + + #elif Mean + + public static T operator +(T left, T right) => new T((left.Value + right.Value)/2m); + + #elif Equal + + public static T operator +(T left, T right) + { + var d = Max(Abs(left.Value), Abs(right.Value)); + + if (d != 0m) + return new T(0m); + + var relativeError = Abs(left.Value - right.Value) / d; + + const Decimal maxRelativeError = 0.05m; + + if (relativeError > maxRelativeError) + throw new Exception($"{nameof(left)} and {nameof(right)} must be approximately equal.\n" + + $"Difference > {maxRelativeError * 100}% detected\n" + + $"{nameof(left)} : {left}\n" + + $"{nameof(right)}: {right}"); + + return new T((left.Value + right.Value) / 2m); + } + #endif // compare @@ -43,4 +75,4 @@ public readonly partial struct ApparentPower public override Boolean Equals(Object? obj) => obj is T other && Equals(other); public override Int32 GetHashCode() => Value.GetHashCode(); -} \ No newline at end of file +} diff --git a/csharp/Lib/Units/Composite/Ac1Phase.cs b/csharp/Lib/Units/Composite/Ac1Phase.cs index 00f823791..e48807866 100644 --- a/csharp/Lib/Units/Composite/Ac1Phase.cs +++ b/csharp/Lib/Units/Composite/Ac1Phase.cs @@ -1,10 +1,26 @@ +using System.Diagnostics.CodeAnalysis; + namespace InnovEnergy.Lib.Units.Composite; public record Ac1Phase ( - Voltage Voltage, - Current Current, - Angle Phi, + Voltage Voltage, + Current Current, + Angle Phi, Frequency Frequency -) : -AcPhase(Voltage, Current, Phi); \ No newline at end of file +) + : AcPhase(Voltage, Current, Phi) +{ + + [SuppressMessage("ReSharper", "RedundantCast")] + public static Ac1Phase operator +(Ac1Phase left, Ac1Phase right) + { + var f = (left.Frequency + right.Frequency) / 2m; // TODO: check that l & r approximately equal + var acPhase = (AcPhase)left + (AcPhase)right; + return new Ac1Phase(acPhase.Voltage, acPhase.Current, acPhase.Phi, f); + } + +} + + + diff --git a/csharp/Lib/Units/Composite/Ac3Phase.cs b/csharp/Lib/Units/Composite/Ac3Phase.cs index be4f7c73d..a5788e452 100644 --- a/csharp/Lib/Units/Composite/Ac3Phase.cs +++ b/csharp/Lib/Units/Composite/Ac3Phase.cs @@ -2,11 +2,24 @@ using static DecimalMath.DecimalEx; namespace InnovEnergy.Lib.Units.Composite; -public record Ac3Phase(AcPhase L1, AcPhase L2, AcPhase L3, Decimal Frequency) +public record Ac3Phase(AcPhase L1, AcPhase L2, AcPhase L3, Frequency Frequency) { public ApparentPower ApparentPower => L1.ApparentPower + L2.ApparentPower + L3.ApparentPower; public ReactivePower ReactivePower => L1.ReactivePower + L2.ReactivePower + L3.ReactivePower; public Power ActivePower => L1.ActivePower + L2.ActivePower + L3.ActivePower; public Angle Phi => ATan2(ReactivePower, ActivePower); + + + public static Ac3Phase operator +(Ac3Phase left, Ac3Phase right) + { + var f = (left.Frequency + right.Frequency) / 2m; // TODO: check that l & r approximately equal + + var l1 = left.L1 + right.L1; + var l2 = left.L2 + right.L2; + var l3 = left.L3 + right.L3; + + return new Ac3Phase(l1, l2, l3, f); + } + } \ No newline at end of file diff --git a/csharp/Lib/Units/Composite/AcPhase.cs b/csharp/Lib/Units/Composite/AcPhase.cs index f194f28af..70cd952b2 100644 --- a/csharp/Lib/Units/Composite/AcPhase.cs +++ b/csharp/Lib/Units/Composite/AcPhase.cs @@ -15,8 +15,40 @@ public record AcPhase : Phase public Angle Phi { get; } - public ApparentPower ApparentPower => Math.Abs(Voltage.Value * Current.Value) ; + public ApparentPower ApparentPower => Voltage.Value * Current.Value ; public Power ActivePower => ApparentPower.Value * PowerFactor; public ReactivePower ReactivePower => ApparentPower.Value * Sin(Phi); public Decimal PowerFactor => Cos(Phi); + + + public static AcPhase operator +(AcPhase left, AcPhase right) + { + // the Voltages of two phases are expected to be in phase and equal + + var v = (left.Voltage + right.Voltage) / 2m; // TODO: check that l & r approximately equal + + // currents (RMS) can be different and out of phase + // https://www.johndcook.com/blog/2020/08/17/adding-phase-shifted-sine-waves/ + + // IF + // left(t) = ILeft sin(ωt) + // right(t) = IRight sin(ωt + φ). + // sum(t) = left(t) + right(t) = ISum sin(ωt + ψ). + // THEN + + // ψ = arctan( IRight * sin(φ) / (ILeft + IRight cos(φ)) ). + // C = IRight * sin(φ) / sin(ψ). + + // in this calc left(t) has zero phase shift. + // we can shift both waves by -left.Phi, so + // φ := right.phi - left.phi + + + var phi = right.Phi - left.Phi; + + var phiSum = ATan2(right.Current * Sin(phi), left.Current + right.Current * Cos(phi)); + var iSum = right.Current * Sin(phi) / Sin(phiSum); + + return new AcPhase(v, iSum, phiSum); + } } \ No newline at end of file diff --git a/csharp/Lib/Units/Composite/DcPhase.cs b/csharp/Lib/Units/Composite/DcPhase.cs index 8e73313bf..af6d1049a 100644 --- a/csharp/Lib/Units/Composite/DcPhase.cs +++ b/csharp/Lib/Units/Composite/DcPhase.cs @@ -3,4 +3,13 @@ namespace InnovEnergy.Lib.Units.Composite; public record DcPhase(Voltage Voltage, Current Current) : Phase(Voltage, Current) { public Power Power => Current * Voltage; + + public static DcPhase operator +(DcPhase left, DcPhase right) + { + var v = (left.Voltage + right.Voltage) / 2m; + var i = left.Current + right.Current; + + return new DcPhase(v, i); + } + } \ No newline at end of file diff --git a/csharp/Lib/Units/Current.cs b/csharp/Lib/Units/Current.cs index d2d674d04..b3c36ee34 100644 --- a/csharp/Lib/Units/Current.cs +++ b/csharp/Lib/Units/Current.cs @@ -3,7 +3,7 @@ using InnovEnergy.Lib.Units.Generator; namespace InnovEnergy.Lib.Units; -[Generate] +[Sum] public readonly partial struct Current { public static String Unit => "A"; diff --git a/csharp/Lib/Units/Current.generated.cs b/csharp/Lib/Units/Current.generated.cs index bc1964810..cda7eeadf 100644 --- a/csharp/Lib/Units/Current.generated.cs +++ b/csharp/Lib/Units/Current.generated.cs @@ -1,4 +1,7 @@ #nullable enable // Auto-generated code requires an explicit '#nullable' directive in source. +#define Sum + +using static System.Math; namespace InnovEnergy.Lib.Units; @@ -16,10 +19,39 @@ public readonly partial struct Current public static T operator /(T t, Decimal scalar) => new T(t.Value / scalar); // addition - + + #if Sum + public static T operator +(T left, T right) => new T(left.Value + right.Value); public static T operator -(T left, T right) => new T(left.Value - right.Value); public static T operator -(T t) => new T(-t.Value); + + #elif Mean + + public static T operator +(T left, T right) => new T((left.Value + right.Value)/2m); + + #elif Equal + + public static T operator +(T left, T right) + { + var d = Max(Abs(left.Value), Abs(right.Value)); + + if (d != 0m) + return new T(0m); + + var relativeError = Abs(left.Value - right.Value) / d; + + const Decimal maxRelativeError = 0.05m; + + if (relativeError > maxRelativeError) + throw new Exception($"{nameof(left)} and {nameof(right)} must be approximately equal.\n" + + $"Difference > {maxRelativeError * 100}% detected\n" + + $"{nameof(left)} : {left}\n" + + $"{nameof(right)}: {right}"); + + return new T((left.Value + right.Value) / 2m); + } + #endif // compare @@ -43,4 +75,4 @@ public readonly partial struct Current public override Boolean Equals(Object? obj) => obj is T other && Equals(other); public override Int32 GetHashCode() => Value.GetHashCode(); -} \ No newline at end of file +} diff --git a/csharp/Lib/Units/Frequency.cs b/csharp/Lib/Units/Frequency.cs index 173f5037d..3041325c2 100644 --- a/csharp/Lib/Units/Frequency.cs +++ b/csharp/Lib/Units/Frequency.cs @@ -2,12 +2,17 @@ using InnovEnergy.Lib.Units.Generator; namespace InnovEnergy.Lib.Units; - -[Generate] +[Equal] public readonly partial struct Frequency { public static String Unit => "Hz"; public static String Symbol => "f"; - public Frequency(Decimal value) => Value = value; + public Frequency(Decimal value) + { + if (value < 0) + throw new ArgumentException(nameof(Frequency) + " cannot be negative", nameof(value)); + + Value = value; + } } \ No newline at end of file diff --git a/csharp/Lib/Units/Frequency.generated.cs b/csharp/Lib/Units/Frequency.generated.cs index 2959bdbc4..015d67536 100644 --- a/csharp/Lib/Units/Frequency.generated.cs +++ b/csharp/Lib/Units/Frequency.generated.cs @@ -1,4 +1,7 @@ #nullable enable // Auto-generated code requires an explicit '#nullable' directive in source. +#define Equal + +using static System.Math; namespace InnovEnergy.Lib.Units; @@ -16,10 +19,39 @@ public readonly partial struct Frequency public static T operator /(T t, Decimal scalar) => new T(t.Value / scalar); // addition - + + #if Sum + public static T operator +(T left, T right) => new T(left.Value + right.Value); public static T operator -(T left, T right) => new T(left.Value - right.Value); public static T operator -(T t) => new T(-t.Value); + + #elif Mean + + public static T operator +(T left, T right) => new T((left.Value + right.Value)/2m); + + #elif Equal + + public static T operator +(T left, T right) + { + var d = Max(Abs(left.Value), Abs(right.Value)); + + if (d != 0m) + return new T(0m); + + var relativeError = Abs(left.Value - right.Value) / d; + + const Decimal maxRelativeError = 0.05m; + + if (relativeError > maxRelativeError) + throw new Exception($"{nameof(left)} and {nameof(right)} must be approximately equal.\n" + + $"Difference > {maxRelativeError * 100}% detected\n" + + $"{nameof(left)} : {left}\n" + + $"{nameof(right)}: {right}"); + + return new T((left.Value + right.Value) / 2m); + } + #endif // compare @@ -43,4 +75,4 @@ public readonly partial struct Frequency public override Boolean Equals(Object? obj) => obj is T other && Equals(other); public override Int32 GetHashCode() => Value.GetHashCode(); -} \ No newline at end of file +} diff --git a/csharp/Lib/Units/Generator/GenerateAttribute.cs b/csharp/Lib/Units/Generator/EqualAttribute.cs similarity index 65% rename from csharp/Lib/Units/Generator/GenerateAttribute.cs rename to csharp/Lib/Units/Generator/EqualAttribute.cs index c6643d2d7..c0131044a 100644 --- a/csharp/Lib/Units/Generator/GenerateAttribute.cs +++ b/csharp/Lib/Units/Generator/EqualAttribute.cs @@ -1,5 +1,5 @@ namespace InnovEnergy.Lib.Units.Generator; [AttributeUsage(AttributeTargets.Struct)] -internal class GenerateAttribute: Attribute +internal class EqualAttribute: Attribute {} \ No newline at end of file diff --git a/csharp/Lib/Units/Generator/MeanAttribute.cs b/csharp/Lib/Units/Generator/MeanAttribute.cs new file mode 100644 index 000000000..161da8b0e --- /dev/null +++ b/csharp/Lib/Units/Generator/MeanAttribute.cs @@ -0,0 +1,5 @@ +namespace InnovEnergy.Lib.Units.Generator; + +[AttributeUsage(AttributeTargets.Struct)] +internal class MeanAttribute: Attribute +{} \ No newline at end of file diff --git a/csharp/Lib/Units/Generator/SumAttribute.cs b/csharp/Lib/Units/Generator/SumAttribute.cs new file mode 100644 index 000000000..c4af9a156 --- /dev/null +++ b/csharp/Lib/Units/Generator/SumAttribute.cs @@ -0,0 +1,5 @@ +namespace InnovEnergy.Lib.Units.Generator; + +[AttributeUsage(AttributeTargets.Struct)] +internal class SumAttribute: Attribute +{} \ No newline at end of file diff --git a/csharp/Lib/Units/Generator/Template.txt b/csharp/Lib/Units/Generator/Template.txt index 6055ace01..c656f51df 100644 --- a/csharp/Lib/Units/Generator/Template.txt +++ b/csharp/Lib/Units/Generator/Template.txt @@ -1,4 +1,7 @@ #nullable enable // Auto-generated code requires an explicit '#nullable' directive in source. +#define Type + +using static System.Math; namespace InnovEnergy.Lib.Units; @@ -16,10 +19,39 @@ public readonly partial struct Template public static T operator /(T t, Decimal scalar) => new T(t.Value / scalar); // addition - + + #if Sum + public static T operator +(T left, T right) => new T(left.Value + right.Value); public static T operator -(T left, T right) => new T(left.Value - right.Value); public static T operator -(T t) => new T(-t.Value); + + #elif Mean + + public static T operator +(T left, T right) => new T((left.Value + right.Value)/2m); + + #elif Equal + + public static T operator +(T left, T right) + { + var d = Max(Abs(left.Value), Abs(right.Value)); + + if (d != 0m) + return new T(0m); + + var relativeError = Abs(left.Value - right.Value) / d; + + const Decimal maxRelativeError = 0.05m; + + if (relativeError > maxRelativeError) + throw new Exception($"{nameof(left)} and {nameof(right)} must be approximately equal.\n" + + $"Difference > {maxRelativeError * 100}% detected\n" + + $"{nameof(left)} : {left}\n" + + $"{nameof(right)}: {right}"); + + return new T((left.Value + right.Value) / 2m); + } + #endif // compare diff --git a/csharp/Lib/Units/Generator/generate.sh b/csharp/Lib/Units/Generator/generate.sh index 01ff06f64..625f32f89 100755 --- a/csharp/Lib/Units/Generator/generate.sh +++ b/csharp/Lib/Units/Generator/generate.sh @@ -4,10 +4,12 @@ scriptDir=$( dirname -- "$0"; ) cd "$scriptDir/.." || exit -for file in $(grep -l '\[Generate\]' *.cs) +for match in $(grep -e '\[Sum\]\|\[Equal\]\|\[Mean\]' -o *.cs | tr -d '[]') do - filename=$(basename -- "$file") - class="${filename%.*}" - echo "generating $filename" - sed "s/Template/$class/g" "./Generator/Template.txt" > "./$class.generated.cs" + path="${match%:*}" + type="${match#*:}" + file=$(basename -- "$path") + class="${file%.*}" + echo "generating $file" + sed "s/Template/$class/g; s/Type/$type/" "./Generator/Template.txt" > "./$class.generated.cs" done \ No newline at end of file diff --git a/csharp/Lib/Units/Power.cs b/csharp/Lib/Units/Power.cs index 716336a5e..eaedbf7f2 100644 --- a/csharp/Lib/Units/Power.cs +++ b/csharp/Lib/Units/Power.cs @@ -3,7 +3,7 @@ using InnovEnergy.Lib.Units.Generator; namespace InnovEnergy.Lib.Units; -[Generate] +[Sum] public readonly partial struct Power { public static String Unit => "W"; diff --git a/csharp/Lib/Units/Power.generated.cs b/csharp/Lib/Units/Power.generated.cs index 3d4d12a65..c26ad26fd 100644 --- a/csharp/Lib/Units/Power.generated.cs +++ b/csharp/Lib/Units/Power.generated.cs @@ -1,10 +1,13 @@ #nullable enable // Auto-generated code requires an explicit '#nullable' directive in source. +#define Sum + +using static System.Math; namespace InnovEnergy.Lib.Units; -using T = ReactivePower; +using T = Power; -public readonly partial struct ReactivePower +public readonly partial struct Power { public Decimal Value { get; } public override String ToString() => Value + Unit; @@ -16,10 +19,39 @@ public readonly partial struct ReactivePower public static T operator /(T t, Decimal scalar) => new T(t.Value / scalar); // addition - + + #if Sum + public static T operator +(T left, T right) => new T(left.Value + right.Value); public static T operator -(T left, T right) => new T(left.Value - right.Value); public static T operator -(T t) => new T(-t.Value); + + #elif Mean + + public static T operator +(T left, T right) => new T((left.Value + right.Value)/2m); + + #elif Equal + + public static T operator +(T left, T right) + { + var d = Max(Abs(left.Value), Abs(right.Value)); + + if (d != 0m) + return new T(0m); + + var relativeError = Abs(left.Value - right.Value) / d; + + const Decimal maxRelativeError = 0.05m; + + if (relativeError > maxRelativeError) + throw new Exception($"{nameof(left)} and {nameof(right)} must be approximately equal.\n" + + $"Difference > {maxRelativeError * 100}% detected\n" + + $"{nameof(left)} : {left}\n" + + $"{nameof(right)}: {right}"); + + return new T((left.Value + right.Value) / 2m); + } + #endif // compare @@ -43,4 +75,4 @@ public readonly partial struct ReactivePower public override Boolean Equals(Object? obj) => obj is T other && Equals(other); public override Int32 GetHashCode() => Value.GetHashCode(); -} \ No newline at end of file +} diff --git a/csharp/Lib/Units/ReactivePower.cs b/csharp/Lib/Units/ReactivePower.cs index a7017cb32..30d7641b9 100644 --- a/csharp/Lib/Units/ReactivePower.cs +++ b/csharp/Lib/Units/ReactivePower.cs @@ -3,7 +3,7 @@ using InnovEnergy.Lib.Units.Generator; namespace InnovEnergy.Lib.Units; -[Generate] +[Sum] public readonly partial struct ReactivePower { public static String Unit => "var"; diff --git a/csharp/Lib/Units/ReactivePower.generated.cs b/csharp/Lib/Units/ReactivePower.generated.cs index 20a55cccc..9b8def505 100644 --- a/csharp/Lib/Units/ReactivePower.generated.cs +++ b/csharp/Lib/Units/ReactivePower.generated.cs @@ -1,10 +1,13 @@ #nullable enable // Auto-generated code requires an explicit '#nullable' directive in source. +#define Sum + +using static System.Math; namespace InnovEnergy.Lib.Units; -using T = Power; +using T = ReactivePower; -public readonly partial struct Power +public readonly partial struct ReactivePower { public Decimal Value { get; } public override String ToString() => Value + Unit; @@ -16,10 +19,39 @@ public readonly partial struct Power public static T operator /(T t, Decimal scalar) => new T(t.Value / scalar); // addition - + + #if Sum + public static T operator +(T left, T right) => new T(left.Value + right.Value); public static T operator -(T left, T right) => new T(left.Value - right.Value); public static T operator -(T t) => new T(-t.Value); + + #elif Mean + + public static T operator +(T left, T right) => new T((left.Value + right.Value)/2m); + + #elif Equal + + public static T operator +(T left, T right) + { + var d = Max(Abs(left.Value), Abs(right.Value)); + + if (d != 0m) + return new T(0m); + + var relativeError = Abs(left.Value - right.Value) / d; + + const Decimal maxRelativeError = 0.05m; + + if (relativeError > maxRelativeError) + throw new Exception($"{nameof(left)} and {nameof(right)} must be approximately equal.\n" + + $"Difference > {maxRelativeError * 100}% detected\n" + + $"{nameof(left)} : {left}\n" + + $"{nameof(right)}: {right}"); + + return new T((left.Value + right.Value) / 2m); + } + #endif // compare @@ -43,4 +75,4 @@ public readonly partial struct Power public override Boolean Equals(Object? obj) => obj is T other && Equals(other); public override Int32 GetHashCode() => Value.GetHashCode(); -} \ No newline at end of file +} diff --git a/csharp/Lib/Units/Resistance.cs b/csharp/Lib/Units/Resistance.cs index f31cd4a4b..ce426e229 100644 --- a/csharp/Lib/Units/Resistance.cs +++ b/csharp/Lib/Units/Resistance.cs @@ -2,7 +2,7 @@ using InnovEnergy.Lib.Units.Generator; namespace InnovEnergy.Lib.Units; -[Generate] +[Sum] public readonly partial struct Resistance { public static String Unit => "Ω"; @@ -13,7 +13,5 @@ public readonly partial struct Resistance // U=RI public static Voltage operator *(Resistance resistance, Current current) => new Voltage(resistance.Value * current.Value); - - } \ No newline at end of file diff --git a/csharp/Lib/Units/Resistance.generated.cs b/csharp/Lib/Units/Resistance.generated.cs index 9a715bf51..5be7685b6 100644 --- a/csharp/Lib/Units/Resistance.generated.cs +++ b/csharp/Lib/Units/Resistance.generated.cs @@ -1,4 +1,7 @@ #nullable enable // Auto-generated code requires an explicit '#nullable' directive in source. +#define Sum + +using static System.Math; namespace InnovEnergy.Lib.Units; @@ -16,10 +19,39 @@ public readonly partial struct Resistance public static T operator /(T t, Decimal scalar) => new T(t.Value / scalar); // addition - + + #if Sum + public static T operator +(T left, T right) => new T(left.Value + right.Value); public static T operator -(T left, T right) => new T(left.Value - right.Value); public static T operator -(T t) => new T(-t.Value); + + #elif Mean + + public static T operator +(T left, T right) => new T((left.Value + right.Value)/2m); + + #elif Equal + + public static T operator +(T left, T right) + { + var d = Max(Abs(left.Value), Abs(right.Value)); + + if (d != 0m) + return new T(0m); + + var relativeError = Abs(left.Value - right.Value) / d; + + const Decimal maxRelativeError = 0.05m; + + if (relativeError > maxRelativeError) + throw new Exception($"{nameof(left)} and {nameof(right)} must be approximately equal.\n" + + $"Difference > {maxRelativeError * 100}% detected\n" + + $"{nameof(left)} : {left}\n" + + $"{nameof(right)}: {right}"); + + return new T((left.Value + right.Value) / 2m); + } + #endif // compare @@ -43,4 +75,4 @@ public readonly partial struct Resistance public override Boolean Equals(Object? obj) => obj is T other && Equals(other); public override Int32 GetHashCode() => Value.GetHashCode(); -} \ No newline at end of file +} diff --git a/csharp/Lib/Units/Temperature.cs b/csharp/Lib/Units/Temperature.cs index 243487d7f..dc2d7e5ad 100644 --- a/csharp/Lib/Units/Temperature.cs +++ b/csharp/Lib/Units/Temperature.cs @@ -2,11 +2,15 @@ using InnovEnergy.Lib.Units.Generator; namespace InnovEnergy.Lib.Units; -[Generate] +using T=Temperature; + +[Mean] public readonly partial struct Temperature { public static String Unit => "°C"; public static String Symbol => "T"; public Temperature(Decimal value) => Value = value; + + } \ No newline at end of file diff --git a/csharp/Lib/Units/Temperature.generated.cs b/csharp/Lib/Units/Temperature.generated.cs index 1c87f4c31..edc3fdbfa 100644 --- a/csharp/Lib/Units/Temperature.generated.cs +++ b/csharp/Lib/Units/Temperature.generated.cs @@ -1,4 +1,7 @@ #nullable enable // Auto-generated code requires an explicit '#nullable' directive in source. +#define Mean + +using static System.Math; namespace InnovEnergy.Lib.Units; @@ -16,10 +19,39 @@ public readonly partial struct Temperature public static T operator /(T t, Decimal scalar) => new T(t.Value / scalar); // addition - + + #if Sum + public static T operator +(T left, T right) => new T(left.Value + right.Value); public static T operator -(T left, T right) => new T(left.Value - right.Value); public static T operator -(T t) => new T(-t.Value); + + #elif Mean + + public static T operator +(T left, T right) => new T((left.Value + right.Value)/2m); + + #elif Equal + + public static T operator +(T left, T right) + { + var d = Max(Abs(left.Value), Abs(right.Value)); + + if (d != 0m) + return new T(0m); + + var relativeError = Abs(left.Value - right.Value) / d; + + const Decimal maxRelativeError = 0.05m; + + if (relativeError > maxRelativeError) + throw new Exception($"{nameof(left)} and {nameof(right)} must be approximately equal.\n" + + $"Difference > {maxRelativeError * 100}% detected\n" + + $"{nameof(left)} : {left}\n" + + $"{nameof(right)}: {right}"); + + return new T((left.Value + right.Value) / 2m); + } + #endif // compare @@ -43,4 +75,4 @@ public readonly partial struct Temperature public override Boolean Equals(Object? obj) => obj is T other && Equals(other); public override Int32 GetHashCode() => Value.GetHashCode(); -} \ No newline at end of file +} diff --git a/csharp/Lib/Units/Voltage.cs b/csharp/Lib/Units/Voltage.cs index 5bbfc088f..2c65129e4 100644 --- a/csharp/Lib/Units/Voltage.cs +++ b/csharp/Lib/Units/Voltage.cs @@ -2,7 +2,7 @@ using InnovEnergy.Lib.Units.Generator; namespace InnovEnergy.Lib.Units; -[Generate] +[Equal] public readonly partial struct Voltage { public static String Unit => "V"; diff --git a/csharp/Lib/Units/Voltage.generated.cs b/csharp/Lib/Units/Voltage.generated.cs index d64264d60..07dc88d06 100644 --- a/csharp/Lib/Units/Voltage.generated.cs +++ b/csharp/Lib/Units/Voltage.generated.cs @@ -1,4 +1,7 @@ #nullable enable // Auto-generated code requires an explicit '#nullable' directive in source. +#define Equal + +using static System.Math; namespace InnovEnergy.Lib.Units; @@ -16,10 +19,39 @@ public readonly partial struct Voltage public static T operator /(T t, Decimal scalar) => new T(t.Value / scalar); // addition - + + #if Sum + public static T operator +(T left, T right) => new T(left.Value + right.Value); public static T operator -(T left, T right) => new T(left.Value - right.Value); public static T operator -(T t) => new T(-t.Value); + + #elif Mean + + public static T operator +(T left, T right) => new T((left.Value + right.Value)/2m); + + #elif Equal + + public static T operator +(T left, T right) + { + var d = Max(Abs(left.Value), Abs(right.Value)); + + if (d != 0m) + return new T(0m); + + var relativeError = Abs(left.Value - right.Value) / d; + + const Decimal maxRelativeError = 0.05m; + + if (relativeError > maxRelativeError) + throw new Exception($"{nameof(left)} and {nameof(right)} must be approximately equal.\n" + + $"Difference > {maxRelativeError * 100}% detected\n" + + $"{nameof(left)} : {left}\n" + + $"{nameof(right)}: {right}"); + + return new T((left.Value + right.Value) / 2m); + } + #endif // compare @@ -43,4 +75,4 @@ public readonly partial struct Voltage public override Boolean Equals(Object? obj) => obj is T other && Equals(other); public override Int32 GetHashCode() => Value.GetHashCode(); -} \ No newline at end of file +} From 476a0a0fe2e8633e98943026369a75ecd08909a6 Mon Sep 17 00:00:00 2001 From: ig Date: Sun, 26 Feb 2023 19:20:43 +0100 Subject: [PATCH 12/12] rename Ac1 in IAc1Connection to plain Ac --- .../StatusApi/Connections/IAc1Connection.cs | 2 +- csharp/Lib/StatusApi/DeviceStatus.cs | 19 +++++++------------ .../StatusApi/SinglePhaseInverterStatus.cs | 2 +- .../StatusApi/SinglePhasePvInverterStatus.cs | 2 +- 4 files changed, 10 insertions(+), 15 deletions(-) diff --git a/csharp/Lib/StatusApi/Connections/IAc1Connection.cs b/csharp/Lib/StatusApi/Connections/IAc1Connection.cs index df3a472a1..d90b57938 100644 --- a/csharp/Lib/StatusApi/Connections/IAc1Connection.cs +++ b/csharp/Lib/StatusApi/Connections/IAc1Connection.cs @@ -4,5 +4,5 @@ namespace InnovEnergy.Lib.StatusApi.Connections; public interface IAc1Connection { - Ac1Phase Ac1 { get; } + Ac1Phase Ac { get; } } \ No newline at end of file diff --git a/csharp/Lib/StatusApi/DeviceStatus.cs b/csharp/Lib/StatusApi/DeviceStatus.cs index f34a37d23..6cdc1ef3f 100644 --- a/csharp/Lib/StatusApi/DeviceStatus.cs +++ b/csharp/Lib/StatusApi/DeviceStatus.cs @@ -1,17 +1,12 @@ +using InnovEnergy.Lib.Utils; + namespace InnovEnergy.Lib.StatusApi; public abstract record DeviceStatus { - public String DeviceType - { - get - { - var t = GetType(); - - while (!t!.IsAbstract) - t = t.BaseType; - - return t.Name.Replace("Status", ""); - } - } + public String DeviceType => GetType() + .Generate(t => t.BaseType!) + .First(t => t.IsAbstract) + .Name + .Replace("Status", ""); } \ No newline at end of file diff --git a/csharp/Lib/StatusApi/SinglePhaseInverterStatus.cs b/csharp/Lib/StatusApi/SinglePhaseInverterStatus.cs index a1b404bd6..9e1e2c8ba 100644 --- a/csharp/Lib/StatusApi/SinglePhaseInverterStatus.cs +++ b/csharp/Lib/StatusApi/SinglePhaseInverterStatus.cs @@ -3,7 +3,7 @@ using InnovEnergy.Lib.Units.Composite; namespace InnovEnergy.Lib.StatusApi; -public abstract record SinglePhaseInverterStatus(Ac1Phase Ac1, DcPhase Dc) : +public abstract record SinglePhaseInverterStatus(Ac1Phase Ac, DcPhase Dc) : DeviceStatus, IAc1Connection, IDcConnection; diff --git a/csharp/Lib/StatusApi/SinglePhasePvInverterStatus.cs b/csharp/Lib/StatusApi/SinglePhasePvInverterStatus.cs index 377f9f6f3..51c113fce 100644 --- a/csharp/Lib/StatusApi/SinglePhasePvInverterStatus.cs +++ b/csharp/Lib/StatusApi/SinglePhasePvInverterStatus.cs @@ -3,7 +3,7 @@ using InnovEnergy.Lib.Units.Composite; namespace InnovEnergy.Lib.StatusApi; -public abstract record SinglePhasePvInverterStatus(Ac1Phase Ac1, IReadOnlyList Strings) : +public abstract record SinglePhasePvInverterStatus(Ac1Phase Ac, IReadOnlyList Strings) : DeviceStatus, IAc1Connection, IPvConnection;